From d844680164277c453da30b3911527848395bf44b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 27 Jan 2021 17:50:32 +0100 Subject: [PATCH 0001/1554] Initial commit --- packages/mecha/.gitignore | 129 ++++++++++++++++++++++++++++++++++++++ packages/mecha/LICENSE | 21 +++++++ packages/mecha/README.md | 2 + 3 files changed, 152 insertions(+) create mode 100644 packages/mecha/.gitignore create mode 100644 packages/mecha/LICENSE create mode 100644 packages/mecha/README.md diff --git a/packages/mecha/.gitignore b/packages/mecha/.gitignore new file mode 100644 index 000000000..b6e47617d --- /dev/null +++ b/packages/mecha/.gitignore @@ -0,0 +1,129 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/packages/mecha/LICENSE b/packages/mecha/LICENSE new file mode 100644 index 000000000..98bd29c11 --- /dev/null +++ b/packages/mecha/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Valentin Berlier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/mecha/README.md b/packages/mecha/README.md new file mode 100644 index 000000000..f6dcbc9f4 --- /dev/null +++ b/packages/mecha/README.md @@ -0,0 +1,2 @@ +# mecha +A bulletproof Minecraft command generation library. From 1cdfa7ccca94a39112d3e0c95a07a440447b1c25 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 27 Jan 2021 20:49:10 +0100 Subject: [PATCH 0002/1554] Setup project --- packages/mecha/.github/FUNDING.yml | 2 + packages/mecha/.github/workflows/main.yml | 54 + packages/mecha/.gitignore | 3 + packages/mecha/.vscode/extensions.json | 7 + packages/mecha/.vscode/settings.json | 23 + packages/mecha/README.md | 22 +- packages/mecha/mecha/__init__.py | 3 + packages/mecha/mecha/api.py | 49 + packages/mecha/mecha/py.typed | 1 + packages/mecha/package-lock.json | 33 + packages/mecha/package.json | 9 + packages/mecha/poetry.lock | 1162 +++++++++++++++++++++ packages/mecha/poetry.toml | 2 + packages/mecha/pyproject.toml | 65 ++ packages/mecha/pyrightconfig.json | 3 + packages/mecha/pytest.ini | 2 + packages/mecha/tests/__init__.py | 0 packages/mecha/tests/test_api.py | 43 + 18 files changed, 1481 insertions(+), 2 deletions(-) create mode 100644 packages/mecha/.github/FUNDING.yml create mode 100644 packages/mecha/.github/workflows/main.yml create mode 100644 packages/mecha/.vscode/extensions.json create mode 100644 packages/mecha/.vscode/settings.json create mode 100644 packages/mecha/mecha/__init__.py create mode 100644 packages/mecha/mecha/api.py create mode 100644 packages/mecha/mecha/py.typed create mode 100644 packages/mecha/package-lock.json create mode 100644 packages/mecha/package.json create mode 100644 packages/mecha/poetry.lock create mode 100644 packages/mecha/poetry.toml create mode 100644 packages/mecha/pyproject.toml create mode 100644 packages/mecha/pyrightconfig.json create mode 100644 packages/mecha/pytest.ini create mode 100644 packages/mecha/tests/__init__.py create mode 100644 packages/mecha/tests/test_api.py diff --git a/packages/mecha/.github/FUNDING.yml b/packages/mecha/.github/FUNDING.yml new file mode 100644 index 000000000..2815213d2 --- /dev/null +++ b/packages/mecha/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: + - vberlier diff --git a/packages/mecha/.github/workflows/main.yml b/packages/mecha/.github/workflows/main.yml new file mode 100644 index 000000000..d4222526e --- /dev/null +++ b/packages/mecha/.github/workflows/main.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + main: + name: Test and release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Python 3.9 + uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install Poetry + uses: snok/install-poetry@v1.1.1 + with: + virtualenvs-in-project: true + - name: Install Pyright + run: npm install + - name: Setup cache + id: cached-poetry-dependencies + uses: actions/cache@v2 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install + - name: Run tests + run: poetry run pytest -v + - name: Run type-checking + run: npm run check + - name: Check formatting + run: poetry run black --check mecha tests + - name: Release + if: | + github.repository == 'vberlier/mecha' + && github.event_name == 'push' + && github.ref == 'refs/heads/main' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + git config --global user.name "github-actions" + git config --global user.email "action@github.com" + poetry run semantic-release publish -v DEBUG -D commit_author="github-actions " diff --git a/packages/mecha/.gitignore b/packages/mecha/.gitignore index b6e47617d..d82aa4e71 100644 --- a/packages/mecha/.gitignore +++ b/packages/mecha/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# Node +node_modules/ diff --git a/packages/mecha/.vscode/extensions.json b/packages/mecha/.vscode/extensions.json new file mode 100644 index 000000000..8affbb2bf --- /dev/null +++ b/packages/mecha/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "bungcip.better-toml" + ] +} diff --git a/packages/mecha/.vscode/settings.json b/packages/mecha/.vscode/settings.json new file mode 100644 index 000000000..23de92c05 --- /dev/null +++ b/packages/mecha/.vscode/settings.json @@ -0,0 +1,23 @@ +{ + "python.pythonPath": "${workspaceFolder}/.venv", + "python.formatting.provider": "black", + "python.languageServer": "Pylance", + "python.linting.enabled": false, + "python.linting.pylintEnabled": false, + "python.linting.banditEnabled": false, + "python.linting.flake8Enabled": false, + "python.linting.mypyEnabled": false, + "python.linting.prospectorEnabled": false, + "python.linting.pycodestyleEnabled": false, + "python.linting.pydocstyleEnabled": false, + "python.linting.pylamaEnabled": false, + "[python]": { + "editor.tabSize": 4, + "editor.formatOnSave": true, + "editor.formatOnType": false, + "editor.formatOnPaste": false, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + } +} diff --git a/packages/mecha/README.md b/packages/mecha/README.md index f6dcbc9f4..ca85948e1 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -1,2 +1,20 @@ -# mecha -A bulletproof Minecraft command generation library. +# Mecha + +[![GitHub Actions](https://github.com/vberlier/mecha/workflows/CI/badge.svg)](https://github.com/vberlier/mecha/actions) +[![PyPI](https://img.shields.io/pypi/v/mecha.svg)](https://pypi.org/project/mecha/) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mecha.svg)](https://pypi.org/project/mecha/) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) + +> A bulletproof Minecraft command generation library. + +## Installation + +The package can be installed with `pip`. + +```bash +$ pip install mecha +``` + +--- + +License - [MIT](https://github.com/vberlier/mecha/blob/main/LICENSE) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py new file mode 100644 index 000000000..6453c118c --- /dev/null +++ b/packages/mecha/mecha/__init__.py @@ -0,0 +1,3 @@ +from .api import * + +__version__ = "0.0.0" diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py new file mode 100644 index 000000000..63708cc6e --- /dev/null +++ b/packages/mecha/mecha/api.py @@ -0,0 +1,49 @@ +__all__ = [ + "Mecha", +] + + +from dataclasses import InitVar, dataclass, field +from typing import Optional, Union + +from beet import Context, DataPack + + +@dataclass +class Mecha: + """Class exposing the command api.""" + + target: InitVar[Union[Context, DataPack]] + + default_namespace: Optional[str] = None + default_path: Optional[str] = None + + data_pack: DataPack = field(init=False) + + def __post_init__(self, target: Union[Context, DataPack]): + if isinstance(target, Context): + self.data_pack = target.data + config = target.meta.get("mecha", {}) + default_namespace = config.get("default_namespace", target.project_name) + default_path = config.get("default_path", "") + else: + self.data_pack = target + default_namespace = self.data_pack.name or "" + default_path = "" + + if self.default_namespace is None: + self.default_namespace = default_namespace + + if self.default_path is None: + self.default_path = default_path + + def resolve_path(self, path: str) -> str: + """Resolve partial path.""" + namespace, sep, path = path.rpartition(":") + + if not namespace: + namespace = self.default_namespace + if not sep: + path = f"{self.default_path}/{path}" + + return f"{namespace}:{path.strip('/')}".replace("//", "/").lower() diff --git a/packages/mecha/mecha/py.typed b/packages/mecha/mecha/py.typed new file mode 100644 index 000000000..6c8e6b979 --- /dev/null +++ b/packages/mecha/mecha/py.typed @@ -0,0 +1 @@ +__version__ = "0.0.0" diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json new file mode 100644 index 000000000..77c4bcc46 --- /dev/null +++ b/packages/mecha/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "mecha", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "pyright": "^1.1.105" + } + }, + "node_modules/pyright": { + "version": "1.1.105", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.105.tgz", + "integrity": "sha512-X0V7v/Ub3X0sP76kjfLlQI5e/yLNcx4eh70+p+WSXz/ahChNWQEr3flb3ReRmuUVOt9FCYcrt8Fpw5oICGoIug==", + "dev": true, + "bin": { + "pyright": "index.js", + "pyright-langserver": "langserver.index.js" + }, + "engines": { + "node": ">=12.0.0" + } + } + }, + "dependencies": { + "pyright": { + "version": "1.1.105", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.105.tgz", + "integrity": "sha512-X0V7v/Ub3X0sP76kjfLlQI5e/yLNcx4eh70+p+WSXz/ahChNWQEr3flb3ReRmuUVOt9FCYcrt8Fpw5oICGoIug==", + "dev": true + } + } +} diff --git a/packages/mecha/package.json b/packages/mecha/package.json new file mode 100644 index 000000000..26f72eb0e --- /dev/null +++ b/packages/mecha/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "watch": "poetry run pyright -w", + "check": "poetry run pyright" + }, + "devDependencies": { + "pyright": "^1.1.105" + } +} diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock new file mode 100644 index 000000000..9ffbcaaff --- /dev/null +++ b/packages/mecha/poetry.lock @@ -0,0 +1,1162 @@ +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] + +[[package]] +name = "beet" +version = "0.5.1" +description = "The Minecraft pack development kit" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +click = ">=7.1.2,<8.0.0" +click-help-colors = ">=0.9,<0.10" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +Jinja2 = ">=2.11.2,<3.0.0" +nbtlib = ">=1.8.2,<2.0.0" +pathspec = ">=0.8.1,<0.9.0" +Pillow = ">=8.0.1,<9.0.0" +pydantic = ">=1.7.3,<2.0.0" + +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "bleach" +version = "3.2.3" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.14.4" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "click-help-colors" +version = "0.9" +description = "Colorization of help messages in Click" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7.0,<9" + +[package.extras] +dev = ["pytest"] + +[[package]] +name = "click-log" +version = "0.3.2" +description = "Logging integration for Click" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = "*" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "cryptography" +version = "3.3.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" + +[package.dependencies] +cffi = ">=1.12" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "docutils" +version = "0.16" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "dotty-dict" +version = "1.3.0" +description = "Dictionary wrapper for quick access to deeply nested keys." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +setuptools_scm = "*" + +[[package]] +name = "gitdb" +version = "4.0.5" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +smmap = ">=3.0.1,<4" + +[[package]] +name = "gitpython" +version = "3.1.12" +description = "Python Git Library" +category = "dev" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "invoke" +version = "1.5.0" +description = "Pythonic task execution" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.7.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] + +[[package]] +name = "jeepney" +version = "0.6.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "keyring" +version = "22.0.1" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbtlib" +version = "1.11.0" +description = "A python package to read and edit nbt data" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +numpy = ">1.16,<1.19.4" + +[[package]] +name = "numpy" +version = "1.19.3" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "packaging" +version = "20.8" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pathspec" +version = "0.8.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pillow" +version = "8.1.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pkginfo" +version = "1.7.0" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pydantic" +version = "1.7.3" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] +typing_extensions = ["typing-extensions (>=3.7.2)"] + +[[package]] +name = "pygments" +version = "2.7.4" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pytest" +version = "6.2.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<1.0.0a1" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-gitlab" +version = "1.15.0" +description = "Interact with GitLab API" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.4.2" +six = "*" + +[[package]] +name = "python-semantic-release" +version = "7.13.1" +description = "Automatic semantic versioning for python projects" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7,<8" +click-log = ">=0.3,<1" +dotty-dict = ">=1.3.0,<2" +gitpython = ">=3.0.8,<4" +invoke = ">=1.4.1,<2" +python-gitlab = ">=1.10,<2" +requests = ">=2.25,<3" +semver = ">=2.10,<3" +tomlkit = ">=0.7.0,<1.0.0" +twine = ">=3,<4" + +[package.extras] +dev = ["mypy", "tox", "isort", "black"] +docs = ["Sphinx (==1.3.6)"] +test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.5.0)", "mock (==1.3.0)"] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "readme-renderer" +version = "28.0" +description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +bleach = ">=2.1.0" +docutils = ">=0.13.1" +Pygments = ">=2.5.1" +six = "*" + +[package.extras] +md = ["cmarkgfm (>=0.2.0)"] + +[[package]] +name = "regex" +version = "2020.11.13" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.25.1" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<5" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rfc3986" +version = "1.4.0" +description = "Validating URI References per RFC 3986" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "secretstorage" +version = "3.3.0" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "semver" +version = "2.13.0" +description = "Python helper for Semantic Versioning (http://semver.org/)" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "setuptools-scm" +version = "5.0.1" +description = "the blessed package to manage your versions by scm tags" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.extras] +toml = ["toml"] + +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "3.0.5" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomlkit" +version = "0.7.0" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "tqdm" +version = "4.56.0" +description = "Fast, Extensible Progress Meter" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +telegram = ["requests"] + +[[package]] +name = "twine" +version = "3.3.0" +description = "Collection of utilities for publishing packages on PyPI" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = ">=0.4.3" +keyring = ">=15.1" +pkginfo = ">=1.4.2" +readme-renderer = ">=21.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +tqdm = ">=4.14" + +[[package]] +name = "typed-ast" +version = "1.4.2" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "urllib3" +version = "1.26.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "d526399434839453711d15124d1d35b9baf42b9fc71bbe8b255138b054666880" + +[metadata.files] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] +beet = [ + {file = "beet-0.5.1-py3-none-any.whl", hash = "sha256:82a3659cd7e34db62ad3a7cb95c79b2c43db1aad69b52282fb23fb29dc5cd55e"}, + {file = "beet-0.5.1.tar.gz", hash = "sha256:581a341786cd40a6d3d58fcfb7ea0f63f011b5e18ee359ec2da7735dca16b634"}, +] +black = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] +bleach = [ + {file = "bleach-3.2.3-py2.py3-none-any.whl", hash = "sha256:2d3b3f7e7d69148bb683b26a3f21eabcf62fa8fb7bc75d0e7a13bcecd9568d4d"}, + {file = "bleach-3.2.3.tar.gz", hash = "sha256:c6ad42174219b64848e2e2cd434e44f56cd24a93a9b4f8bc52cfed55a1cd5aad"}, +] +certifi = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] +cffi = [ + {file = "cffi-1.14.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775"}, + {file = "cffi-1.14.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06"}, + {file = "cffi-1.14.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26"}, + {file = "cffi-1.14.4-cp27-cp27m-win32.whl", hash = "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c"}, + {file = "cffi-1.14.4-cp27-cp27m-win_amd64.whl", hash = "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b"}, + {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d"}, + {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca"}, + {file = "cffi-1.14.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698"}, + {file = "cffi-1.14.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b"}, + {file = "cffi-1.14.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293"}, + {file = "cffi-1.14.4-cp35-cp35m-win32.whl", hash = "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2"}, + {file = "cffi-1.14.4-cp35-cp35m-win_amd64.whl", hash = "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7"}, + {file = "cffi-1.14.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"}, + {file = "cffi-1.14.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362"}, + {file = "cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec"}, + {file = "cffi-1.14.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b"}, + {file = "cffi-1.14.4-cp36-cp36m-win32.whl", hash = "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668"}, + {file = "cffi-1.14.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009"}, + {file = "cffi-1.14.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb"}, + {file = "cffi-1.14.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d"}, + {file = "cffi-1.14.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03"}, + {file = "cffi-1.14.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01"}, + {file = "cffi-1.14.4-cp37-cp37m-win32.whl", hash = "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e"}, + {file = "cffi-1.14.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35"}, + {file = "cffi-1.14.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d"}, + {file = "cffi-1.14.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b"}, + {file = "cffi-1.14.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53"}, + {file = "cffi-1.14.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e"}, + {file = "cffi-1.14.4-cp38-cp38-win32.whl", hash = "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d"}, + {file = "cffi-1.14.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375"}, + {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, + {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, + {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, + {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, + {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, + {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +click-help-colors = [ + {file = "click-help-colors-0.9.tar.gz", hash = "sha256:eb037a2dd95a9e20b3897c2b3ca57e7f6797f76a8d93f7eeedda7fcdcbc9b635"}, + {file = "click_help_colors-0.9-py3-none-any.whl", hash = "sha256:f6c3d1fe86b07790e6ef0339f458196a8814de90946d876774ea4b4f30a5a539"}, +] +click-log = [ + {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, + {file = "click_log-0.3.2-py2.py3-none-any.whl", hash = "sha256:eee14dc37cdf3072158570f00406572f9e03e414accdccfccd4c538df9ae322c"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cryptography = [ + {file = "cryptography-3.3.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030"}, + {file = "cryptography-3.3.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0"}, + {file = "cryptography-3.3.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812"}, + {file = "cryptography-3.3.1-cp27-cp27m-win32.whl", hash = "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e"}, + {file = "cryptography-3.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901"}, + {file = "cryptography-3.3.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d"}, + {file = "cryptography-3.3.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5"}, + {file = "cryptography-3.3.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302"}, + {file = "cryptography-3.3.1-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244"}, + {file = "cryptography-3.3.1-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c"}, + {file = "cryptography-3.3.1-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c"}, + {file = "cryptography-3.3.1-cp36-abi3-win32.whl", hash = "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a"}, + {file = "cryptography-3.3.1-cp36-abi3-win_amd64.whl", hash = "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7"}, + {file = "cryptography-3.3.1.tar.gz", hash = "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6"}, +] +docutils = [ + {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, + {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, +] +dotty-dict = [ + {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, +] +gitdb = [ + {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, + {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, +] +gitpython = [ + {file = "GitPython-3.1.12-py3-none-any.whl", hash = "sha256:867ec3dfb126aac0f8296b19fb63b8c4a399f32b4b6fafe84c4b10af5fa9f7b5"}, + {file = "GitPython-3.1.12.tar.gz", hash = "sha256:42dbefd8d9e2576c496ed0059f3103dcef7125b9ce16f9d5f9c834aed44a1dac"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +invoke = [ + {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, + {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, + {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, +] +isort = [ + {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, + {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, +] +jeepney = [ + {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, + {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +keyring = [ + {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, + {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbtlib = [ + {file = "nbtlib-1.11.0-py3-none-any.whl", hash = "sha256:54b87705563504db54eb74f9c52b2b84afb227e6c7d24b2892c5145ef281adce"}, + {file = "nbtlib-1.11.0.tar.gz", hash = "sha256:92bcfa193588c6031e16f5be0cdfe29216dca08b71a23ce6b51f25855bcfef39"}, +] +numpy = [ + {file = "numpy-1.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2"}, + {file = "numpy-1.19.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2"}, + {file = "numpy-1.19.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268"}, + {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0"}, + {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d"}, + {file = "numpy-1.19.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add"}, + {file = "numpy-1.19.3-cp36-cp36m-win32.whl", hash = "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d"}, + {file = "numpy-1.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f"}, + {file = "numpy-1.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822"}, + {file = "numpy-1.19.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c"}, + {file = "numpy-1.19.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed"}, + {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931"}, + {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996"}, + {file = "numpy-1.19.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6"}, + {file = "numpy-1.19.3-cp37-cp37m-win32.whl", hash = "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7"}, + {file = "numpy-1.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f"}, + {file = "numpy-1.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772"}, + {file = "numpy-1.19.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e"}, + {file = "numpy-1.19.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3"}, + {file = "numpy-1.19.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535"}, + {file = "numpy-1.19.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68"}, + {file = "numpy-1.19.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98"}, + {file = "numpy-1.19.3-cp38-cp38-win32.whl", hash = "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c"}, + {file = "numpy-1.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4"}, + {file = "numpy-1.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2"}, + {file = "numpy-1.19.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0"}, + {file = "numpy-1.19.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da"}, + {file = "numpy-1.19.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69"}, + {file = "numpy-1.19.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522"}, + {file = "numpy-1.19.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5"}, + {file = "numpy-1.19.3-cp39-cp39-win32.whl", hash = "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170"}, + {file = "numpy-1.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6"}, + {file = "numpy-1.19.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9"}, + {file = "numpy-1.19.3.zip", hash = "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72"}, +] +packaging = [ + {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, + {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, +] +pathspec = [ + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, +] +pillow = [ + {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded"}, + {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, + {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, + {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7"}, + {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, + {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, + {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae"}, + {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, + {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, + {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0"}, + {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, + {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, + {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, +] +pkginfo = [ + {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, + {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pydantic = [ + {file = "pydantic-1.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d8df4b9090b595511906fa48deda47af04e7d092318bfb291f4d45dfb6bb2127"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:514b473d264671a5c672dfb28bdfe1bf1afd390f6b206aa2ec9fed7fc592c48e"}, + {file = "pydantic-1.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:dba5c1f0a3aeea5083e75db9660935da90216f8a81b6d68e67f54e135ed5eb23"}, + {file = "pydantic-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59e45f3b694b05a69032a0d603c32d453a23f0de80844fb14d55ab0c6c78ff2f"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b24e8a572e4b4c18f614004dda8c9f2c07328cb5b6e314d6e1bbd536cb1a6c1"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:b2b054d095b6431cdda2f852a6d2f0fdec77686b305c57961b4c5dd6d863bf3c"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:025bf13ce27990acc059d0c5be46f416fc9b293f45363b3d19855165fee1874f"}, + {file = "pydantic-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6e3874aa7e8babd37b40c4504e3a94cc2023696ced5a0500949f3347664ff8e2"}, + {file = "pydantic-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e682f6442ebe4e50cb5e1cfde7dda6766fb586631c3e5569f6aa1951fd1a76ef"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:185e18134bec5ef43351149fe34fda4758e53d05bb8ea4d5928f0720997b79ef"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:f5b06f5099e163295b8ff5b1b71132ecf5866cc6e7f586d78d7d3fd6e8084608"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:24ca47365be2a5a3cc3f4a26dcc755bcdc9f0036f55dcedbd55663662ba145ec"}, + {file = "pydantic-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:d1fe3f0df8ac0f3a9792666c69a7cd70530f329036426d06b4f899c025aca74e"}, + {file = "pydantic-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6864844b039805add62ebe8a8c676286340ba0c6d043ae5dea24114b82a319e"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ecb54491f98544c12c66ff3d15e701612fc388161fd455242447083350904730"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ffd180ebd5dd2a9ac0da4e8b995c9c99e7c74c31f985ba090ee01d681b1c4b95"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8d72e814c7821125b16f1553124d12faba88e85405b0864328899aceaad7282b"}, + {file = "pydantic-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:475f2fa134cf272d6631072554f845d0630907fce053926ff634cc6bc45bf1af"}, + {file = "pydantic-1.7.3-py3-none-any.whl", hash = "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229"}, + {file = "pydantic-1.7.3.tar.gz", hash = "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9"}, +] +pygments = [ + {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, + {file = "Pygments-2.7.4.tar.gz", hash = "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pytest = [ + {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, + {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, +] +python-gitlab = [ + {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, + {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, +] +python-semantic-release = [ + {file = "python-semantic-release-7.13.1.tar.gz", hash = "sha256:8c7bb629d1739a45db2addfaf738f8b01ec816ac1a91f40cbc3612c5efb4d2e3"}, + {file = "python_semantic_release-7.13.1-py3-none-any.whl", hash = "sha256:dc0065675d242a26e8d2d998a398b22314ceed822fc4dbb3174047d837e1b235"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +readme-renderer = [ + {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, + {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, +] +regex = [ + {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, + {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, + {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, + {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, + {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, + {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, + {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, + {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, + {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, + {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, + {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, + {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, + {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, +] +requests = [ + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +rfc3986 = [ + {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, + {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.0-py3-none-any.whl", hash = "sha256:5c36f6537a523ec5f969ef9fad61c98eb9e017bc601d811e53aa25bece64892f"}, + {file = "SecretStorage-3.3.0.tar.gz", hash = "sha256:30cfdef28829dad64d6ea1ed08f8eff6aa115a77068926bcc9f5225d5a3246aa"}, +] +semver = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] +setuptools-scm = [ + {file = "setuptools_scm-5.0.1-py2.7.egg", hash = "sha256:db4ab2e0c2644ba71b1e5212b14ff65dbf0af465796d314a75e0cf6128f605f7"}, + {file = "setuptools_scm-5.0.1-py2.py3-none-any.whl", hash = "sha256:62fa535edb31ece9fa65dc9dcb3056145b8020c8c26c0ef1018aef33db95c40d"}, + {file = "setuptools_scm-5.0.1-py3.5.egg", hash = "sha256:1fc4e25df445351d172bb4788f4d07f9e9ce0e8b7dee6b19584e46110172ca13"}, + {file = "setuptools_scm-5.0.1-py3.6.egg", hash = "sha256:e878036c2527dfd05818727846338be86b2be6955741b85fab2625f63d001021"}, + {file = "setuptools_scm-5.0.1-py3.7.egg", hash = "sha256:eb19b46816fc106a4c2d4180022687eab40f9773cf61390b845afb093d1f4ecd"}, + {file = "setuptools_scm-5.0.1-py3.8.egg", hash = "sha256:48b31488d089270500f120efea723968c01abd85fd4876043a3b7c7ef7d0b761"}, + {file = "setuptools_scm-5.0.1-py3.9.egg", hash = "sha256:b928021c4381f96d577847d540d6e03065f8f8851c768a0c9bc552d463bae0d4"}, + {file = "setuptools_scm-5.0.1.tar.gz", hash = "sha256:c85b6b46d0edd40d2301038cdea96bb6adc14d62ef943e75afb08b3e7bcf142a"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +smmap = [ + {file = "smmap-3.0.5-py2.py3-none-any.whl", hash = "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714"}, + {file = "smmap-3.0.5.tar.gz", hash = "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomlkit = [ + {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, + {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, +] +tqdm = [ + {file = "tqdm-4.56.0-py2.py3-none-any.whl", hash = "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a"}, + {file = "tqdm-4.56.0.tar.gz", hash = "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"}, +] +twine = [ + {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, + {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, +] +typed-ast = [ + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, + {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, + {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, + {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, + {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, + {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, + {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, + {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, + {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, + {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] +urllib3 = [ + {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, + {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] diff --git a/packages/mecha/poetry.toml b/packages/mecha/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/mecha/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml new file mode 100644 index 000000000..7eb35ddd6 --- /dev/null +++ b/packages/mecha/pyproject.toml @@ -0,0 +1,65 @@ +[tool.poetry] +name = "mecha" +version = "0.0.0" +description = "A bulletproof Minecraft command generation library" +authors = ["Valentin Berlier "] +license = "MIT" + +homepage = "https://github.com/vberlier/mecha" +repository = "https://github.com/vberlier/mecha" +documentation = "https://github.com/vberlier/mecha" + +readme = "README.md" + +keywords = [ + "beet", + "minecraft", + "datapack", + "minecraft-commands", + "mcfunction" +] + +include = ["mecha/py.typed"] + +[tool.poetry.dependencies] +python = "^3.8" +beet = "^0.5.1" + +[tool.poetry.dev-dependencies] +black = "^20.8b1" +isort = "^5.7.0" +pytest = "^6.2.2" +python-semantic-release = "^7.13.1" + +[tool.black] +target-version = ["py38"] +include = '\.pyi?$' +exclude = ''' +/( + \.eggs + | \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | node_modules + | _build + | buck-out + | build + | dist +)/ +''' + +[tool.isort] +profile = "black" + +[tool.semantic_release] +branch = "main" +version_variable = ["mecha/__init__.py:__version__"] +version_toml = "pyproject.toml:poetry.tool.version" +major_on_zero = false +build_command = "poetry build" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/mecha/pyrightconfig.json b/packages/mecha/pyrightconfig.json new file mode 100644 index 000000000..0102dcd92 --- /dev/null +++ b/packages/mecha/pyrightconfig.json @@ -0,0 +1,3 @@ +{ + "typeCheckingMode": "strict" +} diff --git a/packages/mecha/pytest.ini b/packages/mecha/pytest.ini new file mode 100644 index 000000000..c8cd4b380 --- /dev/null +++ b/packages/mecha/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = tests diff --git a/packages/mecha/tests/__init__.py b/packages/mecha/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/tests/test_api.py b/packages/mecha/tests/test_api.py new file mode 100644 index 000000000..d795b896e --- /dev/null +++ b/packages/mecha/tests/test_api.py @@ -0,0 +1,43 @@ +from beet import DataPack + +from mecha import Mecha + + +def test_init_data_pack(): + pack = DataPack("demo") + mc = Mecha(pack) + + assert mc.default_namespace == "demo" + assert mc.default_path == "" + assert mc.data_pack is pack + + +def test_init_data_pack_with_args(): + pack = DataPack("demo") + mc = Mecha(pack, default_namespace="hello", default_path="world") + + assert mc.default_namespace == "hello" + assert mc.default_path == "world" + assert mc.data_pack is pack + + +def test_resolve_path(): + mc = Mecha(DataPack("demo")) + + assert mc.resolve_path("foo") == "demo:foo" + assert mc.resolve_path("foo/bar") == "demo:foo/bar" + assert mc.resolve_path(":foo") == "demo:foo" + assert mc.resolve_path(":foo/bar") == "demo:foo/bar" + assert mc.resolve_path("thing:foo") == "thing:foo" + assert mc.resolve_path("thing:foo/bar") == "thing:foo/bar" + + +def test_resolve_path_with_root(): + mc = Mecha(DataPack("demo"), default_path="root") + + assert mc.resolve_path("foo") == "demo:root/foo" + assert mc.resolve_path("foo/bar") == "demo:root/foo/bar" + assert mc.resolve_path(":foo") == "demo:foo" + assert mc.resolve_path(":foo/bar") == "demo:foo/bar" + assert mc.resolve_path("thing:foo") == "thing:foo" + assert mc.resolve_path("thing:foo/bar") == "thing:foo/bar" From 503b2efde02bb106a22aad1f07a591fa5693b2a5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 27 Jan 2021 20:56:50 +0100 Subject: [PATCH 0003/1554] fix: trigger automatic release --- packages/mecha/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 7eb35ddd6..0b200abc4 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -56,7 +56,7 @@ profile = "black" [tool.semantic_release] branch = "main" version_variable = ["mecha/__init__.py:__version__"] -version_toml = "pyproject.toml:poetry.tool.version" +version_toml = "pyproject.toml:tool.poetry.version" major_on_zero = false build_command = "poetry build" From 032e40dd363bc7afadf4719720f3b157ab4ae606 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 27 Jan 2021 20:12:11 +0000 Subject: [PATCH 0004/1554] 0.0.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 packages/mecha/CHANGELOG.md diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md new file mode 100644 index 000000000..9d18bb2d5 --- /dev/null +++ b/packages/mecha/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + + + +## v0.0.1 (2021-01-27) +### Fix +* Trigger automatic release ([`bd9e578`](https://github.com/vberlier/mecha/commit/bd9e578e353faa958514625761bb28e43ca6694c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 6453c118c..39e02896f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,3 +1,3 @@ from .api import * -__version__ = "0.0.0" +__version__ = "0.0.1" diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0b200abc4..e46bafaa7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.0.0" +version = "0.0.1" description = "A bulletproof Minecraft command generation library" authors = ["Valentin Berlier "] license = "MIT" From bc10b34df973242cc0ac1b23c978368d33bc193a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 27 Jan 2021 20:23:08 +0000 Subject: [PATCH 0005/1554] Bump pyright from 1.1.105 to 1.1.106 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.105 to 1.1.106. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.106/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 29 ++++------------------------- packages/mecha/package.json | 2 +- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 77c4bcc46..cbe640d04 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -1,32 +1,11 @@ { - "name": "mecha", - "lockfileVersion": 2, "requires": true, - "packages": { - "": { - "devDependencies": { - "pyright": "^1.1.105" - } - }, - "node_modules/pyright": { - "version": "1.1.105", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.105.tgz", - "integrity": "sha512-X0V7v/Ub3X0sP76kjfLlQI5e/yLNcx4eh70+p+WSXz/ahChNWQEr3flb3ReRmuUVOt9FCYcrt8Fpw5oICGoIug==", - "dev": true, - "bin": { - "pyright": "index.js", - "pyright-langserver": "langserver.index.js" - }, - "engines": { - "node": ">=12.0.0" - } - } - }, + "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.105", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.105.tgz", - "integrity": "sha512-X0V7v/Ub3X0sP76kjfLlQI5e/yLNcx4eh70+p+WSXz/ahChNWQEr3flb3ReRmuUVOt9FCYcrt8Fpw5oICGoIug==", + "version": "1.1.106", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.106.tgz", + "integrity": "sha512-28VWOLjtLKe87a5MTvdaryGahI79sqfYgi6LZid5iMdIMQj4LQlHFy1EqQKiBJm7WsrjLwckEfv5jVE+7+tYeQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 26f72eb0e..ea1c95aff 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.105" + "pyright": "^1.1.106" } } From 2d84b24f3e8ca5a749e31c04a3edea31f4e3479d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 04:53:12 +0000 Subject: [PATCH 0006/1554] Bump python-semantic-release from 7.13.1 to 7.13.2 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.13.1 to 7.13.2. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.13.1...v7.13.2) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 27 +++++++++++++++++++++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 9ffbcaaff..bf8c014a2 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -452,7 +452,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.13.1" +version = "7.13.2" description = "Automatic semantic versioning for python projects" category = "dev" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d526399434839453711d15124d1d35b9baf42b9fc71bbe8b255138b054666880" +content-hash = "af1bd98151666d8794d90f3eddc49d19d1d9ebd8ddf2affda4f62980aa2a5d26" [metadata.files] appdirs = [ @@ -848,20 +848,39 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mypy-extensions = [ @@ -1007,8 +1026,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.13.1.tar.gz", hash = "sha256:8c7bb629d1739a45db2addfaf738f8b01ec816ac1a91f40cbc3612c5efb4d2e3"}, - {file = "python_semantic_release-7.13.1-py3-none-any.whl", hash = "sha256:dc0065675d242a26e8d2d998a398b22314ceed822fc4dbb3174047d837e1b235"}, + {file = "python-semantic-release-7.13.2.tar.gz", hash = "sha256:5eaffada8d0e0bddeaf57776a6c510809fe4915ebf71d204efe8f362072c1a78"}, + {file = "python_semantic_release-7.13.2-py3-none-any.whl", hash = "sha256:57d49e97ed895a1ac8bedd9b89d136f217b7d159b8d865051dd1dd43275ddd47"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e46bafaa7..3fe2a3937 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = "^0.5.1" black = "^20.8b1" isort = "^5.7.0" pytest = "^6.2.2" -python-semantic-release = "^7.13.1" +python-semantic-release = "^7.13.2" [tool.black] target-version = ["py38"] From 68c1170cde60df5c52abe3a4a3309b5a4a1a0115 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 04:56:56 +0000 Subject: [PATCH 0007/1554] Bump pyright from 1.1.106 to 1.1.107 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.106 to 1.1.107. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.107/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index cbe640d04..039f154d9 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.106", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.106.tgz", - "integrity": "sha512-28VWOLjtLKe87a5MTvdaryGahI79sqfYgi6LZid5iMdIMQj4LQlHFy1EqQKiBJm7WsrjLwckEfv5jVE+7+tYeQ==", + "version": "1.1.107", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.107.tgz", + "integrity": "sha512-AatTQ2u0536/un8+5niGnd8WD/7bZ6eu2WSnNcYI07A+qP7ThD5FneltNbzfzMdxJGvArXLZ9Vj2xhFb0HOqGw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index ea1c95aff..8f19e6cc8 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.106" + "pyright": "^1.1.107" } } From 877f35ed8b538ad245165249ac36b9085c0d2fdf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Feb 2021 04:54:39 +0000 Subject: [PATCH 0008/1554] Bump pyright from 1.1.107 to 1.1.108 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.107 to 1.1.108. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.108/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 039f154d9..057e3a63c 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.107", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.107.tgz", - "integrity": "sha512-AatTQ2u0536/un8+5niGnd8WD/7bZ6eu2WSnNcYI07A+qP7ThD5FneltNbzfzMdxJGvArXLZ9Vj2xhFb0HOqGw==", + "version": "1.1.108", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.108.tgz", + "integrity": "sha512-LX6nLg1uu9DXSuvM4PeqSX2mVAzwoh8RfhTLK/W7zpEFYmdKVZXpJlgzwSfPVrRWjq/bEmj+hIYckkx0adBMjQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 8f19e6cc8..6bec3d6b3 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.107" + "pyright": "^1.1.108" } } From e28b95ad309df5f75d56f0e4d366e34e1d58e864 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Feb 2021 18:04:07 +0000 Subject: [PATCH 0009/1554] [Security] Bump bleach from 3.2.3 to 3.3.0 Bumps [bleach](https://github.com/mozilla/bleach) from 3.2.3 to 3.3.0. **This update includes a security fix.** - [Release notes](https://github.com/mozilla/bleach/releases) - [Changelog](https://github.com/mozilla/bleach/blob/master/CHANGES) - [Commits](https://github.com/mozilla/bleach/compare/v3.2.3...v3.3.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index bf8c014a2..cfe6d3d4c 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -70,7 +70,7 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] name = "bleach" -version = "3.2.3" +version = "3.3.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false @@ -704,8 +704,8 @@ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] bleach = [ - {file = "bleach-3.2.3-py2.py3-none-any.whl", hash = "sha256:2d3b3f7e7d69148bb683b26a3f21eabcf62fa8fb7bc75d0e7a13bcecd9568d4d"}, - {file = "bleach-3.2.3.tar.gz", hash = "sha256:c6ad42174219b64848e2e2cd434e44f56cd24a93a9b4f8bc52cfed55a1cd5aad"}, + {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, + {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, ] certifi = [ {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, @@ -745,6 +745,7 @@ cffi = [ {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, + {file = "cffi-1.14.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7ef7d4ced6b325e92eb4d3502946c78c5367bc416398d387b39591532536734e"}, {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, From 80ca9a31577b9e6a22e2fd22f1effb9c52708bd8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 04:54:09 +0000 Subject: [PATCH 0010/1554] Bump pyright from 1.1.108 to 1.1.109 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.108 to 1.1.109. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.109/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 057e3a63c..7e3e5c3bf 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.108", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.108.tgz", - "integrity": "sha512-LX6nLg1uu9DXSuvM4PeqSX2mVAzwoh8RfhTLK/W7zpEFYmdKVZXpJlgzwSfPVrRWjq/bEmj+hIYckkx0adBMjQ==", + "version": "1.1.109", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.109.tgz", + "integrity": "sha512-CAaPMKMmeucbbaDLADjhtOdr/KEKknALovBlGh+VbFqAVta1rxrytiIzF2V6xKWx0QpKdkRixkItSa8rTWalnw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 6bec3d6b3..609945e1b 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.108" + "pyright": "^1.1.109" } } From 46181c7ebaa614ec320c2c07ef32f653b8f0681d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Feb 2021 01:39:29 +0000 Subject: [PATCH 0011/1554] [Security] Bump cryptography from 3.3.1 to 3.3.2 Bumps [cryptography](https://github.com/pyca/cryptography) from 3.3.1 to 3.3.2. **This update includes a security fix.** - [Release notes](https://github.com/pyca/cryptography/releases) - [Changelog](https://github.com/pyca/cryptography/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/3.3.1...3.3.2) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index cfe6d3d4c..2579a5e27 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -151,7 +151,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.3.1" +version = "3.3.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -771,20 +771,20 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.3.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030"}, - {file = "cryptography-3.3.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0"}, - {file = "cryptography-3.3.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812"}, - {file = "cryptography-3.3.1-cp27-cp27m-win32.whl", hash = "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e"}, - {file = "cryptography-3.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901"}, - {file = "cryptography-3.3.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d"}, - {file = "cryptography-3.3.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5"}, - {file = "cryptography-3.3.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302"}, - {file = "cryptography-3.3.1-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244"}, - {file = "cryptography-3.3.1-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c"}, - {file = "cryptography-3.3.1-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c"}, - {file = "cryptography-3.3.1-cp36-abi3-win32.whl", hash = "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a"}, - {file = "cryptography-3.3.1-cp36-abi3-win_amd64.whl", hash = "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7"}, - {file = "cryptography-3.3.1.tar.gz", hash = "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6"}, + {file = "cryptography-3.3.2-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:541dd758ad49b45920dda3b5b48c968f8b2533d8981bcdb43002798d8f7a89ed"}, + {file = "cryptography-3.3.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:49570438e60f19243e7e0d504527dd5fe9b4b967b5a1ff21cc12b57602dd85d3"}, + {file = "cryptography-3.3.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a4ac9648d39ce71c2f63fe7dc6db144b9fa567ddfc48b9fde1b54483d26042"}, + {file = "cryptography-3.3.2-cp27-cp27m-win32.whl", hash = "sha256:aa4969f24d536ae2268c902b2c3d62ab464b5a66bcb247630d208a79a8098e9b"}, + {file = "cryptography-3.3.2-cp27-cp27m-win_amd64.whl", hash = "sha256:1bd0ccb0a1ed775cd7e2144fe46df9dc03eefd722bbcf587b3e0616ea4a81eff"}, + {file = "cryptography-3.3.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e18e6ab84dfb0ab997faf8cca25a86ff15dfea4027b986322026cc99e0a892da"}, + {file = "cryptography-3.3.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c7390f9b2119b2b43160abb34f63277a638504ef8df99f11cb52c1fda66a2e6f"}, + {file = "cryptography-3.3.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0d7b69674b738068fa6ffade5c962ecd14969690585aaca0a1b1fc9058938a72"}, + {file = "cryptography-3.3.2-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:922f9602d67c15ade470c11d616f2b2364950602e370c76f0c94c94ae672742e"}, + {file = "cryptography-3.3.2-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:a0f0b96c572fc9f25c3f4ddbf4688b9b38c69836713fb255f4a2715d93cbaf44"}, + {file = "cryptography-3.3.2-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:a777c096a49d80f9d2979695b835b0f9c9edab73b59e4ceb51f19724dda887ed"}, + {file = "cryptography-3.3.2-cp36-abi3-win32.whl", hash = "sha256:3c284fc1e504e88e51c428db9c9274f2da9f73fdf5d7e13a36b8ecb039af6e6c"}, + {file = "cryptography-3.3.2-cp36-abi3-win_amd64.whl", hash = "sha256:7951a966613c4211b6612b0352f5bf29989955ee592c4a885d8c7d0f830d0433"}, + {file = "cryptography-3.3.2.tar.gz", hash = "sha256:5a60d3780149e13b7a6ff7ad6526b38846354d11a15e21068e57073e29e19bed"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, From e21e53b544be6ea7df9cffb690d39df3a0874ddb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Feb 2021 04:55:03 +0000 Subject: [PATCH 0012/1554] Bump python-semantic-release from 7.13.2 to 7.14.0 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.13.2 to 7.14.0. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.13.2...v7.14.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 2579a5e27..4ae1974f0 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -452,8 +452,8 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.13.2" -description = "Automatic semantic versioning for python projects" +version = "7.14.0" +description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "af1bd98151666d8794d90f3eddc49d19d1d9ebd8ddf2affda4f62980aa2a5d26" +content-hash = "6d42e6a404cbfc5575816d70e4d57b952d8b4fdc487043745adbd286a4c5bfcf" [metadata.files] appdirs = [ @@ -1027,8 +1027,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.13.2.tar.gz", hash = "sha256:5eaffada8d0e0bddeaf57776a6c510809fe4915ebf71d204efe8f362072c1a78"}, - {file = "python_semantic_release-7.13.2-py3-none-any.whl", hash = "sha256:57d49e97ed895a1ac8bedd9b89d136f217b7d159b8d865051dd1dd43275ddd47"}, + {file = "python-semantic-release-7.14.0.tar.gz", hash = "sha256:cda2feebad8fcb1e6522c0dd9a831cb1d39c7b9d6f9e17b20b178295431a2312"}, + {file = "python_semantic_release-7.14.0-py3-none-any.whl", hash = "sha256:bb07830e620b6f9bb2a19bfe149186ff80f53a11f8cef24eb790f46cb1a54c4b"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3fe2a3937..625439585 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = "^0.5.1" black = "^20.8b1" isort = "^5.7.0" pytest = "^6.2.2" -python-semantic-release = "^7.13.2" +python-semantic-release = "^7.14.0" [tool.black] target-version = ["py38"] From d82596a0e28b0f9a7d4645067f513c244bfefbe5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Feb 2021 04:51:00 +0000 Subject: [PATCH 0013/1554] Bump pyright from 1.1.109 to 1.1.110 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.109 to 1.1.110. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.110/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 7e3e5c3bf..b4b992930 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.109", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.109.tgz", - "integrity": "sha512-CAaPMKMmeucbbaDLADjhtOdr/KEKknALovBlGh+VbFqAVta1rxrytiIzF2V6xKWx0QpKdkRixkItSa8rTWalnw==", + "version": "1.1.110", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.110.tgz", + "integrity": "sha512-zvGmwq98wRKdt7gggxkO9BfB1S5Azduefoh2IWzqsdr095ZQz0psH9wU0+VccGxLWbI4EGHNzKugw/0nLmTm2Q==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 609945e1b..245235497 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.109" + "pyright": "^1.1.110" } } From 2fd0887a145a84a01f44cc55901fa0abfb04595a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Feb 2021 04:52:15 +0000 Subject: [PATCH 0014/1554] Bump beet from 0.5.1 to 0.6.1 Bumps [beet](https://github.com/vberlier/beet) from 0.5.1 to 0.6.1. - [Release notes](https://github.com/vberlier/beet/releases) - [Changelog](https://github.com/vberlier/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/vberlier/beet/compare/v0.5.1...v0.6.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4ae1974f0..1c6680c4d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.5.1" +version = "0.6.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "6d42e6a404cbfc5575816d70e4d57b952d8b4fdc487043745adbd286a4c5bfcf" +content-hash = "072cac6b5fc0c83c57201eb9031a13ae81c1b136971beb8071e407339613b5f2" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.5.1-py3-none-any.whl", hash = "sha256:82a3659cd7e34db62ad3a7cb95c79b2c43db1aad69b52282fb23fb29dc5cd55e"}, - {file = "beet-0.5.1.tar.gz", hash = "sha256:581a341786cd40a6d3d58fcfb7ea0f63f011b5e18ee359ec2da7735dca16b634"}, + {file = "beet-0.6.1-py3-none-any.whl", hash = "sha256:8a5adbbd7dfb6fa6e8b8427d02d7c9f277b0d7d5539492a693b0ac060c557bf5"}, + {file = "beet-0.6.1.tar.gz", hash = "sha256:98dfbab10bd036b8faf9547faa3323aadafb5c5e9836099413764fb4c6b15ea3"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 625439585..fcfb4b3e3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.5.1" +beet = ">=0.5.1,<0.7.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From b0f0ca5d6f5ca7bd1f4b8eced35cc1ae00778808 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 16 Feb 2021 04:53:03 +0000 Subject: [PATCH 0015/1554] Bump pyright from 1.1.110 to 1.1.111 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.110 to 1.1.111. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.111/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index b4b992930..ebe677510 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.110", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.110.tgz", - "integrity": "sha512-zvGmwq98wRKdt7gggxkO9BfB1S5Azduefoh2IWzqsdr095ZQz0psH9wU0+VccGxLWbI4EGHNzKugw/0nLmTm2Q==", + "version": "1.1.111", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.111.tgz", + "integrity": "sha512-uhqJUWaXT2FWDB2SwOQeOEhJxlyeznlchhiwTIcYg7TJN4vR501tXgPA1o5FUWWDLy61JVnHFe7/GMphbeXBYQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 245235497..4aee79a00 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.110" + "pyright": "^1.1.111" } } From b89dbc74ab052fc251c4f42f965c2fd515aa9150 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 17 Feb 2021 01:44:06 +0100 Subject: [PATCH 0016/1554] Initial commit --- packages/lectern/.gitignore | 129 ++++++++++++++++++++++++++++++++++++ packages/lectern/LICENSE | 21 ++++++ packages/lectern/README.md | 2 + 3 files changed, 152 insertions(+) create mode 100644 packages/lectern/.gitignore create mode 100644 packages/lectern/LICENSE create mode 100644 packages/lectern/README.md diff --git a/packages/lectern/.gitignore b/packages/lectern/.gitignore new file mode 100644 index 000000000..b6e47617d --- /dev/null +++ b/packages/lectern/.gitignore @@ -0,0 +1,129 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/packages/lectern/LICENSE b/packages/lectern/LICENSE new file mode 100644 index 000000000..98bd29c11 --- /dev/null +++ b/packages/lectern/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Valentin Berlier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/lectern/README.md b/packages/lectern/README.md new file mode 100644 index 000000000..3b103a71d --- /dev/null +++ b/packages/lectern/README.md @@ -0,0 +1,2 @@ +# litpack +Literate Minecraft data packs and resource packs. From da710b7cf3e1a9c301892da5f7980cda41b51d55 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 04:56:20 +0000 Subject: [PATCH 0017/1554] Bump beet from 0.6.1 to 0.7.0 Bumps [beet](https://github.com/vberlier/beet) from 0.6.1 to 0.7.0. - [Release notes](https://github.com/vberlier/beet/releases) - [Changelog](https://github.com/vberlier/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/vberlier/beet/compare/v0.6.1...v0.7.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1c6680c4d..527728438 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.6.1" +version = "0.7.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "072cac6b5fc0c83c57201eb9031a13ae81c1b136971beb8071e407339613b5f2" +content-hash = "f015834829d7bafb5d7f21ba336c2c8bf96bc0c53d0d5fe8ed01e62bc9b56839" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.6.1-py3-none-any.whl", hash = "sha256:8a5adbbd7dfb6fa6e8b8427d02d7c9f277b0d7d5539492a693b0ac060c557bf5"}, - {file = "beet-0.6.1.tar.gz", hash = "sha256:98dfbab10bd036b8faf9547faa3323aadafb5c5e9836099413764fb4c6b15ea3"}, + {file = "beet-0.7.0-py3-none-any.whl", hash = "sha256:59f05cd36bf341501809b28c794e53cdbacb75f2716fa66e799091f259de0dc3"}, + {file = "beet-0.7.0.tar.gz", hash = "sha256:b6ce6cf6580352d291af4428f3afd24319ea70b3c0244d804d88d9237312a698"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index fcfb4b3e3..191e7c8a1 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.7.0" +beet = ">=0.5.1,<0.8.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From d7a1a30fb25b7c37c1fe820801c285b55f6da945 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Feb 2021 04:52:57 +0000 Subject: [PATCH 0018/1554] Bump pyright from 1.1.111 to 1.1.112 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.111 to 1.1.112. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.112/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index ebe677510..6b35b07a4 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.111", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.111.tgz", - "integrity": "sha512-uhqJUWaXT2FWDB2SwOQeOEhJxlyeznlchhiwTIcYg7TJN4vR501tXgPA1o5FUWWDLy61JVnHFe7/GMphbeXBYQ==", + "version": "1.1.112", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.112.tgz", + "integrity": "sha512-/pwzJWmGo3s7gETYq9CUcPP5F4ZxFBe9u8sQpEJDHD//YFi97EQjhBkOT4M6sNEKpG8u/nyoVRK9ZlGFBHZtcQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 4aee79a00..822611b34 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.111" + "pyright": "^1.1.112" } } From a2344f05ba631e753660909d49fdea5d819cd029 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Feb 2021 04:54:30 +0000 Subject: [PATCH 0019/1554] Bump beet from 0.7.0 to 0.8.1 Bumps [beet](https://github.com/vberlier/beet) from 0.7.0 to 0.8.1. - [Release notes](https://github.com/vberlier/beet/releases) - [Changelog](https://github.com/vberlier/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/vberlier/beet/compare/v0.7.0...v0.8.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 527728438..790d37578 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.7.0" +version = "0.8.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f015834829d7bafb5d7f21ba336c2c8bf96bc0c53d0d5fe8ed01e62bc9b56839" +content-hash = "2412e0d22f6275b821a4cfcf2244810822289d6f836b84b40d8436cfdadd214f" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.7.0-py3-none-any.whl", hash = "sha256:59f05cd36bf341501809b28c794e53cdbacb75f2716fa66e799091f259de0dc3"}, - {file = "beet-0.7.0.tar.gz", hash = "sha256:b6ce6cf6580352d291af4428f3afd24319ea70b3c0244d804d88d9237312a698"}, + {file = "beet-0.8.1-py3-none-any.whl", hash = "sha256:409fa2aa729cd9d2637db298475963929aa73c780792ffa8aa31592e435cea8f"}, + {file = "beet-0.8.1.tar.gz", hash = "sha256:355caeb6aca75b47dbf8246c9d188b9093a7782fe3dc85cad7cad8fd47641dfb"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 191e7c8a1..9e9ca0c54 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.8.0" +beet = ">=0.5.1,<0.9.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 8168cff67cb0d5d7dd7102b567041123203e80a4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 18 Feb 2021 18:54:28 +0100 Subject: [PATCH 0020/1554] chore: start writing README --- packages/mecha/README.md | 32 ++++++++++++++++++++++++++++- packages/mecha/docs/assets/logo.svg | 23 +++++++++++++++++++++ packages/mecha/pyproject.toml | 2 +- 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100755 packages/mecha/docs/assets/logo.svg diff --git a/packages/mecha/README.md b/packages/mecha/README.md index ca85948e1..ebb15a0be 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -1,3 +1,5 @@ +logo + # Mecha [![GitHub Actions](https://github.com/vberlier/mecha/workflows/CI/badge.svg)](https://github.com/vberlier/mecha/actions) @@ -5,7 +7,35 @@ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mecha.svg)](https://pypi.org/project/mecha/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) -> A bulletproof Minecraft command generation library. +> A flexible Minecraft command generation library. + +## Introduction + +This package provides a versatile API for generating Minecraft commands in Python. It uses the [`beet`](https://github.com/vberlier/beet) library to generate functions and integrates natively with the `beet` pipeline. + +```python +from beet import Context +from mecha import Mecha + +def my_plugin(ctx: Context): + mc = ctx.inject(Mecha) + + with mc.function("foo"): + mc.say("hello") +``` + +You can directly create handles from data pack instances. The library can be used on its own without being part of a `beet` pipeline. + +```python +from beet import DataPack +from mecha import Mecha + +with DataPack(path="demo") as data: + mc = Mecha(data) + + with mc.function("foo"): + mc.say("hello") +``` ## Installation diff --git a/packages/mecha/docs/assets/logo.svg b/packages/mecha/docs/assets/logo.svg new file mode 100755 index 000000000..af959c1d4 --- /dev/null +++ b/packages/mecha/docs/assets/logo.svg @@ -0,0 +1,23 @@ + +Made with Pixels to Svg https://codepen.io/shshaw/pen/XbxvNj + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9e9ca0c54..f7a5c30b7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "mecha" version = "0.0.1" -description = "A bulletproof Minecraft command generation library" +description = "A flexible Minecraft command generation library" authors = ["Valentin Berlier "] license = "MIT" From 510263829f01e3c86c1422adf85e71978b2cf8de Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 17 Feb 2021 05:47:39 +0100 Subject: [PATCH 0021/1554] docs: update README --- packages/lectern/README.md | 298 ++++++++++++++++++++++++++++++++++++- packages/lectern/logo.svg | 28 ++++ 2 files changed, 324 insertions(+), 2 deletions(-) create mode 100755 packages/lectern/logo.svg diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 3b103a71d..7c801713d 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -1,2 +1,296 @@ -# litpack -Literate Minecraft data packs and resource packs. +logo + +# Lectern + +[![GitHub Actions](https://github.com/vberlier/lectern/workflows/CI/badge.svg)](https://github.com/vberlier/lectern/actions) +[![PyPI](https://img.shields.io/pypi/v/lectern.svg)](https://pypi.org/project/lectern/) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/lectern.svg)](https://pypi.org/project/lectern/) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) + +> Literate Minecraft data packs and resource packs. + +`@function tutorial:greeting` + +```mcfunction +say Hello, world! +``` + +## Introduction + +This markdown file is interspersed with code fragments describing the content of a Minecraft data pack. Using `lectern`, you can turn this single file into an actual data pack that can be loaded into the game. + +**Features** + +- Turn markdown files into data packs and resource packs +- Merge resources from several markdown files +- Convert data packs and resource packs into markdown snapshots +- Can be used as a [`beet`](https://github.com/vberlier/beet) plugin +- Highly extensible with custom directives + +**Hmmkay but why?** + +- Editing data packs involves a lot of jumping around between files, for simple use-cases a single file is a lot easier to work with +- Minecraft packs aggregate various types of files that can have complex interactions with each other, a literate style allows you to document these interactions fluently +- Human-readable, single-file data pack and resource pack snapshots can be really useful to diff and track regressions in Minecraft-related tooling + +## Installation + +The package can be installed with `pip`. + +```bash +$ pip install lectern +``` + +## Getting started + +This is an example of a markdown file that can be turned into a data pack: + + # Beginner tutorial + + Let's start by creating a simple function: + + `@function tutorial:greeting` + + ```mcfunction + say Hello, world! + ``` + + And now we can make it run when the data pack is loaded! + + `@function_tag minecraft:load` + + ```json + { + "values": ["tutorial:greeting"] + } + ``` + +You can use the `lectern` command-line utility to turn the markdown file into a data pack. + +```bash +$ lectern tutorial.md --data-pack path/to/tutorial_data_pack +``` + +If you're using [`beet`](https://github.com/vberlier/beet) you can use `lectern` as a plugin in your pipeline. + +```json +{ + "pipeline": ["lectern"], + "meta": { + "lectern": { + "load": ["*.md"] + } + } +} +``` + +## Directives + +Data pack and resource pack fragments are code blocks, links or images annotated with a special `lectern` directive. Directives are prefixed with the `@` symbol and can be followed by zero or more arguments. + +``` +@ ... +``` + +`lectern` provides directives for including namespaced resources inside data packs and resource packs. These built-in directives all expect a single argument specifying the fully-qualified resource name. + +``` +@function tutorial:greeting +@function_tag minecraft:load +``` + +Here is a reference of all the supported resources: + +| Data pack | | Resource pack | | +| ------------------------------- | --- | ------------------ | --- | +| `@advancement` | | `@blockstate` | | +| `@function` | | `@model` | | +| `@loot_table` | | `@font` | | +| `@predicate` | | `@glyph_sizes` | ⚠️ | +| `@recipe` | | `@truetype_font` | ⚠️ | +| `@structure` | ⚠️ | `@shader_post` | | +| `@block_tag` | | `@shader_program` | | +| `@entity_type_tag` | | `@fragment_shader` | | +| `@fluid_tag` | | `@vertex_shader` | | +| `@function_tag` | | `@text` | | +| `@item_tag` | | `@texture_mcmeta` | | +| `@dimension_type` | | `@texture` | ⚠️ | +| `@dimension` | | | | +| `@biome` | | | | +| `@configured_carver` | | | | +| `@configured_feature` | | | | +| `@configured_structure_feature` | | | | +| `@configured_surface_builder` | | | | +| `@noise_settings` | | | | +| `@processor_list` | | | | +| `@template_pool` | | | | + +> ⚠️ Binary resources are supported but aren't compatible with code block fragments. + +There are two additional built-in directives that can be used to include files using a path relative to the root of the data pack or the resource pack. + +``` +@data_pack pack.mcmeta +@resource_pack pack.png +@resource_pack assets/minecraft/textures/block/kelp_plant.png.mcmeta +``` + +This is useful for adding files that aren't part of any particular namespace. + +## Code block fragments + +You can include the content of a code block in a data pack or a resource pack by preceding it with a directive surrounded by backticks. + +`@function tutorial:greeting` + +```mcfunction +say Hello, world! +``` + +You can put the directive in an html comment to make it invisible. + + + +```json +{ + "values": ["tutorial:greeting"] +} +``` + +The directive can also be embedded directly inside the code block. You can insert a directive preceded by either `#` or `//` and the following lines will be included in the specified file. + +```mcfunction +# @function tutorial:obtained_dead_bush +say You obtained a dead bush! +``` + +Embedded directives are striped from the output. You can use multiple directives in a single code block. + +```json +// @loot_table minecraft:blocks/diamond_ore +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] +} +// @advancement tutorial:obtained_dead_bush +{ + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } +} +``` + +## Link fragments + +TODO + +## Image fragments + +TODO + +## Operators + +TODO + +## Command-line utility + +```bash +$ lectern --help +``` + +You can extract data packs from markdown files with the `-d/--data-pack` option. If the name ends with `.zip` the generated data pack will be zipped. Multiple markdown files can be merged together into a single data pack. + +```bash +$ lectern demo.md --data-pack demo_data_pack +$ lectern demo.md -d demo_data_pack +$ lectern demo.md -d demo_data_pack.zip +$ lectern foo.md bar.md -d demo_data_pack +``` + +The `-r/--resource-pack` option lets you do exactly the same thing but with resource packs. The two options can be combined to extract a data packs and a resource pack at the same time. + +```bash +$ lectern demo.md --resource-pack demo_resource_pack +$ lectern demo.md -r demo_resource_pack +$ lectern demo.md -d demo_data_pack -r demo_resource_pack +``` + +You can also convert a combination of data packs and resource packs into a single markdown file. + +```bash +$ lectern demo_data_pack demo.md +$ lectern demo_data_pack.zip demo.md +$ lectern demo_data_pack demo_resource_pack demo.md +$ lectern foo_data_pack bar_data_pack demo.md +``` + +The last argument is the name of the generated markdown file. By default, the `lectern` utility won't save the files that can't be directly defined inside the markdown file. You can use the `-o/--output-files` option to dump the files in the specified directory. + +```bash +$ lectern demo_data_pack demo.md --output-files files +$ lectern demo_data_pack demo.md -o files +$ lectern demo_data_pack demo.md -o . +``` + +## Beet plugin + +TODO + +## Contributing + +Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses [`poetry`](https://python-poetry.org). + +```bash +$ poetry install +``` + +You can run the tests with `poetry run pytest`. + +```bash +$ poetry run pytest +``` + +The project must type-check with [`pyright`](https://github.com/microsoft/pyright). If you're using VSCode the [`pylance`](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) extension should report diagnostics automatically. You can also install the type-checker locally with `npm install` and run it from the command-line. + +```bash +$ npm run watch +$ npm run check +``` + +The code follows the [`black`](https://github.com/psf/black) code style. Import statements are sorted with [`isort`](https://pycqa.github.io/isort/). + +```bash +$ poetry run isort lectern tests +$ poetry run black lectern tests +$ poetry run black --check lectern tests +``` + +--- + +License - [MIT](https://github.com/vberlier/lectern/blob/main/LICENSE) diff --git a/packages/lectern/logo.svg b/packages/lectern/logo.svg new file mode 100755 index 000000000..55a9c96ea --- /dev/null +++ b/packages/lectern/logo.svg @@ -0,0 +1,28 @@ + +Made with Pixels to Svg https://codepen.io/shshaw/pen/XbxvNj + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 39349d1135b230d85e752333a3b594963a1e3097 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Feb 2021 04:55:43 +0000 Subject: [PATCH 0022/1554] chore(deps-dev): bump python-semantic-release from 7.14.0 to 7.15.0 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.14.0 to 7.15.0. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.14.0...v7.15.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 790d37578..84db2df7f 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -452,7 +452,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.14.0" +version = "7.15.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "2412e0d22f6275b821a4cfcf2244810822289d6f836b84b40d8436cfdadd214f" +content-hash = "ebdebf4f7a6093c552db077e14833bbc629d5f193bbb9526158c826d4e16aa9a" [metadata.files] appdirs = [ @@ -1027,8 +1027,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.14.0.tar.gz", hash = "sha256:cda2feebad8fcb1e6522c0dd9a831cb1d39c7b9d6f9e17b20b178295431a2312"}, - {file = "python_semantic_release-7.14.0-py3-none-any.whl", hash = "sha256:bb07830e620b6f9bb2a19bfe149186ff80f53a11f8cef24eb790f46cb1a54c4b"}, + {file = "python-semantic-release-7.15.0.tar.gz", hash = "sha256:a0ffd462bd42c5e0c41363b3c66c707ef4ad181bebc2f81145debbce9438e713"}, + {file = "python_semantic_release-7.15.0-py3-none-any.whl", hash = "sha256:04835c4e32db24387bcab3aac0a11892b274f00206e360abfa4d8152b082d0f1"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f7a5c30b7..47785634f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.5.1,<0.9.0" black = "^20.8b1" isort = "^5.7.0" pytest = "^6.2.2" -python-semantic-release = "^7.14.0" +python-semantic-release = "^7.15.0" [tool.black] target-version = ["py38"] From fdc2f6d9561b73cf31c1d97130512af04bfd8a02 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Feb 2021 19:39:17 +0100 Subject: [PATCH 0023/1554] chore: setup project --- packages/lectern/.vscode/extensions.json | 7 + packages/lectern/.vscode/settings.json | 23 + packages/lectern/lectern/__init__.py | 1 + packages/lectern/lectern/__main__.py | 0 packages/lectern/lectern/cli.py | 0 packages/lectern/lectern/py.typed | 0 packages/lectern/package.json | 9 + packages/lectern/poetry.lock | 630 +++++++++++++++++++++++ packages/lectern/poetry.toml | 2 + packages/lectern/pyproject.toml | 59 +++ packages/lectern/pyrightconfig.json | 3 + packages/lectern/pytest.ini | 2 + packages/lectern/tests/__init__.py | 0 13 files changed, 736 insertions(+) create mode 100644 packages/lectern/.vscode/extensions.json create mode 100644 packages/lectern/.vscode/settings.json create mode 100644 packages/lectern/lectern/__init__.py create mode 100644 packages/lectern/lectern/__main__.py create mode 100644 packages/lectern/lectern/cli.py create mode 100644 packages/lectern/lectern/py.typed create mode 100644 packages/lectern/package.json create mode 100644 packages/lectern/poetry.lock create mode 100644 packages/lectern/poetry.toml create mode 100644 packages/lectern/pyproject.toml create mode 100644 packages/lectern/pyrightconfig.json create mode 100644 packages/lectern/pytest.ini create mode 100644 packages/lectern/tests/__init__.py diff --git a/packages/lectern/.vscode/extensions.json b/packages/lectern/.vscode/extensions.json new file mode 100644 index 000000000..8affbb2bf --- /dev/null +++ b/packages/lectern/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "bungcip.better-toml" + ] +} diff --git a/packages/lectern/.vscode/settings.json b/packages/lectern/.vscode/settings.json new file mode 100644 index 000000000..23de92c05 --- /dev/null +++ b/packages/lectern/.vscode/settings.json @@ -0,0 +1,23 @@ +{ + "python.pythonPath": "${workspaceFolder}/.venv", + "python.formatting.provider": "black", + "python.languageServer": "Pylance", + "python.linting.enabled": false, + "python.linting.pylintEnabled": false, + "python.linting.banditEnabled": false, + "python.linting.flake8Enabled": false, + "python.linting.mypyEnabled": false, + "python.linting.prospectorEnabled": false, + "python.linting.pycodestyleEnabled": false, + "python.linting.pydocstyleEnabled": false, + "python.linting.pylamaEnabled": false, + "[python]": { + "editor.tabSize": 4, + "editor.formatOnSave": true, + "editor.formatOnType": false, + "editor.formatOnPaste": false, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + } +} diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py new file mode 100644 index 000000000..6c8e6b979 --- /dev/null +++ b/packages/lectern/lectern/__init__.py @@ -0,0 +1 @@ +__version__ = "0.0.0" diff --git a/packages/lectern/lectern/__main__.py b/packages/lectern/lectern/__main__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/lectern/lectern/py.typed b/packages/lectern/lectern/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/packages/lectern/package.json b/packages/lectern/package.json new file mode 100644 index 000000000..822611b34 --- /dev/null +++ b/packages/lectern/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "watch": "poetry run pyright -w", + "check": "poetry run pyright" + }, + "devDependencies": { + "pyright": "^1.1.112" + } +} diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock new file mode 100644 index 000000000..e78ad9169 --- /dev/null +++ b/packages/lectern/poetry.lock @@ -0,0 +1,630 @@ +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] + +[[package]] +name = "beet" +version = "0.8.1" +description = "The Minecraft pack development kit" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +click = ">=7.1.2,<8.0.0" +click-help-colors = ">=0.9,<0.10" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +Jinja2 = ">=2.11.2,<3.0.0" +nbtlib = ">=1.8.2,<2.0.0" +pathspec = ">=0.8.1,<0.9.0" +Pillow = ">=8.0.1,<9.0.0" +pydantic = ">=1.7.3,<2.0.0" + +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "click-help-colors" +version = "0.9" +description = "Colorization of help messages in Click" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7.0,<9" + +[package.extras] +dev = ["pytest"] + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.7.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] + +[[package]] +name = "jinja2" +version = "2.11.3" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "markdown-it-py" +version = "0.6.2" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +attrs = ">=19,<21" +mdit-py-plugins = ">=0.2.1,<0.3.0" + +[package.extras] +code_style = ["pre-commit (==2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistune (>=0.8.4,<0.9.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "panflute (>=1.12,<2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +rtd = ["myst-nb (>=0.11.1,<0.12.0)", "sphinx-book-theme", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-copybutton", "sphinx (>=2,<4)", "pyyaml"] +testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-benchmark (>=3.2,<4.0)", "psutil"] + +[[package]] +name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[[package]] +name = "mdit-py-plugins" +version = "0.2.5" +description = "Collection of plugins for markdown-it-py" +category = "main" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +markdown-it-py = ">=0.5.8,<2.0.0" + +[package.extras] +code_style = ["pre-commit (==2.6)"] +testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbtlib" +version = "1.12.0" +description = "A python package to read and edit nbt data" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +numpy = ">1.16,<1.20.2" + +[[package]] +name = "numpy" +version = "1.20.1" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pathspec" +version = "0.8.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pillow" +version = "8.1.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pydantic" +version = "1.7.3" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] +typing_extensions = ["typing-extensions (>=3.7.2)"] + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pytest" +version = "6.2.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<1.0.0a1" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "regex" +version = "2020.11.13" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "rope" +version = "0.18.0" +description = "a python refactoring library..." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +dev = ["pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "typed-ast" +version = "1.4.2" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" +optional = false +python-versions = "*" + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "df7bc708876906e14a0293018ea859e5e7857659d0db819618ab3c78337bc872" + +[metadata.files] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] +beet = [ + {file = "beet-0.8.1-py3-none-any.whl", hash = "sha256:409fa2aa729cd9d2637db298475963929aa73c780792ffa8aa31592e435cea8f"}, + {file = "beet-0.8.1.tar.gz", hash = "sha256:355caeb6aca75b47dbf8246c9d188b9093a7782fe3dc85cad7cad8fd47641dfb"}, +] +black = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +click-help-colors = [ + {file = "click-help-colors-0.9.tar.gz", hash = "sha256:eb037a2dd95a9e20b3897c2b3ca57e7f6797f76a8d93f7eeedda7fcdcbc9b635"}, + {file = "click_help_colors-0.9-py3-none-any.whl", hash = "sha256:f6c3d1fe86b07790e6ef0339f458196a8814de90946d876774ea4b4f30a5a539"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, + {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, +] +jinja2 = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] +markdown-it-py = [ + {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, + {file = "markdown_it_py-0.6.2-py3-none-any.whl", hash = "sha256:30b3e9f8198dc82a5df0dcb73fd31d56cd9a43bf8a747feb10b2ba74f962bcb1"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +mdit-py-plugins = [ + {file = "mdit-py-plugins-0.2.5.tar.gz", hash = "sha256:06dbda99e7d81184c4f6de7c7e3409b29f5cef35404beed6feaf624646219bf5"}, + {file = "mdit_py_plugins-0.2.5-py3-none-any.whl", hash = "sha256:3c78db5cfdcf8f55f0af2b096de391bffcef0b3600222f434efb016d7c267cec"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbtlib = [ + {file = "nbtlib-1.12.0-py3-none-any.whl", hash = "sha256:30a3545cf7e654624cd1bf23ec2590d0a0e3a7bca2a8af4725d7d758453d8686"}, + {file = "nbtlib-1.12.0.tar.gz", hash = "sha256:2554d16bbf51b087442f4d55981ba476ae5d1f046f89dd7904914a7412a80a2e"}, +] +numpy = [ + {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, + {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, + {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, + {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, + {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, + {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, + {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, + {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, + {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, + {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, + {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, +] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pathspec = [ + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, +] +pillow = [ + {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded"}, + {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, + {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, + {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7"}, + {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, + {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, + {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae"}, + {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, + {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, + {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0"}, + {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, + {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, + {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pydantic = [ + {file = "pydantic-1.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d8df4b9090b595511906fa48deda47af04e7d092318bfb291f4d45dfb6bb2127"}, + {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:514b473d264671a5c672dfb28bdfe1bf1afd390f6b206aa2ec9fed7fc592c48e"}, + {file = "pydantic-1.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:dba5c1f0a3aeea5083e75db9660935da90216f8a81b6d68e67f54e135ed5eb23"}, + {file = "pydantic-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59e45f3b694b05a69032a0d603c32d453a23f0de80844fb14d55ab0c6c78ff2f"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b24e8a572e4b4c18f614004dda8c9f2c07328cb5b6e314d6e1bbd536cb1a6c1"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:b2b054d095b6431cdda2f852a6d2f0fdec77686b305c57961b4c5dd6d863bf3c"}, + {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:025bf13ce27990acc059d0c5be46f416fc9b293f45363b3d19855165fee1874f"}, + {file = "pydantic-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6e3874aa7e8babd37b40c4504e3a94cc2023696ced5a0500949f3347664ff8e2"}, + {file = "pydantic-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e682f6442ebe4e50cb5e1cfde7dda6766fb586631c3e5569f6aa1951fd1a76ef"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:185e18134bec5ef43351149fe34fda4758e53d05bb8ea4d5928f0720997b79ef"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:f5b06f5099e163295b8ff5b1b71132ecf5866cc6e7f586d78d7d3fd6e8084608"}, + {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:24ca47365be2a5a3cc3f4a26dcc755bcdc9f0036f55dcedbd55663662ba145ec"}, + {file = "pydantic-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:d1fe3f0df8ac0f3a9792666c69a7cd70530f329036426d06b4f899c025aca74e"}, + {file = "pydantic-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6864844b039805add62ebe8a8c676286340ba0c6d043ae5dea24114b82a319e"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ecb54491f98544c12c66ff3d15e701612fc388161fd455242447083350904730"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ffd180ebd5dd2a9ac0da4e8b995c9c99e7c74c31f985ba090ee01d681b1c4b95"}, + {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8d72e814c7821125b16f1553124d12faba88e85405b0864328899aceaad7282b"}, + {file = "pydantic-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:475f2fa134cf272d6631072554f845d0630907fce053926ff634cc6bc45bf1af"}, + {file = "pydantic-1.7.3-py3-none-any.whl", hash = "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229"}, + {file = "pydantic-1.7.3.tar.gz", hash = "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pytest = [ + {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, + {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, +] +regex = [ + {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, + {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, + {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, + {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, + {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, + {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, + {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, + {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, + {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, + {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, + {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, + {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, + {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, +] +rope = [ + {file = "rope-0.18.0.tar.gz", hash = "sha256:786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +typed-ast = [ + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, + {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, + {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, + {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, + {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, + {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, + {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, + {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, + {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, + {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] diff --git a/packages/lectern/poetry.toml b/packages/lectern/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/lectern/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml new file mode 100644 index 000000000..9a62b3d58 --- /dev/null +++ b/packages/lectern/pyproject.toml @@ -0,0 +1,59 @@ +[tool.poetry] +name = "lectern" +version = "0.0.0" +description = "Literate Minecraft data packs and resource packs." +authors = ["Valentin Berlier "] +license = "MIT" + +homepage = "https://github.com/vberlier/lectern" +repository = "https://github.com/vberlier/lectern" +documentation = "https://github.com/vberlier/lectern" + +readme = "README.md" + +keywords = [ + "literate-programming", + "beet", + "resourcepack", + "minecraft", + "datapack" +] + +include = ["beet/py.typed"] + +[tool.poetry.dependencies] +python = "^3.8" +beet = "^0.8.1" +markdown-it-py = "^0.6.2" + +[tool.poetry.dev-dependencies] +black = "^20.8b1" +rope = "^0.18.0" +pytest = "^6.2.2" +isort = "^5.7.0" + +[tool.black] +target-version = ["py38"] +include = '\.pyi?$' +exclude = ''' +/( + \.eggs + | \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | node_modules + | _build + | buck-out + | build + | dist +)/ +''' + +[tool.isort] +profile = "black" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/lectern/pyrightconfig.json b/packages/lectern/pyrightconfig.json new file mode 100644 index 000000000..0102dcd92 --- /dev/null +++ b/packages/lectern/pyrightconfig.json @@ -0,0 +1,3 @@ +{ + "typeCheckingMode": "strict" +} diff --git a/packages/lectern/pytest.ini b/packages/lectern/pytest.ini new file mode 100644 index 000000000..c8cd4b380 --- /dev/null +++ b/packages/lectern/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = tests diff --git a/packages/lectern/tests/__init__.py b/packages/lectern/tests/__init__.py new file mode 100644 index 000000000..e69de29bb From 5c5f656b1b0537c084ec0022e80d7822b3e4cdf9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Feb 2021 08:13:57 +0100 Subject: [PATCH 0024/1554] feat: plain text extraction and serialization --- packages/lectern/.gitignore | 3 + packages/lectern/lectern/__init__.py | 7 ++ packages/lectern/lectern/__main__.py | 3 + packages/lectern/lectern/cli.py | 88 +++++++++++++++ packages/lectern/lectern/directive.py | 156 ++++++++++++++++++++++++++ packages/lectern/lectern/document.py | 88 +++++++++++++++ packages/lectern/lectern/extract.py | 111 ++++++++++++++++++ packages/lectern/lectern/fragment.py | 53 +++++++++ packages/lectern/lectern/plugin.py | 48 ++++++++ packages/lectern/lectern/serialize.py | 62 ++++++++++ packages/lectern/package-lock.json | 33 ++++++ packages/lectern/poetry.lock | 8 +- packages/lectern/pyproject.toml | 8 +- 13 files changed, 662 insertions(+), 6 deletions(-) create mode 100644 packages/lectern/lectern/directive.py create mode 100644 packages/lectern/lectern/document.py create mode 100644 packages/lectern/lectern/extract.py create mode 100644 packages/lectern/lectern/fragment.py create mode 100644 packages/lectern/lectern/plugin.py create mode 100644 packages/lectern/lectern/serialize.py create mode 100644 packages/lectern/package-lock.json diff --git a/packages/lectern/.gitignore b/packages/lectern/.gitignore index b6e47617d..d82aa4e71 100644 --- a/packages/lectern/.gitignore +++ b/packages/lectern/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# Node +node_modules/ diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 6c8e6b979..9a4cefc54 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -1 +1,8 @@ +from .directive import * +from .document import * +from .extract import * +from .fragment import * +from .plugin import * +from .serialize import * + __version__ = "0.0.0" diff --git a/packages/lectern/lectern/__main__.py b/packages/lectern/lectern/__main__.py index e69de29bb..26a05b943 100644 --- a/packages/lectern/lectern/__main__.py +++ b/packages/lectern/lectern/__main__.py @@ -0,0 +1,3 @@ +from lectern.cli import main + +main() diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py index e69de29bb..80395dfc6 100644 --- a/packages/lectern/lectern/cli.py +++ b/packages/lectern/lectern/cli.py @@ -0,0 +1,88 @@ +__all__ = [ + "lectern", + "main", +] + + +from typing import Any, Optional, Tuple + +import click +from beet import DataPack, ResourcePack, run_beet +from beet.toolchain.cli import error_handler + +from lectern import __version__ + + +@click.command(context_settings={"help_option_names": ("-h", "--help")}) +@click.pass_context +@click.argument("path", nargs=-1) +@click.option( + "-d", + "--data-pack", + metavar="", + help="Extract data pack.", +) +@click.option( + "-r", + "--resource-pack", + metavar="", + help="Extract resource pack.", +) +@click.option( + "-o", + "--output-files", + metavar="", + help="Output the associated files.", +) +@click.version_option( + __version__, + "-v", + "--version", + message="%(prog)s v%(version)s", +) +@error_handler(should_exit=True) +def lectern( + ctx: click.Context, + path: Tuple[str], + data_pack: Optional[str], + resource_pack: Optional[str], + output_files: Optional[str], +): + """Literate Minecraft data packs and resource packs.""" + config: Any + + if data_pack or resource_pack: + config = { + "pipeline": ["lectern"], + "meta": { + "lectern": {"load": list(path)}, + }, + } + else: + try: + *packs, dest = path + except ValueError: + click.echo(ctx.get_help()) + ctx.exit(1) + config = { + "data_pack": {"load": packs}, + "resource_pack": {"load": packs}, + "pipeline": ["lectern"], + "meta": { + "lectern": {"output": dest, "output_files": output_files}, + }, + } + + output_assets, output_data = run_beet(config).packs + + if data_pack: + with DataPack(path=data_pack) as data: + data.merge(output_data) + if resource_pack: + with ResourcePack(path=resource_pack) as assets: + assets.merge(output_assets) + + +def main(): + """Invoke the command-line entrypoint.""" + lectern(prog_name="lectern") # type: ignore diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py new file mode 100644 index 000000000..938a393c1 --- /dev/null +++ b/packages/lectern/lectern/directive.py @@ -0,0 +1,156 @@ +__all__ = [ + "Directive", + "NamespacedResourceDirective", + "DataPackDirective", + "ResourcePackDirective", + "BundleFragmentMixin", + "get_builtin_directives", +] + + +import io +from dataclasses import dataclass +from typing import Dict, Protocol, Type, Union +from zipfile import ZipFile + +from beet import DataPack, ResourcePack +from beet.library.base import NamespaceFile +from beet.library.data_pack import ( + Advancement, + Biome, + BlockTag, + ConfiguredCarver, + ConfiguredFeature, + ConfiguredStructureFeature, + ConfiguredSurfaceBuilder, + Dimension, + DimensionType, + EntityTypeTag, + FluidTag, + Function, + FunctionTag, + ItemTag, + LootTable, + NoiseSettings, + Predicate, + ProcessorList, + Recipe, + Structure, + TemplatePool, +) +from beet.library.resource_pack import ( + Blockstate, + Font, + FragmentShader, + GlyphSizeFile, + Model, + ShaderPost, + ShaderProgram, + Text, + Texture, + TextureMcmeta, + TrueTypeFont, + VertexShader, +) + +from .fragment import Fragment + + +class Directive(Protocol): + """Protocol for detecting directives.""" + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + ... + + +@dataclass +class NamespacedResourceDirective: + """Directive for including namespaced resources.""" + + file_type: Type[NamespaceFile] + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + full_name = fragment.expect("full_name") + file_instance = self.file_type(fragment.content) + + if self.file_type in assets.namespace_type.field_map: + assets[full_name] = file_instance + else: + data[full_name] = file_instance + + +class BundleFragmentMixin: + """Directive mixin that can bundle a fragment into a zipfile.""" + + def bundle_pack_fragment(self, fragment: Fragment) -> ZipFile: + """Return a zipfile containing the pack fragment.""" + relative_path = fragment.expect("relative_path") + + data = io.BytesIO() + with ZipFile(data, mode="w") as zip_file: + zip_file.writestr(relative_path, fragment.content) + + return ZipFile(io.BytesIO(data.getvalue())) + + +@dataclass +class DataPackDirective(BundleFragmentMixin): + """Directive that loads the fragment into the data pack.""" + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + data.load(self.bundle_pack_fragment(fragment)) + + +@dataclass +class ResourcePackDirective(BundleFragmentMixin): + """Directive that loads the fragment into the resource pack.""" + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + assets.load(self.bundle_pack_fragment(fragment)) + + +def get_builtin_directives() -> Dict[ + str, Union[NamespacedResourceDirective, DataPackDirective, ResourcePackDirective] +]: + """Return the built-in directives.""" + return { + # fmt: off + "advancement": NamespacedResourceDirective(Advancement), + "function": NamespacedResourceDirective(Function), + "loot_table": NamespacedResourceDirective(LootTable), + "predicate": NamespacedResourceDirective(Predicate), + "recipe": NamespacedResourceDirective(Recipe), + "structure": NamespacedResourceDirective(Structure), + "block_tag": NamespacedResourceDirective(BlockTag), + "entity_type_tag": NamespacedResourceDirective(EntityTypeTag), + "fluid_tag": NamespacedResourceDirective(FluidTag), + "function_tag": NamespacedResourceDirective(FunctionTag), + "item_tag": NamespacedResourceDirective(ItemTag), + "dimension_type": NamespacedResourceDirective(DimensionType), + "dimension": NamespacedResourceDirective(Dimension), + "biome": NamespacedResourceDirective(Biome), + "configured_carver": NamespacedResourceDirective(ConfiguredCarver), + "configured_feature": NamespacedResourceDirective(ConfiguredFeature), + "configured_structure_feature": NamespacedResourceDirective(ConfiguredStructureFeature), + "configured_surface_builder": NamespacedResourceDirective(ConfiguredSurfaceBuilder), + "noise_settings": NamespacedResourceDirective(NoiseSettings), + "processor_list": NamespacedResourceDirective(ProcessorList), + "template_pool": NamespacedResourceDirective(TemplatePool), + + "blockstate": NamespacedResourceDirective(Blockstate), + "model": NamespacedResourceDirective(Model), + "font": NamespacedResourceDirective(Font), + "glyph_sizes": NamespacedResourceDirective(GlyphSizeFile), + "truetype_font": NamespacedResourceDirective(TrueTypeFont), + "shader_post": NamespacedResourceDirective(ShaderPost), + "shader_program": NamespacedResourceDirective(ShaderProgram), + "fragment_shader": NamespacedResourceDirective(FragmentShader), + "vertex_shader": NamespacedResourceDirective(VertexShader), + "text": NamespacedResourceDirective(Text), + "texture_mcmeta": NamespacedResourceDirective(TextureMcmeta), + "texture": NamespacedResourceDirective(Texture), + + "data_pack": DataPackDirective(), + "resource_pack": ResourcePackDirective(), + # fmt: on + } diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py new file mode 100644 index 000000000..ec409b7e7 --- /dev/null +++ b/packages/lectern/lectern/document.py @@ -0,0 +1,88 @@ +__all__ = [ + "Document", +] + + +from dataclasses import InitVar, dataclass, field +from pathlib import Path +from typing import MutableMapping, Optional + +from beet import Context, DataPack, ResourcePack +from beet.core.utils import FileSystemPath, extra_field + +from .directive import Directive, get_builtin_directives +from .extract import MarkdownExtractor, TextExtractor +from .serialize import MarkdownSerializer, TextSerializer + + +@dataclass +class Document: + """Class representing a lectern document.""" + + ctx: InitVar[Optional[Context]] = None + + assets: ResourcePack = field(default_factory=ResourcePack) + data: DataPack = field(default_factory=DataPack) + + directives: MutableMapping[str, Directive] = extra_field( + default_factory=get_builtin_directives + ) + + text_extractor: TextExtractor = extra_field(default_factory=TextExtractor) + markdown_extractor: MarkdownExtractor = extra_field( + default_factory=MarkdownExtractor + ) + + text_serializer: TextSerializer = extra_field(default_factory=TextSerializer) + markdown_serializer: MarkdownSerializer = extra_field( + default_factory=MarkdownSerializer + ) + + def __post_init__(self, ctx: Optional[Context]): + if ctx: + self.assets = ctx.assets + self.data = ctx.data + + def add_text(self, source: str): + """Extract pack fragments from plain text.""" + assets, data = self.text_extractor.extract(source, self.directives) + + self.assets.merge(assets) + self.data.merge(data) + + def add_markdown(self, source: str, files: Optional[FileSystemPath] = None): + """Extract pack fragments from markdown.""" + assets, data = self.markdown_extractor.extract(source, self.directives, files) + + self.assets.merge(assets) + self.data.merge(data) + + def serialize(self, as_text: bool = False) -> str: + """Serialize the inner data pack and the resource pack.""" + return ( + self.text_serializer.serialize(self.assets, self.data) + if as_text + else self.markdown_serializer.serialize_and_emit_files( + self.assets, self.data + )[0] + ) + + def save(self, path: FileSystemPath, files: Optional[FileSystemPath] = None): + """Save the serialized document at the specified location.""" + path = Path(path).resolve() + + if path.suffix == ".md": + data, emit = self.markdown_serializer.serialize_and_emit_files( + self.assets, self.data + ) + if files: + files = Path(files).resolve() + files.parent.mkdir(parents=True, exist_ok=True) + for key, value in emit.items(): + value.dump(files, key) + else: + data = self.text_serializer.serialize(self.assets, self.data) + + path.parent.mkdir(parents=True, exist_ok=True) + + path.write_text(data) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py new file mode 100644 index 000000000..fea7d5e75 --- /dev/null +++ b/packages/lectern/lectern/extract.py @@ -0,0 +1,111 @@ +__all__ = [ + "Extractor", + "TextExtractor", + "EmbeddedExtractor", + "MarkdownExtractor", +] + + +import re +from itertools import islice +from typing import Dict, Iterable, Mapping, Optional, Tuple + +from beet import DataPack, ResourcePack +from beet.core.utils import FileSystemPath + +from .directive import Directive +from .fragment import Fragment + + +class Extractor: + """Base class for extractors.""" + + directives: Dict[str, Directive] + regex: Optional["re.Pattern[str]"] + + def __init__(self): + self.directives = {} + self.regex = None + + def generate_regex(self) -> str: + """Return a regex that can match the current directives.""" + names = "|".join(name for name in self.directives) + modifier = r"(?:\((?P[^)]+)\))?" + arguments = r"(?P.*)" + return f"@(?P{names}){modifier}\\b{arguments}" + + def compile_regex(self, regex: str) -> "re.Pattern[str]": + """Return the compiled pattern for the directive regex.""" + return re.compile(f"^{regex}$", flags=re.MULTILINE) + + def get_regex(self, directives: Mapping[str, Directive]) -> "re.Pattern[str]": + """Create and return the regex for the specified directives.""" + directives = dict(directives) + + if self.regex is None or self.directives != directives: + self.directives = directives + self.regex = self.compile_regex(self.generate_regex()) + + return self.regex + + +class TextExtractor(Extractor): + """Extractor for plain text files.""" + + def extract( + self, + source: str, + directives: Mapping[str, Directive], + ) -> Tuple[ResourcePack, DataPack]: + """Turn text into a resource pack and a data pack.""" + assets, data = ResourcePack(), DataPack() + + tokens = self.get_regex(directives).split(source + "\n") + + for directive_name, fragment in self.generate_fragments(tokens): + self.directives[directive_name](fragment, assets, data) + + return assets, data + + def generate_fragments(self, tokens: Iterable[str]): + """Yield pack fragments from a token stream.""" + it = iter(tokens) + next(it) + + while True: + try: + directive, modifier, arguments, content = islice(it, 4) + except ValueError: + return + else: + content = content.partition("\n")[-1] + yield directive, Fragment( + modifier, + arguments.split(), + content[:-1] if content.endswith("\n") else content, + ) + + +class EmbeddedExtractor(TextExtractor): + """Extractor for directives embedded in markdown code blocks.""" + + def generate_regex(self) -> str: + return r"(?://|#)\s*" + super().generate_regex() + + +class MarkdownExtractor(Extractor): + """Extractor for markdown files.""" + + def __init__(self): + super().__init__() + self.embedded_extractor = EmbeddedExtractor() + + def extract( + self, + source: str, + directives: Mapping[str, Directive], + files: Optional[FileSystemPath] = None, + ) -> Tuple[ResourcePack, DataPack]: + """Turn markdown into a resource pack and a data pack.""" + assets, data = ResourcePack(), DataPack() + return assets, data diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py new file mode 100644 index 000000000..bcc8072f9 --- /dev/null +++ b/packages/lectern/lectern/fragment.py @@ -0,0 +1,53 @@ +__all__ = [ + "Fragment", + "InvalidFragment", +] + + +from dataclasses import dataclass +from typing import List, Optional, Tuple, Union, overload + +from beet import FormattedPipelineException + + +class InvalidFragment(FormattedPipelineException): + """Raised when a fragment can not be processed.""" + + def __init__(self, message: str): + super().__init__(message) + self.message = message + + +@dataclass(frozen=True) +class Fragment: + """Class representing a fragment annotated by a directive.""" + + modifier: Optional[str] + arguments: List[str] + content: Union[str, bytes] + + @overload + def expect(self): + ... + + @overload + def expect(self, name1: str) -> str: + ... + + @overload + def expect(self, name1: str, name2: str, *names: str) -> Tuple[str, ...]: + ... + + def expect(self, *names: str): + """Check directive arguments.""" + if missing := names[len(self.arguments) :]: + msg = f"Missing directive argument {', '.join(map(repr, missing))}." + raise InvalidFragment(msg) + if extra := self.arguments[len(names) :]: + msg = f"Unexpected directive argument {', '.join(map(repr, extra))}." + raise InvalidFragment(msg) + if len(self.arguments) == 0: + return + if len(self.arguments) == 1: + return self.arguments[0] + return self.arguments diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py new file mode 100644 index 000000000..641de0fd8 --- /dev/null +++ b/packages/lectern/lectern/plugin.py @@ -0,0 +1,48 @@ +__all__ = [ + "beet_default", + "lectern", +] + + +from typing import Iterable, Optional + +from beet import Context +from beet.toolchain.context import Plugin + +from .document import Document + + +def beet_default(ctx: Context): + config = ctx.meta.get("lectern", {}) + + load = config.get("load", []) + output = config.get("output") + output_files = config.get("output_files") + + ctx.require(lectern(load, output, output_files)) + + +def lectern( + load: Iterable[str] = (), + output: Optional[str] = None, + output_files: Optional[str] = None, +) -> Plugin: + """Return a plugin that handles markdown files with lectern.""" + + def plugin(ctx: Context): + document = ctx.inject(Document) + + for pattern in load: + for filename in ctx.directory.glob(pattern): + path = filename.resolve() + if path.suffix == ".md": + document.add_markdown(path.read_text(), files=path.parent) + else: + document.add_text(path.read_text()) + + yield + + if output: + document.save(ctx.directory / output, output_files) + + return plugin diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py new file mode 100644 index 000000000..ea59ce314 --- /dev/null +++ b/packages/lectern/lectern/serialize.py @@ -0,0 +1,62 @@ +__all__ = [ + "TextSerializer", + "MarkdownSerializer", + "NAMESPACED_RESOURCE_DIRECTIVES", +] + +from itertools import chain +from typing import Any, Dict, Tuple + +from beet import DataPack, File, ResourcePack + +from .directive import NamespacedResourceDirective, get_builtin_directives + +NAMESPACED_RESOURCE_DIRECTIVES = { + directive.file_type: directive_name + for directive_name, directive in get_builtin_directives().items() + if isinstance(directive, NamespacedResourceDirective) +} + + +class TextSerializer: + """Document serializer that outputs plain text.""" + + def serialize(self, assets: ResourcePack, data: DataPack) -> str: + """Return the serialized representation.""" + return "\n".join( + f"@{directive_name} {argument}\n{content}" + for pack, extra_directive in [ + (assets, "resource_pack"), + (data, "data_pack"), + ] + if pack + for directive_name, argument, file_instance in chain( + ( + (extra_directive, path, file_instance) + for path, file_instance in pack.extra.items() + ), + ( + ( + NAMESPACED_RESOURCE_DIRECTIVES[file_type], + f"{name}:{path}", + file_instance, + ) + for name, namespace in pack.items() + for file_type, container in namespace.items() + for path, file_instance in container.items() + ), + ) + if isinstance(content := file_instance.ensure_serialized(), str) + ) + + +class MarkdownSerializer: + """Document serializer that outputs markdown and emits associated files.""" + + def serialize_and_emit_files( + self, + assets: ResourcePack, + data: DataPack, + ) -> Tuple[str, Dict[str, File[Any, Any]]]: + """Return the serialized representation and the files emitted in the process.""" + return "", {} diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json new file mode 100644 index 000000000..566af7616 --- /dev/null +++ b/packages/lectern/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "lectern", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "pyright": "^1.1.112" + } + }, + "node_modules/pyright": { + "version": "1.1.112", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.112.tgz", + "integrity": "sha512-/pwzJWmGo3s7gETYq9CUcPP5F4ZxFBe9u8sQpEJDHD//YFi97EQjhBkOT4M6sNEKpG8u/nyoVRK9ZlGFBHZtcQ==", + "dev": true, + "bin": { + "pyright": "index.js", + "pyright-langserver": "langserver.index.js" + }, + "engines": { + "node": ">=12.0.0" + } + } + }, + "dependencies": { + "pyright": { + "version": "1.1.112", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.112.tgz", + "integrity": "sha512-/pwzJWmGo3s7gETYq9CUcPP5F4ZxFBe9u8sQpEJDHD//YFi97EQjhBkOT4M6sNEKpG8u/nyoVRK9ZlGFBHZtcQ==", + "dev": true + } + } +} diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index e78ad9169..68c7204c6 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.8.1" +version = "0.9.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -336,7 +336,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "df7bc708876906e14a0293018ea859e5e7857659d0db819618ab3c78337bc872" +content-hash = "b7a23ca240713533f0e9db636b650a368858743150534915f6f99f892c586b78" [metadata.files] appdirs = [ @@ -352,8 +352,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.8.1-py3-none-any.whl", hash = "sha256:409fa2aa729cd9d2637db298475963929aa73c780792ffa8aa31592e435cea8f"}, - {file = "beet-0.8.1.tar.gz", hash = "sha256:355caeb6aca75b47dbf8246c9d188b9093a7782fe3dc85cad7cad8fd47641dfb"}, + {file = "beet-0.9.1-py3-none-any.whl", hash = "sha256:8021fe54247929de9f7fa98b085f3fa143d68c730bae9f8ea6c46e3607a35bdc"}, + {file = "beet-0.9.1.tar.gz", hash = "sha256:be250eead1f1362065190e2d88040b55ca7ce0c99e76207b5796152efa254d56"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9a62b3d58..74143e278 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -19,12 +19,13 @@ keywords = [ "datapack" ] -include = ["beet/py.typed"] +include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.8.1" +beet = "^0.9.1" markdown-it-py = "^0.6.2" +click = "^7.1.2" [tool.poetry.dev-dependencies] black = "^20.8b1" @@ -32,6 +33,9 @@ rope = "^0.18.0" pytest = "^6.2.2" isort = "^5.7.0" +[tool.poetry.scripts] +lectern = "lectern.cli:main" + [tool.black] target-version = ["py38"] include = '\.pyi?$' From 5745ef3fd98bb9b9c4b896e1501267f25b004351 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 21 Feb 2021 08:58:17 +0100 Subject: [PATCH 0025/1554] fix: change document methods and add tests --- packages/lectern/lectern/document.py | 49 ++++++++++++----- packages/lectern/tests/test_document.py | 72 +++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 packages/lectern/tests/test_document.py diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index ec409b7e7..b52fde9c4 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -5,9 +5,9 @@ from dataclasses import InitVar, dataclass, field from pathlib import Path -from typing import MutableMapping, Optional +from typing import Any, Dict, Literal, MutableMapping, Optional, Tuple, overload -from beet import Context, DataPack, ResourcePack +from beet import Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field from .directive import Directive, get_builtin_directives @@ -20,6 +20,9 @@ class Document: """Class representing a lectern document.""" ctx: InitVar[Optional[Context]] = None + text: InitVar[Optional[str]] = None + markdown: InitVar[Optional[str]] = None + files: InitVar[Optional[FileSystemPath]] = None assets: ResourcePack = field(default_factory=ResourcePack) data: DataPack = field(default_factory=DataPack) @@ -38,34 +41,53 @@ class Document: default_factory=MarkdownSerializer ) - def __post_init__(self, ctx: Optional[Context]): + def __post_init__( + self, + ctx: Optional[Context], + text: Optional[str] = None, + markdown: Optional[str] = None, + files: Optional[FileSystemPath] = None, + ): if ctx: self.assets = ctx.assets self.data = ctx.data + if text: + self.add_text(text) + if markdown: + self.add_markdown(markdown, files) def add_text(self, source: str): """Extract pack fragments from plain text.""" assets, data = self.text_extractor.extract(source, self.directives) - self.assets.merge(assets) self.data.merge(data) def add_markdown(self, source: str, files: Optional[FileSystemPath] = None): """Extract pack fragments from markdown.""" assets, data = self.markdown_extractor.extract(source, self.directives, files) - self.assets.merge(assets) self.data.merge(data) - def serialize(self, as_text: bool = False) -> str: - """Serialize the inner data pack and the resource pack.""" - return ( - self.text_serializer.serialize(self.assets, self.data) - if as_text - else self.markdown_serializer.serialize_and_emit_files( - self.assets, self.data - )[0] + def get_text(self) -> str: + """Turn the data pack and the resource pack into text.""" + return self.text_serializer.serialize(self.assets, self.data) + + @overload + def get_markdown( + self, emit_files: Literal[True] + ) -> Tuple[str, Dict[str, File[Any, Any]]]: + ... + + @overload + def get_markdown(self, emit_files: Literal[False] = False) -> str: + ... + + def get_markdown(self, emit_files: bool = False): + """Turn the data pack and the resource pack into markdown.""" + data, files = self.markdown_serializer.serialize_and_emit_files( + self.assets, self.data ) + return (data, files) if emit_files else data def save(self, path: FileSystemPath, files: Optional[FileSystemPath] = None): """Save the serialized document at the specified location.""" @@ -84,5 +106,4 @@ def save(self, path: FileSystemPath, files: Optional[FileSystemPath] = None): data = self.text_serializer.serialize(self.assets, self.data) path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(data) diff --git a/packages/lectern/tests/test_document.py b/packages/lectern/tests/test_document.py new file mode 100644 index 000000000..16ced992b --- /dev/null +++ b/packages/lectern/tests/test_document.py @@ -0,0 +1,72 @@ +import pytest +from beet import DataPack, Function, ResourcePack + +from lectern import Document, InvalidFragment + + +def test_empty(): + assert Document() == Document() + assert Document().data == DataPack() + assert Document().assets == ResourcePack() + assert Document().get_text() == "" + assert Document().get_markdown() == "" + assert Document().get_markdown(emit_files=True) == ("", {}) + + +def test_data_pack(): + pack = DataPack() + doc = Document(data=pack) + assert doc.data is pack + + +def test_resource_pack(): + pack = ResourcePack() + doc = Document(assets=pack) + assert doc.assets is pack + + +def test_text_basic(): + source = "@function demo:foo\nsay hello\n" + assert source in Document(text=source).get_text() + + +def test_text_function(): + pack = DataPack() + pack["demo:foo"] = Function(["say foo"]) + + doc = Document(data=pack) + doc.add_text("@function demo:bar\nsay bar\n") + + assert pack.functions == { + "demo:foo": Function(["say foo"]), + "demo:bar": Function(["say bar"]), + } + + +def test_text_tricky(): + doc = Document( + text="some preamble\n\n" + "@function demo:foo\n" + "say foo\n" + "@other_thing hello world\n" + "say after\n" + " @function not taken into account\n" + "say next\n" + "@function demo:bar\n" + "say bar\n" + ) + assert len(doc.data.functions) == 2 + + +def test_missing_argument(): + with pytest.raises( + InvalidFragment, match="Missing directive argument 'full_name'." + ): + Document(text="@function\nsay hello") + + +def test_extra_argument(): + with pytest.raises( + InvalidFragment, match="Unexpected directive argument 'banana'." + ): + Document(text="@function demo:foo banana\nsay hello") From b22f7bebf0b5aafb3c18dfdb8087758a048074cf Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 21 Feb 2021 08:58:42 +0100 Subject: [PATCH 0026/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 68c7204c6..6c4478914 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.9.1" +version = "0.9.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -336,7 +336,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b7a23ca240713533f0e9db636b650a368858743150534915f6f99f892c586b78" +content-hash = "5e5a24ef55e8110dbc50986889c1230ae7c75359f5c3f975b0ceb5f108a94007" [metadata.files] appdirs = [ @@ -352,8 +352,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.9.1-py3-none-any.whl", hash = "sha256:8021fe54247929de9f7fa98b085f3fa143d68c730bae9f8ea6c46e3607a35bdc"}, - {file = "beet-0.9.1.tar.gz", hash = "sha256:be250eead1f1362065190e2d88040b55ca7ce0c99e76207b5796152efa254d56"}, + {file = "beet-0.9.2-py3-none-any.whl", hash = "sha256:bff0fdcda13d7c4cea1288d9dd35201f8426f0815da9e3e5364aa33ed9e0e4ae"}, + {file = "beet-0.9.2.tar.gz", hash = "sha256:ee2b241eb5c1069a0ca5245ffcfb02e998844cef40b2f4b17de8af69738cd728"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 74143e278..12dd73825 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -23,7 +23,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.9.1" +beet = "^0.9.2" markdown-it-py = "^0.6.2" click = "^7.1.2" From 714db422a40f64b7b81c009520e05b59ad302e75 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 02:14:58 +0100 Subject: [PATCH 0027/1554] chore: add ci --- packages/lectern/.github/FUNDING.yml | 2 + packages/lectern/.github/workflows/main.yml | 54 ++ packages/lectern/poetry.lock | 575 +++++++++++++++++++- packages/lectern/pyproject.toml | 8 + 4 files changed, 638 insertions(+), 1 deletion(-) create mode 100644 packages/lectern/.github/FUNDING.yml create mode 100644 packages/lectern/.github/workflows/main.yml diff --git a/packages/lectern/.github/FUNDING.yml b/packages/lectern/.github/FUNDING.yml new file mode 100644 index 000000000..2815213d2 --- /dev/null +++ b/packages/lectern/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: + - vberlier diff --git a/packages/lectern/.github/workflows/main.yml b/packages/lectern/.github/workflows/main.yml new file mode 100644 index 000000000..d31bace35 --- /dev/null +++ b/packages/lectern/.github/workflows/main.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + main: + name: Test and release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Python 3.9 + uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install Poetry + uses: snok/install-poetry@v1.1.1 + with: + virtualenvs-in-project: true + - name: Install Pyright + run: npm install + - name: Setup cache + id: cached-poetry-dependencies + uses: actions/cache@v2 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install + - name: Run tests + run: poetry run pytest -v + - name: Run type-checking + run: npm run check + - name: Check formatting + run: poetry run black --check lectern tests + - name: Release + if: | + github.repository == 'vberlier/lectern' + && github.event_name == 'push' + && github.ref == 'refs/heads/main' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + git config --global user.name "github-actions" + git config --global user.email "action@github.com" + poetry run semantic-release publish -v DEBUG -D commit_author="github-actions " diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 6c4478914..1503a614d 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -68,6 +68,46 @@ typing-extensions = ">=3.7.4" colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +[[package]] +name = "bleach" +version = "3.3.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.14.5" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + [[package]] name = "click" version = "7.1.2" @@ -90,6 +130,17 @@ click = ">=7.0,<9" [package.extras] dev = ["pytest"] +[[package]] +name = "click-log" +version = "0.3.2" +description = "Logging integration for Click" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = "*" + [[package]] name = "colorama" version = "0.4.4" @@ -98,6 +149,74 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "cryptography" +version = "3.4.6" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "docutils" +version = "0.16" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "dotty-dict" +version = "1.3.0" +description = "Dictionary wrapper for quick access to deeply nested keys." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +setuptools_scm = "*" + +[[package]] +name = "gitdb" +version = "4.0.5" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +smmap = ">=3.0.1,<4" + +[[package]] +name = "gitpython" +version = "3.1.13" +description = "Python Git Library" +category = "dev" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "iniconfig" version = "1.1.1" @@ -106,6 +225,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "invoke" +version = "1.5.0" +description = "Pythonic task execution" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "isort" version = "5.7.0" @@ -119,6 +246,17 @@ pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +[[package]] +name = "jeepney" +version = "0.6.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] + [[package]] name = "jinja2" version = "2.11.3" @@ -133,6 +271,23 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +name = "keyring" +version = "22.0.1" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] + [[package]] name = "markdown-it-py" version = "0.6.2" @@ -229,6 +384,17 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "pkginfo" +version = "1.7.0" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +testing = ["nose", "coverage"] + [[package]] name = "pluggy" version = "0.13.1" @@ -248,6 +414,14 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pydantic" version = "1.7.3" @@ -261,6 +435,14 @@ dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] typing_extensions = ["typing-extensions (>=3.7.2)"] +[[package]] +name = "pygments" +version = "2.8.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.5" + [[package]] name = "pyparsing" version = "2.4.7" @@ -290,6 +472,68 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +name = "python-gitlab" +version = "1.15.0" +description = "Interact with GitLab API" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.4.2" +six = "*" + +[[package]] +name = "python-semantic-release" +version = "7.15.0" +description = "Automatic Semantic Versioning for Python projects" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7,<8" +click-log = ">=0.3,<1" +dotty-dict = ">=1.3.0,<2" +gitpython = ">=3.0.8,<4" +invoke = ">=1.4.1,<2" +python-gitlab = ">=1.10,<2" +requests = ">=2.25,<3" +semver = ">=2.10,<3" +tomlkit = ">=0.7.0,<1.0.0" +twine = ">=3,<4" + +[package.extras] +dev = ["mypy", "tox", "isort", "black"] +docs = ["Sphinx (==1.3.6)"] +test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.5.0)", "mock (==1.3.0)"] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "readme-renderer" +version = "28.0" +description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +bleach = ">=2.1.0" +docutils = ">=0.13.1" +Pygments = ">=2.5.1" +six = "*" + +[package.extras] +md = ["cmarkgfm (>=0.2.0)"] + [[package]] name = "regex" version = "2020.11.13" @@ -298,6 +542,46 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "requests" +version = "2.25.1" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<5" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rfc3986" +version = "1.4.0" +description = "Validating URI References per RFC 3986" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +idna2008 = ["idna"] + [[package]] name = "rope" version = "0.18.0" @@ -309,6 +593,53 @@ python-versions = "*" [package.extras] dev = ["pytest"] +[[package]] +name = "secretstorage" +version = "3.3.1" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "semver" +version = "2.13.0" +description = "Python helper for Semantic Versioning (http://semver.org/)" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "setuptools-scm" +version = "5.0.1" +description = "the blessed package to manage your versions by scm tags" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.extras] +toml = ["toml"] + +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "3.0.5" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "toml" version = "0.10.2" @@ -317,6 +648,44 @@ category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "tomlkit" +version = "0.7.0" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "tqdm" +version = "4.57.0" +description = "Fast, Extensible Progress Meter" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +telegram = ["requests"] + +[[package]] +name = "twine" +version = "3.3.0" +description = "Collection of utilities for publishing packages on PyPI" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = ">=0.4.3" +keyring = ">=15.1" +pkginfo = ">=1.4.2" +readme-renderer = ">=21.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +tqdm = ">=4.14" + [[package]] name = "typed-ast" version = "1.4.2" @@ -333,10 +702,31 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "urllib3" +version = "1.26.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "5e5a24ef55e8110dbc50986889c1230ae7c75359f5c3f975b0ceb5f108a94007" +content-hash = "70cba7808f9fe814921238ea23c6bd45ce2cdceec07806c723a2509d5406d42f" [metadata.files] appdirs = [ @@ -358,6 +748,57 @@ beet = [ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] +bleach = [ + {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, + {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, +] +certifi = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] +cffi = [ + {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, + {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, + {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, + {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, + {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, + {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, + {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, + {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, + {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, + {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, + {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, + {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, + {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, + {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, + {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, @@ -366,22 +807,68 @@ click-help-colors = [ {file = "click-help-colors-0.9.tar.gz", hash = "sha256:eb037a2dd95a9e20b3897c2b3ca57e7f6797f76a8d93f7eeedda7fcdcbc9b635"}, {file = "click_help_colors-0.9-py3-none-any.whl", hash = "sha256:f6c3d1fe86b07790e6ef0339f458196a8814de90946d876774ea4b4f30a5a539"}, ] +click-log = [ + {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, + {file = "click_log-0.3.2-py2.py3-none-any.whl", hash = "sha256:eee14dc37cdf3072158570f00406572f9e03e414accdccfccd4c538df9ae322c"}, +] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] +cryptography = [ + {file = "cryptography-3.4.6-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:57ad77d32917bc55299b16d3b996ffa42a1c73c6cfa829b14043c561288d2799"}, + {file = "cryptography-3.4.6-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:4169a27b818de4a1860720108b55a2801f32b6ae79e7f99c00d79f2a2822eeb7"}, + {file = "cryptography-3.4.6-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:93cfe5b7ff006de13e1e89830810ecbd014791b042cbe5eec253be11ac2b28f3"}, + {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:5ecf2bcb34d17415e89b546dbb44e73080f747e504273e4d4987630493cded1b"}, + {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"}, + {file = "cryptography-3.4.6-cp36-abi3-win32.whl", hash = "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2"}, + {file = "cryptography-3.4.6-cp36-abi3-win_amd64.whl", hash = "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0"}, + {file = "cryptography-3.4.6.tar.gz", hash = "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87"}, +] +docutils = [ + {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, + {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, +] +dotty-dict = [ + {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, +] +gitdb = [ + {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, + {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, +] +gitpython = [ + {file = "GitPython-3.1.13-py3-none-any.whl", hash = "sha256:c5347c81d232d9b8e7f47b68a83e5dc92e7952127133c5f2df9133f2c75a1b29"}, + {file = "GitPython-3.1.13.tar.gz", hash = "sha256:8621a7e777e276a5ec838b59280ba5272dd144a18169c36c903d8b38b99f750a"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] +invoke = [ + {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, + {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, + {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, +] isort = [ {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, ] +jeepney = [ + {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, + {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, +] jinja2 = [ {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, ] +keyring = [ + {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, + {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, +] markdown-it-py = [ {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, {file = "markdown_it_py-0.6.2-py3-none-any.whl", hash = "sha256:30b3e9f8198dc82a5df0dcb73fd31d56cd9a43bf8a747feb10b2ba74f962bcb1"}, @@ -501,6 +988,10 @@ pillow = [ {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, ] +pkginfo = [ + {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, + {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, +] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, @@ -509,6 +1000,10 @@ py = [ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] pydantic = [ {file = "pydantic-1.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd"}, {file = "pydantic-1.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009"}, @@ -533,6 +1028,10 @@ pydantic = [ {file = "pydantic-1.7.3-py3-none-any.whl", hash = "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229"}, {file = "pydantic-1.7.3.tar.gz", hash = "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9"}, ] +pygments = [ + {file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, + {file = "Pygments-2.8.0.tar.gz", hash = "sha256:37a13ba168a02ac54cc5891a42b1caec333e59b66addb7fa633ea8a6d73445c0"}, +] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -541,6 +1040,22 @@ pytest = [ {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, ] +python-gitlab = [ + {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, + {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, +] +python-semantic-release = [ + {file = "python-semantic-release-7.15.0.tar.gz", hash = "sha256:a0ffd462bd42c5e0c41363b3c66c707ef4ad181bebc2f81145debbce9438e713"}, + {file = "python_semantic_release-7.15.0-py3-none-any.whl", hash = "sha256:04835c4e32db24387bcab3aac0a11892b274f00206e360abfa4d8152b082d0f1"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +readme-renderer = [ + {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, + {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, +] regex = [ {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, @@ -584,13 +1099,63 @@ regex = [ {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, ] +requests = [ + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +rfc3986 = [ + {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, + {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, +] rope = [ {file = "rope-0.18.0.tar.gz", hash = "sha256:786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04"}, ] +secretstorage = [ + {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, + {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, +] +semver = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] +setuptools-scm = [ + {file = "setuptools_scm-5.0.1-py2.7.egg", hash = "sha256:db4ab2e0c2644ba71b1e5212b14ff65dbf0af465796d314a75e0cf6128f605f7"}, + {file = "setuptools_scm-5.0.1-py2.py3-none-any.whl", hash = "sha256:62fa535edb31ece9fa65dc9dcb3056145b8020c8c26c0ef1018aef33db95c40d"}, + {file = "setuptools_scm-5.0.1-py3.5.egg", hash = "sha256:1fc4e25df445351d172bb4788f4d07f9e9ce0e8b7dee6b19584e46110172ca13"}, + {file = "setuptools_scm-5.0.1-py3.6.egg", hash = "sha256:e878036c2527dfd05818727846338be86b2be6955741b85fab2625f63d001021"}, + {file = "setuptools_scm-5.0.1-py3.7.egg", hash = "sha256:eb19b46816fc106a4c2d4180022687eab40f9773cf61390b845afb093d1f4ecd"}, + {file = "setuptools_scm-5.0.1-py3.8.egg", hash = "sha256:48b31488d089270500f120efea723968c01abd85fd4876043a3b7c7ef7d0b761"}, + {file = "setuptools_scm-5.0.1-py3.9.egg", hash = "sha256:b928021c4381f96d577847d540d6e03065f8f8851c768a0c9bc552d463bae0d4"}, + {file = "setuptools_scm-5.0.1.tar.gz", hash = "sha256:c85b6b46d0edd40d2301038cdea96bb6adc14d62ef943e75afb08b3e7bcf142a"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +smmap = [ + {file = "smmap-3.0.5-py2.py3-none-any.whl", hash = "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714"}, + {file = "smmap-3.0.5.tar.gz", hash = "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +tomlkit = [ + {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, + {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, +] +tqdm = [ + {file = "tqdm-4.57.0-py2.py3-none-any.whl", hash = "sha256:70657337ec104eb4f3fb229285358f23f045433f6aea26846cdd55f0fd68945c"}, + {file = "tqdm-4.57.0.tar.gz", hash = "sha256:65185676e9fdf20d154cffd1c5de8e39ef9696ff7e59fe0156b1b08e468736af"}, +] +twine = [ + {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, + {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, +] typed-ast = [ {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, @@ -628,3 +1193,11 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] +urllib3 = [ + {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, + {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 12dd73825..0cf7b336a 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -32,6 +32,7 @@ black = "^20.8b1" rope = "^0.18.0" pytest = "^6.2.2" isort = "^5.7.0" +python-semantic-release = "^7.15.0" [tool.poetry.scripts] lectern = "lectern.cli:main" @@ -58,6 +59,13 @@ exclude = ''' [tool.isort] profile = "black" +[tool.semantic_release] +branch = "main" +version_variable = ["lectern/__init__.py:__version__"] +version_toml = "pyproject.toml:tool.poetry.version" +major_on_zero = false +build_command = "poetry build" + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" From 588d6c8e2d48187d93a1cf4ef7ed7174ad0f9742 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Feb 2021 01:16:07 +0000 Subject: [PATCH 0028/1554] 0.1.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 10 ++++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 packages/lectern/CHANGELOG.md diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md new file mode 100644 index 000000000..a5f594748 --- /dev/null +++ b/packages/lectern/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + + + +## v0.1.0 (2021-02-22) +### Feature +* Plain text extraction and serialization ([`49e8996`](https://github.com/vberlier/lectern/commit/49e8996d3398a8683ea91de3df062e47707574c8)) + +### Fix +* Change document methods and add tests ([`8879b90`](https://github.com/vberlier/lectern/commit/8879b909c00fa5299793ce90db8c1ee81d2af085)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 9a4cefc54..38217ddf3 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.0.0" +__version__ = "0.1.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 0cf7b336a..077dac8d3 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.0.0" +version = "0.1.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 407c7e1b18d0a5e2abbfaee74ee7809de0c44780 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 02:29:01 +0100 Subject: [PATCH 0029/1554] fix: rename operators to modifiers --- packages/lectern/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 7c801713d..10bd390e0 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -214,7 +214,7 @@ TODO TODO -## Operators +## Modifiers TODO From 14cae1c0a19a8a72186cde82b075d2d4ea35985e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 02:51:55 +0100 Subject: [PATCH 0030/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 1503a614d..08c367aa1 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.9.2" +version = "0.9.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -726,7 +726,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "70cba7808f9fe814921238ea23c6bd45ce2cdceec07806c723a2509d5406d42f" +content-hash = "81364d31047d6523867d6a09b6ed817bf8d15ec86f78fc13dea9e4cbdd5d77dc" [metadata.files] appdirs = [ @@ -742,8 +742,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.9.2-py3-none-any.whl", hash = "sha256:bff0fdcda13d7c4cea1288d9dd35201f8426f0815da9e3e5364aa33ed9e0e4ae"}, - {file = "beet-0.9.2.tar.gz", hash = "sha256:ee2b241eb5c1069a0ca5245ffcfb02e998844cef40b2f4b17de8af69738cd728"}, + {file = "beet-0.9.3-py3-none-any.whl", hash = "sha256:16bd67714d7c04ae27690e651db9344e8bae31bb2b6bb6f77b6dacc2160cd751"}, + {file = "beet-0.9.3.tar.gz", hash = "sha256:b8f85c6b84f1f194fac6e9acf7fe4d2d8182bfa523fb8930bf8d6873b735a3ff"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 077dac8d3..f7e96f075 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -23,7 +23,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.9.2" +beet = "^0.9.3" markdown-it-py = "^0.6.2" click = "^7.1.2" From 169bdc129f43db3d11a474e8249b0572ee0803e6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 04:52:16 +0100 Subject: [PATCH 0031/1554] fix: add newline between loot table and advancement in README --- packages/lectern/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 10bd390e0..a80557b06 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -181,6 +181,7 @@ Embedded directives are striped from the output. You can use multiple directives } ] } + // @advancement tutorial:obtained_dead_bush { "criteria": { From 57cb8f599b436f7c701f35b17f3c6bf7fba10096 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Feb 2021 04:43:41 +0000 Subject: [PATCH 0032/1554] chore(deps-dev): bump pyright from 1.1.112 to 1.1.113 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.112 to 1.1.113. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.113/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 6b35b07a4..7f268e6dc 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.112", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.112.tgz", - "integrity": "sha512-/pwzJWmGo3s7gETYq9CUcPP5F4ZxFBe9u8sQpEJDHD//YFi97EQjhBkOT4M6sNEKpG8u/nyoVRK9ZlGFBHZtcQ==", + "version": "1.1.113", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.113.tgz", + "integrity": "sha512-VcitW5t5lG1KY0w8xY/ubMhFZZ2lfXJvhBW4TfTwy067R4WtXKSa23br4to1pdRA1rwpxOREgxVTnOWmf3YkYg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 822611b34..0164a75b8 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.112" + "pyright": "^1.1.113" } } From e41ce05d46316aed08f48ff68ddda11b6f926fc6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Feb 2021 04:46:26 +0000 Subject: [PATCH 0033/1554] chore(deps): bump beet from 0.8.1 to 0.9.3 Bumps [beet](https://github.com/vberlier/beet) from 0.8.1 to 0.9.3. - [Release notes](https://github.com/vberlier/beet/releases) - [Changelog](https://github.com/vberlier/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/vberlier/beet/compare/v0.8.1...v0.9.3) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 84db2df7f..4b36e5629 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.8.1" +version = "0.9.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "ebdebf4f7a6093c552db077e14833bbc629d5f193bbb9526158c826d4e16aa9a" +content-hash = "e72a06b19de77323537db9155a19cfdfb1912d1c498a0c7bce12746584565cc6" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.8.1-py3-none-any.whl", hash = "sha256:409fa2aa729cd9d2637db298475963929aa73c780792ffa8aa31592e435cea8f"}, - {file = "beet-0.8.1.tar.gz", hash = "sha256:355caeb6aca75b47dbf8246c9d188b9093a7782fe3dc85cad7cad8fd47641dfb"}, + {file = "beet-0.9.3-py3-none-any.whl", hash = "sha256:16bd67714d7c04ae27690e651db9344e8bae31bb2b6bb6f77b6dacc2160cd751"}, + {file = "beet-0.9.3.tar.gz", hash = "sha256:b8f85c6b84f1f194fac6e9acf7fe4d2d8182bfa523fb8930bf8d6873b735a3ff"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 47785634f..82a122fef 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.9.0" +beet = ">=0.5.1,<0.10.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From ed218cf2bdd8ef41151e0ddcfec7a8f5e61736ef Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 06:57:36 +0100 Subject: [PATCH 0034/1554] feat: add load method --- packages/lectern/lectern/document.py | 12 ++++++++++++ packages/lectern/lectern/plugin.py | 8 ++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index b52fde9c4..b9d75dd67 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -20,6 +20,7 @@ class Document: """Class representing a lectern document.""" ctx: InitVar[Optional[Context]] = None + path: InitVar[Optional[FileSystemPath]] = None text: InitVar[Optional[str]] = None markdown: InitVar[Optional[str]] = None files: InitVar[Optional[FileSystemPath]] = None @@ -44,6 +45,7 @@ class Document: def __post_init__( self, ctx: Optional[Context], + path: Optional[FileSystemPath] = None, text: Optional[str] = None, markdown: Optional[str] = None, files: Optional[FileSystemPath] = None, @@ -51,11 +53,21 @@ def __post_init__( if ctx: self.assets = ctx.assets self.data = ctx.data + if path: + self.load(path) if text: self.add_text(text) if markdown: self.add_markdown(markdown, files) + def load(self, path: FileSystemPath): + """Load and extract fragments from the file at the specified location.""" + path = Path(path).resolve() + if path.suffix == ".md": + self.add_markdown(path.read_text(), files=path.parent) + else: + self.add_text(path.read_text()) + def add_text(self, source: str): """Extract pack fragments from plain text.""" assets, data = self.text_extractor.extract(source, self.directives) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 641de0fd8..3af7843b6 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -33,12 +33,8 @@ def plugin(ctx: Context): document = ctx.inject(Document) for pattern in load: - for filename in ctx.directory.glob(pattern): - path = filename.resolve() - if path.suffix == ".md": - document.add_markdown(path.read_text(), files=path.parent) - else: - document.add_text(path.read_text()) + for path in ctx.directory.glob(pattern): + document.load(path) yield From aad11ee2bac27409f713b428fe81e7b515fb2b3b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 07:00:59 +0100 Subject: [PATCH 0035/1554] test: initialize empty with text and markdown --- packages/lectern/tests/test_document.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/lectern/tests/test_document.py b/packages/lectern/tests/test_document.py index 16ced992b..b35ecd8e2 100644 --- a/packages/lectern/tests/test_document.py +++ b/packages/lectern/tests/test_document.py @@ -11,6 +11,8 @@ def test_empty(): assert Document().get_text() == "" assert Document().get_markdown() == "" assert Document().get_markdown(emit_files=True) == ("", {}) + assert Document(text="Nothing to see here") == Document() + assert Document(markdown="Nothing to see here") == Document() def test_data_pack(): From d89141a25be435edf6276f3c185fa323eadd540e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 07:21:15 +0100 Subject: [PATCH 0036/1554] feat: add snapshot testing --- packages/lectern/README.md | 9 ++++++ packages/lectern/examples/basic1.pack.txt | 8 +++++ packages/lectern/examples/basic2.pack.txt | 19 ++++++++++++ packages/lectern/examples/basic3.pack.txt | 12 ++++++++ packages/lectern/lectern/pytest_plugin.py | 27 +++++++++++++++++ packages/lectern/poetry.lock | 29 ++++++++++++++++++- packages/lectern/pyproject.toml | 6 ++++ .../examples__load_path0__basic1.pack.txt | 13 +++++++++ .../examples__load_path1__basic2.pack.txt | 21 ++++++++++++++ .../examples__load_path2__basic3.pack.txt | 13 +++++++++ packages/lectern/tests/test_examples.py | 19 ++++++++++++ 11 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 packages/lectern/examples/basic1.pack.txt create mode 100644 packages/lectern/examples/basic2.pack.txt create mode 100644 packages/lectern/examples/basic3.pack.txt create mode 100644 packages/lectern/lectern/pytest_plugin.py create mode 100644 packages/lectern/tests/snapshots/examples__load_path0__basic1.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__load_path1__basic2.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__load_path2__basic3.pack.txt create mode 100644 packages/lectern/tests/test_examples.py diff --git a/packages/lectern/README.md b/packages/lectern/README.md index a80557b06..68a4fbf02 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -26,6 +26,7 @@ This markdown file is interspersed with code fragments describing the content of - Convert data packs and resource packs into markdown snapshots - Can be used as a [`beet`](https://github.com/vberlier/beet) plugin - Highly extensible with custom directives +- Automatically integrates with [`pytest-insta`](https://github.com/vberlier/pytest-insta) **Hmmkay but why?** @@ -263,6 +264,14 @@ $ lectern demo_data_pack demo.md -o . TODO +## Plain text documents + +TODO + +## Lectern for snapshot testing + +TODO + ## Contributing Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses [`poetry`](https://python-poetry.org). diff --git a/packages/lectern/examples/basic1.pack.txt b/packages/lectern/examples/basic1.pack.txt new file mode 100644 index 000000000..97de9e635 --- /dev/null +++ b/packages/lectern/examples/basic1.pack.txt @@ -0,0 +1,8 @@ +This is ignored. Anything that appears before the first directive is not taken into +account by the extractor. + +@function demo:foo +say foo + +@function demo:bar +say bar diff --git a/packages/lectern/examples/basic2.pack.txt b/packages/lectern/examples/basic2.pack.txt new file mode 100644 index 000000000..7d0779755 --- /dev/null +++ b/packages/lectern/examples/basic2.pack.txt @@ -0,0 +1,19 @@ +Directives are resolved ahead-of-time so the content of each file is free to contain +lines beginning with @ as long as the following characters don't match the name of +a registered directive. Directives can't be indented. + +In the following document only two functions are actually defined. + +@function demo:foo +say foo +@functionn demo:foo +say still in the same function +@@@@ +@ @ @ + +@function demo:bar +say bar + @function demo:bar + say hello + @function demo:bar + say world diff --git a/packages/lectern/examples/basic3.pack.txt b/packages/lectern/examples/basic3.pack.txt new file mode 100644 index 000000000..259f9366e --- /dev/null +++ b/packages/lectern/examples/basic3.pack.txt @@ -0,0 +1,12 @@ +Directives are applied to to a blank data pack and a blank resource pack +in the order the appear in the document. This means that redefinitions will +overwrite previous directives. + +@function demo:foo +say foo + +@function demo:bar +say bar + +@function demo:foo +say overwrite diff --git a/packages/lectern/lectern/pytest_plugin.py b/packages/lectern/lectern/pytest_plugin.py new file mode 100644 index 000000000..2d259c61a --- /dev/null +++ b/packages/lectern/lectern/pytest_plugin.py @@ -0,0 +1,27 @@ +try: + from pytest_insta import Fmt +except ImportError: + pass +else: + from pathlib import Path + + from lectern import Document + + class FmtPackText(Fmt[Document]): + extension = ".pack.txt" + + def load(self, path: Path) -> Document: + return Document(path=path) + + def dump(self, path: Path, value: Document): + value.save(path) + + class FmtPackMarkdown(Fmt[Document]): + extension = ".pack.md" + + def load(self, path: Path) -> Document: + return Document(path=path / "README.md") + + def dump(self, path: Path, value: Document): + path.mkdir(exist_ok=True) + value.save(path / "README.md", files=path) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 08c367aa1..73bd4ab8c 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -472,6 +472,18 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +name = "pytest-insta" +version = "0.1.5" +description = "A practical snapshot testing plugin for pytest" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +pytest = ">=6.0.2,<7.0.0" +wrapt = ">=1.12.1,<2.0.0" + [[package]] name = "python-gitlab" version = "1.15.0" @@ -723,10 +735,18 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "wrapt" +version = "1.12.1" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "*" + [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "81364d31047d6523867d6a09b6ed817bf8d15ec86f78fc13dea9e4cbdd5d77dc" +content-hash = "0f0247dc786a688b5b57c48a4c68ab35b011b4fefcd29bdf085e9bb000ebb82b" [metadata.files] appdirs = [ @@ -1040,6 +1060,10 @@ pytest = [ {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, ] +pytest-insta = [ + {file = "pytest-insta-0.1.5.tar.gz", hash = "sha256:eef19de353aed704754a34feed286b711e6cdc24f258be017aed09840da59a09"}, + {file = "pytest_insta-0.1.5-py3-none-any.whl", hash = "sha256:4f49f6c49a1e14780df6505aab31fd3f13df0ae8cb6b4e35545d02d4b267904f"}, +] python-gitlab = [ {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, @@ -1201,3 +1225,6 @@ webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +wrapt = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index f7e96f075..b99419706 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -19,6 +19,8 @@ keywords = [ "datapack" ] +classifiers = ["Framework :: Pytest"] + include = ["lectern/py.typed"] [tool.poetry.dependencies] @@ -33,10 +35,14 @@ rope = "^0.18.0" pytest = "^6.2.2" isort = "^5.7.0" python-semantic-release = "^7.15.0" +pytest-insta = "^0.1.5" [tool.poetry.scripts] lectern = "lectern.cli:main" +[tool.poetry.plugins.pytest11] +lectern = "lectern.pytest_plugin" + [tool.black] target-version = ["py38"] include = '\.pyi?$' diff --git a/packages/lectern/tests/snapshots/examples__load_path0__basic1.pack.txt b/packages/lectern/tests/snapshots/examples__load_path0__basic1.pack.txt new file mode 100644 index 000000000..a5cf6a2c9 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__load_path0__basic1.pack.txt @@ -0,0 +1,13 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say foo + +@function demo:bar +say bar diff --git a/packages/lectern/tests/snapshots/examples__load_path1__basic2.pack.txt b/packages/lectern/tests/snapshots/examples__load_path1__basic2.pack.txt new file mode 100644 index 000000000..c15cd86ed --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__load_path1__basic2.pack.txt @@ -0,0 +1,21 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say foo +@functionn demo:foo +say still in the same function +@@@@ +@ @ @ + +@function demo:bar +say bar + @function demo:bar + say hello + @function demo:bar + say world diff --git a/packages/lectern/tests/snapshots/examples__load_path2__basic3.pack.txt b/packages/lectern/tests/snapshots/examples__load_path2__basic3.pack.txt new file mode 100644 index 000000000..197353dbf --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__load_path2__basic3.pack.txt @@ -0,0 +1,13 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say overwrite + +@function demo:bar +say bar diff --git a/packages/lectern/tests/test_examples.py b/packages/lectern/tests/test_examples.py new file mode 100644 index 000000000..3cc01932d --- /dev/null +++ b/packages/lectern/tests/test_examples.py @@ -0,0 +1,19 @@ +from pathlib import Path +from typing import Any + +import pytest + +from lectern import Document + +EXAMPLES_DIRECTORY = Path(__file__, "../../examples").resolve() + + +@pytest.mark.parametrize( + "path", + [ + *sorted(EXAMPLES_DIRECTORY.glob("*.pack.txt")), + *sorted(EXAMPLES_DIRECTORY.glob("*.pack.md")), + ], +) +def test_load(snapshot: Any, path: Path): + assert snapshot(path.name) == Document(path=path) From 9878806e4ced469475729c68ad92e4fd0e5109c4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 07:28:13 +0100 Subject: [PATCH 0037/1554] refactor: rename examples --- packages/lectern/examples/{basic1.pack.txt => basic1.txt} | 0 packages/lectern/examples/{basic2.pack.txt => basic2.txt} | 0 packages/lectern/examples/{basic3.pack.txt => basic3.txt} | 0 packages/lectern/tests/test_examples.py | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename packages/lectern/examples/{basic1.pack.txt => basic1.txt} (100%) rename packages/lectern/examples/{basic2.pack.txt => basic2.txt} (100%) rename packages/lectern/examples/{basic3.pack.txt => basic3.txt} (100%) diff --git a/packages/lectern/examples/basic1.pack.txt b/packages/lectern/examples/basic1.txt similarity index 100% rename from packages/lectern/examples/basic1.pack.txt rename to packages/lectern/examples/basic1.txt diff --git a/packages/lectern/examples/basic2.pack.txt b/packages/lectern/examples/basic2.txt similarity index 100% rename from packages/lectern/examples/basic2.pack.txt rename to packages/lectern/examples/basic2.txt diff --git a/packages/lectern/examples/basic3.pack.txt b/packages/lectern/examples/basic3.txt similarity index 100% rename from packages/lectern/examples/basic3.pack.txt rename to packages/lectern/examples/basic3.txt diff --git a/packages/lectern/tests/test_examples.py b/packages/lectern/tests/test_examples.py index 3cc01932d..436e01332 100644 --- a/packages/lectern/tests/test_examples.py +++ b/packages/lectern/tests/test_examples.py @@ -11,9 +11,9 @@ @pytest.mark.parametrize( "path", [ - *sorted(EXAMPLES_DIRECTORY.glob("*.pack.txt")), - *sorted(EXAMPLES_DIRECTORY.glob("*.pack.md")), + *sorted(EXAMPLES_DIRECTORY.glob("*.txt")), + *sorted(EXAMPLES_DIRECTORY.glob("*.md")), ], ) def test_load(snapshot: Any, path: Path): - assert snapshot(path.name) == Document(path=path) + assert snapshot(path.stem + ".pack.txt") == Document(path=path) From 1bdda6f557f73393eda926a581f386ef42b82f68 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 09:33:03 +0100 Subject: [PATCH 0038/1554] fix: don't drop modifier --- packages/lectern/lectern/extract.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index fea7d5e75..ff3fdf192 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -30,9 +30,9 @@ def __init__(self): def generate_regex(self) -> str: """Return a regex that can match the current directives.""" names = "|".join(name for name in self.directives) - modifier = r"(?:\((?P[^)]+)\))?" + modifier = r"(?:\((?P[^)]+)\)|\b)" arguments = r"(?P.*)" - return f"@(?P{names}){modifier}\\b{arguments}" + return f"@(?P{names}){modifier}{arguments}" def compile_regex(self, regex: str) -> "re.Pattern[str]": """Return the compiled pattern for the directive regex.""" From 6c548f024dcb4af30217b825c3d2ba44d5cc80dc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 09:38:06 +0100 Subject: [PATCH 0039/1554] test: directive parsing --- packages/lectern/tests/test_directive.py | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 packages/lectern/tests/test_directive.py diff --git a/packages/lectern/tests/test_directive.py b/packages/lectern/tests/test_directive.py new file mode 100644 index 000000000..5c8b1091d --- /dev/null +++ b/packages/lectern/tests/test_directive.py @@ -0,0 +1,32 @@ +import pytest + +from lectern import TextExtractor +from lectern.directive import Fragment, get_builtin_directives + + +@pytest.mark.parametrize( + "source, directive, fragment", + [ + ( + "@function demo:foo\nsay foo\n", + "function", + Fragment(None, ["demo:foo"], "say foo\n"), + ), + ( + "@function() demo:foo\nsay foo\n", + "function", + Fragment("", ["demo:foo"], "say foo\n"), + ), + ( + "@function(strip_final_newline) demo:foo\nsay foo\n", + "function", + Fragment("strip_final_newline", ["demo:foo"], "say foo\n"), + ), + ], +) +def test_parse(source: str, directive: str, fragment: Fragment): + parsed_directive, parsed_fragment = next( + TextExtractor().parse_fragments(source, get_builtin_directives()) + ) + assert directive == parsed_directive + assert fragment == parsed_fragment From 1f16aa433e5b61b4815ba758674887e157466150 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 09:44:00 +0100 Subject: [PATCH 0040/1554] feat: implement strip_final_newline modifier --- packages/lectern/lectern/directive.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 938a393c1..fb2218347 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -71,7 +71,12 @@ class NamespacedResourceDirective: def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): full_name = fragment.expect("full_name") - file_instance = self.file_type(fragment.content) + content = fragment.content + + if fragment.modifier == "strip_final_newline" and content[-1:] == "\n": + content = content[:-1] + + file_instance = self.file_type(content) if self.file_type in assets.namespace_type.field_map: assets[full_name] = file_instance From 572425f829e3a81a5e0da4743aec561a4971d6d8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 09:44:44 +0100 Subject: [PATCH 0041/1554] fix: allow empty modifier --- packages/lectern/lectern/extract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index ff3fdf192..969060af9 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -30,7 +30,7 @@ def __init__(self): def generate_regex(self) -> str: """Return a regex that can match the current directives.""" names = "|".join(name for name in self.directives) - modifier = r"(?:\((?P[^)]+)\)|\b)" + modifier = r"(?:\((?P[^)]*)\)|\b)" arguments = r"(?P.*)" return f"@(?P{names}){modifier}{arguments}" From 5d95aaf0d6b46c11c67a7850020c58d557ecdcd7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 10:12:19 +0100 Subject: [PATCH 0042/1554] feat: extract and serialize markdown --- packages/lectern/examples/code_fragments.md | 39 ++++++ packages/lectern/examples/combined.md | 59 +++++++++ packages/lectern/examples/compact.txt | 4 + packages/lectern/examples/empty_markdown.md | 4 + packages/lectern/examples/empty_text.txt | 2 + packages/lectern/examples/readme_example.md | 19 +++ .../lectern/examples/strip_final_newline.txt | 7 ++ packages/lectern/lectern/extract.py | 119 +++++++++++++++--- packages/lectern/lectern/serialize.py | 83 +++++++++++- .../README.md | 85 +++++++++++++ .../README.md | 30 +++++ .../README.md | 38 ++++++ .../README.md | 30 +++++ .../README.md | 54 ++++++++ .../README.md | 52 ++++++++ .../README.md | 30 +++++ .../README.md | 3 + .../README.md | 3 + .../README.md | 34 +++++ .../README.md | 36 ++++++ .../examples__text_README_md__0.pack.txt | 57 +++++++++ ...les__text_examples_basic1_txt__0.pack.txt} | 0 ...les__text_examples_basic2_txt__0.pack.txt} | 0 ...les__text_examples_basic3_txt__0.pack.txt} | 0 ...ext_examples_code_fragments_md__0.pack.txt | 25 ++++ ...les__text_examples_combined_md__0.pack.txt | 26 ++++ ...les__text_examples_compact_txt__0.pack.txt | 12 ++ ...ext_examples_empty_markdown_md__0.pack.txt | 0 ...__text_examples_empty_text_txt__0.pack.txt | 0 ...ext_examples_readme_example_md__0.pack.txt | 15 +++ ...amples_strip_final_newline_txt__0.pack.txt | 14 +++ packages/lectern/tests/test_document.py | 5 +- packages/lectern/tests/test_examples.py | 25 ++-- 33 files changed, 880 insertions(+), 30 deletions(-) create mode 100644 packages/lectern/examples/code_fragments.md create mode 100644 packages/lectern/examples/combined.md create mode 100644 packages/lectern/examples/compact.txt create mode 100644 packages/lectern/examples/empty_markdown.md create mode 100644 packages/lectern/examples/empty_text.txt create mode 100644 packages/lectern/examples/readme_example.md create mode 100644 packages/lectern/examples/strip_final_newline.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt rename packages/lectern/tests/snapshots/{examples__load_path0__basic1.pack.txt => examples__text_examples_basic1_txt__0.pack.txt} (100%) rename packages/lectern/tests/snapshots/{examples__load_path1__basic2.pack.txt => examples__text_examples_basic2_txt__0.pack.txt} (100%) rename packages/lectern/tests/snapshots/{examples__load_path2__basic3.pack.txt => examples__text_examples_basic3_txt__0.pack.txt} (100%) create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_empty_markdown_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_empty_text_txt__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt diff --git a/packages/lectern/examples/code_fragments.md b/packages/lectern/examples/code_fragments.md new file mode 100644 index 000000000..1ad2fec5c --- /dev/null +++ b/packages/lectern/examples/code_fragments.md @@ -0,0 +1,39 @@ +# Basic data pack + +## Visible directives + +`@function demo:foo` + +```mcfunction +say foo +``` + +`@function demo:bar` + +```mcfunction +say bar +``` + +## Hidden directives + + + +```mcfunction +say hidden foo +``` + + + +```mcfunction +say hidden bar +``` + +## Embedded directives + +```mcfunction +# @function demo:embedded_foo +say embedded foo + +# @function demo:embedded_bar +say embedded bar +``` diff --git a/packages/lectern/examples/combined.md b/packages/lectern/examples/combined.md new file mode 100644 index 000000000..f78b4a48e --- /dev/null +++ b/packages/lectern/examples/combined.md @@ -0,0 +1,59 @@ +# Combined document + +This contains both a data pack and a resource pack. + +## Resource pack + +Here we disable the grass block rotation randomization by creating a custom blockstate: + +`@blockstate minecraft:grass_block` + +```json +{ + "variants": { + "snowy=false": { "model": "block/grass_block" }, + "snowy=true": { "model": "block/grass_block_snow" } + } +} +``` + +Note that for the `snowy=false` variant we removed the rotated alternatives from the original file: + +```json +{ + "variants": { + "snowy=false": [ + { "model": "block/grass_block" }, + { "model": "block/grass_block", "y": 90 }, + { "model": "block/grass_block", "y": 180 }, + { "model": "block/grass_block", "y": 270 } + ], + "snowy=true": { "model": "block/grass_block_snow" } + } +} +``` + +> Refer to the [Minecraft wiki](https://minecraft.gamepedia.com/Model#Example:_Grass_Block) for more details. + +## Data pack + +The `@data_pack` directives allows us to modify the `pack.mcmeta` file: + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "description": "hello", + "pack_format": 7 + } +} +``` + +Next we're going to define a function: + +`@function demo:foo` + +```mcfunction +say foo +``` diff --git a/packages/lectern/examples/compact.txt b/packages/lectern/examples/compact.txt new file mode 100644 index 000000000..ab8499910 --- /dev/null +++ b/packages/lectern/examples/compact.txt @@ -0,0 +1,4 @@ +@function demo:foo +say foo +@function demo:bar +say bar diff --git a/packages/lectern/examples/empty_markdown.md b/packages/lectern/examples/empty_markdown.md new file mode 100644 index 000000000..c3808d397 --- /dev/null +++ b/packages/lectern/examples/empty_markdown.md @@ -0,0 +1,4 @@ +# Empty document + +There are no directives in this file so the resulting data packs and +resource pack are empty. diff --git a/packages/lectern/examples/empty_text.txt b/packages/lectern/examples/empty_text.txt new file mode 100644 index 000000000..caa8cd6bc --- /dev/null +++ b/packages/lectern/examples/empty_text.txt @@ -0,0 +1,2 @@ +There are no directive in this file so the resulting data packs and +resource packs are empty. diff --git a/packages/lectern/examples/readme_example.md b/packages/lectern/examples/readme_example.md new file mode 100644 index 000000000..cce930521 --- /dev/null +++ b/packages/lectern/examples/readme_example.md @@ -0,0 +1,19 @@ +# Beginner tutorial + +Let's start by creating a simple function: + +`@function tutorial:greeting` + +```mcfunction +say Hello, world! +``` + +And now we can make it run when the data pack is loaded! + +`@function_tag minecraft:load` + +```json +{ + "values": ["tutorial:greeting"] +} +``` diff --git a/packages/lectern/examples/strip_final_newline.txt b/packages/lectern/examples/strip_final_newline.txt new file mode 100644 index 000000000..51f2e859e --- /dev/null +++ b/packages/lectern/examples/strip_final_newline.txt @@ -0,0 +1,7 @@ +@function(strip_final_newline) demo:hello +say hello + +@function(strip_final_newline) demo:foo +say foo +@function(strip_final_newline) demo:bar +say bar diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 969060af9..528f4bb1a 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -8,10 +8,12 @@ import re from itertools import islice -from typing import Dict, Iterable, Mapping, Optional, Tuple +from typing import Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union from beet import DataPack, ResourcePack from beet.core.utils import FileSystemPath +from markdown_it import MarkdownIt +from markdown_it.token import Token from .directive import Directive from .fragment import Fragment @@ -48,27 +50,48 @@ def get_regex(self, directives: Mapping[str, Directive]) -> "re.Pattern[str]": return self.regex - -class TextExtractor(Extractor): - """Extractor for plain text files.""" - def extract( self, source: str, directives: Mapping[str, Directive], ) -> Tuple[ResourcePack, DataPack]: - """Turn text into a resource pack and a data pack.""" - assets, data = ResourcePack(), DataPack() + """Extract a resource pack and a data pack.""" + return self.apply_directives( + directives, self.parse_fragments(source, directives) + ) - tokens = self.get_regex(directives).split(source + "\n") + def apply_directives( + self, + directives: Mapping[str, Directive], + fragments: Iterable[Tuple[str, Fragment]], + ) -> Tuple[ResourcePack, DataPack]: + """Apply directives into a blank data pack and a blank resource pack.""" + assets, data = ResourcePack(), DataPack() - for directive_name, fragment in self.generate_fragments(tokens): - self.directives[directive_name](fragment, assets, data) + for directive_name, fragment in fragments: + directives[directive_name](fragment, assets, data) return assets, data - def generate_fragments(self, tokens: Iterable[str]): - """Yield pack fragments from a token stream.""" + def parse_fragments( + self, + source: str, + directives: Mapping[str, Directive], + ) -> Iterator[Tuple[str, Fragment]]: + """Parse and yield pack fragments.""" + return iter([]) + + +class TextExtractor(Extractor): + """Extractor for plain text files.""" + + def parse_fragments( + self, + source: str, + directives: Mapping[str, Directive], + ) -> Iterator[Tuple[str, Fragment]]: + tokens = self.get_regex(directives).split(source + "\n") + it = iter(tokens) next(it) @@ -96,9 +119,15 @@ def generate_regex(self) -> str: class MarkdownExtractor(Extractor): """Extractor for markdown files.""" + embedded_extractor: TextExtractor + parser: MarkdownIt + html_comment_regex: "re.Pattern[str]" + def __init__(self): super().__init__() self.embedded_extractor = EmbeddedExtractor() + self.parser = MarkdownIt() + self.html_comment_regex = re.compile(r"") def extract( self, @@ -106,6 +135,66 @@ def extract( directives: Mapping[str, Directive], files: Optional[FileSystemPath] = None, ) -> Tuple[ResourcePack, DataPack]: - """Turn markdown into a resource pack and a data pack.""" - assets, data = ResourcePack(), DataPack() - return assets, data + return self.apply_directives( + directives, self.parse_fragments(source, directives, files) + ) + + def parse_fragments( + self, + source: str, + directives: Mapping[str, Directive], + files: Optional[FileSystemPath] = None, + ) -> Iterator[Tuple[str, Fragment]]: + tokens = self.parser.parse(source) # type: ignore + regex = self.get_regex(directives) + + for i, token in enumerate(tokens): + if ( + self.match_tokens( + tokens[i : i + 4], + "paragraph_open", + "inline", + "paragraph_close", + ["fence", "code_block"], + ) + and (inline := tokens[i + 1]) + and inline.children + and self.match_tokens(inline.children, "code_inline") + and (match := regex.match(inline.children[0].content)) + ): + directive, modifier, arguments = match.groups() + yield directive, Fragment( + modifier, arguments.split(), tokens[i + 3].content + ) + elif ( + self.match_tokens( + tokens[i : i + 2], "html_block", ["fence", "code_block"] + ) + and (comment := self.html_comment_regex.match(token.content)) + and (match := regex.match(comment.group(1))) + ): + directive, modifier, arguments = match.groups() + yield directive, Fragment( + modifier, arguments.split(), tokens[i + 1].content + ) + elif token.type in ["fence", "code_block"]: + yield from self.embedded_extractor.parse_fragments( + token.content, directives + ) + + def match_tokens( + self, tokens: Optional[List[Token]], *token_types: Union[List[str], str] + ) -> bool: + """Return whether the list of tokens matches the provided token types.""" + return ( + tokens is not None + and len(tokens) == len(token_types) + and all( + ( + token_type == token.type + if isinstance(token_type, str) + else token.type in token_type + ) + for token, token_type in zip(tokens, token_types) + ) + ) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index ea59ce314..6cd668b02 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -5,9 +5,12 @@ ] from itertools import chain -from typing import Any, Dict, Tuple +from pathlib import Path +from textwrap import indent +from typing import Any, Dict, Iterator, Tuple, Union from beet import DataPack, File, ResourcePack +from beet.library.base import NamespaceFile from .directive import NamespacedResourceDirective, get_builtin_directives @@ -17,6 +20,12 @@ if isinstance(directive, NamespacedResourceDirective) } +EXTENSION_HIGHLIGHTING = { + ".mcfunction": "mcfunction", + ".json": "json", + ".mcmeta": "json", +} + class TextSerializer: """Document serializer that outputs plain text.""" @@ -59,4 +68,74 @@ def serialize_and_emit_files( data: DataPack, ) -> Tuple[str, Dict[str, File[Any, Any]]]: """Return the serialized representation and the files emitted in the process.""" - return "", {} + files: Dict[str, File[Any, Any]] = {} + + content = ( + "\n".join( + text + for title, directive, pack in [ + ("Data pack", "data_pack", data), + ("Resource pack", "resource_pack", assets), + ] + if pack + for text in self.serialize_pack(title, directive, pack, files) + ) + or "The data pack and resource pack are empty.\n" + ) + + return "# Lectern snapshot\n\n" + (content), files + + def serialize_pack( + self, + title: str, + pack_directive: str, + pack: Union[DataPack, ResourcePack], + files: Dict[str, File[Any, Any]], + ) -> Iterator[str]: + """Yield markdown chunks for the given pack.""" + yield f"## {title}" + + yield "\n### Files" + + for path, file_instance in pack.extra.items(): + yield from self.serialize_file_instance( + pack_directive, path, file_instance, files + ) + + for name, namespace in pack.items(): + yield f"\n### {name.title()} namespace" + + for file_type, container in namespace.items(): + directive_name = NAMESPACED_RESOURCE_DIRECTIVES[file_type] + + for path, file_instance in container.items(): + yield from self.serialize_file_instance( + directive_name, f"{name}:{path}", file_instance, files + ) + + yield "" + + def serialize_file_instance( + self, + directive: str, + argument: str, + file_instance: Union[File[Any, Any], NamespaceFile], + files: Dict[str, File[Any, Any]], + ) -> Iterator[str]: + """Yield markdown chunks for including the given file instance.""" + content = file_instance.ensure_serialized() + + if isinstance(content, str): + extension = ( + file_instance.extension + if isinstance(file_instance, NamespaceFile) + else Path(argument).suffix + ) + + if not content.endswith("\n"): + directive += "(strip_final_newline)" + content += "\n" + + yield f"\n- `@{directive} {argument}`" + yield "\n ```" + EXTENSION_HIGHLIGHTING.get(extension, "") + yield indent(content, " ") + " ```" diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md new file mode 100644 index 000000000..01f9cb809 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md @@ -0,0 +1,85 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Tutorial namespace + +- `@function tutorial:greeting` + + ```mcfunction + say Hello, world! + ``` + +- `@function tutorial:obtained_dead_bush` + + ```mcfunction + say You obtained a dead bush! + ``` + +- `@advancement tutorial:obtained_dead_bush` + + ```json + { + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } + } + ``` + +### Minecraft namespace + +- `@function_tag minecraft:load` + + ```json + { + "values": ["tutorial:greeting"] + } + ``` + +- `@loot_table minecraft:blocks/diamond_ore` + + ```json + { + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] + } + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md new file mode 100644 index 000000000..bf6543b2e --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function demo:foo` + + ```mcfunction + say foo + ``` + +- `@function demo:bar` + + ```mcfunction + say bar + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md new file mode 100644 index 000000000..7693b02f2 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md @@ -0,0 +1,38 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function demo:foo` + + ```mcfunction + say foo + @functionn demo:foo + say still in the same function + @@@@ + @ @ @ + ``` + +- `@function demo:bar` + + ```mcfunction + say bar + @function demo:bar + say hello + @function demo:bar + say world + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md new file mode 100644 index 000000000..ce44e7a25 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function demo:foo` + + ```mcfunction + say overwrite + ``` + +- `@function demo:bar` + + ```mcfunction + say bar + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md new file mode 100644 index 000000000..b4c874b50 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md @@ -0,0 +1,54 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function demo:foo` + + ```mcfunction + say foo + ``` + +- `@function demo:bar` + + ```mcfunction + say bar + ``` + +- `@function demo:hidden_foo` + + ```mcfunction + say hidden foo + ``` + +- `@function demo:hidden_bar` + + ```mcfunction + say hidden bar + ``` + +- `@function demo:embedded_foo` + + ```mcfunction + say embedded foo + ``` + +- `@function demo:embedded_bar` + + ```mcfunction + say embedded bar + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md new file mode 100644 index 000000000..53e4558a0 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md @@ -0,0 +1,52 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "description": "hello", + "pack_format": 7 + } + } + ``` + +### Demo namespace + +- `@function demo:foo` + + ```mcfunction + say foo + ``` + +## Resource pack + +### Files + +- `@resource_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Minecraft namespace + +- `@blockstate minecraft:grass_block` + + ```json + { + "variants": { + "snowy=false": { "model": "block/grass_block" }, + "snowy=true": { "model": "block/grass_block_snow" } + } + } + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md new file mode 100644 index 000000000..d47fcb14b --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function(strip_final_newline) demo:foo` + + ```mcfunction + say foo + ``` + +- `@function demo:bar` + + ```mcfunction + say bar + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md/README.md new file mode 100644 index 000000000..194a6c358 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md/README.md @@ -0,0 +1,3 @@ +# Lectern snapshot + +The data pack and resource pack are empty. diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md/README.md new file mode 100644 index 000000000..194a6c358 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md/README.md @@ -0,0 +1,3 @@ +# Lectern snapshot + +The data pack and resource pack are empty. diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md new file mode 100644 index 000000000..59012b268 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md @@ -0,0 +1,34 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Tutorial namespace + +- `@function tutorial:greeting` + + ```mcfunction + say Hello, world! + ``` + +### Minecraft namespace + +- `@function_tag minecraft:load` + + ```json + { + "values": ["tutorial:greeting"] + } + ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md new file mode 100644 index 000000000..6c38dd32d --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md @@ -0,0 +1,36 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function(strip_final_newline) demo:hello` + + ```mcfunction + say hello + ``` + +- `@function(strip_final_newline) demo:foo` + + ```mcfunction + say foo + ``` + +- `@function(strip_final_newline) demo:bar` + + ```mcfunction + say bar + ``` diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt new file mode 100644 index 000000000..2443426bf --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -0,0 +1,57 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function tutorial:greeting +say Hello, world! + +@function tutorial:obtained_dead_bush +say You obtained a dead bush! + +@advancement tutorial:obtained_dead_bush +{ + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } +} + +@function_tag minecraft:load +{ + "values": ["tutorial:greeting"] +} + +@loot_table minecraft:blocks/diamond_ore +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] +} diff --git a/packages/lectern/tests/snapshots/examples__load_path0__basic1.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt similarity index 100% rename from packages/lectern/tests/snapshots/examples__load_path0__basic1.pack.txt rename to packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt diff --git a/packages/lectern/tests/snapshots/examples__load_path1__basic2.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt similarity index 100% rename from packages/lectern/tests/snapshots/examples__load_path1__basic2.pack.txt rename to packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt diff --git a/packages/lectern/tests/snapshots/examples__load_path2__basic3.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt similarity index 100% rename from packages/lectern/tests/snapshots/examples__load_path2__basic3.pack.txt rename to packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt diff --git a/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt new file mode 100644 index 000000000..357162e41 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt @@ -0,0 +1,25 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say foo + +@function demo:bar +say bar + +@function demo:hidden_foo +say hidden foo + +@function demo:hidden_bar +say hidden bar + +@function demo:embedded_foo +say embedded foo + +@function demo:embedded_bar +say embedded bar diff --git a/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt new file mode 100644 index 000000000..001d102ab --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt @@ -0,0 +1,26 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@blockstate minecraft:grass_block +{ + "variants": { + "snowy=false": { "model": "block/grass_block" }, + "snowy=true": { "model": "block/grass_block_snow" } + } +} + +@data_pack pack.mcmeta +{ + "pack": { + "description": "hello", + "pack_format": 7 + } +} + +@function demo:foo +say foo diff --git a/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt new file mode 100644 index 000000000..9cf604d66 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt @@ -0,0 +1,12 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say foo +@function demo:bar +say bar diff --git a/packages/lectern/tests/snapshots/examples__text_examples_empty_markdown_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_empty_markdown_md__0.pack.txt new file mode 100644 index 000000000..e69de29bb diff --git a/packages/lectern/tests/snapshots/examples__text_examples_empty_text_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_empty_text_txt__0.pack.txt new file mode 100644 index 000000000..e69de29bb diff --git a/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt new file mode 100644 index 000000000..678731126 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt @@ -0,0 +1,15 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function tutorial:greeting +say Hello, world! + +@function_tag minecraft:load +{ + "values": ["tutorial:greeting"] +} diff --git a/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt new file mode 100644 index 000000000..588c0683f --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt @@ -0,0 +1,14 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:hello +say hello +@function demo:foo +say foo +@function demo:bar +say bar \ No newline at end of file diff --git a/packages/lectern/tests/test_document.py b/packages/lectern/tests/test_document.py index b35ecd8e2..d3f5e1b01 100644 --- a/packages/lectern/tests/test_document.py +++ b/packages/lectern/tests/test_document.py @@ -9,8 +9,9 @@ def test_empty(): assert Document().data == DataPack() assert Document().assets == ResourcePack() assert Document().get_text() == "" - assert Document().get_markdown() == "" - assert Document().get_markdown(emit_files=True) == ("", {}) + empty = "# Lectern snapshot\n\nThe data pack and resource pack are empty.\n" + assert Document().get_markdown() == empty + assert Document().get_markdown(emit_files=True) == (empty, {}) assert Document(text="Nothing to see here") == Document() assert Document(markdown="Nothing to see here") == Document() diff --git a/packages/lectern/tests/test_examples.py b/packages/lectern/tests/test_examples.py index 436e01332..a2ac995fc 100644 --- a/packages/lectern/tests/test_examples.py +++ b/packages/lectern/tests/test_examples.py @@ -1,19 +1,22 @@ -from pathlib import Path +from glob import glob from typing import Any import pytest from lectern import Document -EXAMPLES_DIRECTORY = Path(__file__, "../../examples").resolve() +EXAMPLES = [ + *glob("examples/*.txt"), + *glob("examples/*.md"), + "README.md", +] -@pytest.mark.parametrize( - "path", - [ - *sorted(EXAMPLES_DIRECTORY.glob("*.txt")), - *sorted(EXAMPLES_DIRECTORY.glob("*.md")), - ], -) -def test_load(snapshot: Any, path: Path): - assert snapshot(path.stem + ".pack.txt") == Document(path=path) +@pytest.mark.parametrize("path", EXAMPLES) +def test_text(snapshot: Any, path: str): + assert snapshot("pack.txt") == Document(path=path) + + +@pytest.mark.parametrize("path", EXAMPLES) +def test_markdown(snapshot: Any, path: str): + assert snapshot("pack.md") == Document(path=path) From e407eda10b9f2dc20c0c187a026e3cf51190f714 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Feb 2021 09:13:40 +0000 Subject: [PATCH 0043/1554] 0.2.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 13 +++++++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index a5f594748..dd38470a4 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,19 @@ +## v0.2.0 (2021-02-22) +### Feature +* Extract and serialize markdown ([`7827d61`](https://github.com/vberlier/lectern/commit/7827d61a9fa298da55e05246c294c2a011750017)) +* Implement strip_final_newline modifier ([`9aef7d4`](https://github.com/vberlier/lectern/commit/9aef7d45d0db7b4f7bac667e351b09097e68c2d0)) +* Add snapshot testing ([`316e806`](https://github.com/vberlier/lectern/commit/316e8065a59571722cb0a4bdf2fd38912c818111)) +* Add load method ([`81953af`](https://github.com/vberlier/lectern/commit/81953af678e6e20237cbc7d689775c144ef51f16)) + +### Fix +* Allow empty modifier ([`c9937b9`](https://github.com/vberlier/lectern/commit/c9937b96e7b9884027f61dfba719d22692a49d67)) +* Don't drop modifier ([`8304433`](https://github.com/vberlier/lectern/commit/8304433b592b7dd09ca914fd63084fca8cdbecd4)) +* Add newline between loot table and advancement in README ([`7337a70`](https://github.com/vberlier/lectern/commit/7337a70019cd86fa61c33bb212046111419173e8)) +* Rename operators to modifiers ([`3886ec3`](https://github.com/vberlier/lectern/commit/3886ec317b66a50ee0935dec5cb1f72eb3582ccc)) + ## v0.1.0 (2021-02-22) ### Feature * Plain text extraction and serialization ([`49e8996`](https://github.com/vberlier/lectern/commit/49e8996d3398a8683ea91de3df062e47707574c8)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 38217ddf3..0ab2e338c 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.1.0" +__version__ = "0.2.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index b99419706..678586011 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.1.0" +version = "0.2.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From a9945770ee7f4c90e8a6a7f6d039dd5af5c04345 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 10:24:44 +0100 Subject: [PATCH 0044/1554] chore: update logo url --- packages/lectern/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 68a4fbf02..06d34fef9 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -1,4 +1,4 @@ -logo +logo # Lectern From 2661eebdfe3160a356c0f83a148236851efbba4f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 10:32:39 +0100 Subject: [PATCH 0045/1554] fix: handle strip_final_newline in the fragment itself --- packages/lectern/lectern/directive.py | 8 +++----- packages/lectern/lectern/fragment.py | 5 +++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index fb2218347..ddce2e1a7 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -71,10 +71,7 @@ class NamespacedResourceDirective: def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): full_name = fragment.expect("full_name") - content = fragment.content - - if fragment.modifier == "strip_final_newline" and content[-1:] == "\n": - content = content[:-1] + content = fragment.apply_modifier() file_instance = self.file_type(content) @@ -90,10 +87,11 @@ class BundleFragmentMixin: def bundle_pack_fragment(self, fragment: Fragment) -> ZipFile: """Return a zipfile containing the pack fragment.""" relative_path = fragment.expect("relative_path") + content = fragment.apply_modifier() data = io.BytesIO() with ZipFile(data, mode="w") as zip_file: - zip_file.writestr(relative_path, fragment.content) + zip_file.writestr(relative_path, content) return ZipFile(io.BytesIO(data.getvalue())) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index bcc8072f9..751e38de7 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -51,3 +51,8 @@ def expect(self, *names: str): if len(self.arguments) == 1: return self.arguments[0] return self.arguments + + def apply_modifier(self) -> Union[str, bytes]: + if self.modifier == "strip_final_newline" and self.content[-1:] == "\n": + return self.content[:-1] + return self.content From 7572a347b2bbb368b01ebe3561f010b79e8acfdd Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Feb 2021 09:33:17 +0000 Subject: [PATCH 0046/1554] 0.2.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index dd38470a4..9bf36f46b 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.2.1 (2021-02-22) +### Fix +* Handle strip_final_newline in the fragment itself ([`d031607`](https://github.com/vberlier/lectern/commit/d03160756140dc8fe6406a57869b39780c7f7846)) + ## v0.2.0 (2021-02-22) ### Feature * Extract and serialize markdown ([`7827d61`](https://github.com/vberlier/lectern/commit/7827d61a9fa298da55e05246c294c2a011750017)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 0ab2e338c..48e797fe0 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.2.0" +__version__ = "0.2.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 678586011..571c2ef34 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.2.0" +version = "0.2.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 81c00d34c835245fddc3c251f640bf5669f9908b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 10:50:44 +0100 Subject: [PATCH 0047/1554] docs: add command-line utility help text --- packages/lectern/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 06d34fef9..4db26d982 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -224,6 +224,16 @@ TODO ```bash $ lectern --help +Usage: lectern [OPTIONS] [PATH]... + + Literate Minecraft data packs and resource packs. + +Options: + -d, --data-pack Extract data pack. + -r, --resource-pack Extract resource pack. + -o, --output-files Output the associated files. + -v, --version Show the version and exit. + -h, --help Show this message and exit. ``` You can extract data packs from markdown files with the `-d/--data-pack` option. If the name ends with `.zip` the generated data pack will be zipped. Multiple markdown files can be merged together into a single data pack. From 8d4fe932e15d2b4d44f5746513626321dbd912f5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 22 Feb 2021 22:04:24 +0100 Subject: [PATCH 0048/1554] fix: resolve output_files relative to the context directory --- packages/lectern/lectern/plugin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 3af7843b6..2a7b5e22a 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -39,6 +39,9 @@ def plugin(ctx: Context): yield if output: - document.save(ctx.directory / output, output_files) + document.save( + ctx.directory / output, + ctx.directory / output_files if output_files else None, + ) return plugin From 4dcbe2c64d491f02b2353d8d7b01e78a439b50a4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Feb 2021 21:05:04 +0000 Subject: [PATCH 0049/1554] 0.2.2 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 7 +++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 9bf36f46b..8a908f218 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.2.2 (2021-02-22) +### Fix +* Resolve output_files relative to the context directory ([`73e4bcd`](https://github.com/vberlier/lectern/commit/73e4bcdda5be64f5296641a9e66a048aaf35f1d5)) + +### Documentation +* Add command-line utility help text ([`e615ba1`](https://github.com/vberlier/lectern/commit/e615ba13b61fc0c1625c538d8290b142d16e3ea3)) + ## v0.2.1 (2021-02-22) ### Fix * Handle strip_final_newline in the fragment itself ([`d031607`](https://github.com/vberlier/lectern/commit/d03160756140dc8fe6406a57869b39780c7f7846)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 48e797fe0..bdbafb763 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.2.1" +__version__ = "0.2.2" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 571c2ef34..821b277a4 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.2.1" +version = "0.2.2" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 4e8be1c55fe2836fe838e9597fb33482ae97e468 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 Feb 2021 02:55:06 +0100 Subject: [PATCH 0050/1554] chore: add dependabot --- packages/lectern/.github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 packages/lectern/.github/dependabot.yml diff --git a/packages/lectern/.github/dependabot.yml b/packages/lectern/.github/dependabot.yml new file mode 100644 index 000000000..41a3fe387 --- /dev/null +++ b/packages/lectern/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 + +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" From 202cfb380b9db253112a58e16f8da9103cdd611d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 Feb 2021 03:03:48 +0100 Subject: [PATCH 0051/1554] chore: update references --- packages/lectern/.github/workflows/main.yml | 2 +- packages/lectern/CHANGELOG.md | 26 ++++++++++----------- packages/lectern/README.md | 10 ++++---- packages/lectern/pyproject.toml | 6 ++--- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/lectern/.github/workflows/main.yml b/packages/lectern/.github/workflows/main.yml index d31bace35..42cd4e34d 100644 --- a/packages/lectern/.github/workflows/main.yml +++ b/packages/lectern/.github/workflows/main.yml @@ -42,7 +42,7 @@ jobs: run: poetry run black --check lectern tests - name: Release if: | - github.repository == 'vberlier/lectern' + github.repository == 'mcbeet/lectern' && github.event_name == 'push' && github.ref == 'refs/heads/main' env: diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 8a908f218..35e4b98c5 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -4,31 +4,31 @@ ## v0.2.2 (2021-02-22) ### Fix -* Resolve output_files relative to the context directory ([`73e4bcd`](https://github.com/vberlier/lectern/commit/73e4bcdda5be64f5296641a9e66a048aaf35f1d5)) +* Resolve output_files relative to the context directory ([`73e4bcd`](https://github.com/mcbeet/lectern/commit/73e4bcdda5be64f5296641a9e66a048aaf35f1d5)) ### Documentation -* Add command-line utility help text ([`e615ba1`](https://github.com/vberlier/lectern/commit/e615ba13b61fc0c1625c538d8290b142d16e3ea3)) +* Add command-line utility help text ([`e615ba1`](https://github.com/mcbeet/lectern/commit/e615ba13b61fc0c1625c538d8290b142d16e3ea3)) ## v0.2.1 (2021-02-22) ### Fix -* Handle strip_final_newline in the fragment itself ([`d031607`](https://github.com/vberlier/lectern/commit/d03160756140dc8fe6406a57869b39780c7f7846)) +* Handle strip_final_newline in the fragment itself ([`d031607`](https://github.com/mcbeet/lectern/commit/d03160756140dc8fe6406a57869b39780c7f7846)) ## v0.2.0 (2021-02-22) ### Feature -* Extract and serialize markdown ([`7827d61`](https://github.com/vberlier/lectern/commit/7827d61a9fa298da55e05246c294c2a011750017)) -* Implement strip_final_newline modifier ([`9aef7d4`](https://github.com/vberlier/lectern/commit/9aef7d45d0db7b4f7bac667e351b09097e68c2d0)) -* Add snapshot testing ([`316e806`](https://github.com/vberlier/lectern/commit/316e8065a59571722cb0a4bdf2fd38912c818111)) -* Add load method ([`81953af`](https://github.com/vberlier/lectern/commit/81953af678e6e20237cbc7d689775c144ef51f16)) +* Extract and serialize markdown ([`7827d61`](https://github.com/mcbeet/lectern/commit/7827d61a9fa298da55e05246c294c2a011750017)) +* Implement strip_final_newline modifier ([`9aef7d4`](https://github.com/mcbeet/lectern/commit/9aef7d45d0db7b4f7bac667e351b09097e68c2d0)) +* Add snapshot testing ([`316e806`](https://github.com/mcbeet/lectern/commit/316e8065a59571722cb0a4bdf2fd38912c818111)) +* Add load method ([`81953af`](https://github.com/mcbeet/lectern/commit/81953af678e6e20237cbc7d689775c144ef51f16)) ### Fix -* Allow empty modifier ([`c9937b9`](https://github.com/vberlier/lectern/commit/c9937b96e7b9884027f61dfba719d22692a49d67)) -* Don't drop modifier ([`8304433`](https://github.com/vberlier/lectern/commit/8304433b592b7dd09ca914fd63084fca8cdbecd4)) -* Add newline between loot table and advancement in README ([`7337a70`](https://github.com/vberlier/lectern/commit/7337a70019cd86fa61c33bb212046111419173e8)) -* Rename operators to modifiers ([`3886ec3`](https://github.com/vberlier/lectern/commit/3886ec317b66a50ee0935dec5cb1f72eb3582ccc)) +* Allow empty modifier ([`c9937b9`](https://github.com/mcbeet/lectern/commit/c9937b96e7b9884027f61dfba719d22692a49d67)) +* Don't drop modifier ([`8304433`](https://github.com/mcbeet/lectern/commit/8304433b592b7dd09ca914fd63084fca8cdbecd4)) +* Add newline between loot table and advancement in README ([`7337a70`](https://github.com/mcbeet/lectern/commit/7337a70019cd86fa61c33bb212046111419173e8)) +* Rename operators to modifiers ([`3886ec3`](https://github.com/mcbeet/lectern/commit/3886ec317b66a50ee0935dec5cb1f72eb3582ccc)) ## v0.1.0 (2021-02-22) ### Feature -* Plain text extraction and serialization ([`49e8996`](https://github.com/vberlier/lectern/commit/49e8996d3398a8683ea91de3df062e47707574c8)) +* Plain text extraction and serialization ([`49e8996`](https://github.com/mcbeet/lectern/commit/49e8996d3398a8683ea91de3df062e47707574c8)) ### Fix -* Change document methods and add tests ([`8879b90`](https://github.com/vberlier/lectern/commit/8879b909c00fa5299793ce90db8c1ee81d2af085)) +* Change document methods and add tests ([`8879b90`](https://github.com/mcbeet/lectern/commit/8879b909c00fa5299793ce90db8c1ee81d2af085)) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 4db26d982..b9b9f6dd1 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -1,8 +1,8 @@ -logo +logo # Lectern -[![GitHub Actions](https://github.com/vberlier/lectern/workflows/CI/badge.svg)](https://github.com/vberlier/lectern/actions) +[![GitHub Actions](https://github.com/mcbeet/lectern/workflows/CI/badge.svg)](https://github.com/mcbeet/lectern/actions) [![PyPI](https://img.shields.io/pypi/v/lectern.svg)](https://pypi.org/project/lectern/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/lectern.svg)](https://pypi.org/project/lectern/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) @@ -24,7 +24,7 @@ This markdown file is interspersed with code fragments describing the content of - Turn markdown files into data packs and resource packs - Merge resources from several markdown files - Convert data packs and resource packs into markdown snapshots -- Can be used as a [`beet`](https://github.com/vberlier/beet) plugin +- Can be used as a [`beet`](https://github.com/mcbeet/beet) plugin - Highly extensible with custom directives - Automatically integrates with [`pytest-insta`](https://github.com/vberlier/pytest-insta) @@ -72,7 +72,7 @@ You can use the `lectern` command-line utility to turn the markdown file into a $ lectern tutorial.md --data-pack path/to/tutorial_data_pack ``` -If you're using [`beet`](https://github.com/vberlier/beet) you can use `lectern` as a plugin in your pipeline. +If you're using [`beet`](https://github.com/mcbeet/beet) you can use `lectern` as a plugin in your pipeline. ```json { @@ -313,4 +313,4 @@ $ poetry run black --check lectern tests --- -License - [MIT](https://github.com/vberlier/lectern/blob/main/LICENSE) +License - [MIT](https://github.com/mcbeet/lectern/blob/main/LICENSE) diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 821b277a4..e5cdd2655 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -5,9 +5,9 @@ description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" -homepage = "https://github.com/vberlier/lectern" -repository = "https://github.com/vberlier/lectern" -documentation = "https://github.com/vberlier/lectern" +homepage = "https://github.com/mcbeet/lectern" +repository = "https://github.com/mcbeet/lectern" +documentation = "https://github.com/mcbeet/lectern" readme = "README.md" From 38ac67b69d2f7516315597acc08575a9dbb38bb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Feb 2021 02:05:44 +0000 Subject: [PATCH 0052/1554] chore(deps-dev): bump pyright from 1.1.112 to 1.1.114 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.112 to 1.1.114. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.114/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 566af7616..bc091be0e 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.112" + "pyright": "^1.1.114" } }, "node_modules/pyright": { - "version": "1.1.112", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.112.tgz", - "integrity": "sha512-/pwzJWmGo3s7gETYq9CUcPP5F4ZxFBe9u8sQpEJDHD//YFi97EQjhBkOT4M6sNEKpG8u/nyoVRK9ZlGFBHZtcQ==", + "version": "1.1.114", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.114.tgz", + "integrity": "sha512-1AkbLJrBMxRya2zW07GSz0Hej/loAw/0+bx1vQOBmyS0LMPdZQSYw4X589xK4bXaxMYoMA+CsyEsGFs0eYbFaQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.112", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.112.tgz", - "integrity": "sha512-/pwzJWmGo3s7gETYq9CUcPP5F4ZxFBe9u8sQpEJDHD//YFi97EQjhBkOT4M6sNEKpG8u/nyoVRK9ZlGFBHZtcQ==", + "version": "1.1.114", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.114.tgz", + "integrity": "sha512-1AkbLJrBMxRya2zW07GSz0Hej/loAw/0+bx1vQOBmyS0LMPdZQSYw4X589xK4bXaxMYoMA+CsyEsGFs0eYbFaQ==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 822611b34..cdc9307d6 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.112" + "pyright": "^1.1.114" } } From c3d3a92f4f73d93954dbce2e0da6cd96677cc902 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Feb 2021 02:07:03 +0000 Subject: [PATCH 0053/1554] chore(deps): bump beet from 0.9.3 to 0.9.4 Bumps [beet](https://github.com/mcbeet/beet) from 0.9.3 to 0.9.4. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.9.3...v0.9.4) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 73bd4ab8c..71c655d65 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.9.3" +version = "0.9.4" description = "The Minecraft pack development kit" category = "main" optional = false @@ -762,8 +762,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.9.3-py3-none-any.whl", hash = "sha256:16bd67714d7c04ae27690e651db9344e8bae31bb2b6bb6f77b6dacc2160cd751"}, - {file = "beet-0.9.3.tar.gz", hash = "sha256:b8f85c6b84f1f194fac6e9acf7fe4d2d8182bfa523fb8930bf8d6873b735a3ff"}, + {file = "beet-0.9.4-py3-none-any.whl", hash = "sha256:25e21bc7b8cd1784a217855c3c56db29473d662378d2dde95d9af0006b400dc7"}, + {file = "beet-0.9.4.tar.gz", hash = "sha256:b3b92897e4fa6053f6c8e60194b5f234ed961d82d48c3dde8354739efb42dcdc"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -843,6 +843,10 @@ cryptography = [ {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"}, {file = "cryptography-3.4.6-cp36-abi3-win32.whl", hash = "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2"}, {file = "cryptography-3.4.6-cp36-abi3-win_amd64.whl", hash = "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0"}, + {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b"}, + {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df"}, + {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336"}, + {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724"}, {file = "cryptography-3.4.6.tar.gz", hash = "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87"}, ] docutils = [ @@ -912,20 +916,39 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mdit-py-plugins = [ From 77e5d2fa5c9a5350b36c53b973281de2e49b2c5c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 Feb 2021 03:56:29 +0100 Subject: [PATCH 0054/1554] feat: handle folded sections --- packages/lectern/examples/folded_sections.md | 23 ++++++++++++++ packages/lectern/lectern/extract.py | 21 +++++++++++++ .../README.md | 30 +++++++++++++++++++ ...xt_examples_folded_sections_md__0.pack.txt | 13 ++++++++ 4 files changed, 87 insertions(+) create mode 100644 packages/lectern/examples/folded_sections.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt diff --git a/packages/lectern/examples/folded_sections.md b/packages/lectern/examples/folded_sections.md new file mode 100644 index 000000000..ebfca6d68 --- /dev/null +++ b/packages/lectern/examples/folded_sections.md @@ -0,0 +1,23 @@ +# This markdown file has folded sections + +
+ +`@function demo:foo` + +```mcfunction +say foo +``` + +
+ +This next one is a bit tricky: + +`@function demo:bar` + +
+ +```mcfunction +say bar +``` + +
diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 528f4bb1a..ba5a27ca9 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -166,6 +166,27 @@ def parse_fragments( yield directive, Fragment( modifier, arguments.split(), tokens[i + 3].content ) + elif ( + self.match_tokens( + tokens[i : i + 6], + "paragraph_open", + "inline", + "paragraph_close", + "html_block", + ["fence", "code_block"], + "html_block", + ) + and (inline := tokens[i + 1]) + and inline.children + and self.match_tokens(inline.children, "code_inline") + and tokens[i + 3].content == "
\n" + and tokens[i + 5].content == "
\n" + and (match := regex.match(inline.children[0].content)) + ): + directive, modifier, arguments = match.groups() + yield directive, Fragment( + modifier, arguments.split(), tokens[i + 4].content + ) elif ( self.match_tokens( tokens[i : i + 2], "html_block", ["fence", "code_block"] diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md new file mode 100644 index 000000000..bf6543b2e --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +### Files + +- `@data_pack pack.mcmeta` + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +### Demo namespace + +- `@function demo:foo` + + ```mcfunction + say foo + ``` + +- `@function demo:bar` + + ```mcfunction + say bar + ``` diff --git a/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt new file mode 100644 index 000000000..a5cf6a2c9 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt @@ -0,0 +1,13 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say foo + +@function demo:bar +say bar From f5534fd5a266418a65022cd9381689e4551345a9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 Feb 2021 04:05:27 +0100 Subject: [PATCH 0055/1554] chore: update logo --- packages/lectern/README.md | 2 +- packages/lectern/logo.png | Bin 0 -> 191679 bytes packages/lectern/logo.svg | 28 ---------------------------- 3 files changed, 1 insertion(+), 29 deletions(-) create mode 100755 packages/lectern/logo.png delete mode 100755 packages/lectern/logo.svg diff --git a/packages/lectern/README.md b/packages/lectern/README.md index b9b9f6dd1..493fa409a 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -1,4 +1,4 @@ -logo +logo # Lectern diff --git a/packages/lectern/logo.png b/packages/lectern/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..a66489bb93cd228f67aa586387160ab5e1121286 GIT binary patch literal 191679 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 fPR00(no4N$SCP`4)6tUSZ$ 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 z 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 -Made with Pixels to Svg https://codepen.io/shshaw/pen/XbxvNj - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From a025032cce1c47dd8a274132dc891c67cf1991e7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 24 Feb 2021 03:06:24 +0000 Subject: [PATCH 0056/1554] 0.3.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 35e4b98c5..3b6ae40ba 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.0 (2021-02-24) +### Feature +* Handle folded sections ([`9f611e5`](https://github.com/mcbeet/lectern/commit/9f611e57e766ba3e78bf7a15392fc4ab0e97650a)) + ## v0.2.2 (2021-02-22) ### Fix * Resolve output_files relative to the context directory ([`73e4bcd`](https://github.com/mcbeet/lectern/commit/73e4bcdda5be64f5296641a9e66a048aaf35f1d5)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index bdbafb763..fbe5942e4 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.2.2" +__version__ = "0.3.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index e5cdd2655..fac8c6adb 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.2.2" +version = "0.3.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 805b5ecaadce8862b8e8d3611838abd43389cb25 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 Feb 2021 04:12:00 +0100 Subject: [PATCH 0057/1554] chore: fix logo url --- packages/lectern/README.md | 2 +- packages/lectern/logo.png | Bin 191679 -> 282645 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 493fa409a..02aa6f72b 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -1,4 +1,4 @@ -logo +logo # Lectern diff --git a/packages/lectern/logo.png b/packages/lectern/logo.png index a66489bb93cd228f67aa586387160ab5e1121286..b0dbc5f21d718412b5ae431cbf37247db6939661 100755 GIT binary patch literal 282645 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

" yield "\n ```" + EXTENSION_HIGHLIGHTING.get(extension, "") yield indent(content, " ") + " ```" + yield "\n
" diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md index 01f9cb809..ffa28c830 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,22 +15,34 @@ } ``` -### Tutorial namespace +
+ +### tutorial - `@function tutorial:greeting` +
+ ```mcfunction say Hello, world! ``` +
+ - `@function tutorial:obtained_dead_bush` +
+ ```mcfunction say You obtained a dead bush! ``` +
+ - `@advancement tutorial:obtained_dead_bush` +
+ ```json { "criteria": { @@ -56,18 +68,26 @@ } ``` -### Minecraft namespace +
+ +### minecraft - `@function_tag minecraft:load` +
+ ```json { "values": ["tutorial:greeting"] } ``` +
+ - `@loot_table minecraft:blocks/diamond_ore` +
+ ```json { "pools": [ @@ -83,3 +103,5 @@ ] } ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md index bf6543b2e..f37417bd6 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,16 +15,26 @@ } ``` -### Demo namespace +
+ +### demo - `@function demo:foo` +
+ ```mcfunction say foo ``` +
+ - `@function demo:bar` +
+ ```mcfunction say bar ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md index 7693b02f2..08503a2ac 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,10 +15,14 @@ } ``` -### Demo namespace +
+ +### demo - `@function demo:foo` +
+ ```mcfunction say foo @functionn demo:foo @@ -27,8 +31,12 @@ @ @ @ ``` +
+ - `@function demo:bar` +
+ ```mcfunction say bar @function demo:bar @@ -36,3 +44,5 @@ @function demo:bar say world ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md index ce44e7a25..fc16d8186 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,16 +15,26 @@ } ``` -### Demo namespace +
+ +### demo - `@function demo:foo` +
+ ```mcfunction say overwrite ``` +
+ - `@function demo:bar` +
+ ```mcfunction say bar ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md index b4c874b50..e153cd47f 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,40 +15,66 @@ } ``` -### Demo namespace +
+ +### demo - `@function demo:foo` +
+ ```mcfunction say foo ``` +
+ - `@function demo:bar` +
+ ```mcfunction say bar ``` +
+ - `@function demo:hidden_foo` +
+ ```mcfunction say hidden foo ``` +
+ - `@function demo:hidden_bar` +
+ ```mcfunction say hidden bar ``` +
+ - `@function demo:embedded_foo` +
+ ```mcfunction say embedded foo ``` +
+ - `@function demo:embedded_bar` +
+ ```mcfunction say embedded bar ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md index 53e4558a0..7d4d02758 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,20 +15,26 @@ } ``` -### Demo namespace +
+ +### demo - `@function demo:foo` +
+ ```mcfunction say foo ``` -## Resource pack +
-### Files +## Resource pack - `@resource_pack pack.mcmeta` +
+ ```json { "pack": { @@ -38,10 +44,14 @@ } ``` -### Minecraft namespace +
+ +### minecraft - `@blockstate minecraft:grass_block` +
+ ```json { "variants": { @@ -50,3 +60,5 @@ } } ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md index d47fcb14b..52d0907ea 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,16 +15,26 @@ } ``` -### Demo namespace +
+ +### demo - `@function(strip_final_newline) demo:foo` +
+ ```mcfunction say foo ``` +
+ - `@function demo:bar` +
+ ```mcfunction say bar ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md index bf6543b2e..f37417bd6 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,16 +15,26 @@ } ``` -### Demo namespace +
+ +### demo - `@function demo:foo` +
+ ```mcfunction say foo ``` +
+ - `@function demo:bar` +
+ ```mcfunction say bar ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md index 59012b268..749ae1ec9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,20 +15,30 @@ } ``` -### Tutorial namespace +
+ +### tutorial - `@function tutorial:greeting` +
+ ```mcfunction say Hello, world! ``` -### Minecraft namespace +
+ +### minecraft - `@function_tag minecraft:load` +
+ ```json { "values": ["tutorial:greeting"] } ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md index 6c38dd32d..ba99de899 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md @@ -2,10 +2,10 @@ ## Data pack -### Files - - `@data_pack pack.mcmeta` +
+ ```json { "pack": { @@ -15,22 +15,36 @@ } ``` -### Demo namespace +
+ +### demo - `@function(strip_final_newline) demo:hello` +
+ ```mcfunction say hello ``` +
+ - `@function(strip_final_newline) demo:foo` +
+ ```mcfunction say foo ``` +
+ - `@function(strip_final_newline) demo:bar` +
+ ```mcfunction say bar ``` + +
From bf713e46e960fff834c567a8ab45e946e090afb4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 24 Feb 2021 03:20:46 +0000 Subject: [PATCH 0059/1554] 0.3.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 3b6ae40ba..c263ecf8d 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.1 (2021-02-24) +### Fix +* Markdown snapshots now use foldable sections ([`76359e0`](https://github.com/mcbeet/lectern/commit/76359e005ff0f833e0e3a134e78f15089a6dd3ba)) + ## v0.3.0 (2021-02-24) ### Feature * Handle folded sections ([`9f611e5`](https://github.com/mcbeet/lectern/commit/9f611e57e766ba3e78bf7a15392fc4ab0e97650a)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index fbe5942e4..7603dd34c 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.3.0" +__version__ = "0.3.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index fac8c6adb..b5db70b56 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.3.0" +version = "0.3.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From cafcf37f7c8ffb7f8a8721eee1732bfe45ec420c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 24 Feb 2021 04:53:10 +0000 Subject: [PATCH 0060/1554] chore(deps-dev): bump pyright from 1.1.113 to 1.1.114 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.113 to 1.1.114. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.114/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 7f268e6dc..26074ec66 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.113", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.113.tgz", - "integrity": "sha512-VcitW5t5lG1KY0w8xY/ubMhFZZ2lfXJvhBW4TfTwy067R4WtXKSa23br4to1pdRA1rwpxOREgxVTnOWmf3YkYg==", + "version": "1.1.114", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.114.tgz", + "integrity": "sha512-1AkbLJrBMxRya2zW07GSz0Hej/loAw/0+bx1vQOBmyS0LMPdZQSYw4X589xK4bXaxMYoMA+CsyEsGFs0eYbFaQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 0164a75b8..cdc9307d6 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.113" + "pyright": "^1.1.114" } } From 248c3e74d7ffe11ad17f28768d43b9e1d651e497 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 24 Feb 2021 04:54:39 +0000 Subject: [PATCH 0061/1554] chore(deps): bump beet from 0.9.3 to 0.9.4 Bumps [beet](https://github.com/mcbeet/beet) from 0.9.3 to 0.9.4. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.9.3...v0.9.4) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4b36e5629..66005478b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.9.3" +version = "0.9.4" description = "The Minecraft pack development kit" category = "main" optional = false @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.9.3-py3-none-any.whl", hash = "sha256:16bd67714d7c04ae27690e651db9344e8bae31bb2b6bb6f77b6dacc2160cd751"}, - {file = "beet-0.9.3.tar.gz", hash = "sha256:b8f85c6b84f1f194fac6e9acf7fe4d2d8182bfa523fb8930bf8d6873b735a3ff"}, + {file = "beet-0.9.4-py3-none-any.whl", hash = "sha256:25e21bc7b8cd1784a217855c3c56db29473d662378d2dde95d9af0006b400dc7"}, + {file = "beet-0.9.4.tar.gz", hash = "sha256:b3b92897e4fa6053f6c8e60194b5f234ed961d82d48c3dde8354739efb42dcdc"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, From 733e248607b120eece4c4cb181e7f8fa16f4a5a3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 03:51:06 +0100 Subject: [PATCH 0062/1554] fix: patch markdown_it to allow arbitrary data urls https://github.com/executablebooks/markdown-it-py/issues/128 --- packages/lectern/lectern/extract.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index ba5a27ca9..bef4f30b1 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -13,11 +13,16 @@ from beet import DataPack, ResourcePack from beet.core.utils import FileSystemPath from markdown_it import MarkdownIt +from markdown_it.common import normalize_url from markdown_it.token import Token from .directive import Directive from .fragment import Fragment +# Patch markdown_it to allow arbitrary data urls +# https://github.com/executablebooks/markdown-it-py/issues/128 +normalize_url.GOOD_DATA_RE = re.compile(r"^data:") + class Extractor: """Base class for extractors.""" From 7b7d00b1da1056d66c5b517db7f846dc55cc8963 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 03:55:23 +0100 Subject: [PATCH 0063/1554] chore: update beet --- packages/lectern/poetry.lock | 31 ++++--------------------------- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 28 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 71c655d65..0daa483e7 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.9.4" +version = "0.10.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -746,7 +746,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0f0247dc786a688b5b57c48a4c68ab35b011b4fefcd29bdf085e9bb000ebb82b" +content-hash = "8e6658c61f47195f5f6e57863183ab1a4ceb3b0bc503e2e3535731db8cd0dd80" [metadata.files] appdirs = [ @@ -762,8 +762,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.9.4-py3-none-any.whl", hash = "sha256:25e21bc7b8cd1784a217855c3c56db29473d662378d2dde95d9af0006b400dc7"}, - {file = "beet-0.9.4.tar.gz", hash = "sha256:b3b92897e4fa6053f6c8e60194b5f234ed961d82d48c3dde8354739efb42dcdc"}, + {file = "beet-0.10.0-py3-none-any.whl", hash = "sha256:33e1fc4ea2567e81a676e03ee7a9decf57e63be555ecd0adbad9e7caa8567086"}, + {file = "beet-0.10.0.tar.gz", hash = "sha256:0bcbd89ce037393ff92303b055307b09fde8216eab3ca3ddf3abb5d15914b4e6"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -843,10 +843,6 @@ cryptography = [ {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"}, {file = "cryptography-3.4.6-cp36-abi3-win32.whl", hash = "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2"}, {file = "cryptography-3.4.6-cp36-abi3-win_amd64.whl", hash = "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0"}, - {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b"}, - {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df"}, - {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336"}, - {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724"}, {file = "cryptography-3.4.6.tar.gz", hash = "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87"}, ] docutils = [ @@ -916,39 +912,20 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mdit-py-plugins = [ diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index b5db70b56..0efc3441d 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.9.3" +beet = "^0.10.0" markdown-it-py = "^0.6.2" click = "^7.1.2" From 4a0d7b042bc0f7d4756500ff8cff8d875bb07279 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Feb 2021 02:56:39 +0000 Subject: [PATCH 0064/1554] 0.3.2 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index c263ecf8d..4afc9f836 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.2 (2021-02-25) +### Fix +* Patch markdown_it to allow arbitrary data urls ([`bb5c05d`](https://github.com/mcbeet/lectern/commit/bb5c05df7d30e144d014fcaef36c84a802b7c51a)) + ## v0.3.1 (2021-02-24) ### Fix * Markdown snapshots now use foldable sections ([`76359e0`](https://github.com/mcbeet/lectern/commit/76359e005ff0f833e0e3a134e78f15089a6dd3ba)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 7603dd34c..ab292e8e6 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.3.1" +__version__ = "0.3.2" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 0efc3441d..d00c3642b 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.3.1" +version = "0.3.2" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From d821bf1447637303671f0f25200167a70ad13b45 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Feb 2021 05:01:41 +0000 Subject: [PATCH 0065/1554] chore(deps): bump beet from 0.9.4 to 0.10.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.9.4 to 0.10.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.9.4...v0.10.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 66005478b..0c3801964 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.9.4" +version = "0.10.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e72a06b19de77323537db9155a19cfdfb1912d1c498a0c7bce12746584565cc6" +content-hash = "f19b28faaf31ad3ae7bd588b25bd4e94d89671334144acf02d1c7b1e106b795f" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.9.4-py3-none-any.whl", hash = "sha256:25e21bc7b8cd1784a217855c3c56db29473d662378d2dde95d9af0006b400dc7"}, - {file = "beet-0.9.4.tar.gz", hash = "sha256:b3b92897e4fa6053f6c8e60194b5f234ed961d82d48c3dde8354739efb42dcdc"}, + {file = "beet-0.10.1-py3-none-any.whl", hash = "sha256:062843c9b9b06e4700ebc8dbc9beca7d4fde962a2b9f307c4092cc3ea8bb166e"}, + {file = "beet-0.10.1.tar.gz", hash = "sha256:22b93cf755c922c983754c3be7d7b6607dc2727d125866e9cb3a376ddde1d2c5"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 82a122fef..1045b4502 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.10.0" +beet = ">=0.5.1,<0.11.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 304a6bf622d5e5420d4bbb2685c75edf4f5ba13b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Feb 2021 05:02:28 +0000 Subject: [PATCH 0066/1554] chore(deps-dev): bump pyright from 1.1.114 to 1.1.115 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.114 to 1.1.115. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.115/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 26074ec66..0b33998cd 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.114", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.114.tgz", - "integrity": "sha512-1AkbLJrBMxRya2zW07GSz0Hej/loAw/0+bx1vQOBmyS0LMPdZQSYw4X589xK4bXaxMYoMA+CsyEsGFs0eYbFaQ==", + "version": "1.1.115", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.115.tgz", + "integrity": "sha512-MFi3Q7agfL1MRTkBTkqitfS1FIwPFZ8viB7f2w4GySBKOXQJSC66iRdXnWmLqkrUi3hSHefu/rt4ul1/8YyTeA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index cdc9307d6..5899ca1f3 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.114" + "pyright": "^1.1.115" } } From 566c93b0ab4f7b8cbffa2d3650e31ff5c61f65eb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 04:21:36 +0100 Subject: [PATCH 0067/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 0daa483e7..4def72089 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.0" +version = "0.10.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -746,7 +746,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "8e6658c61f47195f5f6e57863183ab1a4ceb3b0bc503e2e3535731db8cd0dd80" +content-hash = "3ed5180dece5c94e9ddeff2b17cd15592358e9a14b7e1c2bf47849671c120302" [metadata.files] appdirs = [ @@ -762,8 +762,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.0-py3-none-any.whl", hash = "sha256:33e1fc4ea2567e81a676e03ee7a9decf57e63be555ecd0adbad9e7caa8567086"}, - {file = "beet-0.10.0.tar.gz", hash = "sha256:0bcbd89ce037393ff92303b055307b09fde8216eab3ca3ddf3abb5d15914b4e6"}, + {file = "beet-0.10.2-py3-none-any.whl", hash = "sha256:bdb73bc45eb6759690a853faa9ce350ca297fc4395e5f9e748805d0da2acff4a"}, + {file = "beet-0.10.2.tar.gz", hash = "sha256:ae22aebce748c891b9f4c2b7d24409a409184142b89a1dae43040348a217b6e3"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index d00c3642b..52e16904d 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.10.0" +beet = "^0.10.2" markdown-it-py = "^0.6.2" click = "^7.1.2" From f19024bbec618c98cd1692e3b0d07521f5e4f0c2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 10:22:16 +0100 Subject: [PATCH 0068/1554] chore: update pyright --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index bc091be0e..d07ab2b19 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.114" + "pyright": "^1.1.115" } }, "node_modules/pyright": { - "version": "1.1.114", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.114.tgz", - "integrity": "sha512-1AkbLJrBMxRya2zW07GSz0Hej/loAw/0+bx1vQOBmyS0LMPdZQSYw4X589xK4bXaxMYoMA+CsyEsGFs0eYbFaQ==", + "version": "1.1.115", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.115.tgz", + "integrity": "sha512-MFi3Q7agfL1MRTkBTkqitfS1FIwPFZ8viB7f2w4GySBKOXQJSC66iRdXnWmLqkrUi3hSHefu/rt4ul1/8YyTeA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.114", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.114.tgz", - "integrity": "sha512-1AkbLJrBMxRya2zW07GSz0Hej/loAw/0+bx1vQOBmyS0LMPdZQSYw4X589xK4bXaxMYoMA+CsyEsGFs0eYbFaQ==", + "version": "1.1.115", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.115.tgz", + "integrity": "sha512-MFi3Q7agfL1MRTkBTkqitfS1FIwPFZ8viB7f2w4GySBKOXQJSC66iRdXnWmLqkrUi3hSHefu/rt4ul1/8YyTeA==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index cdc9307d6..5899ca1f3 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.114" + "pyright": "^1.1.115" } } From e8b62ea53860426402c2a2f661adc47bd623a14d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 10:22:43 +0100 Subject: [PATCH 0069/1554] chore: update deps --- packages/lectern/poetry.lock | 37 ++++++++++++++++++++++++++------- packages/lectern/pyproject.toml | 4 ++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 4def72089..a17d927b5 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.2" +version = "0.10.4" description = "The Minecraft pack development kit" category = "main" optional = false @@ -474,7 +474,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-insta" -version = "0.1.5" +version = "0.1.6" description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false @@ -746,7 +746,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "3ed5180dece5c94e9ddeff2b17cd15592358e9a14b7e1c2bf47849671c120302" +content-hash = "229242e6cf8d040e7a205be5ecd195cb9e5455ede403fadbe08f2c2b34cc51b2" [metadata.files] appdirs = [ @@ -762,8 +762,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.2-py3-none-any.whl", hash = "sha256:bdb73bc45eb6759690a853faa9ce350ca297fc4395e5f9e748805d0da2acff4a"}, - {file = "beet-0.10.2.tar.gz", hash = "sha256:ae22aebce748c891b9f4c2b7d24409a409184142b89a1dae43040348a217b6e3"}, + {file = "beet-0.10.4-py3-none-any.whl", hash = "sha256:050183e8cab582cc14511e105cebde1eb275b0e36806909073f15e7db9fed90f"}, + {file = "beet-0.10.4.tar.gz", hash = "sha256:80c49374b0d836f4036b699b3b35d1e45f984fcadfb9c97024df903afa36f3e6"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -843,6 +843,10 @@ cryptography = [ {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"}, {file = "cryptography-3.4.6-cp36-abi3-win32.whl", hash = "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2"}, {file = "cryptography-3.4.6-cp36-abi3-win_amd64.whl", hash = "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0"}, + {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b"}, + {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df"}, + {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336"}, + {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724"}, {file = "cryptography-3.4.6.tar.gz", hash = "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87"}, ] docutils = [ @@ -912,20 +916,39 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mdit-py-plugins = [ @@ -1061,8 +1084,8 @@ pytest = [ {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, ] pytest-insta = [ - {file = "pytest-insta-0.1.5.tar.gz", hash = "sha256:eef19de353aed704754a34feed286b711e6cdc24f258be017aed09840da59a09"}, - {file = "pytest_insta-0.1.5-py3-none-any.whl", hash = "sha256:4f49f6c49a1e14780df6505aab31fd3f13df0ae8cb6b4e35545d02d4b267904f"}, + {file = "pytest-insta-0.1.6.tar.gz", hash = "sha256:68d9cbcd38f94873c91ee670d3f6a9c1a6a05f0f0c7c07a6daab02b53761cef4"}, + {file = "pytest_insta-0.1.6-py3-none-any.whl", hash = "sha256:dd6b037d8a74afdfbece5abd4c9afd0259777c31faed6f0db15363561c93713a"}, ] python-gitlab = [ {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 52e16904d..84de05e6d 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.10.2" +beet = "^0.10.4" markdown-it-py = "^0.6.2" click = "^7.1.2" @@ -35,7 +35,7 @@ rope = "^0.18.0" pytest = "^6.2.2" isort = "^5.7.0" python-semantic-release = "^7.15.0" -pytest-insta = "^0.1.5" +pytest-insta = "^0.1.6" [tool.poetry.scripts] lectern = "lectern.cli:main" From f2fd1a8cb1a0de293cebea6f3db22197ba7c5e82 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 10:48:43 +0100 Subject: [PATCH 0070/1554] feat: add link fragments --- packages/lectern/README.md | 10 +- packages/lectern/examples/empty_functions.txt | 12 + packages/lectern/examples/with_beet/README.md | 20 ++ packages/lectern/examples/with_beet/beet.json | 9 + .../examples/with_beet/custom_directive.py | 15 + packages/lectern/examples/with_beet/hello.md | 10 + .../lectern/examples/with_beet/plugin1.py | 5 + .../lectern/examples/with_beet/plugin2.py | 5 + .../examples/with_links/glyph_sizes.bin | Bin 0 -> 65536 bytes .../examples/with_links/igloo/bottom.nbt | Bin 0 -> 2794 bytes .../examples/with_links/igloo/middle.nbt | Bin 0 -> 236 bytes .../lectern/examples/with_links/igloo/top.nbt | Bin 0 -> 901 bytes .../lectern/examples/with_links/lectern.png | Bin 0 -> 13516 bytes .../examples/with_links/lots_of_textures.md | 27 ++ .../examples/with_links/pack_icon_link.md | 3 + .../examples/with_links/pack_local_icon.md | 3 + .../examples/with_links/structure_files.md | 5 + .../with_links/textures/green_concrete.png | Bin 0 -> 219 bytes .../textures/green_concrete_powder.png | Bin 0 -> 615 bytes .../textures/green_glazed_terracotta.png | Bin 0 -> 363 bytes .../with_links/textures/green_shulker_box.png | Bin 0 -> 325 bytes .../textures/green_stained_glass.png | Bin 0 -> 105 bytes .../textures/green_stained_glass_pane_top.png | Bin 0 -> 119 bytes .../with_links/textures/green_terracotta.png | Bin 0 -> 394 bytes .../with_links/textures/green_wool.png | Bin 0 -> 454 bytes .../with_links/textures/grindstone_pivot.png | Bin 0 -> 141 bytes .../with_links/textures/grindstone_round.png | Bin 0 -> 186 bytes .../with_links/textures/grindstone_side.png | Bin 0 -> 206 bytes .../with_links/textures/hay_block_side.png | Bin 0 -> 274 bytes .../with_links/textures/hay_block_top.png | Bin 0 -> 267 bytes .../textures/honey_block_bottom.png | Bin 0 -> 268 bytes .../with_links/textures/honey_block_side.png | Bin 0 -> 271 bytes .../with_links/textures/honey_block_top.png | Bin 0 -> 273 bytes .../with_links/textures/honeycomb_block.png | Bin 0 -> 264 bytes .../with_links/textures/hopper_inside.png | Bin 0 -> 195 bytes .../with_links/textures/hopper_outside.png | Bin 0 -> 220 bytes .../with_links/textures/hopper_top.png | Bin 0 -> 155 bytes .../with_links/textures/horn_coral.png | Bin 0 -> 232 bytes .../with_links/textures/horn_coral_block.png | Bin 0 -> 278 bytes .../with_links/textures/horn_coral_fan.png | Bin 0 -> 207 bytes .../examples/with_links/textures/ice.png | Bin 0 -> 249 bytes .../with_links/textures/iron_bars.png | Bin 0 -> 204 bytes .../with_links/vanilla_font_data_url.md | 272 ++++++++++++++++++ .../examples/with_links/vanilla_font_local.md | 272 ++++++++++++++++++ packages/lectern/lectern/cli.py | 27 +- packages/lectern/lectern/directive.py | 45 ++- packages/lectern/lectern/document.py | 98 +++++-- packages/lectern/lectern/extract.py | 191 +++++++++--- packages/lectern/lectern/fragment.py | 56 +++- packages/lectern/lectern/plugin.py | 16 +- packages/lectern/lectern/pytest_plugin.py | 11 +- packages/lectern/lectern/serialize.py | 76 +++-- .../examples__beet_project__0.pack.md | 140 +++++++++ .../README.md | 140 +++++++++ .../pack.png | Bin 0 -> 4638 bytes ...> examples__markdown_README_md__0.pack.md} | 0 ...__markdown_examples_basic1_txt__0.pack.md} | 0 ...__markdown_examples_basic2_txt__0.pack.md} | 0 ...__markdown_examples_basic3_txt__0.pack.md} | 0 ...own_examples_code_fragments_md__0.pack.md} | 0 ..._markdown_examples_combined_md__0.pack.md} | 0 ..._markdown_examples_compact_txt__0.pack.md} | 0 ...wn_examples_empty_functions_txt__0.pack.md | 50 ++++ ...own_examples_empty_markdown_md__0.pack.md} | 0 ...rkdown_examples_empty_text_txt__0.pack.md} | 0 ...wn_examples_folded_sections_md__0.pack.md} | 0 ...own_examples_readme_example_md__0.pack.md} | 0 ...amples_strip_final_newline_txt__0.pack.md} | 0 ..._with_links_lots_of_textures_md__0.pack.md | 70 +++++ ...es_with_links_pack_icon_link_md__0.pack.md | 20 ++ ...s_with_links_pack_local_icon_md__0.pack.md | 20 ++ ...s_with_links_structure_files_md__0.pack.md | 26 ++ ..._links_vanilla_font_data_url_md__0.pack.md | 272 ++++++++++++++++++ ...ith_links_vanilla_font_local_md__0.pack.md | 272 ++++++++++++++++++ .../README.md | 107 +++++++ .../README.md | 70 +++++ .../green_concrete.png | Bin 0 -> 219 bytes .../green_concrete_powder.png | Bin 0 -> 615 bytes .../green_glazed_terracotta.png | Bin 0 -> 363 bytes .../green_shulker_box.png | Bin 0 -> 325 bytes .../green_stained_glass.png | Bin 0 -> 105 bytes .../green_stained_glass_pane_top.png | Bin 0 -> 119 bytes .../green_terracotta.png | Bin 0 -> 394 bytes .../green_wool.png | Bin 0 -> 454 bytes .../grindstone_pivot.png | Bin 0 -> 141 bytes .../grindstone_round.png | Bin 0 -> 186 bytes .../grindstone_side.png | Bin 0 -> 206 bytes .../hay_block_side.png | Bin 0 -> 274 bytes .../hay_block_top.png | Bin 0 -> 267 bytes .../honey_block_bottom.png | Bin 0 -> 268 bytes .../honey_block_side.png | Bin 0 -> 271 bytes .../honey_block_top.png | Bin 0 -> 273 bytes .../honeycomb_block.png | Bin 0 -> 264 bytes .../hopper_inside.png | Bin 0 -> 195 bytes .../hopper_outside.png | Bin 0 -> 220 bytes .../hopper_top.png | Bin 0 -> 155 bytes .../horn_coral.png | Bin 0 -> 232 bytes .../horn_coral_block.png | Bin 0 -> 278 bytes .../horn_coral_fan.png | Bin 0 -> 207 bytes .../ice.png | Bin 0 -> 249 bytes .../iron_bars.png | Bin 0 -> 204 bytes .../README.md | 20 ++ .../pack.png | Bin 0 -> 4638 bytes .../README.md | 20 ++ .../pack.png | Bin 0 -> 13516 bytes .../README.md | 26 ++ .../bottom.nbt | Bin 0 -> 2794 bytes .../middle.nbt | Bin 0 -> 236 bytes .../top.nbt | Bin 0 -> 901 bytes .../README.md | 272 ++++++++++++++++++ .../glyph_sizes.bin | Bin 0 -> 65536 bytes .../README.md | 272 ++++++++++++++++++ .../glyph_sizes.bin | Bin 0 -> 65536 bytes .../examples__text_README_md__0.pack.txt | 57 ---- ...t_examples_empty_functions_txt__0.pack.txt | 13 + packages/lectern/tests/test_directive.py | 16 +- packages/lectern/tests/test_document.py | 6 +- packages/lectern/tests/test_examples.py | 37 ++- 118 files changed, 2906 insertions(+), 208 deletions(-) create mode 100644 packages/lectern/examples/empty_functions.txt create mode 100644 packages/lectern/examples/with_beet/README.md create mode 100644 packages/lectern/examples/with_beet/beet.json create mode 100644 packages/lectern/examples/with_beet/custom_directive.py create mode 100644 packages/lectern/examples/with_beet/hello.md create mode 100644 packages/lectern/examples/with_beet/plugin1.py create mode 100644 packages/lectern/examples/with_beet/plugin2.py create mode 100644 packages/lectern/examples/with_links/glyph_sizes.bin create mode 100644 packages/lectern/examples/with_links/igloo/bottom.nbt create mode 100644 packages/lectern/examples/with_links/igloo/middle.nbt create mode 100644 packages/lectern/examples/with_links/igloo/top.nbt create mode 100755 packages/lectern/examples/with_links/lectern.png create mode 100644 packages/lectern/examples/with_links/lots_of_textures.md create mode 100644 packages/lectern/examples/with_links/pack_icon_link.md create mode 100644 packages/lectern/examples/with_links/pack_local_icon.md create mode 100644 packages/lectern/examples/with_links/structure_files.md create mode 100644 packages/lectern/examples/with_links/textures/green_concrete.png create mode 100644 packages/lectern/examples/with_links/textures/green_concrete_powder.png create mode 100644 packages/lectern/examples/with_links/textures/green_glazed_terracotta.png create mode 100644 packages/lectern/examples/with_links/textures/green_shulker_box.png create mode 100644 packages/lectern/examples/with_links/textures/green_stained_glass.png create mode 100644 packages/lectern/examples/with_links/textures/green_stained_glass_pane_top.png create mode 100644 packages/lectern/examples/with_links/textures/green_terracotta.png create mode 100644 packages/lectern/examples/with_links/textures/green_wool.png create mode 100644 packages/lectern/examples/with_links/textures/grindstone_pivot.png create mode 100644 packages/lectern/examples/with_links/textures/grindstone_round.png create mode 100644 packages/lectern/examples/with_links/textures/grindstone_side.png create mode 100644 packages/lectern/examples/with_links/textures/hay_block_side.png create mode 100644 packages/lectern/examples/with_links/textures/hay_block_top.png create mode 100644 packages/lectern/examples/with_links/textures/honey_block_bottom.png create mode 100644 packages/lectern/examples/with_links/textures/honey_block_side.png create mode 100644 packages/lectern/examples/with_links/textures/honey_block_top.png create mode 100644 packages/lectern/examples/with_links/textures/honeycomb_block.png create mode 100644 packages/lectern/examples/with_links/textures/hopper_inside.png create mode 100644 packages/lectern/examples/with_links/textures/hopper_outside.png create mode 100644 packages/lectern/examples/with_links/textures/hopper_top.png create mode 100644 packages/lectern/examples/with_links/textures/horn_coral.png create mode 100644 packages/lectern/examples/with_links/textures/horn_coral_block.png create mode 100644 packages/lectern/examples/with_links/textures/horn_coral_fan.png create mode 100644 packages/lectern/examples/with_links/textures/ice.png create mode 100644 packages/lectern/examples/with_links/textures/iron_bars.png create mode 100644 packages/lectern/examples/with_links/vanilla_font_data_url.md create mode 100644 packages/lectern/examples/with_links/vanilla_font_local.md create mode 100644 packages/lectern/tests/snapshots/examples__beet_project__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/pack.png rename packages/lectern/tests/snapshots/{examples__markdown_README_md__0.pack.md/README.md => examples__markdown_README_md__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_basic1_txt__0.pack.md/README.md => examples__markdown_examples_basic1_txt__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_basic2_txt__0.pack.md/README.md => examples__markdown_examples_basic2_txt__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_basic3_txt__0.pack.md/README.md => examples__markdown_examples_basic3_txt__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_code_fragments_md__0.pack.md/README.md => examples__markdown_examples_code_fragments_md__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_combined_md__0.pack.md/README.md => examples__markdown_examples_combined_md__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_compact_txt__0.pack.md/README.md => examples__markdown_examples_compact_txt__0.pack.md} (100%) create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md rename packages/lectern/tests/snapshots/{examples__markdown_examples_empty_markdown_md__0.pack.md/README.md => examples__markdown_examples_empty_markdown_md__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_empty_text_txt__0.pack.md/README.md => examples__markdown_examples_empty_text_txt__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_folded_sections_md__0.pack.md/README.md => examples__markdown_examples_folded_sections_md__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_readme_example_md__0.pack.md/README.md => examples__markdown_examples_readme_example_md__0.pack.md} (100%) rename packages/lectern/tests/snapshots/{examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md => examples__markdown_examples_strip_final_newline_txt__0.pack.md} (100%) create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_concrete.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_concrete_powder.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_glazed_terracotta.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_shulker_box.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_stained_glass.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_stained_glass_pane_top.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_terracotta.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_wool.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_pivot.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_round.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_side.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hay_block_side.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hay_block_top.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_bottom.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_side.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_top.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honeycomb_block.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hopper_inside.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hopper_outside.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hopper_top.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/horn_coral.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/horn_coral_block.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/horn_coral_fan.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/ice.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/iron_bars.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/pack.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/pack.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/bottom.nbt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/middle.nbt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/top.nbt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/glyph_sizes.bin create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/glyph_sizes.bin delete mode 100644 packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 02aa6f72b..52f106830 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -229,11 +229,11 @@ Usage: lectern [OPTIONS] [PATH]... Literate Minecraft data packs and resource packs. Options: - -d, --data-pack Extract data pack. - -r, --resource-pack Extract resource pack. - -o, --output-files Output the associated files. - -v, --version Show the version and exit. - -h, --help Show this message and exit. + -d, --data-pack Extract data pack. + -r, --resource-pack Extract resource pack. + -e, --external-files Emit external files. + -v, --version Show the version and exit. + -h, --help Show this message and exit. ``` You can extract data packs from markdown files with the `-d/--data-pack` option. If the name ends with `.zip` the generated data pack will be zipped. Multiple markdown files can be merged together into a single data pack. diff --git a/packages/lectern/examples/empty_functions.txt b/packages/lectern/examples/empty_functions.txt new file mode 100644 index 000000000..a5464f4b2 --- /dev/null +++ b/packages/lectern/examples/empty_functions.txt @@ -0,0 +1,12 @@ +@function demo:foo +@function demo:bar +@skip + + +This is ignored + + +@function demo:thing +@skip + +Same here diff --git a/packages/lectern/examples/with_beet/README.md b/packages/lectern/examples/with_beet/README.md new file mode 100644 index 000000000..e1613b208 --- /dev/null +++ b/packages/lectern/examples/with_beet/README.md @@ -0,0 +1,20 @@ +# This file is part of a beet project + +The @require directive calls `ctx.require()` and allows you to load arbitrary plugins. + +> `@require plugin1` +> +> `@require plugin2` + +The @skip directive does nothing, but it can be useful with the plain text embedded syntax to skip certain sections. + +```mcfunction +# @function embedded:foo +say foo +# @skip +This won't be included anywhere +# @function embedded:bar +say bar +``` + +Check out the [next file](hello.md) we're going to try our custom directive. diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json new file mode 100644 index 000000000..628507524 --- /dev/null +++ b/packages/lectern/examples/with_beet/beet.json @@ -0,0 +1,9 @@ +{ + "require": ["custom_directive"], + "pipeline": ["lectern"], + "meta": { + "lectern": { + "load": ["*.md"] + } + } +} diff --git a/packages/lectern/examples/with_beet/custom_directive.py b/packages/lectern/examples/with_beet/custom_directive.py new file mode 100644 index 000000000..c60c94bd5 --- /dev/null +++ b/packages/lectern/examples/with_beet/custom_directive.py @@ -0,0 +1,15 @@ +from beet import Context, DataPack, ResourcePack +from beet.library.data_pack import Function + +from lectern import Document, Fragment + + +def beet_default(ctx: Context): + ctx.inject(Document).directives["custom_directive"] = custom_directive + + +def custom_directive(fragment: Fragment, assets: ResourcePack, data: DataPack): + function_name, num1, num2 = fragment.expect("function_name", "num1", "num2") + function = fragment.as_file(Function) + function.lines *= int(num1) + int(num2) + data[function_name] = function diff --git a/packages/lectern/examples/with_beet/hello.md b/packages/lectern/examples/with_beet/hello.md new file mode 100644 index 000000000..5b93e88da --- /dev/null +++ b/packages/lectern/examples/with_beet/hello.md @@ -0,0 +1,10 @@ +# Let's try out the custom directive + +`@custom_directive custom:hello 10 14` + +```mcfunction +say hello +say bye +``` + +[`@resource_pack pack.png`](https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f8/Lectern_JE2_BE1.png) diff --git a/packages/lectern/examples/with_beet/plugin1.py b/packages/lectern/examples/with_beet/plugin1.py new file mode 100644 index 000000000..a55e3bdb8 --- /dev/null +++ b/packages/lectern/examples/with_beet/plugin1.py @@ -0,0 +1,5 @@ +from beet import Context, Function + + +def beet_default(ctx: Context): + ctx.data["demo:foo"] = Function(["say foo"]) diff --git a/packages/lectern/examples/with_beet/plugin2.py b/packages/lectern/examples/with_beet/plugin2.py new file mode 100644 index 000000000..1388f8a2f --- /dev/null +++ b/packages/lectern/examples/with_beet/plugin2.py @@ -0,0 +1,5 @@ +from beet import Context, Function + + +def beet_default(ctx: Context): + ctx.data["demo:bar"] = Function(["say bar"]) diff --git a/packages/lectern/examples/with_links/glyph_sizes.bin b/packages/lectern/examples/with_links/glyph_sizes.bin new file mode 100644 index 0000000000000000000000000000000000000000..69c857e36c2019c5b0b682c50d23dbc2755d0335 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/igloo/bottom.nbt b/packages/lectern/examples/with_links/igloo/bottom.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1885cd3b0fdc8bc3e6ff9b40dfc168474b6a9fa7 GIT binary patch literal 2794 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 literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/igloo/middle.nbt b/packages/lectern/examples/with_links/igloo/middle.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e3a16e1e0f72522d20b77aa437bfa32dad701e54 GIT binary patch literal 236 zcmVfyJhrH&kTRS{Rj8AY z@b$${MrEjg(f=^IzzbKcwLGdIk1EKs=7r3ycqHmEk$cnwxx@{&19jGq msC|g?i7fealXTSg9OqQKHxk-&Og4DHyx;;)LB7@G0ssI$fptUx literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/igloo/top.nbt b/packages/lectern/examples/with_links/igloo/top.nbt new file mode 100644 index 0000000000000000000000000000000000000000..86a909291ae43ab4dddbee95e35c99e3f81f2184 GIT binary patch literal 901 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/lots_of_textures.md b/packages/lectern/examples/with_links/lots_of_textures.md new file mode 100644 index 000000000..2225afaa9 --- /dev/null +++ b/packages/lectern/examples/with_links/lots_of_textures.md @@ -0,0 +1,27 @@ +# Resource pack with textures + +- [`@texture minecraft:block/green_concrete_powder`](textures/green_concrete_powder.png) +- [`@texture minecraft:block/green_concrete`](textures/green_concrete.png) +- [`@texture minecraft:block/green_glazed_terracotta`](textures/green_glazed_terracotta.png) +- [`@texture minecraft:block/green_shulker_box`](textures/green_shulker_box.png) +- [`@texture minecraft:block/green_stained_glass_pane_top`](textures/green_stained_glass_pane_top.png) +- [`@texture minecraft:block/green_stained_glass`](textures/green_stained_glass.png) +- [`@texture minecraft:block/green_terracotta`](textures/green_terracotta.png) +- [`@texture minecraft:block/green_wool`](textures/../textures/green_wool.png) +- [`@texture minecraft:block/grindstone_pivot`](textures/grindstone_pivot.png) +- [`@texture minecraft:block/grindstone_round`](textures/grindstone_round.png) +- [`@texture minecraft:block/grindstone_side`](textures/grindstone_side.png) +- [`@texture minecraft:block/hay_block_side`](textures/hay_block_side.png) +- [`@texture minecraft:block/hay_block_top`](../with_links/textures/hay_block_top.png) +- [`@texture minecraft:block/honey_block_bottom`](textures/honey_block_bottom.png) +- [`@texture minecraft:block/honey_block_side`](textures/honey_block_side.png) +- [`@texture minecraft:block/honey_block_top`](textures/honey_block_top.png) +- [`@texture minecraft:block/honeycomb_block`](textures/honeycomb_block.png) +- [`@texture minecraft:block/hopper_inside`](textures/hopper_inside.png) +- [`@texture minecraft:block/hopper_outside`](textures/hopper_outside.png) +- [`@texture minecraft:block/hopper_top`](textures/hopper_top.png) +- [`@texture minecraft:block/horn_coral_block`](textures/horn_coral_block.png) +- [`@texture minecraft:block/horn_coral_fan`](textures/horn_coral_fan.png) +- [`@texture minecraft:block/horn_coral`](textures/horn_coral.png) +- [`@texture minecraft:block/ice`](textures/../../with_links/textures/ice.png) +- [`@texture minecraft:block/iron_bars`](textures/iron_bars.png) diff --git a/packages/lectern/examples/with_links/pack_icon_link.md b/packages/lectern/examples/with_links/pack_icon_link.md new file mode 100644 index 000000000..54b9c2273 --- /dev/null +++ b/packages/lectern/examples/with_links/pack_icon_link.md @@ -0,0 +1,3 @@ +# Data pack with icon + +[`@data_pack pack.png`](https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f8/Lectern_JE2_BE1.png) diff --git a/packages/lectern/examples/with_links/pack_local_icon.md b/packages/lectern/examples/with_links/pack_local_icon.md new file mode 100644 index 000000000..078c711a6 --- /dev/null +++ b/packages/lectern/examples/with_links/pack_local_icon.md @@ -0,0 +1,3 @@ +# Data pack with local icon + +[`@data_pack pack.png`](lectern.png) diff --git a/packages/lectern/examples/with_links/structure_files.md b/packages/lectern/examples/with_links/structure_files.md new file mode 100644 index 000000000..11438c877 --- /dev/null +++ b/packages/lectern/examples/with_links/structure_files.md @@ -0,0 +1,5 @@ +# Data pack with structure files + +- [`@structure minecraft:igloo/bottom`](igloo/bottom.nbt) +- [`@structure minecraft:igloo/middle`](igloo/middle.nbt) +- [`@structure minecraft:igloo/top`](igloo/top.nbt) diff --git a/packages/lectern/examples/with_links/textures/green_concrete.png b/packages/lectern/examples/with_links/textures/green_concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..871889831e3bb02dd6bb5008e78299a03852c9f2 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|i#%N%Lp08pPCPAmK!L+$yM&YO zBq4*p*C#Ts*wJS!BVqS0x}~(UVt@K++sT4bx-R<57F(ISe_Y8qt2omqd+m0SkdWA< zYWuA@7HdW=|D_IVgU(ckM6pOFKIwb^NN-I+`Th?Fc#a!g zeDp5p=G5-ell`k1*53PWA-h6QKUA*h(6aOYvwqjjoBFIH>vI6Zmu1G$*PgPcMV_=< TcDnN#(6tPnu6{1-oD!M<+BjIr literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/green_concrete_powder.png b/packages/lectern/examples/with_links/textures/green_concrete_powder.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c78ec9469ec5696939ae9d6671691db1bcd02e GIT binary patch literal 615 zcmV-t0+{`YP))>3KcC)(y4=H+K-;=K0mLYs*V*>pR$-@0xk}c}aE75iKbm$*%X<)^2wP=C zn7ym#+A22Zh5#!PIshrz#b|CXMT*thv}4w)DN)5ui)d}5;Hnjt%V4b+X+?DOy-z3C zOr;dA0t%e-q*XkxoFMdk9&nwc3v=jrxi{A?>7wqIG1CB;6rv*3 z+6?=#)csTAK4U&8B_fkb<#TOQtn<4C4d;=j*DTpdq4m*Due-5??ZAF0^IMr- zF0K`k5GY6ItTu*>gHkU=^2cAt^6<=+{{H7hs%tu&f7A3Mo*R({uFMQ9e6F^ilwevO z>N<2hSQ}&0p#(}d(eZ4%aZfRnQcM$%`)J$55S8*Z`tfzP9xz|fPDx?C|5upHHV3Y? zAH8#A90F^pCLc~w0k-p7hdJqe)=j8Qi`D}XOy5(Gz zy-EX75QXnkthMF`d!Hd-DjNx?ASA_NkxEDt1WA|1GF2KoeU}7GQY5eA7ry1J2*d83 zx#!HBnLDL^zrl9L6E=M6VmW_&Jz%fv?(DO-`Pmc1Eui_~5W1W6?_aJ%7>q8T-zo_6 z?|!|!5LUbfjSnGYpm4^Eiu4e0;SeuD6T-H;0}--v4Vnmq>FUb!S(3U@611h{!^A+h z1cZX-^cPJEz9<2$Hd_MO^q_&}!rWX34H;EvBhogFV{SnZkRjU1Dz9XGb}2`*j>4#b z9)d*~;B3n@s*+{|v_mf$Xx@kecjR_@>apONU;=PNG0|M7OW(nkT7uD_)1vAL-adAk z3e1OgaeN(fM>j4|n}OD>20S@@|8;31D>uuRZF8AJ$a-s8?_b3iM$a%sTP*+p002ov JPDHLkV1ihBoW=kE literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/green_shulker_box.png b/packages/lectern/examples/with_links/textures/green_shulker_box.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4214c6087c4a2a03cadb3079e5eaa3860e3281 GIT binary patch literal 325 zcmV-L0lNN)P)rgA?rRrelRPmX5g`P%E&uem8W$u2H0YLedhN0duc444l&_AqPiaH?@##f0 zYoIsx&;`PAMaH{W2q9~eJM{BIL!oqsl$yX}<(AgBk=su4Z%{1_%^v(4^`>XlD#Ckk z1ev!VRClZmfyc@x0IhNw3iEIQ(7D?Kj&C21jFiD`4zBDRAMX!pP!7gNF8D+kv)BK> Xv}V(<`LLT?00000NkvXXu0mjfYQm6$ literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/green_stained_glass.png b/packages/lectern/examples/with_links/textures/green_stained_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c0eba962a1c1a5c52b70630d6738f95b87a4e9 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr_~TJyx5?`EaH+7+pGX zB!YK_Zztns&BB8@S(S-b8U&LM_p}8<#D$2tM__s4y^of# zyJp6mU*@PA|NKC*eys#4z{Q}Vb185)}keelh{@Z7=k{uiYW$@$c!@w zRK2bi>fYnd0WD?__e{L4h%LI#3;-bBt{@4aTlXHbTS*iEZ7IjlYO7n6iAl`F_dS>B zTU9VKV0Z1*ICfV{i?^DHm^m)w40zwi7K^d3sLVKnph!f#_qotrEfZJ-P)W4U+ki}H zoipYfxBEy)D8#)NeBVEEjhGV^`yS!_o~m11@@ z=Td?}429vn3O=xaf;Xdx*icl84SUCe<+s=EvxZ@2XUJxAPTu4rwN95dFRJUu%dL~; zo!j|?w_@XLseNACf39@L<+Xl8zH>k42%3X>+P$0Kd#a3n^Evt`6m4BCI`K>?UOifA z4(oikuNRV{-lQbEeY4R2E{Qu2bFP%)?n~Jj{FKD-F)*dT$OKN*WQ0j6 z5ozRE)&P{a*Lo}MQ4Kew^7_d-ew7 zXvo`ap6rSsYRq7~#KW1TRA_~jAJ>>o5_#`4=M$Yh00Zsr4Garc-ZXf$75i4^N$~&< z18DPj+k4Ei+4r$=ra_Uo>XrM9a|(|jg8}#`h|NQ(2}qkvezMtP#ff=rkYD8WSN*@} z1`6?X=z!79#|G-kl9K%lMzwj8JAnB31b7r7p$T-57A+QFPAvOh`Qs~+3S!&zW(HeA wW&L~s<4pdsX5cOBE=#5%SFz@vVjg-=fAD?X;8j>wnE(I)07*qoM6N<$f?Oll*Z=?k literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/grindstone_pivot.png b/packages/lectern/examples/with_links/textures/grindstone_pivot.png new file mode 100644 index 0000000000000000000000000000000000000000..079704823db55c2cb5de15320f638c4314f13c57 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr_~TKbTMY(a-BX!_lDU zYy-D~c3b9#%OZyiSe7#?96cfBc*Dz8K+o+0>x(W&Hi;7-6L&DJXMC}(naANfmmjl3 oSK_P*hG!g_^dwjpCj>AscuU1B^gHl}6=*(#r>mdKI;Vst09bM@I{*Lx literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/grindstone_round.png b/packages/lectern/examples/with_links/textures/grindstone_round.png new file mode 100644 index 0000000000000000000000000000000000000000..dfedeb0dfc4b40c6046d3863d14a9a210590e15b GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0KPCCfRpvc3bd!6Y| zbW^?b2FBl~4G%eeC_cH@e}bst^7hFafZ2SHt5@5bJfauqF%B5 kp`+4dw{UBlQ~$O2Q`Y@YH;DT91n3wBPgg&ebxsLQ0Q&w%!vFvP literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/grindstone_side.png b/packages/lectern/examples/with_links/textures/grindstone_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa2658e2201125ca2473f977fe93411488595f1 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALo80eoph0tL6OH<_B!LA za+d$G2Uzc%S9V%*6Ez< z?F=R#1ZInJ{1ra1N?1UQ=}VdQHrB)K+zhMk%_zRNa`H}wj%_EI1>P|I;JURYtxc_n zsWswzWZ_KifbW)#rb4DHdt^6V_#nAg->3KfjHq9ayV&byR4W?fDJlUS$l&Sf=d#Wz Gp$P!boKh(O literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/hay_block_side.png b/packages/lectern/examples/with_links/textures/hay_block_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7b734ebc58d889477085c9ffeb70a41934936a6f GIT binary patch literal 274 zcmV+t0qy>YP)J^uv+yDRo07*qoM6N<$g2u;nSpWb4 literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/hay_block_top.png b/packages/lectern/examples/with_links/textures/hay_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..84ee05ea4188ea5ba3ad4ffc7b2f129fd3ab3a39 GIT binary patch literal 267 zcmV+m0rdWfP)%JXJ``cyp zo<-d6wJ#+LM27^^axgEZrabxk-Wn+Hodi&Q%NYo&fHTbGL87x_Mb9oRi-87O&@PmwdX0t($epEiBFJKj=(4iG9*K`J@fm>!G4-$%-Kn`@f*#Of`0 zD}OFz&-qd_UM_L6(uan8K>Hnda;orF@}D^XGHDtV&Nx9U@af{f)W+nLYJbhzJfknV RS5N=|002ovPDHLkV1joeajgIV literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/honey_block_bottom.png b/packages/lectern/examples/with_links/textures/honey_block_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..cc13bc5b592a5c8f213e445d082c22d3b107c12f GIT binary patch literal 268 zcmV+n0rUQeP)tfFKBxz$~BhvL1%b zvYE;6#`|_!iO>C9ke%miJFd^`Qm6X`FX!lvI6$y6TaH*JZjl72e>18w)s*KG7FH?c3ib$LeY$JELD zx0tMR>e_uUBehto!@YZ1pg>CS---6kmclMG6=QZP=s&Mhc&^!Lc`Rm4&O83?((4R* Tg8V~)K4S26^>bP0l+XkK*`;Vt literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/honey_block_top.png b/packages/lectern/examples/with_links/textures/honey_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7deb75dcba92bfe9376c6f6a004174c742675807 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-hJY5_^ zEc~ZVy2#69$m9I^G+$5Q>kZ7s8yJo62&juCFxuU0boStQ;?WnQt?;AcO7`a%>%9^E zvsu5|_=c|koEP!h{8ib_=l7ED=`A#vE$SfL_5Azmh3D8A+pRAoZaAp6)i1*JP9SH6 z-TAjkEP;}Zy|FB2Wv#_u+79h^u$u0;VDpLz=bQbU^Z$$MHRf5^{pCBy5&O-5{Uc{T z_PX88KXN0r0?xm*Q`;0>=Y>ZZgGqxx78_eu^&>Vc5E4xg#Xh&`P{=0o&r9DlS V|NCK8eF^9%22WQ%mvv4FO#sA8Z<7E3 literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/honeycomb_block.png b/packages/lectern/examples/with_links/textures/honeycomb_block.png new file mode 100644 index 0000000000000000000000000000000000000000..d19f7a01ec5712461c9bcb412831ba69a897948c GIT binary patch literal 264 zcmV+j0r&oiP)*sQ|&%W6Gxbf$C>weq& z>#}PR|JTDOz`+y`%ph~f<@gdx%DCl6PWF%!#sW~C&_K0!)P02zY%;x8YliE>3^ zIuq8Y?GoyPY9@mZlwA2>=98a3U;|ShtTZosp0-^1plcQ%ly5_xyJBxnYnE#YUrxOM O0000uYooPF3OdXr;k*fxIhdIJjDumxj8FSui5%v&ni?FEa s%-I<+Jx-}F^U(ZGR)ZXt9u18>2~Vc={;lZW0(2FFr>mdKI;Vst0Hmx&ssI20 literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/hopper_outside.png b/packages/lectern/examples/with_links/textures/hopper_outside.png new file mode 100644 index 0000000000000000000000000000000000000000..b6265ea93744b54e850abca8247fecce40959ccb GIT binary patch literal 220 zcmV<203-j2P)>uYd^#+P8fY~Zcd`np~JFYpHLE8GD*XIqYIk5_^v>3uE9uHXET?qCN} W^T)fOVqdQS0000h{KqB= z3Kq0B|@sYt+1)fW%8ImV7J61hpn=vEe&-U%bN?grXk|Y==B`63rTsg$c@UuIH z*`Z3)oI&K!6DfvE)-pU2KOz>~U|6M^y2)60=}k$7v>sKS*be7eK-(BRUHx3vIVCg! E0OV9R2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/horn_coral.png b/packages/lectern/examples/with_links/textures/horn_coral.png new file mode 100644 index 0000000000000000000000000000000000000000..299064deefd5140ad5c69719662b3abac5cb0747 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>pfi@Lo808on*_^V8GLAJE?p1 z1Fg6-(G~0mFLGO0?y#_aB{?O(LLghK)HvYMv*)V%nbZCTZQE*RxiEL;DPzut1IhV$ z3U{9G^J3<3+_AXb%%9!CL!t0ZSM*m6*?wyUE;bhXxjRb?s{HOPYWyE~H|&@uL*}jq zw-Roa8;zVt%AC%;786qq~Yli^Qm?RLO zlXIpsKnbQf0}zDWuY7y1+*8{DFru*qWCPb6JsA?EKyI=~Om?(z>5gkk|J$N=DAk8l zysZUlNBE}QJ}cF2wP}J7a0;zf{?|W`PA#*NE=(57{6qV|YPAPp+k@b>F6!b=hrX|R=81Q5y-2a&*DWUH%y(6OP0EiRM%PK}dg zx4H@kkvs8`bBlv%y4@(i!y!PLl;mIiL{DkL*TTCFr- zLRQ@pIY!TOZIZ|lmj+!Gfj%e8A6p}2|4F((*W{lua?ZY;zF2HKTo|g~kr`7Wx~ikm zbvqO6jn)4lFE8k}&UNYjMHY`vwC+oDPdL&Kll29nH1nzb00000NkvXXu0mjfrXXb& literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/textures/iron_bars.png b/packages/lectern/examples/with_links/textures/iron_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..aee70f3781a28d3079c20e70eec1a2cd04d04fb1 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo7~DoqUnEL4n6ba=O0# zpJH*d1Ew>$i(Pz_%eR>sHg219hdF51;(1%&AHO!4^Gxx%ygZleTtSC-(;3PFy(FDx z7zbWid0*C~2X5pOz2HdmbmT+v~jJ|iI+_7+Cej{ha`j1RKNAwgHByKhaI*-BA)z4*}Q$iB} D&KXQL literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/vanilla_font_data_url.md b/packages/lectern/examples/with_links/vanilla_font_data_url.md new file mode 100644 index 000000000..39ad3bad2 --- /dev/null +++ b/packages/lectern/examples/with_links/vanilla_font_data_url.md @@ -0,0 +1,272 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@font minecraft:alt` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] + } + ``` + +
+ +- `@font minecraft:default` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- `@font minecraft:uniform` + +
+ + ```json + { + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- [`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8P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Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) diff --git a/packages/lectern/examples/with_links/vanilla_font_local.md b/packages/lectern/examples/with_links/vanilla_font_local.md new file mode 100644 index 000000000..2e51c28c0 --- /dev/null +++ b/packages/lectern/examples/with_links/vanilla_font_local.md @@ -0,0 +1,272 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@font minecraft:alt` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] + } + ``` + +
+ +- `@font minecraft:default` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- `@font minecraft:uniform` + +
+ + ```json + { + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- [`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py index 80395dfc6..3d2035a02 100644 --- a/packages/lectern/lectern/cli.py +++ b/packages/lectern/lectern/cli.py @@ -7,7 +7,7 @@ from typing import Any, Optional, Tuple import click -from beet import DataPack, ResourcePack, run_beet +from beet import run_beet from beet.toolchain.cli import error_handler from lectern import __version__ @@ -29,10 +29,10 @@ help="Extract resource pack.", ) @click.option( - "-o", - "--output-files", - metavar="", - help="Output the associated files.", + "-e", + "--external-files", + metavar="", + help="Emit external files.", ) @click.version_option( __version__, @@ -46,7 +46,7 @@ def lectern( path: Tuple[str], data_pack: Optional[str], resource_pack: Optional[str], - output_files: Optional[str], + external_files: Optional[str], ): """Literate Minecraft data packs and resource packs.""" config: Any @@ -69,18 +69,15 @@ def lectern( "resource_pack": {"load": packs}, "pipeline": ["lectern"], "meta": { - "lectern": {"output": dest, "output_files": output_files}, + "lectern": {"snapshot": dest, "external_files": external_files}, }, } - output_assets, output_data = run_beet(config).packs - - if data_pack: - with DataPack(path=data_pack) as data: - data.merge(output_data) - if resource_pack: - with ResourcePack(path=resource_pack) as assets: - assets.merge(output_assets) + with run_beet(config) as beet_ctx: + if data_pack: + beet_ctx.data.save(path=data_pack, overwrite=True) + if resource_pack: + beet_ctx.assets.save(path=resource_pack, overwrite=True) def main(): diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index ddce2e1a7..428e38b84 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -4,16 +4,18 @@ "DataPackDirective", "ResourcePackDirective", "BundleFragmentMixin", + "RequireDirective", + "SkipDirective", "get_builtin_directives", ] import io from dataclasses import dataclass -from typing import Dict, Protocol, Type, Union +from typing import Any, Dict, Protocol, Type, Union from zipfile import ZipFile -from beet import DataPack, ResourcePack +from beet import Context, DataPack, ResourcePack from beet.library.base import NamespaceFile from beet.library.data_pack import ( Advancement, @@ -71,9 +73,7 @@ class NamespacedResourceDirective: def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): full_name = fragment.expect("full_name") - content = fragment.apply_modifier() - - file_instance = self.file_type(content) + file_instance: Any = fragment.as_file(self.file_type) if self.file_type in assets.namespace_type.field_map: assets[full_name] = file_instance @@ -87,13 +87,14 @@ class BundleFragmentMixin: def bundle_pack_fragment(self, fragment: Fragment) -> ZipFile: """Return a zipfile containing the pack fragment.""" relative_path = fragment.expect("relative_path") - content = fragment.apply_modifier() + file_instance = fragment.as_file() data = io.BytesIO() with ZipFile(data, mode="w") as zip_file: - zip_file.writestr(relative_path, content) + file_instance.dump(zip_file, relative_path) - return ZipFile(io.BytesIO(data.getvalue())) + data.seek(0) + return ZipFile(data) @dataclass @@ -112,8 +113,32 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): assets.load(self.bundle_pack_fragment(fragment)) +@dataclass +class RequireDirective: + """Directive that requires a given plugin.""" + + ctx: Context + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + self.ctx.require(fragment.expect("plugin")) + + +@dataclass +class SkipDirective: + """Directive that ignores the fragment and skips to the next one.""" + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + pass + + def get_builtin_directives() -> Dict[ - str, Union[NamespacedResourceDirective, DataPackDirective, ResourcePackDirective] + str, + Union[ + NamespacedResourceDirective, + DataPackDirective, + ResourcePackDirective, + SkipDirective, + ], ]: """Return the built-in directives.""" return { @@ -155,5 +180,7 @@ def get_builtin_directives() -> Dict[ "data_pack": DataPackDirective(), "resource_pack": ResourcePackDirective(), + + "skip": SkipDirective(), # fmt: on } diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index b9d75dd67..7c3bbedeb 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -3,14 +3,15 @@ ] +import os from dataclasses import InitVar, dataclass, field from pathlib import Path -from typing import Any, Dict, Literal, MutableMapping, Optional, Tuple, overload +from typing import Any, Dict, Literal, MutableMapping, Optional, Tuple, Union, overload -from beet import Context, DataPack, File, ResourcePack +from beet import Cache, Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field -from .directive import Directive, get_builtin_directives +from .directive import Directive, RequireDirective, get_builtin_directives from .extract import MarkdownExtractor, TextExtractor from .serialize import MarkdownSerializer, TextSerializer @@ -23,7 +24,8 @@ class Document: path: InitVar[Optional[FileSystemPath]] = None text: InitVar[Optional[str]] = None markdown: InitVar[Optional[str]] = None - files: InitVar[Optional[FileSystemPath]] = None + cache: InitVar[Optional[Cache]] = None + external_files: InitVar[Optional[FileSystemPath]] = None assets: ResourcePack = field(default_factory=ResourcePack) data: DataPack = field(default_factory=DataPack) @@ -48,23 +50,30 @@ def __post_init__( path: Optional[FileSystemPath] = None, text: Optional[str] = None, markdown: Optional[str] = None, - files: Optional[FileSystemPath] = None, + cache: Optional[Cache] = None, + external_files: Optional[FileSystemPath] = None, ): if ctx: self.assets = ctx.assets self.data = ctx.data + self.directives["require"] = RequireDirective(ctx) + if cache is None: + cache = ctx.cache["lectern"].timeout(minutes=30) + if cache: + self.text_extractor.cache = cache + self.markdown_extractor.cache = cache if path: self.load(path) if text: self.add_text(text) if markdown: - self.add_markdown(markdown, files) + self.add_markdown(markdown, external_files) def load(self, path: FileSystemPath): """Load and extract fragments from the file at the specified location.""" path = Path(path).resolve() if path.suffix == ".md": - self.add_markdown(path.read_text(), files=path.parent) + self.add_markdown(path.read_text(), external_files=path.parent) else: self.add_text(path.read_text()) @@ -74,9 +83,17 @@ def add_text(self, source: str): self.assets.merge(assets) self.data.merge(data) - def add_markdown(self, source: str, files: Optional[FileSystemPath] = None): + def add_markdown( + self, + source: str, + external_files: Optional[FileSystemPath] = None, + ): """Extract pack fragments from markdown.""" - assets, data = self.markdown_extractor.extract(source, self.directives, files) + assets, data = self.markdown_extractor.extract( + source=source, + directives=self.directives, + external_files=external_files, + ) self.assets.merge(assets) self.data.merge(data) @@ -86,36 +103,65 @@ def get_text(self) -> str: @overload def get_markdown( - self, emit_files: Literal[True] + self, + emit_external_files: Literal[True], + external_prefix: str = "", ) -> Tuple[str, Dict[str, File[Any, Any]]]: ... @overload - def get_markdown(self, emit_files: Literal[False] = False) -> str: + def get_markdown(self, emit_external_files: Literal[False] = False) -> str: ... - def get_markdown(self, emit_files: bool = False): + def get_markdown( + self, + emit_external_files: bool = False, + external_prefix: str = "", + ) -> Union[str, Tuple[str, Dict[str, File[Any, Any]]]]: """Turn the data pack and the resource pack into markdown.""" - data, files = self.markdown_serializer.serialize_and_emit_files( - self.assets, self.data + external_files = {} if emit_external_files else None + + content = self.markdown_serializer.serialize( + assets=self.assets, + data=self.data, + external_files=external_files, + external_prefix=external_prefix, ) - return (data, files) if emit_files else data - def save(self, path: FileSystemPath, files: Optional[FileSystemPath] = None): + if external_files is None: + return content + else: + return content, external_files + + def save( + self, + path: FileSystemPath, + external_files: Optional[FileSystemPath] = None, + ): """Save the serialized document at the specified location.""" path = Path(path).resolve() if path.suffix == ".md": - data, emit = self.markdown_serializer.serialize_and_emit_files( - self.assets, self.data - ) - if files: - files = Path(files).resolve() - files.parent.mkdir(parents=True, exist_ok=True) - for key, value in emit.items(): - value.dump(files, key) + if external_files: + external_files = Path(external_files).resolve() + + prefix = os.path.relpath(external_files, path.parent) + prefix = prefix.replace(os.path.sep, "/") + prefix = "" if prefix == "." else prefix.rstrip("/") + "/" + + content, files = self.get_markdown( + emit_external_files=True, + external_prefix=prefix, + ) + + if files: + external_files.mkdir(parents=True, exist_ok=True) + for filename, file_instance in files.items(): + file_instance.dump(external_files, path.parent / filename) + else: + content = self.get_markdown() else: - data = self.text_serializer.serialize(self.assets, self.data) + content = self.get_text() path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(data) + path.write_text(content) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index bef4f30b1..9eeed1c5e 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -8,9 +8,11 @@ import re from itertools import islice +from pathlib import Path from typing import Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union +from urllib.parse import unquote, urlparse -from beet import DataPack, ResourcePack +from beet import Cache, DataPack, ResourcePack from beet.core.utils import FileSystemPath from markdown_it import MarkdownIt from markdown_it.common import normalize_url @@ -29,10 +31,12 @@ class Extractor: directives: Dict[str, Directive] regex: Optional["re.Pattern[str]"] + cache: Optional[Cache] - def __init__(self): + def __init__(self, cache: Optional[Cache] = None): self.directives = {} self.regex = None + self.cache = cache def generate_regex(self) -> str: """Return a regex that can match the current directives.""" @@ -68,13 +72,13 @@ def extract( def apply_directives( self, directives: Mapping[str, Directive], - fragments: Iterable[Tuple[str, Fragment]], + fragments: Iterable[Fragment], ) -> Tuple[ResourcePack, DataPack]: """Apply directives into a blank data pack and a blank resource pack.""" assets, data = ResourcePack(), DataPack() - for directive_name, fragment in fragments: - directives[directive_name](fragment, assets, data) + for fragment in fragments: + directives[fragment.directive](fragment, assets, data) return assets, data @@ -82,10 +86,29 @@ def parse_fragments( self, source: str, directives: Mapping[str, Directive], - ) -> Iterator[Tuple[str, Fragment]]: + ) -> Iterator[Fragment]: """Parse and yield pack fragments.""" return iter([]) + def create_fragment( + self, + match: "re.Match[str]", + content: Optional[str] = None, + url: Optional[str] = None, + path: Optional[FileSystemPath] = None, + ): + """Helper for creating a fragment from a matched pattern.""" + directive, modifier, arguments = match.groups() + return Fragment( + directive=directive, + modifier=modifier, + arguments=arguments.split(), + content=content, + url=url, + path=path, + cache=self.cache, + ) + class TextExtractor(Extractor): """Extractor for plain text files.""" @@ -94,7 +117,7 @@ def parse_fragments( self, source: str, directives: Mapping[str, Directive], - ) -> Iterator[Tuple[str, Fragment]]: + ) -> Iterator[Fragment]: tokens = self.get_regex(directives).split(source + "\n") it = iter(tokens) @@ -107,10 +130,12 @@ def parse_fragments( return else: content = content.partition("\n")[-1] - yield directive, Fragment( - modifier, - arguments.split(), - content[:-1] if content.endswith("\n") else content, + yield Fragment( + directive=directive, + modifier=modifier, + arguments=arguments.split(), + content=content[:-1] if content.endswith("\n") else content, + cache=self.cache, ) @@ -128,9 +153,9 @@ class MarkdownExtractor(Extractor): parser: MarkdownIt html_comment_regex: "re.Pattern[str]" - def __init__(self): - super().__init__() - self.embedded_extractor = EmbeddedExtractor() + def __init__(self, cache: Optional[Cache] = None): + super().__init__(cache) + self.embedded_extractor = EmbeddedExtractor(cache) self.parser = MarkdownIt() self.html_comment_regex = re.compile(r"") @@ -138,22 +163,35 @@ def extract( self, source: str, directives: Mapping[str, Directive], - files: Optional[FileSystemPath] = None, + external_files: Optional[FileSystemPath] = None, ) -> Tuple[ResourcePack, DataPack]: return self.apply_directives( - directives, self.parse_fragments(source, directives, files) + directives, self.parse_fragments(source, directives, external_files) ) def parse_fragments( self, source: str, directives: Mapping[str, Directive], - files: Optional[FileSystemPath] = None, - ) -> Iterator[Tuple[str, Fragment]]: + external_files: Optional[FileSystemPath] = None, + ) -> Iterator[Fragment]: tokens = self.parser.parse(source) # type: ignore regex = self.get_regex(directives) + skip = 0 + for i, token in enumerate(tokens): + if skip > 0: + skip -= 1 + continue + + # + # `@directive args...` + # + # ``` + # content + # ``` + # if ( self.match_tokens( tokens[i : i + 4], @@ -164,13 +202,23 @@ def parse_fragments( ) and (inline := tokens[i + 1]) and inline.children - and self.match_tokens(inline.children, "code_inline") + and inline.children[0].type == "code_inline" and (match := regex.match(inline.children[0].content)) ): - directive, modifier, arguments = match.groups() - yield directive, Fragment( - modifier, arguments.split(), tokens[i + 3].content - ) + yield self.create_fragment(match, content=tokens[i + 3].content) + skip = 3 + + # + # `@directive args...` + # + #
+ # + # ``` + # content + # ``` + # + #
+ # elif ( self.match_tokens( tokens[i : i + 6], @@ -183,33 +231,110 @@ def parse_fragments( ) and (inline := tokens[i + 1]) and inline.children - and self.match_tokens(inline.children, "code_inline") + and inline.children[0].type == "code_inline" and tokens[i + 3].content == "
\n" and tokens[i + 5].content == "
\n" and (match := regex.match(inline.children[0].content)) ): - directive, modifier, arguments = match.groups() - yield directive, Fragment( - modifier, arguments.split(), tokens[i + 4].content + yield self.create_fragment(match, content=tokens[i + 4].content) + skip = 5 + + # + # [`@directive args...`](path/to/content) + # + elif ( + self.match_tokens( + tokens[i : i + 3], + "paragraph_open", + "inline", + "paragraph_close", + ) + and (inline := tokens[i + 1]) + and inline.children + and self.match_tokens( + inline.children, + "link_open", + "code_inline", + "link_close", ) + and (url := inline.children[0].attrGet("href")) + and (match := regex.match(inline.children[1].content)) + ): + url = unquote(url) + path = None + + if urlparse(url).path == url: + if external_files: + path = Path(external_files, url).resolve() + url = None + + yield self.create_fragment(match, url=url, path=path) + skip = 2 + + # + # + # + # ``` + # content + # ``` + # elif ( self.match_tokens( - tokens[i : i + 2], "html_block", ["fence", "code_block"] + tokens[i : i + 2], + "html_block", + ["fence", "code_block"], ) and (comment := self.html_comment_regex.match(token.content)) and (match := regex.match(comment.group(1))) ): - directive, modifier, arguments = match.groups() - yield directive, Fragment( - modifier, arguments.split(), tokens[i + 1].content + yield self.create_fragment(match, content=tokens[i + 1].content) + skip = 1 + + # + # `@directive args...` + # + elif ( + self.match_tokens( + tokens[i : i + 3], + "paragraph_open", + "inline", + "paragraph_close", ) + and (inline := tokens[i + 1]) + and inline.children + and inline.children[0].type == "code_inline" + and (match := regex.match(inline.children[0].content)) + ): + yield self.create_fragment(match) + skip = 2 + + # + # + # + elif ( + token.type == "html_block" + and (comment := self.html_comment_regex.match(token.content)) + and (match := regex.match(comment.group(1))) + ): + yield self.create_fragment(match) + + # + # ``` + # @directive args... + # + # content + # ``` + # elif token.type in ["fence", "code_block"]: yield from self.embedded_extractor.parse_fragments( - token.content, directives + token.content, + directives, ) def match_tokens( - self, tokens: Optional[List[Token]], *token_types: Union[List[str], str] + self, + tokens: Optional[List[Token]], + *token_types: Union[List[str], str], ) -> bool: """Return whether the list of tokens matches the provided token types.""" return ( diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index 751e38de7..1bffd4e85 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -5,9 +5,13 @@ from dataclasses import dataclass -from typing import List, Optional, Tuple, Union, overload +from typing import Any, Optional, Sequence, Type, TypeVar, overload +from urllib.request import urlopen -from beet import FormattedPipelineException +from beet import BinaryFile, BinaryFileBase, Cache, File, FormattedPipelineException +from beet.core.utils import FileSystemPath + +FileType = TypeVar("FileType", bound=File[Any, Any]) class InvalidFragment(FormattedPipelineException): @@ -22,9 +26,13 @@ def __init__(self, message: str): class Fragment: """Class representing a fragment annotated by a directive.""" - modifier: Optional[str] - arguments: List[str] - content: Union[str, bytes] + directive: str + modifier: Optional[str] = None + arguments: Sequence[str] = () + content: Optional[str] = None + url: Optional[str] = None + path: Optional[FileSystemPath] = None + cache: Optional[Cache] = None @overload def expect(self): @@ -35,16 +43,16 @@ def expect(self, name1: str) -> str: ... @overload - def expect(self, name1: str, name2: str, *names: str) -> Tuple[str, ...]: + def expect(self, name1: str, name2: str, *names: str) -> Sequence[str]: ... def expect(self, *names: str): """Check directive arguments.""" if missing := names[len(self.arguments) :]: - msg = f"Missing directive argument {', '.join(map(repr, missing))}." + msg = f"Missing argument {', '.join(map(repr, missing))} for directive @{self.directive}." raise InvalidFragment(msg) if extra := self.arguments[len(names) :]: - msg = f"Unexpected directive argument {', '.join(map(repr, extra))}." + msg = f"Unexpected argument {', '.join(map(repr, extra))} for directive @{self.directive}." raise InvalidFragment(msg) if len(self.arguments) == 0: return @@ -52,7 +60,31 @@ def expect(self, *names: str): return self.arguments[0] return self.arguments - def apply_modifier(self) -> Union[str, bytes]: - if self.modifier == "strip_final_newline" and self.content[-1:] == "\n": - return self.content[:-1] - return self.content + def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: + """Retrieve the content of the fragment as a file.""" + is_binary = issubclass(file_type, BinaryFileBase) + content = self.content + + if content is not None: + if self.modifier == "strip_final_newline" and content.endswith("\n"): + content = content[:-1] + if is_binary: + content = content.encode() + + elif self.path: + return file_type(source_path=self.path) + + elif self.url: + if self.cache: + return file_type(source_path=self.cache.download(self.url)) + + with urlopen(self.url) as f: + content = f.read() + if not is_binary: + content = content.decode(errors="replace") + + else: + msg = f"Expected content, path or url for directive @{self.directive}." + raise InvalidFragment(msg) + + return file_type(content) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 2a7b5e22a..866560cca 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -16,16 +16,16 @@ def beet_default(ctx: Context): config = ctx.meta.get("lectern", {}) load = config.get("load", []) - output = config.get("output") - output_files = config.get("output_files") + snapshot = config.get("snapshot") + external_files = config.get("external_files") - ctx.require(lectern(load, output, output_files)) + ctx.require(lectern(load, snapshot, external_files)) def lectern( load: Iterable[str] = (), - output: Optional[str] = None, - output_files: Optional[str] = None, + snapshot: Optional[str] = None, + external_files: Optional[str] = None, ) -> Plugin: """Return a plugin that handles markdown files with lectern.""" @@ -38,10 +38,10 @@ def plugin(ctx: Context): yield - if output: + if snapshot: document.save( - ctx.directory / output, - ctx.directory / output_files if output_files else None, + ctx.directory / snapshot, + ctx.directory / external_files if external_files else None, ) return plugin diff --git a/packages/lectern/lectern/pytest_plugin.py b/packages/lectern/lectern/pytest_plugin.py index 2d259c61a..9fb94c182 100644 --- a/packages/lectern/lectern/pytest_plugin.py +++ b/packages/lectern/lectern/pytest_plugin.py @@ -19,9 +19,18 @@ def dump(self, path: Path, value: Document): class FmtPackMarkdown(Fmt[Document]): extension = ".pack.md" + def load(self, path: Path) -> Document: + return Document(path=path) + + def dump(self, path: Path, value: Document): + value.save(path) + + class FmtPackMarkdownExternalFiles(Fmt[Document]): + extension = ".pack.md_external_files" + def load(self, path: Path) -> Document: return Document(path=path / "README.md") def dump(self, path: Path, value: Document): path.mkdir(exist_ok=True) - value.save(path / "README.md", files=path) + value.save(path / "README.md", external_files=path) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 63e31b1ed..9b5b97175 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -2,14 +2,17 @@ "TextSerializer", "MarkdownSerializer", "NAMESPACED_RESOURCE_DIRECTIVES", + "EXTENSION_HIGHLIGHTING", ] +from base64 import b64encode from itertools import chain +from mimetypes import guess_type from pathlib import Path from textwrap import indent -from typing import Any, Dict, Iterator, Tuple, Union +from typing import Any, Dict, Iterator, Optional, Union -from beet import DataPack, File, ResourcePack +from beet import DataPack, File, ResourcePack, TextFileBase from beet.library.base import NamespaceFile from .directive import NamespacedResourceDirective, get_builtin_directives @@ -62,15 +65,15 @@ def serialize(self, assets: ResourcePack, data: DataPack) -> str: class MarkdownSerializer: """Document serializer that outputs markdown and emits associated files.""" - def serialize_and_emit_files( + def serialize( self, assets: ResourcePack, data: DataPack, - ) -> Tuple[str, Dict[str, File[Any, Any]]]: + external_files: Optional[Dict[str, File[Any, Any]]] = None, + external_prefix: str = "", + ) -> str: """Return the serialized representation and the files emitted in the process.""" - files: Dict[str, File[Any, Any]] = {} - - content = ( + return "# Lectern snapshot\n\n" + ( "\n".join( text for title, directive, pack in [ @@ -78,26 +81,27 @@ def serialize_and_emit_files( ("Resource pack", "resource_pack", assets), ] if pack - for text in self.serialize_pack(title, directive, pack, files) + for text in self.serialize_pack( + title, directive, pack, external_files, external_prefix + ) ) or "The data pack and resource pack are empty.\n" ) - return "# Lectern snapshot\n\n" + (content), files - def serialize_pack( self, title: str, pack_directive: str, pack: Union[DataPack, ResourcePack], - files: Dict[str, File[Any, Any]], + external_files: Optional[Dict[str, File[Any, Any]]], + external_prefix: str = "", ) -> Iterator[str]: """Yield markdown chunks for the given pack.""" yield f"## {title}" for path, file_instance in pack.extra.items(): yield from self.serialize_file_instance( - pack_directive, path, file_instance, files + pack_directive, path, file_instance, external_files, external_prefix ) for name, namespace in pack.items(): @@ -108,7 +112,11 @@ def serialize_pack( for path, file_instance in container.items(): yield from self.serialize_file_instance( - directive_name, f"{name}:{path}", file_instance, files + directive_name, + f"{name}:{path}", + file_instance, + external_files, + external_prefix, ) yield "" @@ -118,17 +126,23 @@ def serialize_file_instance( directive: str, argument: str, file_instance: Union[File[Any, Any], NamespaceFile], - files: Dict[str, File[Any, Any]], + external_files: Optional[Dict[str, File[Any, Any]]], + external_prefix: str = "", ) -> Iterator[str]: """Yield markdown chunks for including the given file instance.""" - content = file_instance.ensure_serialized() - - if isinstance(content, str): - extension = ( - file_instance.extension - if isinstance(file_instance, NamespaceFile) - else Path(argument).suffix - ) + if directive in ["data_pack", "resource_pack"]: + filename = Path(argument).name + extension = "".join(Path(filename).suffixes) + filename = filename[: -len(extension)] + elif isinstance(file_instance, NamespaceFile): + filename = Path(argument.rpartition(":")[-1]).name + extension = file_instance.extension + else: + filename = f"{directive}_data" + extension = "" + + if isinstance(file_instance, TextFileBase): + content = file_instance.text if not content.endswith("\n"): directive += "(strip_final_newline)" @@ -139,3 +153,21 @@ def serialize_file_instance( yield "\n ```" + EXTENSION_HIGHLIGHTING.get(extension, "") yield indent(content, " ") + " ```" yield "\n " + + return + + if external_files is None: + content = file_instance.ensure_serialized() + content_type = ( + guess_type(f"{filename}{extension}")[0] or "application/octet-stream" + ) + url = f"data:{content_type};base64,{b64encode(content).decode()}" + else: + while (url := f"{external_prefix}{filename}{extension}") in external_files: + stem, _, number = filename.rpartition("_") + if not number.isdigit(): + stem, number = filename, "0" + filename = f"{stem}_{int(number) + 1}" + external_files[url] = file_instance + + yield f"\n- [`@{directive} {argument}`]({url})" diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md new file mode 100644 index 000000000..85025d90c --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -0,0 +1,140 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + say foo + ``` + +
+ +- `@function demo:bar` + +
+ + ```mcfunction + say bar + ``` + +
+ +### embedded + +- `@function(strip_final_newline) embedded:foo` + +
+ + ```mcfunction + say foo + ``` + +
+ +- `@function embedded:bar` + +
+ + ```mcfunction + say bar + ``` + +
+ +### custom + +- `@function custom:hello` + +
+ + ```mcfunction + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + ``` + +
+ +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- [`@resource_pack pack.png`](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md new file mode 100644 index 000000000..a505fec9a --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md @@ -0,0 +1,140 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + say foo + ``` + +
+ +- `@function demo:bar` + +
+ + ```mcfunction + say bar + ``` + +
+ +### embedded + +- `@function(strip_final_newline) embedded:foo` + +
+ + ```mcfunction + say foo + ``` + +
+ +- `@function embedded:bar` + +
+ + ```mcfunction + say bar + ``` + +
+ +### custom + +- `@function custom:hello` + +
+ + ```mcfunction + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + say hello + say bye + ``` + +
+ +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- [`@resource_pack pack.png`](pack.png) diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..0c084ba0791f2a6adf5b99da10fa59e9e0e4d0dd GIT binary patch literal 4638 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 + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + + + +### demo + +- `@function(strip_final_newline) demo:foo` + +
+ + ```mcfunction + + ``` + +
+ +- `@function(strip_final_newline) demo:bar` + +
+ + ```mcfunction + + ``` + +
+ +- `@function(strip_final_newline) demo:thing` + +
+ + ```mcfunction + + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md similarity index 100% rename from packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md/README.md rename to packages/lectern/tests/snapshots/examples__markdown_examples_empty_markdown_md__0.pack.md diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md similarity index 100% rename from packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md/README.md rename to packages/lectern/tests/snapshots/examples__markdown_examples_empty_text_txt__0.pack.md diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md similarity index 100% rename from packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md/README.md rename to packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md similarity index 100% rename from packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md/README.md rename to packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md similarity index 100% rename from packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md/README.md rename to packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md new file mode 100644 index 000000000..ba151c673 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md @@ -0,0 +1,70 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- [`@texture minecraft:block/green_concrete_powder`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACLklEQVQoUwXByXLcNhAA0EY3NoLbsGxLti+55ZDKPZ/jz8gnR2VpRhyuAAF05z31698/lWr4IhFGpZtheb6HMKZ8BmEBYD8mAIHSZd74ctiPgFBqBWMB9LNUbIYYxiuMqZ3S9Ao56fgMrvuU7Nvbheu9A3BNwJIFqj+f3oW63MOVQNu6PQHEKJ3X2fbfVmGnS7lK1s1whqE+P5p2Sst7EKEIW2VDmL2r59oqNueGACsSOgAp2cVobi9FitXatGPWqilRxU2LaG2j4KoVlstgrRdpRXT0vU8n10ylFK4CCpzzpFU8r5wg9HwecJ2kC3PoeLk31y7pou6WMdMVFRGklG/fEqrmeVcgrBSiItTkrkM1rQJk7+25IDn4+pNFlDDEqJ6fVQT2z2C9DreC/ZfNhup8BSBhGL4eSFI5t8Pej3790NaLwtoM+7HU/VPjPmM+KCUik0rlc21TrPO7BQ3nkabXLNlJofXRTq+7sYTtwH4o81uZXi6uFZEQKEfnrDaGjINSL0Xyx1/H8vDMlf7+50Wqazqcf9P0I54bkQauzAwsfK62n5RgWh7qOnQ8WBtj06EESjfR8Wy7cU8xlFJME4/7aNvEEJXyNfrxdbYeMF/QTklhvf9XmMs2B661H71zZBwCa6kmH05RAbbzW4c56X3WTahNi9YDEUzfU8myzVJKQbeSqQAKTSJ7ASokfTVdQRRmRumF6fGmjas2wO0lLR/D9mhvPxZEvT0aY/f/AVjYaSiNzb00AAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/green_concrete`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAoklEQVQoz3WRyxHAIAhEtxhCLZISMP3XkQOouI4zHBg+7luEdYl4v2fLPZMRGi1EL6ajOjdH8akJmnNpTGuttxRUVF1iez+1fC55mguial3MxaaaLzPkDYQ7ASpPpUCtUsx7VFoEGWHkju/iLqxwd7/wwAzHMtHi7lLZlYt1yY+rAK3e9zgdqBEvVR5ywqbP/2r7fp6V5ohq81AA9KYzW9blB2ZZyT6my4nWAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/green_glazed_terracotta`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABMklEQVQoz12SvUoDURCF71OsteYHe58hYCobCaggJMVikUpIEwRJl8YyVRo7fZcETFIkr+MXvuWsCMPunbnnzJyZO6V+v8F2xxM2fOpiOX98PWCv6+7ss7f52RPELaD54RC6m/TvX65DGIwun98qCPPvfr28EFa8Bo0PIWSgcMaLivQQcOEQL0ETwra7AxGycg2aCITp6srzWZK6URK0peTDxEC3BISC5vQXTQq+KAGtNlsC2fSggebC3FwHDRlVaCPSNo1jbkEQkCHaySqvZHx2KUezjsKogB6CRRngbMs0qpJmBLRDLxlo3ogDd+R2euqx4JlgAnBEMdFcp0vfwZZagtGg06LqCd4+dpoKzId2cXwdc0c3LlCbgdasBjw5fP91aSIrN8uXbXOZQ8h6a1nvX8UXRs8wRVstAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/green_shulker_box`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABDElEQVQoz3VS2Q6CQAzc/xCPwP6Jxihq4gFR8Ii8eEX8/0en2+5SgiZNmLKdttPWpGe7eQxhAITvQ9jiYtOTwv7//GgNPtODnRV2VcWwWWnhCi4ULikGTIPccPAre/dh/Bzw8ppkdQRbVQnCUNaAJBF1tHsNYBxB9u5rF2GTPDEgESEEtS3/9LgaFyQCNOiWdHrtsgyvoZAilK+Otk9pQ/rx6UU0a6A399AFwnFFxrtYCCFrkzv080NDoXSHlJrAY+WW1reR207yb1AtDc0e/Bv1pmfVKsJ7cASZtx9Ud6wNgcfKJwCtchoK83AB0LnbA45vH46MlMFtDq7sHB/vD2pQDsZHLvhEGLPX/7+0ZtOv+bCbWwAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/green_stained_glass_pane_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPklEQVR42mNgwANS642eJVYZPGMgF4AMiCvTp8wAilwA0kyxASBXDFwYgFwwsAYMvBeGQUocHF5IrjHEawAAqHU+aprkHnQAAAAASUVORK5CYII=) + +- [`@texture minecraft:block/green_stained_glass`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4y2NIqzdeTAlmgDLSyMRYDZhNiQGzKXHBbGp5YdSAEWPAbEoMmE0TL5CNAYkBjWW6vToCAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/green_terracotta`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUUlEQVQ4EQXBwQEcNxADMHCkatxKfu6/Et9qGCD//f1TCoDIjJloa99z7lHs97QFQsSFiLlHYHnivY+WsLtmxpzjvWcEVF2J1+p7tKgiICaj2C1IRg62qDthzuiW1qIliZPYVgsYgj60iikGk8iMMwdUva4W6t7jzgEtZhD3TLytiC26zgwAIN6uIAmhW/ces1tJFABtKcfQaqtblIlJzMT3PZfoW1UwM2B37dQ4dldLi7eaiJg5LuQMeN/HFouxr6jMOIOgSES897nQXS0TWARQSbTP24BMaJ0z5hy3+0hIKMS9F3zfP3KNmBMV+x7h/Z6qW6QkVYN675HgmkTCLqwkMtFg1yUKJWjQaovIHHnP7iqCCEXiZgIgE93KHX6fWt/vJ1hrjECZO1KuVhOK30/FbgUE0cTNgG61a3+VGbciEHquYMQMb6mKqLKrqogo/gcV6vrcd5o15AAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/green_wool`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABjUlEQVQoFT3S51KCQQyF4b0KPrCAgjejiNhQVIoNe8eC5bfX7bOGYWZnyGZzTt7kI7VOlzYvquvHy62T5Z3b+YO3YuNsqX1e23+udMfltX5DvnM/5wiag3ravZvfe6qMfvM5+igUbV0tOvFMKV49WmkO63y3rxeSot6kJLt9s9D/Lok7D3OulOLuS9kZ/JTYybDOHUgPXqcyMTClwMgETtRkhEkpEWnkWdYAlLjXeivtUQ03pPVhPeffCpCeEjg/BOGqNNYgI9ZQn+agQUmweVlNMe7he/YG42jI22ye7IogasxgvMTDmaVUaIWVH9eYTRJ57zPnE509AAPt7g0MC1feNHi0FftW5knxAA4DaPN423vMstn3sXGmQZG46pX7jHMKjyCDAfgoiM1DqQlIm0x+stljxYl5bJBf5PVX/b/oBgrxdOiA0c3HBurKkpL9DEa1eZI7gPj4BHgUIaEJdJAWLRZgTiz7X/njK5IKYtv0ZgZbQmX9fAHjTP6xZuAt6y5LpiFXseaeYh56T3/wfd3gVVhWmQAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/grindstone_pivot`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4y2PwN5L4jw1HmEEwjM2ACyArhmmw0xTCMASnASDFyBpB2EpFEC5G0AXoikEGGMjxYbgCrwHotoMMQPcKTgNAimGakDHMQIIuGAWjYFAAAEsaXKFOwPwFAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/grindstone_round`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVQ4y+2SwQkAIQwELdcC/FuCfxuwAfvLMcJC8HPJvU+QFTGTbEyZc9re26T+jJa3xaPWmo0xzu69W631aBigAAEEXGvlKvCQMACvAHxmzmELZMECgQJIgX9qYqoHPPK+CVZFKYAvP9VELNwVSFPfeH8hd+FBIpNGVzs8yv8qD2Su/2cwWvHkAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/grindstone_side`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVQ4y+2S0QkAIQxDHdcB/HcE/13ABdzPI0KkxPZugSuUaqjPEk1jjDXnXKhc233v/ST0pIGmWuvO1tpJaqWUnViHADTwEJsVCP0TwKoTEBYC9HY7tgXDhwsAqt6Yc96pk7kAiLbJAxDsAvgK2qxmhiZyAoVY91lxmQtQ9zmBNRI1BLwdstDwGb0vTI3fmFr644oHfph7ITBuISIAAAAASUVORK5CYII=) + +- [`@texture minecraft:block/hay_block_side`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4y5WTvQkCQRSEXyEighhpoIEFGBpaiw2YCYaHJWh0uakFWNTKO/iOYW5XMFhm3/8ybzZu50V597tyv8wHTPvz2o422HeriZ154YmJ3iCTvVEOynvkhSQCWkicApATz+OmPE7r0h2WA3LS5lz3s2o8MfSJOsH9Hudl0SIJMlsNRw4ohFUnsxZXUicNvJH6a3nhjn8xdGIr8dcLo6Y8JYu7kqukB7tmv6mLtNEHdlMH7BO16cFH3JU56ECFobJ26eoQlXbUFOh/wv8GOGyhVqikYvu2wC+PC1PqFZeh3AAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/hay_block_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0klEQVQ4T22TsQ0DMQwDVX7pVTNAJgjSZYV0qdJnhMz0AR84gc+oMN62JJIS/fV5rv1xXfvrvh1L+9tl9Z5F3O+1LyULRIcE03IwL6amPPn73hoo750EUH3LGQiqgDPM5EGis2JFzy4ti4g7EfueQfaKEpI9rnvOpxkoeZJPkTO3AgrdPp82fbs73lKBDhAqUkEqOdmYHovB30fKd5trmvjE6i14K38uZM/5UjNeLnGy0oeGfED7HXhyqvBW8p85ADJpGhTOOEEr8OniwNTG5JRqf83aPKMvuldQAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/honey_block_bottom`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMNJREFUOMt9k80JQkEMhAOePL67ZdiaZ3llvBqswl68WYAgCJLALJ/zsh6GzbKZye/G+3Zaic/9XJCd52s7rs/rUqf7BS/pIIggW9BdvBCZAiQkHpfDTlTZlIA/iJT4l0kiWKNHpUhHTjuUupM6UECBK4MuqpfgfdgJyGlWAt80yiph1pwuI9+FEvASOrIH4IKFR5xFZuo/Aj66zubiSGCMkZ2diTmZuzMWyT8NSfwvjD4WyZUdFCK5esDv687eAyenzxdCexZaW6y0mgAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/honey_block_side`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMZJREFUOMuFk80NwjAUg31lB8ZgHXZgDjZgBmbIgQVYgCM7AEJCoBfpk1yTtger0YvtvL/qfd428Lns2ut+7HjcDu173XdUvFCc52nTQUwICyVyYMAZE4cIQpwTutizEGIEEOu7VEKhZ+AlFDlThJhCzhODTDFFnhE8cTkCd15OlqQ1Ii9nD+ArR7PWPC95sgej2tOYXfFlk7+0NK5CirvBaGVzKohHi6ZREGRT/ZE/gzkTRJkhXLkgL+d+IOcpiTnGXKxs7g+3G64wjFJPVQAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/honey_block_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE+VktENAjEMQ/PLDoxx67ADc7ABM9wQJxZgAT7ZgUNICORIjlwrIPiI1GvzXDu9WI+bBfU8TVWv825Y6zfqdtnn3mPeLqEwmxVAE4rn9+uhzgcBhzvQYbDBJrVOWEXcUQl4Ps/tYgRRGYGNXQQ2doVz9IbCv0A6l0Ggs6iQz4NOQ2//Fy6Bbjg+/Q7OCF32T6/iQ04HfruD+G1ZKlDP6NYV5N9HmMJkBgE6cZi3Yo8wmYzgg1PbCmt2HXK4fYe/3Y71G0k0p/74OnvSAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/honeycomb_block`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4jY2TsQ1CMQxELdEwBKuxABPQsQCbsAgVNQNQMAONkcN/0X3HAQrr6+dyts++2P248ed5637b++uyaxH/18MnwMEUD8wgc8jl+BJKyrjlilyKpHT1DW8JFKQ1f5x6goy1BAs+dKAXVHOc6zzArdIcIKSMQ6aorTRFW0IeNAsOZl2zDE3J4K1yMRPLe2alJMk+QUpPABmC+uIvH6iJckViOhPWqO0S6oNqJoMPlFz5YOaTnz5gA1MfrDQve562XPmgaxYflG9Dnrtib05rlmsKX069AAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/hopper_inside`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVQ4T42TSwqAMAxEe5supBvpwpWC97+T0kIkmYxJF4+Azbx+Ldd5PxG9Hx9svLBGTWv7BL8bAQtoUCTVCbB5UOv2K50CNrOERtXgdoxAJBhiEirQs2cCtwVcfgY9xNUwbsMIViR4E+4aMwnehBNIE4ZYOHyJbLlYl14ijmnCn4kFMGwEjCgovGDklo39eI+0AAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/hopper_outside`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y6VSOQ6EMBDzh2hWKahYiYqt0kJJxf9fEJRIXjmjCWdhZS6biQO2dU3LPBfk+Aic0XkwiTEWML8KeETmerbm8JumpPBIlsw8z0MHrJgnrmcRYPAdxkdA132SRQh9Ba1rP8dgQkWNFV491yoT2TjzofKABLprxbTGl2C/bOCt1vq6Xf8v8AbuK9wBPGdbjmuPV4Il6X0tya7f/JHuYAdS88e7oGJfrwAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/hopper_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4y2Pw9PD47+/vD8aRERFwnJ6YiIJh4jC1IAzSywBjkINBeuEGmJhY/Le3cyIKg9RiGACSYCASgNTCDQD5i1wDQHopNwAUwuQaANI7HAwY+Fig2ACqJWWyMxOl2RkAZowlDF2IQ5oAAAAASUVORK5CYII=) + +- [`@texture minecraft:block/horn_coral_block`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4y32SMQpCQRBDcyQbW8FWvJi38A6CpRewsrD5taWe4UsW3hICWgx/Z2eSmU2+Hpf9ejtv18/7OML5874b8e+Os7rwWg4j9zcJIHGeA3U9bWbRIICcXcup9E8CLikkWW/iye5ja4cA0ZgkEKCTc6YzQAmmOQMQhN2vfHuu3FPbATCisQVkA9ccPRkSpUBuskhMdrRw6Y5rSv/bonYo1YdUvK0Fakf4pt0+K9VttWmCEHAKrVb+1z+PTi20+gIxASeoLR8acJGe57tz7QROAqakTa102phPc3wBggHhFG101/IAAAAASUVORK5CYII=) + +- [`@texture minecraft:block/horn_coral_fan`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4y+2RPQqEUAyEPZLNtoK9F9tbeAfB0gtYWXiL9QxPRvjCvKeIrbBp8jeZTEhV/e0FNvWf9Bg8fuvkA8vQpnVuovaITCANKtbw9usywksSFWmwlVgEEMoTB5HAXmSrq4DQsaGGLS6T/E6Nk2W3ugoHkTvxkXOLg2m63LIfak432Sfkea2/GJXxBX5dgqhRL5fI77u5Au//Aj6TAAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/horn_coral`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVQ4y82SPQqAMAyFPZKLq+AqXsxbeAfB0Qs4Obg4O+oZlG94EGsqdTNQ0ubnJS9plv1StrU+OaFtmcozCYDAY29uINznvkoDCEG4o4c2TwdASCBx7Ipb9SgdjzsgCgYEP525dDB6Tt6igf9R3VbGKQBpuoBGdAsE2IEJxHZCzOsWFKDpo+3UQ384KxfIG6boPlZKkowC8Wyvf0EB9sgmQFFI/kjeQD+JthJr/QITIhaSwEOMBwAAAABJRU5ErkJggg==) + +- [`@texture minecraft:block/ice`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4y42TMQ4CQQhFOb2VlTfwAjZWJmYbGw9g6VV0DZi/ef5lJxY/kwE+DB8mdqfXJBwu78L1MU/H27zcE/vzF2kX0h5OptPJ8suWvEogZ4cRuRIwsCPKzlMJ8gyv4sHUyJOWBm7wKiQzRlqtNGBCVt0SOUbPc22SyBGXBl0VgT4nyx9bI2T/Sbo/1+SfMXLOvp2+WGw7XBiq35EZUyK6qqPRdTsT7I3V/yEvL+i2znXp/kUWj0607ktzTzjSD5P1BaI086n9AAAAAElFTkSuQmCC) + +- [`@texture minecraft:block/iron_bars`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAk0lEQVQ4y5WT0Q2AIAxEGZcvP/xzFzbANZgLc0RMI3e2NjGBtpzcA1K6o56178fWkwnMc85ubkRrbRFA7pcAdlFKGUKYM1HUqcC0gCI+jJktKTD/zES9PukNAixHBaJ+lz40KWBsV+jDmsfKFzBly8J2gYUZMLrRk4kDE7kQMAubXqQIsAlb3sR3QXGRb4EJeK/xAozELiCgYbMzAAAAAElFTkSuQmCC) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md new file mode 100644 index 000000000..592c1eebd --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md @@ -0,0 +1,20 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- [`@data_pack pack.png`](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md new file mode 100644 index 000000000..38bf9b610 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md @@ -0,0 +1,20 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- [`@data_pack pack.png`](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md new file mode 100644 index 000000000..bf7982004 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md @@ -0,0 +1,26 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- [`@structure minecraft:igloo/bottom`](data:application/octet-stream;base64,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) + +- [`@structure minecraft:igloo/middle`](data:application/octet-stream;base64,H4sIAAAAAAAAAI2SwWrDMBBER3Kc2sqhPfXQT+m559JTrmFjr10RRTLSQqFfHxsi0gZaa0EHwdPMrBgDtNgk+80VgF+nRcNerFhOWKbF9uhCd0pmvjy2qKaQMpxHVaiTkPD1xU9GZaiA0f8wusALV621PKogjyrIs+aFzK146YI8uiBPidf9H6o/dl9j7r0W5mEixyK8VEU32LzTmfF8tp67SIO8JgmeD8do5zrBwHzEMHFcqtZg9zXrRBfGkXvUA7nEDbYDddaPqH2I8oks+XSTdNT3HOdUuzcS2nNMNnjAvOACT0G+1eQCAAA=) + +- [`@structure minecraft:igloo/top`](data:application/octet-stream;base64,H4sIAAAAAAAAAKWYwYrbMBCGFWuUOFn2UCiltG/SY9tLoZQell6D4iiJidcyskJon6SPW3k345isPTNLA94Q+7P+/x8NstYrpZYK2vKP00qp7likw6QjX6rc1bGMpWtV91mq+abyxbFdpR9/l0o3vsWb8KO1Mm200V3uGGNAwBiCmV2YTMBQfpCh/CAj8TMnmKwvEM/MBAyVHRkqOzJUdmSo7MhIsi8Ipp97AUPVBxmqPshQ9UGGqg8yVHZkqOwgyI4MlR0ZKjsyVHZkqOzIUL2BDFUfZKj6GEEuZKhcyFC5kKFyIUPlmgv8IEP5QYby031mjBYyQ63ZBMOtdTNmLmYj42QTDLduPK2tAoZbMzuGW384BgR+QOAHBFpGUGdkuD7kegMZqjeQ4fowY7SQ4fYAGaM1uzBcH2aCHssEPZYJeiwT9BjHgMAPCPyAQMsIaogM12PcvCPDrXWSedeMFjLcvk4zWhl+CxhuD6CZOe19CRhub8P5AcE4IBjHCOYCGe6ZK5kLYLSQ4fa0wGhpgZYWaGmBFgi0QKAFAi1cW4eMnnguD7Vg4nk67B8zwQxzzScYEDBGwAx7dTHxfFeE5z6/gKGy9+sL4RkZKjsyVHZkqOwg8AwCzyDwDALPIPBsRvzcesbnu4QBAWOYfr59Vk4xlJ9M4Cd7hZ8504e3e4kphut5LjsyVPZ+/RUwVHZkqOwg8AwCzyDwDALPIPBsBH6MwI8R+MF9C9erWtCrWjBfnJYWaGmBFgi0QKAFo1orpetNzFT+xfvjQ/nougLkn0+hfv6xVOZbdI/Pr0tzlZVb9eaxrF0R7C5+2iXOFi5T93j7g4+26kj47oujmvpHehgmv5h4Hv3+OvrGbSfW0GHO5etvH5ZglZhFYysXo+veAt8l6z9siv72OlJb+/P66UWxwqsDnbJw/en319NPf8t6v452U7mks/oZfONC9/I54Qdb7ZSOvsnV3TlZCZXf75Njs7NV6/LkyZ9dGJyY72yRhlOm9iEe0ghpsPpytdd/d9X39riOwTZb78Otuq7KqCCG06jzpNpGX7t19KE4jEW2ZRiTPB/K6NaFDY2L/fWP1+tVuT/E9T7Y3wiN+boNDM621+Fedt+L0jY2pHQ77+Ogaq0/dVXLfVGcmrKv69i4Kf+6a57xcQ/Obv9vXK3uvtpof7nQlr5OLfhB/QPXnps4tBgAAA==) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md new file mode 100644 index 000000000..39ad3bad2 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md @@ -0,0 +1,272 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@font minecraft:alt` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] + } + ``` + +
+ +- `@font minecraft:default` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- `@font minecraft:uniform` + +
+ + ```json + { + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- [`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8P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Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md new file mode 100644 index 000000000..39ad3bad2 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md @@ -0,0 +1,272 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@font minecraft:alt` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] + } + ``` + +
+ +- `@font minecraft:default` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- `@font minecraft:uniform` + +
+ + ```json + { + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- [`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsbGyw7SkpLLEpKOzs7SzscHBwsLDtbOztbLDs7TEo7OztLS0o7Sko7OztKO0pKWkpKO0tLKx0dLDo6Ozs7Ozs7O0tLS0s7SkpLWjpLSzs7OywsKzs7Ozs7LDscLTwtHh47Sko7O0pKOys8LS0rPDw6Ojs7O0pLS0s8OztKLTs7Oyw7OztLOjo7HR1LOzseLCxKOzs7OztLLC0tLTw8LDwsLEpKSko7OztLS0s7Ozs7OzwsLDw8Ozs7Ozs7LTtMTEstLTwqOzw7O0s7O0s7W1tLHTw8PDpLOzssLDssLDsrKys7LCw7Kzs7LDs7Oyw8PDwtOzstKys7OjodOzstOzstOzs7LS0ePDw8HUpKSiwsLDs7PEssLDs8PCwrPDwrK0tLOztLHUtLHUosLB08PDs7Ozs8LCw8Ozs8LCwsOy0tLEpKSko7OztKSiw7Ozs8Ozs8SkpKLCw8PDwsSzs7Oy0tLEo7Ozs7Ozw8PCwsOzsePCwsSiwsHS0tSkotHixLSzs7Oyw8PDwsLEtLHh4tSkosSzs7PDs7PDs7Oys8S0s7OzxKSiwtLSw7Ozs8S0s7LCxLKzw8HR0sSUk7SklJSjxKSi1LPDwsO0pKSkpKPDs7Ox0sLB08PDxaWixLSyw7OzssOzs7Ox0dHTsdLCw7LEpKLDs7OzssLFo7SzssLCw8PDwsPDxKOzs7OztKSjs7Ozs7OUo7Sko8PDw8S0ssSywsOyxKSkk7OzssPDs7Ozs7Hh47PDwtLCxKSjs7PDs7LCxKSjs7O0ssLDtJOztLLS0tLSxaWjtKSkosOzssPDweLDw8LCxZWTtKSjxKSjs8PDw7Kzw8PCwsOzw7OywtLUotPDw8S0tLS0tKPDw8Ozs7Szw8PDw8PDtJSS1KHR07PDxKSllZOx0dPElJSy0tPDs7Sh5bWzs7Ozs8OztKLCwsOzs7Oy0dHTtLS0paWko7OzwsLFo7Ozs8PDs7O0tLO0tLOzs7PFpaO0tLSjlKS0pKSzs7O0pKSjw7Ozs7Wlo7Ox07Oztaajs7Oyw7OzsdHTs8Ozs7WlpKWjs7SktLOzs6Sys7Ozs7Ozs7OzxbWzw8PDw7LCw7PDs7O0pKOzw7Ozs7LCwsOzs7OzssLCxKLDs7OywsLDstPDxKPDxKOztLPDxKSkpKLCwsLQ48PB07OzssPDxLHR08PDxLPDwtLTs7LEpKOxxKSjw7OzssSko8S0tLPDw7OztLS0tLPC0tO0otLR07O0srK0w8PDwsLB1KSjw7OzstOzw8PEosLEtLSzxaWjs6Szw8PEpKSjssSkosS0s7Sis8O0pKPFtbLTw8Sis8PC0dHUs7Ozs8Ozs7OztaWks7OzxKSko8PC1KSjstLCw8Szs7Ozs7OztLOzs7Ozs8SkpKOztKOzs7OiwsSjs7PC0dHTs7S0tKS0ssSkpLOzs7LTs7Ozs7Ox0eHkpaWkscLTs7O0o7Ozs8PEkeHh4dS0ssLDo6SjtLS0s7PDxKOzs7LEpKOzw8DkorPDwrPCwtLUotOzs7Ozs7OjtLS0tKOztKSkpKSUk7LCwAAAB3SVpaSlpJLDw8WmlLS0paSkpKPDtKLEo7WTtKOzs8WllZWjsdOx0sSzpLWllKSiw8LC1KSjtZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCwsLCwdHUxMOzs7WVk8PB0dPDwsPEpKOzsdHSwsDiwtTC0dPD09Wjw+Sh47OywsLDs7PT1LS1pLPB4sLCstSh0dHUpKLCxbTFksLR4dPSwsHi0sOyw7S0o8Ozs8LUtLLC07OzsdPCw7HUotLB4dSh08PDw8PEtLOx5KLEosLDo6Hh4sLB0sLCxZO0pKPFgdHSwdHUotHBwOLBwtHTw8LCwsHR5KOjsdPDw8PDs7Ozs8PDw8LFlZSjtKOywsLR07LR4ePDwtLR0dS0s7PDs8WkssLEtNS01LPDxbTB07O0sePB4tLB4sLEpNOjseHh0dHUxMHR08Hjs7OzsdHR0dLCwsLCwsLCwsPDssPS1ZSx0eOx5aLR1KLCxMLD0sKx4rO4hdGUpLOjtaPB1bAAAAAAAAAAAAAAAAAAAAAAAAAAAWFhYWFhYlJQYVFhYdHRcXKysWFhYWBhYWFhcXBhcrBwAALTwtLC0sFhYGFy0tHxYNFg4GAAAAAAAAAAAWFhZGBxcWJR4eBgYHFwcHBgYXFxcXKzwWFQcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJSUlJSUlJRMTExMTNTU1NTU2NjY2NhM2FRUVFTMzMxYWFSUWFRYWLC0WJhUVBwcVFi0tLS0tLSwsLC0sLBYWBgYWFgYGFjcGJgcHBwctLQYGBwcHBxcXPDwWFgYWBwYWFxYVBhYGFhUmFRUWFhYWFi0sHRw7HBsGBhYWFRYWFhYmFxYVFQYGFjQlREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFiYPDw9aDw8PWw8PDw9cDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9fXw9aXxQUHTsAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw6Ojw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDs8PTw8AAAAAAAAAABeXggJCAgICAgJCAgICAgICAgYCggICAgICAgICAgICAgIGAgICAgICAkICAgICAgICAgIXl5eXl5eXl5eXl5eXl5eXlwAAAAAAAAAAACIaUtqS0lqTFpaWkoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tO0w7PDw8PD0sLTstLDw7LUs8PC07LExLSywsPC07HTwtPC0tWko7OjpaOjo8iDo6HTo7LUs7LEwdHS0tPB0rLDw9LR07CgoKXgoKCl5eXl5eXgAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvG0o9PDw7LjwuLCwsLx0tHx8fPD4sPC4uLhwtDiweHi0tHkw9LR4tLV1fX19eXwoKXl1fCl1fAAAAAAAAAAAAOystXS08HiweTSwdWl8AAEsrLi4dOUxNLS0AACuIaVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..ffa28c830 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -0,0 +1,107 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### tutorial + +- `@function tutorial:greeting` + +
+ + ```mcfunction + say Hello, world! + ``` + +
+ +- `@function tutorial:obtained_dead_bush` + +
+ + ```mcfunction + say You obtained a dead bush! + ``` + +
+ +- `@advancement tutorial:obtained_dead_bush` + +
+ + ```json + { + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } + } + ``` + +
+ +### minecraft + +- `@function_tag minecraft:load` + +
+ + ```json + { + "values": ["tutorial:greeting"] + } + ``` + +
+ +- `@loot_table minecraft:blocks/diamond_ore` + +
+ + ```json + { + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] + } + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..1ef1f4600 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md @@ -0,0 +1,70 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- [`@texture minecraft:block/green_concrete_powder`](green_concrete_powder.png) + +- [`@texture minecraft:block/green_concrete`](green_concrete.png) + +- [`@texture minecraft:block/green_glazed_terracotta`](green_glazed_terracotta.png) + +- [`@texture minecraft:block/green_shulker_box`](green_shulker_box.png) + +- [`@texture minecraft:block/green_stained_glass_pane_top`](green_stained_glass_pane_top.png) + +- [`@texture minecraft:block/green_stained_glass`](green_stained_glass.png) + +- [`@texture minecraft:block/green_terracotta`](green_terracotta.png) + +- [`@texture minecraft:block/green_wool`](green_wool.png) + +- [`@texture minecraft:block/grindstone_pivot`](grindstone_pivot.png) + +- [`@texture minecraft:block/grindstone_round`](grindstone_round.png) + +- [`@texture minecraft:block/grindstone_side`](grindstone_side.png) + +- [`@texture minecraft:block/hay_block_side`](hay_block_side.png) + +- [`@texture minecraft:block/hay_block_top`](hay_block_top.png) + +- [`@texture minecraft:block/honey_block_bottom`](honey_block_bottom.png) + +- [`@texture minecraft:block/honey_block_side`](honey_block_side.png) + +- [`@texture minecraft:block/honey_block_top`](honey_block_top.png) + +- [`@texture minecraft:block/honeycomb_block`](honeycomb_block.png) + +- [`@texture minecraft:block/hopper_inside`](hopper_inside.png) + +- [`@texture minecraft:block/hopper_outside`](hopper_outside.png) + +- [`@texture minecraft:block/hopper_top`](hopper_top.png) + +- [`@texture minecraft:block/horn_coral_block`](horn_coral_block.png) + +- [`@texture minecraft:block/horn_coral_fan`](horn_coral_fan.png) + +- [`@texture minecraft:block/horn_coral`](horn_coral.png) + +- [`@texture minecraft:block/ice`](ice.png) + +- [`@texture minecraft:block/iron_bars`](iron_bars.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_concrete.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..871889831e3bb02dd6bb5008e78299a03852c9f2 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|i#%N%Lp08pPCPAmK!L+$yM&YO zBq4*p*C#Ts*wJS!BVqS0x}~(UVt@K++sT4bx-R<57F(ISe_Y8qt2omqd+m0SkdWA< zYWuA@7HdW=|D_IVgU(ckM6pOFKIwb^NN-I+`Th?Fc#a!g zeDp5p=G5-ell`k1*53PWA-h6QKUA*h(6aOYvwqjjoBFIH>vI6Zmu1G$*PgPcMV_=< TcDnN#(6tPnu6{1-oD!M<+BjIr literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_concrete_powder.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_concrete_powder.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c78ec9469ec5696939ae9d6671691db1bcd02e GIT binary patch literal 615 zcmV-t0+{`YP))>3KcC)(y4=H+K-;=K0mLYs*V*>pR$-@0xk}c}aE75iKbm$*%X<)^2wP=C zn7ym#+A22Zh5#!PIshrz#b|CXMT*thv}4w)DN)5ui)d}5;Hnjt%V4b+X+?DOy-z3C zOr;dA0t%e-q*XkxoFMdk9&nwc3v=jrxi{A?>7wqIG1CB;6rv*3 z+6?=#)csTAK4U&8B_fkb<#TOQtn<4C4d;=j*DTpdq4m*Due-5??ZAF0^IMr- zF0K`k5GY6ItTu*>gHkU=^2cAt^6<=+{{H7hs%tu&f7A3Mo*R({uFMQ9e6F^ilwevO z>N<2hSQ}&0p#(}d(eZ4%aZfRnQcM$%`)J$55S8*Z`tfzP9xz|fPDx?C|5upHHV3Y? zAH8#A90F^pCLc~w0k-p7hdJqe)=j8Qi`D}XOy5(Gz zy-EX75QXnkthMF`d!Hd-DjNx?ASA_NkxEDt1WA|1GF2KoeU}7GQY5eA7ry1J2*d83 zx#!HBnLDL^zrl9L6E=M6VmW_&Jz%fv?(DO-`Pmc1Eui_~5W1W6?_aJ%7>q8T-zo_6 z?|!|!5LUbfjSnGYpm4^Eiu4e0;SeuD6T-H;0}--v4Vnmq>FUb!S(3U@611h{!^A+h z1cZX-^cPJEz9<2$Hd_MO^q_&}!rWX34H;EvBhogFV{SnZkRjU1Dz9XGb}2`*j>4#b z9)d*~;B3n@s*+{|v_mf$Xx@kecjR_@>apONU;=PNG0|M7OW(nkT7uD_)1vAL-adAk z3e1OgaeN(fM>j4|n}OD>20S@@|8;31D>uuRZF8AJ$a-s8?_b3iM$a%sTP*+p002ov JPDHLkV1ihBoW=kE literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_shulker_box.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_shulker_box.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4214c6087c4a2a03cadb3079e5eaa3860e3281 GIT binary patch literal 325 zcmV-L0lNN)P)rgA?rRrelRPmX5g`P%E&uem8W$u2H0YLedhN0duc444l&_AqPiaH?@##f0 zYoIsx&;`PAMaH{W2q9~eJM{BIL!oqsl$yX}<(AgBk=su4Z%{1_%^v(4^`>XlD#Ckk z1ev!VRClZmfyc@x0IhNw3iEIQ(7D?Kj&C21jFiD`4zBDRAMX!pP!7gNF8D+kv)BK> Xv}V(<`LLT?00000NkvXXu0mjfYQm6$ literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_stained_glass.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/green_stained_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c0eba962a1c1a5c52b70630d6738f95b87a4e9 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr_~TJyx5?`EaH+7+pGX zB!YK_Zztns&BB8@S(S-b8U&LM_p}8<#D$2tM__s4y^of# zyJp6mU*@PA|NKC*eys#4z{Q}Vb185)}keelh{@Z7=k{uiYW$@$c!@w zRK2bi>fYnd0WD?__e{L4h%LI#3;-bBt{@4aTlXHbTS*iEZ7IjlYO7n6iAl`F_dS>B zTU9VKV0Z1*ICfV{i?^DHm^m)w40zwi7K^d3sLVKnph!f#_qotrEfZJ-P)W4U+ki}H zoipYfxBEy)D8#)NeBVEEjhGV^`yS!_o~m11@@ z=Td?}429vn3O=xaf;Xdx*icl84SUCe<+s=EvxZ@2XUJxAPTu4rwN95dFRJUu%dL~; zo!j|?w_@XLseNACf39@L<+Xl8zH>k42%3X>+P$0Kd#a3n^Evt`6m4BCI`K>?UOifA z4(oikuNRV{-lQbEeY4R2E{Qu2bFP%)?n~Jj{FKD-F)*dT$OKN*WQ0j6 z5ozRE)&P{a*Lo}MQ4Kew^7_d-ew7 zXvo`ap6rSsYRq7~#KW1TRA_~jAJ>>o5_#`4=M$Yh00Zsr4Garc-ZXf$75i4^N$~&< z18DPj+k4Ei+4r$=ra_Uo>XrM9a|(|jg8}#`h|NQ(2}qkvezMtP#ff=rkYD8WSN*@} z1`6?X=z!79#|G-kl9K%lMzwj8JAnB31b7r7p$T-57A+QFPAvOh`Qs~+3S!&zW(HeA wW&L~s<4pdsX5cOBE=#5%SFz@vVjg-=fAD?X;8j>wnE(I)07*qoM6N<$f?Oll*Z=?k literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_pivot.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_pivot.png new file mode 100644 index 0000000000000000000000000000000000000000..079704823db55c2cb5de15320f638c4314f13c57 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr_~TKbTMY(a-BX!_lDU zYy-D~c3b9#%OZyiSe7#?96cfBc*Dz8K+o+0>x(W&Hi;7-6L&DJXMC}(naANfmmjl3 oSK_P*hG!g_^dwjpCj>AscuU1B^gHl}6=*(#r>mdKI;Vst09bM@I{*Lx literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_round.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_round.png new file mode 100644 index 0000000000000000000000000000000000000000..dfedeb0dfc4b40c6046d3863d14a9a210590e15b GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0KPCCfRpvc3bd!6Y| zbW^?b2FBl~4G%eeC_cH@e}bst^7hFafZ2SHt5@5bJfauqF%B5 kp`+4dw{UBlQ~$O2Q`Y@YH;DT91n3wBPgg&ebxsLQ0Q&w%!vFvP literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_side.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/grindstone_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa2658e2201125ca2473f977fe93411488595f1 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALo80eoph0tL6OH<_B!LA za+d$G2Uzc%S9V%*6Ez< z?F=R#1ZInJ{1ra1N?1UQ=}VdQHrB)K+zhMk%_zRNa`H}wj%_EI1>P|I;JURYtxc_n zsWswzWZ_KifbW)#rb4DHdt^6V_#nAg->3KfjHq9ayV&byR4W?fDJlUS$l&Sf=d#Wz Gp$P!boKh(O literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hay_block_side.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hay_block_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7b734ebc58d889477085c9ffeb70a41934936a6f GIT binary patch literal 274 zcmV+t0qy>YP)J^uv+yDRo07*qoM6N<$g2u;nSpWb4 literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hay_block_top.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hay_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..84ee05ea4188ea5ba3ad4ffc7b2f129fd3ab3a39 GIT binary patch literal 267 zcmV+m0rdWfP)%JXJ``cyp zo<-d6wJ#+LM27^^axgEZrabxk-Wn+Hodi&Q%NYo&fHTbGL87x_Mb9oRi-87O&@PmwdX0t($epEiBFJKj=(4iG9*K`J@fm>!G4-$%-Kn`@f*#Of`0 zD}OFz&-qd_UM_L6(uan8K>Hnda;orF@}D^XGHDtV&Nx9U@af{f)W+nLYJbhzJfknV RS5N=|002ovPDHLkV1joeajgIV literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_bottom.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..cc13bc5b592a5c8f213e445d082c22d3b107c12f GIT binary patch literal 268 zcmV+n0rUQeP)tfFKBxz$~BhvL1%b zvYE;6#`|_!iO>C9ke%miJFd^`Qm6X`FX!lvI6$y6TaH*JZjl72e>18w)s*KG7FH?c3ib$LeY$JELD zx0tMR>e_uUBehto!@YZ1pg>CS---6kmclMG6=QZP=s&Mhc&^!Lc`Rm4&O83?((4R* Tg8V~)K4S26^>bP0l+XkK*`;Vt literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_top.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honey_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7deb75dcba92bfe9376c6f6a004174c742675807 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-hJY5_^ zEc~ZVy2#69$m9I^G+$5Q>kZ7s8yJo62&juCFxuU0boStQ;?WnQt?;AcO7`a%>%9^E zvsu5|_=c|koEP!h{8ib_=l7ED=`A#vE$SfL_5Azmh3D8A+pRAoZaAp6)i1*JP9SH6 z-TAjkEP;}Zy|FB2Wv#_u+79h^u$u0;VDpLz=bQbU^Z$$MHRf5^{pCBy5&O-5{Uc{T z_PX88KXN0r0?xm*Q`;0>=Y>ZZgGqxx78_eu^&>Vc5E4xg#Xh&`P{=0o&r9DlS V|NCK8eF^9%22WQ%mvv4FO#sA8Z<7E3 literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honeycomb_block.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/honeycomb_block.png new file mode 100644 index 0000000000000000000000000000000000000000..d19f7a01ec5712461c9bcb412831ba69a897948c GIT binary patch literal 264 zcmV+j0r&oiP)*sQ|&%W6Gxbf$C>weq& z>#}PR|JTDOz`+y`%ph~f<@gdx%DCl6PWF%!#sW~C&_K0!)P02zY%;x8YliE>3^ zIuq8Y?GoyPY9@mZlwA2>=98a3U;|ShtTZosp0-^1plcQ%ly5_xyJBxnYnE#YUrxOM O0000uYooPF3OdXr;k*fxIhdIJjDumxj8FSui5%v&ni?FEa s%-I<+Jx-}F^U(ZGR)ZXt9u18>2~Vc={;lZW0(2FFr>mdKI;Vst0Hmx&ssI20 literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hopper_outside.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/hopper_outside.png new file mode 100644 index 0000000000000000000000000000000000000000..b6265ea93744b54e850abca8247fecce40959ccb GIT binary patch literal 220 zcmV<203-j2P)>uYd^#+P8fY~Zcd`np~JFYpHLE8GD*XIqYIk5_^v>3uE9uHXET?qCN} W^T)fOVqdQS0000h{KqB= z3Kq0B|@sYt+1)fW%8ImV7J61hpn=vEe&-U%bN?grXk|Y==B`63rTsg$c@UuIH z*`Z3)oI&K!6DfvE)-pU2KOz>~U|6M^y2)60=}k$7v>sKS*be7eK-(BRUHx3vIVCg! E0OV9R2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/horn_coral.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/horn_coral.png new file mode 100644 index 0000000000000000000000000000000000000000..299064deefd5140ad5c69719662b3abac5cb0747 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>pfi@Lo808on*_^V8GLAJE?p1 z1Fg6-(G~0mFLGO0?y#_aB{?O(LLghK)HvYMv*)V%nbZCTZQE*RxiEL;DPzut1IhV$ z3U{9G^J3<3+_AXb%%9!CL!t0ZSM*m6*?wyUE;bhXxjRb?s{HOPYWyE~H|&@uL*}jq zw-Roa8;zVt%AC%;786qq~Yli^Qm?RLO zlXIpsKnbQf0}zDWuY7y1+*8{DFru*qWCPb6JsA?EKyI=~Om?(z>5gkk|J$N=DAk8l zysZUlNBE}QJ}cF2wP}J7a0;zf{?|W`PA#*NE=(57{6qV|YPAPp+k@b>F6!b=hrX|R=81Q5y-2a&*DWUH%y(6OP0EiRM%PK}dg zx4H@kkvs8`bBlv%y4@(i!y!PLl;mIiL{DkL*TTCFr- zLRQ@pIY!TOZIZ|lmj+!Gfj%e8A6p}2|4F((*W{lua?ZY;zF2HKTo|g~kr`7Wx~ikm zbvqO6jn)4lFE8k}&UNYjMHY`vwC+oDPdL&Kll29nH1nzb00000NkvXXu0mjfrXXb& literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/iron_bars.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/iron_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..aee70f3781a28d3079c20e70eec1a2cd04d04fb1 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo7~DoqUnEL4n6ba=O0# zpJH*d1Ew>$i(Pz_%eR>sHg219hdF51;(1%&AHO!4^Gxx%ygZleTtSC-(;3PFy(FDx z7zbWid0*C~2X5pOz2HdmbmT+v~jJ|iI+_7+Cej{ha`j1RKNAwgHByKhaI*-BA)z4*}Q$iB} D&KXQL literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..1b627ac30 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md @@ -0,0 +1,20 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- [`@data_pack pack.png`](pack.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..0c084ba0791f2a6adf5b99da10fa59e9e0e4d0dd GIT binary patch literal 4638 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 + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + + + +- [`@data_pack pack.png`](pack.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..4af17f2c8 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md @@ -0,0 +1,26 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- [`@structure minecraft:igloo/bottom`](bottom.nbt) + +- [`@structure minecraft:igloo/middle`](middle.nbt) + +- [`@structure minecraft:igloo/top`](top.nbt) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/bottom.nbt b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/bottom.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1885cd3b0fdc8bc3e6ff9b40dfc168474b6a9fa7 GIT binary patch literal 2794 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 literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/middle.nbt b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/middle.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e3a16e1e0f72522d20b77aa437bfa32dad701e54 GIT binary patch literal 236 zcmVfyJhrH&kTRS{Rj8AY z@b$${MrEjg(f=^IzzbKcwLGdIk1EKs=7r3ycqHmEk$cnwxx@{&19jGq msC|g?i7fealXTSg9OqQKHxk-&Og4DHyx;;)LB7@G0ssI$fptUx literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/top.nbt b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/top.nbt new file mode 100644 index 0000000000000000000000000000000000000000..86a909291ae43ab4dddbee95e35c99e3f81f2184 GIT binary patch literal 901 zcmb2|=3sz;r85q8-8K+t6V0At5&11ZW9gRsOUbvr7fz9z7T5epqqFn6(I%&i`Ahnv zE6pFzSYvDK&3sSb_vU~9<#{(<(_T7_>(;0K%U&zrMJzeIL^*!dovRyrmS%^3k6iV0 z*{7o$W0%U;Pxmt4cXalL#aoSXw_J>UCz0%MK%!}8>|j^9c`s86(DMY^QNn=?H(3INor8pW{!1!)cDJ4xa1DclIa)O`lYG9ca~^eSXGKl6Bk?dHf4z zTE4C2l*r3J{FCvZg@VL!j%Q4g?`CSx zKXT8J$e28%ZeMMfpW&4GJ`dEZTjyI|Zr@(rsoD0rQV$r=-|GH~8i0cvMLSDf z&w+ly9|vo>udj}}usX^heh!ig7e{F?eeHWD6ye;Y%dMVIuS zU+-N!b!zn2XB*eV3ck^+yQO+gOfUF*#qZ|+ZLd6jyz5>(>z8|#gxdZY6>@+7S^YYe ztA6c5;<=}<^W~={Or7DHtS!Fy^*yHhs;}*Hy8eB$3X1;y`PWO=jfYk<&)rn;_vQEN zm;LKcSMBdB3*Nb8^DoJo$4=irSw3WsemkXa-^r_YEh9On-hV$idGqGb*Pou8oF6MO zXU6-SiEY8lzA4IG;>g_at7z->`tqyazwPKdXcqnc@Y-GLPOVUAyS(D_l3Q-^yGy?; zwCHi&mMSsXM*h@`YpuM!-G9IKUw<9C)Bea;yBqg8dVlWX + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + + + +### minecraft + +- `@font minecraft:alt` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] + } + ``` + +
+ +- `@font minecraft:default` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- `@font minecraft:uniform` + +
+ + ```json + { + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- [`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/glyph_sizes.bin b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/glyph_sizes.bin new file mode 100644 index 0000000000000000000000000000000000000000..69c857e36c2019c5b0b682c50d23dbc2755d0335 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..2e51c28c0 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md @@ -0,0 +1,272 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@font minecraft:alt` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] + } + ``` + +
+ +- `@font minecraft:default` + +
+ + ```json + { + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- `@font minecraft:uniform` + +
+ + ```json + { + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] + } + ``` + +
+ +- [`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/glyph_sizes.bin b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/glyph_sizes.bin new file mode 100644 index 0000000000000000000000000000000000000000..69c857e36c2019c5b0b682c50d23dbc2755d0335 GIT binary patch literal 65536 zcmeI5-E!MVmglkCCBP+%K+IYIY>@yXrb)^s0P4b$Y!RU9M&&9Ilzp|)BT^riYrA`{ z%M~-Rd+UjrjedZh>3M;jC)kL6gN}WIeTIF7{rwXp_0e|qXH56(=tLRY__e>~!gK*7)Ps|4= zz4$j|PV`BPxRa>wk#XQfy?8J<7)1NM-dYhvHF*ypx6z`xHoisGeMBQgpl zN5XHZ8%EE2AqYX9iIbA|NRhXKZuu0hY(MoQn?~mtMea}>_2VdXMN3sAqRC~IlkVob z3W!u`(V@6Z+>*fv4#N;bl8!<~_l9C+EGZ4`;tr|({s17tuovy`@Avyr)bGb}zkkwi ze!X75Piz?N_g@LXuqU6PZ3+~I2M2xGBnH%LY!i>yWccapTA`)GgWEGnDEHlzaTGK% znqaS?l~~wOAaX;rb{&Vd6zw~r=V5e!$BCTSfNnCP`o$j;EKuUuG%)cI4l=^CA^eI5 z3Pml^GEr)vp|`9->15C))KsmJZ_>!Nv7co;g<3`#Atv_-`!YUV$ZhRze1zPJN56rx zg$9l8OQi@hxvZ2_B(j8KD>b@F`jSg7%vyF0Nf@^Q9}_0O2=7gjI2Jxe!tJ}<4N3D= zK44?Wh+oQV;+kqRszq{}N?Ki30!+RVU}WCDBR6)OAOE=5$MzheIgWN! zCr}6ku|h9?MwzAlhl7%#}zbH{|sC zvRfqy_xI!IvE=lORoqH($0>FND2;J6v2IF1$WtW9mn5rSlQ>A%?@y}vbUd8}T`4h} z590CMI2n(mkARo(eza54i>M_+X_5j*)JfCb-L!g@rfEO@DoaL5lBTWJWS97Kov%qz zmgZ(I{}oiLG`$HR592}KRj*6{Uus7&jS7#bA36l+kb3He`60}Qq33QtilRKv)xW8i zQvzcX+ol@V7bU{Z=vbc9vq18PgKgm)Qb0l!00RL_V(g6RC)YCmT|4Ue`UqWSz<`TObyOp>KG%K0{}f{j!J!#;Q3e0e>c zD&56}e&pmBuaTte6$fQ?J)9P^I?LwsAQ%at6)FETxB#C~ky3t%K5bW*!(!MjtMJ?1 zVY@ER>#>s^jgDutBWIX7byep>@(;m(LHVzotE+40`g#F?E4j;iT1YGMFRQG|j-ENA zdkpjIYp0#;?Ci9Ms1;?DAaBFosmr>|>Z7tOcgmf`&?!5^op!r++HGf8mf4Q-znERr zi#bK!Y&p(WYhA9(OXX6QPLj>#CjacBs_W^rUEa&znHNs>FxzQw5m6LvfX<7dstlcNw?3!Q2Yk2rhGHYb$WFBI$rtCoejFGCeKwPSF|XxzUSO1SlmTTdJ;~ zncNYuN&5r;RkjprCB2i7)S2gV2O6d2CXOFYK4G89%aSA^`uYVd3Ton4aqte91pO9d=Dkj+ z*{{ALgt)qR44t|Yu1F8}pda_mC{HLEJI>b(YcLTdRh4$7pX1z{xi!M?UE_Fbi`l%# zd~841A21h)y}p-ryR35JgE-!Ov8$Qd9XcQ@(v3*tt|FLN!MEF7R)Nbf1sZA!Cq;qM zb+wW}Q2Y}@o+3)oOU@XFfpq2nrvodSwH37diJdK^x4+% z%O{-&?&F=U&CRDrPo5ne?Hp}B*?hXQ={{`d51%|a8vDW3HACA%m*#fGSl1mMz1TfH zKmYdV{G=aUyxyXz9_>D3C|oQq=^7atudc4<3ofE0X)hSC#^dorsNHTKb&eL-oAlsx z;8)j+>DB!F^qk?8gwpnJW}5D4u^DpV%N&O}Agh{Y38N6LMQ=*R0-ZHt#Ls+j05NXN zd9bUCi1qbgmpjRxuIR;+7f+wzdHl3k(?qUR^FBFd#l%oLYVMPYesDOM98ZoD6Y`=M z=3*RX1s#RaDG2@-^ow8q;+Lb*DAQM$|C!@6esdoc&5i4xT)O;H3I6`?>rqJ;2`y%4 z`YvW=S(R0_SX5>Helc4t>IMBey$bnuiy|m6-9Ww(0h2C5rnnc?B%hR%q$tkwq^J{U zIZi(-7?jF9o#y#89~ZBg!d6LD?G=7nq?l8cq*YN>={PI%YFxpTPpifBY*-X!Q4*Fh zta6z+UAUNO$e&kqO^sjtlictRJDp*!Uc4iailWm&pK(zzGb)P2Nhe&K^Tl*Hf0hp` z=DyjEl;S&`4$CAd6Y_)aIDxP2`|WP0&3G52UAoJh7Qip1muKj%>E_8do1QW3>03lE4Oh*eKjPN#)aOe;pLIc3#hFV8>J<%~%Ml~>nrXaZB#WW%UI+bxC^ zzRD(fRqXfK)#yYlBuurN#Xt5-M`1cR^*nN~eCm{OE79G=;)TlpH#ZTTpI&58^( zV$|XTio42io$|)fWM&F+hoND=ePwuA8j3RG=8I2UDJKg z87RN15|cPxcUEdwM0236k?YFf6{@>Qw!EwgcPlLJLx?D`s{6gIZJz+k*T+KpF z25H*MleEPcLM|+C66bDw&D40B)uYLLQPO4C^;yYUkzRgsKAF#|Y67Oo;&{PoWcGS? zR?imoMG#zFEG{nSSRMueQ%~P#5jn5t1YKQb!Tjap?KGGM^8ph9`u6;+E=N@}9y#0L zUwUkwy1me-=OiDPyZax$t*Q^I2UZ{uqgbxa3934|Dz@sNNVWC)_3U+>F-AUq*~#;# zPhoue@^7lMs#8^uA6K2uS^e_y0E?&eT<>EyVo&SsB`XVzI{B|JZ=>FBVQl9{PM|z_LIktcZZLk zJbC~qzsU^xwyKQ+|DRpUDO1|Q&jU7R{82Dw)kGsr+Sq*% zwA-C5NHaC;+-I?t`Bl))Xl-M*d+Ilx?#^a67=Lx025D7gX6gN|JKFrV9y1dOf_IB~ zasI#0&(D84u6zCg?Um^;bK-D&V`F=Jd*jDoIj^tAr;EwO(YQ!17L)w)xXRuaXJ?~& z!lJdP-q6(N^G#;mTHkfMH7$RUE||^yaVnxbs;lB>Pd)h`WVcX(c&|^)=l1ovWOO})EA$1=vtat)~$VV2(5soiXpDW$Tk~lL}=b2 zGJ6pwsPVh*!2uRPx|RQP{EpXrRyt_Lq-R+T|G|OoF)RMYe_!5>|89D-W1tNYh#KEN zXdYeQmp<4f*3s;O3diF^E@v78C( z5n$vFXq}#M>fxJ_Lt|3zGF4+S1nZNhlS!OcNM-6Pql^8f2F$PP`-n-avv zFVT?PQN%MODnkiHYE_?sqZo)?n{di^svr3H3@EFO2p-$}W?wTM)h;{kwtnr!a=PsCy z>0mz>e=B^Yskti`W0m(9WH(D?F(X4pP185BP`bswcJ5Q~b{X;9?#YvU7!9KtwXdWH zhueqS-|#_%2q3+PphF>SyxWHYQO~&r5w&7y^>|vICQRM3JVJiyl7sGy3$7?S6s(6a zYy6}dxNOA~Wt!$&TU$)eSZkC?8Z!y=lfjP%;n!hvMU#EhIiZqStneJt`A(HM7~EQ2 z?d~S2dqO|JP9Q8U4Ni_^#(d_^mTzNe%~g{fekqSO46*fX0+M!`J`w4O=JMI`?Q|>m z5_nL#`$k50Zh`O*G2`yQXQ zDy@fKdK*9b4?kz4DfqwM&pk!_JO~;a(zV%&S+)G-Ghr&nv<+F<4QsruY`pDnzF|*B z#&5;}Ik6uuknT!~Ju46X|3RPLNEpN{yD&nsjQd_+mPn@(d-=qRWgUi0pJp~xkxHMb zq^6HStlT$OSwE?_$-%^7lnvq7G6qkjLycVihYOyWhH|_V| z@6`vMQQA$-JdD_=?xdrXO=PyiMnop;iS_$tr-YVb>c{uPG!4VF zm-f1T80t4lnqNBOv!vOKTI~8hL44!5EC=tXm}Yn2)gyZO?Lnw#3H|eE*5$^b998FVY8K& zBnTKIjRB}ETT^Jlevp=ZqCDzX%)(h6O*QKcr&CrvVaay4|A6KiMF(tWYg=0da9z1Z zXorbaXFQ=~pWTplRr7oUGM5cHmkkP%vAk@k9+T;KV?#g9S=Zr4cyYaR0YLW;c}!-Kp#K-HAJ3Dr zHx|F!k8UZ4;ZJWGa5Nm4nsPih21}-0?%;rlK2c2gC5=@4 zJWqei#LrS&q0K1VZuI&4w%VN6`|xOyI~`rZ@> zCD5P0$B|PORap8U%ssCRH?*CNkPZHQ5_viG9xeCYRHvA^$gHfCl${Li@wrtGcRzaW zK37W!_oXf{u_WuU4Y;<3U)%5SN6D9)U-JBHl0Co%3;uVIwAwdATAn0%vQy}v8Emh2 z*g-a=b(_W_g|q2gIcyc{>pb-RhyKHd&amBn(q;#7Ta!?4K4znX_O^`P)TjBiZmBVp6~OLKDHr z-|#o`?uPGeXl9@h4C-hYZf$Vg>TERQ;lF6|n^ZK_RFN36hB`kP`99wz-PSz#ZvMpo zNnnQ8!rw^s-;XLO{GZLyg{+{Gp9bF+b>WY4%}df24+M_y* zm-!r-_~k`Bnr8kX^al(0bmo7!VxN}#YoP`wH9Y;LW}LL9=Sgz3HO-Q|(u9-+364DZ zu1)3h@P-Lz5)^)rq}VDI7zBA)q=jF0e1?i7`RBj==fC~wU;p&4yWOPI?J{xT@(Z<8 zJw8^Qbql#M2V?6zsi&TkAQ9_U=k0~_@%^)B+3=ZYI2`8B7^oQ8rHNK)m}Zi^*k!J7 z^yc#HC#BEd>asL{R=iKMv-G?9>3Nk*viaM2HOgmck*&5COcExbeWr+R?N;u_*+%(m zfZPrEt*UpWi|%)m|JnQgt?Bz`52#hpB481)2v`Ix0u}*_fJML}U=gqgSOhEr76FTZ zMZh9p5wHkY1S|p;0gHe|;P*k`=84sa9 zO-aMadQ%tfCX~qI&xHhOIGmkh5S5UFf+-4z;)7$ zS4JdBkV>%(6iN&VRI)ikxK@_Pr!b=O^t70wG`dYm&GCn)r>bg0o2|mq?WampUhS{+^3)QHJu*r^H~SWjU@h0t{7)h0%ETl(9KBjFo>QXq0C2qn=LRD76MAY1kBpN$~ zr%3P$Ug3v5H2A5_KpYke=5ZlWeg5h`O<`BH_mYE|h3LSym3 zAc(N%Jg58m?o{ZX0@M7R>QstS(bEzWQca$p&#AK{ugCTL9AuG)^z+}n<6EYnYJfGF z&CuukTunoXuU%t7P#hkadW#IdPeDmy;xpvrK-@Pv*d9H_ki` zOr^UhIH=o=i=rE~B7c1vGEA?$IO^+wZO@$T979>fdC;W$*P-To<9`2<=s$n&m&Hn)|t|I5e-803M2J#^l~~fR;8k-{9d>Nokm?0I;q<8;<&1Wg6BpY0nPEy zQAlbb6LCsxr|h(q&IAl}Ml`jO|PLWr+pv-`Y#+=_m6OIdAK0(*l!TfrAJGpfV z_DY1)oJ%dEyrJ><#{DT*Sxu^HCE@Do!Iuw2%@xPvP2*o*9yhLa{DTKq_vm6J%=!4P zeqW!ypUvq+)`36hppTuIMm3?O77TJ4PC1Esrfv*JQenRZBg=R^r(hqMH;mzdAz=`& zk}R(#G{eo!%`5#3-O6xX&Rb!BR?fZll-ejqoE4nsdr8slcB|vO8jVJs!q1tK6zOcj z3CG3d_4W1DHATF<-n_hCm!Zsx%YwczJ@h3;% z_IcpeZ4s~tSOhEr76FTZMZh9p5wHkY1S|p;0gHe|z#?D~un1TLECLn*i-1MIB481) z2v`Ix0u}*_fJML}U=gqgSOhEr76FTZMZh9p5wHmS;RyW6|0HY`un1TLECLn*i-1MI zB481)2v`Ix0u}*_fJML}U=gqgSOhEr76FTZMZh9p5wHkY1S|p;0gHe|z#{NxjKC+} zcW8q?i-6;NHtIJ=7%TYAY=10{-_Gb_^HR>}HnUzr+Pr`CAc|eR?DMQu6bdy&g5JQ1 zdb~Z;iJgArMEdfc&z@uryeQuI9e<=h zh8Geb(%VVHm=}}s-SAu&t$7zI5!{zQliF|>F$MPu-0+js+op{C%v(>xvLspaT2qx> zAn;aGNowRZfnm(cU6u2vXxH1-OI4%jE{6+w8yg$IA(y^v=NUW3`a;a|DP81fnm^}H7^()4}} zw7OzRxOKbY^Zl+L1l_<7y2ix?=bj(z5em;&dwW~mZfkF=)e4l-aaz7l$W}lcDWOJ? zaY(Ih(Ao-utpKJy1@eP$r3bzrq%IwJHFq)edoM8fA>xj z``+N7&o%U#UqAL}H}L_#4ew-E*MYgp)mZYXIW;!TYlW$!n_t5ti(ma#{PIg$bMKqG zWMK5f4ERud=O=UC&78jd$HQ{6KiW@tZE`i?Wzbdm;X__b>SCl9q|Zjh^lZY*p^LN8 zM6a;sjmp(OBrnc`w=-Uh&8x9z-=CImC%iSbUM$8ly_&xMhmS9K0r#WB{`S7iP1KM2 zyb{>+BJ;t9v3t)uTn5NZJk}dU18*0*?DYcLQ?$FQw-C#sJvXG4h90jXR-@6YlzXC( kJ1-b^xrea!xko*{Pq^GGs*jVA^E?{xxz*39;-et=e;>(4#{d8T literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt deleted file mode 100644 index 2443426bf..000000000 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ /dev/null @@ -1,57 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 6, - "description": "" - } -} - -@function tutorial:greeting -say Hello, world! - -@function tutorial:obtained_dead_bush -say You obtained a dead bush! - -@advancement tutorial:obtained_dead_bush -{ - "criteria": { - "dead_bush": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "item": "minecraft:dead_bush" - } - ] - } - } - }, - "requirements": [ - [ - "dead_bush" - ] - ], - "rewards": { - "function": "tutorial:obtained_dead_bush" - } -} - -@function_tag minecraft:load -{ - "values": ["tutorial:greeting"] -} - -@loot_table minecraft:blocks/diamond_ore -{ - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:dead_bush" - } - ] - } - ] -} diff --git a/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt new file mode 100644 index 000000000..b0bf7ad10 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt @@ -0,0 +1,13 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo + +@function demo:bar + +@function demo:thing diff --git a/packages/lectern/tests/test_directive.py b/packages/lectern/tests/test_directive.py index 5c8b1091d..87c1fe8d0 100644 --- a/packages/lectern/tests/test_directive.py +++ b/packages/lectern/tests/test_directive.py @@ -5,28 +5,24 @@ @pytest.mark.parametrize( - "source, directive, fragment", + "source, fragment", [ ( "@function demo:foo\nsay foo\n", - "function", - Fragment(None, ["demo:foo"], "say foo\n"), + Fragment("function", None, ["demo:foo"], "say foo\n"), ), ( "@function() demo:foo\nsay foo\n", - "function", - Fragment("", ["demo:foo"], "say foo\n"), + Fragment("function", "", ["demo:foo"], "say foo\n"), ), ( "@function(strip_final_newline) demo:foo\nsay foo\n", - "function", - Fragment("strip_final_newline", ["demo:foo"], "say foo\n"), + Fragment("function", "strip_final_newline", ["demo:foo"], "say foo\n"), ), ], ) -def test_parse(source: str, directive: str, fragment: Fragment): - parsed_directive, parsed_fragment = next( +def test_parse(source: str, fragment: Fragment): + parsed_fragment = next( TextExtractor().parse_fragments(source, get_builtin_directives()) ) - assert directive == parsed_directive assert fragment == parsed_fragment diff --git a/packages/lectern/tests/test_document.py b/packages/lectern/tests/test_document.py index d3f5e1b01..b0a8554d7 100644 --- a/packages/lectern/tests/test_document.py +++ b/packages/lectern/tests/test_document.py @@ -11,7 +11,7 @@ def test_empty(): assert Document().get_text() == "" empty = "# Lectern snapshot\n\nThe data pack and resource pack are empty.\n" assert Document().get_markdown() == empty - assert Document().get_markdown(emit_files=True) == (empty, {}) + assert Document().get_markdown(emit_external_files=True) == (empty, {}) assert Document(text="Nothing to see here") == Document() assert Document(markdown="Nothing to see here") == Document() @@ -63,13 +63,13 @@ def test_text_tricky(): def test_missing_argument(): with pytest.raises( - InvalidFragment, match="Missing directive argument 'full_name'." + InvalidFragment, match="Missing argument 'full_name' for directive @function." ): Document(text="@function\nsay hello") def test_extra_argument(): with pytest.raises( - InvalidFragment, match="Unexpected directive argument 'banana'." + InvalidFragment, match="Unexpected argument 'banana' for directive @function." ): Document(text="@function demo:foo banana\nsay hello") diff --git a/packages/lectern/tests/test_examples.py b/packages/lectern/tests/test_examples.py index a2ac995fc..b293cac37 100644 --- a/packages/lectern/tests/test_examples.py +++ b/packages/lectern/tests/test_examples.py @@ -2,21 +2,44 @@ from typing import Any import pytest +from beet import run_beet from lectern import Document -EXAMPLES = [ - *glob("examples/*.txt"), - *glob("examples/*.md"), - "README.md", -] +EXAMPLES_TXT = glob("examples/*.txt") +EXAMPLES_MD = glob("examples/*.md") +EXAMPLES_LINKS = glob("examples/with_links/*.md") + ["README.md"] -@pytest.mark.parametrize("path", EXAMPLES) +@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD) def test_text(snapshot: Any, path: str): assert snapshot("pack.txt") == Document(path=path) -@pytest.mark.parametrize("path", EXAMPLES) +@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD) +def test_text_equality(snapshot: Any, path: str): + document = Document(path=path) + assert document == Document(text=document.get_text()) + + +@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD + EXAMPLES_LINKS) def test_markdown(snapshot: Any, path: str): assert snapshot("pack.md") == Document(path=path) + + +@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD + EXAMPLES_LINKS) +def test_markdown_equality(snapshot: Any, path: str): + document = Document(path=path) + assert document == Document(markdown=document.get_markdown()) + + +@pytest.mark.parametrize("path", EXAMPLES_LINKS) +def test_markdown_external_files(snapshot: Any, path: str): + assert snapshot("pack.md_external_files") == Document(path=path) + + +def test_beet_project(snapshot: Any): + with run_beet(directory="examples/with_beet") as ctx: + ctx.data.name = None + ctx.assets.name = None + assert snapshot("pack.md") == ctx.inject(Document) From 79f1c868bcc366c09ee2d2f9bd34e9bdfffc7bbf Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Feb 2021 09:50:08 +0000 Subject: [PATCH 0071/1554] 0.4.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 4afc9f836..70477711c 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.4.0 (2021-02-25) +### Feature +* Add link fragments ([`b0d26d5`](https://github.com/mcbeet/lectern/commit/b0d26d530bd5029ea33bba8b1886a913af6ce125)) + ## v0.3.2 (2021-02-25) ### Fix * Patch markdown_it to allow arbitrary data urls ([`bb5c05d`](https://github.com/mcbeet/lectern/commit/bb5c05df7d30e144d014fcaef36c84a802b7c51a)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index ab292e8e6..99820a5d5 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.3.2" +__version__ = "0.4.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 84de05e6d..221fd909f 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.3.2" +version = "0.4.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 3c3efff03710864c63dc0455f09d4eb97ae84eb5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 10:58:41 +0100 Subject: [PATCH 0072/1554] fix: use match_tokens() to check for a single code_inline --- packages/lectern/lectern/extract.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 9eeed1c5e..97983dec2 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -202,7 +202,7 @@ def parse_fragments( ) and (inline := tokens[i + 1]) and inline.children - and inline.children[0].type == "code_inline" + and self.match_tokens(inline.children, "code_inline") and (match := regex.match(inline.children[0].content)) ): yield self.create_fragment(match, content=tokens[i + 3].content) @@ -231,7 +231,7 @@ def parse_fragments( ) and (inline := tokens[i + 1]) and inline.children - and inline.children[0].type == "code_inline" + and self.match_tokens(inline.children, "code_inline") and tokens[i + 3].content == "
\n" and tokens[i + 5].content == "
\n" and (match := regex.match(inline.children[0].content)) @@ -302,7 +302,7 @@ def parse_fragments( ) and (inline := tokens[i + 1]) and inline.children - and inline.children[0].type == "code_inline" + and self.match_tokens(inline.children, "code_inline") and (match := regex.match(inline.children[0].content)) ): yield self.create_fragment(match) From 8638efc7a9c87f18e9d499ae41d5726592da49ef Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 11:46:51 +0100 Subject: [PATCH 0073/1554] feat: extract image fragments --- .../examples/with_links/inline_image.md | 31 +++ packages/lectern/lectern/extract.py | 195 +++++++++++++----- .../README.md | 140 ------------- .../pack.png | Bin 4638 -> 0 bytes ...ples_with_links_inline_image_md__0.pack.md | 49 +++++ .../README.md | 49 +++++ .../hello.png | Bin 0 -> 13516 bytes .../hello_1.png | Bin 0 -> 13516 bytes .../hello_2.png | Bin 0 -> 13516 bytes .../pack.png | Bin 0 -> 13516 bytes 10 files changed, 278 insertions(+), 186 deletions(-) create mode 100644 packages/lectern/examples/with_links/inline_image.md delete mode 100644 packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md delete mode 100644 packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/pack.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello_1.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello_2.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/pack.png diff --git a/packages/lectern/examples/with_links/inline_image.md b/packages/lectern/examples/with_links/inline_image.md new file mode 100644 index 000000000..b4b4e56e7 --- /dev/null +++ b/packages/lectern/examples/with_links/inline_image.md @@ -0,0 +1,31 @@ +# Data pack with inline icon + +`@data_pack pack.png` + +![](lectern.png) + +Now this one with a folded section: + +`@texture foo:hello` + +
+ +![](lectern.png) + +
+ +And completely folded: + +
+ +`@texture bar:hello` + +![](lectern.png) + +
+ +The last directive is hidden: + + + +![](lectern.png) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 97983dec2..6139ed3bf 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -178,10 +178,10 @@ def parse_fragments( tokens = self.parser.parse(source) # type: ignore regex = self.get_regex(directives) - skip = 0 + skip = 1 for i, token in enumerate(tokens): - if skip > 0: + if skip > 1: skip -= 1 continue @@ -193,12 +193,14 @@ def parse_fragments( # ``` # if ( - self.match_tokens( - tokens[i : i + 4], - "paragraph_open", - "inline", - "paragraph_close", - ["fence", "code_block"], + ( + skip := self.match_tokens( + tokens[i : i + 4], + "paragraph_open", + "inline", + "paragraph_close", + ["fence", "code_block"], + ) ) and (inline := tokens[i + 1]) and inline.children @@ -206,7 +208,34 @@ def parse_fragments( and (match := regex.match(inline.children[0].content)) ): yield self.create_fragment(match, content=tokens[i + 3].content) - skip = 3 + + # + # `@directive args...` + # + # ![](path/to/image) + # + elif ( + ( + skip := self.match_tokens( + tokens[i : i + 6], + "paragraph_open", + "inline", + "paragraph_close", + "paragraph_open", + "inline", + "paragraph_close", + ) + ) + and (inline := tokens[i + 1]) + and inline.children + and self.match_tokens(inline.children, "code_inline") + and (image := tokens[i + 4]) + and image.children + and self.match_tokens(image.children, "image") + and (link := image.children[0].attrGet("src")) + and (match := regex.match(inline.children[0].content)) + ): + yield self.create_link_fragment(match, link, external_files) # # `@directive args...` @@ -220,14 +249,16 @@ def parse_fragments( # # elif ( - self.match_tokens( - tokens[i : i + 6], - "paragraph_open", - "inline", - "paragraph_close", - "html_block", - ["fence", "code_block"], - "html_block", + ( + skip := self.match_tokens( + tokens[i : i + 6], + "paragraph_open", + "inline", + "paragraph_close", + "html_block", + ["fence", "code_block"], + "html_block", + ) ) and (inline := tokens[i + 1]) and inline.children @@ -237,17 +268,54 @@ def parse_fragments( and (match := regex.match(inline.children[0].content)) ): yield self.create_fragment(match, content=tokens[i + 4].content) - skip = 5 + + # + # `@directive args...` + # + #
+ # + # ![](path/to/image) + # + #
+ # + elif ( + ( + skip := self.match_tokens( + tokens[i : i + 8], + "paragraph_open", + "inline", + "paragraph_close", + "html_block", + "paragraph_open", + "inline", + "paragraph_close", + "html_block", + ) + ) + and (inline := tokens[i + 1]) + and inline.children + and self.match_tokens(inline.children, "code_inline") + and tokens[i + 3].content == "
\n" + and tokens[i + 7].content == "
\n" + and (image := tokens[i + 5]) + and image.children + and self.match_tokens(image.children, "image") + and (link := image.children[0].attrGet("src")) + and (match := regex.match(inline.children[0].content)) + ): + yield self.create_link_fragment(match, link, external_files) # # [`@directive args...`](path/to/content) # elif ( - self.match_tokens( - tokens[i : i + 3], - "paragraph_open", - "inline", - "paragraph_close", + ( + skip := self.match_tokens( + tokens[i : i + 3], + "paragraph_open", + "inline", + "paragraph_close", + ) ) and (inline := tokens[i + 1]) and inline.children @@ -257,19 +325,10 @@ def parse_fragments( "code_inline", "link_close", ) - and (url := inline.children[0].attrGet("href")) + and (link := inline.children[0].attrGet("href")) and (match := regex.match(inline.children[1].content)) ): - url = unquote(url) - path = None - - if urlparse(url).path == url: - if external_files: - path = Path(external_files, url).resolve() - url = None - - yield self.create_fragment(match, url=url, path=path) - skip = 2 + yield self.create_link_fragment(match, link, external_files) # # @@ -279,26 +338,53 @@ def parse_fragments( # ``` # elif ( - self.match_tokens( - tokens[i : i + 2], - "html_block", - ["fence", "code_block"], + ( + skip := self.match_tokens( + tokens[i : i + 2], + "html_block", + ["fence", "code_block"], + ) ) and (comment := self.html_comment_regex.match(token.content)) and (match := regex.match(comment.group(1))) ): yield self.create_fragment(match, content=tokens[i + 1].content) - skip = 1 + + # + # + # + # ![](path/to/image) + # + elif ( + ( + skip := self.match_tokens( + tokens[i : i + 4], + "html_block", + "paragraph_open", + "inline", + "paragraph_close", + ) + ) + and (comment := self.html_comment_regex.match(token.content)) + and (image := tokens[i + 2]) + and image.children + and self.match_tokens(image.children, "image") + and (link := image.children[0].attrGet("src")) + and (match := regex.match(comment.group(1))) + ): + yield self.create_link_fragment(match, link, external_files) # # `@directive args...` # elif ( - self.match_tokens( - tokens[i : i + 3], - "paragraph_open", - "inline", - "paragraph_close", + ( + skip := self.match_tokens( + tokens[i : i + 3], + "paragraph_open", + "inline", + "paragraph_close", + ) ) and (inline := tokens[i + 1]) and inline.children @@ -306,7 +392,6 @@ def parse_fragments( and (match := regex.match(inline.children[0].content)) ): yield self.create_fragment(match) - skip = 2 # # @@ -335,7 +420,7 @@ def match_tokens( self, tokens: Optional[List[Token]], *token_types: Union[List[str], str], - ) -> bool: + ) -> int: """Return whether the list of tokens matches the provided token types.""" return ( tokens is not None @@ -348,4 +433,22 @@ def match_tokens( ) for token, token_type in zip(tokens, token_types) ) + and len(tokens) ) + + def create_link_fragment( + self, + match: "re.Match[str]", + link: str, + external_files: Optional[FileSystemPath] = None, + ) -> Fragment: + """Helper for creating a fragment from a link.""" + url = unquote(link) + path = None + + if urlparse(url).path == url: + if external_files: + path = Path(external_files, url).resolve() + url = None + + return self.create_fragment(match, url=url, path=path) diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md deleted file mode 100644 index a505fec9a..000000000 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# Lectern snapshot - -## Data pack - -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 6, - "description": "" - } - } - ``` - -
- -### demo - -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` - -
- - ```mcfunction - say bar - ``` - -
- -### embedded - -- `@function(strip_final_newline) embedded:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function embedded:bar` - -
- - ```mcfunction - say bar - ``` - -
- -### custom - -- `@function custom:hello` - -
- - ```mcfunction - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - ``` - -
- -## Resource pack - -- `@resource_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 6, - "description": "" - } - } - ``` - -
- -- [`@resource_pack pack.png`](pack.png) diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md_external_files/pack.png deleted file mode 100644 index 0c084ba0791f2a6adf5b99da10fa59e9e0e4d0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4638 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 + + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + + + +- [`@data_pack pack.png`](data:image/png;base64,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) + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### foo + +- [`@texture foo:hello`](data:image/png;base64,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) + +### bar + +- [`@texture bar:hello`](data:image/png;base64,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) + +### baz + +- [`@texture baz:hello`](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..a1bf96495 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md @@ -0,0 +1,49 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- [`@data_pack pack.png`](pack.png) + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### foo + +- [`@texture foo:hello`](hello.png) + +### bar + +- [`@texture bar:hello`](hello_1.png) + +### baz + +- [`@texture baz:hello`](hello_2.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello_1.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello_2.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/hello_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 From 1595a08f876cf8006799e122539f7bfd42f3506c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Feb 2021 12:04:12 +0100 Subject: [PATCH 0074/1554] feat: serialize images --- .../examples/with_links/pack_icon_data_url.md | 7 + packages/lectern/lectern/serialize.py | 11 +- .../examples__beet_project__0.pack.md | 8 +- ...ples_with_links_inline_image_md__0.pack.md | 32 ++- ..._with_links_lots_of_textures_md__0.pack.md | 200 +++++++++++++++--- ...ith_links_pack_icon_data_url_md__0.pack.md | 51 +++++ ...es_with_links_pack_icon_link_md__0.pack.md | 8 +- ...s_with_links_pack_local_icon_md__0.pack.md | 8 +- .../README.md | 32 ++- .../README.md | 200 +++++++++++++++--- .../README.md | 51 +++++ .../pack.png | Bin 0 -> 13516 bytes .../pack_1.png | Bin 0 -> 13516 bytes .../README.md | 8 +- .../README.md | 8 +- 15 files changed, 560 insertions(+), 64 deletions(-) create mode 100644 packages/lectern/examples/with_links/pack_icon_data_url.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/pack.png create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/pack_1.png diff --git a/packages/lectern/examples/with_links/pack_icon_data_url.md b/packages/lectern/examples/with_links/pack_icon_data_url.md new file mode 100644 index 000000000..43ee0ecac --- /dev/null +++ b/packages/lectern/examples/with_links/pack_icon_data_url.md @@ -0,0 +1,7 @@ +# Here the data pack and the resource pack icons are defined with a data url + +[`@data_pack pack.png`](data:image/png;base64,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) + +`@resource_pack pack.png` + +![](data:image/png;base64,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) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 9b5b97175..89ae3b315 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -162,12 +162,21 @@ def serialize_file_instance( guess_type(f"{filename}{extension}")[0] or "application/octet-stream" ) url = f"data:{content_type};base64,{b64encode(content).decode()}" + else: while (url := f"{external_prefix}{filename}{extension}") in external_files: stem, _, number = filename.rpartition("_") if not number.isdigit(): stem, number = filename, "0" filename = f"{stem}_{int(number) + 1}" + + content_type = guess_type(url)[0] or "application/octet-stream" external_files[url] = file_instance - yield f"\n- [`@{directive} {argument}`]({url})" + if content_type.startswith("image/"): + yield f"\n- `@{directive} {argument}`" + yield "\n
" + yield f"\n ![{directive}{extension}]({url})" + yield "\n
" + else: + yield f"\n- [`@{directive} {argument}`]({url})" diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 85025d90c..1d9292687 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -137,4 +137,10 @@ -- [`@resource_pack pack.png`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAMAAABOo35HAAAAk1BMVEUAAAAiQGUoUYY1KBU6RRA/MRtAHAZENR1NPCJNXQtRIQRTQSVUQSRcRyhgdA5hJwZjTCtlTzBmTyxnUC1tVjNvVjFwWjt2YUJ3Dg53XTV7XzZ8Ghp8YTd+HR2IakCUZCiUckGUc0KWeU6YIyOaEhKeglekgEyonCKyi0+1kl6+nWm/mWOsh1CceES8klSDZjnIpW+rp5F9AAAAAXRSTlMAQObYZgAAETlJREFUeF7s0EEKgDAMRFEPlKS9/+lUkIokwNCd5P/1MMA7fhBF6FusQufCSufCSufCSufCSufCSufCSuSiOafOhZXOhZXOhdUGF1ZjDJ0LK50LK50Lqw0urNw9qsyKE6xKLjPLXFiVXPbU3cqTVeayt95WV8vqW2VlEa2tFpenCqu7vlaLy6uyVSuukxw7vI0YhmEoPFBYtvtPVyLAwclRrnJGgMbW28DfL1ok3UptX3FmVYiLe4GVyrh4DFWslFulXDYmqlgps0q4zEqVtlLscEVWqraVSrlwrLRVzoW36lrlXPCqWJF0K7X1uBBWxUq5VTIkPFaxUm71GRdVCSsv3V2RlapiBcCsLnM15ipWyqyucfFYFSvlVjkX31pxX0VWyqQyLnorblGzGuFi2Iq7vVllXMknyFvOSpGICqwW58qtFDqZ1QBXFStlVgNcVaxUsxrmQhUr1awGuQAsaPXT46Ia5sLeclYKcRznwqvVrD7jknXOhUNLWSVcbpVz4dw6VimXWaVcsJaz6u+Jk1XOhajlrFKuqxeJCbiA2AoXrVIu+YxzkXyUlYqs1BWrlEs441zce5SViqzUdav+kNjGuZ71Z0QrslJnK/xhdT8XDz3KCmZlJVa3c/HczFYwq5u5aM1rpczqTi5GzWulmtUo1xznQZKhVXcExBrNaohrjmsq9yIr1XlnSCGsca45js98FVmpziMDq4Z48c9oVgNcT/sPdl4YWKnIKufiod6Q+P53rl/u7SjFcRgIg/C8D4ERJM4hMnH2/qfbAowbk9LSRpaSbB3h439pGSesbm5FvhKzqnOJFZkVmdU0fbAVLPtuRrEisyKxmj7aivbdjGJFZkVPVtOoG6eTFe27GcWKxIr+bK1ojBV1sqJ9N6NYkVnR1moaZUXNVli74b6bEStJrFau07Q0zIqarShrRZB6N82saLWiYVZ0gBXlrSjPxbbEisJqemer2awob5XnworCKgqry+WNrWiP1SxWaa770j+tLm9tRXkrqjyqutYsVlS3ovFvMvOct6K8FZkVmRWFVVS3op5WZFaUt6K8FZkVmRXtsaLRbzKbi6PFChi3NSsyK9phRS/7b6LZisRq+74TqRXlrWi0VdRuRWJFh1qdLtEnW9VBW62u19VKsP4vK2qzWrFO1BHrd7yVg6oV0/XVb61oteo4rV8yK1TGWpFZkVnR1uq6WPWc1iJgVrTDCjll2AdqVmRWFFYUVr2mFQhmRXkrclvlAnfX4W1WtFoRVoI19ht93ooqtmZFWStyK7qunaLAGmsFoltVPilUbM2Kmq2mGNZkWGWwFZkVidXNrcisqNFqCqtJplXKcCsyK2q0ojYrWqwUq9B4KzIr6mSFRMaKFqutVliV8Vb0eLhJLytKWNFi9TwtpOg1VjTWihJWYOEk0ypLL7KisVZUt5JOEVZL462it7O6qFZZG2HFIWFW5Cbzq6wMiwZbkVmRWZFYUZtVVLEixQqrpvJWZFZkViRWZFZ0lJVPK6ya+v42q7ta0cMzK8JKMivaYQWjW1WndRAW5a2gUKz7vXLKeFhZeSsyq/q0wqpRi/JWZFbkVl5NMW9FZuVYhNVBWJS3IrOivBU1W5FYkWJhdZzWz49a3W5iRWZFeStqtKKNlWCVwPo6EgutH7MisSKz4g7KW1EXq9AqRawOmhaZFYkVmRWlraiDVWAVCqvDscisCCvJrKif1exWilWoiFUrVmhR5Y39ppkV9bIiszItpCisukyLzMrHUr8Ze1nRk5VhlaWw6jMtEivjspvRucKk2Yo2VhZWS2HVa1pkViRWZFZkVtRqRW4VlehrANb5bFYkVvTwzIqaraLRVmCp1tmsKKwyXG4y0GrMtMisKKwSXIdb/eXeXnLkhmEoig564JEAFaJ2w95CVT77X10SK9ZT50kg6Qxi8i7hQK4SBfD/WKGcO62l0yrfxsFKwRXFCloZR2tZgLVtE64fFq4IVuhAAtZvrlLbTFx1COK+hrACFlqO2tEycGFm5EecIFbQ+vMlLjVoKblOA7KqBbACVvvhWs6AtRWZ64nIqiZa1W5uhaN1cC2tpjX/ZxzvKPVW6HsEKxyto6WrYQlcNAgNrOjehTxZAYu5oDXlIqsjtuJ7F/Jjhe9wxlVq24Srt0JshXsX58SKjxZzSfcuWPXBiu9dnAsr1mIu+d4FqwEX3btGObAC1phLf++CVR9Z1TxaAUvkApZxZiSrmjsrlBVc0Lo8M34icWVl5wLWtZnxb5LJqsI9rexcwDLOjGRVm6wq3NrKzmWfGcmqRlY1u9WtuewzI1vxyh4yWt2eyzwzylbow2R1Y67rM6PeClgpiVYOuC7NjFqrfrtEsnLAdW1mfL2UVv3akmDlgqvULDPjYTF5v4LVEaySYOWCyz4znhwjq8bFm5aClSuurTbR6q0QWTWu0QrvP1h5mhk/fYeaefADpdZ1K08z47Omt1phtSZ01crTzPhsaa265XDCIqtQXM8+lRWwaCeVrWJwWaxe9H7VXRwQrIAVhUtv9SveDeflcFgBKw6X2qpxrbwcnhCsgBWHq+isGtcKrLXFu+HACsVVimyF1mEJecOyv3ddsXp/D4Jlf++yW/VYq4AVgwta2WwlHC1gReIqtZwtVsImfQJWMK4TK2eLFWNBK3nE2r9ouAq0ssFq/h0mn1i7gSvXtFbz7zB5xTJwNVLZirUeCbnFsnCBVLTi3fBHFKz9bddw5S7RqgarQFhvdi7RClqPYFh6LoAOrH6Sb8esDcQwGIaHLs3gXN1iCLcEw0Fy/v8/sP2Iic4SQhEdarvvJKTtwau1v+FoHiw/F/aGFYLVbFg+LjpbVglWpBWnwHJxNcfX/wJAaGCsTFgeruZmWlESK42ElTNhObgYlmGlYqU0FBYSWDZXszesVKyUhsNCwHJxNWuPFWGlNChWvrw5uZqlbSWx0sBYFydXs9OspsXycjUbxWpaLD+XgRWnxkKLl0vFiv8Aa3Fy1UFaTYi1CiwPFyWspsRaV4bl5aozs5oTCzEsH1edmdWsWIhhubgeM7OaFgvdCMvLVWdmZWHFkbFuN8JycjGsEGysGIfGQsBinU0u/rSCjYVhQKz7AQtJrPMLXIQFK0MLxyPWPgrVnbBqV4GlcH198KqVgZUix9r3EaiQwLpeGZbCta6CC1YGVkoSC/VPhTLHQhwLSSzBBauaRqVg9c2132s5Z46FJNbpxLEkV3imUGlYqPRKhSoW4lhIYrVcay3YWGSjYxXUKxWqWIiwKI6FJFYIQWIpVCpWQahHKuLKtY2wKI6FBBZiWgqVhlVQh1xlZz2xto2wqJew0BFLoVKwCq8XKqRgIWCxbKza+1NLUnleFuqFCilY6BdY7+GBxalsrP64yjEVa1vcWMd+sASVjdUb12dhqVjL4scCUagpVBaW5Nr/iOqbWDtabRwGojBMSwnE0BsDYdkWSA0WUd7/AVcHBU59JjvyyMT+b3xj0PAhg7E8opU7C8WwAEQsWoSwbiUz4VFUiFQuFgpggWcr1u2RmXB/KkYqDwsNa7EAswkLVMxMuD8Vy8zHGoadsG5S1nZ8W3e57ndAoT+KhV6J9cmX0mO5SOVy3Uu/TqQVC1ms9/fNWJWWWMdzZeRx3RGxkGAhi1XahgUqwTqWK0ujBijBQmuw0AYsUAnWoVxmrZTSqFksNLSxakEstVIspFZ7cJnlEnrOZbGGYR3Wz08PFlQNFhMq24uoEKn+y/VXsdAqrFIUi6qCxUj1eq6bVKkcLv2LZqhZrI8PxUIWy6NysBipXssFeeVaWOWcFQsJFjoZrJJiIcVqUFms72/lyjtwZeRx5ZpiIYt1OikWamO5VM+x9ufKyOPKTLDQrFhIsVALy6VCtCLWvlwZeVxyg8WaZ8VCQSzuK6VipCLWnlxjyeXKNsVCgoXOESxcDZVWqQxWmcXlqs8Gu5Y6qVyu/DzFQhbrfF6LVa9CZQOVwRqRw5VqpHrUQeVyZaYpFlIs5GJJLhUx2YPK40rsQcWCVC5X9iMWUyzUwiJMiApVKocrLSNVlGsatRwIcxCLKRbysH7TBKnw7W9scCVpaXVZjzVt4Eo1YrEI1hInTIX6uS6XCFY3V2LAkqa1WLqTwlT9XKCKYXVyydoWa5r6sKJU/VygimPFuZL29aVYqAerTcVDnQhX2UdpEZyiWA5XgAopFrJYb28O1noqFOC61oQqjOVxRaiQYKHZYJXaWG2qCNeVkaoXy+dqUzGLNc+KhSxWjCrC9Y9VO1xxEAaiKPw3QANIoUA3FWmhdN//BTcS7DA57rV2PA+g8AFyjU6+RhXAElya6vH46QJWDVg1haXHgn7pXzmh9FjDJYaluQRVjVzAqhHrehVYciwormdNcg3D91inOyOXoFrlAlYNWDVibVMpLnH+vVARK32OdfqMS1CtchmWBawasTSV4nr6yDW0PFXag/URVymFVJrLsCxg1QxLU5XSP5v0osGQeN/BUe3E2uYqLVJpLsOyFJammvPPJsWFIWF3GBzVbizNVSxSaS7DsgSWpGoZleJ6WQsVsXL6AktzFR+pNBex7neBJalajUpxvXwzFbFy/gZLc43FB51NLmDV1rD+naDFN03EkjMVh4mNKoLVItY4girG1a5LLLHWHdWcp2KOilg5h7AsYNVAFeFartxjyRcbRzVnVJJLfP4PY5FrbBlVmItYmsq4JheoyKV+KyFWnGtcMocA1x4srM6p71cH/EZlGVWMi1i3W5hLY3Gth7guF2Jln1FFuYh1AJfAAtUuLlIRK+UuUAW4gHUEl8AC1Q4uUAErJWABIcQFrCO4trD6mfTc4CoFVMRKc5oqzgWsI7gUVj+TVheCo5pzVMRKLVAdzXUG1jFc61g2k4xKcZV3RgWstASqaMA6n4F1DBexHMdCJbiKq1EBK1mgitdj1YgV55p6rNJz/FFrxzoSwjAURVNuk2aKrbwoVcT/f+GQEZY9z4DlDUTK7Sg5hQmGCqEWQb8QUwFWujfAagFWN1dpaSxqBbhKC6ggoVJY6f4UFidI/VyFYyxqBbgKJ1S2H4ypbs/B6uEquoZFrQBX0Z1R5Wyw0nMZrHu4aoEI8rgKdkxlsNKzGax+LnO761aEq2A5H1IhVno+wOrlqpyminBZqi1LZbDSmACrh6vqmCrCZak+IZXBSuMSrC6uiq0QQS/UMlR7QIVYaWyM5RSiagC4XCAV/pNiBpbAIBXHVKNjLKcQlebia6HawwkvVBYrQ0w1PsZyClAJl74WKuGqOqZCrGwSqvH9/Y+LDJXTC6sQziemghI3DRe1rqiAz+eyE8qhmoWLuCuqEJdQAZGlmouLdGdUIa7jc7pDNQNX9JXP5zp7/3OoZuBaFsJzUxfX+V7BUM3HtWx9UXVxXe2rgGpGruWTUHVwnVBxQDUj17K3U3VweVtQoJqJC7HgV15v1JuP0P7CWKgm5EIsxeU9Gdc9jwqx3u3bMY7EIAxGYTeWKOjQ+Axz/xOuFHlDdt4ODmUM7whfgf7CyDO6heVc0ZB4XxpQAUueU4jlXNHuen8UUnnyrCIsD7tryPVKQsUiLC/cXdez2TxUMVdrHasX7q5+NpuIigGrtY7VC3fX79lsXipytSNghd8/7eXlpSJX82A15DIDVhoqBqxa73OZEUuVVHkC1l0uM2KpAktyBaw7XGbEUgWW5AtYEZcZsdQDVbqAVQdPvRmxigJL8gas9oXLjFilAEtyB6x/uYxYpQBL8gcschGrFGDJGgGr1TGWFmDJOgGr1u9YqsCStQKWcwFLFViyXsCqlViqwJI1A9bJdVIBS9YNWM7lVMCStQPWwXVQAUt2Hatzmf7tpNoBq+pHF6pdhDUA2FwTVJtrgmpzTVBtrgmqzTVBtbkmqDbX46l2P2oqW1bzOq0nAAAAAElFTkSuQmCC) +- `@resource_pack pack.png` + +
+ + ![resource_pack.png](data:image/png;base64,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) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md index bfefec96d..b3df4cb1a 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md @@ -17,7 +17,13 @@ -- [`@data_pack pack.png`](data:image/png;base64,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) +- `@data_pack pack.png` + +
+ + ![data_pack.png](data:image/png;base64,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) + +
## Resource pack @@ -38,12 +44,30 @@ ### foo -- [`@texture foo:hello`](data:image/png;base64,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) +- `@texture foo:hello` + +
+ + ![texture.png](data:image/png;base64,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) + +
### bar -- [`@texture bar:hello`](data:image/png;base64,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) +- `@texture bar:hello` + +
+ + ![texture.png](data:image/png;base64,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) + +
### baz -- [`@texture baz:hello`](data:image/png;base64,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) +- `@texture baz:hello` + +
+ + ![texture.png](data:image/png;base64,UklGRsQ0AABXRUJQVlA4WAoAAAAQAAAAKwEAKwEAQUxQSBQCAAABCbdtJDkSZmq8yz/i1XXi34zo/wTEIqHEgQMHDhw4cLCvpjhRE5yICRx5iEHk9BoOHExF1S4WtuPI/lK+0CX5lNnks5Tj3wpHkiTFDfX/R3PzBpoug2UiJgCC20aOpOkFmpvz7oW2H9A239DoGrg66viP4z+O/zj+4+aPhTW6hUUsrAvbhNPC2rsJp4W1dxNOC2vvJpwW1t5NOP1c7e1UryDbQKNbWF/ev3jT8f/Ef1JO3K2sC7wloun+BAK2TnCnBmTtlhaO/9sZfetEranqqrj3JaKWhwYVqhZUp3pQmWpCVaoLFak2VKP6IGspPWSFDiArngFZQRbIivxAVjgKsmJkkBW4g6xoImSFOCEr7gpZwWDIilBDVtgcsmL5kFVgAFlVD5BVigFZ9SGQVbQCWZU0kFXeA1k1R/Ckj1vVOP5v95ANEPDIj4Cn/+IivAYguCQBptZ9mVpPaGqdqqn1z6bW1ZvKa5jKAZnKl5nKLZrKw5rKWZvK75vqhTDVN2Kqx8ZUP5Kp3i1TfW6megJN9U+a6jU11ZdrqofZVL+3rd54SYCo7DFEJbUhKtcOUS0AENWZAFENExDVx4EE7SXXUgJcRylwDSXB/EqDuZUI8yoV5lQyzKd0mEsJMY9SYg4lxXilxVglxjilxhglx+eVHp+VJEBU8zNE9WRDVKs4RHWwQ1RjPez0+z+XHTyWJKD58kYDVlA4IIoyAAAQwQCdASosASwBPhUIgkEhBuPeBABRLG3cLjnAAzBjb/tf5VdzliDwn5R+zRaP8V+B/7N+3fzV/i33GeJvbfmnea/wf+u/yX+D/a74pepv+Pf5r/1f5j4A/0k/vP95/e3++/GX65fMV/Pf8d+zvvP/8n9dPf1/xfUC/y/+89af/Wf///3fCB+6XsC/tb6tX/B/ZT4M/6p/v/23/6XyBf0X+2/+H8///R9AH/j9QD9//YA/7XpL9V/77/Xf2G/Vny4/0X9s89fOh6O9s/jTv529fxP7x/w/Y5/Z95v5B/Tfr77Av4x/Gf9N+WfA27N5gvt59y/6HrpzSvy3UA8cf83+x/kmfa/9d+tHwBfyH+5fsx7tv+R/4P9H5uPq7/0f7D/O/IF/NP63/2Puf+df//+3/9of/n7sH7h/f+ZlREOBfYxOo+uj1ehXwWItW9UYZVVVVVWXbSK3cukV//OXuUy1NGZFMaizZSmoIxscsIxyKSS2t57Oq324QrdiDYuwBODcmeJGAQA5JgFO3iRgRSO7Yg0/TZHoXanlgIBEoR0+aPhyz8Xo7TgPRQegI51ruFuxBsXEzmChnEZBI6x5Bj/4AYDobOv959ht2T1orR9liwMQPIK9LRcp+fHki9kYZXbB3D9NTImWnyYZZA7rhr1pMKF5znr6y7BwP3DLTHjpBAjoRFNDpcorcRIlP7IX2zigXpyovqkV8PiFBdUIXfmjp1ZPwL35gPSMXEDnrHNqQW5TfbjV+5VBLiws7Y9mNnptrTZUAI8zkYiea96BwaDj21cus5hzKgkXNGAwFdPxxp2Gyax6qs6rAdOB1OHPf66jtoW2LwSnjxucqtnQej7wgJY2f0lX7RNQybbTVZmDhrICGD8LMackp7vqDHzfo985H6IU/X1L9BJ7Rr2pmhX1f0jUSoIsIc4WSO/A7zsiSN/DC70b7JNd3GJ/wK3Y7vEqz28xTWZ10Mgs680wA05q2LN556ZAesbZ4/Ml1s4TqFglEb44dxnfo6ga7zyPecQg59t3WS0Tk91v6VUHwHdGnPQIb441B0noeGuq3p6OUpzBHXyf5s9QygQi8BlPTFa7RrJwz4zSzVz1t92AGIL1cR6Eb4ogrQnUdOkg/ZiTmKYy81lIev+Hx+EmEuKxRUXpBGNE45a5BH8jyUY3/hlmlLltZ/4ATyl4boovUuho0DF41gNLHplt+f2Gq18GpP3zuaQCva+NfViQ56VtsSWDhLkfFJOd83T6p9g4WyqP/FgB6P4g1TwOTwq3dxr/voiLtpIIG0igmtnLSjwUWD6A3e3h7R90HS+Jm8muZr5bnq2ZtbuAhRRWlnHtY7a4gRzi/x9hkwGzcYC2bjTqhg0rMm0b+mGub4bW0PQrl838fD8rF3y8+QZ173y9K/4KsjbC6eaU+ddMKV320s627AsbeRIV85w2LXSICFgVojFkb8iXV8Ksek59JBBgOyaRm3karPbuWoMSoMqNrHVOch7mt3ICCfZaMxIBPyXj/29tKZABvl/23cAR4eIRUnnZ+drIiLzhCp0v56srFiOgRz8THicSOT7Yc8ynQ7V+XKHhyp9UC+O56KWv4gw6Zx6uv+lGHsUrq3s3uV8XaDd7481By3WIuEjTm5+Ef7doENTXrwx95xhx5i8GSdKvqUGDk+jyWHwz10y3Ozb8tsse2Qgik0JUHjRzmBhGVoHVcJizuK4XxWhPCbVQ9id+P+R7LllpwkvjFENmv6lRRGMf2N7VOgxhsh3WXRObdpaDSx4uDhH7lIaej0tZwc+4vkG+POrXIGlbi8h9yYk0N3vimsoI5Kuq5XK7YRsETMjNk+cWMapMQjbmemwuFSTeplnu9gafHQcbYN/uLmdDAy3/mtQFPNVtzfJX1C5PJAVqt+f4HB7dEu/dWdaLcSRDyYyyp0tpGahTa+iyvZaW3izVlQ1RlKLHyV2zkhQfHgnc44xsg1YPn2vCmgoO/QwcK3YU5EB5f0FLSkJAp/OO2WrzSTJKNtCx4VE9iLPfn9wFi36z2fEcViAczKa2HlNm8T1o1ILiftzWj1ePXlJ3M0hDs/PJgAD+/pFgCP/Q6TmCubCF89oDNcMwp1eFMSWGhbVxSafYaLfZfwwwUavEDcvqwDCW0GbM9Wx3q1FbWXbZASXQ1w3xsQOeztUQvd9XJufSQWGAN7Ah2j6x+av2QvYtG/42a7Gw+S5m901CfwjATI/l2cv9JOHWx8UebLLFWENGhtPYR60b2XGd0nBTyyIP0CXzHQDL+f4gzX9OFo5ROA3AjDiYsBygAAA1fyIxgQKzyA/QDpofVB9/17krndCpDO/0OjXo+RgRQ7SOq5FHOwDz+mMuDZQ5ZRYCPu6GBoRrPuGKMqY1Q4j8UvntAZrhmlclz4Og6+fSIkgIMojb8DPnrND8bUIIdhYhTeJp8qRQvGLEJ5a762jArDxKccNafFK8YMQe/gRsQBzol0YpKNnhZt/t7jh5Eac6HkgD+c5WHXmGR7bM7v/ald94Y42qfZWwzZCqGlXQ4UwIfuelB6KhadYE4OIuP8FrVPmcIymPbQtMfg4OTFp0P6PtnmlVxLfhIJbKXUeAKTPeQGLh2E8fQM2QSQkXLvxu/z4qNt6b8XXLSV+xNmNx3ZDQf/wLOrJb+mSc/FdGf+8g9P/8F1nfYF12G220tvZV7MV38KTVb8hTRKsEzhdyM7cSsBxrPccCYSfwGEXYxlFJkDQ/7CEKUm8oYADx/IjGBArPID9AOmh9UH3/XuSud0KkM7/IjECRBCngIfVc+AOd55yVsK57wg1Vyg20n8UMfwG8Nv17Twvg10ic2R8FCyE14Dt/JDD2u7dKLEb84IZtFPV2DIJdjdCwhW/7eJU8f9uYvql0hI7pk1K0GMklZ0nMaQv2+3UhT0+olYZHt/2IOVONaQAwIVgL8NPvU6eKCwaZRwCKrEh+V6dlT4s5Vdorp8z5oUm85wkD2bpzVFIpD57WCf7z1bcREO9kAaL2f1h6yBMiDcCHbsBdFT1gv9raL92CpfYLMoyVyU/IXz1I1kth4rRujzCPxCio7pg3xjPX+gO6sSoNBqqopJBg7GQ8nQ3kpM6FVWXINn1/RNfwLrTWvpXTKG9BwuHy4z3zP7DapaQRejJhpediRJu0vgJvlSRx7MRWmUwLGZzCmx+Jvfh4v/g+Ur9V1Y33P8owEKCnKwRDo84AO2uZ9aeOodP7Tw/5Cmt4Yhq80AvQ3Px6ghq2s5TFHc5ni0ZMN07T3Afg3UffRJ3/16rJrylQH/+HNYpYuoXO/NI7DryVA49aJlX31d+Bp6oABv8VUEC0UebsmiowLI/OPtyYWpomkc4iGG05sRI2FoJ2J+e86pIZgdOfRunkxlK3EHy6i/SxTm4ihAKMVsG9lQ5ysO5yquOhWs8bkEFmN8Ob7soeC57S5VUMazB5v7W5BKQ5rEdOlaTMi+XXy/pOG+WEMzY6oi34YILjNA4CoJup9WSB+Lm4PJnwGLAdKx0EeUYjqNMUfViSjPRSrbvMXNREfnJA+TKp+YCFnOAJDsKnXm73tPB89ovs2QkImSZs/iQ7I95gtt+Eca0C8D2OlKiwEr16fy7+dvavqm5shfEwFdcqwgQ2wJzLfV6V6Vs+/Xu0UmqfV1lD4pIYtV574bfVArRlytsLy5PIYxZsv5rQ8BU/QcelXH5nZVOwHM38bD3mXrpdFfcYpHyqKztgCTU3ZXKq5bT/a1OcVZKX2CzKJ2CawTuppJhEyMZPQ1KhAbGIIKVoUH2HMUwQYO1DJzuMd6yr7HB1TSJXxr8jw3kXrnYLEY6RxBod/A2Y6Sa3iMomDhUZpFbM118fWtudmbmeU0R1TtMvQWTi9hh7CaOhsxJOGMMeWlZ6/zE2WnxvOrv80k48XpC4QKQlN0tdSEwbTYkpA0t40SvG3D5XPpILC5cOsRA6lTOXQClDweHMzgZgYa7zbzF8VjgtWE6mrzQC9DLwn/xVYN2wH4O5ZmW8dzHnVLj1pSBoza2hh4i7dK38K1DLHW2qn/7RKqHahCngIfVgVMZ8F+NF+pqpfKRd+67+Onb7b5o/9ezqaWntHl2oaVDaANVTIAHSFgi0Yxl50wmpZdjZXueJ9nM3ixwJ2VU0s4AF3tKfQ9Hct66I7nVsG6uDvCNr2qM2bxfyWKeNuMx3pfrGcBBNBfCOfM1Lc4PEcg2ee/5f0pYdiG3I0N+r5+iovydAxRYYa+J6JDIGKbKqWIxhz27MUBfgdMXdfoHkTWPutQ9VWwBltcIABioLIfU0z9tEGA4vxhq5UuwgPNukdvzW1yEESxNu4RfRCR1gmsCmzX7rVpeWqdXNEfKs6CS6HjsRxUTqzMo/6znaAIL14uhlVWk7wRmA2+26FMcWBrgtaMGXPU/UW+gqSWzgp/3mIquIZUsLBZF9fQAmVRLPNsarP0Z3pUSIX91HQ6nU1wuC9Bx/4ctHyoQsdGUbX3MELvpWtqsWG1tTj86KLXIawKeOe2/R5en1oCcjqgZXWX6TxYOJDFhZ3TJ4qdOd/ui4pLbtU6H2froFY5axO3nmNfMoW9PqosPh8Q797cHxE2HMU4BTtZ3LGq72Dxs25I7o5WxFlZbsi4z6mlk6SWxqw7uLCod6Rbs4UZqRSK75kk15oe1aYiVPIDp8pGdnSF6ONm8hIbHj9Hf/BDh4zxmWzPyTFCNtV18L59qSeQnel2Xhi1w8K/IZ3oIUX9if10VWofv0JFbARr4ArMYmitBB/wjPIuAoUv2IZUSUKdZdzZ85SmFrTMZsdd+WMD0lr//LnjKNJBk0sbk0DpLSdDrQKRhB2psThUn6M/ThbWbjKTczV5px7jFB8xf9spqjOBE8EIDS8rS0dKebAQf8DRzXaFdc1QGa4ZDezqBkziyj/4Oas+hn3qyzKc0c7Dq67BPxSxGM6OUx834qRM0ZkOx89dMTf9uo+qSND1SW7oBSSUjvP9A9eqQzPYUrkuDf4ydonPA9QFsR9NBBzrZlJC5cetMLLCV4RF+mD8BNfC0pGEMscBIaRXli0d8fomNsAj59KkqfgkX4W/mni89C/8hbgB/rm2VH7hqXYhoRPZlmr3985XWYvkXUGz4zG5XmiGx9nIKk0WkDZns5QTt0V/1/gQ3Wi4WJryGz1lm/HuIFdrWHtIqqMoa/ice4v4hJOybys6pAk2THwa9cr6kcb9YqwCIKgywXXOGBggAq9oho42oiN5zSuoAysoqHrgp7qwtS4ivCqs91opcO+/iIYouDDObbH8vsg/0X7gqYBRy5tTJGmeKmCSSTRx2F0A6nAa0qIyhWRyQbyQ+iHtiS1cv/uIedqOKdEmPrCKR6BRLQM1yZnmRAtiuit2MkUu3LLuhno2ro77JUAn5H4FQdz9yHqbmUlDMxqYHw8v6Mhw2g2vuTwWkbqKrU7lx3pOyfAqLTWypd/xvjP3BCAm+djhzIDrBdo1pR1c/ezIl6lcvP5evsPfdTiLJ9bu0LBovND5GfI2t5WmnpXyIyqDGW2F8AsfAiLRVr9ZoQYUOAaA80FbvOehXiIkL+BPX3pNkVrLRTOTIbn3QcJ8+MecRah+D1heeiihl/7bnA+9OAiKF9Q9+CTj7xB6OSyAQk2v+qoqaD5UWk68hyNZnqpygEvPDvwSyMiIeGIpvaD3Meq7eOwh+cIOWH7aAXVVDcm2/Qchu/Z6q9uEJYU35dphHXAHW2s4uJpmVSgRP0JI1uuHmXDGNlHsIFSVh1ijbbxkyZje+U9uv8DwPd1Ll/35+jDwH2mnj6JXjWUazUa7FbgBQsqoVQD5/NT5jgLGdqGCbUITZzwKgsMdAPlmTF/bUbNxxCZ6TTK4So5lks80E82cQ4FfhufOh0VgL3UREgCINhCKfwORtACCxoS/B0XfWUPwVblRK9ExSMSSivgdrVTpk5gAyItEHY3cRBgRVELoI2A0O9+Qx+O83D+c3rHzZYQ5SwS57bAYRRt26QJUDxv6VfefmI5JF81oNXS/s7TmFzV+yyfRrrRdvD4OTBem8VtrW4Wc4ueoHFqYX6o4zF1zlSS0SBfh7OOsCF++88/78w+Mo6HuZ4qDu90wWjsczfZR97Dw0l300xF6TVoMCVgYtNoA360+r83GEYN3HJsA6k9Qt09QzC5dN3mJhz2bfBJHbr3X4rc6yc7CqBb4R9tUp7+U6MHBz7vbSG0agFM/epQD6Ifv78euShHCerjsPoO1GIKFOfyPdhWxM5qHwhvX7X0y5bgQy7lSfjs9JmXqj0mHV79r2Ke0PcPNpGmxKLecvffDY2756PdXDSmrIQdYk1AokSz7yuwaAe0tSlzCZgoXiq0XCPAd3jiqvVgkawwtHDmcPDYitXo1Us1t7IuZZEX2SRNLxuGh75cCU4IhYJkOmn1/KnvLYGHnjgEH72quyR2BgLE9AJA15g+RXzznm6zE4/pt5FI6sM217ShY1r3GePI9R1TtGIbYfoy/Y7MI5+3EmdGft4nqeCWZLj8bDCIHDyGY428YStSsiUJO+d1qS/wxrZPy1e15oa4Pmlf61eCC96sMuFbi1EszLv5DW76SoahwLvttpP2Fv2O7woq4hWdwrejT4cLhOF/pLe0eAHT2QGPOYKJjirOr6xhgEKCHlJ06uMBbnm0yOHl0BSOPMyB55KNHtZN4yd+hrc4JFy5eMODxnWD30l4IViv6Po3DZTT9bfgqAD+Ak+ICr5wU5Z4qcG1Oc8ovoBPckK724iKvYVwWsey2+Z/N7Du20X/dHUZaxVEZ/CCHLnACobV9BWnsaDF0XBHvuP3YLg4QbZ4lNwTzS9UTz7N7Z4fmxWncRV3U59kC6JQRGXCN6Ml8CxCcrkYo5th5Zwc5DqMshUztL2OYfnHgG6htbO/w34OJlq+dUZOBUqqM2V7HKn5+4/AOHuNpiRYVr2W5GpjvSLogTLdpmeixpV/DqAfp/oX4nNSpj1a6RZC35yT2FhPfguqcNtONYfKAWJb7UaWmEPcidyiX4rnN8JYrMDJlvq0Gl3qfAvmq+dMjNdB8tN+qGwECBsPkTas0cZPAuz/XUGYGkcQiGN8xJjQWMNrlqu5cTRzfb+DC1VkDwXofkH8n7Bw6Z8HAM6KooYkPZ76J20rGpAGsu+H6yZY9+1mtS0xqGBIspZuqLm/glaoL+13+nmN7U59vm7B3nloxB/2lzMoy0SqQ00reViaj1YVi8WU2UJO5CmZXGePAMFP+S3xUThQxS+X8GfZ/tE8DQ810hb83FJYyaA/wrSoy8/4iDwW+2ddviGxVvtf0EQ5AwOqqu+5frb0aqyldI9ojEGVbl2g4g9F7KIB8TA8QxlL31sr5m91C+O9f/K4Ixm+okEifuU246ynJqX1IDOyQelXGtTcmY5MIaR6TDq7MDhE2tBjaEnn6v1hl3vgLpg29hm2vaULGkMUg0DKpXzN7oCu+lXyLdL0cc7WdgomfGmY9DxrUnZSsswnJLc4/XIR+6dTq9HlbQ3PtQj2e4RH5hxdII/pIl0/LXd4lW8UrC80WxCYDHQF2c3SD7eCXs0pg/z9hc0a3g/k1kYTHJiUYJYZH1238pHxSmPCjgKJjhQYep1dkZ7xCLJ7WTeL4Vp7ML13paZ3gLHc1X4MUlJsWt90Umkl1Hwt5MuciJsCrWTvkPPgUieA2R9AtByFOlUgSXbe48pGembKnRffy2s/eBgMxqmz5+0SI77Atdp3elrRBkSQEGURs+VI29qWVJbSipDgEkQF/xC/6hlUO6OpL/p1wtDlamjic6+jpN6QLDLw2/bjOUUaIAChLeyq+qDp9x4fWJUNPS6+MHFP8NU40qPnDVs+SyuTNF6MP6/ybNqNq3GuPpIkuefzZu3JLQcCbfEvohDD3MlGV54z8O3AmacuHEo2IAChLeyq+q3gUJJPnl+GH1dAymgLjPtPcAN4fSD1uiZECnk1mMxdlQz5qDpXsHZ0hltODlCr9BtWi78aN6W35d6ZD1y8TllOirwxLAVdnkAhp/XfR0TDS/louY2vw6dinEc/T3PTwBMXaO2ZKi2ydA1d/prV7o71gtLxB0Lp+tkWlzrFslcILKnWRQceIr4BaO0iyKiymOdZhLFD9KBG2z6/ZfSwXZ/JeZBEitXH+DtWXTUBp8g1XeqIn5cHK31mXkOUQu18vMPa1OdaKojkZrAH+XIYjFI70LnYqXT0Kd2Qu2dogylvq1rddvF8fHTyMtD+J1BZEuZV1WJ40X5RwmvxmFzak91fy7JtlVDYmbcq1vJm3WpNPXRClXV0e8r2oV1wxvYrIRpS1K10finCUPb+ZdfydLJgYIQYgxi2UM7M9j7c8DYNtOOFWoQBCf/9d7E1l6hWad4JJMOTmjIwT3sBBd90YWufjOmVdn/B0806fiCZc2Mf7IEYw3UW3Df1zeS1tqXCDvavfZNpXGLvrR9aK2rfMMtDZnh3FY06pFvAXTCgbIpXgRYNUI9IVMxqKWO5qoJQjaF+kZff+Q97I8x/HyDZ6uOq/hrg3ym5WLt3jF3JHQlXVLZzUiDf65V2RRfQQn3xKkXRmngi7ls/p9Rd257M1IO1mt3gfgRcgm8QlcWya+DkrA1CjDt0nZLUdOIMF3GkAfNwAJcYNIZzUDfJH2LqK8uufJZXJlHprcapb3clJJSbQiL5C97m3tNgz6Y6J75ugQ/b/LyD3qckasTRDILWAfZSi/hckP4/HRkP4YvoxT9kTdk5asjsub5AIZQ4fWxyz/Kif48NUi5olstwxlzR1HRMNL+Wi3Incol/h76V+KZCIkNV32Jd3MyBiAOJcuzjKfKW0z2kaFN5CbAhtQOQjIegXtlxuPWhsRWr0xIbJ2IXwSKV4SrmoGNxQW7zrPUhUHw32OTzoVJIiYqoeWNaIFhpp8SmbOSTmECuoCAa9TRu71OnZryerxRUW2ToGrtdGM6SYA9fdl03HAMDfvxTSHOM4yEZLzKeLxHodO8SqVw2HXMRUAeSk2rUhfoAq3vNhfkQAny0A6GLi5dB/jOQl3zR1uzwmS5eLs/Cd3zD3XgmNeIPpAMsFsQjeqkWNNZ+7BAqS0MqvpdLgSBhwHVSEhYOWHvKLe+Zv8jbRY3FmBx+1k2OrSZQqaWFQdy0cjiHCnKrDWQHwdNZDSpYZZ8lEI88vkNfgYpuET3sjzDutvnTb4JGlNVWButhu9Z6CA7Uq26LSr3tKi+dqoxUqfZEs9EfOEEoekxSgKbMYPZJbnab2H4FlYqAIrKEJjN07xHlseUKAAGd+lOjI7EJ/4qn/HWPBoTL6G+rw+svYGjFn0q1BdunnC0HmZMwI/WgqvFtbLKQrJIzL2keNx5gjpYtm7sda1TLtNh/eGWed7fSh2S1ZO3NC0hTzWqZwqLzXCSuN95FPz2Q7p5EjvNMbhX/tYtle7/1kjLNVYEOog4Z/HJ5WHc1uTnnYcHCH1Hc1/jZuBHweW3Ewy+4d7d4sjjRLXm0cqp+8iFlaYPxDtZdbWx1iUyDNgTa2DioeeYNeYiwitH6AWAB/UrAYcLwKAx53Ookfr3L/OAO7nUDiOzDY2cyQ1NFUlmGgNAG1hSZRV33tQw95vdQLxa1Obqfb/Ou6sgsme1txpNyV8gAyK4cL26sTNHg7RlyRZKNtsaG6ScGhdcByhbnmjgcsahPjxRpXY6DBZywab19A1m3uQuUUFKDMitzxjytteTpWSEa6phtQ4miwFay9Y5ikTJcOqgQ+uC64xxYJoNB5sj6BRtlDCUrA0XrFG2+qpaJCxnZRxBRQR8KseVOan6eWLrWyYSOIsv93s8QLu5AxCiWllszOfgk/lHHcAC3/J/E6W4gg9oXAC3VdiIO1p/VCWpFvUD719ma5U8jn3S59z8uSLn9m7Xr5QnBm1ZJ/TKVef4bNrbFj/NJTcF17KdNkCeCJ83cosk7VcuBJUIn7WTaX/vOn8lDLe/G2xKyyixBZp3zK8E8DFTFqG/fJL3A8z3J6u2t3Lo5d/QEgfnTokz8/qvO74W7+6OiMxzroF1KR2TEbNj8A8+zmsM+byV+c93ygAs3GRlFQcsZhof+s1zS3HS/p/55XbdVoq4kdf+TKX1T/rV/5Jo9MtrYD+zIqc1IjymQkLjD5+TmaBg371lMXEpI8tc5OZKtk5akMYSzUSkp5PtOpA1V89yaOUNDnGfDQfIs1poWER87TY3aUZoueValWVzUAYeyp3D+cg1S0FDQStqW2VcjuaEQQBPQqO3w40ejmzWtN7dXxLSWZW7mjLzHW2XKtRn/WvheciKk+7k93G2o7nV8qZxVKvCo0PRExk2MN29v/4A7z9vPZ0VcytMH4h2sutrY6xKZBmwJtbBxUPPMGvMRYTKE5N+eqIfd9xBNoJDm4QE8FKnJLfUEBW41NdgtlRIk3T9Q/ksxruiGhWD+KzBDszN2o52SGHLs0qhSZVNUJYDTIkK/oOpmJ0ESMKrCoRVeGwYgNSjdCQ0F9AEFagZH986vebipw8bXg1DCop0NbYXYFx9S8u0F3HW0tp4DxDxQ7eHAFBjOosjFAfYeNtdwqtxYZdtPcYBWyjOS65tGCj64OYG6X37nc1CjaFcr/iqhJF7IqGAh8YQwZbxh2MTvwTJMNoAwOsWdutkB69z3iqlVHZIKjCtEirm1pg0uZ9TDibH/u7xPPwgFZlSOK+/tnO4I4v4VHoIdZLnKRSmX2WkEt+I4zL+NXtdJXpHf95yZSVRg316+AjCPo095qQQ1wRhHxw/jDan+ESx+aicl0Ff7pPFJ+w+hQ74z5GEJE9rqeVXIsD0xK2dwe10Ut3MD3pWFmXS2bGfkRJkoUPd13+MwJd9Q8i3QWFhh1oeIojYlrA0FLAdTO4yA85hASDbhNCrlLb/zQJZOz0d4np9y4pJhw1YiRzjqchmaXBAVxb3X+dCTZf039aEPzgtBEKlWBKN6Lij5x20PsNYHTp0LDHs7U6tBPhOSDE618id7hfeS6cPKw1Cgy/jX897m2lYkYfJH92stAoAPTehMghhfXLC2tld+dJBAeLr56V56em0p7BOgQSHOOo5RrFZIxosP2wlJVRhE9gMlghjDpKD+7TxDZJqrzT+gP+Z153H42nvKjCKdpF7TgZRldlgz3aFaH3SYF3rr+9/0BFdgAs0MT8guUWF4o+NJmf4W0pZRNk/9Yq5tx952fDndRbCDsl9611b/lJTsWvBLtfy9qGkPcqTWOEprUphnSUP0F34MUBvn0t/60PGB+BI2N5tpcoQTWqAY87JS5NCp6wcQh2YLPZroKVDBQSADl+Jw34MTn4afEp/yLSqZvXxN7fdjUdi9hL59GHt/4629OySfd9n6Fx1tusz5XTb4BLnLfN6jH4c6/+ma6AQJkuvmeM1oPocr/IXxooUkX78wNkQTC4XvnIu5bsCMjcIM0Yg3KpD1mHJyj8k8ByfalhYFmQNo53zqr4cccSs0tPYGOUNvaoG1nSe11cpCaz6E7CGR+U79WsS0ZSw0fCxCfLbr3YxF6oS3A/dgfqi4JnZdkOAktpZiWUC2wWfhCTE6lvgcYem2CBgIBzjiHPbfWKI5q9z+sItJ1d3wxob+DR7WjmvBTbhSA/7CdAkh8h5ulosefmbMDNL/W4uXWhrtr7molpfcrFb0c3aA4WDTOFZPmrOzAEJuVqh/xOxVjs7We3PqYcq8RKk6BCLe7sCgihXAFPapm5RaCMHR+5fNdhwg+Q3uzlcz4+w2aR/eboPJ1jnDMt717jMSjNcPLrW93kqmcpZxc6c7+oHq2piRZNeWy3Us5FOFVfvRO9CPr3UpAkqO1i2nfAFNYPxKrzy7ux+xgcsXJvXaVTP5Pg9Bfja0obXnfnNIl4ZhATOD0/U7eJdNFzUIBtNa3Tg0+ozD8Tne5d4OZoIjmE3BQHQ2+LuXHDf3zCiMw2UMjwgQ74YfKNSdmrybddXo29bjFQjKzCvHt1NxZXqRqh7T3K9kaSXUX2ZKB0ANcKJrY8pW85f7L2if9Xz/8GDfLxk41OSIjSAQUkziVnk3amKMBzUd3Syl66DgeGw76Toh2birREv+LYli9aCMVOnQGvZfrO9pqRiJMlCiHpHmGW4+FkiTuXoiOVpIsC9n23q9IKnXIll6Xm2RFyLrvcQeRnp+/+MBIwx/avROx8V3hh8hVL/ry2kLyWxHisymk92Xfc8R6+b/wfVBrFZS97/8K2oQNTXHZz1R7W/8jWiGSLCcKlzj/Qmvu/xT015M+r9hR8qskg+grWx7uosBu+xe8zTrhIS4+98lUlfMIcmY0eF1rntomGxjf2Cg0ggXk1NoDbxZ10P0AP7DdB9zGdBwCp2ShzIXzcNVrh0qcXWPJ9vzw8m1wX3Z9eE1zIkpChekz/w/R47mL6n4wB4VddUUfEoyMpME6ivrgCqsoE+dr0ndywWtO8+3k4KMcHFwS/vcBf7Wp0JnE2lsoiAKBBLQni41/H3ZH+BLXlgcLzAOFN6aZBqUaSolmga0iJwsAFkyV38mpYKCTbOCudfVxhBzQvY/gwIlEmhPXX6HV5QEDr+5hb+kpFAFRn/MxKVjo40TMO9mtgKvp3kX79Iv34G3A/9IfO0qPkAp6bXfT8W/b2Smc1/fddpB5yPi2Et1NKb9KgFVdHb6hxfkXt46ZF0E/R9+m/PehOkmzPNorKy58QpUmLiR3hhS30+OmnmCnKMRJn655BiFGyKYqzAKqXkmuBE3TldvtsnfVLnzBBgxvX60+yMk5rC/4yC9d6EoyYd3TSl7MHR6IchnGC+yMeqjyM7PUYj/ceL7UXqFFy+wjffo4S/hKk1OcIfoVvc+LDR771OAd5REVt3CPn9Z/7/5/BqD4WhG51Dq/B00lHX6SvGdj09W4NmueMUwzoPo53ww1PWjaDKwYbK/lEDZwy+THNlYaJr7IL35uXEQX7Lw8mvKBtxTBLW892oI7da6yGOKfJu08afPDVop7MzfYK/DB2R3+WG8C/7VV1UPg1GtQdMUIvV4/yax2ELNKkqHG6oqWQPsqJI7vNP90IK8kgLSujo5HN2jAFPjr8OgTgI8G4X07/dNXHBl0pZCVg1o+wWI+W59TDll8Gy25l/xc+S444kqxuNaucWoRCtH9vUdJjUfjbu6acsvl5YxIifMOyPaYL1RNw6Wc8T4Rb6wfN8e4JnByb2dHCu+gtsknZW6woDPl8VxPXtugCuKcDsQJKWa1Il6ymJYwsVPpicD06oqVbFx8Osb4PeEv9IubF1PbjArCrgl22FO8zTdmRh5Xxap7nOaJBt8X1gHaBM4OTezo4V30Ftkk7K3UrBQi7bvCQdi3cr9KNtAVef3/SYpz8Q0J1RGeEwWLFgSvSvHFUv1/TNwP22cYoROxjzFicvR3cw82uajtBJ3rtjkjzQ0XZQwEFeYeGKxqPuc01Vhq7g2ZXsQIomFE0jdrN31Z8h8HhdYvRd7M5hQ0bnAY60VZXyfZPfO/4GSvi9YSGikx4r1vmWb7/qulDYli6RhYgcLkoncOArocWtsbME0Z9A0nsEiETF/PE6yOXqMw1K3cOuwclQtFGM8aQ23CbN3+wABP9/xCUT/JEycmHZlzZW6ibBKZaOPtw5Xb21nbTpzLtpol4DqBfdSs5YKoiRb41KO3rC6+JGKYQKOyvge/0O9P+lBM28wzR7tWOeB3WTluOWTg7ASEtch5umwFpdsDmHscvB63GKiMdT1+xozxNj16p60cvAdQL7qWFHnn/jl8pYk/fGf0bERGgoQ9oDp3EGs07d5msrklema+IL4eJlmLZO4c27IYaQFzxcPbZ/D44zLi7cyzqWoz6/JnsQIesEPJaH+b5fRPnr6MRUT15rIgY3q/Thp0/4V4R12HjIksstVr4fEen5eeG7gGBJK4Z/slxx/H6/YL6n9qH703hkrUl39u9Au9N/fiC9IrFK+5Ai/zJPPHPbfpX6n+gIDvF2/GgJWrv/vKiNe4qw/R1KpnQ+RM+TYeN84eZunU9Tku+/re3Bpuikv6CGt7i/hB7mgd03r9aewYRXPmYImrUO4quV/Z8mwGg4axcPWQnah4p4ukHeXLseze4pH7lSJDHZlkHB/6mBA2R9tLZk7Be//fmoxvD1/tc9c9u+IWkHRH7w4yc5soCQGMwoRPg2WOQFbmY3DaNGm/+LJRPegaRRTd/EiAHNWtYATYY3+Pyi4lpq0eGKoU93fgENKUGQgi7/Tf7BqIIwspyxdnA8l3G5Xpye/x6U0XnVBAhlS5Syma/8KrGyWDxng3PhrFWIWWnEeOo8qAmkFggt5hX0Fbiat4BCm9rxCruQ22ZPL1oHahPAWReKw5w6TIeKja5WQEehWz0l03z5rUBEfBQPS2g6R6o2w79iXCoKLBD+auMk1akT28Rzcr7z4J0d5QYvINC5nMrzXUqgGrzq1trO9F66X9kmgBddeV/364xjXSsGf1ywZBgcY+BzS669xE0cV3N/PnavgKBE8LU/DdLKwBfHAA63A1fsXkJVLX/YrqysOt9J6byrHI1YssmoreQ/j5X9Op+joS1FB5+IZwegf2F4Q2MPECHji4s0JE0RcDgAVemrHUdR6TyH/+nY/Wv077EGq4Sb51yS5rWLkrlvxqRLSLQ4fc6GTdYIwWJO5RouXAFAOLPZNQ+14UjN52ltadALne6Pv6iPA7A28Ga/lXks0OXRWw2hGO6bYBUg1qZ+hzi8cPCz4ExmPkAsDtUBJ51dXWtYIHBoxiGowzwOUTKxQTWbcvYfHMJqizwBJIF7xwTueSStLNduvQa2sfVCcHq28Hlp6/P3CBM4lqRqMwfmkXDH4D+wOUoaTBMW4NCOUPrZJS2vDXhVmpkHwYtpVgJZMHWh8MjsnB2AkJa5D1dSJkpM8Sx4X27J6u9vchRUje053i0kQ6HGXCX47P99oIAmlDSYJji91gqiIPTOOrKkQMB7A27fSKeUzYI6OGyOfTksjd+HbWV4MPV3JqFxef+QQHdwGhDucuZApa7tqiasg9s5nAP+2yiEcTPHHuxo2rLJOVThalHLSA6Q5MKWtzmzA0B6Y34DPTsToilkrkw8PS5N2hZ7/UNoWfv2Wmn5jOLSzjKm60QogGl2xI/lXWjfhdJFTBc/zQrNR3MNTpGvmmPlNB1jTQctgrw7lrPIyF47nDX5Ibeg4tEwOg4AwvLpAkdXOpnNytIjxw6Ll3f8xavNNWxFVIm0Ic0OOjXqGrqnAwfrLN0phqkHkYbJBmrzujjt6s9c/Xpv0BRGqRc16He81mj9pqKl4p+0vHyZNNMNngTsVqlHrhaG60FnvibQrvbe90/2fatc2ycKoH6zmOW1kXuQSJ7CyIcotYBfg/Ud50fRajZT1APFm+BVxZnbV94reXQLQNq1lmOBsKhyV8j9rx+qEXYeG75cRePRb0c4tXPa9+p4Sh+GHpj9dH7RBD41PjQrAoo6bjh0BofV1671gWSQrZ75hBWwb0wx7ar7VPNRVbJPrpa6novePLZq5Zcik3hIcundYpS1o/gKu90imc6oynK+3lVrvyc56qpQ4rmBjfR1ZN6IorFWM6k2zeSOyPeYK48feuR0kNknkH4x7HHyqJ2leLS0w8mbk/gqr0linfRAXrDU3Y9hJIx8ldWXSm27WrreAy8lmi8SiG4FBYqwQ+y/lMD4L1K+nOgGNkACV16NjTQ8cLA9od5xPEQ70YhEP8Lj5TW2X+ctXJk7QrvyObxbAonAzRFPDOryvzG797DqY+nMeIRD/C4+U1tl/zlq5MnaFd+RzeLa1bRO+FWnLH5kXhjM8YN467Jz48PFaR4Npm3Ohyj0og63dtOq0BT0y2BUf8Ad55UwIBGQZ+SGj7FCMhjngmoMM/z9e6HhcMk8qIBAocsF6+D7OPduzQbbkHit2XYB29JGp8auZu2/0isUlwwDuRNXJJLBjv2WLiexJsaxq16bKIL4NPBNKaiZM93M1xe5682zc/GCa2w+Lnx5dyoU6i/vWks98V2AMi01IWs1aRsJJk9vfWuHsyqsXUZXiZNJVCNzIkGeCCA5xYQGqoxjgfgFCDyGGpXpQe2ztKlsecawag2plu0XF2khYrpHfLgKyEwA5RRwVD5SohZbTkB+9/Q/2amZx+khazC4Jo62vaxX8nkbeqcqQj/bvp1aDs/sE6wHuTbZaLrzgbdtbj/Y6qr8HmZMa+MF4+gV1tOfcqm2yOYelvlfLe05Yd0IyaOGLIFeKkHyeuhHLkJWRTfhC1Dm0/3Dfj0MjVYhIfFf7QSDNPVClEsRIa7zL8rVc1NNw49zfi7XKGAvisQSi7DxloIJBI8dhy6787ANE5y5B2DQt5wj7WpOykE+fdNrsicHeiXfnONfK67MeHvGtUblPwjqrpcHk/DSBB2DQd2Xo789zK4uPyqaIU3ZYJuLsjlhDy4IDhJbPeA6v2VqZWU6OJpblG7MPmHQAdWOiX4wyhlKy8gNa7moDDGnubOEA7CO/GHebIfoGPPxPf1Yk6VY1uLjCt+bLKeantRKfJxxcWhx2mnS9LEht4jsfdI0Mhfwzt/7wCAAAAVZYHOjhwO45Akc65bFRr6tsNczuDHOSIM8QiH+Fx8prbL5XuWcnah/f8jm8Wz0WJO57LHRA246KbMQtCweAEiN8hMEIeDNvw+g0OSvQSNJs8RkWwJiG3SfqJMeVw+az3Vmqd9XnDd80Rk9NJR+0HwuTyj7n/JTTOkdGkS1kf3VzzjZLvBzNBF2pW6UNulOMJa15BiwKcKJvocCVt3gYp+niE53ULLVdQ9e7rFHpJUBzFsPdcS1vnhY1FzkF4rEzcqDUzouahANprW3lkNRMe/cM99fFyiM12E6duWeKvUKbwdGWHTz/7A/iBjglmMDSi6NWa1UXTf8IJ2PXbrQk96ZDx5c+H2mBwdAWGr4VDwsdSuCJQieEhjVJc8q4r/egFX1oKirMFpbM0rbnuQMTOPLHKCg0eFuKrvf5j4/cgpSMciPc/cBzr8exBG7LJAj486w+sqSQsbinESIlLPjqF6PjLUC2N+wBQZmwVjJ6c/UVKiNL4nE3dZQ+pU2tnr0vPKweuXGL/fW13ixFP2pj1U3SgOK4eSuYacG2Ojcn8FVefxAoYyGS0nSpIws7YvyZfwk0AAACKhg9CJvzuFe9YEUl8GmWQlwo/+nY/Wv0/+dXYnphcTSxRw99txnWY6Lpee4xs/U/oFpWlx0v/L4asTctiS2sDbg3sLZMzBHA5iWIDbNs5n6/NJtZQZQ//hOZRq01aCKDULQMX204pESW2HZhvxPenFmq5nsA0lRhbWYP0IcAAAAAA==) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md index ba151c673..ec96b707e 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md @@ -19,52 +19,202 @@ ### minecraft -- [`@texture minecraft:block/green_concrete_powder`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACLklEQVQoUwXByXLcNhAA0EY3NoLbsGxLti+55ZDKPZ/jz8gnR2VpRhyuAAF05z31698/lWr4IhFGpZtheb6HMKZ8BmEBYD8mAIHSZd74ctiPgFBqBWMB9LNUbIYYxiuMqZ3S9Ao56fgMrvuU7Nvbheu9A3BNwJIFqj+f3oW63MOVQNu6PQHEKJ3X2fbfVmGnS7lK1s1whqE+P5p2Sst7EKEIW2VDmL2r59oqNueGACsSOgAp2cVobi9FitXatGPWqilRxU2LaG2j4KoVlstgrRdpRXT0vU8n10ylFK4CCpzzpFU8r5wg9HwecJ2kC3PoeLk31y7pou6WMdMVFRGklG/fEqrmeVcgrBSiItTkrkM1rQJk7+25IDn4+pNFlDDEqJ6fVQT2z2C9DreC/ZfNhup8BSBhGL4eSFI5t8Pej3790NaLwtoM+7HU/VPjPmM+KCUik0rlc21TrPO7BQ3nkabXLNlJofXRTq+7sYTtwH4o81uZXi6uFZEQKEfnrDaGjINSL0Xyx1/H8vDMlf7+50Wqazqcf9P0I54bkQauzAwsfK62n5RgWh7qOnQ8WBtj06EESjfR8Wy7cU8xlFJME4/7aNvEEJXyNfrxdbYeMF/QTklhvf9XmMs2B661H71zZBwCa6kmH05RAbbzW4c56X3WTahNi9YDEUzfU8myzVJKQbeSqQAKTSJ7ASokfTVdQRRmRumF6fGmjas2wO0lLR/D9mhvPxZEvT0aY/f/AVjYaSiNzb00AAAAAElFTkSuQmCC) +- `@texture minecraft:block/green_concrete_powder` -- [`@texture minecraft:block/green_concrete`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAoklEQVQoz3WRyxHAIAhEtxhCLZISMP3XkQOouI4zHBg+7luEdYl4v2fLPZMRGi1EL6ajOjdH8akJmnNpTGuttxRUVF1iez+1fC55mguial3MxaaaLzPkDYQ7ASpPpUCtUsx7VFoEGWHkju/iLqxwd7/wwAzHMtHi7lLZlYt1yY+rAK3e9zgdqBEvVR5ywqbP/2r7fp6V5ohq81AA9KYzW9blB2ZZyT6my4nWAAAAAElFTkSuQmCC) +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACLklEQVQoUwXByXLcNhAA0EY3NoLbsGxLti+55ZDKPZ/jz8gnR2VpRhyuAAF05z31698/lWr4IhFGpZtheb6HMKZ8BmEBYD8mAIHSZd74ctiPgFBqBWMB9LNUbIYYxiuMqZ3S9Ao56fgMrvuU7Nvbheu9A3BNwJIFqj+f3oW63MOVQNu6PQHEKJ3X2fbfVmGnS7lK1s1whqE+P5p2Sst7EKEIW2VDmL2r59oqNueGACsSOgAp2cVobi9FitXatGPWqilRxU2LaG2j4KoVlstgrRdpRXT0vU8n10ylFK4CCpzzpFU8r5wg9HwecJ2kC3PoeLk31y7pou6WMdMVFRGklG/fEqrmeVcgrBSiItTkrkM1rQJk7+25IDn4+pNFlDDEqJ6fVQT2z2C9DreC/ZfNhup8BSBhGL4eSFI5t8Pej3790NaLwtoM+7HU/VPjPmM+KCUik0rlc21TrPO7BQ3nkabXLNlJofXRTq+7sYTtwH4o81uZXi6uFZEQKEfnrDaGjINSL0Xyx1/H8vDMlf7+50Wqazqcf9P0I54bkQauzAwsfK62n5RgWh7qOnQ8WBtj06EESjfR8Wy7cU8xlFJME4/7aNvEEJXyNfrxdbYeMF/QTklhvf9XmMs2B661H71zZBwCa6kmH05RAbbzW4c56X3WTahNi9YDEUzfU8myzVJKQbeSqQAKTSJ7ASokfTVdQRRmRumF6fGmjas2wO0lLR/D9mhvPxZEvT0aY/f/AVjYaSiNzb00AAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/green_concrete` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAoklEQVQoz3WRyxHAIAhEtxhCLZISMP3XkQOouI4zHBg+7luEdYl4v2fLPZMRGi1EL6ajOjdH8akJmnNpTGuttxRUVF1iez+1fC55mguial3MxaaaLzPkDYQ7ASpPpUCtUsx7VFoEGWHkju/iLqxwd7/wwAzHMtHi7lLZlYt1yY+rAK3e9zgdqBEvVR5ywqbP/2r7fp6V5ohq81AA9KYzW9blB2ZZyT6my4nWAAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/green_glazed_terracotta` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABMklEQVQoz12SvUoDURCF71OsteYHe58hYCobCaggJMVikUpIEwRJl8YyVRo7fZcETFIkr+MXvuWsCMPunbnnzJyZO6V+v8F2xxM2fOpiOX98PWCv6+7ss7f52RPELaD54RC6m/TvX65DGIwun98qCPPvfr28EFa8Bo0PIWSgcMaLivQQcOEQL0ETwra7AxGycg2aCITp6srzWZK6URK0peTDxEC3BISC5vQXTQq+KAGtNlsC2fSggebC3FwHDRlVaCPSNo1jbkEQkCHaySqvZHx2KUezjsKogB6CRRngbMs0qpJmBLRDLxlo3ogDd+R2euqx4JlgAnBEMdFcp0vfwZZagtGg06LqCd4+dpoKzId2cXwdc0c3LlCbgdasBjw5fP91aSIrN8uXbXOZQ8h6a1nvX8UXRs8wRVstAAAAAElFTkSuQmCC) + +
-- [`@texture minecraft:block/green_glazed_terracotta`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABMklEQVQoz12SvUoDURCF71OsteYHe58hYCobCaggJMVikUpIEwRJl8YyVRo7fZcETFIkr+MXvuWsCMPunbnnzJyZO6V+v8F2xxM2fOpiOX98PWCv6+7ss7f52RPELaD54RC6m/TvX65DGIwun98qCPPvfr28EFa8Bo0PIWSgcMaLivQQcOEQL0ETwra7AxGycg2aCITp6srzWZK6URK0peTDxEC3BISC5vQXTQq+KAGtNlsC2fSggebC3FwHDRlVaCPSNo1jbkEQkCHaySqvZHx2KUezjsKogB6CRRngbMs0qpJmBLRDLxlo3ogDd+R2euqx4JlgAnBEMdFcp0vfwZZagtGg06LqCd4+dpoKzId2cXwdc0c3LlCbgdasBjw5fP91aSIrN8uXbXOZQ8h6a1nvX8UXRs8wRVstAAAAAElFTkSuQmCC) +- `@texture minecraft:block/green_shulker_box` -- [`@texture minecraft:block/green_shulker_box`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABDElEQVQoz3VS2Q6CQAzc/xCPwP6Jxihq4gFR8Ii8eEX8/0en2+5SgiZNmLKdttPWpGe7eQxhAITvQ9jiYtOTwv7//GgNPtODnRV2VcWwWWnhCi4ULikGTIPccPAre/dh/Bzw8ppkdQRbVQnCUNaAJBF1tHsNYBxB9u5rF2GTPDEgESEEtS3/9LgaFyQCNOiWdHrtsgyvoZAilK+Otk9pQ/rx6UU0a6A399AFwnFFxrtYCCFrkzv080NDoXSHlJrAY+WW1reR207yb1AtDc0e/Bv1pmfVKsJ7cASZtx9Ud6wNgcfKJwCtchoK83AB0LnbA45vH46MlMFtDq7sHB/vD2pQDsZHLvhEGLPX/7+0ZtOv+bCbWwAAAABJRU5ErkJggg==) +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABDElEQVQoz3VS2Q6CQAzc/xCPwP6Jxihq4gFR8Ii8eEX8/0en2+5SgiZNmLKdttPWpGe7eQxhAITvQ9jiYtOTwv7//GgNPtODnRV2VcWwWWnhCi4ULikGTIPccPAre/dh/Bzw8ppkdQRbVQnCUNaAJBF1tHsNYBxB9u5rF2GTPDEgESEEtS3/9LgaFyQCNOiWdHrtsgyvoZAilK+Otk9pQ/rx6UU0a6A399AFwnFFxrtYCCFrkzv080NDoXSHlJrAY+WW1reR207yb1AtDc0e/Bv1pmfVKsJ7cASZtx9Ud6wNgcfKJwCtchoK83AB0LnbA45vH46MlMFtDq7sHB/vD2pQDsZHLvhEGLPX/7+0ZtOv+bCbWwAAAABJRU5ErkJggg==) + +
-- [`@texture minecraft:block/green_stained_glass_pane_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPklEQVR42mNgwANS642eJVYZPGMgF4AMiCvTp8wAilwA0kyxASBXDFwYgFwwsAYMvBeGQUocHF5IrjHEawAAqHU+aprkHnQAAAAASUVORK5CYII=) +- `@texture minecraft:block/green_stained_glass_pane_top` -- [`@texture minecraft:block/green_stained_glass`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4y2NIqzdeTAlmgDLSyMRYDZhNiQGzKXHBbGp5YdSAEWPAbEoMmE0TL5CNAYkBjWW6vToCAAAAAElFTkSuQmCC) +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPklEQVR42mNgwANS642eJVYZPGMgF4AMiCvTp8wAilwA0kyxASBXDFwYgFwwsAYMvBeGQUocHF5IrjHEawAAqHU+aprkHnQAAAAASUVORK5CYII=) + +
-- [`@texture minecraft:block/green_terracotta`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUUlEQVQ4EQXBwQEcNxADMHCkatxKfu6/Et9qGCD//f1TCoDIjJloa99z7lHs97QFQsSFiLlHYHnivY+WsLtmxpzjvWcEVF2J1+p7tKgiICaj2C1IRg62qDthzuiW1qIliZPYVgsYgj60iikGk8iMMwdUva4W6t7jzgEtZhD3TLytiC26zgwAIN6uIAmhW/ces1tJFABtKcfQaqtblIlJzMT3PZfoW1UwM2B37dQ4dldLi7eaiJg5LuQMeN/HFouxr6jMOIOgSES897nQXS0TWARQSbTP24BMaJ0z5hy3+0hIKMS9F3zfP3KNmBMV+x7h/Z6qW6QkVYN675HgmkTCLqwkMtFg1yUKJWjQaovIHHnP7iqCCEXiZgIgE93KHX6fWt/vJ1hrjECZO1KuVhOK30/FbgUE0cTNgG61a3+VGbciEHquYMQMb6mKqLKrqogo/gcV6vrcd5o15AAAAABJRU5ErkJggg==) +- `@texture minecraft:block/green_stained_glass` -- [`@texture minecraft:block/green_wool`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABjUlEQVQoFT3S51KCQQyF4b0KPrCAgjejiNhQVIoNe8eC5bfX7bOGYWZnyGZzTt7kI7VOlzYvquvHy62T5Z3b+YO3YuNsqX1e23+udMfltX5DvnM/5wiag3ravZvfe6qMfvM5+igUbV0tOvFMKV49WmkO63y3rxeSot6kJLt9s9D/Lok7D3OulOLuS9kZ/JTYybDOHUgPXqcyMTClwMgETtRkhEkpEWnkWdYAlLjXeivtUQ03pPVhPeffCpCeEjg/BOGqNNYgI9ZQn+agQUmweVlNMe7he/YG42jI22ye7IogasxgvMTDmaVUaIWVH9eYTRJ57zPnE509AAPt7g0MC1feNHi0FftW5knxAA4DaPN423vMstn3sXGmQZG46pX7jHMKjyCDAfgoiM1DqQlIm0x+stljxYl5bJBf5PVX/b/oBgrxdOiA0c3HBurKkpL9DEa1eZI7gPj4BHgUIaEJdJAWLRZgTiz7X/njK5IKYtv0ZgZbQmX9fAHjTP6xZuAt6y5LpiFXseaeYh56T3/wfd3gVVhWmQAAAABJRU5ErkJggg==) +
-- [`@texture minecraft:block/grindstone_pivot`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4y2PwN5L4jw1HmEEwjM2ACyArhmmw0xTCMASnASDFyBpB2EpFEC5G0AXoikEGGMjxYbgCrwHotoMMQPcKTgNAimGakDHMQIIuGAWjYFAAAEsaXKFOwPwFAAAAAElFTkSuQmCC) + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4y2NIqzdeTAlmgDLSyMRYDZhNiQGzKXHBbGp5YdSAEWPAbEoMmE0TL5CNAYkBjWW6vToCAAAAAElFTkSuQmCC) -- [`@texture minecraft:block/grindstone_round`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVQ4y+2SwQkAIQwELdcC/FuCfxuwAfvLMcJC8HPJvU+QFTGTbEyZc9re26T+jJa3xaPWmo0xzu69W631aBigAAEEXGvlKvCQMACvAHxmzmELZMECgQJIgX9qYqoHPPK+CVZFKYAvP9VELNwVSFPfeH8hd+FBIpNGVzs8yv8qD2Su/2cwWvHkAAAAAElFTkSuQmCC) +
-- [`@texture minecraft:block/grindstone_side`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVQ4y+2S0QkAIQxDHdcB/HcE/13ABdzPI0KkxPZugSuUaqjPEk1jjDXnXKhc233v/ST0pIGmWuvO1tpJaqWUnViHADTwEJsVCP0TwKoTEBYC9HY7tgXDhwsAqt6Yc96pk7kAiLbJAxDsAvgK2qxmhiZyAoVY91lxmQtQ9zmBNRI1BLwdstDwGb0vTI3fmFr644oHfph7ITBuISIAAAAASUVORK5CYII=) +- `@texture minecraft:block/green_terracotta` -- [`@texture minecraft:block/hay_block_side`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4y5WTvQkCQRSEXyEighhpoIEFGBpaiw2YCYaHJWh0uakFWNTKO/iOYW5XMFhm3/8ybzZu50V597tyv8wHTPvz2o422HeriZ154YmJ3iCTvVEOynvkhSQCWkicApATz+OmPE7r0h2WA3LS5lz3s2o8MfSJOsH9Hudl0SIJMlsNRw4ohFUnsxZXUicNvJH6a3nhjn8xdGIr8dcLo6Y8JYu7kqukB7tmv6mLtNEHdlMH7BO16cFH3JU56ECFobJ26eoQlXbUFOh/wv8GOGyhVqikYvu2wC+PC1PqFZeh3AAAAABJRU5ErkJggg==) +
-- [`@texture minecraft:block/hay_block_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0klEQVQ4T22TsQ0DMQwDVX7pVTNAJgjSZYV0qdJnhMz0AR84gc+oMN62JJIS/fV5rv1xXfvrvh1L+9tl9Z5F3O+1LyULRIcE03IwL6amPPn73hoo750EUH3LGQiqgDPM5EGis2JFzy4ti4g7EfueQfaKEpI9rnvOpxkoeZJPkTO3AgrdPp82fbs73lKBDhAqUkEqOdmYHovB30fKd5trmvjE6i14K38uZM/5UjNeLnGy0oeGfED7HXhyqvBW8p85ADJpGhTOOEEr8OniwNTG5JRqf83aPKMvuldQAAAAAElFTkSuQmCC) + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUUlEQVQ4EQXBwQEcNxADMHCkatxKfu6/Et9qGCD//f1TCoDIjJloa99z7lHs97QFQsSFiLlHYHnivY+WsLtmxpzjvWcEVF2J1+p7tKgiICaj2C1IRg62qDthzuiW1qIliZPYVgsYgj60iikGk8iMMwdUva4W6t7jzgEtZhD3TLytiC26zgwAIN6uIAmhW/ces1tJFABtKcfQaqtblIlJzMT3PZfoW1UwM2B37dQ4dldLi7eaiJg5LuQMeN/HFouxr6jMOIOgSES897nQXS0TWARQSbTP24BMaJ0z5hy3+0hIKMS9F3zfP3KNmBMV+x7h/Z6qW6QkVYN675HgmkTCLqwkMtFg1yUKJWjQaovIHHnP7iqCCEXiZgIgE93KHX6fWt/vJ1hrjECZO1KuVhOK30/FbgUE0cTNgG61a3+VGbciEHquYMQMb6mKqLKrqogo/gcV6vrcd5o15AAAAABJRU5ErkJggg==) -- [`@texture minecraft:block/honey_block_bottom`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMNJREFUOMt9k80JQkEMhAOePL67ZdiaZ3llvBqswl68WYAgCJLALJ/zsh6GzbKZye/G+3Zaic/9XJCd52s7rs/rUqf7BS/pIIggW9BdvBCZAiQkHpfDTlTZlIA/iJT4l0kiWKNHpUhHTjuUupM6UECBK4MuqpfgfdgJyGlWAt80yiph1pwuI9+FEvASOrIH4IKFR5xFZuo/Aj66zubiSGCMkZ2diTmZuzMWyT8NSfwvjD4WyZUdFCK5esDv687eAyenzxdCexZaW6y0mgAAAABJRU5ErkJggg==) +
-- [`@texture minecraft:block/honey_block_side`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMZJREFUOMuFk80NwjAUg31lB8ZgHXZgDjZgBmbIgQVYgCM7AEJCoBfpk1yTtger0YvtvL/qfd428Lns2ut+7HjcDu173XdUvFCc52nTQUwICyVyYMAZE4cIQpwTutizEGIEEOu7VEKhZ+AlFDlThJhCzhODTDFFnhE8cTkCd15OlqQ1Ii9nD+ArR7PWPC95sgej2tOYXfFlk7+0NK5CirvBaGVzKohHi6ZREGRT/ZE/gzkTRJkhXLkgL+d+IOcpiTnGXKxs7g+3G64wjFJPVQAAAABJRU5ErkJggg==) +- `@texture minecraft:block/green_wool` -- [`@texture minecraft:block/honey_block_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE+VktENAjEMQ/PLDoxx67ADc7ABM9wQJxZgAT7ZgUNICORIjlwrIPiI1GvzXDu9WI+bBfU8TVWv825Y6zfqdtnn3mPeLqEwmxVAE4rn9+uhzgcBhzvQYbDBJrVOWEXcUQl4Ps/tYgRRGYGNXQQ2doVz9IbCv0A6l0Ggs6iQz4NOQ2//Fy6Bbjg+/Q7OCF32T6/iQ04HfruD+G1ZKlDP6NYV5N9HmMJkBgE6cZi3Yo8wmYzgg1PbCmt2HXK4fYe/3Y71G0k0p/74OnvSAAAAAElFTkSuQmCC) +
-- [`@texture minecraft:block/honeycomb_block`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4jY2TsQ1CMQxELdEwBKuxABPQsQCbsAgVNQNQMAONkcN/0X3HAQrr6+dyts++2P248ed5637b++uyaxH/18MnwMEUD8wgc8jl+BJKyrjlilyKpHT1DW8JFKQ1f5x6goy1BAs+dKAXVHOc6zzArdIcIKSMQ6aorTRFW0IeNAsOZl2zDE3J4K1yMRPLe2alJMk+QUpPABmC+uIvH6iJckViOhPWqO0S6oNqJoMPlFz5YOaTnz5gA1MfrDQve562XPmgaxYflG9Dnrtib05rlmsKX069AAAAAElFTkSuQmCC) + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABjUlEQVQoFT3S51KCQQyF4b0KPrCAgjejiNhQVIoNe8eC5bfX7bOGYWZnyGZzTt7kI7VOlzYvquvHy62T5Z3b+YO3YuNsqX1e23+udMfltX5DvnM/5wiag3ravZvfe6qMfvM5+igUbV0tOvFMKV49WmkO63y3rxeSot6kJLt9s9D/Lok7D3OulOLuS9kZ/JTYybDOHUgPXqcyMTClwMgETtRkhEkpEWnkWdYAlLjXeivtUQ03pPVhPeffCpCeEjg/BOGqNNYgI9ZQn+agQUmweVlNMe7he/YG42jI22ye7IogasxgvMTDmaVUaIWVH9eYTRJ57zPnE509AAPt7g0MC1feNHi0FftW5knxAA4DaPN423vMstn3sXGmQZG46pX7jHMKjyCDAfgoiM1DqQlIm0x+stljxYl5bJBf5PVX/b/oBgrxdOiA0c3HBurKkpL9DEa1eZI7gPj4BHgUIaEJdJAWLRZgTiz7X/njK5IKYtv0ZgZbQmX9fAHjTP6xZuAt6y5LpiFXseaeYh56T3/wfd3gVVhWmQAAAABJRU5ErkJggg==) -- [`@texture minecraft:block/hopper_inside`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVQ4T42TSwqAMAxEe5supBvpwpWC97+T0kIkmYxJF4+Azbx+Ldd5PxG9Hx9svLBGTWv7BL8bAQtoUCTVCbB5UOv2K50CNrOERtXgdoxAJBhiEirQs2cCtwVcfgY9xNUwbsMIViR4E+4aMwnehBNIE4ZYOHyJbLlYl14ijmnCn4kFMGwEjCgovGDklo39eI+0AAAAAElFTkSuQmCC) +
-- [`@texture minecraft:block/hopper_outside`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y6VSOQ6EMBDzh2hWKahYiYqt0kJJxf9fEJRIXjmjCWdhZS6biQO2dU3LPBfk+Aic0XkwiTEWML8KeETmerbm8JumpPBIlsw8z0MHrJgnrmcRYPAdxkdA132SRQh9Ba1rP8dgQkWNFV491yoT2TjzofKABLprxbTGl2C/bOCt1vq6Xf8v8AbuK9wBPGdbjmuPV4Il6X0tya7f/JHuYAdS88e7oGJfrwAAAABJRU5ErkJggg==) +- `@texture minecraft:block/grindstone_pivot` -- [`@texture minecraft:block/hopper_top`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4y2Pw9PD47+/vD8aRERFwnJ6YiIJh4jC1IAzSywBjkINBeuEGmJhY/Le3cyIKg9RiGACSYCASgNTCDQD5i1wDQHopNwAUwuQaANI7HAwY+Fig2ACqJWWyMxOl2RkAZowlDF2IQ5oAAAAASUVORK5CYII=) +
-- [`@texture minecraft:block/horn_coral_block`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4y32SMQpCQRBDcyQbW8FWvJi38A6CpRewsrD5taWe4UsW3hICWgx/Z2eSmU2+Hpf9ejtv18/7OML5874b8e+Os7rwWg4j9zcJIHGeA3U9bWbRIICcXcup9E8CLikkWW/iye5ja4cA0ZgkEKCTc6YzQAmmOQMQhN2vfHuu3FPbATCisQVkA9ccPRkSpUBuskhMdrRw6Y5rSv/bonYo1YdUvK0Fakf4pt0+K9VttWmCEHAKrVb+1z+PTi20+gIxASeoLR8acJGe57tz7QROAqakTa102phPc3wBggHhFG101/IAAAAASUVORK5CYII=) + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4y2PwN5L4jw1HmEEwjM2ACyArhmmw0xTCMASnASDFyBpB2EpFEC5G0AXoikEGGMjxYbgCrwHotoMMQPcKTgNAimGakDHMQIIuGAWjYFAAAEsaXKFOwPwFAAAAAElFTkSuQmCC) -- [`@texture minecraft:block/horn_coral_fan`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4y+2RPQqEUAyEPZLNtoK9F9tbeAfB0gtYWXiL9QxPRvjCvKeIrbBp8jeZTEhV/e0FNvWf9Bg8fuvkA8vQpnVuovaITCANKtbw9usywksSFWmwlVgEEMoTB5HAXmSrq4DQsaGGLS6T/E6Nk2W3ugoHkTvxkXOLg2m63LIfak432Sfkea2/GJXxBX5dgqhRL5fI77u5Au//Aj6TAAAAAElFTkSuQmCC) +
-- [`@texture minecraft:block/horn_coral`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVQ4y82SPQqAMAyFPZKLq+AqXsxbeAfB0Qs4Obg4O+oZlG94EGsqdTNQ0ubnJS9plv1StrU+OaFtmcozCYDAY29uINznvkoDCEG4o4c2TwdASCBx7Ipb9SgdjzsgCgYEP525dDB6Tt6igf9R3VbGKQBpuoBGdAsE2IEJxHZCzOsWFKDpo+3UQ384KxfIG6boPlZKkowC8Wyvf0EB9sgmQFFI/kjeQD+JthJr/QITIhaSwEOMBwAAAABJRU5ErkJggg==) +- `@texture minecraft:block/grindstone_round` -- [`@texture minecraft:block/ice`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4y42TMQ4CQQhFOb2VlTfwAjZWJmYbGw9g6VV0DZi/ef5lJxY/kwE+DB8mdqfXJBwu78L1MU/H27zcE/vzF2kX0h5OptPJ8suWvEogZ4cRuRIwsCPKzlMJ8gyv4sHUyJOWBm7wKiQzRlqtNGBCVt0SOUbPc22SyBGXBl0VgT4nyx9bI2T/Sbo/1+SfMXLOvp2+WGw7XBiq35EZUyK6qqPRdTsT7I3V/yEvL+i2znXp/kUWj0607ktzTzjSD5P1BaI086n9AAAAAElFTkSuQmCC) +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVQ4y+2SwQkAIQwELdcC/FuCfxuwAfvLMcJC8HPJvU+QFTGTbEyZc9re26T+jJa3xaPWmo0xzu69W631aBigAAEEXGvlKvCQMACvAHxmzmELZMECgQJIgX9qYqoHPPK+CVZFKYAvP9VELNwVSFPfeH8hd+FBIpNGVzs8yv8qD2Su/2cwWvHkAAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/grindstone_side` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVQ4y+2S0QkAIQxDHdcB/HcE/13ABdzPI0KkxPZugSuUaqjPEk1jjDXnXKhc233v/ST0pIGmWuvO1tpJaqWUnViHADTwEJsVCP0TwKoTEBYC9HY7tgXDhwsAqt6Yc96pk7kAiLbJAxDsAvgK2qxmhiZyAoVY91lxmQtQ9zmBNRI1BLwdstDwGb0vTI3fmFr644oHfph7ITBuISIAAAAASUVORK5CYII=) + +
+ +- `@texture minecraft:block/hay_block_side` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4y5WTvQkCQRSEXyEighhpoIEFGBpaiw2YCYaHJWh0uakFWNTKO/iOYW5XMFhm3/8ybzZu50V597tyv8wHTPvz2o422HeriZ154YmJ3iCTvVEOynvkhSQCWkicApATz+OmPE7r0h2WA3LS5lz3s2o8MfSJOsH9Hudl0SIJMlsNRw4ohFUnsxZXUicNvJH6a3nhjn8xdGIr8dcLo6Y8JYu7kqukB7tmv6mLtNEHdlMH7BO16cFH3JU56ECFobJ26eoQlXbUFOh/wv8GOGyhVqikYvu2wC+PC1PqFZeh3AAAAABJRU5ErkJggg==) + +
+ +- `@texture minecraft:block/hay_block_top` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0klEQVQ4T22TsQ0DMQwDVX7pVTNAJgjSZYV0qdJnhMz0AR84gc+oMN62JJIS/fV5rv1xXfvrvh1L+9tl9Z5F3O+1LyULRIcE03IwL6amPPn73hoo750EUH3LGQiqgDPM5EGis2JFzy4ti4g7EfueQfaKEpI9rnvOpxkoeZJPkTO3AgrdPp82fbs73lKBDhAqUkEqOdmYHovB30fKd5trmvjE6i14K38uZM/5UjNeLnGy0oeGfED7HXhyqvBW8p85ADJpGhTOOEEr8OniwNTG5JRqf83aPKMvuldQAAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/honey_block_bottom` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMNJREFUOMt9k80JQkEMhAOePL67ZdiaZ3llvBqswl68WYAgCJLALJ/zsh6GzbKZye/G+3Zaic/9XJCd52s7rs/rUqf7BS/pIIggW9BdvBCZAiQkHpfDTlTZlIA/iJT4l0kiWKNHpUhHTjuUupM6UECBK4MuqpfgfdgJyGlWAt80yiph1pwuI9+FEvASOrIH4IKFR5xFZuo/Aj66zubiSGCMkZ2diTmZuzMWyT8NSfwvjD4WyZUdFCK5esDv687eAyenzxdCexZaW6y0mgAAAABJRU5ErkJggg==) + +
+ +- `@texture minecraft:block/honey_block_side` + +
-- [`@texture minecraft:block/iron_bars`](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAk0lEQVQ4y5WT0Q2AIAxEGZcvP/xzFzbANZgLc0RMI3e2NjGBtpzcA1K6o56178fWkwnMc85ubkRrbRFA7pcAdlFKGUKYM1HUqcC0gCI+jJktKTD/zES9PukNAixHBaJ+lz40KWBsV+jDmsfKFzBly8J2gYUZMLrRk4kDE7kQMAubXqQIsAlb3sR3QXGRb4EJeK/xAozELiCgYbMzAAAAAElFTkSuQmCC) + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMZJREFUOMuFk80NwjAUg31lB8ZgHXZgDjZgBmbIgQVYgCM7AEJCoBfpk1yTtger0YvtvL/qfd428Lns2ut+7HjcDu173XdUvFCc52nTQUwICyVyYMAZE4cIQpwTutizEGIEEOu7VEKhZ+AlFDlThJhCzhODTDFFnhE8cTkCd15OlqQ1Ii9nD+ArR7PWPC95sgej2tOYXfFlk7+0NK5CirvBaGVzKohHi6ZREGRT/ZE/gzkTRJkhXLkgL+d+IOcpiTnGXKxs7g+3G64wjFJPVQAAAABJRU5ErkJggg==) + +
+ +- `@texture minecraft:block/honey_block_top` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE+VktENAjEMQ/PLDoxx67ADc7ABM9wQJxZgAT7ZgUNICORIjlwrIPiI1GvzXDu9WI+bBfU8TVWv825Y6zfqdtnn3mPeLqEwmxVAE4rn9+uhzgcBhzvQYbDBJrVOWEXcUQl4Ps/tYgRRGYGNXQQ2doVz9IbCv0A6l0Ggs6iQz4NOQ2//Fy6Bbjg+/Q7OCF32T6/iQ04HfruD+G1ZKlDP6NYV5N9HmMJkBgE6cZi3Yo8wmYzgg1PbCmt2HXK4fYe/3Y71G0k0p/74OnvSAAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/honeycomb_block` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4jY2TsQ1CMQxELdEwBKuxABPQsQCbsAgVNQNQMAONkcN/0X3HAQrr6+dyts++2P248ed5637b++uyaxH/18MnwMEUD8wgc8jl+BJKyrjlilyKpHT1DW8JFKQ1f5x6goy1BAs+dKAXVHOc6zzArdIcIKSMQ6aorTRFW0IeNAsOZl2zDE3J4K1yMRPLe2alJMk+QUpPABmC+uIvH6iJckViOhPWqO0S6oNqJoMPlFz5YOaTnz5gA1MfrDQve562XPmgaxYflG9Dnrtib05rlmsKX069AAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/hopper_inside` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVQ4T42TSwqAMAxEe5supBvpwpWC97+T0kIkmYxJF4+Azbx+Ldd5PxG9Hx9svLBGTWv7BL8bAQtoUCTVCbB5UOv2K50CNrOERtXgdoxAJBhiEirQs2cCtwVcfgY9xNUwbsMIViR4E+4aMwnehBNIE4ZYOHyJbLlYl14ijmnCn4kFMGwEjCgovGDklo39eI+0AAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/hopper_outside` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y6VSOQ6EMBDzh2hWKahYiYqt0kJJxf9fEJRIXjmjCWdhZS6biQO2dU3LPBfk+Aic0XkwiTEWML8KeETmerbm8JumpPBIlsw8z0MHrJgnrmcRYPAdxkdA132SRQh9Ba1rP8dgQkWNFV491yoT2TjzofKABLprxbTGl2C/bOCt1vq6Xf8v8AbuK9wBPGdbjmuPV4Il6X0tya7f/JHuYAdS88e7oGJfrwAAAABJRU5ErkJggg==) + +
+ +- `@texture minecraft:block/hopper_top` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4y2Pw9PD47+/vD8aRERFwnJ6YiIJh4jC1IAzSywBjkINBeuEGmJhY/Le3cyIKg9RiGACSYCASgNTCDQD5i1wDQHopNwAUwuQaANI7HAwY+Fig2ACqJWWyMxOl2RkAZowlDF2IQ5oAAAAASUVORK5CYII=) + +
+ +- `@texture minecraft:block/horn_coral_block` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4y32SMQpCQRBDcyQbW8FWvJi38A6CpRewsrD5taWe4UsW3hICWgx/Z2eSmU2+Hpf9ejtv18/7OML5874b8e+Os7rwWg4j9zcJIHGeA3U9bWbRIICcXcup9E8CLikkWW/iye5ja4cA0ZgkEKCTc6YzQAmmOQMQhN2vfHuu3FPbATCisQVkA9ccPRkSpUBuskhMdrRw6Y5rSv/bonYo1YdUvK0Fakf4pt0+K9VttWmCEHAKrVb+1z+PTi20+gIxASeoLR8acJGe57tz7QROAqakTa102phPc3wBggHhFG101/IAAAAASUVORK5CYII=) + +
+ +- `@texture minecraft:block/horn_coral_fan` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4y+2RPQqEUAyEPZLNtoK9F9tbeAfB0gtYWXiL9QxPRvjCvKeIrbBp8jeZTEhV/e0FNvWf9Bg8fuvkA8vQpnVuovaITCANKtbw9usywksSFWmwlVgEEMoTB5HAXmSrq4DQsaGGLS6T/E6Nk2W3ugoHkTvxkXOLg2m63LIfak432Sfkea2/GJXxBX5dgqhRL5fI77u5Au//Aj6TAAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/horn_coral` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVQ4y82SPQqAMAyFPZKLq+AqXsxbeAfB0Qs4Obg4O+oZlG94EGsqdTNQ0ubnJS9plv1StrU+OaFtmcozCYDAY29uINznvkoDCEG4o4c2TwdASCBx7Ipb9SgdjzsgCgYEP525dDB6Tt6igf9R3VbGKQBpuoBGdAsE2IEJxHZCzOsWFKDpo+3UQ384KxfIG6boPlZKkowC8Wyvf0EB9sgmQFFI/kjeQD+JthJr/QITIhaSwEOMBwAAAABJRU5ErkJggg==) + +
+ +- `@texture minecraft:block/ice` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4y42TMQ4CQQhFOb2VlTfwAjZWJmYbGw9g6VV0DZi/ef5lJxY/kwE+DB8mdqfXJBwu78L1MU/H27zcE/vzF2kX0h5OptPJ8suWvEogZ4cRuRIwsCPKzlMJ8gyv4sHUyJOWBm7wKiQzRlqtNGBCVt0SOUbPc22SyBGXBl0VgT4nyx9bI2T/Sbo/1+SfMXLOvp2+WGw7XBiq35EZUyK6qqPRdTsT7I3V/yEvL+i2znXp/kUWj0607ktzTzjSD5P1BaI086n9AAAAAElFTkSuQmCC) + +
+ +- `@texture minecraft:block/iron_bars` + +
+ + ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAk0lEQVQ4y5WT0Q2AIAxEGZcvP/xzFzbANZgLc0RMI3e2NjGBtpzcA1K6o56178fWkwnMc85ubkRrbRFA7pcAdlFKGUKYM1HUqcC0gCI+jJktKTD/zES9PukNAixHBaJ+lz40KWBsV+jDmsfKFzBly8J2gYUZMLrRk4kDE7kQMAubXqQIsAlb3sR3QXGRb4EJeK/xAozELiCgYbMzAAAAAElFTkSuQmCC) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md new file mode 100644 index 000000000..ee93f949b --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md @@ -0,0 +1,51 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- `@data_pack pack.png` + +
+ + ![data_pack.png](data:image/png;base64,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) + +
+ +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- `@resource_pack pack.png` + +
+ + ![resource_pack.png](data:image/png;base64,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) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md index 592c1eebd..e5ba16ae0 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md @@ -17,4 +17,10 @@ -- [`@data_pack pack.png`](data:image/png;base64,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) +- `@data_pack pack.png` + +
+ + ![data_pack.png](data:image/png;base64,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) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md index 38bf9b610..e7297641a 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md @@ -17,4 +17,10 @@ -- [`@data_pack pack.png`](data:image/png;base64,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) +- `@data_pack pack.png` + +
+ + ![data_pack.png](data:image/png;base64,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) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md index a1bf96495..6623e6aac 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md @@ -17,7 +17,13 @@ -- [`@data_pack pack.png`](pack.png) +- `@data_pack pack.png` + +
+ + ![data_pack.png](pack.png) + +
## Resource pack @@ -38,12 +44,30 @@ ### foo -- [`@texture foo:hello`](hello.png) +- `@texture foo:hello` + +
+ + ![texture.png](hello.png) + +
### bar -- [`@texture bar:hello`](hello_1.png) +- `@texture bar:hello` + +
+ + ![texture.png](hello_1.png) + +
### baz -- [`@texture baz:hello`](hello_2.png) +- `@texture baz:hello` + +
+ + ![texture.png](hello_2.png) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md index 1ef1f4600..7f3ae4119 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md @@ -19,52 +19,202 @@ ### minecraft -- [`@texture minecraft:block/green_concrete_powder`](green_concrete_powder.png) +- `@texture minecraft:block/green_concrete_powder` -- [`@texture minecraft:block/green_concrete`](green_concrete.png) +
+ + ![texture.png](green_concrete_powder.png) + +
+ +- `@texture minecraft:block/green_concrete` + +
+ + ![texture.png](green_concrete.png) + +
+ +- `@texture minecraft:block/green_glazed_terracotta` + +
+ + ![texture.png](green_glazed_terracotta.png) + +
-- [`@texture minecraft:block/green_glazed_terracotta`](green_glazed_terracotta.png) +- `@texture minecraft:block/green_shulker_box` -- [`@texture minecraft:block/green_shulker_box`](green_shulker_box.png) +
+ + ![texture.png](green_shulker_box.png) + +
-- [`@texture minecraft:block/green_stained_glass_pane_top`](green_stained_glass_pane_top.png) +- `@texture minecraft:block/green_stained_glass_pane_top` -- [`@texture minecraft:block/green_stained_glass`](green_stained_glass.png) +
+ + ![texture.png](green_stained_glass_pane_top.png) + +
-- [`@texture minecraft:block/green_terracotta`](green_terracotta.png) +- `@texture minecraft:block/green_stained_glass` -- [`@texture minecraft:block/green_wool`](green_wool.png) +
-- [`@texture minecraft:block/grindstone_pivot`](grindstone_pivot.png) + ![texture.png](green_stained_glass.png) -- [`@texture minecraft:block/grindstone_round`](grindstone_round.png) +
-- [`@texture minecraft:block/grindstone_side`](grindstone_side.png) +- `@texture minecraft:block/green_terracotta` -- [`@texture minecraft:block/hay_block_side`](hay_block_side.png) +
-- [`@texture minecraft:block/hay_block_top`](hay_block_top.png) + ![texture.png](green_terracotta.png) -- [`@texture minecraft:block/honey_block_bottom`](honey_block_bottom.png) +
-- [`@texture minecraft:block/honey_block_side`](honey_block_side.png) +- `@texture minecraft:block/green_wool` -- [`@texture minecraft:block/honey_block_top`](honey_block_top.png) +
-- [`@texture minecraft:block/honeycomb_block`](honeycomb_block.png) + ![texture.png](green_wool.png) -- [`@texture minecraft:block/hopper_inside`](hopper_inside.png) +
-- [`@texture minecraft:block/hopper_outside`](hopper_outside.png) +- `@texture minecraft:block/grindstone_pivot` -- [`@texture minecraft:block/hopper_top`](hopper_top.png) +
-- [`@texture minecraft:block/horn_coral_block`](horn_coral_block.png) + ![texture.png](grindstone_pivot.png) -- [`@texture minecraft:block/horn_coral_fan`](horn_coral_fan.png) +
-- [`@texture minecraft:block/horn_coral`](horn_coral.png) +- `@texture minecraft:block/grindstone_round` -- [`@texture minecraft:block/ice`](ice.png) +
+ + ![texture.png](grindstone_round.png) + +
+ +- `@texture minecraft:block/grindstone_side` + +
+ + ![texture.png](grindstone_side.png) + +
+ +- `@texture minecraft:block/hay_block_side` + +
+ + ![texture.png](hay_block_side.png) + +
+ +- `@texture minecraft:block/hay_block_top` + +
+ + ![texture.png](hay_block_top.png) + +
+ +- `@texture minecraft:block/honey_block_bottom` + +
+ + ![texture.png](honey_block_bottom.png) + +
+ +- `@texture minecraft:block/honey_block_side` + +
-- [`@texture minecraft:block/iron_bars`](iron_bars.png) + ![texture.png](honey_block_side.png) + +
+ +- `@texture minecraft:block/honey_block_top` + +
+ + ![texture.png](honey_block_top.png) + +
+ +- `@texture minecraft:block/honeycomb_block` + +
+ + ![texture.png](honeycomb_block.png) + +
+ +- `@texture minecraft:block/hopper_inside` + +
+ + ![texture.png](hopper_inside.png) + +
+ +- `@texture minecraft:block/hopper_outside` + +
+ + ![texture.png](hopper_outside.png) + +
+ +- `@texture minecraft:block/hopper_top` + +
+ + ![texture.png](hopper_top.png) + +
+ +- `@texture minecraft:block/horn_coral_block` + +
+ + ![texture.png](horn_coral_block.png) + +
+ +- `@texture minecraft:block/horn_coral_fan` + +
+ + ![texture.png](horn_coral_fan.png) + +
+ +- `@texture minecraft:block/horn_coral` + +
+ + ![texture.png](horn_coral.png) + +
+ +- `@texture minecraft:block/ice` + +
+ + ![texture.png](ice.png) + +
+ +- `@texture minecraft:block/iron_bars` + +
+ + ![texture.png](iron_bars.png) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..bcb71093f --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md @@ -0,0 +1,51 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- `@data_pack pack.png` + +
+ + ![data_pack.png](pack.png) + +
+ +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +- `@resource_pack pack.png` + +
+ + ![resource_pack.png](pack_1.png) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/pack_1.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/pack_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5506b0d702c2223b8466bbdaa4dac14a7787f GIT binary patch literal 13516 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 G0002FVYY7o literal 0 HcmV?d00001 diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md index 1b627ac30..cf7bcee59 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md @@ -17,4 +17,10 @@ -- [`@data_pack pack.png`](pack.png) +- `@data_pack pack.png` + +
+ + ![data_pack.png](pack.png) + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md index 1b627ac30..cf7bcee59 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md @@ -17,4 +17,10 @@ -- [`@data_pack pack.png`](pack.png) +- `@data_pack pack.png` + +
+ + ![data_pack.png](pack.png) + +
From 10f4e52d84a6b178279a4ecae68aecb800f4fcf0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Feb 2021 11:05:18 +0000 Subject: [PATCH 0075/1554] 0.5.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 8 ++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 70477711c..12df1f752 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.5.0 (2021-02-25) +### Feature +* Serialize images ([`7cf6fd9`](https://github.com/mcbeet/lectern/commit/7cf6fd944533a4ea9210f1f795bc4839c1a793de)) +* Extract image fragments ([`1c6b71b`](https://github.com/mcbeet/lectern/commit/1c6b71bd0008163226394d77b8909f7459584732)) + +### Fix +* Use match_tokens() to check for a single code_inline ([`7117521`](https://github.com/mcbeet/lectern/commit/7117521388f5b76e0085d19301d1a9d5d5b7d86f)) + ## v0.4.0 (2021-02-25) ### Feature * Add link fragments ([`b0d26d5`](https://github.com/mcbeet/lectern/commit/b0d26d530bd5029ea33bba8b1886a913af6ce125)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 99820a5d5..1c02bf3d6 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.4.0" +__version__ = "0.5.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 221fd909f..ac00290a4 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.4.0" +version = "0.5.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 4e141aea1782df87ed50f9586e6f620346b70449 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Feb 2021 06:35:49 +0000 Subject: [PATCH 0076/1554] chore(deps): bump beet from 0.10.1 to 0.10.4 Bumps [beet](https://github.com/mcbeet/beet) from 0.10.1 to 0.10.4. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.10.1...v0.10.4) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 0c3801964..fb333be04 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.1" +version = "0.10.4" description = "The Minecraft pack development kit" category = "main" optional = false @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.1-py3-none-any.whl", hash = "sha256:062843c9b9b06e4700ebc8dbc9beca7d4fde962a2b9f307c4092cc3ea8bb166e"}, - {file = "beet-0.10.1.tar.gz", hash = "sha256:22b93cf755c922c983754c3be7d7b6607dc2727d125866e9cb3a376ddde1d2c5"}, + {file = "beet-0.10.4-py3-none-any.whl", hash = "sha256:050183e8cab582cc14511e105cebde1eb275b0e36806909073f15e7db9fed90f"}, + {file = "beet-0.10.4.tar.gz", hash = "sha256:80c49374b0d836f4036b699b3b35d1e45f984fcadfb9c97024df903afa36f3e6"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, From bb8007c28815603a045c9f301f048ac0ff30356f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 05:50:09 +0100 Subject: [PATCH 0077/1554] fix: don't cache data url --- packages/lectern/lectern/fragment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index 1bffd4e85..b270e5151 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -75,7 +75,7 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: return file_type(source_path=self.path) elif self.url: - if self.cache: + if self.cache and not self.url.startswith("data:"): return file_type(source_path=self.cache.download(self.url)) with urlopen(self.url) as f: From ceb25ea92984294e834d3cb5ed110d1c46a055d5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 06:34:04 +0100 Subject: [PATCH 0078/1554] feat: add base64 modifier --- packages/lectern/lectern/fragment.py | 14 +- packages/lectern/lectern/serialize.py | 9 +- .../examples__text_README_md__0.pack.txt | 57 +++++ ...les_with_links_inline_image_md__0.pack.txt | 27 ++ ...with_links_lots_of_textures_md__0.pack.txt | 82 ++++++ ...th_links_pack_icon_data_url_md__0.pack.txt | 21 ++ ...s_with_links_pack_icon_link_md__0.pack.txt | 10 + ..._with_links_pack_local_icon_md__0.pack.txt | 10 + ..._with_links_structure_files_md__0.pack.txt | 16 ++ ...links_vanilla_font_data_url_md__0.pack.txt | 239 ++++++++++++++++++ ...th_links_vanilla_font_local_md__0.pack.txt | 239 ++++++++++++++++++ packages/lectern/tests/test_document.py | 7 + packages/lectern/tests/test_examples.py | 11 +- 13 files changed, 728 insertions(+), 14 deletions(-) create mode 100644 packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_data_url_md__0.pack.txt create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_local_md__0.pack.txt diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index b270e5151..b5e05d607 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -4,6 +4,7 @@ ] +from base64 import b64decode from dataclasses import dataclass from typing import Any, Optional, Sequence, Type, TypeVar, overload from urllib.request import urlopen @@ -65,11 +66,14 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: is_binary = issubclass(file_type, BinaryFileBase) content = self.content - if content is not None: + if content is not None and self.modifier == "base64": + content = b64decode(content.strip()) + + elif content is not None: if self.modifier == "strip_final_newline" and content.endswith("\n"): content = content[:-1] - if is_binary: - content = content.encode() + + return file_type(content.encode() if is_binary else content) elif self.path: return file_type(source_path=self.path) @@ -80,11 +84,9 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: with urlopen(self.url) as f: content = f.read() - if not is_binary: - content = content.decode(errors="replace") else: msg = f"Expected content, path or url for directive @{self.directive}." raise InvalidFragment(msg) - return file_type(content) + return file_type(content if is_binary else content.decode(errors="replace")) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 89ae3b315..dd276d4b2 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -36,7 +36,13 @@ class TextSerializer: def serialize(self, assets: ResourcePack, data: DataPack) -> str: """Return the serialized representation.""" return "\n".join( - f"@{directive_name} {argument}\n{content}" + ( + f"@{directive_name} {argument}\n{content}" + if isinstance(content := file_instance.ensure_serialized(), str) + else f"@{directive_name}(base64) {argument}\n" + + b64encode(content).decode() + + "\n" + ) for pack, extra_directive in [ (assets, "resource_pack"), (data, "data_pack"), @@ -58,7 +64,6 @@ def serialize(self, assets: ResourcePack, data: DataPack) -> str: for path, file_instance in container.items() ), ) - if isinstance(content := file_instance.ensure_serialized(), str) ) diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt new file mode 100644 index 000000000..2443426bf --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -0,0 +1,57 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function tutorial:greeting +say Hello, world! + +@function tutorial:obtained_dead_bush +say You obtained a dead bush! + +@advancement tutorial:obtained_dead_bush +{ + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } +} + +@function_tag minecraft:load +{ + "values": ["tutorial:greeting"] +} + +@loot_table minecraft:blocks/diamond_ore +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] +} diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt new file mode 100644 index 000000000..58c2e2c3d --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt @@ -0,0 +1,27 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@texture(base64) foo:hello +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 + +@texture(base64) bar:hello +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 + +@texture(base64) baz:hello +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 + +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@data_pack(base64) pack.png +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 diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt new file mode 100644 index 000000000..7a9973944 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt @@ -0,0 +1,82 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@texture(base64) minecraft:block/green_concrete_powder +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACLklEQVQoUwXByXLcNhAA0EY3NoLbsGxLti+55ZDKPZ/jz8gnR2VpRhyuAAF05z31698/lWr4IhFGpZtheb6HMKZ8BmEBYD8mAIHSZd74ctiPgFBqBWMB9LNUbIYYxiuMqZ3S9Ao56fgMrvuU7Nvbheu9A3BNwJIFqj+f3oW63MOVQNu6PQHEKJ3X2fbfVmGnS7lK1s1whqE+P5p2Sst7EKEIW2VDmL2r59oqNueGACsSOgAp2cVobi9FitXatGPWqilRxU2LaG2j4KoVlstgrRdpRXT0vU8n10ylFK4CCpzzpFU8r5wg9HwecJ2kC3PoeLk31y7pou6WMdMVFRGklG/fEqrmeVcgrBSiItTkrkM1rQJk7+25IDn4+pNFlDDEqJ6fVQT2z2C9DreC/ZfNhup8BSBhGL4eSFI5t8Pej3790NaLwtoM+7HU/VPjPmM+KCUik0rlc21TrPO7BQ3nkabXLNlJofXRTq+7sYTtwH4o81uZXi6uFZEQKEfnrDaGjINSL0Xyx1/H8vDMlf7+50Wqazqcf9P0I54bkQauzAwsfK62n5RgWh7qOnQ8WBtj06EESjfR8Wy7cU8xlFJME4/7aNvEEJXyNfrxdbYeMF/QTklhvf9XmMs2B661H71zZBwCa6kmH05RAbbzW4c56X3WTahNi9YDEUzfU8myzVJKQbeSqQAKTSJ7ASokfTVdQRRmRumF6fGmjas2wO0lLR/D9mhvPxZEvT0aY/f/AVjYaSiNzb00AAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/green_concrete +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAoklEQVQoz3WRyxHAIAhEtxhCLZISMP3XkQOouI4zHBg+7luEdYl4v2fLPZMRGi1EL6ajOjdH8akJmnNpTGuttxRUVF1iez+1fC55mguial3MxaaaLzPkDYQ7ASpPpUCtUsx7VFoEGWHkju/iLqxwd7/wwAzHMtHi7lLZlYt1yY+rAK3e9zgdqBEvVR5ywqbP/2r7fp6V5ohq81AA9KYzW9blB2ZZyT6my4nWAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/green_glazed_terracotta +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABMklEQVQoz12SvUoDURCF71OsteYHe58hYCobCaggJMVikUpIEwRJl8YyVRo7fZcETFIkr+MXvuWsCMPunbnnzJyZO6V+v8F2xxM2fOpiOX98PWCv6+7ss7f52RPELaD54RC6m/TvX65DGIwun98qCPPvfr28EFa8Bo0PIWSgcMaLivQQcOEQL0ETwra7AxGycg2aCITp6srzWZK6URK0peTDxEC3BISC5vQXTQq+KAGtNlsC2fSggebC3FwHDRlVaCPSNo1jbkEQkCHaySqvZHx2KUezjsKogB6CRRngbMs0qpJmBLRDLxlo3ogDd+R2euqx4JlgAnBEMdFcp0vfwZZagtGg06LqCd4+dpoKzId2cXwdc0c3LlCbgdasBjw5fP91aSIrN8uXbXOZQ8h6a1nvX8UXRs8wRVstAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/green_shulker_box +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABDElEQVQoz3VS2Q6CQAzc/xCPwP6Jxihq4gFR8Ii8eEX8/0en2+5SgiZNmLKdttPWpGe7eQxhAITvQ9jiYtOTwv7//GgNPtODnRV2VcWwWWnhCi4ULikGTIPccPAre/dh/Bzw8ppkdQRbVQnCUNaAJBF1tHsNYBxB9u5rF2GTPDEgESEEtS3/9LgaFyQCNOiWdHrtsgyvoZAilK+Otk9pQ/rx6UU0a6A399AFwnFFxrtYCCFrkzv080NDoXSHlJrAY+WW1reR207yb1AtDc0e/Bv1pmfVKsJ7cASZtx9Ud6wNgcfKJwCtchoK83AB0LnbA45vH46MlMFtDq7sHB/vD2pQDsZHLvhEGLPX/7+0ZtOv+bCbWwAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/green_stained_glass_pane_top +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPklEQVR42mNgwANS642eJVYZPGMgF4AMiCvTp8wAilwA0kyxASBXDFwYgFwwsAYMvBeGQUocHF5IrjHEawAAqHU+aprkHnQAAAAASUVORK5CYII= + +@texture(base64) minecraft:block/green_stained_glass +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4y2NIqzdeTAlmgDLSyMRYDZhNiQGzKXHBbGp5YdSAEWPAbEoMmE0TL5CNAYkBjWW6vToCAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/green_terracotta +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUUlEQVQ4EQXBwQEcNxADMHCkatxKfu6/Et9qGCD//f1TCoDIjJloa99z7lHs97QFQsSFiLlHYHnivY+WsLtmxpzjvWcEVF2J1+p7tKgiICaj2C1IRg62qDthzuiW1qIliZPYVgsYgj60iikGk8iMMwdUva4W6t7jzgEtZhD3TLytiC26zgwAIN6uIAmhW/ces1tJFABtKcfQaqtblIlJzMT3PZfoW1UwM2B37dQ4dldLi7eaiJg5LuQMeN/HFouxr6jMOIOgSES897nQXS0TWARQSbTP24BMaJ0z5hy3+0hIKMS9F3zfP3KNmBMV+x7h/Z6qW6QkVYN675HgmkTCLqwkMtFg1yUKJWjQaovIHHnP7iqCCEXiZgIgE93KHX6fWt/vJ1hrjECZO1KuVhOK30/FbgUE0cTNgG61a3+VGbciEHquYMQMb6mKqLKrqogo/gcV6vrcd5o15AAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/green_wool +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABjUlEQVQoFT3S51KCQQyF4b0KPrCAgjejiNhQVIoNe8eC5bfX7bOGYWZnyGZzTt7kI7VOlzYvquvHy62T5Z3b+YO3YuNsqX1e23+udMfltX5DvnM/5wiag3ravZvfe6qMfvM5+igUbV0tOvFMKV49WmkO63y3rxeSot6kJLt9s9D/Lok7D3OulOLuS9kZ/JTYybDOHUgPXqcyMTClwMgETtRkhEkpEWnkWdYAlLjXeivtUQ03pPVhPeffCpCeEjg/BOGqNNYgI9ZQn+agQUmweVlNMe7he/YG42jI22ye7IogasxgvMTDmaVUaIWVH9eYTRJ57zPnE509AAPt7g0MC1feNHi0FftW5knxAA4DaPN423vMstn3sXGmQZG46pX7jHMKjyCDAfgoiM1DqQlIm0x+stljxYl5bJBf5PVX/b/oBgrxdOiA0c3HBurKkpL9DEa1eZI7gPj4BHgUIaEJdJAWLRZgTiz7X/njK5IKYtv0ZgZbQmX9fAHjTP6xZuAt6y5LpiFXseaeYh56T3/wfd3gVVhWmQAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/grindstone_pivot +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4y2PwN5L4jw1HmEEwjM2ACyArhmmw0xTCMASnASDFyBpB2EpFEC5G0AXoikEGGMjxYbgCrwHotoMMQPcKTgNAimGakDHMQIIuGAWjYFAAAEsaXKFOwPwFAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/grindstone_round +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVQ4y+2SwQkAIQwELdcC/FuCfxuwAfvLMcJC8HPJvU+QFTGTbEyZc9re26T+jJa3xaPWmo0xzu69W631aBigAAEEXGvlKvCQMACvAHxmzmELZMECgQJIgX9qYqoHPPK+CVZFKYAvP9VELNwVSFPfeH8hd+FBIpNGVzs8yv8qD2Su/2cwWvHkAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/grindstone_side +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVQ4y+2S0QkAIQxDHdcB/HcE/13ABdzPI0KkxPZugSuUaqjPEk1jjDXnXKhc233v/ST0pIGmWuvO1tpJaqWUnViHADTwEJsVCP0TwKoTEBYC9HY7tgXDhwsAqt6Yc96pk7kAiLbJAxDsAvgK2qxmhiZyAoVY91lxmQtQ9zmBNRI1BLwdstDwGb0vTI3fmFr644oHfph7ITBuISIAAAAASUVORK5CYII= + +@texture(base64) minecraft:block/hay_block_side +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4y5WTvQkCQRSEXyEighhpoIEFGBpaiw2YCYaHJWh0uakFWNTKO/iOYW5XMFhm3/8ybzZu50V597tyv8wHTPvz2o422HeriZ154YmJ3iCTvVEOynvkhSQCWkicApATz+OmPE7r0h2WA3LS5lz3s2o8MfSJOsH9Hudl0SIJMlsNRw4ohFUnsxZXUicNvJH6a3nhjn8xdGIr8dcLo6Y8JYu7kqukB7tmv6mLtNEHdlMH7BO16cFH3JU56ECFobJ26eoQlXbUFOh/wv8GOGyhVqikYvu2wC+PC1PqFZeh3AAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/hay_block_top +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0klEQVQ4T22TsQ0DMQwDVX7pVTNAJgjSZYV0qdJnhMz0AR84gc+oMN62JJIS/fV5rv1xXfvrvh1L+9tl9Z5F3O+1LyULRIcE03IwL6amPPn73hoo750EUH3LGQiqgDPM5EGis2JFzy4ti4g7EfueQfaKEpI9rnvOpxkoeZJPkTO3AgrdPp82fbs73lKBDhAqUkEqOdmYHovB30fKd5trmvjE6i14K38uZM/5UjNeLnGy0oeGfED7HXhyqvBW8p85ADJpGhTOOEEr8OniwNTG5JRqf83aPKMvuldQAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/honey_block_bottom +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMNJREFUOMt9k80JQkEMhAOePL67ZdiaZ3llvBqswl68WYAgCJLALJ/zsh6GzbKZye/G+3Zaic/9XJCd52s7rs/rUqf7BS/pIIggW9BdvBCZAiQkHpfDTlTZlIA/iJT4l0kiWKNHpUhHTjuUupM6UECBK4MuqpfgfdgJyGlWAt80yiph1pwuI9+FEvASOrIH4IKFR5xFZuo/Aj66zubiSGCMkZ2diTmZuzMWyT8NSfwvjD4WyZUdFCK5esDv687eAyenzxdCexZaW6y0mgAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/honey_block_side +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMZJREFUOMuFk80NwjAUg31lB8ZgHXZgDjZgBmbIgQVYgCM7AEJCoBfpk1yTtger0YvtvL/qfd428Lns2ut+7HjcDu173XdUvFCc52nTQUwICyVyYMAZE4cIQpwTutizEGIEEOu7VEKhZ+AlFDlThJhCzhODTDFFnhE8cTkCd15OlqQ1Ii9nD+ArR7PWPC95sgej2tOYXfFlk7+0NK5CirvBaGVzKohHi6ZREGRT/ZE/gzkTRJkhXLkgL+d+IOcpiTnGXKxs7g+3G64wjFJPVQAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/honey_block_top +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE+VktENAjEMQ/PLDoxx67ADc7ABM9wQJxZgAT7ZgUNICORIjlwrIPiI1GvzXDu9WI+bBfU8TVWv825Y6zfqdtnn3mPeLqEwmxVAE4rn9+uhzgcBhzvQYbDBJrVOWEXcUQl4Ps/tYgRRGYGNXQQ2doVz9IbCv0A6l0Ggs6iQz4NOQ2//Fy6Bbjg+/Q7OCF32T6/iQ04HfruD+G1ZKlDP6NYV5N9HmMJkBgE6cZi3Yo8wmYzgg1PbCmt2HXK4fYe/3Y71G0k0p/74OnvSAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/honeycomb_block +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4jY2TsQ1CMQxELdEwBKuxABPQsQCbsAgVNQNQMAONkcN/0X3HAQrr6+dyts++2P248ed5637b++uyaxH/18MnwMEUD8wgc8jl+BJKyrjlilyKpHT1DW8JFKQ1f5x6goy1BAs+dKAXVHOc6zzArdIcIKSMQ6aorTRFW0IeNAsOZl2zDE3J4K1yMRPLe2alJMk+QUpPABmC+uIvH6iJckViOhPWqO0S6oNqJoMPlFz5YOaTnz5gA1MfrDQve562XPmgaxYflG9Dnrtib05rlmsKX069AAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/hopper_inside +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVQ4T42TSwqAMAxEe5supBvpwpWC97+T0kIkmYxJF4+Azbx+Ldd5PxG9Hx9svLBGTWv7BL8bAQtoUCTVCbB5UOv2K50CNrOERtXgdoxAJBhiEirQs2cCtwVcfgY9xNUwbsMIViR4E+4aMwnehBNIE4ZYOHyJbLlYl14ijmnCn4kFMGwEjCgovGDklo39eI+0AAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/hopper_outside +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y6VSOQ6EMBDzh2hWKahYiYqt0kJJxf9fEJRIXjmjCWdhZS6biQO2dU3LPBfk+Aic0XkwiTEWML8KeETmerbm8JumpPBIlsw8z0MHrJgnrmcRYPAdxkdA132SRQh9Ba1rP8dgQkWNFV491yoT2TjzofKABLprxbTGl2C/bOCt1vq6Xf8v8AbuK9wBPGdbjmuPV4Il6X0tya7f/JHuYAdS88e7oGJfrwAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/hopper_top +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4y2Pw9PD47+/vD8aRERFwnJ6YiIJh4jC1IAzSywBjkINBeuEGmJhY/Le3cyIKg9RiGACSYCASgNTCDQD5i1wDQHopNwAUwuQaANI7HAwY+Fig2ACqJWWyMxOl2RkAZowlDF2IQ5oAAAAASUVORK5CYII= + +@texture(base64) minecraft:block/horn_coral_block +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4y32SMQpCQRBDcyQbW8FWvJi38A6CpRewsrD5taWe4UsW3hICWgx/Z2eSmU2+Hpf9ejtv18/7OML5874b8e+Os7rwWg4j9zcJIHGeA3U9bWbRIICcXcup9E8CLikkWW/iye5ja4cA0ZgkEKCTc6YzQAmmOQMQhN2vfHuu3FPbATCisQVkA9ccPRkSpUBuskhMdrRw6Y5rSv/bonYo1YdUvK0Fakf4pt0+K9VttWmCEHAKrVb+1z+PTi20+gIxASeoLR8acJGe57tz7QROAqakTa102phPc3wBggHhFG101/IAAAAASUVORK5CYII= + +@texture(base64) minecraft:block/horn_coral_fan +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4y+2RPQqEUAyEPZLNtoK9F9tbeAfB0gtYWXiL9QxPRvjCvKeIrbBp8jeZTEhV/e0FNvWf9Bg8fuvkA8vQpnVuovaITCANKtbw9usywksSFWmwlVgEEMoTB5HAXmSrq4DQsaGGLS6T/E6Nk2W3ugoHkTvxkXOLg2m63LIfak432Sfkea2/GJXxBX5dgqhRL5fI77u5Au//Aj6TAAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/horn_coral +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVQ4y82SPQqAMAyFPZKLq+AqXsxbeAfB0Qs4Obg4O+oZlG94EGsqdTNQ0ubnJS9plv1StrU+OaFtmcozCYDAY29uINznvkoDCEG4o4c2TwdASCBx7Ipb9SgdjzsgCgYEP525dDB6Tt6igf9R3VbGKQBpuoBGdAsE2IEJxHZCzOsWFKDpo+3UQ384KxfIG6boPlZKkowC8Wyvf0EB9sgmQFFI/kjeQD+JthJr/QITIhaSwEOMBwAAAABJRU5ErkJggg== + +@texture(base64) minecraft:block/ice +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4y42TMQ4CQQhFOb2VlTfwAjZWJmYbGw9g6VV0DZi/ef5lJxY/kwE+DB8mdqfXJBwu78L1MU/H27zcE/vzF2kX0h5OptPJ8suWvEogZ4cRuRIwsCPKzlMJ8gyv4sHUyJOWBm7wKiQzRlqtNGBCVt0SOUbPc22SyBGXBl0VgT4nyx9bI2T/Sbo/1+SfMXLOvp2+WGw7XBiq35EZUyK6qqPRdTsT7I3V/yEvL+i2znXp/kUWj0607ktzTzjSD5P1BaI086n9AAAAAElFTkSuQmCC + +@texture(base64) minecraft:block/iron_bars +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAk0lEQVQ4y5WT0Q2AIAxEGZcvP/xzFzbANZgLc0RMI3e2NjGBtpzcA1K6o56178fWkwnMc85ubkRrbRFA7pcAdlFKGUKYM1HUqcC0gCI+jJktKTD/zES9PukNAixHBaJ+lz40KWBsV+jDmsfKFzBly8J2gYUZMLrRk4kDE7kQMAubXqQIsAlb3sR3QXGRb4EJeK/xAozELiCgYbMzAAAAAElFTkSuQmCC diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt new file mode 100644 index 000000000..f050d0f0d --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt @@ -0,0 +1,21 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@resource_pack(base64) pack.png +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 + +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@data_pack(base64) pack.png +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 diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt new file mode 100644 index 000000000..20c8bbfd9 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt @@ -0,0 +1,10 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@data_pack(base64) pack.png +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 diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt new file mode 100644 index 000000000..792fb8fbc --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt @@ -0,0 +1,10 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@data_pack(base64) pack.png +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 diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt new file mode 100644 index 000000000..5883c93cf --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt @@ -0,0 +1,16 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@structure(base64) minecraft:igloo/bottom +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 + +@structure(base64) minecraft:igloo/middle +H4sIAAAAAAAAAI2SwWrDMBBER3Kc2sqhPfXQT+m559JTrmFjr10RRTLSQqFfHxsi0gZaa0EHwdPMrBgDtNgk+80VgF+nRcNerFhOWKbF9uhCd0pmvjy2qKaQMpxHVaiTkPD1xU9GZaiA0f8wusALV621PKogjyrIs+aFzK146YI8uiBPidf9H6o/dl9j7r0W5mEixyK8VEU32LzTmfF8tp67SIO8JgmeD8do5zrBwHzEMHFcqtZg9zXrRBfGkXvUA7nEDbYDddaPqH2I8oks+XSTdNT3HOdUuzcS2nNMNnjAvOACT0G+1eQCAAA= + +@structure(base64) minecraft:igloo/top +H4sIAAAAAAAAAKWYwYrbMBCGFWuUOFn2UCiltG/SY9tLoZQell6D4iiJidcyskJon6SPW3k345isPTNLA94Q+7P+/x8NstYrpZYK2vKP00qp7likw6QjX6rc1bGMpWtV91mq+abyxbFdpR9/l0o3vsWb8KO1Mm200V3uGGNAwBiCmV2YTMBQfpCh/CAj8TMnmKwvEM/MBAyVHRkqOzJUdmSo7MhIsi8Ipp97AUPVBxmqPshQ9UGGqg8yVHZkqOwgyI4MlR0ZKjsyVHZkqOzIUL2BDFUfZKj6GEEuZKhcyFC5kKFyIUPlmgv8IEP5QYby031mjBYyQ63ZBMOtdTNmLmYj42QTDLduPK2tAoZbMzuGW384BgR+QOAHBFpGUGdkuD7kegMZqjeQ4fowY7SQ4fYAGaM1uzBcH2aCHssEPZYJeiwT9BjHgMAPCPyAQMsIaogM12PcvCPDrXWSedeMFjLcvk4zWhl+CxhuD6CZOe19CRhub8P5AcE4IBjHCOYCGe6ZK5kLYLSQ4fa0wGhpgZYWaGmBFgi0QKAFAi1cW4eMnnguD7Vg4nk67B8zwQxzzScYEDBGwAx7dTHxfFeE5z6/gKGy9+sL4RkZKjsyVHZkqOwg8AwCzyDwDALPIPBsRvzcesbnu4QBAWOYfr59Vk4xlJ9M4Cd7hZ8504e3e4kphut5LjsyVPZ+/RUwVHZkqOwg8AwCzyDwDALPIPBsBH6MwI8R+MF9C9erWtCrWjBfnJYWaGmBFgi0QKAFo1orpetNzFT+xfvjQ/nougLkn0+hfv6xVOZbdI/Pr0tzlZVb9eaxrF0R7C5+2iXOFi5T93j7g4+26kj47oujmvpHehgmv5h4Hv3+OvrGbSfW0GHO5etvH5ZglZhFYysXo+veAt8l6z9siv72OlJb+/P66UWxwqsDnbJw/en319NPf8t6v452U7mks/oZfONC9/I54Qdb7ZSOvsnV3TlZCZXf75Njs7NV6/LkyZ9dGJyY72yRhlOm9iEe0ghpsPpytdd/d9X39riOwTZb78Otuq7KqCCG06jzpNpGX7t19KE4jEW2ZRiTPB/K6NaFDY2L/fWP1+tVuT/E9T7Y3wiN+boNDM621+Fedt+L0jY2pHQ77+Ogaq0/dVXLfVGcmrKv69i4Kf+6a57xcQ/Obv9vXK3uvtpof7nQlr5OLfhB/QPXnps4tBgAAA== diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_data_url_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_data_url_md__0.pack.txt new file mode 100644 index 000000000..c2476fa60 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_data_url_md__0.pack.txt @@ -0,0 +1,239 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@font minecraft:alt +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] +} + +@font minecraft:default +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} + +@font minecraft:uniform +{ + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} + +@glyph_sizes(base64) minecraft:glyph_sizes +Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhY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KO0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwc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dHiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8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ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw== diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_local_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_local_md__0.pack.txt new file mode 100644 index 000000000..c2476fa60 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_vanilla_font_local_md__0.pack.txt @@ -0,0 +1,239 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@font minecraft:alt +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] +} + +@font minecraft:default +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} + +@font minecraft:uniform +{ + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} + +@glyph_sizes(base64) minecraft:glyph_sizes +Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhY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KO0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwc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dHiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8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ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw== diff --git a/packages/lectern/tests/test_document.py b/packages/lectern/tests/test_document.py index b0a8554d7..b45f490e0 100644 --- a/packages/lectern/tests/test_document.py +++ b/packages/lectern/tests/test_document.py @@ -73,3 +73,10 @@ def test_extra_argument(): InvalidFragment, match="Unexpected argument 'banana' for directive @function." ): Document(text="@function demo:foo banana\nsay hello") + + +def test_no_content(): + with pytest.raises( + InvalidFragment, match="Expected content, path or url for directive @function." + ): + Document(markdown="`@function demo:foo`\n") diff --git a/packages/lectern/tests/test_examples.py b/packages/lectern/tests/test_examples.py index b293cac37..6169600ae 100644 --- a/packages/lectern/tests/test_examples.py +++ b/packages/lectern/tests/test_examples.py @@ -6,28 +6,27 @@ from lectern import Document -EXAMPLES_TXT = glob("examples/*.txt") -EXAMPLES_MD = glob("examples/*.md") EXAMPLES_LINKS = glob("examples/with_links/*.md") + ["README.md"] +EXAMPLES = glob("examples/*.txt") + glob("examples/*.md") + EXAMPLES_LINKS -@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD) +@pytest.mark.parametrize("path", EXAMPLES) def test_text(snapshot: Any, path: str): assert snapshot("pack.txt") == Document(path=path) -@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD) +@pytest.mark.parametrize("path", EXAMPLES) def test_text_equality(snapshot: Any, path: str): document = Document(path=path) assert document == Document(text=document.get_text()) -@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD + EXAMPLES_LINKS) +@pytest.mark.parametrize("path", EXAMPLES) def test_markdown(snapshot: Any, path: str): assert snapshot("pack.md") == Document(path=path) -@pytest.mark.parametrize("path", EXAMPLES_TXT + EXAMPLES_MD + EXAMPLES_LINKS) +@pytest.mark.parametrize("path", EXAMPLES) def test_markdown_equality(snapshot: Any, path: str): document = Document(path=path) assert document == Document(markdown=document.get_markdown()) From ff604ac6d56f73dc8dcea31454eb7e22e3b754ae Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 07:41:41 +0100 Subject: [PATCH 0079/1554] fix: add item_modifier directive --- packages/lectern/lectern/directive.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 428e38b84..7f621b158 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -31,6 +31,7 @@ FluidTag, Function, FunctionTag, + ItemModifier, ItemTag, LootTable, NoiseSettings, @@ -164,6 +165,7 @@ def get_builtin_directives() -> Dict[ "noise_settings": NamespacedResourceDirective(NoiseSettings), "processor_list": NamespacedResourceDirective(ProcessorList), "template_pool": NamespacedResourceDirective(TemplatePool), + "item_modifier": NamespacedResourceDirective(ItemModifier), "blockstate": NamespacedResourceDirective(Blockstate), "model": NamespacedResourceDirective(Model), From ea784367d1073c337283634af18f9e801c60b825 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 07:45:24 +0100 Subject: [PATCH 0080/1554] fix: report unexpected arguments for skip directive --- packages/lectern/lectern/directive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 7f621b158..bfc9b9948 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -129,7 +129,7 @@ class SkipDirective: """Directive that ignores the fragment and skips to the next one.""" def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): - pass + fragment.expect() def get_builtin_directives() -> Dict[ From 05f8850e94af23af83df85be80a9cab5ed8f446d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 08:24:50 +0100 Subject: [PATCH 0081/1554] feat: add append modifier --- packages/lectern/examples/append_modifier.txt | 8 +++++ packages/lectern/lectern/directive.py | 12 ++++--- ...wn_examples_append_modifier_txt__0.pack.md | 31 +++++++++++++++++++ ...t_examples_append_modifier_txt__0.pack.txt | 11 +++++++ 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 packages/lectern/examples/append_modifier.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt diff --git a/packages/lectern/examples/append_modifier.txt b/packages/lectern/examples/append_modifier.txt new file mode 100644 index 000000000..1d326fbc8 --- /dev/null +++ b/packages/lectern/examples/append_modifier.txt @@ -0,0 +1,8 @@ +@function(append) demo:hello +say hello + +@skip +This is ignored. + +@function(append) demo:hello +say world diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index bfc9b9948..68dc38f19 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -16,7 +16,7 @@ from zipfile import ZipFile from beet import Context, DataPack, ResourcePack -from beet.library.base import NamespaceFile +from beet.library.base import NamespaceFile, NamespaceProxy from beet.library.data_pack import ( Advancement, Biome, @@ -76,10 +76,14 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): full_name = fragment.expect("full_name") file_instance: Any = fragment.as_file(self.file_type) - if self.file_type in assets.namespace_type.field_map: - assets[full_name] = file_instance + pack = assets if self.file_type in assets.namespace_type.field_map else data + + if fragment.modifier == "append": + proxy: NamespaceProxy[Any] = pack[self.file_type] # type: ignore + current_file = proxy.setdefault(full_name, self.file_type("")) + current_file.text += file_instance.text else: - data[full_name] = file_instance + pack[full_name] = file_instance class BundleFragmentMixin: diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md new file mode 100644 index 000000000..96330d2f4 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md @@ -0,0 +1,31 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:hello` + +
+ + ```mcfunction + say hello + say world + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt new file mode 100644 index 000000000..2953a6a03 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt @@ -0,0 +1,11 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:hello +say hello +say world From f74c673e158ea2db46f9c4f98ddef7af9e7948fd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 08:30:56 +0100 Subject: [PATCH 0082/1554] feat: add merge modifier --- packages/lectern/examples/merge_modifier.txt | 9 +++++ packages/lectern/lectern/directive.py | 6 ++-- ...own_examples_merge_modifier_txt__0.pack.md | 35 +++++++++++++++++++ ...xt_examples_merge_modifier_txt__0.pack.txt | 15 ++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 packages/lectern/examples/merge_modifier.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt diff --git a/packages/lectern/examples/merge_modifier.txt b/packages/lectern/examples/merge_modifier.txt new file mode 100644 index 000000000..6e1d1c0a0 --- /dev/null +++ b/packages/lectern/examples/merge_modifier.txt @@ -0,0 +1,9 @@ +@function_tag(merge) minecraft:load +{ + "values": ["demo:foo"] +} + +@function_tag(merge) minecraft:load +{ + "values": ["demo:bar"] +} diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 68dc38f19..6f93f8024 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -77,13 +77,15 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): file_instance: Any = fragment.as_file(self.file_type) pack = assets if self.file_type in assets.namespace_type.field_map else data + proxy: NamespaceProxy[Any] = pack[self.file_type] # type: ignore if fragment.modifier == "append": - proxy: NamespaceProxy[Any] = pack[self.file_type] # type: ignore current_file = proxy.setdefault(full_name, self.file_type("")) current_file.text += file_instance.text + elif fragment.modifier == "merge": + proxy.merge({full_name: file_instance}) else: - pack[full_name] = file_instance + proxy[full_name] = file_instance class BundleFragmentMixin: diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md new file mode 100644 index 000000000..adacebf49 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md @@ -0,0 +1,35 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@function_tag minecraft:load` + +
+ + ```json + { + "values": [ + "demo:foo", + "demo:bar" + ] + } + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt new file mode 100644 index 000000000..b6d116ea2 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt @@ -0,0 +1,15 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function_tag minecraft:load +{ + "values": [ + "demo:foo", + "demo:bar" + ] +} From 7bfbaa9d05ecb11dff8514a381b10577d9f0aa87 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 10:05:34 +0100 Subject: [PATCH 0083/1554] fix: don't set any cache timeout --- packages/lectern/lectern/document.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 7c3bbedeb..e9f160843 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -58,7 +58,7 @@ def __post_init__( self.data = ctx.data self.directives["require"] = RequireDirective(ctx) if cache is None: - cache = ctx.cache["lectern"].timeout(minutes=30) + cache = ctx.cache["lectern"] if cache: self.text_extractor.cache = cache self.markdown_extractor.cache = cache From 74828e9dfead21f2833ce19d10d5f3a89e297ba9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 11:08:23 +0100 Subject: [PATCH 0084/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a17d927b5..5dc16b3ee 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.4" +version = "0.10.5" description = "The Minecraft pack development kit" category = "main" optional = false @@ -746,7 +746,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "229242e6cf8d040e7a205be5ecd195cb9e5455ede403fadbe08f2c2b34cc51b2" +content-hash = "692a812ed27f7b28befe9e0e35d745bd7c443edc3063c0bf4002ff4de17ab245" [metadata.files] appdirs = [ @@ -762,8 +762,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.4-py3-none-any.whl", hash = "sha256:050183e8cab582cc14511e105cebde1eb275b0e36806909073f15e7db9fed90f"}, - {file = "beet-0.10.4.tar.gz", hash = "sha256:80c49374b0d836f4036b699b3b35d1e45f984fcadfb9c97024df903afa36f3e6"}, + {file = "beet-0.10.5-py3-none-any.whl", hash = "sha256:be96ec54176020d97f245cb4efba0832ff8bd5cb8542688abf98dfefac903247"}, + {file = "beet-0.10.5.tar.gz", hash = "sha256:4b4160cb1ab32a092c196d26b656d013b390b1672731325e8f14015aa3c41749"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index ac00290a4..783a20849 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.10.4" +beet = "^0.10.5" markdown-it-py = "^0.6.2" click = "^7.1.2" From 83c556a25f2f261091be349aab4d02e2ef7dca77 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 11:09:58 +0100 Subject: [PATCH 0085/1554] test: another custom directive example --- packages/lectern/examples/with_beet/beet.json | 2 +- packages/lectern/examples/with_beet/hello.md | 6 ++++++ .../examples/with_beet/hello_directive.py | 17 +++++++++++++++++ .../snapshots/examples__beet_project__0.pack.md | 13 +++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/lectern/examples/with_beet/hello_directive.py diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index 628507524..d33f40a2d 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -1,5 +1,5 @@ { - "require": ["custom_directive"], + "require": ["custom_directive", "hello_directive"], "pipeline": ["lectern"], "meta": { "lectern": { diff --git a/packages/lectern/examples/with_beet/hello.md b/packages/lectern/examples/with_beet/hello.md index 5b93e88da..2fe85ce3f 100644 --- a/packages/lectern/examples/with_beet/hello.md +++ b/packages/lectern/examples/with_beet/hello.md @@ -8,3 +8,9 @@ say bye ``` [`@resource_pack pack.png`](https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f8/Lectern_JE2_BE1.png) + +And now the `hello` directive. + +> `@hello Alice` +> +> `@hello Bob` diff --git a/packages/lectern/examples/with_beet/hello_directive.py b/packages/lectern/examples/with_beet/hello_directive.py new file mode 100644 index 000000000..48f2bb639 --- /dev/null +++ b/packages/lectern/examples/with_beet/hello_directive.py @@ -0,0 +1,17 @@ +""""Plugin that defines the `@hello ` directive.""" + + +from beet import Context, DataPack, Function, ResourcePack + +from lectern import Document, Fragment + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.directives["hello"] = hello + + +def hello(fragment: Fragment, assets: ResourcePack, data: DataPack): + name = fragment.expect("name") + function = data.functions.setdefault("hello:greetings", Function([])) + function.lines.append(f"say Hello, {name}!") diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 1d9292687..ee7551ab9 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -120,6 +120,19 @@ +### hello + +- `@function hello:greetings` + +
+ + ```mcfunction + say Hello, Alice! + say Hello, Bob! + ``` + +
+ ## Resource pack - `@resource_pack pack.mcmeta` From 55c97e8e8d30e7690c6973916043010af44d0da5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Feb 2021 11:57:39 +0100 Subject: [PATCH 0086/1554] docs: udpate readme --- packages/lectern/README.md | 364 ++++++++++++++++-- .../examples__markdown_README_md__0.pack.md | 113 +++++- .../README.md | 113 +++++- .../pack.png | Bin 0 -> 19263 bytes .../examples__text_README_md__0.pack.txt | 85 +++- 5 files changed, 631 insertions(+), 44 deletions(-) create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/pack.png diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 52f106830..e1afa94ec 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -85,6 +85,25 @@ If you're using [`beet`](https://github.com/mcbeet/beet) you can use `lectern` a } ``` +## Document formats + +`lectern` implements two closely-related document formats: markdown and plain text. The markdown format builds upon the plain text format. + +The markdown format lets you present the various elements of your data pack or resource pack and how they fit together. It's a format that's meant to support [literate programming](https://en.wikipedia.org/wiki/Literate_programming). You can use it when your document is meant to be read by other people. It allows you to emphasize the important parts, explain tradeoffs and discuss alternatives, implementation details, etc... + + `@function tutorial:greeting` + + ```mcfunction + say Hello, world! + ``` + +On the other hand if you don't intend to produce literate documents you can use the plain text format to author data packs and resource packs as a single file without having to deal with markdown formatting. + +``` +@function tutorial:greeting +say Hello, world! +``` + ## Directives Data pack and resource pack fragments are code blocks, links or images annotated with a special `lectern` directive. Directives are prefixed with the `@` symbol and can be followed by zero or more arguments. @@ -102,33 +121,32 @@ Data pack and resource pack fragments are code blocks, links or images annotated Here is a reference of all the supported resources: -| Data pack | | Resource pack | | -| ------------------------------- | --- | ------------------ | --- | -| `@advancement` | | `@blockstate` | | -| `@function` | | `@model` | | -| `@loot_table` | | `@font` | | -| `@predicate` | | `@glyph_sizes` | ⚠️ | -| `@recipe` | | `@truetype_font` | ⚠️ | -| `@structure` | ⚠️ | `@shader_post` | | -| `@block_tag` | | `@shader_program` | | -| `@entity_type_tag` | | `@fragment_shader` | | -| `@fluid_tag` | | `@vertex_shader` | | -| `@function_tag` | | `@text` | | -| `@item_tag` | | `@texture_mcmeta` | | -| `@dimension_type` | | `@texture` | ⚠️ | -| `@dimension` | | | | -| `@biome` | | | | -| `@configured_carver` | | | | -| `@configured_feature` | | | | -| `@configured_structure_feature` | | | | -| `@configured_surface_builder` | | | | -| `@noise_settings` | | | | -| `@processor_list` | | | | -| `@template_pool` | | | | - -> ⚠️ Binary resources are supported but aren't compatible with code block fragments. - -There are two additional built-in directives that can be used to include files using a path relative to the root of the data pack or the resource pack. +| Data pack | Resource pack | +| ------------------------------- | ------------------ | +| `@advancement` | `@blockstate` | +| `@function` | `@model` | +| `@loot_table` | `@font` | +| `@predicate` | `@glyph_sizes` | +| `@recipe` | `@truetype_font` | +| `@structure` | `@shader_post` | +| `@block_tag` | `@shader_program` | +| `@entity_type_tag` | `@fragment_shader` | +| `@fluid_tag` | `@vertex_shader` | +| `@function_tag` | `@text` | +| `@item_tag` | `@texture_mcmeta` | +| `@dimension_type` | `@texture` | +| `@dimension` | | +| `@biome` | | +| `@configured_carver` | | +| `@configured_feature` | | +| `@configured_structure_feature` | | +| `@configured_surface_builder` | | +| `@noise_settings` | | +| `@processor_list` | | +| `@template_pool` | | +| `@item_modifier` | | + +There are also two built-in directives that can be used to include files using a path relative to the root of the data pack or the resource pack. ``` @data_pack pack.mcmeta @@ -138,6 +156,22 @@ There are two additional built-in directives that can be used to include files u This is useful for adding files that aren't part of any particular namespace. +If you're using `lectern` as a `beet` plugin you will be able to require plugins dynamically wih the `@require` directive. + +``` +@require my_plugins.hello +``` + +Finally, the `@skip` directive is simply ignored and allows you to end a previous fragment in the plain text format. + +``` +@function tutorial:greeting +say Hello, world! + +@skip +This will not be included in the output. +``` + ## Code block fragments You can include the content of a code block in a data pack or a resource pack by preceding it with a directive surrounded by backticks. @@ -148,7 +182,11 @@ You can include the content of a code block in a data pack or a resource pack by say Hello, world! ``` -You can put the directive in an html comment to make it invisible. +You can put the directive in an html comment to make it invisible. Here the code block is annotated with the following comment: + +```html + +``` @@ -158,6 +196,18 @@ You can put the directive in an html comment to make it invisible. } ``` +When using backticks you can surround the code block in a `
` element to make the code fragment foldable. + +`@function tutorial:greeting` + +
+ +```mcfunction +say Hello, world! +``` + +
+ The directive can also be embedded directly inside the code block. You can insert a directive preceded by either `#` or `//` and the following lines will be included in the specified file. ```mcfunction @@ -165,7 +215,7 @@ The directive can also be embedded directly inside the code block. You can inser say You obtained a dead bush! ``` -Embedded directives are striped from the output. You can use multiple directives in a single code block. +Embedded directives are stripped from the output. You can use multiple directives in a single code block. ```json // @loot_table minecraft:blocks/diamond_ore @@ -210,15 +260,63 @@ Embedded directives are striped from the output. You can use multiple directives ## Link fragments -TODO +Link fragments make it possible to refer to external files, online assets, and to embed binary files in the markdown as data urls. You can create a link fragment by turning a directive surrounded by backticks into a markdown link. + +[`@loot_table minecraft:blocks/yellow_shulker_box`](https://lanternmc.com/yellow_shulker_box.json) + +The link itself can be a path to a local file or any url supported by the built-in [`urlopen`](https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen) function. ## Image fragments -TODO +You can include inline markdown images in the output data pack or resource pack by preceding the image with a directive surrounded by backticks. + +`@data_pack pack.png` + +![](https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/3a/Pack.png/revision/latest?cb=20210210114950) + +Image fragments support the same variations as code block fragments. You can put the directive in a comment or surround the image with a `
` element to make it foldable. ## Modifiers -TODO +The behavior of particular directives can be adjusted with modifiers. A modifier is specified between parentheses right after the name of the directive. + +``` +@() ... +``` + +The `append` modifier is implemented by all the text-based built-in namespaced resource directives and makes it possible to concatenate the content of the fragment to the already-existing content. + +`@function(append) tutorial:greeting` + +```mcfunction +say This is added afterwards. +``` + +The `merge` modifier is similar but instead of concatenating the contents it uses the `beet` merging strategy to combine the fragment with the existing file. + +`@function_tag(merge) minecraft:load` + +```json +{ + "values": ["#tutorial:something_else"] +} +``` + +There are also modifiers that are applied to the content of the fragment directly. The `base64` modifier will decode the content of the code fragment as [base64](https://en.wikipedia.org/wiki/Base64). + +`@function_tag(base64) tutorial:something_else` + +```json +ewogICJ2YWx1ZXMiOiBbInR1dG9yaWFsOnN0cmlwcGVkIl0KfQ== +``` + +Finally, there's a `strip_final_newline` modifier that removes the final newline at the end of code block fragments. It's mostly used to make sure that `lectern` snapshots can reconstruct the original content byte for byte in case the file wasn't terminated by a newline. + +`@function(strip_final_newline) tutorial:stripped` + +```mcfunction +say This function doesn't have a final newline. +``` ## Command-line utility @@ -262,25 +360,209 @@ $ lectern demo_data_pack demo_resource_pack demo.md $ lectern foo_data_pack bar_data_pack demo.md ``` -The last argument is the name of the generated markdown file. By default, the `lectern` utility won't save the files that can't be directly defined inside the markdown file. You can use the `-o/--output-files` option to dump the files in the specified directory. +The last argument is the name of the generated markdown file. By default, the `lectern` utility will bundle binary files into the markdown file as data urls. You can use the `-e/--external-files` option to dump the binary files in a given directory instead. ```bash -$ lectern demo_data_pack demo.md --output-files files -$ lectern demo_data_pack demo.md -o files -$ lectern demo_data_pack demo.md -o . +$ lectern demo_data_pack demo.md --external-files files +$ lectern demo_data_pack demo.md -e files +$ lectern demo_data_pack demo.md -e . ``` +All these commands also work with plain text files. `lectern` will only use the markdown document format when the filename ends with `.md`. + +## Python API + +The API revolves around `Document` objects. A `lectern` document holds a `DataPack` and a `ResourcePack`, as well as a dictionary defining the usable directives. The extractors and serializers are also exposed on the document to make it possible to swap them out with custom ones if needed. + +```python +from beet import DataPack, ResourcePack +from lectern import Document + +document = Document() +assert document.data == DataPack() +assert document.assets == ResourcePack() +``` + +The constructor makes it possible to provide existing `DataPack` and `ResourcePack` instances, some initial text or markdown content, or a path from which to load an existing `lectern` document. + +```python +Document(data=DataPack(), assets=ResourcePack()) +Document(text=...) +Document(markdown=...) +Document(path="path/to/document.md") +``` + +`Document` instances will compare equal if the underlying data packs and resource packs also compare equal. + +You can use the `load` method to read a markdown or a plain text file and update the internal data pack and resource pack with the extracted fragments. + +```python +document.load("path/to/document.md") +``` + +If you already have some text or markdown ready to go, you can use the `add_text` and `add_markdown` methods. + +```python +document.add_text(...) +document.add_markdown(...) +``` + +If the markdown content refers to local files you can specify the directory from which the external files should be loaded from with the `external_files` argument. + +```python +document.add_markdown(..., external_files="path/to/directory") +``` + +You can use the `get_text` and `get_markdown` methods to serialize the entire content of the internal data pack and resource pack. By default the `get_markdown` method will produce markdown that embeds binary files as data urls. You can enable `emit_external_files` and optionally provide a path prefix to generate a dictionary of associated files instead. + +```python +text = document.get_text() +markdown = document.get_markdown() +markdown, external_files = document.get_markdown(emit_external_files=True) +markdown, external_files = document.get_markdown(emit_external_files=True, prefix="path/to/directory") +``` + +Finally, the `save` method lets you serialize and write the document to a given path. If the filename ends with `.md` the generated markdown will bundle binary files as data urls by default. You can use the `external_files` argument to emit the binary files in the given directory instead. + +```python +document.save("path/to/document.txt") +document.save("path/to/document.md") +document.save("path/to/document.md", external_files="path/to/files") +``` + +## Custom directives + +Directives are simply callable objects that receive the document fragment, the resource pack, and the data pack as arguments. + +```python +from beet import DataPack, ResourcePack, Function +from lectern import Document, Fragment + +def my_directive(fragment: Fragment, assets: ResourcePack, data: DataPack): + num1, num2 = fragment.expect("num1", "num2") + result = int(num1) + int(num2) + data["demo:output_result"] = Function([f"say {result}"]) + +document = Document() +document.directives["my_directive"] = my_directive +document.add_text("@my_directive 32 10") +assert document.data.functions["demo:output_result"] == Function(["say 42"]) +``` + +The `expect` method allows you to unpack the directive arguments and automatically raises an error if the user didn't specify the arguments properly. You can use the `as_file` method to get the content of the fragment as a specific type of file. + +```python +def repeated_function(fragment: Fragment, assets: ResourcePack, data: DataPack): + full_name, count = fragment.expect("full_name", "count") + function = fragment.as_file(Function) + function.lines *= int(count) + data[full_name] = function +``` + +The `as_file` method will take care of reading the file or downloading it if the directive is used with a link fragment. It will also handle the `base64` and `strip_final_newline` modifiers. + +You can handle custom modifiers by checking the content of the `modifier` attribute. + ## Beet plugin -TODO +Using `lectern` as a `beet` plugin makes it possible to combine your markdown files with arbitrary `beet` plugins for further processing. The plugin can load files using the plain text and markdown document formats and emit a snapshot of the `beet` context at the end of the build. + +```json +{ + "pipeline": ["lectern"], + "meta": { + "lectern": { + "load": ["*.md"], + "snapshot": "out/snapshot.md", + "external_files": "out" + } + } +} +``` + +You can require the plugin programmatically by using the `lectern` plugin factory. -## Plain text documents +```python +from beet import Context +from lectern import lectern -TODO +def my_plugin(ctx: Context): + ctx.require( + lectern( + load=["*.md"], + snapshot="out/snapshot.md", + external_files="out", + ) + ) +``` + +All the configuration is optional. The plugin is a no-op if the `load` or `snapshot` options are not specified. + +You can retrieve the `Document` instance with the `inject` method. This is useful for adding custom directives. + +```python +from beet import Context, DataPack, ResourcePack, Function +from lectern import Document, Fragment + +def hello_directive(ctx: Context): + """"Plugin that defines the `@hello ` directive.""" + document = ctx.inject(Document) + document.directives["hello"] = hello -## Lectern for snapshot testing +def hello(fragment: Fragment, assets: ResourcePack, data: DataPack): + name = fragment.expect("name") + function = data.functions.setdefault("hello:greetings", Function([])) + function.lines.append(f"say Hello, {name}!") +``` + +It's worth mentioning that `lectern` uses the `beet` cache to avoid downloading link fragments repeatedly and keeping your build snappy, especially in watch mode. If you need to re-download link fragments you can clear the `lectern` cache. + +```bash +$ beet cache --clear lectern +``` + +You can also use a plugin to configure a custom cache timeout if you want to make sure that your assets are re-downloaded periodically. + +```python +from beet import Context + +def download_every_day(ctx: Context): + ctx.cache["lectern"].timeout(hours=24) +``` + +## Snapshot testing + +A lot of Minecraft tooling involves generating data packs and resource packs. Writing tests for this kind of tooling takes time because you need to painstakingly compare everything that you care about with a reference value. This makes it hard to get good coverage, and then even harder to keep making changes to the code being tested afterwards. You're trading robustness and stability for a shackle that massively slows down development. + +That's where snapshot testing comes into play. Snapshot testing allows you to record a reference value and then make sure that your code keeps producing the same results. It provides the necessary tools for reviewing snapshots and updating them as your project evolves. + +`lectern` documents are useful as snapshot formats because they represent entire data packs and resource packs in a single file that's human-readable and diff-friendly. + +[`pytest-insta`](https://github.com/vberlier/pytest-insta) is an extensible snapshot testing plugin for [`pytest`](https://docs.pytest.org/en/stable/). When it's installed, `lectern` defines three additional snapshot formats. + +| Extension | Format description | +| ------------------------- | ---------------------------------------------------------------- | +| `.pack.txt` | Plain text snapshot. | +| `.pack.md` | Markdown snapshot with bundled binary files. | +| `.pack.md_external_files` | Directory with a README.md that refers to external binary files. | + +You can use these snapshot formats when comparing `Document` objects with the `snapshot` fixture. + +```python +def test_generate(snapshot): + data = generate_some_data_pack() + assert snapshot("pack.txt") == Document(data=data) +``` + +If you're using the `beet` toolchain, keep in mind that you can get a `Document` instance bound to the context object by using the `inject` method. + +```python +def test_generate_with_beet(snapshot): + ctx = run_beet(...) + assert snapshot("pack.txt") == ctx.inject(Document) +``` -TODO +This will save the entire data pack and resource pack in the snapshot. For more details about working with the generated snapshots check out the [`pytest-insta` documentation](https://github.com/vberlier/pytest-insta#command-line-options). ## Contributing diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index ffa28c830..4b869141a 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -17,6 +17,14 @@
+- `@data_pack pack.png` + +
+ + ![data_pack.png](data:image/png;base64,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) + +
+ ### tutorial - `@function tutorial:greeting` @@ -25,6 +33,7 @@ ```mcfunction say Hello, world! + say This is added afterwards. ```
@@ -39,6 +48,16 @@ +- `@function(strip_final_newline) tutorial:stripped` + +
+ + ```mcfunction + say This function doesn't have a final newline. + ``` + +
+ - `@advancement tutorial:obtained_dead_bush`
@@ -70,6 +89,18 @@
+- `@function_tag(strip_final_newline) tutorial:something_else` + +
+ + ```json + { + "values": ["tutorial:stripped"] + } + ``` + +
+ ### minecraft - `@function_tag minecraft:load` @@ -78,7 +109,10 @@ ```json { - "values": ["tutorial:greeting"] + "values": [ + "tutorial:greeting", + "#tutorial:something_else" + ] } ``` @@ -105,3 +139,80 @@ ``` + +- `@loot_table minecraft:blocks/yellow_shulker_box` + +
+ + ```json + { + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index ffa28c830..83d5182d0 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -17,6 +17,14 @@ +- `@data_pack pack.png` + +
+ + ![data_pack.png](pack.png) + +
+ ### tutorial - `@function tutorial:greeting` @@ -25,6 +33,7 @@ ```mcfunction say Hello, world! + say This is added afterwards. ``` @@ -39,6 +48,16 @@ +- `@function(strip_final_newline) tutorial:stripped` + +
+ + ```mcfunction + say This function doesn't have a final newline. + ``` + +
+ - `@advancement tutorial:obtained_dead_bush`
@@ -70,6 +89,18 @@
+- `@function_tag(strip_final_newline) tutorial:something_else` + +
+ + ```json + { + "values": ["tutorial:stripped"] + } + ``` + +
+ ### minecraft - `@function_tag minecraft:load` @@ -78,7 +109,10 @@ ```json { - "values": ["tutorial:greeting"] + "values": [ + "tutorial:greeting", + "#tutorial:something_else" + ] } ``` @@ -105,3 +139,80 @@ ``` + +- `@loot_table minecraft:blocks/yellow_shulker_box` + +
+ + ```json + { + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/pack.png b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..c17aef6554ab39ca4c926009d9f10138b3f8b855 GIT binary patch literal 19263 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 mP)x6zyH167>@?>bcl#fH{pY73i(7*L0000 Date: Sat, 27 Feb 2021 10:58:52 +0000 Subject: [PATCH 0087/1554] 0.6.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 15 +++++++++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 12df1f752..784d73015 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,21 @@ +## v0.6.0 (2021-02-27) +### Feature +* Add merge modifier ([`907b630`](https://github.com/mcbeet/lectern/commit/907b630a23bf3f4d88c7a343c529a6a6e2fce07b)) +* Add append modifier ([`d4e8be4`](https://github.com/mcbeet/lectern/commit/d4e8be4fb54da6c75b959ce569974b612aedde1a)) +* Add base64 modifier ([`acd9d77`](https://github.com/mcbeet/lectern/commit/acd9d7740df3d519b7a19d59f1b98af0d0092d76)) + +### Fix +* Don't set any cache timeout ([`ebbb5a6`](https://github.com/mcbeet/lectern/commit/ebbb5a6710c8e63fdfe73d9dc7b07848c4ca6818)) +* Report unexpected arguments for skip directive ([`f7ff720`](https://github.com/mcbeet/lectern/commit/f7ff720b7444135d888154940f7ed226e0a9dfdb)) +* Add item_modifier directive ([`5e034d5`](https://github.com/mcbeet/lectern/commit/5e034d57f36a1f8719e88cd653e7fab8ffbfb5c2)) +* Don't cache data url ([`c7517a8`](https://github.com/mcbeet/lectern/commit/c7517a844a3c09da9a448f8742c69f30b9478cc2)) + +### Documentation +* Udpate readme ([`a110a82`](https://github.com/mcbeet/lectern/commit/a110a823f333f277deff7137f32b133eb2d16ce5)) + ## v0.5.0 (2021-02-25) ### Feature * Serialize images ([`7cf6fd9`](https://github.com/mcbeet/lectern/commit/7cf6fd944533a4ea9210f1f795bc4839c1a793de)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 1c02bf3d6..5d90fdb39 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.5.0" +__version__ = "0.6.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 783a20849..011868c80 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.5.0" +version = "0.6.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 2bc739588165a573bc8bdb528dba1b9b650362b2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Mar 2021 05:08:23 +0000 Subject: [PATCH 0088/1554] chore(deps): bump beet from 0.10.4 to 0.10.5 Bumps [beet](https://github.com/mcbeet/beet) from 0.10.4 to 0.10.5. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.10.4...v0.10.5) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index fb333be04..7be4e0c9c 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.4" +version = "0.10.5" description = "The Minecraft pack development kit" category = "main" optional = false @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.4-py3-none-any.whl", hash = "sha256:050183e8cab582cc14511e105cebde1eb275b0e36806909073f15e7db9fed90f"}, - {file = "beet-0.10.4.tar.gz", hash = "sha256:80c49374b0d836f4036b699b3b35d1e45f984fcadfb9c97024df903afa36f3e6"}, + {file = "beet-0.10.5-py3-none-any.whl", hash = "sha256:be96ec54176020d97f245cb4efba0832ff8bd5cb8542688abf98dfefac903247"}, + {file = "beet-0.10.5.tar.gz", hash = "sha256:4b4160cb1ab32a092c196d26b656d013b390b1672731325e8f14015aa3c41749"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, From f4810d54a2c703094a11f65ba6b019cea813a546 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Mar 2021 07:04:22 +0000 Subject: [PATCH 0089/1554] chore(deps-dev): bump pyright from 1.1.115 to 1.1.117 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.115 to 1.1.117. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.117/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index d07ab2b19..3b1162e3b 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.115" + "pyright": "^1.1.117" } }, "node_modules/pyright": { - "version": "1.1.115", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.115.tgz", - "integrity": "sha512-MFi3Q7agfL1MRTkBTkqitfS1FIwPFZ8viB7f2w4GySBKOXQJSC66iRdXnWmLqkrUi3hSHefu/rt4ul1/8YyTeA==", + "version": "1.1.117", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.117.tgz", + "integrity": "sha512-Ca/AlVYqTNeqaGKOye/Ebda7ODFbGI1JkwWI4vyKdQf2nvEzh0XiHXhf8NpX0/QdkvWD58/OXWLozbKByzNFpg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.115", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.115.tgz", - "integrity": "sha512-MFi3Q7agfL1MRTkBTkqitfS1FIwPFZ8viB7f2w4GySBKOXQJSC66iRdXnWmLqkrUi3hSHefu/rt4ul1/8YyTeA==", + "version": "1.1.117", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.117.tgz", + "integrity": "sha512-Ca/AlVYqTNeqaGKOye/Ebda7ODFbGI1JkwWI4vyKdQf2nvEzh0XiHXhf8NpX0/QdkvWD58/OXWLozbKByzNFpg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 5899ca1f3..805287270 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.115" + "pyright": "^1.1.117" } } From 4a069cecde3fdd0b5b52539b94b96d63928d1e09 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 Mar 2021 18:59:22 +0100 Subject: [PATCH 0090/1554] fix: make pyright happy --- packages/lectern/lectern/directive.py | 4 ++-- packages/lectern/lectern/document.py | 4 +++- packages/lectern/lectern/plugin.py | 7 ++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 6f93f8024..186a640ab 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -16,7 +16,7 @@ from zipfile import ZipFile from beet import Context, DataPack, ResourcePack -from beet.library.base import NamespaceFile, NamespaceProxy +from beet.library.base import NamespaceFile from beet.library.data_pack import ( Advancement, Biome, @@ -77,7 +77,7 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): file_instance: Any = fragment.as_file(self.file_type) pack = assets if self.file_type in assets.namespace_type.field_map else data - proxy: NamespaceProxy[Any] = pack[self.file_type] # type: ignore + proxy: Any = pack[self.file_type] # type: ignore if fragment.modifier == "append": current_file = proxy.setdefault(full_name, self.file_type("")) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index e9f160843..47890a641 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -119,7 +119,9 @@ def get_markdown( external_prefix: str = "", ) -> Union[str, Tuple[str, Dict[str, File[Any, Any]]]]: """Turn the data pack and the resource pack into markdown.""" - external_files = {} if emit_external_files else None + external_files: Optional[Dict[str, File[Any, Any]]] = ( + {} if emit_external_files else None + ) content = self.markdown_serializer.serialize( assets=self.assets, diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 866560cca..a683b87de 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -4,18 +4,19 @@ ] -from typing import Iterable, Optional +from typing import Iterable, List, Optional, cast from beet import Context +from beet.core.utils import JsonDict from beet.toolchain.context import Plugin from .document import Document def beet_default(ctx: Context): - config = ctx.meta.get("lectern", {}) + config = ctx.meta.get("lectern", cast(JsonDict, {})) - load = config.get("load", []) + load = config.get("load", cast(List[str], [])) snapshot = config.get("snapshot") external_files = config.get("external_files") From aa226b38d8416ce1ef641c1b2166d1d9777e2abe Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 3 Mar 2021 18:01:42 +0000 Subject: [PATCH 0091/1554] 0.6.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 784d73015..7c7705a88 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.6.1 (2021-03-03) +### Fix +* Make pyright happy ([`f15700c`](https://github.com/mcbeet/lectern/commit/f15700c1c5a5348248ac9947a167fe3931d74c31)) + ## v0.6.0 (2021-02-27) ### Feature * Add merge modifier ([`907b630`](https://github.com/mcbeet/lectern/commit/907b630a23bf3f4d88c7a343c529a6a6e2fce07b)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 5d90fdb39..ee4a95829 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -5,4 +5,4 @@ from .plugin import * from .serialize import * -__version__ = "0.6.0" +__version__ = "0.6.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 011868c80..a6e16c6c3 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.6.0" +version = "0.6.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 8dc954ed1b33e4b5335c08469b8ce67dda91497f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 Mar 2021 19:02:31 +0100 Subject: [PATCH 0092/1554] chore: update lockfile --- packages/lectern/poetry.lock | 155 ++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 76 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 5dc16b3ee..febdb849c 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -200,7 +200,7 @@ smmap = ">=3.0.1,<4" [[package]] name = "gitpython" -version = "3.1.13" +version = "3.1.14" description = "Python Git Library" category = "dev" optional = false @@ -273,7 +273,7 @@ i18n = ["Babel (>=0.8)"] [[package]] name = "keyring" -version = "22.0.1" +version = "22.3.0" description = "Store and access your passwords safely." category = "dev" optional = false @@ -286,7 +286,7 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] name = "markdown-it-py" @@ -378,7 +378,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pillow" -version = "8.1.0" +version = "8.1.1" description = "Python Imaging Library (Fork)" category = "main" optional = false @@ -424,16 +424,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.7.3" +version = "1.8.1" description = "Data validation and settings management using python 3.6 type hinting" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.1" + +[package.dependencies] +typing-extensions = ">=3.7.4.3" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] -typing_extensions = ["typing-extensions (>=3.7.2)"] [[package]] name = "pygments" @@ -474,7 +476,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-insta" -version = "0.1.6" +version = "0.1.7" description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false @@ -531,7 +533,7 @@ python-versions = "*" [[package]] name = "readme-renderer" -version = "28.0" +version = "29.0" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -544,7 +546,7 @@ Pygments = ">=2.5.1" six = "*" [package.extras] -md = ["cmarkgfm (>=0.2.0)"] +md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" @@ -670,7 +672,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.57.0" +version = "4.58.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -710,7 +712,7 @@ python-versions = "*" name = "typing-extensions" version = "3.7.4.3" description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -861,8 +863,8 @@ gitdb = [ {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, ] gitpython = [ - {file = "GitPython-3.1.13-py3-none-any.whl", hash = "sha256:c5347c81d232d9b8e7f47b68a83e5dc92e7952127133c5f2df9133f2c75a1b29"}, - {file = "GitPython-3.1.13.tar.gz", hash = "sha256:8621a7e777e276a5ec838b59280ba5272dd144a18169c36c903d8b38b99f750a"}, + {file = "GitPython-3.1.14-py3-none-any.whl", hash = "sha256:3283ae2fba31c913d857e12e5ba5f9a7772bbc064ae2bb09efafa71b0dd4939b"}, + {file = "GitPython-3.1.14.tar.gz", hash = "sha256:be27633e7509e58391f10207cd32b2a6cf5b908f92d9cd30da2e514e1137af61"}, ] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, @@ -890,8 +892,8 @@ jinja2 = [ {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, ] keyring = [ - {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, - {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] markdown-it-py = [ {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, @@ -998,38 +1000,39 @@ pathspec = [ {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded"}, - {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, - {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, - {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7"}, - {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, - {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, - {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae"}, - {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, - {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, - {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0"}, - {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, - {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, - {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, + {file = "Pillow-8.1.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:14415e9e28410232370615dbde0cf0a00e526f522f665460344a5b96973a3086"}, + {file = "Pillow-8.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:924fc33cb4acaf6267b8ca3b8f1922620d57a28470d5e4f49672cea9a841eb08"}, + {file = "Pillow-8.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:df534e64d4f3e84e8f1e1a37da3f541555d947c1c1c09b32178537f0f243f69d"}, + {file = "Pillow-8.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4fe74636ee71c57a7f65d7b21a9f127d842b4fb75511e5d256ace258826eb352"}, + {file = "Pillow-8.1.1-cp36-cp36m-win32.whl", hash = "sha256:3e759bcc03d6f39bc751e56d86bc87252b9a21c689a27c5ed753717a87d53a5b"}, + {file = "Pillow-8.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:292f2aa1ae5c5c1451cb4b558addb88c257411d3fd71c6cf45562911baffc979"}, + {file = "Pillow-8.1.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8211cac9bf10461f9e33fe9a3af6c5131f3fdd0d10672afc2abb2c70cf95c5ca"}, + {file = "Pillow-8.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:d30f30c044bdc0ab8f3924e1eeaac87e0ff8a27e87369c5cac4064b6ec78fd83"}, + {file = "Pillow-8.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7094bbdecb95ebe53166e4c12cf5e28310c2b550b08c07c5dc15433898e2238e"}, + {file = "Pillow-8.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:1022f8f6dc3c5b0dcf928f1c49ba2ac73051f576af100d57776e2b65c1f76a8d"}, + {file = "Pillow-8.1.1-cp37-cp37m-win32.whl", hash = "sha256:a7d690b2c5f7e4a932374615fedceb1e305d2dd5363c1de15961725fe10e7d16"}, + {file = "Pillow-8.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:436b0a2dd9fe3f7aa6a444af6bdf53c1eb8f5ced9ea3ef104daa83f0ea18e7bc"}, + {file = "Pillow-8.1.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:c448d2b335e21951416a30cd48d35588d122a912d5fe9e41900afacecc7d21a1"}, + {file = "Pillow-8.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:bb18422ad00c1fecc731d06592e99c3be2c634da19e26942ba2f13d805005cf2"}, + {file = "Pillow-8.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3ec87bd1248b23a2e4e19e774367fbe30fddc73913edc5f9b37470624f55dc1f"}, + {file = "Pillow-8.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99ce3333b40b7a4435e0a18baad468d44ab118a4b1da0af0a888893d03253f1d"}, + {file = "Pillow-8.1.1-cp38-cp38-win32.whl", hash = "sha256:2f0d7034d5faae9a8d1019d152ede924f653df2ce77d3bba4ce62cd21b5f94ae"}, + {file = "Pillow-8.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:07872f1d8421db5a3fe770f7480835e5e90fddb58f36c216d4a2ac0d594de474"}, + {file = "Pillow-8.1.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:69da5b1d7102a61ce9b45deb2920a2012d52fd8f4201495ea9411d0071b0ec22"}, + {file = "Pillow-8.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a40d7d4b17db87f5b9a1efc0aff56000e1d0d5ece415090c102aafa0ccbe858"}, + {file = "Pillow-8.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:01bb0a34f1a6689b138c0089d670ae2e8f886d2666a9b2f2019031abdea673c4"}, + {file = "Pillow-8.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:43b3c859912e8bf754b3c5142df624794b18eb7ae07cfeddc917e1a9406a3ef2"}, + {file = "Pillow-8.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3b13d89d97b551e02549d1f0edf22bed6acfd6fd2e888cd1e9a953bf215f0e81"}, + {file = "Pillow-8.1.1-cp39-cp39-win32.whl", hash = "sha256:c143c409e7bc1db784471fe9d0bf95f37c4458e879ad84cfae640cb74ee11a26"}, + {file = "Pillow-8.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c5e3c36f02c815766ae9dd91899b1c5b4652f2a37b7a51609f3bd467c0f11fb"}, + {file = "Pillow-8.1.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:8cf77e458bd996dc85455f10fe443c0c946f5b13253773439bcbec08aa1aebc2"}, + {file = "Pillow-8.1.1-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:c10af40ee2f1a99e1ae755ab1f773916e8bca3364029a042cd9161c400416bd8"}, + {file = "Pillow-8.1.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:ff83dfeb04c98bb3e7948f876c17513a34e9a19fd92e292288649164924c1b39"}, + {file = "Pillow-8.1.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9af590adc1e46898a1276527f3cfe2da8048ae43fbbf9b1bf9395f6c99d9b47"}, + {file = "Pillow-8.1.1-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:172acfaf00434a28dddfe592d83f2980e22e63c769ff4a448ddf7b7a38ffd165"}, + {file = "Pillow-8.1.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:33fdbd4f5608c852d97264f9d2e3b54e9e9959083d008145175b86100b275e5b"}, + {file = "Pillow-8.1.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:59445af66b59cc39530b4f810776928d75e95f41e945f0c32a3de4aceb93c15d"}, + {file = "Pillow-8.1.1.tar.gz", hash = "sha256:f6fc18f9c9c7959bf58e6faf801d14fafb6d4717faaf6f79a68c8bb2a13dcf20"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, @@ -1048,28 +1051,28 @@ pycparser = [ {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pydantic = [ - {file = "pydantic-1.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd"}, - {file = "pydantic-1.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009"}, - {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d8df4b9090b595511906fa48deda47af04e7d092318bfb291f4d45dfb6bb2127"}, - {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:514b473d264671a5c672dfb28bdfe1bf1afd390f6b206aa2ec9fed7fc592c48e"}, - {file = "pydantic-1.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:dba5c1f0a3aeea5083e75db9660935da90216f8a81b6d68e67f54e135ed5eb23"}, - {file = "pydantic-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59e45f3b694b05a69032a0d603c32d453a23f0de80844fb14d55ab0c6c78ff2f"}, - {file = "pydantic-1.7.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b24e8a572e4b4c18f614004dda8c9f2c07328cb5b6e314d6e1bbd536cb1a6c1"}, - {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:b2b054d095b6431cdda2f852a6d2f0fdec77686b305c57961b4c5dd6d863bf3c"}, - {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:025bf13ce27990acc059d0c5be46f416fc9b293f45363b3d19855165fee1874f"}, - {file = "pydantic-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6e3874aa7e8babd37b40c4504e3a94cc2023696ced5a0500949f3347664ff8e2"}, - {file = "pydantic-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e682f6442ebe4e50cb5e1cfde7dda6766fb586631c3e5569f6aa1951fd1a76ef"}, - {file = "pydantic-1.7.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:185e18134bec5ef43351149fe34fda4758e53d05bb8ea4d5928f0720997b79ef"}, - {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:f5b06f5099e163295b8ff5b1b71132ecf5866cc6e7f586d78d7d3fd6e8084608"}, - {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:24ca47365be2a5a3cc3f4a26dcc755bcdc9f0036f55dcedbd55663662ba145ec"}, - {file = "pydantic-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:d1fe3f0df8ac0f3a9792666c69a7cd70530f329036426d06b4f899c025aca74e"}, - {file = "pydantic-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6864844b039805add62ebe8a8c676286340ba0c6d043ae5dea24114b82a319e"}, - {file = "pydantic-1.7.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ecb54491f98544c12c66ff3d15e701612fc388161fd455242447083350904730"}, - {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ffd180ebd5dd2a9ac0da4e8b995c9c99e7c74c31f985ba090ee01d681b1c4b95"}, - {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8d72e814c7821125b16f1553124d12faba88e85405b0864328899aceaad7282b"}, - {file = "pydantic-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:475f2fa134cf272d6631072554f845d0630907fce053926ff634cc6bc45bf1af"}, - {file = "pydantic-1.7.3-py3-none-any.whl", hash = "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229"}, - {file = "pydantic-1.7.3.tar.gz", hash = "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9"}, + {file = "pydantic-1.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0c40162796fc8d0aa744875b60e4dc36834db9f2a25dbf9ba9664b1915a23850"}, + {file = "pydantic-1.8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fff29fe54ec419338c522b908154a2efabeee4f483e48990f87e189661f31ce3"}, + {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:fbfb608febde1afd4743c6822c19060a8dbdd3eb30f98e36061ba4973308059e"}, + {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:eb8ccf12295113ce0de38f80b25f736d62f0a8d87c6b88aca645f168f9c78771"}, + {file = "pydantic-1.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:20d42f1be7c7acc352b3d09b0cf505a9fab9deb93125061b376fbe1f06a5459f"}, + {file = "pydantic-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dde4ca368e82791de97c2ec019681ffb437728090c0ff0c3852708cf923e0c7d"}, + {file = "pydantic-1.8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3bbd023c981cbe26e6e21c8d2ce78485f85c2e77f7bab5ec15b7d2a1f491918f"}, + {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:830ef1a148012b640186bf4d9789a206c56071ff38f2460a32ae67ca21880eb8"}, + {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:fb77f7a7e111db1832ae3f8f44203691e15b1fa7e5a1cb9691d4e2659aee41c4"}, + {file = "pydantic-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3bcb9d7e1f9849a6bdbd027aabb3a06414abd6068cb3b21c49427956cce5038a"}, + {file = "pydantic-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2287ebff0018eec3cc69b1d09d4b7cebf277726fa1bd96b45806283c1d808683"}, + {file = "pydantic-1.8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4bbc47cf7925c86a345d03b07086696ed916c7663cb76aa409edaa54546e53e2"}, + {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6388ef4ef1435364c8cc9a8192238aed030595e873d8462447ccef2e17387125"}, + {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:dd4888b300769ecec194ca8f2699415f5f7760365ddbe243d4fd6581485fa5f0"}, + {file = "pydantic-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:8fbb677e4e89c8ab3d450df7b1d9caed23f254072e8597c33279460eeae59b99"}, + {file = "pydantic-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f2736d9a996b976cfdfe52455ad27462308c9d3d0ae21a2aa8b4cd1a78f47b9"}, + {file = "pydantic-1.8.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3114d74329873af0a0e8004627f5389f3bb27f956b965ddd3e355fe984a1789c"}, + {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:258576f2d997ee4573469633592e8b99aa13bda182fcc28e875f866016c8e07e"}, + {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c17a0b35c854049e67c68b48d55e026c84f35593c66d69b278b8b49e2484346f"}, + {file = "pydantic-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8bc082afef97c5fd3903d05c6f7bb3a6af9fc18631b4cc9fedeb4720efb0c58"}, + {file = "pydantic-1.8.1-py3-none-any.whl", hash = "sha256:e3f8790c47ac42549dc8b045a67b0ca371c7f66e73040d0197ce6172b385e520"}, + {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, ] pygments = [ {file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, @@ -1084,8 +1087,8 @@ pytest = [ {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, ] pytest-insta = [ - {file = "pytest-insta-0.1.6.tar.gz", hash = "sha256:68d9cbcd38f94873c91ee670d3f6a9c1a6a05f0f0c7c07a6daab02b53761cef4"}, - {file = "pytest_insta-0.1.6-py3-none-any.whl", hash = "sha256:dd6b037d8a74afdfbece5abd4c9afd0259777c31faed6f0db15363561c93713a"}, + {file = "pytest-insta-0.1.7.tar.gz", hash = "sha256:daa265c8f31920f215b9363ce57c820ade7a87d0bd1239e91514eec63ea50ad2"}, + {file = "pytest_insta-0.1.7-py3-none-any.whl", hash = "sha256:618ca678fb2c32b1e332903b283179d5fd08d43ea3c8445fc4fc42e30dba95f6"}, ] python-gitlab = [ {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, @@ -1100,8 +1103,8 @@ pywin32-ctypes = [ {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] readme-renderer = [ - {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, - {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, + {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, + {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, @@ -1196,8 +1199,8 @@ tomlkit = [ {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.57.0-py2.py3-none-any.whl", hash = "sha256:70657337ec104eb4f3fb229285358f23f045433f6aea26846cdd55f0fd68945c"}, - {file = "tqdm-4.57.0.tar.gz", hash = "sha256:65185676e9fdf20d154cffd1c5de8e39ef9696ff7e59fe0156b1b08e468736af"}, + {file = "tqdm-4.58.0-py2.py3-none-any.whl", hash = "sha256:2c44efa73b8914dba7807aefd09653ac63c22b5b4ea34f7a80973f418f1a3089"}, + {file = "tqdm-4.58.0.tar.gz", hash = "sha256:c23ac707e8e8aabb825e4d91f8e17247f9cc14b0d64dd9e97be0781e9e525bba"}, ] twine = [ {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, From bb90464b1134721bb48249b2a2d81ca8b3e1de45 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 Mar 2021 19:36:51 +0100 Subject: [PATCH 0093/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index febdb849c..9b877c9a5 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.5" +version = "0.11.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -748,7 +748,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "692a812ed27f7b28befe9e0e35d745bd7c443edc3063c0bf4002ff4de17ab245" +content-hash = "62613aa440404f35e46037f6fd16b2b416e801513f90ee68c93fcd751df037b2" [metadata.files] appdirs = [ @@ -764,8 +764,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.5-py3-none-any.whl", hash = "sha256:be96ec54176020d97f245cb4efba0832ff8bd5cb8542688abf98dfefac903247"}, - {file = "beet-0.10.5.tar.gz", hash = "sha256:4b4160cb1ab32a092c196d26b656d013b390b1672731325e8f14015aa3c41749"}, + {file = "beet-0.11.1-py3-none-any.whl", hash = "sha256:1c81989cf27fb3db6ab962d809953745315af6e715bf38eeec2ea584e9678bfe"}, + {file = "beet-0.11.1.tar.gz", hash = "sha256:a2977066a386aa4e333d07653f5ec6d064cc2c081543deb3754814ce6101ccf1"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index a6e16c6c3..f4a55c120 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.10.5" +beet = "^0.11.1" markdown-it-py = "^0.6.2" click = "^7.1.2" From 82c514145474627a19851d44d0faf1704689e908 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 Mar 2021 19:37:31 +0100 Subject: [PATCH 0094/1554] refactor: move is_path helper into its own function --- packages/lectern/lectern/extract.py | 8 +++++--- packages/lectern/lectern/utils.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 packages/lectern/lectern/utils.py diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 6139ed3bf..be3d1db78 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -10,7 +10,7 @@ from itertools import islice from pathlib import Path from typing import Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union -from urllib.parse import unquote, urlparse +from urllib.parse import unquote from beet import Cache, DataPack, ResourcePack from beet.core.utils import FileSystemPath @@ -20,9 +20,11 @@ from .directive import Directive from .fragment import Fragment +from .utils import is_path # Patch markdown_it to allow arbitrary data urls # https://github.com/executablebooks/markdown-it-py/issues/128 +# TODO: Will soon be able to use custom validateLink normalize_url.GOOD_DATA_RE = re.compile(r"^data:") @@ -443,10 +445,10 @@ def create_link_fragment( external_files: Optional[FileSystemPath] = None, ) -> Fragment: """Helper for creating a fragment from a link.""" - url = unquote(link) + url = unquote(link) # TODO: Will soon be able to use custom normalizeLink path = None - if urlparse(url).path == url: + if is_path(url): if external_files: path = Path(external_files, url).resolve() url = None diff --git a/packages/lectern/lectern/utils.py b/packages/lectern/lectern/utils.py new file mode 100644 index 000000000..541258955 --- /dev/null +++ b/packages/lectern/lectern/utils.py @@ -0,0 +1,10 @@ +__all__ = [ + "is_path", +] + + +from urllib.parse import urlparse + + +def is_path(url: str) -> bool: + return urlparse(url).path == url From 06cf4f99e2d162efd2ea518570bf9766749ee53b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 Mar 2021 20:29:57 +0100 Subject: [PATCH 0095/1554] fix: lanternmc.com now returns a 403 --- packages/lectern/README.md | 2 +- .../with_links/yellow_shulker_box.json | 68 ++++++++++ .../examples__markdown_README_md__0.pack.md | 124 +++++++++--------- .../README.md | 124 +++++++++--------- .../examples__text_README_md__0.pack.txt | 124 +++++++++--------- 5 files changed, 255 insertions(+), 187 deletions(-) create mode 100644 packages/lectern/examples/with_links/yellow_shulker_box.json diff --git a/packages/lectern/README.md b/packages/lectern/README.md index e1afa94ec..097bf451f 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -262,7 +262,7 @@ Embedded directives are stripped from the output. You can use multiple directive Link fragments make it possible to refer to external files, online assets, and to embed binary files in the markdown as data urls. You can create a link fragment by turning a directive surrounded by backticks into a markdown link. -[`@loot_table minecraft:blocks/yellow_shulker_box`](https://lanternmc.com/yellow_shulker_box.json) +[`@loot_table minecraft:blocks/yellow_shulker_box`](examples/with_links/yellow_shulker_box.json) The link itself can be a path to a local file or any url supported by the built-in [`urlopen`](https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen) function. diff --git a/packages/lectern/examples/with_links/yellow_shulker_box.json b/packages/lectern/examples/with_links/yellow_shulker_box.json new file mode 100644 index 000000000..62e72af9f --- /dev/null +++ b/packages/lectern/examples/with_links/yellow_shulker_box.json @@ -0,0 +1,68 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] + } + ] + } + ] + } + ] +} diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index 4b869141a..149a29fc9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -146,72 +146,72 @@ ```json { - "type": "minecraft:block", - "pools": [ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ { - "rolls": 1, - "entries": [ + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "item": "minecraft:air", - "nbt": "{drop_contents:1b}" - } - } - ] - }, - { - "type": "minecraft:item", - "name": "minecraft:yellow_shulker_box", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Lock", - "target": "BlockEntityTag.Lock", - "op": "replace" - }, - { - "source": "LootTable", - "target": "BlockEntityTag.LootTable", - "op": "replace" - }, - { - "source": "LootTableSeed", - "target": "BlockEntityTag.LootTableSeed", - "op": "replace" - } - ] - }, - { - "function": "minecraft:set_contents", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ] - } - ] - } - ] + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] } - ] + ] + } + ] } - ] + ] + } + ] } ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index 83d5182d0..c1961f617 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -146,72 +146,72 @@ ```json { - "type": "minecraft:block", - "pools": [ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ { - "rolls": 1, - "entries": [ + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "item": "minecraft:air", - "nbt": "{drop_contents:1b}" - } - } - ] - }, - { - "type": "minecraft:item", - "name": "minecraft:yellow_shulker_box", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Lock", - "target": "BlockEntityTag.Lock", - "op": "replace" - }, - { - "source": "LootTable", - "target": "BlockEntityTag.LootTable", - "op": "replace" - }, - { - "source": "LootTableSeed", - "target": "BlockEntityTag.LootTableSeed", - "op": "replace" - } - ] - }, - { - "function": "minecraft:set_contents", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ] - } - ] - } - ] + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] } - ] + ] + } + ] } - ] + ] + } + ] } ``` diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index 5327dd264..d83b261bd 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -71,70 +71,70 @@ say This function doesn't have a final newline. @loot_table minecraft:blocks/yellow_shulker_box { - "type": "minecraft:block", - "pools": [ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ { - "rolls": 1, - "entries": [ + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "item": "minecraft:air", - "nbt": "{drop_contents:1b}" - } - } - ] - }, - { - "type": "minecraft:item", - "name": "minecraft:yellow_shulker_box", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Lock", - "target": "BlockEntityTag.Lock", - "op": "replace" - }, - { - "source": "LootTable", - "target": "BlockEntityTag.LootTable", - "op": "replace" - }, - { - "source": "LootTableSeed", - "target": "BlockEntityTag.LootTableSeed", - "op": "replace" - } - ] - }, - { - "function": "minecraft:set_contents", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ] - } - ] - } - ] + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] } - ] + ] + } + ] } - ] + ] + } + ] } From 504b0c4ff25f226fe13778e7399fddf2da60f273 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 Mar 2021 20:31:32 +0100 Subject: [PATCH 0096/1554] feat: enhance pytest explanation --- packages/lectern/lectern/pytest_plugin.py | 35 +++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/lectern/lectern/pytest_plugin.py b/packages/lectern/lectern/pytest_plugin.py index 9fb94c182..d0c75d329 100644 --- a/packages/lectern/lectern/pytest_plugin.py +++ b/packages/lectern/lectern/pytest_plugin.py @@ -1,3 +1,10 @@ +# type: ignore + + +from _pytest.assertion.util import assertrepr_compare + +from lectern import Document + try: from pytest_insta import Fmt except ImportError: @@ -34,3 +41,31 @@ def load(self, path: Path) -> Document: def dump(self, path: Path, value: Document): path.mkdir(exist_ok=True) value.save(path / "README.md", external_files=path) + + +def pytest_assertrepr_compare(config, op, left, right): + if type(left) != type(right) or op != "==": + return + + explanation = [] + + if isinstance(left, Document): + if left.assets != right.assets: + explanation += ["", "Differing resource pack:"] + explanation += generate_explanation(config, left.assets, right.assets) + if left.data != right.data: + explanation += ["", "Differing data pack:"] + explanation += generate_explanation(config, left.data, right.data) + + if explanation: + return [assertrepr_compare(config, op, left, right)[0]] + explanation + + +def generate_explanation(config, left, right): + summary, *explanation = config.hook.pytest_assertrepr_compare( + config=config, op="==", left=left, right=right + )[0] + + yield f" assert " + summary + for line in explanation: + yield " " + line From 6da301f46ac706325cca1031e35a1ee9664ab10d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 4 Mar 2021 04:52:37 +0000 Subject: [PATCH 0097/1554] chore(deps): bump beet from 0.10.5 to 0.11.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.10.5 to 0.11.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.10.5...v0.11.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 7be4e0c9c..0312fe0e1 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.10.5" +version = "0.11.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f19b28faaf31ad3ae7bd588b25bd4e94d89671334144acf02d1c7b1e106b795f" +content-hash = "676abcb43111d46f2e8768cc23abb983488061dc9671c21864af989829f5ffee" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.10.5-py3-none-any.whl", hash = "sha256:be96ec54176020d97f245cb4efba0832ff8bd5cb8542688abf98dfefac903247"}, - {file = "beet-0.10.5.tar.gz", hash = "sha256:4b4160cb1ab32a092c196d26b656d013b390b1672731325e8f14015aa3c41749"}, + {file = "beet-0.11.1-py3-none-any.whl", hash = "sha256:1c81989cf27fb3db6ab962d809953745315af6e715bf38eeec2ea584e9678bfe"}, + {file = "beet-0.11.1.tar.gz", hash = "sha256:a2977066a386aa4e333d07653f5ec6d064cc2c081543deb3754814ce6101ccf1"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1045b4502..1a1203e64 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.11.0" +beet = ">=0.5.1,<0.12.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 9db80df3495708b038dd5cd22e78c3f09121409c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 18:04:37 +0100 Subject: [PATCH 0098/1554] feat: add fragment location --- packages/lectern/lectern/extract.py | 99 ++++++++++++++++++------ packages/lectern/lectern/fragment.py | 2 + packages/lectern/tests/test_directive.py | 11 +-- 3 files changed, 82 insertions(+), 30 deletions(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index be3d1db78..40e7a9414 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -7,6 +7,7 @@ import re +from dataclasses import replace from itertools import islice from pathlib import Path from typing import Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union @@ -61,6 +62,24 @@ def get_regex(self, directives: Mapping[str, Directive]) -> "re.Pattern[str]": return self.regex + def split( + self, + source: str, + directives: Mapping[str, Directive], + ) -> Iterator[Tuple[str, Optional[Fragment]]]: + """Split the given content into fragments.""" + lines = source.splitlines(keepends=True) + previous_line = 0 + + for fragment in self.parse_fragments(source, directives): + if fragment.start_line > previous_line: + yield "".join(lines[previous_line : fragment.start_line]), None + yield "".join(lines[fragment.start_line : fragment.end_line]), fragment + previous_line = fragment.end_line + + if previous_line < len(lines): + yield "".join(lines[previous_line:]), None + def extract( self, source: str, @@ -94,6 +113,8 @@ def parse_fragments( def create_fragment( self, + start_line: int, + end_line: int, match: "re.Match[str]", content: Optional[str] = None, url: Optional[str] = None, @@ -102,6 +123,8 @@ def create_fragment( """Helper for creating a fragment from a matched pattern.""" directive, modifier, arguments = match.groups() return Fragment( + start_line=start_line, + end_line=end_line, directive=directive, modifier=modifier, arguments=arguments.split(), @@ -123,7 +146,7 @@ def parse_fragments( tokens = self.get_regex(directives).split(source + "\n") it = iter(tokens) - next(it) + newlines = next(it).count("\n") while True: try: @@ -133,6 +156,8 @@ def parse_fragments( else: content = content.partition("\n")[-1] yield Fragment( + start_line=newlines, + end_line=(newlines := newlines + content.count("\n") + 1), directive=directive, modifier=modifier, arguments=arguments.split(), @@ -180,11 +205,14 @@ def parse_fragments( tokens = self.parser.parse(source) # type: ignore regex = self.get_regex(directives) - skip = 1 + skip_to = 0 for i, token in enumerate(tokens): - if skip > 1: - skip -= 1 + if not token.map: + continue + + current_line = token.map[0] + if skip_to > current_line: continue # @@ -196,7 +224,7 @@ def parse_fragments( # if ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 4], "paragraph_open", "inline", @@ -209,7 +237,9 @@ def parse_fragments( and self.match_tokens(inline.children, "code_inline") and (match := regex.match(inline.children[0].content)) ): - yield self.create_fragment(match, content=tokens[i + 3].content) + yield self.create_fragment( + current_line, skip_to, match, content=tokens[i + 3].content + ) # # `@directive args...` @@ -218,7 +248,7 @@ def parse_fragments( # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 6], "paragraph_open", "inline", @@ -237,7 +267,9 @@ def parse_fragments( and (link := image.children[0].attrGet("src")) and (match := regex.match(inline.children[0].content)) ): - yield self.create_link_fragment(match, link, external_files) + yield self.create_link_fragment( + current_line, skip_to, match, link, external_files + ) # # `@directive args...` @@ -252,7 +284,7 @@ def parse_fragments( # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 6], "paragraph_open", "inline", @@ -269,7 +301,9 @@ def parse_fragments( and tokens[i + 5].content == "\n" and (match := regex.match(inline.children[0].content)) ): - yield self.create_fragment(match, content=tokens[i + 4].content) + yield self.create_fragment( + current_line, skip_to, match, content=tokens[i + 4].content + ) # # `@directive args...` @@ -282,7 +316,7 @@ def parse_fragments( # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 8], "paragraph_open", "inline", @@ -305,14 +339,16 @@ def parse_fragments( and (link := image.children[0].attrGet("src")) and (match := regex.match(inline.children[0].content)) ): - yield self.create_link_fragment(match, link, external_files) + yield self.create_link_fragment( + current_line, skip_to, match, link, external_files + ) # # [`@directive args...`](path/to/content) # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 3], "paragraph_open", "inline", @@ -330,7 +366,9 @@ def parse_fragments( and (link := inline.children[0].attrGet("href")) and (match := regex.match(inline.children[1].content)) ): - yield self.create_link_fragment(match, link, external_files) + yield self.create_link_fragment( + current_line, skip_to, match, link, external_files + ) # # @@ -341,7 +379,7 @@ def parse_fragments( # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 2], "html_block", ["fence", "code_block"], @@ -350,7 +388,9 @@ def parse_fragments( and (comment := self.html_comment_regex.match(token.content)) and (match := regex.match(comment.group(1))) ): - yield self.create_fragment(match, content=tokens[i + 1].content) + yield self.create_fragment( + current_line, skip_to, match, content=tokens[i + 1].content + ) # # @@ -359,7 +399,7 @@ def parse_fragments( # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 4], "html_block", "paragraph_open", @@ -374,14 +414,16 @@ def parse_fragments( and (link := image.children[0].attrGet("src")) and (match := regex.match(comment.group(1))) ): - yield self.create_link_fragment(match, link, external_files) + yield self.create_link_fragment( + current_line, skip_to, match, link, external_files + ) # # `@directive args...` # elif ( ( - skip := self.match_tokens( + skip_to := self.match_tokens( tokens[i : i + 3], "paragraph_open", "inline", @@ -393,7 +435,7 @@ def parse_fragments( and self.match_tokens(inline.children, "code_inline") and (match := regex.match(inline.children[0].content)) ): - yield self.create_fragment(match) + yield self.create_fragment(current_line, skip_to, match) # # @@ -403,7 +445,7 @@ def parse_fragments( and (comment := self.html_comment_regex.match(token.content)) and (match := regex.match(comment.group(1))) ): - yield self.create_fragment(match) + yield self.create_fragment(current_line, skip_to, match) # # ``` @@ -413,10 +455,15 @@ def parse_fragments( # ``` # elif token.type in ["fence", "code_block"]: - yield from self.embedded_extractor.parse_fragments( + for fragment in self.embedded_extractor.parse_fragments( token.content, directives, - ) + ): + yield replace( + fragment, + start_line=fragment.start_line + current_line, + end_line=(skip_to := fragment.end_line + current_line), + ) def match_tokens( self, @@ -435,11 +482,13 @@ def match_tokens( ) for token, token_type in zip(tokens, token_types) ) - and len(tokens) + and next((token.map[-1] for token in reversed(tokens) if token.map), 1) ) def create_link_fragment( self, + start_line: int, + end_line: int, match: "re.Match[str]", link: str, external_files: Optional[FileSystemPath] = None, @@ -453,4 +502,4 @@ def create_link_fragment( path = Path(external_files, url).resolve() url = None - return self.create_fragment(match, url=url, path=path) + return self.create_fragment(start_line, end_line, match, url=url, path=path) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index b5e05d607..1a0de98ef 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -27,6 +27,8 @@ def __init__(self, message: str): class Fragment: """Class representing a fragment annotated by a directive.""" + start_line: int + end_line: int directive: str modifier: Optional[str] = None arguments: Sequence[str] = () diff --git a/packages/lectern/tests/test_directive.py b/packages/lectern/tests/test_directive.py index 87c1fe8d0..d11f2ce81 100644 --- a/packages/lectern/tests/test_directive.py +++ b/packages/lectern/tests/test_directive.py @@ -1,7 +1,6 @@ import pytest -from lectern import TextExtractor -from lectern.directive import Fragment, get_builtin_directives +from lectern import Fragment, TextExtractor, get_builtin_directives @pytest.mark.parametrize( @@ -9,15 +8,17 @@ [ ( "@function demo:foo\nsay foo\n", - Fragment("function", None, ["demo:foo"], "say foo\n"), + Fragment(0, 3, "function", None, ["demo:foo"], "say foo\n"), ), ( "@function() demo:foo\nsay foo\n", - Fragment("function", "", ["demo:foo"], "say foo\n"), + Fragment(0, 3, "function", "", ["demo:foo"], "say foo\n"), ), ( "@function(strip_final_newline) demo:foo\nsay foo\n", - Fragment("function", "strip_final_newline", ["demo:foo"], "say foo\n"), + Fragment( + 0, 3, "function", "strip_final_newline", ["demo:foo"], "say foo\n" + ), ), ], ) From 3b8c7efa1b24c16bf808b1523951f1fa8bdc1653 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 20:38:37 +0100 Subject: [PATCH 0099/1554] refactor: separate external files handling --- packages/lectern/lectern/document.py | 26 ++-- packages/lectern/lectern/extract.py | 5 +- packages/lectern/lectern/serialize.py | 189 +++++++++++++++++++------- packages/lectern/lectern/utils.py | 10 -- 4 files changed, 149 insertions(+), 81 deletions(-) delete mode 100644 packages/lectern/lectern/utils.py diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 47890a641..b5cbebe77 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -3,7 +3,6 @@ ] -import os from dataclasses import InitVar, dataclass, field from pathlib import Path from typing import Any, Dict, Literal, MutableMapping, Optional, Tuple, Union, overload @@ -13,7 +12,7 @@ from .directive import Directive, RequireDirective, get_builtin_directives from .extract import MarkdownExtractor, TextExtractor -from .serialize import MarkdownSerializer, TextSerializer +from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer @dataclass @@ -145,21 +144,14 @@ def save( if path.suffix == ".md": if external_files: - external_files = Path(external_files).resolve() - - prefix = os.path.relpath(external_files, path.parent) - prefix = prefix.replace(os.path.sep, "/") - prefix = "" if prefix == "." else prefix.rstrip("/") + "/" - - content, files = self.get_markdown( - emit_external_files=True, - external_prefix=prefix, - ) - - if files: - external_files.mkdir(parents=True, exist_ok=True) - for filename, file_instance in files.items(): - file_instance.dump(external_files, path.parent / filename) + with ExternalFilesManager( + Path(external_files).resolve(), path + ) as manager: + content, files = self.get_markdown( + emit_external_files=True, + external_prefix=manager.external_prefix, + ) + manager.external_files.update(files) else: content = self.get_markdown() else: diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 40e7a9414..86f091b45 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -11,7 +11,7 @@ from itertools import islice from pathlib import Path from typing import Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union -from urllib.parse import unquote +from urllib.parse import unquote, urlparse from beet import Cache, DataPack, ResourcePack from beet.core.utils import FileSystemPath @@ -21,7 +21,6 @@ from .directive import Directive from .fragment import Fragment -from .utils import is_path # Patch markdown_it to allow arbitrary data urls # https://github.com/executablebooks/markdown-it-py/issues/128 @@ -497,7 +496,7 @@ def create_link_fragment( url = unquote(link) # TODO: Will soon be able to use custom normalizeLink path = None - if is_path(url): + if urlparse(url).path == url: if external_files: path = Path(external_files, url).resolve() url = None diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index dd276d4b2..cc260275b 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -1,19 +1,24 @@ __all__ = [ "TextSerializer", "MarkdownSerializer", + "ExternalFilesManager", + "SerializedFile", "NAMESPACED_RESOURCE_DIRECTIVES", "EXTENSION_HIGHLIGHTING", ] +import os from base64 import b64encode +from dataclasses import dataclass, field from itertools import chain from mimetypes import guess_type from pathlib import Path from textwrap import indent -from typing import Any, Dict, Iterator, Optional, Union +from typing import Any, Dict, Iterable, Iterator, Optional, Union +from urllib.parse import urlparse -from beet import DataPack, File, ResourcePack, TextFileBase -from beet.library.base import NamespaceFile +from beet import DataPack, File, NamespaceFile, ResourcePack, TextFileBase +from beet.core.utils import normalize_string from .directive import NamespacedResourceDirective, get_builtin_directives @@ -30,6 +35,94 @@ } +@dataclass +class ExternalFilesManager: + """Class responsible for saving external files.""" + + directory: Path + target: Path + + external_files: Dict[str, File[Any, Any]] = field(default_factory=dict) + external_prefix: str = "" + + def __post_init__(self): + if not self.external_prefix: + prefix = os.path.relpath(self.directory, self.target.parent) + prefix = prefix.replace(os.path.sep, "/") + self.external_prefix = "" if prefix == "." else prefix.rstrip("/") + "/" + + def flush(self): + """Save all the external files.""" + if self.external_files: + self.directory.mkdir(parents=True, exist_ok=True) + for filename, file_instance in self.external_files.items(): + file_instance.dump(self.directory, self.target.parent / filename) + + def __enter__(self) -> "ExternalFilesManager": + return self + + def __exit__(self, *_): + self.flush() + + +@dataclass +class SerializedFile: + """Class representing a file emitted during the serialization process.""" + + hint: str + file_instance: File[Any, Any] + + filename: str = field(init=False) + extension: str = field(init=False) + content_type: str = field(init=False) + + def __post_init__(self): + path = Path(urlparse(self.hint).path) + self.extension = "".join(path.suffixes) + self.filename = normalize_string(path.name[: -len(self.extension)]) + + if not self.extension and isinstance(self.file_instance, NamespaceFile): + self.extension = self.file_instance.extension + + self.content_type = ( + guess_type(f"{self.filename}{self.extension}")[0] + or "application/octet-stream" + ) + + def get_local_path( + self, + external_files: Dict[str, File[Any, Any]], + external_prefix: str = "", + ) -> str: + """Rename the file to prevent conflicts within the given environment.""" + while ( + path := f"{external_prefix}{self.filename}{self.extension}" + ) in external_files: + stem, _, number = self.filename.rpartition("_") + if not number.isdigit(): + stem, number = self.filename, "0" + self.filename = f"{stem}_{int(number) + 1}" + return path + + def get_data_url(self): + """Convert the file to a data url.""" + content = self.file_instance.ensure_serialized() + return f"data:{self.content_type};base64,{b64encode(content).decode()}" + + def generate_link_target( + self, + external_files: Optional[Dict[str, File[Any, Any]]] = None, + external_prefix: str = "", + ) -> str: + """Generate the link for including the file in a serialized document.""" + if external_files is None: + return self.get_data_url() + + local_path = self.get_local_path(external_files, external_prefix) + external_files[local_path] = self.file_instance + return local_path + + class TextSerializer: """Document serializer that outputs plain text.""" @@ -87,7 +180,11 @@ def serialize( ] if pack for text in self.serialize_pack( - title, directive, pack, external_files, external_prefix + title, + directive, + pack, + external_files, + external_prefix, ) ) or "The data pack and resource pack are empty.\n" @@ -98,15 +195,21 @@ def serialize_pack( title: str, pack_directive: str, pack: Union[DataPack, ResourcePack], - external_files: Optional[Dict[str, File[Any, Any]]], + external_files: Optional[Dict[str, File[Any, Any]]] = None, external_prefix: str = "", ) -> Iterator[str]: """Yield markdown chunks for the given pack.""" yield f"## {title}" for path, file_instance in pack.extra.items(): - yield from self.serialize_file_instance( - pack_directive, path, file_instance, external_files, external_prefix + yield from self.format_serialized_file( + self.serialize_file_instance( + pack_directive, + path, + file_instance, + external_files, + external_prefix, + ) ) for name, namespace in pack.items(): @@ -116,35 +219,34 @@ def serialize_pack( directive_name = NAMESPACED_RESOURCE_DIRECTIVES[file_type] for path, file_instance in container.items(): - yield from self.serialize_file_instance( - directive_name, - f"{name}:{path}", - file_instance, - external_files, - external_prefix, + yield from self.format_serialized_file( + self.serialize_file_instance( + directive_name, + f"{name}:{path}", + file_instance, + external_files, + external_prefix, + ) ) yield "" + def format_serialized_file(self, chunks: Iterable[str]) -> Iterator[str]: + """Format the markdown chunks for serializing file instances.""" + chunks = [indent(chunk, " ") for chunk in chunks] + chunks[0] = "\n-" + chunks[0][1:] + yield from chunks + def serialize_file_instance( self, directive: str, argument: str, file_instance: Union[File[Any, Any], NamespaceFile], - external_files: Optional[Dict[str, File[Any, Any]]], + external_files: Optional[Dict[str, File[Any, Any]]] = None, external_prefix: str = "", ) -> Iterator[str]: """Yield markdown chunks for including the given file instance.""" - if directive in ["data_pack", "resource_pack"]: - filename = Path(argument).name - extension = "".join(Path(filename).suffixes) - filename = filename[: -len(extension)] - elif isinstance(file_instance, NamespaceFile): - filename = Path(argument.rpartition(":")[-1]).name - extension = file_instance.extension - else: - filename = f"{directive}_data" - extension = "" + serialized_file = SerializedFile(argument, file_instance) if isinstance(file_instance, TextFileBase): content = file_instance.text @@ -153,35 +255,20 @@ def serialize_file_instance( directive += "(strip_final_newline)" content += "\n" - yield f"\n- `@{directive} {argument}`" - yield "\n
" - yield "\n ```" + EXTENSION_HIGHLIGHTING.get(extension, "") - yield indent(content, " ") + " ```" - yield "\n
" + yield f"`@{directive} {argument}`" + yield "\n
" + yield "\n```" + EXTENSION_HIGHLIGHTING.get(serialized_file.extension, "") + yield content + " ```" + yield "\n
" return - if external_files is None: - content = file_instance.ensure_serialized() - content_type = ( - guess_type(f"{filename}{extension}")[0] or "application/octet-stream" - ) - url = f"data:{content_type};base64,{b64encode(content).decode()}" + target = serialized_file.generate_link_target(external_files, external_prefix) + if serialized_file.content_type.startswith("image/"): + yield f"`@{directive} {argument}`" + yield "\n
" + yield f"\n![{directive}{serialized_file.extension}]({target})" + yield "\n
" else: - while (url := f"{external_prefix}{filename}{extension}") in external_files: - stem, _, number = filename.rpartition("_") - if not number.isdigit(): - stem, number = filename, "0" - filename = f"{stem}_{int(number) + 1}" - - content_type = guess_type(url)[0] or "application/octet-stream" - external_files[url] = file_instance - - if content_type.startswith("image/"): - yield f"\n- `@{directive} {argument}`" - yield "\n
" - yield f"\n ![{directive}{extension}]({url})" - yield "\n
" - else: - yield f"\n- [`@{directive} {argument}`]({url})" + yield f"[`@{directive} {argument}`]({target})" diff --git a/packages/lectern/lectern/utils.py b/packages/lectern/lectern/utils.py deleted file mode 100644 index 541258955..000000000 --- a/packages/lectern/lectern/utils.py +++ /dev/null @@ -1,10 +0,0 @@ -__all__ = [ - "is_path", -] - - -from urllib.parse import urlparse - - -def is_path(url: str) -> bool: - return urlparse(url).path == url From 069c636299450d76b4fea0901e88fccef6088e00 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 21:10:41 +0100 Subject: [PATCH 0100/1554] fix: accidentally broke emitted filenames --- packages/lectern/lectern/serialize.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index cc260275b..93f305c42 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -79,7 +79,9 @@ class SerializedFile: def __post_init__(self): path = Path(urlparse(self.hint).path) self.extension = "".join(path.suffixes) - self.filename = normalize_string(path.name[: -len(self.extension)]) + self.filename = normalize_string( + path.name[: -len(self.extension)] if self.extension else path.name + ) if not self.extension and isinstance(self.file_instance, NamespaceFile): self.extension = self.file_instance.extension @@ -258,7 +260,7 @@ def serialize_file_instance( yield f"`@{directive} {argument}`" yield "\n
" yield "\n```" + EXTENSION_HIGHLIGHTING.get(serialized_file.extension, "") - yield content + " ```" + yield content + "```" yield "\n
" return From b90d5e291c4e2f42c2730810356d864b4b4d605a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 21:38:58 +0100 Subject: [PATCH 0101/1554] feat: add markdown prefetcher --- packages/lectern/lectern/__init__.py | 1 + packages/lectern/lectern/cli.py | 23 +++++++ packages/lectern/lectern/prefetch.py | 97 ++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 packages/lectern/lectern/prefetch.py diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index ee4a95829..bb600f256 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -3,6 +3,7 @@ from .extract import * from .fragment import * from .plugin import * +from .prefetch import * from .serialize import * __version__ = "0.6.1" diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py index 3d2035a02..d0b9f6a87 100644 --- a/packages/lectern/lectern/cli.py +++ b/packages/lectern/lectern/cli.py @@ -12,6 +12,8 @@ from lectern import __version__ +from .prefetch import MarkdownPrefetcher + @click.command(context_settings={"help_option_names": ("-h", "--help")}) @click.pass_context @@ -34,6 +36,12 @@ metavar="", help="Emit external files.", ) +@click.option( + "-p", + "--prefetch-urls", + metavar="", + help="Prefetch markdown links.", +) @click.version_option( __version__, "-v", @@ -47,10 +55,25 @@ def lectern( data_pack: Optional[str], resource_pack: Optional[str], external_files: Optional[str], + prefetch_urls: Optional[str], ): """Literate Minecraft data packs and resource packs.""" config: Any + if prefetch_urls: + if len(path) > 1: + click.echo(ctx.get_usage()) + click.echo("\nError: expected a single output path") + ctx.exit(1) + + prefetcher = MarkdownPrefetcher() + prefetcher.process_file( + prefetch_urls, + path[0] if path else prefetch_urls, + external_files=external_files, + ) + return + if data_pack or resource_pack: config = { "pipeline": ["lectern"], diff --git a/packages/lectern/lectern/prefetch.py b/packages/lectern/lectern/prefetch.py new file mode 100644 index 000000000..2275109ab --- /dev/null +++ b/packages/lectern/lectern/prefetch.py @@ -0,0 +1,97 @@ +__all__ = [ + "MarkdownPrefetcher", +] + + +from dataclasses import InitVar, dataclass, field +from pathlib import Path +from typing import Any, Dict, Mapping, Optional + +from beet import BinaryFile, Cache, File +from beet.core.utils import FileSystemPath + +from .directive import Directive, get_builtin_directives +from .extract import MarkdownExtractor +from .fragment import Fragment +from .serialize import ExternalFilesManager, SerializedFile + + +@dataclass +class MarkdownPrefetcher: + """Prefetcher that rewrites markdown links.""" + + cache: InitVar[Optional[Cache]] = None + + extractor: MarkdownExtractor = field(default_factory=MarkdownExtractor) + + def __post_init__(self, cache: Optional[Cache]): + if cache: + self.extractor.cache = cache + + def process_file( + self, + path: FileSystemPath, + output: FileSystemPath, + directives: Optional[Mapping[str, Directive]] = None, + external_files: Optional[FileSystemPath] = None, + ): + """Prefetch urls in the specified document.""" + if directives is None: + directives = get_builtin_directives() + + path = Path(path).resolve() + output = Path(output).resolve() + + if external_files: + with ExternalFilesManager( + Path(external_files).resolve(), output + ) as manager: + content = self.prefetch_urls( + path.read_text(), + directives, + manager.external_files, + manager.external_prefix, + ) + else: + content = self.prefetch_urls(path.read_text(), directives) + + output.write_text(content) + + def prefetch_urls( + self, + source: str, + directives: Mapping[str, Directive], + external_files: Optional[Dict[str, File[Any, Any]]] = None, + external_prefix: str = "", + ) -> str: + """Replace remote urls in the input by data urls or links to local files.""" + return "".join( + self.rewrite_fragment( + text, + fragment.url, + fragment, + external_files, + external_prefix, + ) + if fragment and fragment.url + else text + for text, fragment in self.extractor.split(source, directives) + ) + + def rewrite_fragment( + self, + text: str, + url: str, + fragment: Fragment, + external_files: Optional[Dict[str, File[Any, Any]]] = None, + external_prefix: str = "", + ) -> str: + """Prefetch the url and return the modified fragment.""" + serialized_file = SerializedFile( + hint=fragment.arguments[0] if fragment.arguments else url, + file_instance=fragment.as_file(BinaryFile), + ) + + return text.replace( + url, serialized_file.generate_link_target(external_files, external_prefix) + ) From 479c066eaae188ed9fbd179b039b637badebf62c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 21:55:50 +0100 Subject: [PATCH 0102/1554] docs: document --prefetch-urls --- packages/lectern/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 097bf451f..d8d310166 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -330,6 +330,7 @@ Options: -d, --data-pack Extract data pack. -r, --resource-pack Extract resource pack. -e, --external-files Emit external files. + -p, --prefetch-urls Prefetch markdown links. -v, --version Show the version and exit. -h, --help Show this message and exit. ``` @@ -370,6 +371,24 @@ $ lectern demo_data_pack demo.md -e . All these commands also work with plain text files. `lectern` will only use the markdown document format when the filename ends with `.md`. +Finally, you can also use the command-line utility to prefetch markdown urls. The `-p/--prefetch-urls` option can replace the urls in-place or in a copy. + +```bash +$ lectern --prefetch-urls demo.md +$ lectern --prefetch-urls demo.md demo_prefetched.md +$ lectern -p demo.md demo_prefetched.md +$ lectern -p demo.md +``` + +By default, the remote files will be bundled as data urls but you can use the `-e/--external-files` option to dump everything in a given directory. + +```bash +$ lectern --prefetch-urls demo.md --external-files files +$ lectern --prefetch-urls demo.md demo_prefetched.md --external-files files +$ lectern -p demo.md demo_prefetched.md -e files +$ lectern -p demo.md -e . +``` + ## Python API The API revolves around `Document` objects. A `lectern` document holds a `DataPack` and a `ResourcePack`, as well as a dictionary defining the usable directives. The extractors and serializers are also exposed on the document to make it possible to swap them out with custom ones if needed. From 8f6b4dfd663725eb311dd4a8fca41a93690eeeab Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 22:20:48 +0100 Subject: [PATCH 0103/1554] feat: add lectern scripts --- packages/lectern/examples/with_beet/beet.json | 6 +++- .../examples/with_beet/other_script.py | 4 +++ .../lectern/examples/with_beet/some_script.py | 6 ++++ packages/lectern/lectern/plugin.py | 11 +++++-- .../examples__beet_project__0.pack.md | 31 +++++++++++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 packages/lectern/examples/with_beet/other_script.py create mode 100644 packages/lectern/examples/with_beet/some_script.py diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index d33f40a2d..a3b258db5 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -3,7 +3,11 @@ "pipeline": ["lectern"], "meta": { "lectern": { - "load": ["*.md"] + "load": ["*.md"], + "scripts": [ + ["python", "some_script.py"], + ["python", "other_script.py"] + ] } } } diff --git a/packages/lectern/examples/with_beet/other_script.py b/packages/lectern/examples/with_beet/other_script.py new file mode 100644 index 000000000..5c96320d6 --- /dev/null +++ b/packages/lectern/examples/with_beet/other_script.py @@ -0,0 +1,4 @@ +print("@function from_script:thing") + +for i in range(10): + print(f"say {i}") diff --git a/packages/lectern/examples/with_beet/some_script.py b/packages/lectern/examples/with_beet/some_script.py new file mode 100644 index 000000000..d4a709c49 --- /dev/null +++ b/packages/lectern/examples/with_beet/some_script.py @@ -0,0 +1,6 @@ +import sys + +print("@function from_script:hello") +print("say hello") + +print("This is not part of the function.", file=sys.stderr) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index a683b87de..0176c8851 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -4,6 +4,7 @@ ] +import subprocess from typing import Iterable, List, Optional, cast from beet import Context @@ -16,17 +17,19 @@ def beet_default(ctx: Context): config = ctx.meta.get("lectern", cast(JsonDict, {})) - load = config.get("load", cast(List[str], [])) + load = config.get("load", ()) snapshot = config.get("snapshot") external_files = config.get("external_files") + scripts = config.get("scripts", ()) - ctx.require(lectern(load, snapshot, external_files)) + ctx.require(lectern(load, snapshot, external_files, scripts)) def lectern( load: Iterable[str] = (), snapshot: Optional[str] = None, external_files: Optional[str] = None, + scripts: Iterable[List[str]] = (), ) -> Plugin: """Return a plugin that handles markdown files with lectern.""" @@ -37,6 +40,10 @@ def plugin(ctx: Context): for path in ctx.directory.glob(pattern): document.load(path) + for arguments in scripts: + stdout = subprocess.check_output(arguments, cwd=ctx.directory).decode() + document.add_text(stdout) + yield if snapshot: diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index ee7551ab9..2e3bf6e9c 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -133,6 +133,37 @@ +### from_script + +- `@function from_script:hello` + +
+ + ```mcfunction + say hello + ``` + +
+ +- `@function from_script:thing` + +
+ + ```mcfunction + say 0 + say 1 + say 2 + say 3 + say 4 + say 5 + say 6 + say 7 + say 8 + say 9 + ``` + +
+ ## Resource pack - `@resource_pack pack.mcmeta` From b227f2e440de479bd4958e399e9be1da4cfe7cd3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 22:43:48 +0100 Subject: [PATCH 0104/1554] docs: document lectern scripts --- packages/lectern/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index d8d310166..acbfdda1b 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -549,6 +549,39 @@ def download_every_day(ctx: Context): ctx.cache["lectern"].timeout(hours=24) ``` +## Lectern scripts + +The text format is pretty well-suited for writing basic data pack and resource pack generators. You can very easily write scripts that produce lectern syntax that can then be turned into a data pack or a resource pack. + +```python +# my_script.py +print("@function tutorial:count") + +for i in range(10): + print(f"say {i}") +``` + +```bash +$ python my_script.py > output.txt +$ lectern output.txt -d my_data_pack +``` + +The `beet` plugin supports this use-case natively and allows you to run lectern scripts within your pipeline. + +```json +// beet.json +{ + "pipeline": ["lectern"], + "meta": { + "lectern": { + "scripts": [["python", "my_script.py"]] + } + } +} +``` + +The `scripts` option lets you specify the command-line arguments for your scripts. The scripts don't even have to be written in Python. As long as the command prints out valid `lectern` syntax you can use any language you want. + ## Snapshot testing A lot of Minecraft tooling involves generating data packs and resource packs. Writing tests for this kind of tooling takes time because you need to painstakingly compare everything that you care about with a reference value. This makes it hard to get good coverage, and then even harder to keep making changes to the code being tested afterwards. You're trading robustness and stability for a shackle that massively slows down development. From 723b1624180d9494be4db5445e9a6b9ed90c34ce Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Mar 2021 22:51:25 +0100 Subject: [PATCH 0105/1554] chore: update lockfile --- packages/lectern/poetry.lock | 141 ++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 52 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 9b877c9a5..e535e08a8 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -217,6 +217,21 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "importlib-metadata" +version = "3.7.2" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + [[package]] name = "iniconfig" version = "1.1.1" @@ -273,13 +288,14 @@ i18n = ["Babel (>=0.8)"] [[package]] name = "keyring" -version = "22.3.0" +version = "23.0.0" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] +importlib-metadata = ">=3.6" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} @@ -378,7 +394,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pillow" -version = "8.1.1" +version = "8.1.2" description = "Python Imaging Library (Fork)" category = "main" optional = false @@ -439,7 +455,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.8.0" +version = "2.8.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -629,7 +645,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "5.0.1" +version = "5.0.2" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false @@ -672,7 +688,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.58.0" +version = "4.59.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -680,6 +696,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] telegram = ["requests"] [[package]] @@ -745,6 +762,18 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "zipp" +version = "3.4.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + [metadata] lock-version = "1.1" python-versions = "^3.8" @@ -870,6 +899,10 @@ idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] +importlib-metadata = [ + {file = "importlib_metadata-3.7.2-py3-none-any.whl", hash = "sha256:407d13f55dc6f2a844e62325d18ad7019a436c4bfcaee34cda35f2be6e7c3e34"}, + {file = "importlib_metadata-3.7.2.tar.gz", hash = "sha256:18d5ff601069f98d5d605b6a4b50c18a34811d655c55548adc833e687289acde"}, +] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -892,8 +925,8 @@ jinja2 = [ {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, ] keyring = [ - {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, - {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, + {file = "keyring-23.0.0-py3-none-any.whl", hash = "sha256:29f407fd5509c014a6086f17338c70215c8d1ab42d5d49e0254273bc0a64bbfc"}, + {file = "keyring-23.0.0.tar.gz", hash = "sha256:237ff44888ba9b3918a7dcb55c8f1db909c95b6f071bfb46c6918f33f453a68a"}, ] markdown-it-py = [ {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, @@ -1000,39 +1033,39 @@ pathspec = [ {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-8.1.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:14415e9e28410232370615dbde0cf0a00e526f522f665460344a5b96973a3086"}, - {file = "Pillow-8.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:924fc33cb4acaf6267b8ca3b8f1922620d57a28470d5e4f49672cea9a841eb08"}, - {file = "Pillow-8.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:df534e64d4f3e84e8f1e1a37da3f541555d947c1c1c09b32178537f0f243f69d"}, - {file = "Pillow-8.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4fe74636ee71c57a7f65d7b21a9f127d842b4fb75511e5d256ace258826eb352"}, - {file = "Pillow-8.1.1-cp36-cp36m-win32.whl", hash = "sha256:3e759bcc03d6f39bc751e56d86bc87252b9a21c689a27c5ed753717a87d53a5b"}, - {file = "Pillow-8.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:292f2aa1ae5c5c1451cb4b558addb88c257411d3fd71c6cf45562911baffc979"}, - {file = "Pillow-8.1.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8211cac9bf10461f9e33fe9a3af6c5131f3fdd0d10672afc2abb2c70cf95c5ca"}, - {file = "Pillow-8.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:d30f30c044bdc0ab8f3924e1eeaac87e0ff8a27e87369c5cac4064b6ec78fd83"}, - {file = "Pillow-8.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7094bbdecb95ebe53166e4c12cf5e28310c2b550b08c07c5dc15433898e2238e"}, - {file = "Pillow-8.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:1022f8f6dc3c5b0dcf928f1c49ba2ac73051f576af100d57776e2b65c1f76a8d"}, - {file = "Pillow-8.1.1-cp37-cp37m-win32.whl", hash = "sha256:a7d690b2c5f7e4a932374615fedceb1e305d2dd5363c1de15961725fe10e7d16"}, - {file = "Pillow-8.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:436b0a2dd9fe3f7aa6a444af6bdf53c1eb8f5ced9ea3ef104daa83f0ea18e7bc"}, - {file = "Pillow-8.1.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:c448d2b335e21951416a30cd48d35588d122a912d5fe9e41900afacecc7d21a1"}, - {file = "Pillow-8.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:bb18422ad00c1fecc731d06592e99c3be2c634da19e26942ba2f13d805005cf2"}, - {file = "Pillow-8.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3ec87bd1248b23a2e4e19e774367fbe30fddc73913edc5f9b37470624f55dc1f"}, - {file = "Pillow-8.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99ce3333b40b7a4435e0a18baad468d44ab118a4b1da0af0a888893d03253f1d"}, - {file = "Pillow-8.1.1-cp38-cp38-win32.whl", hash = "sha256:2f0d7034d5faae9a8d1019d152ede924f653df2ce77d3bba4ce62cd21b5f94ae"}, - {file = "Pillow-8.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:07872f1d8421db5a3fe770f7480835e5e90fddb58f36c216d4a2ac0d594de474"}, - {file = "Pillow-8.1.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:69da5b1d7102a61ce9b45deb2920a2012d52fd8f4201495ea9411d0071b0ec22"}, - {file = "Pillow-8.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a40d7d4b17db87f5b9a1efc0aff56000e1d0d5ece415090c102aafa0ccbe858"}, - {file = "Pillow-8.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:01bb0a34f1a6689b138c0089d670ae2e8f886d2666a9b2f2019031abdea673c4"}, - {file = "Pillow-8.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:43b3c859912e8bf754b3c5142df624794b18eb7ae07cfeddc917e1a9406a3ef2"}, - {file = "Pillow-8.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3b13d89d97b551e02549d1f0edf22bed6acfd6fd2e888cd1e9a953bf215f0e81"}, - {file = "Pillow-8.1.1-cp39-cp39-win32.whl", hash = "sha256:c143c409e7bc1db784471fe9d0bf95f37c4458e879ad84cfae640cb74ee11a26"}, - {file = "Pillow-8.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c5e3c36f02c815766ae9dd91899b1c5b4652f2a37b7a51609f3bd467c0f11fb"}, - {file = "Pillow-8.1.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:8cf77e458bd996dc85455f10fe443c0c946f5b13253773439bcbec08aa1aebc2"}, - {file = "Pillow-8.1.1-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:c10af40ee2f1a99e1ae755ab1f773916e8bca3364029a042cd9161c400416bd8"}, - {file = "Pillow-8.1.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:ff83dfeb04c98bb3e7948f876c17513a34e9a19fd92e292288649164924c1b39"}, - {file = "Pillow-8.1.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9af590adc1e46898a1276527f3cfe2da8048ae43fbbf9b1bf9395f6c99d9b47"}, - {file = "Pillow-8.1.1-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:172acfaf00434a28dddfe592d83f2980e22e63c769ff4a448ddf7b7a38ffd165"}, - {file = "Pillow-8.1.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:33fdbd4f5608c852d97264f9d2e3b54e9e9959083d008145175b86100b275e5b"}, - {file = "Pillow-8.1.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:59445af66b59cc39530b4f810776928d75e95f41e945f0c32a3de4aceb93c15d"}, - {file = "Pillow-8.1.1.tar.gz", hash = "sha256:f6fc18f9c9c7959bf58e6faf801d14fafb6d4717faaf6f79a68c8bb2a13dcf20"}, + {file = "Pillow-8.1.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0"}, + {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5"}, + {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8"}, + {file = "Pillow-8.1.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34"}, + {file = "Pillow-8.1.2-cp36-cp36m-win32.whl", hash = "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71"}, + {file = "Pillow-8.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341"}, + {file = "Pillow-8.1.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6"}, + {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28"}, + {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d"}, + {file = "Pillow-8.1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be"}, + {file = "Pillow-8.1.2-cp37-cp37m-win32.whl", hash = "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55"}, + {file = "Pillow-8.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03"}, + {file = "Pillow-8.1.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e"}, + {file = "Pillow-8.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce"}, + {file = "Pillow-8.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af"}, + {file = "Pillow-8.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06"}, + {file = "Pillow-8.1.2-cp38-cp38-win32.whl", hash = "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09"}, + {file = "Pillow-8.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060"}, + {file = "Pillow-8.1.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1"}, + {file = "Pillow-8.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6"}, + {file = "Pillow-8.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238"}, + {file = "Pillow-8.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910"}, + {file = "Pillow-8.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1"}, + {file = "Pillow-8.1.2-cp39-cp39-win32.whl", hash = "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e"}, + {file = "Pillow-8.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0"}, + {file = "Pillow-8.1.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b"}, + {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2"}, + {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a"}, + {file = "Pillow-8.1.2.tar.gz", hash = "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, @@ -1075,8 +1108,8 @@ pydantic = [ {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, ] pygments = [ - {file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, - {file = "Pygments-2.8.0.tar.gz", hash = "sha256:37a13ba168a02ac54cc5891a42b1caec333e59b66addb7fa633ea8a6d73445c0"}, + {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"}, + {file = "Pygments-2.8.1.tar.gz", hash = "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1173,14 +1206,14 @@ semver = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-5.0.1-py2.7.egg", hash = "sha256:db4ab2e0c2644ba71b1e5212b14ff65dbf0af465796d314a75e0cf6128f605f7"}, - {file = "setuptools_scm-5.0.1-py2.py3-none-any.whl", hash = "sha256:62fa535edb31ece9fa65dc9dcb3056145b8020c8c26c0ef1018aef33db95c40d"}, - {file = "setuptools_scm-5.0.1-py3.5.egg", hash = "sha256:1fc4e25df445351d172bb4788f4d07f9e9ce0e8b7dee6b19584e46110172ca13"}, - {file = "setuptools_scm-5.0.1-py3.6.egg", hash = "sha256:e878036c2527dfd05818727846338be86b2be6955741b85fab2625f63d001021"}, - {file = "setuptools_scm-5.0.1-py3.7.egg", hash = "sha256:eb19b46816fc106a4c2d4180022687eab40f9773cf61390b845afb093d1f4ecd"}, - {file = "setuptools_scm-5.0.1-py3.8.egg", hash = "sha256:48b31488d089270500f120efea723968c01abd85fd4876043a3b7c7ef7d0b761"}, - {file = "setuptools_scm-5.0.1-py3.9.egg", hash = "sha256:b928021c4381f96d577847d540d6e03065f8f8851c768a0c9bc552d463bae0d4"}, - {file = "setuptools_scm-5.0.1.tar.gz", hash = "sha256:c85b6b46d0edd40d2301038cdea96bb6adc14d62ef943e75afb08b3e7bcf142a"}, + {file = "setuptools_scm-5.0.2-py2.7.egg", hash = "sha256:35acc9a3be4fbd4f6f3480eecb3c637dfb5ca1812fe86baf5e6759a0133837cf"}, + {file = "setuptools_scm-5.0.2-py2.py3-none-any.whl", hash = "sha256:bd5c4e37f74c103e117549f89aeb3c244488c4a6422df786d1a7d03257f16b34"}, + {file = "setuptools_scm-5.0.2-py3.5.egg", hash = "sha256:0d4fa3743c7a453f31dae9b44fcc0c869125a323c166a6b39e20122f488addb2"}, + {file = "setuptools_scm-5.0.2-py3.6.egg", hash = "sha256:ce5497a8ff55e81cf88cb402a87dedc7663d2671d5f1303d978ba1afb33c4fb6"}, + {file = "setuptools_scm-5.0.2-py3.7.egg", hash = "sha256:90be2ecff71d92352f59c6371abe017c0859bc617a545ba6aaf4d96951ba7947"}, + {file = "setuptools_scm-5.0.2-py3.8.egg", hash = "sha256:2e8706b90910d66668b3f34aea9cceab3c08ba83fedd78de65ff323edc8a1414"}, + {file = "setuptools_scm-5.0.2-py3.9.egg", hash = "sha256:f23060f0f5b23f26b76e43fb0ef51e5294e4b575f69edab5cfe442635680f2ec"}, + {file = "setuptools_scm-5.0.2.tar.gz", hash = "sha256:83a0cedd3449e3946307811a4c7b9d89c4b5fd464a2fb5eeccd0a5bb158ae5c8"}, ] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, @@ -1199,8 +1232,8 @@ tomlkit = [ {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.58.0-py2.py3-none-any.whl", hash = "sha256:2c44efa73b8914dba7807aefd09653ac63c22b5b4ea34f7a80973f418f1a3089"}, - {file = "tqdm-4.58.0.tar.gz", hash = "sha256:c23ac707e8e8aabb825e4d91f8e17247f9cc14b0d64dd9e97be0781e9e525bba"}, + {file = "tqdm-4.59.0-py2.py3-none-any.whl", hash = "sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7"}, + {file = "tqdm-4.59.0.tar.gz", hash = "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33"}, ] twine = [ {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, @@ -1254,3 +1287,7 @@ webencodings = [ wrapt = [ {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, ] +zipp = [ + {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, + {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, +] From a8de5474bd43618e299bb201c415c915906924e4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 8 Mar 2021 21:52:34 +0000 Subject: [PATCH 0106/1554] 0.7.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 15 +++++++++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 7c7705a88..94ae562ea 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,21 @@ +## v0.7.0 (2021-03-08) +### Feature +* Add lectern scripts ([`0890b9d`](https://github.com/mcbeet/lectern/commit/0890b9dafd219a4ff9a19698c29def0e1d77e855)) +* Add markdown prefetcher ([`e5f65dd`](https://github.com/mcbeet/lectern/commit/e5f65dd0ed01b1066723a176c221627412e12762)) +* Add fragment location ([`d79f987`](https://github.com/mcbeet/lectern/commit/d79f987142a1148171cc005aceb6698c2edb564a)) +* Enhance pytest explanation ([`8f9b18d`](https://github.com/mcbeet/lectern/commit/8f9b18dbc94e1cd760897826fc30254ad1a4718d)) + +### Fix +* Accidentally broke emitted filenames ([`5f034b5`](https://github.com/mcbeet/lectern/commit/5f034b59db0cf64fe056650983ae36efeae98f24)) +* Lanternmc.com now returns a 403 ([`faaa2d3`](https://github.com/mcbeet/lectern/commit/faaa2d3b26bb1b20b3ae6ad73255edb6e11b0840)) + +### Documentation +* Document lectern scripts ([`fea9bbf`](https://github.com/mcbeet/lectern/commit/fea9bbf7682cd756022869eccdccd67a67e532d5)) +* Document --prefetch-urls ([`4b4eaae`](https://github.com/mcbeet/lectern/commit/4b4eaae89fcd118eab2a3ff9a81cd3f340b4f61b)) + ## v0.6.1 (2021-03-03) ### Fix * Make pyright happy ([`f15700c`](https://github.com/mcbeet/lectern/commit/f15700c1c5a5348248ac9947a167fe3931d74c31)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index bb600f256..08a4e6e3b 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.6.1" +__version__ = "0.7.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index f4a55c120..eb79b38fa 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.6.1" +version = "0.7.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 84d265ee854a9ba349019e360ffb4bcf180e663e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Mar 2021 22:20:50 +0000 Subject: [PATCH 0107/1554] chore(deps-dev): bump pyright from 1.1.117 to 1.1.118 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.117 to 1.1.118. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.118/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 3b1162e3b..a339ea18f 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.117" + "pyright": "^1.1.118" } }, "node_modules/pyright": { - "version": "1.1.117", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.117.tgz", - "integrity": "sha512-Ca/AlVYqTNeqaGKOye/Ebda7ODFbGI1JkwWI4vyKdQf2nvEzh0XiHXhf8NpX0/QdkvWD58/OXWLozbKByzNFpg==", + "version": "1.1.118", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.118.tgz", + "integrity": "sha512-nUBcMqJqzcXbNmXPA3BLa5E77lG+APARhBbY0d4q2KGs3Od9FR6YTABK6sUq3O1rVQf4MScz8ji4KbEBsD8FNg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.117", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.117.tgz", - "integrity": "sha512-Ca/AlVYqTNeqaGKOye/Ebda7ODFbGI1JkwWI4vyKdQf2nvEzh0XiHXhf8NpX0/QdkvWD58/OXWLozbKByzNFpg==", + "version": "1.1.118", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.118.tgz", + "integrity": "sha512-nUBcMqJqzcXbNmXPA3BLa5E77lG+APARhBbY0d4q2KGs3Od9FR6YTABK6sUq3O1rVQf4MScz8ji4KbEBsD8FNg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 805287270..ff0c3075e 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.117" + "pyright": "^1.1.118" } } From 9f30f262fefecba8d8a20cc9ee076deba1d3aaa3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 9 Mar 2021 01:02:17 +0100 Subject: [PATCH 0108/1554] fix: rename get_markdown prefix argument --- packages/lectern/lectern/document.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index b5cbebe77..dadeb6dc7 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -104,7 +104,7 @@ def get_text(self) -> str: def get_markdown( self, emit_external_files: Literal[True], - external_prefix: str = "", + prefix: str = "", ) -> Tuple[str, Dict[str, File[Any, Any]]]: ... @@ -115,7 +115,7 @@ def get_markdown(self, emit_external_files: Literal[False] = False) -> str: def get_markdown( self, emit_external_files: bool = False, - external_prefix: str = "", + prefix: str = "", ) -> Union[str, Tuple[str, Dict[str, File[Any, Any]]]]: """Turn the data pack and the resource pack into markdown.""" external_files: Optional[Dict[str, File[Any, Any]]] = ( @@ -126,7 +126,7 @@ def get_markdown( assets=self.assets, data=self.data, external_files=external_files, - external_prefix=external_prefix, + external_prefix=prefix, ) if external_files is None: @@ -149,7 +149,7 @@ def save( ) as manager: content, files = self.get_markdown( emit_external_files=True, - external_prefix=manager.external_prefix, + prefix=manager.external_prefix, ) manager.external_files.update(files) else: From e33bcefeca110169a97f05ceab81376074542fe5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 9 Mar 2021 00:02:59 +0000 Subject: [PATCH 0109/1554] 0.7.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 94ae562ea..1bdd04e1e 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.7.1 (2021-03-09) +### Fix +* Rename get_markdown prefix argument ([`85650fa`](https://github.com/mcbeet/lectern/commit/85650fa930fdeb27b24244b772412e72030b14d3)) + ## v0.7.0 (2021-03-08) ### Feature * Add lectern scripts ([`0890b9d`](https://github.com/mcbeet/lectern/commit/0890b9dafd219a4ff9a19698c29def0e1d77e855)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 08a4e6e3b..dd16602d1 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.7.0" +__version__ = "0.7.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index eb79b38fa..bd13b99ee 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.7.0" +version = "0.7.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From d0ecb861ca27c76b99280b2708adb87cc9e44ae3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 9 Mar 2021 03:20:14 +0100 Subject: [PATCH 0110/1554] style: clean imports --- packages/lectern/lectern/plugin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 0176c8851..0739859c8 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -7,9 +7,8 @@ import subprocess from typing import Iterable, List, Optional, cast -from beet import Context +from beet import Context, Plugin from beet.core.utils import JsonDict -from beet.toolchain.context import Plugin from .document import Document From af396c06be11f495b0ebb49608c752b5ed42b4c9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 9 Mar 2021 03:31:28 +0100 Subject: [PATCH 0111/1554] style: use subprocess.run --- packages/lectern/lectern/plugin.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 0739859c8..d7317d1c7 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -40,8 +40,13 @@ def plugin(ctx: Context): document.load(path) for arguments in scripts: - stdout = subprocess.check_output(arguments, cwd=ctx.directory).decode() - document.add_text(stdout) + result = subprocess.run( + arguments, + cwd=ctx.directory, + check=True, + stdout=subprocess.PIPE, + ) + document.add_text(result.stdout.decode()) yield From 0ef8df74896629cfefa0545d6a171d80b573bca8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Mar 2021 04:52:36 +0000 Subject: [PATCH 0112/1554] chore(deps): bump beet from 0.11.1 to 0.12.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.11.1 to 0.12.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.11.1...v0.12.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 0312fe0e1..f1c306dff 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.11.1" +version = "0.12.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "676abcb43111d46f2e8768cc23abb983488061dc9671c21864af989829f5ffee" +content-hash = "c1bb93388a478861d1917c8d0b95a2400a5f98b895d80e7fa5d8b598b28cc5a9" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.11.1-py3-none-any.whl", hash = "sha256:1c81989cf27fb3db6ab962d809953745315af6e715bf38eeec2ea584e9678bfe"}, - {file = "beet-0.11.1.tar.gz", hash = "sha256:a2977066a386aa4e333d07653f5ec6d064cc2c081543deb3754814ce6101ccf1"}, + {file = "beet-0.12.0-py3-none-any.whl", hash = "sha256:b6b775c037ea47e5b94f5b521ba0ba55d802b9c6ddebac5099e66d84dce49e3d"}, + {file = "beet-0.12.0.tar.gz", hash = "sha256:d520c9b6f491207e2ff569ba2faec85ec8f4af99527f818ecf62ea9d900b65de"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1a1203e64..451e2171d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.12.0" +beet = ">=0.5.1,<0.13.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 3c15e400416d0329ed56a94b1e14de7c953b8c75 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 9 Mar 2021 18:51:43 +0100 Subject: [PATCH 0113/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index e535e08a8..92ec9d53e 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.11.1" +version = "0.12.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "62613aa440404f35e46037f6fd16b2b416e801513f90ee68c93fcd751df037b2" +content-hash = "d9a42060b9ff95e2f6fbb6834363e633f6b5b44c1bdbc6b4b49591fcfa226a61" [metadata.files] appdirs = [ @@ -793,8 +793,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.11.1-py3-none-any.whl", hash = "sha256:1c81989cf27fb3db6ab962d809953745315af6e715bf38eeec2ea584e9678bfe"}, - {file = "beet-0.11.1.tar.gz", hash = "sha256:a2977066a386aa4e333d07653f5ec6d064cc2c081543deb3754814ce6101ccf1"}, + {file = "beet-0.12.0-py3-none-any.whl", hash = "sha256:b6b775c037ea47e5b94f5b521ba0ba55d802b9c6ddebac5099e66d84dce49e3d"}, + {file = "beet-0.12.0.tar.gz", hash = "sha256:d520c9b6f491207e2ff569ba2faec85ec8f4af99527f818ecf62ea9d900b65de"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index bd13b99ee..c54b4bc7d 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.11.1" +beet = "^0.12.0" markdown-it-py = "^0.6.2" click = "^7.1.2" From 15150cac010b257d657fe0fe8f306c56506f9589 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Mar 2021 04:51:16 +0000 Subject: [PATCH 0114/1554] chore(deps): bump beet from 0.12.0 to 0.13.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.12.0 to 0.13.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.12.0...v0.13.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f1c306dff..834ce0ebe 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.12.0" +version = "0.13.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "c1bb93388a478861d1917c8d0b95a2400a5f98b895d80e7fa5d8b598b28cc5a9" +content-hash = "1659a8336814990a3a039695fa1588aefc879c23d7c054ba1f9dd3bb0b58b7f9" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.12.0-py3-none-any.whl", hash = "sha256:b6b775c037ea47e5b94f5b521ba0ba55d802b9c6ddebac5099e66d84dce49e3d"}, - {file = "beet-0.12.0.tar.gz", hash = "sha256:d520c9b6f491207e2ff569ba2faec85ec8f4af99527f818ecf62ea9d900b65de"}, + {file = "beet-0.13.0-py3-none-any.whl", hash = "sha256:7549462f44dd1a35478c1368f99230cd6f0b7e6f8f52812cfd61df5ace1cfbb0"}, + {file = "beet-0.13.0.tar.gz", hash = "sha256:6fbcbd561ec5d2f6f08d5487e679f396d725a1871ae47fb7f9efad4f2bdd45ea"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 451e2171d..3aa79d18f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.13.0" +beet = ">=0.5.1,<0.14.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 645f8f350f793a7579b61d1b6a3226c9374e292c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Mar 2021 08:42:24 +0000 Subject: [PATCH 0115/1554] chore(deps-dev): bump pyright from 1.1.118 to 1.1.121 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.118 to 1.1.121. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.121/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index a339ea18f..9466c7b38 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.118" + "pyright": "^1.1.121" } }, "node_modules/pyright": { - "version": "1.1.118", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.118.tgz", - "integrity": "sha512-nUBcMqJqzcXbNmXPA3BLa5E77lG+APARhBbY0d4q2KGs3Od9FR6YTABK6sUq3O1rVQf4MScz8ji4KbEBsD8FNg==", + "version": "1.1.121", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.121.tgz", + "integrity": "sha512-jb0BwO3nbiF808SDMpT4UXg30ats+8nsHyu4zTlSt1p4ZWl6+GNP98peDQyOYzgnoScTMomDYTDXejAAD3M+WA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.118", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.118.tgz", - "integrity": "sha512-nUBcMqJqzcXbNmXPA3BLa5E77lG+APARhBbY0d4q2KGs3Od9FR6YTABK6sUq3O1rVQf4MScz8ji4KbEBsD8FNg==", + "version": "1.1.121", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.121.tgz", + "integrity": "sha512-jb0BwO3nbiF808SDMpT4UXg30ats+8nsHyu4zTlSt1p4ZWl6+GNP98peDQyOYzgnoScTMomDYTDXejAAD3M+WA==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index ff0c3075e..3d1ce8db8 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.118" + "pyright": "^1.1.121" } } From eec390ee6a357b48e43a80db1f4981f5906289e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Mar 2021 08:47:19 +0000 Subject: [PATCH 0116/1554] chore(deps): bump beet from 0.12.0 to 0.13.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.12.0 to 0.13.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.12.0...v0.13.0) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 92ec9d53e..823b6c678 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.12.0" +version = "0.13.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d9a42060b9ff95e2f6fbb6834363e633f6b5b44c1bdbc6b4b49591fcfa226a61" +content-hash = "d4f73aa06c1f24b8da88a2e9ccc50f21a94d59a0b5c19045f9d33555d61c3bf1" [metadata.files] appdirs = [ @@ -793,8 +793,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.12.0-py3-none-any.whl", hash = "sha256:b6b775c037ea47e5b94f5b521ba0ba55d802b9c6ddebac5099e66d84dce49e3d"}, - {file = "beet-0.12.0.tar.gz", hash = "sha256:d520c9b6f491207e2ff569ba2faec85ec8f4af99527f818ecf62ea9d900b65de"}, + {file = "beet-0.13.0-py3-none-any.whl", hash = "sha256:7549462f44dd1a35478c1368f99230cd6f0b7e6f8f52812cfd61df5ace1cfbb0"}, + {file = "beet-0.13.0.tar.gz", hash = "sha256:6fbcbd561ec5d2f6f08d5487e679f396d725a1871ae47fb7f9efad4f2bdd45ea"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index c54b4bc7d..6955da4b5 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.12.0" +beet = ">=0.12,<0.14" markdown-it-py = "^0.6.2" click = "^7.1.2" From 6a340db1d21cac3b76dd32b54c506994612a4db9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 17 Mar 2021 03:26:49 +0100 Subject: [PATCH 0117/1554] fix: take the backticks into account for code fence start line --- packages/lectern/lectern/extract.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 86f091b45..8c4bb6fc7 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -454,13 +454,14 @@ def parse_fragments( # ``` # elif token.type in ["fence", "code_block"]: + offset = int(token.type == "fence") for fragment in self.embedded_extractor.parse_fragments( token.content, directives, ): yield replace( fragment, - start_line=fragment.start_line + current_line, + start_line=fragment.start_line + current_line + offset, end_line=(skip_to := fragment.end_line + current_line), ) From ec7f074a559e44614c00d4a511a507fa28e793e8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 17 Mar 2021 03:27:52 +0100 Subject: [PATCH 0118/1554] fix: report line number in error messages --- packages/lectern/lectern/fragment.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index 1a0de98ef..b0e1d5448 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -18,9 +18,9 @@ class InvalidFragment(FormattedPipelineException): """Raised when a fragment can not be processed.""" - def __init__(self, message: str): - super().__init__(message) - self.message = message + def __init__(self, message: str, line: int): + super().__init__(message, line) + self.message = message + f" (line {line + 1})" @dataclass(frozen=True) @@ -53,10 +53,10 @@ def expect(self, *names: str): """Check directive arguments.""" if missing := names[len(self.arguments) :]: msg = f"Missing argument {', '.join(map(repr, missing))} for directive @{self.directive}." - raise InvalidFragment(msg) + raise InvalidFragment(msg, self.start_line) if extra := self.arguments[len(names) :]: msg = f"Unexpected argument {', '.join(map(repr, extra))} for directive @{self.directive}." - raise InvalidFragment(msg) + raise InvalidFragment(msg, self.start_line) if len(self.arguments) == 0: return if len(self.arguments) == 1: @@ -89,6 +89,6 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: else: msg = f"Expected content, path or url for directive @{self.directive}." - raise InvalidFragment(msg) + raise InvalidFragment(msg, self.start_line) return file_type(content if is_binary else content.decode(errors="replace")) From d82b8bbfbd725c3a76f72040f6069afac06ab964 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 17 Mar 2021 04:11:45 +0100 Subject: [PATCH 0119/1554] feat: add hidden fragments --- packages/lectern/README.md | 22 ++++++++++ packages/lectern/examples/html_comments.md | 19 +++++++++ packages/lectern/lectern/extract.py | 25 ++++++++++++ .../examples__markdown_README_md__0.pack.md | 20 ++++++++++ ...kdown_examples_html_comments_md__0.pack.md | 40 +++++++++++++++++++ .../README.md | 20 ++++++++++ .../examples__text_README_md__0.pack.txt | 6 +++ ...text_examples_html_comments_md__0.pack.txt | 13 ++++++ 8 files changed, 165 insertions(+) create mode 100644 packages/lectern/examples/html_comments.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_html_comments_md__0.pack.txt diff --git a/packages/lectern/README.md b/packages/lectern/README.md index acbfdda1b..4303d9f89 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -276,6 +276,28 @@ You can include inline markdown images in the output data pack or resource pack Image fragments support the same variations as code block fragments. You can put the directive in a comment or surround the image with a `
` element to make it foldable. +## Hidden fragments + +You can use html comments to add fragments that will be completely hidden in the rendered markdown. + +```html + +``` + + + ## Modifiers The behavior of particular directives can be adjusted with modifiers. A modifier is specified between parentheses right after the name of the directive. diff --git a/packages/lectern/examples/html_comments.md b/packages/lectern/examples/html_comments.md new file mode 100644 index 000000000..872db44d1 --- /dev/null +++ b/packages/lectern/examples/html_comments.md @@ -0,0 +1,19 @@ + + +And another comment: + + diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 8c4bb6fc7..017ae3a80 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -176,12 +176,14 @@ class MarkdownExtractor(Extractor): """Extractor for markdown files.""" embedded_extractor: TextExtractor + comment_extractor: TextExtractor parser: MarkdownIt html_comment_regex: "re.Pattern[str]" def __init__(self, cache: Optional[Cache] = None): super().__init__(cache) self.embedded_extractor = EmbeddedExtractor(cache) + self.comment_extractor = TextExtractor(cache) self.parser = MarkdownIt() self.html_comment_regex = re.compile(r"") @@ -465,6 +467,29 @@ def parse_fragments( end_line=(skip_to := fragment.end_line + current_line), ) + # + # + # + elif ( + token.type == "html_block" + and (html := token.content.rstrip()) + and html.startswith("") + ): + for fragment in self.comment_extractor.parse_fragments( + html[4:-3], + directives, + ): + yield replace( + fragment, + start_line=fragment.start_line + current_line, + end_line=(skip_to := fragment.end_line + current_line), + ) + def match_tokens( self, tokens: Optional[List[Token]], diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index 149a29fc9..07e89a5ec 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -48,6 +48,26 @@
+- `@function tutorial:hidden` + +
+ + ```mcfunction + say This will not appear in the rendered markdown. + ``` + +
+ +- `@function tutorial:also_hidden` + +
+ + ```mcfunction + say This is also hidden. + ``` + +
+ - `@function(strip_final_newline) tutorial:stripped`
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md new file mode 100644 index 000000000..4f29741c1 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md @@ -0,0 +1,40 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "description": "My description", + "pack_format": 6 + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + say foo + ``` + +
+ +- `@function demo:bar` + +
+ + ```mcfunction + say bar + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index c1961f617..5a929ab75 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -48,6 +48,26 @@
+- `@function tutorial:hidden` + +
+ + ```mcfunction + say This will not appear in the rendered markdown. + ``` + +
+ +- `@function tutorial:also_hidden` + +
+ + ```mcfunction + say This is also hidden. + ``` + +
+ - `@function(strip_final_newline) tutorial:stripped`
diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index d83b261bd..f52922f15 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -16,6 +16,12 @@ say This is added afterwards. @function tutorial:obtained_dead_bush say You obtained a dead bush! +@function tutorial:hidden +say This will not appear in the rendered markdown. + +@function tutorial:also_hidden +say This is also hidden. + @function tutorial:stripped say This function doesn't have a final newline. @advancement tutorial:obtained_dead_bush diff --git a/packages/lectern/tests/snapshots/examples__text_examples_html_comments_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_html_comments_md__0.pack.txt new file mode 100644 index 000000000..bfcd96f98 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_html_comments_md__0.pack.txt @@ -0,0 +1,13 @@ +@data_pack pack.mcmeta +{ + "pack": { + "description": "My description", + "pack_format": 6 + } +} + +@function demo:foo +say foo + +@function demo:bar +say bar From 6c4c18fb08ed1bce3aa2d3674df43f1f5e40a089 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 17 Mar 2021 03:12:33 +0000 Subject: [PATCH 0120/1554] 0.8.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 8 ++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 1bdd04e1e..3883171e2 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.8.0 (2021-03-17) +### Feature +* Add hidden fragments ([`510a213`](https://github.com/mcbeet/lectern/commit/510a2131906257893e23e452dee6336dc38a94eb)) + +### Fix +* Report line number in error messages ([`c998d68`](https://github.com/mcbeet/lectern/commit/c998d6877c33a91d6ef6a8f9b5cac8dbd0db53dd)) +* Take the backticks into account for code fence start line ([`a2c442c`](https://github.com/mcbeet/lectern/commit/a2c442c628ea1087d8f898b9ff504f627070f2f2)) + ## v0.7.1 (2021-03-09) ### Fix * Rename get_markdown prefix argument ([`85650fa`](https://github.com/mcbeet/lectern/commit/85650fa930fdeb27b24244b772412e72030b14d3)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index dd16602d1..f1fbaf5cd 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.7.1" +__version__ = "0.8.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 6955da4b5..af89928c5 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.7.1" +version = "0.8.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 3f389efec84ada97c1f24027d4759fc3785e3497 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 17 Mar 2021 04:38:04 +0100 Subject: [PATCH 0121/1554] fix: make the directive comment regex a little more forgiving --- packages/lectern/lectern/extract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 017ae3a80..de01cf59b 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -185,7 +185,7 @@ def __init__(self, cache: Optional[Cache] = None): self.embedded_extractor = EmbeddedExtractor(cache) self.comment_extractor = TextExtractor(cache) self.parser = MarkdownIt() - self.html_comment_regex = re.compile(r"") + self.html_comment_regex = re.compile(r"\s*\s*") def extract( self, From 15534a36baffa51aa5cced395aa2f86e4456ece1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 17 Mar 2021 03:38:51 +0000 Subject: [PATCH 0122/1554] 0.8.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 3883171e2..45c62d9f2 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.1 (2021-03-17) +### Fix +* Make the directive comment regex a little more forgiving ([`0471780`](https://github.com/mcbeet/lectern/commit/0471780274e10b3bab2d66d04529af5b269618a4)) + ## v0.8.0 (2021-03-17) ### Feature * Add hidden fragments ([`510a213`](https://github.com/mcbeet/lectern/commit/510a2131906257893e23e452dee6336dc38a94eb)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index f1fbaf5cd..66678dd7d 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.8.0" +__version__ = "0.8.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index af89928c5..70b2afb77 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.8.0" +version = "0.8.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 14546e4f3c772bd837b9aa042c78221d529e2240 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Mar 2021 04:55:50 +0000 Subject: [PATCH 0123/1554] chore(deps): bump beet from 0.13.0 to 0.14.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.13.0 to 0.14.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.13.0...v0.14.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 834ce0ebe..5aa6e719e 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.13.0" +version = "0.14.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "1659a8336814990a3a039695fa1588aefc879c23d7c054ba1f9dd3bb0b58b7f9" +content-hash = "64eb576d2e5d5393b0ff0250085f4dc84607d0a71c1c4256ffafd6b141af5bee" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.13.0-py3-none-any.whl", hash = "sha256:7549462f44dd1a35478c1368f99230cd6f0b7e6f8f52812cfd61df5ace1cfbb0"}, - {file = "beet-0.13.0.tar.gz", hash = "sha256:6fbcbd561ec5d2f6f08d5487e679f396d725a1871ae47fb7f9efad4f2bdd45ea"}, + {file = "beet-0.14.0-py3-none-any.whl", hash = "sha256:7a64bf45b2cc8bbe74ec8e89dc79dbc13acc328196618475d290f8355c03b5ac"}, + {file = "beet-0.14.0.tar.gz", hash = "sha256:2568aaff2bbc3ab8b8010f7c3888148c5818ae84948a88205176785864ebecc5"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3aa79d18f..d9cfd4259 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.14.0" +beet = ">=0.5.1,<0.15.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From e34ec4f26c8e628f4d193001eb088defd4a68852 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Mar 2021 07:09:51 +0000 Subject: [PATCH 0124/1554] chore(deps-dev): bump pyright from 1.1.121 to 1.1.123 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.121 to 1.1.123. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.123/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 9466c7b38..92d41b8d0 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.121" + "pyright": "^1.1.123" } }, "node_modules/pyright": { - "version": "1.1.121", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.121.tgz", - "integrity": "sha512-jb0BwO3nbiF808SDMpT4UXg30ats+8nsHyu4zTlSt1p4ZWl6+GNP98peDQyOYzgnoScTMomDYTDXejAAD3M+WA==", + "version": "1.1.123", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.123.tgz", + "integrity": "sha512-EYjELbm4G4icuIki6PfpzYrxNeGH78vNbXNmsbb/9XnnVQISdFcbc9oOBc2mU77enUwZctwZ6Nj2mZUMD9VibQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.121", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.121.tgz", - "integrity": "sha512-jb0BwO3nbiF808SDMpT4UXg30ats+8nsHyu4zTlSt1p4ZWl6+GNP98peDQyOYzgnoScTMomDYTDXejAAD3M+WA==", + "version": "1.1.123", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.123.tgz", + "integrity": "sha512-EYjELbm4G4icuIki6PfpzYrxNeGH78vNbXNmsbb/9XnnVQISdFcbc9oOBc2mU77enUwZctwZ6Nj2mZUMD9VibQ==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 3d1ce8db8..25d733756 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.121" + "pyright": "^1.1.123" } } From af51420a5a8b1db24fa04cfda20e5d0ce3195bb3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Mar 2021 10:13:19 +0100 Subject: [PATCH 0125/1554] fix: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 823b6c678..1aa460a7d 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.13.0" +version = "0.15.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d4f73aa06c1f24b8da88a2e9ccc50f21a94d59a0b5c19045f9d33555d61c3bf1" +content-hash = "593ac6d5111e87f4dacf5fb72f85feab318a689e306ae3955ce6ed4e39caab41" [metadata.files] appdirs = [ @@ -793,8 +793,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.13.0-py3-none-any.whl", hash = "sha256:7549462f44dd1a35478c1368f99230cd6f0b7e6f8f52812cfd61df5ace1cfbb0"}, - {file = "beet-0.13.0.tar.gz", hash = "sha256:6fbcbd561ec5d2f6f08d5487e679f396d725a1871ae47fb7f9efad4f2bdd45ea"}, + {file = "beet-0.15.0-py3-none-any.whl", hash = "sha256:7bf47242ec74c76c30932e138b56249a855b60fcdf62c0d35b8f97dd83f1d624"}, + {file = "beet-0.15.0.tar.gz", hash = "sha256:ff3ec79312eb3964bb5cb1ca3c2d0b1530e6288271538406f1ec420d0c7e973a"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 70b2afb77..1400a74ac 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.12,<0.14" +beet = "^0.15.0" markdown-it-py = "^0.6.2" click = "^7.1.2" From 039d9f6255447df4ee12cdf26b9cce2f87f6dc40 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Mar 2021 09:14:45 +0000 Subject: [PATCH 0126/1554] 0.8.2 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 45c62d9f2..f7ec68259 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.2 (2021-03-19) +### Fix +* Update beet ([`87b0931`](https://github.com/mcbeet/lectern/commit/87b0931c9ec156af4ea468ca27084dd69d92545a)) + ## v0.8.1 (2021-03-17) ### Fix * Make the directive comment regex a little more forgiving ([`0471780`](https://github.com/mcbeet/lectern/commit/0471780274e10b3bab2d66d04529af5b269618a4)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 66678dd7d..c1b834249 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.8.1" +__version__ = "0.8.2" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 1400a74ac..66920a9df 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.8.1" +version = "0.8.2" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 45a0b198df34017b4ca1156b4f03458705ecb44e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:45:09 +0000 Subject: [PATCH 0127/1554] chore(deps): [security] bump jinja2 from 2.11.2 to 2.11.3 Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.2 to 2.11.3. **This update includes a security fix.** - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/master/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/2.11.2...2.11.3) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 5aa6e719e..2e3a611ce 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -259,7 +259,7 @@ test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] name = "jinja2" -version = "2.11.2" +version = "2.11.3" description = "A very fast and expressive template engine." category = "main" optional = false @@ -823,8 +823,8 @@ jeepney = [ {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, ] keyring = [ {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, From ba9b0381d839b5e5c7579ced46548fdbaffc03fc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 21 Mar 2021 06:01:32 +0100 Subject: [PATCH 0128/1554] feat: update beet and add shader highlighting BREAKING CHANGE: `@shader_program` directive renamed to `@shader` --- packages/lectern/README.md | 26 +++++++++++++------------- packages/lectern/lectern/directive.py | 8 ++++++-- packages/lectern/lectern/serialize.py | 3 +++ packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 4303d9f89..6e724ca6a 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -125,18 +125,18 @@ Here is a reference of all the supported resources: | ------------------------------- | ------------------ | | `@advancement` | `@blockstate` | | `@function` | `@model` | -| `@loot_table` | `@font` | -| `@predicate` | `@glyph_sizes` | -| `@recipe` | `@truetype_font` | -| `@structure` | `@shader_post` | -| `@block_tag` | `@shader_program` | -| `@entity_type_tag` | `@fragment_shader` | -| `@fluid_tag` | `@vertex_shader` | -| `@function_tag` | `@text` | -| `@item_tag` | `@texture_mcmeta` | -| `@dimension_type` | `@texture` | -| `@dimension` | | -| `@biome` | | +| `@loot_table` | `@language` | +| `@predicate` | `@font` | +| `@recipe` | `@glyph_sizes` | +| `@structure` | `@truetype_font` | +| `@block_tag` | `@shader_post` | +| `@entity_type_tag` | `@shader` | +| `@fluid_tag` | `@fragment_shader` | +| `@function_tag` | `@vertex_shader` | +| `@item_tag` | `@glsl_shader` | +| `@dimension_type` | `@text` | +| `@dimension` | `@texture_mcmeta` | +| `@biome` | `@texture` | | `@configured_carver` | | | `@configured_feature` | | | `@configured_structure_feature` | | @@ -546,7 +546,7 @@ from beet import Context, DataPack, ResourcePack, Function from lectern import Document, Fragment def hello_directive(ctx: Context): - """"Plugin that defines the `@hello ` directive.""" + """Plugin that defines the `@hello ` directive.""" document = ctx.inject(Document) document.directives["hello"] = hello diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 186a640ab..d7af86b5c 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -45,10 +45,12 @@ Blockstate, Font, FragmentShader, + GlslShader, GlyphSizeFile, + Language, Model, + Shader, ShaderPost, - ShaderProgram, Text, Texture, TextureMcmeta, @@ -175,13 +177,15 @@ def get_builtin_directives() -> Dict[ "blockstate": NamespacedResourceDirective(Blockstate), "model": NamespacedResourceDirective(Model), + "language": NamespacedResourceDirective(Language), "font": NamespacedResourceDirective(Font), "glyph_sizes": NamespacedResourceDirective(GlyphSizeFile), "truetype_font": NamespacedResourceDirective(TrueTypeFont), "shader_post": NamespacedResourceDirective(ShaderPost), - "shader_program": NamespacedResourceDirective(ShaderProgram), + "shader": NamespacedResourceDirective(Shader), "fragment_shader": NamespacedResourceDirective(FragmentShader), "vertex_shader": NamespacedResourceDirective(VertexShader), + "glsl_shader": NamespacedResourceDirective(GlslShader), "text": NamespacedResourceDirective(Text), "texture_mcmeta": NamespacedResourceDirective(TextureMcmeta), "texture": NamespacedResourceDirective(Texture), diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 93f305c42..89d359d09 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -32,6 +32,9 @@ ".mcfunction": "mcfunction", ".json": "json", ".mcmeta": "json", + ".fsh": "glsl", + ".vsh": "glsl", + ".glsl": "glsl", } diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 1aa460a7d..9c6a56f1b 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.15.0" +version = "0.16.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "593ac6d5111e87f4dacf5fb72f85feab318a689e306ae3955ce6ed4e39caab41" +content-hash = "0cdf2b14ff0d4f9f99c541a70a3f22ebdf5f37f4222c79f73d2c6287f097b9aa" [metadata.files] appdirs = [ @@ -793,8 +793,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.15.0-py3-none-any.whl", hash = "sha256:7bf47242ec74c76c30932e138b56249a855b60fcdf62c0d35b8f97dd83f1d624"}, - {file = "beet-0.15.0.tar.gz", hash = "sha256:ff3ec79312eb3964bb5cb1ca3c2d0b1530e6288271538406f1ec420d0c7e973a"}, + {file = "beet-0.16.0-py3-none-any.whl", hash = "sha256:4f54177be050f367842180ab58792a8c044ab5a3163884b887d558bf386c152b"}, + {file = "beet-0.16.0.tar.gz", hash = "sha256:343371c31b7a11189f67272ac6c21ff9220a8c1d94dd77ed8d5fd8a73657d7df"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 66920a9df..dc9874158 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.15.0" +beet = "^0.16.0" markdown-it-py = "^0.6.2" click = "^7.1.2" From 766f561296a16ea1e08c6a165620a2abcb78930f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 21 Mar 2021 05:02:57 +0000 Subject: [PATCH 0129/1554] 0.9.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 7 +++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index f7ec68259..6153522ec 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.9.0 (2021-03-21) +### Feature +* Update beet and add shader highlighting ([`13e4659`](https://github.com/mcbeet/lectern/commit/13e465995c09a7bc9d974c64e829fca82721fb39)) + +### Breaking +* `@shader_program` directive renamed to `@shader` ([`13e4659`](https://github.com/mcbeet/lectern/commit/13e465995c09a7bc9d974c64e829fca82721fb39)) + ## v0.8.2 (2021-03-19) ### Fix * Update beet ([`87b0931`](https://github.com/mcbeet/lectern/commit/87b0931c9ec156af4ea468ca27084dd69d92545a)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index c1b834249..496793a50 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.8.2" +__version__ = "0.9.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index dc9874158..6fe888228 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.8.2" +version = "0.9.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 1155c5cd00798b1d2ef15cd44300b7752af327b0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Mar 2021 04:53:01 +0000 Subject: [PATCH 0130/1554] chore(deps): bump beet from 0.14.0 to 0.16.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.14.0 to 0.16.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.14.0...v0.16.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 2e3a611ce..e58670d71 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.14.0" +version = "0.16.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "64eb576d2e5d5393b0ff0250085f4dc84607d0a71c1c4256ffafd6b141af5bee" +content-hash = "f12de0c709314bd44b3fe501a68e1603ced004b779b632a6f5976c0977fdec1c" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.14.0-py3-none-any.whl", hash = "sha256:7a64bf45b2cc8bbe74ec8e89dc79dbc13acc328196618475d290f8355c03b5ac"}, - {file = "beet-0.14.0.tar.gz", hash = "sha256:2568aaff2bbc3ab8b8010f7c3888148c5818ae84948a88205176785864ebecc5"}, + {file = "beet-0.16.0-py3-none-any.whl", hash = "sha256:4f54177be050f367842180ab58792a8c044ab5a3163884b887d558bf386c152b"}, + {file = "beet-0.16.0.tar.gz", hash = "sha256:343371c31b7a11189f67272ac6c21ff9220a8c1d94dd77ed8d5fd8a73657d7df"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index d9cfd4259..4091abf4f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.15.0" +beet = ">=0.5.1,<0.17.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From aa89ea82bd4e35ec376f04634c21201977cab986 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Mar 2021 04:57:08 +0000 Subject: [PATCH 0131/1554] chore(deps-dev): bump isort from 5.7.0 to 5.8.0 Bumps [isort](https://github.com/pycqa/isort) from 5.7.0 to 5.8.0. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/develop/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.7.0...5.8.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e58670d71..f03d4ff7a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -235,7 +235,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.7.0" +version = "5.8.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f12de0c709314bd44b3fe501a68e1603ced004b779b632a6f5976c0977fdec1c" +content-hash = "fef414aacd2feb65b2b2b30fe5aa5207d1e29dabc4df7ec9e582732457e60a38" [metadata.files] appdirs = [ @@ -815,8 +815,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, - {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, + {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, + {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4091abf4f..534194ddc 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.5.1,<0.17.0" [tool.poetry.dev-dependencies] black = "^20.8b1" -isort = "^5.7.0" +isort = "^5.8.0" pytest = "^6.2.2" python-semantic-release = "^7.15.0" From 272eda4570c53a30607e78195cb6cb5b5618811a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Mar 2021 08:50:28 +0000 Subject: [PATCH 0132/1554] chore(deps-dev): bump isort from 5.7.0 to 5.8.0 Bumps [isort](https://github.com/pycqa/isort) from 5.7.0 to 5.8.0. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/develop/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.7.0...5.8.0) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 9c6a56f1b..a72e8b3bc 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -250,7 +250,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.7.0" +version = "5.8.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0cdf2b14ff0d4f9f99c541a70a3f22ebdf5f37f4222c79f73d2c6287f097b9aa" +content-hash = "406a9c94ce7f0188d0a09e95054d3c69581ca2d616c15771d1d755bf9042dd2b" [metadata.files] appdirs = [ @@ -913,8 +913,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, - {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, + {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, + {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 6fe888228..f3925ce3e 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -33,7 +33,7 @@ click = "^7.1.2" black = "^20.8b1" rope = "^0.18.0" pytest = "^6.2.2" -isort = "^5.7.0" +isort = "^5.8.0" python-semantic-release = "^7.15.0" pytest-insta = "^0.1.6" From c269372a8472d3f5d96684b5bbd8984bc9c535ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Mar 2021 07:24:51 +0000 Subject: [PATCH 0133/1554] chore(deps-dev): bump pyright from 1.1.123 to 1.1.124 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.123 to 1.1.124. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.124/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 92d41b8d0..986df8ad5 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.123" + "pyright": "^1.1.124" } }, "node_modules/pyright": { - "version": "1.1.123", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.123.tgz", - "integrity": "sha512-EYjELbm4G4icuIki6PfpzYrxNeGH78vNbXNmsbb/9XnnVQISdFcbc9oOBc2mU77enUwZctwZ6Nj2mZUMD9VibQ==", + "version": "1.1.124", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.124.tgz", + "integrity": "sha512-bSKk8+YW/f6qBgluNMzhlT3hnrJQzLtN1oLFhI7G0XG/Tahb8hNgjBnGeag5yz6v6IukpAIbfR5tF4hGcRSRKw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.123", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.123.tgz", - "integrity": "sha512-EYjELbm4G4icuIki6PfpzYrxNeGH78vNbXNmsbb/9XnnVQISdFcbc9oOBc2mU77enUwZctwZ6Nj2mZUMD9VibQ==", + "version": "1.1.124", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.124.tgz", + "integrity": "sha512-bSKk8+YW/f6qBgluNMzhlT3hnrJQzLtN1oLFhI7G0XG/Tahb8hNgjBnGeag5yz6v6IukpAIbfR5tF4hGcRSRKw==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 25d733756..13a9e9e8c 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.123" + "pyright": "^1.1.124" } } From afb5ba7351f3af097287fd4b9d12a7ba3c137d87 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 Mar 2021 14:20:35 +0100 Subject: [PATCH 0134/1554] fix: version ranges were weird again --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a72e8b3bc..3f814199f 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.16.0" +version = "0.17.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "406a9c94ce7f0188d0a09e95054d3c69581ca2d616c15771d1d755bf9042dd2b" +content-hash = "0ca6426d656c2875b009716e0203176984072dc247d3ffee43e9dab160b0b98e" [metadata.files] appdirs = [ @@ -793,8 +793,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.16.0-py3-none-any.whl", hash = "sha256:4f54177be050f367842180ab58792a8c044ab5a3163884b887d558bf386c152b"}, - {file = "beet-0.16.0.tar.gz", hash = "sha256:343371c31b7a11189f67272ac6c21ff9220a8c1d94dd77ed8d5fd8a73657d7df"}, + {file = "beet-0.17.2-py3-none-any.whl", hash = "sha256:399d260fe9bb055bf99431de087002685a0182220e47c4292ce1141952c9c2ec"}, + {file = "beet-0.17.2.tar.gz", hash = "sha256:0a1887c0d75f3235f101a00efaa8ea438841dc2d4b343a2b8e2f778d1e8c55fe"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index f3925ce3e..013a21352 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.16.0" +beet = "^0.17.2" markdown-it-py = "^0.6.2" click = "^7.1.2" From 5dec57bb896735504c44fbe3769867d9edd2a1e1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 24 Mar 2021 13:21:51 +0000 Subject: [PATCH 0135/1554] 0.9.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 6153522ec..9532d04c4 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.9.1 (2021-03-24) +### Fix +* Version ranges were weird again ([`bc37fd9`](https://github.com/mcbeet/lectern/commit/bc37fd943021e2d4ab7203f3ac20afb21945d3c4)) + ## v0.9.0 (2021-03-21) ### Feature * Update beet and add shader highlighting ([`13e4659`](https://github.com/mcbeet/lectern/commit/13e465995c09a7bc9d974c64e829fca82721fb39)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 496793a50..2e899050b 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.9.0" +__version__ = "0.9.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 013a21352..295a0b49b 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.9.0" +version = "0.9.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From f676b03db4c53d13619219992aebceb97e786324 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Mar 2021 04:53:45 +0000 Subject: [PATCH 0136/1554] chore(deps): bump beet from 0.16.0 to 0.17.2 Bumps [beet](https://github.com/mcbeet/beet) from 0.16.0 to 0.17.2. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.16.0...v0.17.2) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f03d4ff7a..1d49c9ea2 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.16.0" +version = "0.17.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "fef414aacd2feb65b2b2b30fe5aa5207d1e29dabc4df7ec9e582732457e60a38" +content-hash = "31fa872a6cab721f0dc5ca1ffaf4864ac1d0519956a86c2738cf05624b8a8e18" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.16.0-py3-none-any.whl", hash = "sha256:4f54177be050f367842180ab58792a8c044ab5a3163884b887d558bf386c152b"}, - {file = "beet-0.16.0.tar.gz", hash = "sha256:343371c31b7a11189f67272ac6c21ff9220a8c1d94dd77ed8d5fd8a73657d7df"}, + {file = "beet-0.17.2-py3-none-any.whl", hash = "sha256:399d260fe9bb055bf99431de087002685a0182220e47c4292ce1141952c9c2ec"}, + {file = "beet-0.17.2.tar.gz", hash = "sha256:0a1887c0d75f3235f101a00efaa8ea438841dc2d4b343a2b8e2f778d1e8c55fe"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 534194ddc..c8feb2f79 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.17.0" +beet = ">=0.5.1,<0.18.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 137a023d652d5ab72208494795f79df182f907bb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Mar 2021 12:43:10 +0100 Subject: [PATCH 0137/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 3f814199f..af5ff4a49 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.17.2" +version = "0.18.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0ca6426d656c2875b009716e0203176984072dc247d3ffee43e9dab160b0b98e" +content-hash = "b5f3da056717b26c313db93846a2907b726b5df2b6c8b61b16c31331bf1ecc0e" [metadata.files] appdirs = [ @@ -793,8 +793,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.17.2-py3-none-any.whl", hash = "sha256:399d260fe9bb055bf99431de087002685a0182220e47c4292ce1141952c9c2ec"}, - {file = "beet-0.17.2.tar.gz", hash = "sha256:0a1887c0d75f3235f101a00efaa8ea438841dc2d4b343a2b8e2f778d1e8c55fe"}, + {file = "beet-0.18.0-py3-none-any.whl", hash = "sha256:8f320cbcb2af91304cbc394a14fe4f8703fd3fcf6d9a1912cd2e7151fd8dd3cc"}, + {file = "beet-0.18.0.tar.gz", hash = "sha256:a1b67da50a66ca8f56e6a9aed1c3290f7abb2a5bc3cfbe51fafdf4a8b297131b"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 295a0b49b..fb91c3f60 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.17.2" +beet = "^0.18.0" markdown-it-py = "^0.6.2" click = "^7.1.2" From f040ff9eb560c949b147fcba511c78417598352b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Mar 2021 12:48:44 +0100 Subject: [PATCH 0138/1554] fix: snapshots shouldn't compare data pack and resource pack names --- packages/lectern/lectern/pytest_plugin.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/lectern/lectern/pytest_plugin.py b/packages/lectern/lectern/pytest_plugin.py index d0c75d329..9947ede7f 100644 --- a/packages/lectern/lectern/pytest_plugin.py +++ b/packages/lectern/lectern/pytest_plugin.py @@ -1,7 +1,10 @@ # type: ignore +from pathlib import Path + from _pytest.assertion.util import assertrepr_compare +from beet.library.test_utils import ignore_name from lectern import Document @@ -10,15 +13,18 @@ except ImportError: pass else: - from pathlib import Path - from lectern import Document + def load_snapshot(path: Path) -> Document: + document = Document(path=path) + ignore_name(document.assets) + ignore_name(document.data) + return document class FmtPackText(Fmt[Document]): extension = ".pack.txt" def load(self, path: Path) -> Document: - return Document(path=path) + return load_snapshot(path) def dump(self, path: Path, value: Document): value.save(path) @@ -27,7 +33,7 @@ class FmtPackMarkdown(Fmt[Document]): extension = ".pack.md" def load(self, path: Path) -> Document: - return Document(path=path) + return load_snapshot(path) def dump(self, path: Path, value: Document): value.save(path) @@ -36,7 +42,7 @@ class FmtPackMarkdownExternalFiles(Fmt[Document]): extension = ".pack.md_external_files" def load(self, path: Path) -> Document: - return Document(path=path / "README.md") + return load_snapshot(path / "README.md") def dump(self, path: Path, value: Document): path.mkdir(exist_ok=True) From 965c8f05ce0e0e21319fdb86122cb18d08c81b36 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Mar 2021 11:50:15 +0000 Subject: [PATCH 0139/1554] 0.9.2 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 9532d04c4..9ae49bbf7 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.9.2 (2021-03-27) +### Fix +* Snapshots shouldn't compare data pack and resource pack names ([`941605b`](https://github.com/mcbeet/lectern/commit/941605b24ef11452e7534af3a7a4bf2597f3f164)) + ## v0.9.1 (2021-03-24) ### Fix * Version ranges were weird again ([`bc37fd9`](https://github.com/mcbeet/lectern/commit/bc37fd943021e2d4ab7203f3ac20afb21945d3c4)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 2e899050b..4b4d3597b 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.9.1" +__version__ = "0.9.2" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index fb91c3f60..ebae32779 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.9.1" +version = "0.9.2" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 9da860c9597296efb779fcb1dfc5ba903e1d571e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 04:58:51 +0000 Subject: [PATCH 0140/1554] chore(deps-dev): bump python-semantic-release from 7.15.0 to 7.15.1 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.0 to 7.15.1. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.0...v7.15.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1d49c9ea2..6fb687326 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -452,7 +452,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.15.0" +version = "7.15.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -464,7 +464,7 @@ click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" invoke = ">=1.4.1,<2" -python-gitlab = ">=1.10,<2" +python-gitlab = ">=1.10,<3" requests = ">=2.25,<3" semver = ">=2.10,<3" tomlkit = ">=0.7.0,<1.0.0" @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "31fa872a6cab721f0dc5ca1ffaf4864ac1d0519956a86c2738cf05624b8a8e18" +content-hash = "03a1d8f69702f25b82e0e5ec71ed3531414c64c4dd4eac55dda690861de6d162" [metadata.files] appdirs = [ @@ -1027,8 +1027,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.0.tar.gz", hash = "sha256:a0ffd462bd42c5e0c41363b3c66c707ef4ad181bebc2f81145debbce9438e713"}, - {file = "python_semantic_release-7.15.0-py3-none-any.whl", hash = "sha256:04835c4e32db24387bcab3aac0a11892b274f00206e360abfa4d8152b082d0f1"}, + {file = "python-semantic-release-7.15.1.tar.gz", hash = "sha256:1f9a5b22964154a4587b1801d4d802c7f0d0d387ce4d9d64c089f895b9fb9b01"}, + {file = "python_semantic_release-7.15.1-py3-none-any.whl", hash = "sha256:d3cb3d07c81e2bacbd74d014265b89b8ce5b144d3ac567cdfd76fc5369638ba8"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c8feb2f79..ea9ab2d10 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.5.1,<0.18.0" black = "^20.8b1" isort = "^5.8.0" pytest = "^6.2.2" -python-semantic-release = "^7.15.0" +python-semantic-release = "^7.15.1" [tool.black] target-version = ["py38"] From 8fe0cc52199a3f8bee8bd60ef0f09ce8c2f5b061 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 05:03:05 +0000 Subject: [PATCH 0141/1554] chore(deps): bump beet from 0.17.2 to 0.18.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.17.2 to 0.18.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.17.2...v0.18.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6fb687326..029cb8455 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -30,7 +30,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.17.2" +version = "0.18.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -681,7 +681,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "03a1d8f69702f25b82e0e5ec71ed3531414c64c4dd4eac55dda690861de6d162" +content-hash = "17f1e4b2c198ea5d891bf101c8e3bbc86bd2c9686596434bb63c11958f581a9e" [metadata.files] appdirs = [ @@ -697,8 +697,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] beet = [ - {file = "beet-0.17.2-py3-none-any.whl", hash = "sha256:399d260fe9bb055bf99431de087002685a0182220e47c4292ce1141952c9c2ec"}, - {file = "beet-0.17.2.tar.gz", hash = "sha256:0a1887c0d75f3235f101a00efaa8ea438841dc2d4b343a2b8e2f778d1e8c55fe"}, + {file = "beet-0.18.0-py3-none-any.whl", hash = "sha256:8f320cbcb2af91304cbc394a14fe4f8703fd3fcf6d9a1912cd2e7151fd8dd3cc"}, + {file = "beet-0.18.0.tar.gz", hash = "sha256:a1b67da50a66ca8f56e6a9aed1c3290f7abb2a5bc3cfbe51fafdf4a8b297131b"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ea9ab2d10..4e6eba8b3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.18.0" +beet = ">=0.5.1,<0.19.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 4484fa078a486df94deb6e51f23b492985ab523e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 08:30:45 +0000 Subject: [PATCH 0142/1554] chore(deps-dev): bump pyright from 1.1.124 to 1.1.126 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.124 to 1.1.126. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.126/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 986df8ad5..5105bcdbf 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.124" + "pyright": "^1.1.126" } }, "node_modules/pyright": { - "version": "1.1.124", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.124.tgz", - "integrity": "sha512-bSKk8+YW/f6qBgluNMzhlT3hnrJQzLtN1oLFhI7G0XG/Tahb8hNgjBnGeag5yz6v6IukpAIbfR5tF4hGcRSRKw==", + "version": "1.1.126", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.126.tgz", + "integrity": "sha512-qOWOMM0YWsX7nZ224DjE5eQoJPqCCkzlkDAxSzCJESnM/Hs6SXO+Tq3VrsiePHSDxIzpDABlB6nQ7WLxd0f1gg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.124", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.124.tgz", - "integrity": "sha512-bSKk8+YW/f6qBgluNMzhlT3hnrJQzLtN1oLFhI7G0XG/Tahb8hNgjBnGeag5yz6v6IukpAIbfR5tF4hGcRSRKw==", + "version": "1.1.126", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.126.tgz", + "integrity": "sha512-qOWOMM0YWsX7nZ224DjE5eQoJPqCCkzlkDAxSzCJESnM/Hs6SXO+Tq3VrsiePHSDxIzpDABlB6nQ7WLxd0f1gg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 13a9e9e8c..aedeb00ee 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.124" + "pyright": "^1.1.126" } } From 7f15c98d8c7dd920f3aba615346945ca0ab4dbc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 08:35:13 +0000 Subject: [PATCH 0143/1554] chore(deps-dev): bump python-semantic-release from 7.15.0 to 7.15.1 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.0 to 7.15.1. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.0...v7.15.1) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 10 +++++----- packages/lectern/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index af5ff4a49..83c55c159 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -516,7 +516,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.15.0" +version = "7.15.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -528,7 +528,7 @@ click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" invoke = ">=1.4.1,<2" -python-gitlab = ">=1.10,<2" +python-gitlab = ">=1.10,<3" requests = ">=2.25,<3" semver = ">=2.10,<3" tomlkit = ">=0.7.0,<1.0.0" @@ -777,7 +777,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b5f3da056717b26c313db93846a2907b726b5df2b6c8b61b16c31331bf1ecc0e" +content-hash = "f5d34795126f12fa375755cf23933edc831840327227ff5200241909b0c45340" [metadata.files] appdirs = [ @@ -1128,8 +1128,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.0.tar.gz", hash = "sha256:a0ffd462bd42c5e0c41363b3c66c707ef4ad181bebc2f81145debbce9438e713"}, - {file = "python_semantic_release-7.15.0-py3-none-any.whl", hash = "sha256:04835c4e32db24387bcab3aac0a11892b274f00206e360abfa4d8152b082d0f1"}, + {file = "python-semantic-release-7.15.1.tar.gz", hash = "sha256:1f9a5b22964154a4587b1801d4d802c7f0d0d387ce4d9d64c089f895b9fb9b01"}, + {file = "python_semantic_release-7.15.1-py3-none-any.whl", hash = "sha256:d3cb3d07c81e2bacbd74d014265b89b8ce5b144d3ac567cdfd76fc5369638ba8"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index ebae32779..bef4d9eff 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -34,7 +34,7 @@ black = "^20.8b1" rope = "^0.18.0" pytest = "^6.2.2" isort = "^5.8.0" -python-semantic-release = "^7.15.0" +python-semantic-release = "^7.15.1" pytest-insta = "^0.1.6" [tool.poetry.scripts] From 1ac24b18991b6fb300e2e7acba02c5e51de0beee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 30 Mar 2021 05:04:01 +0000 Subject: [PATCH 0144/1554] chore(deps): bump beet from 0.18.0 to 0.19.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.18.0 to 0.19.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.18.0...v0.19.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 36 +++++++++++++++++++++++++++++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 029cb8455..06c935688 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -28,18 +28,31 @@ docs = ["furo", "sphinx", "zope.interface"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +[[package]] +name = "base58" +version = "2.1.0" +description = "Base58 and Base58Check implementation." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)", "coveralls", "pytest-benchmark"] + [[package]] name = "beet" -version = "0.18.0" +version = "0.19.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] +base58 = ">=2.1.0,<3.0.0" click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} +fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=2.11.2,<3.0.0" nbtlib = ">=1.8.2,<2.0.0" pathspec = ">=0.8.1,<0.9.0" @@ -187,6 +200,14 @@ python-versions = "*" [package.dependencies] setuptools_scm = "*" +[[package]] +name = "fnvhash" +version = "0.1.0" +description = "Pure Python FNV hash implementation" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "gitdb" version = "4.0.5" @@ -681,7 +702,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "17f1e4b2c198ea5d891bf101c8e3bbc86bd2c9686596434bb63c11958f581a9e" +content-hash = "7afe98570c04ed3171d68a25d1e86d33189ea4c9c30968b019de4872f2645ade" [metadata.files] appdirs = [ @@ -696,9 +717,13 @@ attrs = [ {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] +base58 = [ + {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, + {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, +] beet = [ - {file = "beet-0.18.0-py3-none-any.whl", hash = "sha256:8f320cbcb2af91304cbc394a14fe4f8703fd3fcf6d9a1912cd2e7151fd8dd3cc"}, - {file = "beet-0.18.0.tar.gz", hash = "sha256:a1b67da50a66ca8f56e6a9aed1c3290f7abb2a5bc3cfbe51fafdf4a8b297131b"}, + {file = "beet-0.19.0-py3-none-any.whl", hash = "sha256:fb94c09827565c997af47777726084efe974479102a3511f2f179e868e7af755"}, + {file = "beet-0.19.0.tar.gz", hash = "sha256:1bd9f409edc420dd96831472188c1602b45bebfb4d9ee85fdb7f9e1fb64d5c68"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -793,6 +818,9 @@ docutils = [ dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, ] +fnvhash = [ + {file = "fnvhash-0.1.0.tar.gz", hash = "sha256:3e82d505054f9f3987b2b5b649f7e7b6f48349f6af8a1b8e4d66779699c85a8e"}, +] gitdb = [ {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4e6eba8b3..bee3129fd 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.19.0" +beet = ">=0.5.1,<0.20.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From a2c1201d0e7058762ca1160a3f98e666c6e26da0 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 2 Apr 2021 14:07:39 +0200 Subject: [PATCH 0145/1554] fix(deps): don't use caret to depend on beet because it's not 1.0 yet --- packages/lectern/poetry.lock | 297 +++++++++++++++++--------------- packages/lectern/pyproject.toml | 2 +- 2 files changed, 163 insertions(+), 136 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 83c55c159..a0cee2694 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -28,18 +28,31 @@ docs = ["furo", "sphinx", "zope.interface"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +[[package]] +name = "base58" +version = "2.1.0" +description = "Base58 and Base58Check implementation." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)", "coveralls", "pytest-benchmark"] + [[package]] name = "beet" -version = "0.18.0" +version = "0.19.1" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] +base58 = ">=2.1.0,<3.0.0" click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} +fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=2.11.2,<3.0.0" nbtlib = ">=1.8.2,<2.0.0" pathspec = ">=0.8.1,<0.9.0" @@ -151,7 +164,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.4.6" +version = "3.4.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -187,16 +200,24 @@ python-versions = "*" [package.dependencies] setuptools_scm = "*" +[[package]] +name = "fnvhash" +version = "0.1.0" +description = "Pure Python FNV hash implementation" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "gitdb" -version = "4.0.5" +version = "4.0.7" description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.4" [package.dependencies] -smmap = ">=3.0.1,<4" +smmap = ">=3.0.1,<5" [[package]] name = "gitpython" @@ -219,7 +240,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "3.7.2" +version = "3.10.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -230,7 +251,7 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -288,7 +309,7 @@ i18n = ["Babel (>=0.8)"] [[package]] name = "keyring" -version = "23.0.0" +version = "23.0.1" description = "Store and access your passwords safely." category = "dev" optional = false @@ -302,7 +323,7 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] name = "markdown-it-py" @@ -333,7 +354,7 @@ python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" [[package]] name = "mdit-py-plugins" -version = "0.2.5" +version = "0.2.6" description = "Collection of plugins for markdown-it-py" category = "main" optional = false @@ -394,7 +415,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pillow" -version = "8.1.2" +version = "8.2.0" description = "Python Imaging Library (Fork)" category = "main" optional = false @@ -504,15 +525,19 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "1.15.0" +version = "2.6.0" description = "Interact with GitLab API" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6.0" [package.dependencies] -requests = ">=2.4.2" -six = "*" +requests = ">=2.22.0" +requests-toolbelt = ">=0.9.1" + +[package.extras] +autocompletion = ["argcomplete (>=1.10.0,<2)"] +yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" @@ -566,7 +591,7 @@ md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" -version = "2020.11.13" +version = "2021.3.17" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -645,11 +670,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "5.0.2" +version = "6.0.1" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.extras] toml = ["toml"] @@ -664,11 +689,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" -version = "3.0.5" +version = "4.0.0" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" [[package]] name = "toml" @@ -701,7 +726,7 @@ telegram = ["requests"] [[package]] name = "twine" -version = "3.3.0" +version = "3.4.1" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -709,6 +734,7 @@ python-versions = ">=3.6" [package.dependencies] colorama = ">=0.4.3" +importlib-metadata = ">=3.6" keyring = ">=15.1" pkginfo = ">=1.4.2" readme-renderer = ">=21.0" @@ -735,16 +761,16 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.3" +version = "1.26.4" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "webencodings" @@ -777,7 +803,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f5d34795126f12fa375755cf23933edc831840327227ff5200241909b0c45340" +content-hash = "a691dda6ea5f5e22aab2a765641488238d3e69eca26fbd206ef87e75fb4df573" [metadata.files] appdirs = [ @@ -792,9 +818,13 @@ attrs = [ {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] +base58 = [ + {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, + {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, +] beet = [ - {file = "beet-0.18.0-py3-none-any.whl", hash = "sha256:8f320cbcb2af91304cbc394a14fe4f8703fd3fcf6d9a1912cd2e7151fd8dd3cc"}, - {file = "beet-0.18.0.tar.gz", hash = "sha256:a1b67da50a66ca8f56e6a9aed1c3290f7abb2a5bc3cfbe51fafdf4a8b297131b"}, + {file = "beet-0.19.1-py3-none-any.whl", hash = "sha256:894b00e78084b236e0ecdb4180b9c563c26ffb1c20a5a6f77a83cc1c2142260d"}, + {file = "beet-0.19.1.tar.gz", hash = "sha256:8530978d1663b0364f7e7b722530b2c20c27287e8b07031c44099d7fd46ce2f4"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -867,18 +897,18 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.4.6-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:57ad77d32917bc55299b16d3b996ffa42a1c73c6cfa829b14043c561288d2799"}, - {file = "cryptography-3.4.6-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:4169a27b818de4a1860720108b55a2801f32b6ae79e7f99c00d79f2a2822eeb7"}, - {file = "cryptography-3.4.6-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:93cfe5b7ff006de13e1e89830810ecbd014791b042cbe5eec253be11ac2b28f3"}, - {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:5ecf2bcb34d17415e89b546dbb44e73080f747e504273e4d4987630493cded1b"}, - {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"}, - {file = "cryptography-3.4.6-cp36-abi3-win32.whl", hash = "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2"}, - {file = "cryptography-3.4.6-cp36-abi3-win_amd64.whl", hash = "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0"}, - {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b"}, - {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df"}, - {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336"}, - {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724"}, - {file = "cryptography-3.4.6.tar.gz", hash = "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, + {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, + {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, + {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, @@ -887,9 +917,12 @@ docutils = [ dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, ] +fnvhash = [ + {file = "fnvhash-0.1.0.tar.gz", hash = "sha256:3e82d505054f9f3987b2b5b649f7e7b6f48349f6af8a1b8e4d66779699c85a8e"}, +] gitdb = [ - {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, - {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, + {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, + {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, ] gitpython = [ {file = "GitPython-3.1.14-py3-none-any.whl", hash = "sha256:3283ae2fba31c913d857e12e5ba5f9a7772bbc064ae2bb09efafa71b0dd4939b"}, @@ -900,8 +933,8 @@ idna = [ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] importlib-metadata = [ - {file = "importlib_metadata-3.7.2-py3-none-any.whl", hash = "sha256:407d13f55dc6f2a844e62325d18ad7019a436c4bfcaee34cda35f2be6e7c3e34"}, - {file = "importlib_metadata-3.7.2.tar.gz", hash = "sha256:18d5ff601069f98d5d605b6a4b50c18a34811d655c55548adc833e687289acde"}, + {file = "importlib_metadata-3.10.0-py3-none-any.whl", hash = "sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe"}, + {file = "importlib_metadata-3.10.0.tar.gz", hash = "sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -925,8 +958,8 @@ jinja2 = [ {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, ] keyring = [ - {file = "keyring-23.0.0-py3-none-any.whl", hash = "sha256:29f407fd5509c014a6086f17338c70215c8d1ab42d5d49e0254273bc0a64bbfc"}, - {file = "keyring-23.0.0.tar.gz", hash = "sha256:237ff44888ba9b3918a7dcb55c8f1db909c95b6f071bfb46c6918f33f453a68a"}, + {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, + {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] markdown-it-py = [ {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, @@ -987,8 +1020,8 @@ markupsafe = [ {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mdit-py-plugins = [ - {file = "mdit-py-plugins-0.2.5.tar.gz", hash = "sha256:06dbda99e7d81184c4f6de7c7e3409b29f5cef35404beed6feaf624646219bf5"}, - {file = "mdit_py_plugins-0.2.5-py3-none-any.whl", hash = "sha256:3c78db5cfdcf8f55f0af2b096de391bffcef0b3600222f434efb016d7c267cec"}, + {file = "mdit-py-plugins-0.2.6.tar.gz", hash = "sha256:1e467ca2ea056e8065cbd5d6c61e5052bb50826bde84c40f6a5ed77e82125710"}, + {file = "mdit_py_plugins-0.2.6-py3-none-any.whl", hash = "sha256:77fd75dad81109ee91f30eb49146196f79afbbae041f298ae4886c8c2b5e23d7"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1033,39 +1066,39 @@ pathspec = [ {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-8.1.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0"}, - {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5"}, - {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8"}, - {file = "Pillow-8.1.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34"}, - {file = "Pillow-8.1.2-cp36-cp36m-win32.whl", hash = "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71"}, - {file = "Pillow-8.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341"}, - {file = "Pillow-8.1.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6"}, - {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28"}, - {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d"}, - {file = "Pillow-8.1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be"}, - {file = "Pillow-8.1.2-cp37-cp37m-win32.whl", hash = "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55"}, - {file = "Pillow-8.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03"}, - {file = "Pillow-8.1.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e"}, - {file = "Pillow-8.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce"}, - {file = "Pillow-8.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af"}, - {file = "Pillow-8.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06"}, - {file = "Pillow-8.1.2-cp38-cp38-win32.whl", hash = "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09"}, - {file = "Pillow-8.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060"}, - {file = "Pillow-8.1.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1"}, - {file = "Pillow-8.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6"}, - {file = "Pillow-8.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238"}, - {file = "Pillow-8.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910"}, - {file = "Pillow-8.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1"}, - {file = "Pillow-8.1.2-cp39-cp39-win32.whl", hash = "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e"}, - {file = "Pillow-8.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0"}, - {file = "Pillow-8.1.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b"}, - {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2"}, - {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb"}, - {file = "Pillow-8.1.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328"}, - {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c"}, - {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733"}, - {file = "Pillow-8.1.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a"}, - {file = "Pillow-8.1.2.tar.gz", hash = "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44"}, + {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, + {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, + {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, + {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, + {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, + {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, + {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, + {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, + {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, + {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, + {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, @@ -1124,8 +1157,8 @@ pytest-insta = [ {file = "pytest_insta-0.1.7-py3-none-any.whl", hash = "sha256:618ca678fb2c32b1e332903b283179d5fd08d43ea3c8445fc4fc42e30dba95f6"}, ] python-gitlab = [ - {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, - {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, + {file = "python-gitlab-2.6.0.tar.gz", hash = "sha256:a862c6874524ab585b725a17b2cd2950fc09d6d74205f40a11be2a4e8f2dcaa1"}, + {file = "python_gitlab-2.6.0-py3-none-any.whl", hash = "sha256:8f6a62b2804021416f13e91f359085f1071fb7adedfb292ef0d0877df777a075"}, ] python-semantic-release = [ {file = "python-semantic-release-7.15.1.tar.gz", hash = "sha256:1f9a5b22964154a4587b1801d4d802c7f0d0d387ce4d9d64c089f895b9fb9b01"}, @@ -1140,47 +1173,47 @@ readme-renderer = [ {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, + {file = "regex-2021.3.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e"}, + {file = "regex-2021.3.17-cp36-cp36m-win32.whl", hash = "sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3"}, + {file = "regex-2021.3.17-cp36-cp36m-win_amd64.whl", hash = "sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5"}, + {file = "regex-2021.3.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643"}, + {file = "regex-2021.3.17-cp37-cp37m-win32.whl", hash = "sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be"}, + {file = "regex-2021.3.17-cp37-cp37m-win_amd64.whl", hash = "sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb"}, + {file = "regex-2021.3.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d"}, + {file = "regex-2021.3.17-cp38-cp38-win32.whl", hash = "sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf"}, + {file = "regex-2021.3.17-cp38-cp38-win_amd64.whl", hash = "sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa"}, + {file = "regex-2021.3.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7"}, + {file = "regex-2021.3.17-cp39-cp39-win32.whl", hash = "sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd"}, + {file = "regex-2021.3.17-cp39-cp39-win_amd64.whl", hash = "sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38"}, + {file = "regex-2021.3.17.tar.gz", hash = "sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68"}, ] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, @@ -1206,22 +1239,16 @@ semver = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-5.0.2-py2.7.egg", hash = "sha256:35acc9a3be4fbd4f6f3480eecb3c637dfb5ca1812fe86baf5e6759a0133837cf"}, - {file = "setuptools_scm-5.0.2-py2.py3-none-any.whl", hash = "sha256:bd5c4e37f74c103e117549f89aeb3c244488c4a6422df786d1a7d03257f16b34"}, - {file = "setuptools_scm-5.0.2-py3.5.egg", hash = "sha256:0d4fa3743c7a453f31dae9b44fcc0c869125a323c166a6b39e20122f488addb2"}, - {file = "setuptools_scm-5.0.2-py3.6.egg", hash = "sha256:ce5497a8ff55e81cf88cb402a87dedc7663d2671d5f1303d978ba1afb33c4fb6"}, - {file = "setuptools_scm-5.0.2-py3.7.egg", hash = "sha256:90be2ecff71d92352f59c6371abe017c0859bc617a545ba6aaf4d96951ba7947"}, - {file = "setuptools_scm-5.0.2-py3.8.egg", hash = "sha256:2e8706b90910d66668b3f34aea9cceab3c08ba83fedd78de65ff323edc8a1414"}, - {file = "setuptools_scm-5.0.2-py3.9.egg", hash = "sha256:f23060f0f5b23f26b76e43fb0ef51e5294e4b575f69edab5cfe442635680f2ec"}, - {file = "setuptools_scm-5.0.2.tar.gz", hash = "sha256:83a0cedd3449e3946307811a4c7b9d89c4b5fd464a2fb5eeccd0a5bb158ae5c8"}, + {file = "setuptools_scm-6.0.1-py3-none-any.whl", hash = "sha256:c3bd5f701c8def44a5c0bfe8d407bef3f80342217ef3492b951f3777bd2d915c"}, + {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, ] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] smmap = [ - {file = "smmap-3.0.5-py2.py3-none-any.whl", hash = "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714"}, - {file = "smmap-3.0.5.tar.gz", hash = "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50"}, + {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, + {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, @@ -1236,8 +1263,8 @@ tqdm = [ {file = "tqdm-4.59.0.tar.gz", hash = "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33"}, ] twine = [ - {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, - {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, + {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, + {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] typed-ast = [ {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, @@ -1277,8 +1304,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, - {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, + {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, + {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index bef4d9eff..7fd36cfa8 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = "^0.18.0" +beet = ">=0.19.1" markdown-it-py = "^0.6.2" click = "^7.1.2" From afbf261fb0e00756dbeabc07ef6603f1590bf3df Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 2 Apr 2021 14:08:05 +0200 Subject: [PATCH 0146/1554] chore(deps-dev): update pyright --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 5105bcdbf..c5c1a6733 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.126" + "pyright": "^1.1.127" } }, "node_modules/pyright": { - "version": "1.1.126", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.126.tgz", - "integrity": "sha512-qOWOMM0YWsX7nZ224DjE5eQoJPqCCkzlkDAxSzCJESnM/Hs6SXO+Tq3VrsiePHSDxIzpDABlB6nQ7WLxd0f1gg==", + "version": "1.1.127", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.127.tgz", + "integrity": "sha512-vh5tbaWYwaNarx9sE8CLTC6x2Cuu9Y3sJQzBX8iIMuDu/CRBIHbJR3ZzApl/ZA11Yu6zJlhYgsTNMaROw1sGlg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.126", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.126.tgz", - "integrity": "sha512-qOWOMM0YWsX7nZ224DjE5eQoJPqCCkzlkDAxSzCJESnM/Hs6SXO+Tq3VrsiePHSDxIzpDABlB6nQ7WLxd0f1gg==", + "version": "1.1.127", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.127.tgz", + "integrity": "sha512-vh5tbaWYwaNarx9sE8CLTC6x2Cuu9Y3sJQzBX8iIMuDu/CRBIHbJR3ZzApl/ZA11Yu6zJlhYgsTNMaROw1sGlg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index aedeb00ee..f6e9bbf9a 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.126" + "pyright": "^1.1.127" } } From d5d5a5845fe1be20c5ba8b5ef929732ff1759b26 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 2 Apr 2021 12:09:13 +0000 Subject: [PATCH 0147/1554] 0.9.3 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 9ae49bbf7..1986b64d8 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.9.3 (2021-04-02) +### Fix +* **deps:** Don't use caret to depend on beet because it's not 1.0 yet ([`a97779f`](https://github.com/mcbeet/lectern/commit/a97779fd7bcb22efafeb95b4f383cbd86d61000f)) + ## v0.9.2 (2021-03-27) ### Fix * Snapshots shouldn't compare data pack and resource pack names ([`941605b`](https://github.com/mcbeet/lectern/commit/941605b24ef11452e7534af3a7a4bf2597f3f164)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 4b4d3597b..24692fd9c 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.9.2" +__version__ = "0.9.3" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 7fd36cfa8..4bc53bc55 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.9.2" +version = "0.9.3" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 149213e2f3ea5c7a3252fd4b898dcdf96f2aa530 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Apr 2021 04:55:53 +0000 Subject: [PATCH 0148/1554] chore(deps-dev): bump python-semantic-release from 7.15.1 to 7.15.3 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.1 to 7.15.3. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.1...v7.15.3) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 06c935688..4cffb2e74 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -473,7 +473,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.15.1" +version = "7.15.3" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -702,7 +702,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7afe98570c04ed3171d68a25d1e86d33189ea4c9c30968b019de4872f2645ade" +content-hash = "dc7be851e783bd5375bafa07e4945627953f671811d25d9fa2e354a629c50d29" [metadata.files] appdirs = [ @@ -1055,8 +1055,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.1.tar.gz", hash = "sha256:1f9a5b22964154a4587b1801d4d802c7f0d0d387ce4d9d64c089f895b9fb9b01"}, - {file = "python_semantic_release-7.15.1-py3-none-any.whl", hash = "sha256:d3cb3d07c81e2bacbd74d014265b89b8ce5b144d3ac567cdfd76fc5369638ba8"}, + {file = "python-semantic-release-7.15.3.tar.gz", hash = "sha256:0ffcb267923731b3578d4377de67c59c5779c80e514ef9883c47c8877c059d74"}, + {file = "python_semantic_release-7.15.3-py3-none-any.whl", hash = "sha256:9b5c6e7ff9887b0cc8178004aa101aae2bfec8a464316cf287be8acbdf1e4954"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index bee3129fd..8b03c5915 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.5.1,<0.20.0" black = "^20.8b1" isort = "^5.8.0" pytest = "^6.2.2" -python-semantic-release = "^7.15.1" +python-semantic-release = "^7.15.3" [tool.black] target-version = ["py38"] From 70927a9f69468eb436df1896dead0c41c1eaf2d3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Apr 2021 04:59:49 +0000 Subject: [PATCH 0149/1554] chore(deps-dev): bump pytest from 6.2.2 to 6.2.3 Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.2 to 6.2.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.2.2...6.2.3) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4cffb2e74..6d9993b9b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -440,7 +440,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.2" +version = "6.2.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -702,7 +702,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "dc7be851e783bd5375bafa07e4945627953f671811d25d9fa2e354a629c50d29" +content-hash = "b331a982f3fea36237b442104c3ccb664392aba079961295e379a53cf4f1fedc" [metadata.files] appdirs = [ @@ -1047,8 +1047,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, - {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, + {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"}, + {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"}, ] python-gitlab = [ {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8b03c5915..ab472ff12 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -28,7 +28,7 @@ beet = ">=0.5.1,<0.20.0" [tool.poetry.dev-dependencies] black = "^20.8b1" isort = "^5.8.0" -pytest = "^6.2.2" +pytest = "^6.2.3" python-semantic-release = "^7.15.3" [tool.black] From e65299fb16c4eff5ed1685408f632e897cbda278 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Apr 2021 04:59:50 +0000 Subject: [PATCH 0150/1554] chore(deps): bump beet from 0.19.0 to 0.19.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.19.0 to 0.19.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.19.0...v0.19.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4cffb2e74..2a7da785c 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.19.0" +version = "0.19.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -722,8 +722,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.19.0-py3-none-any.whl", hash = "sha256:fb94c09827565c997af47777726084efe974479102a3511f2f179e868e7af755"}, - {file = "beet-0.19.0.tar.gz", hash = "sha256:1bd9f409edc420dd96831472188c1602b45bebfb4d9ee85fdb7f9e1fb64d5c68"}, + {file = "beet-0.19.1-py3-none-any.whl", hash = "sha256:894b00e78084b236e0ecdb4180b9c563c26ffb1c20a5a6f77a83cc1c2142260d"}, + {file = "beet-0.19.1.tar.gz", hash = "sha256:8530978d1663b0364f7e7b722530b2c20c27287e8b07031c44099d7fd46ce2f4"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, From 28bc85be34fc212d6b719d5e9a90637f70e9aa4c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:58:47 +0000 Subject: [PATCH 0151/1554] chore(deps): [security] bump urllib3 from 1.26.3 to 1.26.4 Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.3 to 1.26.4. **This update includes a security fix.** - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.3...1.26.4) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 25c328cfc..6805edab8 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -680,16 +680,16 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.3" +version = "1.26.4" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "webencodings" @@ -1201,8 +1201,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, - {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, + {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, + {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, From de8bd8b3b08fb3db293328768c9bc4ea7d420ca3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Apr 2021 07:25:24 +0000 Subject: [PATCH 0152/1554] chore(deps-dev): bump pytest-insta from 0.1.7 to 0.1.10 Bumps [pytest-insta](https://github.com/vberlier/pytest-insta) from 0.1.7 to 0.1.10. - [Release notes](https://github.com/vberlier/pytest-insta/releases) - [Changelog](https://github.com/vberlier/pytest-insta/blob/main/CHANGELOG.md) - [Commits](https://github.com/vberlier/pytest-insta/compare/v0.1.7...v0.1.10) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a0cee2694..279e1ad39 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -513,7 +513,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-insta" -version = "0.1.7" +version = "0.1.10" description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false @@ -803,7 +803,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "a691dda6ea5f5e22aab2a765641488238d3e69eca26fbd206ef87e75fb4df573" +content-hash = "5f3a8568eba959ff987cb3ac0c6ee635c8501665811ac247da77fc131b5f7166" [metadata.files] appdirs = [ @@ -1153,8 +1153,8 @@ pytest = [ {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, ] pytest-insta = [ - {file = "pytest-insta-0.1.7.tar.gz", hash = "sha256:daa265c8f31920f215b9363ce57c820ade7a87d0bd1239e91514eec63ea50ad2"}, - {file = "pytest_insta-0.1.7-py3-none-any.whl", hash = "sha256:618ca678fb2c32b1e332903b283179d5fd08d43ea3c8445fc4fc42e30dba95f6"}, + {file = "pytest-insta-0.1.10.tar.gz", hash = "sha256:27670ed8aa63cf34726106586dadadb12137102e22372ec918e64ee524d56f1f"}, + {file = "pytest_insta-0.1.10-py3-none-any.whl", hash = "sha256:3043c4a668224f473df3de1d60fb356e356687b6931338c42c487abd0c9a19d8"}, ] python-gitlab = [ {file = "python-gitlab-2.6.0.tar.gz", hash = "sha256:a862c6874524ab585b725a17b2cd2950fc09d6d74205f40a11be2a4e8f2dcaa1"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 4bc53bc55..c5af9745e 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -35,7 +35,7 @@ rope = "^0.18.0" pytest = "^6.2.2" isort = "^5.8.0" python-semantic-release = "^7.15.1" -pytest-insta = "^0.1.6" +pytest-insta = "^0.1.10" [tool.poetry.scripts] lectern = "lectern.cli:main" From 7931518ad50195d2a14922f9a8903a4b91668f75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 21:09:55 +0000 Subject: [PATCH 0153/1554] chore(deps-dev): bump pytest from 6.2.2 to 6.2.3 Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.2 to 6.2.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.2.2...6.2.3) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 279e1ad39..1da70cd6a 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -492,7 +492,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.2" +version = "6.2.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -803,7 +803,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "5f3a8568eba959ff987cb3ac0c6ee635c8501665811ac247da77fc131b5f7166" +content-hash = "9616dc42549ee56ee78776d024b88eb1b9d5145868bb61f1984274d392ff3ec9" [metadata.files] appdirs = [ @@ -1149,8 +1149,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, - {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, + {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"}, + {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"}, ] pytest-insta = [ {file = "pytest-insta-0.1.10.tar.gz", hash = "sha256:27670ed8aa63cf34726106586dadadb12137102e22372ec918e64ee524d56f1f"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index c5af9745e..9d0ab9c37 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -32,7 +32,7 @@ click = "^7.1.2" [tool.poetry.dev-dependencies] black = "^20.8b1" rope = "^0.18.0" -pytest = "^6.2.2" +pytest = "^6.2.3" isort = "^5.8.0" python-semantic-release = "^7.15.1" pytest-insta = "^0.1.10" From 1c553c097c7d31fc5ef11581a804debd06f332be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 21:24:09 +0000 Subject: [PATCH 0154/1554] chore(deps-dev): bump pyright from 1.1.127 to 1.1.130 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.127 to 1.1.130. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.130/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index c5c1a6733..4b82d0af5 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.127" + "pyright": "^1.1.130" } }, "node_modules/pyright": { - "version": "1.1.127", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.127.tgz", - "integrity": "sha512-vh5tbaWYwaNarx9sE8CLTC6x2Cuu9Y3sJQzBX8iIMuDu/CRBIHbJR3ZzApl/ZA11Yu6zJlhYgsTNMaROw1sGlg==", + "version": "1.1.130", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.130.tgz", + "integrity": "sha512-hj4Lvn0x5LFsZDJaZ5hW5X4NfHSCoMvEqcNvRgpYM59qAM22z7XC+Tb7XNrQEhOfIjsbczS3nKWGGUMCe88LXg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.127", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.127.tgz", - "integrity": "sha512-vh5tbaWYwaNarx9sE8CLTC6x2Cuu9Y3sJQzBX8iIMuDu/CRBIHbJR3ZzApl/ZA11Yu6zJlhYgsTNMaROw1sGlg==", + "version": "1.1.130", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.130.tgz", + "integrity": "sha512-hj4Lvn0x5LFsZDJaZ5hW5X4NfHSCoMvEqcNvRgpYM59qAM22z7XC+Tb7XNrQEhOfIjsbczS3nKWGGUMCe88LXg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index f6e9bbf9a..69d68e630 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.127" + "pyright": "^1.1.130" } } From 7907569a46abc9df66f4c069685aa8c1945415cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 21:26:06 +0000 Subject: [PATCH 0155/1554] chore(deps-dev): bump python-semantic-release from 7.15.1 to 7.15.3 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.1 to 7.15.3. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.1...v7.15.3) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 1da70cd6a..dc9b238e0 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -541,7 +541,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.15.1" +version = "7.15.3" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -803,7 +803,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9616dc42549ee56ee78776d024b88eb1b9d5145868bb61f1984274d392ff3ec9" +content-hash = "38e845977b5bd51a10a7385da6d1d9263e48dbb31b10a7d74dde6e78ce6bf3ac" [metadata.files] appdirs = [ @@ -1161,8 +1161,8 @@ python-gitlab = [ {file = "python_gitlab-2.6.0-py3-none-any.whl", hash = "sha256:8f6a62b2804021416f13e91f359085f1071fb7adedfb292ef0d0877df777a075"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.1.tar.gz", hash = "sha256:1f9a5b22964154a4587b1801d4d802c7f0d0d387ce4d9d64c089f895b9fb9b01"}, - {file = "python_semantic_release-7.15.1-py3-none-any.whl", hash = "sha256:d3cb3d07c81e2bacbd74d014265b89b8ce5b144d3ac567cdfd76fc5369638ba8"}, + {file = "python-semantic-release-7.15.3.tar.gz", hash = "sha256:0ffcb267923731b3578d4377de67c59c5779c80e514ef9883c47c8877c059d74"}, + {file = "python_semantic_release-7.15.3-py3-none-any.whl", hash = "sha256:9b5c6e7ff9887b0cc8178004aa101aae2bfec8a464316cf287be8acbdf1e4954"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9d0ab9c37..365292a0b 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -34,7 +34,7 @@ black = "^20.8b1" rope = "^0.18.0" pytest = "^6.2.3" isort = "^5.8.0" -python-semantic-release = "^7.15.1" +python-semantic-release = "^7.15.3" pytest-insta = "^0.1.10" [tool.poetry.scripts] From 729c0c1c00c9a141af865a30aa51b3f01eac6149 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 19 Apr 2021 04:57:38 +0000 Subject: [PATCH 0156/1554] chore(deps): bump beet from 0.19.1 to 0.20.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.19.1 to 0.20.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.19.1...v0.20.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 145 +++++++++++++++++----------------- packages/mecha/pyproject.toml | 2 +- 2 files changed, 75 insertions(+), 72 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6805edab8..adcf479b5 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.19.1" +version = "0.20.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -53,11 +53,11 @@ click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" -Jinja2 = ">=2.11.2,<3.0.0" -nbtlib = ">=1.8.2,<2.0.0" +Jinja2 = ">=2.11.3,<3.0.0" +nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" -Pillow = ">=8.0.1,<9.0.0" -pydantic = ">=1.7.3,<2.0.0" +Pillow = ">=8.2.0,<9.0.0" +pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" @@ -327,14 +327,14 @@ python-versions = "*" [[package]] name = "nbtlib" -version = "1.11.0" +version = "1.12.0" description = "A python package to read and edit nbt data" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -numpy = ">1.16,<1.19.4" +numpy = ">1.16,<1.20.2" [[package]] name = "numpy" @@ -365,7 +365,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pillow" -version = "8.1.0" +version = "8.2.0" description = "Python Imaging Library (Fork)" category = "main" optional = false @@ -411,16 +411,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.7.3" +version = "1.8.1" description = "Data validation and settings management using python 3.6 type hinting" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.1" + +[package.dependencies] +typing-extensions = ">=3.7.4.3" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] -typing_extensions = ["typing-extensions (>=3.7.2)"] [[package]] name = "pygments" @@ -674,7 +676,7 @@ python-versions = "*" name = "typing-extensions" version = "3.7.4.3" description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -702,7 +704,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b331a982f3fea36237b442104c3ccb664392aba079961295e379a53cf4f1fedc" +content-hash = "796ec9346da64aa7c9600b7cb1910651691230e6f3b6785b8a102dc1ebcdc10c" [metadata.files] appdirs = [ @@ -722,8 +724,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.19.1-py3-none-any.whl", hash = "sha256:894b00e78084b236e0ecdb4180b9c563c26ffb1c20a5a6f77a83cc1c2142260d"}, - {file = "beet-0.19.1.tar.gz", hash = "sha256:8530978d1663b0364f7e7b722530b2c20c27287e8b07031c44099d7fd46ce2f4"}, + {file = "beet-0.20.0-py3-none-any.whl", hash = "sha256:4e0da69cefe166f604c8f991fbaddf710a7b21146fc1c8e2f577e4bdfabf3407"}, + {file = "beet-0.20.0.tar.gz", hash = "sha256:5911436686028b9f6fc3a29aa8a1ed3c67cea14650b1ec27a8098f088dc6c226"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -917,8 +919,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] nbtlib = [ - {file = "nbtlib-1.11.0-py3-none-any.whl", hash = "sha256:54b87705563504db54eb74f9c52b2b84afb227e6c7d24b2892c5145ef281adce"}, - {file = "nbtlib-1.11.0.tar.gz", hash = "sha256:92bcfa193588c6031e16f5be0cdfe29216dca08b71a23ce6b51f25855bcfef39"}, + {file = "nbtlib-1.12.0-py3-none-any.whl", hash = "sha256:30a3545cf7e654624cd1bf23ec2590d0a0e3a7bca2a8af4725d7d758453d8686"}, + {file = "nbtlib-1.12.0.tar.gz", hash = "sha256:2554d16bbf51b087442f4d55981ba476ae5d1f046f89dd7904914a7412a80a2e"}, ] numpy = [ {file = "numpy-1.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2"}, @@ -965,38 +967,39 @@ pathspec = [ {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded"}, - {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, - {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, - {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7"}, - {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, - {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, - {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae"}, - {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, - {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, - {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0"}, - {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, - {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, - {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, + {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, + {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, + {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, + {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, + {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, + {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, + {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, + {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, + {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, + {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, + {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, @@ -1015,28 +1018,28 @@ pycparser = [ {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pydantic = [ - {file = "pydantic-1.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd"}, - {file = "pydantic-1.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009"}, - {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d8df4b9090b595511906fa48deda47af04e7d092318bfb291f4d45dfb6bb2127"}, - {file = "pydantic-1.7.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:514b473d264671a5c672dfb28bdfe1bf1afd390f6b206aa2ec9fed7fc592c48e"}, - {file = "pydantic-1.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:dba5c1f0a3aeea5083e75db9660935da90216f8a81b6d68e67f54e135ed5eb23"}, - {file = "pydantic-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59e45f3b694b05a69032a0d603c32d453a23f0de80844fb14d55ab0c6c78ff2f"}, - {file = "pydantic-1.7.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b24e8a572e4b4c18f614004dda8c9f2c07328cb5b6e314d6e1bbd536cb1a6c1"}, - {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:b2b054d095b6431cdda2f852a6d2f0fdec77686b305c57961b4c5dd6d863bf3c"}, - {file = "pydantic-1.7.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:025bf13ce27990acc059d0c5be46f416fc9b293f45363b3d19855165fee1874f"}, - {file = "pydantic-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6e3874aa7e8babd37b40c4504e3a94cc2023696ced5a0500949f3347664ff8e2"}, - {file = "pydantic-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e682f6442ebe4e50cb5e1cfde7dda6766fb586631c3e5569f6aa1951fd1a76ef"}, - {file = "pydantic-1.7.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:185e18134bec5ef43351149fe34fda4758e53d05bb8ea4d5928f0720997b79ef"}, - {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:f5b06f5099e163295b8ff5b1b71132ecf5866cc6e7f586d78d7d3fd6e8084608"}, - {file = "pydantic-1.7.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:24ca47365be2a5a3cc3f4a26dcc755bcdc9f0036f55dcedbd55663662ba145ec"}, - {file = "pydantic-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:d1fe3f0df8ac0f3a9792666c69a7cd70530f329036426d06b4f899c025aca74e"}, - {file = "pydantic-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6864844b039805add62ebe8a8c676286340ba0c6d043ae5dea24114b82a319e"}, - {file = "pydantic-1.7.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ecb54491f98544c12c66ff3d15e701612fc388161fd455242447083350904730"}, - {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ffd180ebd5dd2a9ac0da4e8b995c9c99e7c74c31f985ba090ee01d681b1c4b95"}, - {file = "pydantic-1.7.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8d72e814c7821125b16f1553124d12faba88e85405b0864328899aceaad7282b"}, - {file = "pydantic-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:475f2fa134cf272d6631072554f845d0630907fce053926ff634cc6bc45bf1af"}, - {file = "pydantic-1.7.3-py3-none-any.whl", hash = "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229"}, - {file = "pydantic-1.7.3.tar.gz", hash = "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9"}, + {file = "pydantic-1.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0c40162796fc8d0aa744875b60e4dc36834db9f2a25dbf9ba9664b1915a23850"}, + {file = "pydantic-1.8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fff29fe54ec419338c522b908154a2efabeee4f483e48990f87e189661f31ce3"}, + {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:fbfb608febde1afd4743c6822c19060a8dbdd3eb30f98e36061ba4973308059e"}, + {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:eb8ccf12295113ce0de38f80b25f736d62f0a8d87c6b88aca645f168f9c78771"}, + {file = "pydantic-1.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:20d42f1be7c7acc352b3d09b0cf505a9fab9deb93125061b376fbe1f06a5459f"}, + {file = "pydantic-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dde4ca368e82791de97c2ec019681ffb437728090c0ff0c3852708cf923e0c7d"}, + {file = "pydantic-1.8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3bbd023c981cbe26e6e21c8d2ce78485f85c2e77f7bab5ec15b7d2a1f491918f"}, + {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:830ef1a148012b640186bf4d9789a206c56071ff38f2460a32ae67ca21880eb8"}, + {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:fb77f7a7e111db1832ae3f8f44203691e15b1fa7e5a1cb9691d4e2659aee41c4"}, + {file = "pydantic-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3bcb9d7e1f9849a6bdbd027aabb3a06414abd6068cb3b21c49427956cce5038a"}, + {file = "pydantic-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2287ebff0018eec3cc69b1d09d4b7cebf277726fa1bd96b45806283c1d808683"}, + {file = "pydantic-1.8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4bbc47cf7925c86a345d03b07086696ed916c7663cb76aa409edaa54546e53e2"}, + {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6388ef4ef1435364c8cc9a8192238aed030595e873d8462447ccef2e17387125"}, + {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:dd4888b300769ecec194ca8f2699415f5f7760365ddbe243d4fd6581485fa5f0"}, + {file = "pydantic-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:8fbb677e4e89c8ab3d450df7b1d9caed23f254072e8597c33279460eeae59b99"}, + {file = "pydantic-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f2736d9a996b976cfdfe52455ad27462308c9d3d0ae21a2aa8b4cd1a78f47b9"}, + {file = "pydantic-1.8.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3114d74329873af0a0e8004627f5389f3bb27f956b965ddd3e355fe984a1789c"}, + {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:258576f2d997ee4573469633592e8b99aa13bda182fcc28e875f866016c8e07e"}, + {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c17a0b35c854049e67c68b48d55e026c84f35593c66d69b278b8b49e2484346f"}, + {file = "pydantic-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8bc082afef97c5fd3903d05c6f7bb3a6af9fc18631b4cc9fedeb4720efb0c58"}, + {file = "pydantic-1.8.1-py3-none-any.whl", hash = "sha256:e3f8790c47ac42549dc8b045a67b0ca371c7f66e73040d0197ce6172b385e520"}, + {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, ] pygments = [ {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ab472ff12..9d2f991ac 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.20.0" +beet = ">=0.5.1,<0.21.0" [tool.poetry.dev-dependencies] black = "^20.8b1" From 970b55b95dc825233382868c6148359014e04da5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Apr 2021 08:53:19 +0000 Subject: [PATCH 0157/1554] chore(deps-dev): bump rope from 0.18.0 to 0.19.0 Bumps [rope](https://github.com/python-rope/rope) from 0.18.0 to 0.19.0. - [Release notes](https://github.com/python-rope/rope/releases) - [Commits](https://github.com/python-rope/rope/compare/0.18.0...0.19.0) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 6 +++--- packages/lectern/pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index dc9b238e0..290352b32 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -639,7 +639,7 @@ idna2008 = ["idna"] [[package]] name = "rope" -version = "0.18.0" +version = "0.19.0" description = "a python refactoring library..." category = "dev" optional = false @@ -803,7 +803,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "38e845977b5bd51a10a7385da6d1d9263e48dbb31b10a7d74dde6e78ce6bf3ac" +content-hash = "45bcce7fc9ae921c0b2f9f793df8f67491364602e7f492dc35f55de68c9912b5" [metadata.files] appdirs = [ @@ -1228,7 +1228,7 @@ rfc3986 = [ {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, ] rope = [ - {file = "rope-0.18.0.tar.gz", hash = "sha256:786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04"}, + {file = "rope-0.19.0.tar.gz", hash = "sha256:64e6d747532e1f5c8009ec5aae3e5523a5bcedf516f39a750d57d8ed749d90da"}, ] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 365292a0b..e53c29b61 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -31,7 +31,7 @@ click = "^7.1.2" [tool.poetry.dev-dependencies] black = "^20.8b1" -rope = "^0.18.0" +rope = "^0.19.0" pytest = "^6.2.3" isort = "^5.8.0" python-semantic-release = "^7.15.3" From 668fccea6f08ba57e800f2428cbf0f95d103bd32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Apr 2021 08:53:36 +0000 Subject: [PATCH 0158/1554] chore(deps): bump beet from 0.19.1 to 0.20.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.19.1 to 0.20.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.19.1...v0.20.0) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index dc9b238e0..f1646d57c 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.19.1" +version = "0.20.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -53,11 +53,11 @@ click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" -Jinja2 = ">=2.11.2,<3.0.0" -nbtlib = ">=1.8.2,<2.0.0" +Jinja2 = ">=2.11.3,<3.0.0" +nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" -Pillow = ">=8.0.1,<9.0.0" -pydantic = ">=1.7.3,<2.0.0" +Pillow = ">=8.2.0,<9.0.0" +pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" @@ -823,8 +823,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.19.1-py3-none-any.whl", hash = "sha256:894b00e78084b236e0ecdb4180b9c563c26ffb1c20a5a6f77a83cc1c2142260d"}, - {file = "beet-0.19.1.tar.gz", hash = "sha256:8530978d1663b0364f7e7b722530b2c20c27287e8b07031c44099d7fd46ce2f4"}, + {file = "beet-0.20.0-py3-none-any.whl", hash = "sha256:4e0da69cefe166f604c8f991fbaddf710a7b21146fc1c8e2f577e4bdfabf3407"}, + {file = "beet-0.20.0.tar.gz", hash = "sha256:5911436686028b9f6fc3a29aa8a1ed3c67cea14650b1ec27a8098f088dc6c226"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, From c5d36d95f2e2fef160dd271e606842fc277d9c26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Apr 2021 07:11:19 +0000 Subject: [PATCH 0159/1554] chore(deps-dev): bump pyright from 1.1.130 to 1.1.133 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.130 to 1.1.133. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.133/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 4b82d0af5..a94e8172f 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.130" + "pyright": "^1.1.133" } }, "node_modules/pyright": { - "version": "1.1.130", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.130.tgz", - "integrity": "sha512-hj4Lvn0x5LFsZDJaZ5hW5X4NfHSCoMvEqcNvRgpYM59qAM22z7XC+Tb7XNrQEhOfIjsbczS3nKWGGUMCe88LXg==", + "version": "1.1.133", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.133.tgz", + "integrity": "sha512-wnajVImrggbTOr8KUuENidk368QQyHcz6WrRvUEEP3l56mEzCaRxQ6MqGF+JsyMaJ7YPxM9t0a7wiqSg1+y4kA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.130", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.130.tgz", - "integrity": "sha512-hj4Lvn0x5LFsZDJaZ5hW5X4NfHSCoMvEqcNvRgpYM59qAM22z7XC+Tb7XNrQEhOfIjsbczS3nKWGGUMCe88LXg==", + "version": "1.1.133", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.133.tgz", + "integrity": "sha512-wnajVImrggbTOr8KUuENidk368QQyHcz6WrRvUEEP3l56mEzCaRxQ6MqGF+JsyMaJ7YPxM9t0a7wiqSg1+y4kA==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 69d68e630..ac8c812c6 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.130" + "pyright": "^1.1.133" } } From 3c8a4b8c05b4370bfb59d53999e522a2790e1790 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 22 Apr 2021 05:39:17 +0000 Subject: [PATCH 0160/1554] chore(deps): bump beet from 0.20.0 to 0.20.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.20.0 to 0.20.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.20.0...v0.20.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index adcf479b5..29d07a0a5 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.20.0" +version = "0.20.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -724,8 +724,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.20.0-py3-none-any.whl", hash = "sha256:4e0da69cefe166f604c8f991fbaddf710a7b21146fc1c8e2f577e4bdfabf3407"}, - {file = "beet-0.20.0.tar.gz", hash = "sha256:5911436686028b9f6fc3a29aa8a1ed3c67cea14650b1ec27a8098f088dc6c226"}, + {file = "beet-0.20.1-py3-none-any.whl", hash = "sha256:10b37bc1a989d04606b9c453b5b959a81d204b9a21b89078f631cfd5ce4f86cd"}, + {file = "beet-0.20.1.tar.gz", hash = "sha256:e014d7a39ea2ce101544c9bd21787972a8000f9a47a7e3310503bbe4d7f44e88"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, From c4adff38f6783f84eeb187f650fbcebb95aeb481 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 24 Apr 2021 02:39:34 +0200 Subject: [PATCH 0161/1554] feat: add prepend modifier --- packages/lectern/README.md | 8 + .../lectern/examples/prepend_modifier.txt | 8 + packages/lectern/lectern/directive.py | 3 + packages/lectern/poetry.lock | 181 +++++++++--------- packages/lectern/pyproject.toml | 2 +- .../examples__markdown_README_md__0.pack.md | 1 + ...n_examples_prepend_modifier_txt__0.pack.md | 31 +++ .../README.md | 1 + .../examples__text_README_md__0.pack.txt | 1 + ..._examples_prepend_modifier_txt__0.pack.txt | 11 ++ 10 files changed, 156 insertions(+), 91 deletions(-) create mode 100644 packages/lectern/examples/prepend_modifier.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 6e724ca6a..0865b1d24 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -314,6 +314,14 @@ The `append` modifier is implemented by all the text-based built-in namespaced r say This is added afterwards. ``` +You can also use `prepend` to add the fragment before the already-existing content. + +`@function(prepend) tutorial:greeting` + +```mcfunction +say This is added before. +``` + The `merge` modifier is similar but instead of concatenating the contents it uses the `beet` merging strategy to combine the fragment with the existing file. `@function_tag(merge) minecraft:load` diff --git a/packages/lectern/examples/prepend_modifier.txt b/packages/lectern/examples/prepend_modifier.txt new file mode 100644 index 000000000..a7457d0e3 --- /dev/null +++ b/packages/lectern/examples/prepend_modifier.txt @@ -0,0 +1,8 @@ +@function(prepend) demo:hello +say hello + +@skip +This is ignored. + +@function(prepend) demo:hello +say world diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index d7af86b5c..ed6a0e40a 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -84,6 +84,9 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): if fragment.modifier == "append": current_file = proxy.setdefault(full_name, self.file_type("")) current_file.text += file_instance.text + elif fragment.modifier == "prepend": + current_file = proxy.setdefault(full_name, self.file_type("")) + current_file.text = file_instance.text + current_file.text elif fragment.modifier == "merge": proxy.merge({full_name: file_instance}) else: diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index b2404d61c..aa3876e3c 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.20.0" +version = "0.21.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -183,7 +183,7 @@ test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pret [[package]] name = "docutils" -version = "0.16" +version = "0.17.1" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false @@ -221,14 +221,15 @@ smmap = ">=3.0.1,<5" [[package]] name = "gitpython" -version = "3.1.14" +version = "3.1.15" description = "Python Git Library" category = "dev" optional = false -python-versions = ">=3.4" +python-versions = ">=3.5" [package.dependencies] gitdb = ">=4.0.1,<5" +typing-extensions = ">=3.7.4.0" [[package]] name = "idna" @@ -240,7 +241,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "3.10.0" +version = "4.0.1" description = "Read metadata from Python packages" category = "dev" optional = false @@ -591,7 +592,7 @@ md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" -version = "2021.3.17" +version = "2021.4.4" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -713,7 +714,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.59.0" +version = "4.60.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -745,7 +746,7 @@ tqdm = ">=4.14" [[package]] name = "typed-ast" -version = "1.4.2" +version = "1.4.3" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -803,7 +804,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "45bcce7fc9ae921c0b2f9f793df8f67491364602e7f492dc35f55de68c9912b5" +content-hash = "a51c7137ea854aacee5234fb5b351c75cce85ba8c88257513f913f08e8a9207e" [metadata.files] appdirs = [ @@ -823,8 +824,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.20.0-py3-none-any.whl", hash = "sha256:4e0da69cefe166f604c8f991fbaddf710a7b21146fc1c8e2f577e4bdfabf3407"}, - {file = "beet-0.20.0.tar.gz", hash = "sha256:5911436686028b9f6fc3a29aa8a1ed3c67cea14650b1ec27a8098f088dc6c226"}, + {file = "beet-0.21.0-py3-none-any.whl", hash = "sha256:6f0e134ace439dd778b5a55f68a8163c63bc94f3a030ca9c24927bac16e2da2b"}, + {file = "beet-0.21.0.tar.gz", hash = "sha256:531b42775c84b81498e3c1c84682901438896393c737e9857ca2896f80970321"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -911,8 +912,8 @@ cryptography = [ {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] docutils = [ - {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, - {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, @@ -925,16 +926,16 @@ gitdb = [ {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, ] gitpython = [ - {file = "GitPython-3.1.14-py3-none-any.whl", hash = "sha256:3283ae2fba31c913d857e12e5ba5f9a7772bbc064ae2bb09efafa71b0dd4939b"}, - {file = "GitPython-3.1.14.tar.gz", hash = "sha256:be27633e7509e58391f10207cd32b2a6cf5b908f92d9cd30da2e514e1137af61"}, + {file = "GitPython-3.1.15-py3-none-any.whl", hash = "sha256:a77824e516d3298b04fb36ec7845e92747df8fcfee9cacc32dd6239f9652f867"}, + {file = "GitPython-3.1.15.tar.gz", hash = "sha256:05af150f47a5cca3f4b0af289b73aef8cf3c4fe2385015b06220cbcdee48bb6e"}, ] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] importlib-metadata = [ - {file = "importlib_metadata-3.10.0-py3-none-any.whl", hash = "sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe"}, - {file = "importlib_metadata-3.10.0.tar.gz", hash = "sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a"}, + {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"}, + {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1173,47 +1174,47 @@ readme-renderer = [ {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2021.3.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e"}, - {file = "regex-2021.3.17-cp36-cp36m-win32.whl", hash = "sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3"}, - {file = "regex-2021.3.17-cp36-cp36m-win_amd64.whl", hash = "sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5"}, - {file = "regex-2021.3.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643"}, - {file = "regex-2021.3.17-cp37-cp37m-win32.whl", hash = "sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be"}, - {file = "regex-2021.3.17-cp37-cp37m-win_amd64.whl", hash = "sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb"}, - {file = "regex-2021.3.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d"}, - {file = "regex-2021.3.17-cp38-cp38-win32.whl", hash = "sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf"}, - {file = "regex-2021.3.17-cp38-cp38-win_amd64.whl", hash = "sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa"}, - {file = "regex-2021.3.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7"}, - {file = "regex-2021.3.17-cp39-cp39-win32.whl", hash = "sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd"}, - {file = "regex-2021.3.17-cp39-cp39-win_amd64.whl", hash = "sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38"}, - {file = "regex-2021.3.17.tar.gz", hash = "sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68"}, + {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, + {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, + {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, + {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, + {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, + {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, + {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, + {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, + {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, + {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, + {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, + {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, + {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, ] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, @@ -1259,44 +1260,44 @@ tomlkit = [ {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.59.0-py2.py3-none-any.whl", hash = "sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7"}, - {file = "tqdm-4.59.0.tar.gz", hash = "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33"}, + {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, + {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, ] twine = [ {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] typing-extensions = [ {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index e53c29b61..2d678f8b9 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.19.1" +beet = ">=0.21.0" markdown-it-py = "^0.6.2" click = "^7.1.2" diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index 07e89a5ec..010047626 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -32,6 +32,7 @@
```mcfunction + say This is added before. say Hello, world! say This is added afterwards. ``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md new file mode 100644 index 000000000..8098c16a3 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md @@ -0,0 +1,31 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:hello` + +
+ + ```mcfunction + say world + say hello + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index 5a929ab75..136256ada 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -32,6 +32,7 @@
```mcfunction + say This is added before. say Hello, world! say This is added afterwards. ``` diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index f52922f15..0853b6b47 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -10,6 +10,7 @@ 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 @function tutorial:greeting +say This is added before. say Hello, world! say This is added afterwards. diff --git a/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt new file mode 100644 index 000000000..89cef2109 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt @@ -0,0 +1,11 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:hello +say world +say hello From ed2754ab99ab66709baadad4fe66d68ce0cd181f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 24 Apr 2021 00:40:53 +0000 Subject: [PATCH 0162/1554] 0.10.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 1986b64d8..54626b21c 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.10.0 (2021-04-24) +### Feature +* Add prepend modifier ([`5e1bb1e`](https://github.com/mcbeet/lectern/commit/5e1bb1e81835b8a8aaaedab0f1d2fb138bd3d993)) + ## v0.9.3 (2021-04-02) ### Fix * **deps:** Don't use caret to depend on beet because it's not 1.0 yet ([`a97779f`](https://github.com/mcbeet/lectern/commit/a97779fd7bcb22efafeb95b4f383cbd86d61000f)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 24692fd9c..44e377eb8 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.9.3" +__version__ = "0.10.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 2d678f8b9..1a6f071e4 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.9.3" +version = "0.10.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 37b0db95d7467d40fae7ec02d7f19bb6075d64d4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 25 Apr 2021 08:42:32 +0200 Subject: [PATCH 0163/1554] fix: the snapshot testing example was not using run_beet properly --- packages/lectern/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 0865b1d24..ebd3f3c96 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -640,8 +640,8 @@ If you're using the `beet` toolchain, keep in mind that you can get a `Document` ```python def test_generate_with_beet(snapshot): - ctx = run_beet(...) - assert snapshot("pack.txt") == ctx.inject(Document) + with run_beet(...) as ctx: + assert snapshot("pack.txt") == ctx.inject(Document) ``` This will save the entire data pack and resource pack in the snapshot. For more details about working with the generated snapshots check out the [`pytest-insta` documentation](https://github.com/vberlier/pytest-insta#command-line-options). From 6ca128d1f0509d69c5267536a00191b739cdf547 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 25 Apr 2021 06:43:23 +0000 Subject: [PATCH 0164/1554] 0.10.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 54626b21c..2741edcc1 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.10.1 (2021-04-25) +### Fix +* The snapshot testing example was not using run_beet properly ([`3c933e8`](https://github.com/mcbeet/lectern/commit/3c933e81080a1180b31d2940afca023ac9a7daf3)) + ## v0.10.0 (2021-04-24) ### Feature * Add prepend modifier ([`5e1bb1e`](https://github.com/mcbeet/lectern/commit/5e1bb1e81835b8a8aaaedab0f1d2fb138bd3d993)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 44e377eb8..adc7afc72 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.10.0" +__version__ = "0.10.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 1a6f071e4..58a77de8a 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.10.0" +version = "0.10.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From be65bc25aba3caeab01080859a92ec8a9ea812ef Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 05:24:38 +0000 Subject: [PATCH 0165/1554] chore(deps-dev): bump black from 20.8b1 to 21.4b0 Bumps [black](https://github.com/psf/black) from 20.8b1 to 21.4b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/master/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 52 ++++------------------------------- packages/mecha/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 47 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 29d07a0a5..35daa77b5 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -61,11 +61,11 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "20.8b1" +version = "21.4b0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.2" [package.dependencies] appdirs = "*" @@ -74,12 +74,11 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.6,<1" regex = ">=2020.1.8" toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +python2 = ["typed-ast (>=1.4.2)"] [[package]] name = "bleach" @@ -664,14 +663,6 @@ requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" rfc3986 = ">=1.4.0" tqdm = ">=4.14" -[[package]] -name = "typed-ast" -version = "1.4.2" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "typing-extensions" version = "3.7.4.3" @@ -704,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "796ec9346da64aa7c9600b7cb1910651691230e6f3b6785b8a102dc1ebcdc10c" +content-hash = "c88a422c90ab455b68629739599682025c5c1db2b19789583cf8ab3c6eeb2d5d" [metadata.files] appdirs = [ @@ -728,7 +719,8 @@ beet = [ {file = "beet-0.20.1.tar.gz", hash = "sha256:e014d7a39ea2ce101544c9bd21787972a8000f9a47a7e3310503bbe4d7f44e88"}, ] black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, + {file = "black-21.4b0-py3-none-any.whl", hash = "sha256:2db7040bbbbaa46247bfcc05c6efdebd7ebe50c1c3ca745ca6e0f6776438c96c"}, + {file = "black-21.4b0.tar.gz", hash = "sha256:915d916c48646dbe8040d5265cff7111421a60a3dfe7f7e07273176a57c24a34"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -1166,38 +1158,6 @@ twine = [ {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, ] -typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, -] typing-extensions = [ {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9d2f991ac..c4243febe 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.21.0" [tool.poetry.dev-dependencies] -black = "^20.8b1" +black = "^21.4b0" isort = "^5.8.0" pytest = "^6.2.3" python-semantic-release = "^7.15.3" From 7b12c65c3d0412d0f37cf6be581cd7134acddf3f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 05:28:28 +0000 Subject: [PATCH 0166/1554] chore(deps): bump beet from 0.20.1 to 0.21.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.20.1 to 0.21.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.20.1...v0.21.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 35daa77b5..4255feda4 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.20.1" +version = "0.21.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "c88a422c90ab455b68629739599682025c5c1db2b19789583cf8ab3c6eeb2d5d" +content-hash = "62fc41745bd45939d4df71e854c9bc4791bec71677b74ddf50f29b06dc7fa260" [metadata.files] appdirs = [ @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.20.1-py3-none-any.whl", hash = "sha256:10b37bc1a989d04606b9c453b5b959a81d204b9a21b89078f631cfd5ce4f86cd"}, - {file = "beet-0.20.1.tar.gz", hash = "sha256:e014d7a39ea2ce101544c9bd21787972a8000f9a47a7e3310503bbe4d7f44e88"}, + {file = "beet-0.21.0-py3-none-any.whl", hash = "sha256:6f0e134ace439dd778b5a55f68a8163c63bc94f3a030ca9c24927bac16e2da2b"}, + {file = "beet-0.21.0.tar.gz", hash = "sha256:531b42775c84b81498e3c1c84682901438896393c737e9857ca2896f80970321"}, ] black = [ {file = "black-21.4b0-py3-none-any.whl", hash = "sha256:2db7040bbbbaa46247bfcc05c6efdebd7ebe50c1c3ca745ca6e0f6776438c96c"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c4243febe..9d7e32c04 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.21.0" +beet = ">=0.5.1,<0.22.0" [tool.poetry.dev-dependencies] black = "^21.4b0" From 8f96011bdd9acbb26d8d800101524fde2daae7aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 09:05:53 +0000 Subject: [PATCH 0167/1554] chore(deps-dev): bump pyright from 1.1.133 to 1.1.135 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.133 to 1.1.135. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.135/packages/pyright) Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index a94e8172f..fa6021977 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.133" + "pyright": "^1.1.135" } }, "node_modules/pyright": { - "version": "1.1.133", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.133.tgz", - "integrity": "sha512-wnajVImrggbTOr8KUuENidk368QQyHcz6WrRvUEEP3l56mEzCaRxQ6MqGF+JsyMaJ7YPxM9t0a7wiqSg1+y4kA==", + "version": "1.1.135", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.135.tgz", + "integrity": "sha512-veb8la4UJJfxkuHopZoJo3fM77X7pBaJ4LvF2KP0nnqTjw0+x9rYVcjKhEVLKGighy2MNpe/SQ9ytoQPRMkkEw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.133", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.133.tgz", - "integrity": "sha512-wnajVImrggbTOr8KUuENidk368QQyHcz6WrRvUEEP3l56mEzCaRxQ6MqGF+JsyMaJ7YPxM9t0a7wiqSg1+y4kA==", + "version": "1.1.135", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.135.tgz", + "integrity": "sha512-veb8la4UJJfxkuHopZoJo3fM77X7pBaJ4LvF2KP0nnqTjw0+x9rYVcjKhEVLKGighy2MNpe/SQ9ytoQPRMkkEw==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index ac8c812c6..3d4888def 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.133" + "pyright": "^1.1.135" } } From 4a6eff4e1db6b4bc881f898aeb30bee657b2315b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 09:08:31 +0000 Subject: [PATCH 0168/1554] chore(deps-dev): bump black from 20.8b1 to 21.4b0 Bumps [black](https://github.com/psf/black) from 20.8b1 to 21.4b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/master/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 52 ++++----------------------------- packages/lectern/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 47 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index aa3876e3c..6971ca6d9 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -61,11 +61,11 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "20.8b1" +version = "21.4b0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.2" [package.dependencies] appdirs = "*" @@ -74,12 +74,11 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.6,<1" regex = ">=2020.1.8" toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +python2 = ["typed-ast (>=1.4.2)"] [[package]] name = "bleach" @@ -744,14 +743,6 @@ requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" rfc3986 = ">=1.4.0" tqdm = ">=4.14" -[[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "typing-extensions" version = "3.7.4.3" @@ -804,7 +795,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "a51c7137ea854aacee5234fb5b351c75cce85ba8c88257513f913f08e8a9207e" +content-hash = "27a7405db30fa599c1e20c2fc2415391a89c04c2509b45ca442274469c16f41d" [metadata.files] appdirs = [ @@ -828,7 +819,8 @@ beet = [ {file = "beet-0.21.0.tar.gz", hash = "sha256:531b42775c84b81498e3c1c84682901438896393c737e9857ca2896f80970321"}, ] black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, + {file = "black-21.4b0-py3-none-any.whl", hash = "sha256:2db7040bbbbaa46247bfcc05c6efdebd7ebe50c1c3ca745ca6e0f6776438c96c"}, + {file = "black-21.4b0.tar.gz", hash = "sha256:915d916c48646dbe8040d5265cff7111421a60a3dfe7f7e07273176a57c24a34"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -1267,38 +1259,6 @@ twine = [ {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] -typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] typing-extensions = [ {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 58a77de8a..756cc08e9 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -30,7 +30,7 @@ markdown-it-py = "^0.6.2" click = "^7.1.2" [tool.poetry.dev-dependencies] -black = "^20.8b1" +black = "^21.4b0" rope = "^0.19.0" pytest = "^6.2.3" isort = "^5.8.0" From b7a3da63d091e48277061862f1d94df1bd16d51d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 27 Apr 2021 07:47:18 +0200 Subject: [PATCH 0169/1554] feat: add sound and particle directives --- packages/lectern/README.md | 4 ++-- packages/lectern/lectern/directive.py | 4 ++++ packages/lectern/poetry.lock | 14 +++++++------- packages/lectern/pyproject.toml | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index ebd3f3c96..85c7be06e 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -137,8 +137,8 @@ Here is a reference of all the supported resources: | `@dimension_type` | `@text` | | `@dimension` | `@texture_mcmeta` | | `@biome` | `@texture` | -| `@configured_carver` | | -| `@configured_feature` | | +| `@configured_carver` | `@sound` | +| `@configured_feature` | `@particle` | | `@configured_structure_feature` | | | `@configured_surface_builder` | | | `@noise_settings` | | diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index ed6a0e40a..66ec0206d 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -49,8 +49,10 @@ GlyphSizeFile, Language, Model, + Particle, Shader, ShaderPost, + Sound, Text, Texture, TextureMcmeta, @@ -192,6 +194,8 @@ def get_builtin_directives() -> Dict[ "text": NamespacedResourceDirective(Text), "texture_mcmeta": NamespacedResourceDirective(TextureMcmeta), "texture": NamespacedResourceDirective(Texture), + "sound": NamespacedResourceDirective(Sound), + "particle": NamespacedResourceDirective(Particle), "data_pack": DataPackDirective(), "resource_pack": ResourcePackDirective(), diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 6971ca6d9..c371f39aa 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.21.0" +version = "0.22.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -525,7 +525,7 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "2.6.0" +version = "2.7.1" description = "Interact with GitLab API" category = "dev" optional = false @@ -795,7 +795,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "27a7405db30fa599c1e20c2fc2415391a89c04c2509b45ca442274469c16f41d" +content-hash = "744c28ba3c2a53ef985ba98e08a699ceda2fa93cc3e8172f63bef09717752465" [metadata.files] appdirs = [ @@ -815,8 +815,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.21.0-py3-none-any.whl", hash = "sha256:6f0e134ace439dd778b5a55f68a8163c63bc94f3a030ca9c24927bac16e2da2b"}, - {file = "beet-0.21.0.tar.gz", hash = "sha256:531b42775c84b81498e3c1c84682901438896393c737e9857ca2896f80970321"}, + {file = "beet-0.22.0-py3-none-any.whl", hash = "sha256:697c60b6527cb2c7418e3567bc8cd66141b8c546506814091f79c2fb1c7fb7a8"}, + {file = "beet-0.22.0.tar.gz", hash = "sha256:5c76595dfc7d96528321ddbe12f0baa048cab3473272b1166cd55af5e1cfe55b"}, ] black = [ {file = "black-21.4b0-py3-none-any.whl", hash = "sha256:2db7040bbbbaa46247bfcc05c6efdebd7ebe50c1c3ca745ca6e0f6776438c96c"}, @@ -1150,8 +1150,8 @@ pytest-insta = [ {file = "pytest_insta-0.1.10-py3-none-any.whl", hash = "sha256:3043c4a668224f473df3de1d60fb356e356687b6931338c42c487abd0c9a19d8"}, ] python-gitlab = [ - {file = "python-gitlab-2.6.0.tar.gz", hash = "sha256:a862c6874524ab585b725a17b2cd2950fc09d6d74205f40a11be2a4e8f2dcaa1"}, - {file = "python_gitlab-2.6.0-py3-none-any.whl", hash = "sha256:8f6a62b2804021416f13e91f359085f1071fb7adedfb292ef0d0877df777a075"}, + {file = "python-gitlab-2.7.1.tar.gz", hash = "sha256:e1f9234a3ee7fbcf9ab1a5cb8b935ae58fdab29af9832ae060bf74d88bac8a7c"}, + {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ {file = "python-semantic-release-7.15.3.tar.gz", hash = "sha256:0ffcb267923731b3578d4377de67c59c5779c80e514ef9883c47c8877c059d74"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 756cc08e9..54a42bfd2 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.21.0" +beet = ">=0.22.0" markdown-it-py = "^0.6.2" click = "^7.1.2" From fd1ee758496a159fc058bcae68ce4b1d5c537c69 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 27 Apr 2021 05:48:35 +0000 Subject: [PATCH 0170/1554] 0.11.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 2741edcc1..5c0062add 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.11.0 (2021-04-27) +### Feature +* Add sound and particle directives ([`87aa5f9`](https://github.com/mcbeet/lectern/commit/87aa5f981bac2db1289ffd55d583e6f5af818108)) + ## v0.10.1 (2021-04-25) ### Fix * The snapshot testing example was not using run_beet properly ([`3c933e8`](https://github.com/mcbeet/lectern/commit/3c933e81080a1180b31d2940afca023ac9a7daf3)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index adc7afc72..3be7c3dd6 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.10.1" +__version__ = "0.11.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 54a42bfd2..35f019c49 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.10.1" +version = "0.11.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 211a131960715525efe83667f5779e1a6eaba9bb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 27 Apr 2021 08:36:32 +0200 Subject: [PATCH 0171/1554] fix: serialize namespace extra --- packages/lectern/examples/sound.txt | 12 ++++++ packages/lectern/lectern/serialize.py | 20 ++++++++++ ...es__markdown_examples_sound_txt__0.pack.md | 39 +++++++++++++++++++ ...mples__text_examples_sound_txt__0.pack.txt | 20 ++++++++++ 4 files changed, 91 insertions(+) create mode 100644 packages/lectern/examples/sound.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt diff --git a/packages/lectern/examples/sound.txt b/packages/lectern/examples/sound.txt new file mode 100644 index 000000000..dac8a1922 --- /dev/null +++ b/packages/lectern/examples/sound.txt @@ -0,0 +1,12 @@ +@resource_pack assets/minecraft/sounds.json +{ + "block.note_block.bit_1": { + "sounds": [ + "block/note_block/bit_1" + ], + "subtitle": "subtitles.block.note_block.note" + } +} + +@sound(base64) minecraft:block/note_block/bit_1 +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lAJABAMAYg5BBBiFjEEIIIYQQQggJAAAYcAAACDChDBQashIASAUAAAxSijEHpaQUKcWYcxBKSSlSijHnIJSSUsWYcxBKSam1ijHnIJSSUmudcxBKSam1GDvnIJSSUmsxhhBKSam1GGMMIZSSUmsx1lpKSam1GGvMtZSSUmsx1lprSq21GGutNeeUWmsx1lpzzgUAIDQ4AIAd2LA6wknRWGChISsBgDwAAEgpxhhjjDGlFGOMMcaYUooxxhhjjDHGGGOMMaYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHmGGOMMcYYY8w5xhhjjDnmHGOMMcacc04AAFCBAwBAgI0imxOMBBUashIACAcAAIxhzDnnIJSQSqOUcxBCKCWVVhqlnIMSQikptZY5JyWlUlJqLbbMOSkplZJSay12ElJqLaXWYqyxg5BSa6m1FmONHYRSWootxhpz7SCUklprMcZaayilpdhirLHWmkMpqbUWY60151xSai3GWmvNteeSUmsxxlprrbmn1mKssdZcc+89tRZjjbXmnHvOBQCYPDgAQCXYOMNK0lnhaHChISsBgNwAAEYpxpxzDkIIIYQQQgiVUow55xyEEEIIIYQQKqUYc845CCGEEEIIIWSMOeccdBBCCCGEEELIGHPOOQghhBBCCCGE0DnnHIQQQgghhFBCKaVzzjkHIYQQQgghhFBK5xyEEEIIIYQSSiillM45CCGEEEIIpYRSSikhhBBCCCGEEkoppZRSOgghhBBCCKWUUkoppYQQQgghhBBKKaWUUkoJIYQQQgghlFJKKaWUEkIIIYQSSimllFJKKSWEEEIIoZRSSimllFJKCCGEUkoppZRSSimllBBCKCGUUkoppZRSSikhhBJKKKWUUkoppZRSQggllFJKKaWUUkoppYQQQiillFJKKaWUUkoJIZRSSimllFJKKaWUUgAA0IEDAECAEZUWYqcZVx6BIwoZJqBCQ1YCAOEAAAAhlFJKKaWUUmokpZRSSimllFIjJaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSqWUUkoppZRSSimllFJKKaWUUkoppQCoywwHwOgJG2dYSTorHA0uNGQ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 diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 89d359d09..93cf4b987 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -151,6 +151,15 @@ def serialize(self, assets: ResourcePack, data: DataPack) -> str: (extra_directive, path, file_instance) for path, file_instance in pack.extra.items() ), + ( + ( + extra_directive, + f"{namespace.directory}/{name}/{path}", + file_instance, + ) + for name, namespace in pack.items() + for path, file_instance in namespace.extra.items() + ), ( ( NAMESPACED_RESOURCE_DIRECTIVES[file_type], @@ -220,6 +229,17 @@ def serialize_pack( for name, namespace in pack.items(): yield f"\n### {name}" + for path, file_instance in namespace.extra.items(): + yield from self.format_serialized_file( + self.serialize_file_instance( + pack_directive, + f"{namespace.directory}/{name}/{path}", + file_instance, + external_files, + external_prefix, + ) + ) + for file_type, container in namespace.items(): directive_name = NAMESPACED_RESOURCE_DIRECTIVES[file_type] diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md new file mode 100644 index 000000000..80f7bf05a --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md @@ -0,0 +1,39 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@resource_pack assets/minecraft/sounds.json` + +
+ + ```json + { + "block.note_block.bit_1": { + "sounds": [ + "block/note_block/bit_1" + ], + "subtitle": "subtitles.block.note_block.note" + } + } + ``` + +
+ +- [`@sound minecraft:block/note_block/bit_1`](data:audio/ogg;base64,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AJABAMAYg5BBBiFjEEIIIYQQQggJAAAYcAAACDChDBQashIASAUAAAxSijEHpaQUKcWYcxBKSSlSijHnIJSSUsWYcxBKSam1ijHnIJSSUmudcxBKSam1GDvnIJSSUmsxhhBKSam1GGMMIZSSUmsx1lpKSam1GGvMtZSSUmsx1lprSq21GGutNeeUWmsx1lpzzgUAIDQ4AIAd2LA6wknRWGChISsBgDwAAEgpxhhjjDGlFGOMMcaYUooxxhhjjDHGGGOMMaYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHmGGOMMcYYY8w5xhhjjDnmHGOMMcacc04AAFCBAwBAgI0imxOMBBUashIACAcAAIxhzDnnIJSQSqOUcxBCKCWVVhqlnIMSQikptZY5JyWlUlJqLbbMOSkplZJSay12ElJqLaXWYqyxg5BSa6m1FmONHYRSWootxhpz7SCUklprMcZaayilpdhirLHWmkMpqbUWY60151xSai3GWmvNteeSUmsxxlprrbmn1mKssdZcc+89tRZjjbXmnHvOBQCYPDgAQCXYOMNK0lnhaHChISsBgNwAAEYpxpxzDkIIIYQQQgiVUow55xyEEEIIIYQQKqUYc845CCGEEEIIIWSMOeccdBBCCCGEEELIGHPOOQghhBBCCCGE0DnnHIQQQgghhFBCKaVzzjkHIYQQQgghhFBK5xyEEEIIIYQSSiillM45CCGEEEIIpYRSSikhhBBCCCGEEkoppZRSOgghhBBCCKWUUkoppYQQQgghhBBKKaWUUkoJIYQQQgghlFJKKaWUEkIIIYQSSimllFJKKSWEEEIIoZRSSimllFJKCCGEUkoppZRSSimllBBCKCGUUkoppZRSSikhhBJKKKWUUkoppZRSQggllFJKKaWUUkoppYQQQiillFJKKaWUUkoJIZRSSimllFJKKaWUUgAA0IEDAECAEZUWYqcZVx6BIwoZJqBCQ1YCAOEAAAAhlFJKKaWUUmokpZRSSimllFIjJaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSqWUUkoppZRSSimllFJKKaWUUkoppQCoywwHwOgJG2dYSTorHA0uNGQl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) diff --git a/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt new file mode 100644 index 000000000..56c2a7c13 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt @@ -0,0 +1,20 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@resource_pack assets/minecraft/sounds.json +{ + "block.note_block.bit_1": { + "sounds": [ + "block/note_block/bit_1" + ], + "subtitle": "subtitles.block.note_block.note" + } +} + +@sound(base64) minecraft:block/note_block/bit_1 +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lAJABAMAYg5BBBiFjEEIIIYQQQggJAAAYcAAACDChDBQashIASAUAAAxSijEHpaQUKcWYcxBKSSlSijHnIJSSUsWYcxBKSam1ijHnIJSSUmudcxBKSam1GDvnIJSSUmsxhhBKSam1GGMMIZSSUmsx1lpKSam1GGvMtZSSUmsx1lprSq21GGutNeeUWmsx1lpzzgUAIDQ4AIAd2LA6wknRWGChISsBgDwAAEgpxhhjjDGlFGOMMcaYUooxxhhjjDHGGGOMMaYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHmGGOMMcYYY8w5xhhjjDnmHGOMMcacc04AAFCBAwBAgI0imxOMBBUashIACAcAAIxhzDnnIJSQSqOUcxBCKCWVVhqlnIMSQikptZY5JyWlUlJqLbbMOSkplZJSay12ElJqLaXWYqyxg5BSa6m1FmONHYRSWootxhpz7SCUklprMcZaayilpdhirLHWmkMpqbUWY60151xSai3GWmvNteeSUmsxxlprrbmn1mKssdZcc+89tRZjjbXmnHvOBQCYPDgAQCXYOMNK0lnhaHChISsBgNwAAEYpxpxzDkIIIYQQQgiVUow55xyEEEIIIYQQKqUYc845CCGEEEIIIWSMOeccdBBCCCGEEELIGHPOOQghhBBCCCGE0DnnHIQQQgghhFBCKaVzzjkHIYQQQgghhFBK5xyEEEIIIYQSSiillM45CCGEEEIIpYRSSikhhBBCCCGEEkoppZRSOgghhBBCCKWUUkoppYQQQgghhBBKKaWUUkoJIYQQQgghlFJKKaWUEkIIIYQSSimllFJKKSWEEEIIoZRSSimllFJKCCGEUkoppZRSSimllBBCKCGUUkoppZRSSikhhBJKKKWUUkoppZRSQggllFJKKaWUUkoppYQQQiillFJKKaWUUkoJIZRSSimllFJKKaWUUgAA0IEDAECAEZUWYqcZVx6BIwoZJqBCQ1YCAOEAAAAhlFJKKaWUUmokpZRSSimllFIjJaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSqWUUkoppZRSSimllFJKKaWUUkoppQCoywwHwOgJG2dYSTorHA0uNGQ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 From 74c5aebf11952a86f10d6d264901b411cd873ecb Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 27 Apr 2021 06:37:20 +0000 Subject: [PATCH 0172/1554] 0.11.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 5c0062add..a2ce6a75b 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.11.1 (2021-04-27) +### Fix +* Serialize namespace extra ([`94f1995`](https://github.com/mcbeet/lectern/commit/94f1995808d9be25c5a604132b99aff7554984ba)) + ## v0.11.0 (2021-04-27) ### Feature * Add sound and particle directives ([`87aa5f9`](https://github.com/mcbeet/lectern/commit/87aa5f981bac2db1289ffd55d583e6f5af818108)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 3be7c3dd6..3a6f600f7 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.11.0" +__version__ = "0.11.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 35f019c49..e8915ab1f 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.11.0" +version = "0.11.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 4718500789dfcd854830f27627eb388c3eabb592 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 28 Apr 2021 13:59:47 +0000 Subject: [PATCH 0173/1554] chore(deps-dev): bump black from 21.4b0 to 21.4b1 Bumps [black](https://github.com/psf/black) from 21.4b0 to 21.4b1. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/master/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4255feda4..f4c11f6bd 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.4b0" +version = "21.4b1" description = "The uncompromising code formatter." category = "dev" optional = false @@ -71,7 +71,7 @@ python-versions = ">=3.6.2" appdirs = "*" click = ">=7.1.2" mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" +pathspec = ">=0.8.1,<1" regex = ">=2020.1.8" toml = ">=0.10.1" @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "62fc41745bd45939d4df71e854c9bc4791bec71677b74ddf50f29b06dc7fa260" +content-hash = "9287dd4516be853ac5e67a5e0a7fdccefebcc2673213a71852fa967d903a1506" [metadata.files] appdirs = [ @@ -719,8 +719,8 @@ beet = [ {file = "beet-0.21.0.tar.gz", hash = "sha256:531b42775c84b81498e3c1c84682901438896393c737e9857ca2896f80970321"}, ] black = [ - {file = "black-21.4b0-py3-none-any.whl", hash = "sha256:2db7040bbbbaa46247bfcc05c6efdebd7ebe50c1c3ca745ca6e0f6776438c96c"}, - {file = "black-21.4b0.tar.gz", hash = "sha256:915d916c48646dbe8040d5265cff7111421a60a3dfe7f7e07273176a57c24a34"}, + {file = "black-21.4b1-py3-none-any.whl", hash = "sha256:c9601dc863779db2fb1bf18b345bbfa2bb868463123cde6a7eff44b59e4ef739"}, + {file = "black-21.4b1.tar.gz", hash = "sha256:20d326de75d13be6290925a95c94a9f368aca2f71cb7b753a938a5ae20f34a37"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9d7e32c04..b8a357c0c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.22.0" [tool.poetry.dev-dependencies] -black = "^21.4b0" +black = "^21.4b1" isort = "^5.8.0" pytest = "^6.2.3" python-semantic-release = "^7.15.3" From e9b10a0185f0b4161469b1a3eb7ff2e4ae470f7e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 28 Apr 2021 14:03:25 +0000 Subject: [PATCH 0174/1554] chore(deps): bump beet from 0.21.0 to 0.22.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.21.0 to 0.22.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.21.0...v0.22.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f4c11f6bd..9cc0f96db 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.21.0" +version = "0.22.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9287dd4516be853ac5e67a5e0a7fdccefebcc2673213a71852fa967d903a1506" +content-hash = "7108f181e38b67ac4e2c040bd45f4ea5882fb8b59e64209a80ed26b6098e6a4b" [metadata.files] appdirs = [ @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.21.0-py3-none-any.whl", hash = "sha256:6f0e134ace439dd778b5a55f68a8163c63bc94f3a030ca9c24927bac16e2da2b"}, - {file = "beet-0.21.0.tar.gz", hash = "sha256:531b42775c84b81498e3c1c84682901438896393c737e9857ca2896f80970321"}, + {file = "beet-0.22.0-py3-none-any.whl", hash = "sha256:697c60b6527cb2c7418e3567bc8cd66141b8c546506814091f79c2fb1c7fb7a8"}, + {file = "beet-0.22.0.tar.gz", hash = "sha256:5c76595dfc7d96528321ddbe12f0baa048cab3473272b1166cd55af5e1cfe55b"}, ] black = [ {file = "black-21.4b1-py3-none-any.whl", hash = "sha256:c9601dc863779db2fb1bf18b345bbfa2bb868463123cde6a7eff44b59e4ef739"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b8a357c0c..baa41f825 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.22.0" +beet = ">=0.5.1,<0.23.0" [tool.poetry.dev-dependencies] black = "^21.4b1" From dea9f84d123f0e6a60ceeb1da693c6132488b0a4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Apr 2021 05:21:21 +0000 Subject: [PATCH 0175/1554] chore(deps-dev): bump black from 21.4b1 to 21.4b2 Bumps [black](https://github.com/psf/black) from 21.4b1 to 21.4b2. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/master/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 9cc0f96db..4af2f3f34 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.4b1" +version = "21.4b2" description = "The uncompromising code formatter." category = "dev" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7108f181e38b67ac4e2c040bd45f4ea5882fb8b59e64209a80ed26b6098e6a4b" +content-hash = "3ef5f306f8902308bb9fad4390b9c1a4eb15c11900ef891da68bf873b119a2f6" [metadata.files] appdirs = [ @@ -719,8 +719,8 @@ beet = [ {file = "beet-0.22.0.tar.gz", hash = "sha256:5c76595dfc7d96528321ddbe12f0baa048cab3473272b1166cd55af5e1cfe55b"}, ] black = [ - {file = "black-21.4b1-py3-none-any.whl", hash = "sha256:c9601dc863779db2fb1bf18b345bbfa2bb868463123cde6a7eff44b59e4ef739"}, - {file = "black-21.4b1.tar.gz", hash = "sha256:20d326de75d13be6290925a95c94a9f368aca2f71cb7b753a938a5ae20f34a37"}, + {file = "black-21.4b2-py3-none-any.whl", hash = "sha256:bff7067d8bc25eb21dcfdbc8c72f2baafd9ec6de4663241a52fb904b304d391f"}, + {file = "black-21.4b2.tar.gz", hash = "sha256:fc9bcf3b482b05c1f35f6a882c079dc01b9c7795827532f4cc43c0ec88067bbc"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index baa41f825..36efecf29 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.23.0" [tool.poetry.dev-dependencies] -black = "^21.4b1" +black = "^21.4b2" isort = "^5.8.0" pytest = "^6.2.3" python-semantic-release = "^7.15.3" From 61b68ea6d4a1632af7043e293f2cf8d14e3440aa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 30 Apr 2021 05:25:51 +0000 Subject: [PATCH 0176/1554] chore(deps-dev): bump python-semantic-release from 7.15.3 to 7.15.4 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.3 to 7.15.4. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.3...v7.15.4) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4af2f3f34..f22a64406 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -474,7 +474,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.15.3" +version = "7.15.4" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "3ef5f306f8902308bb9fad4390b9c1a4eb15c11900ef891da68bf873b119a2f6" +content-hash = "e5230875e967d043b9ad0c0edb5b4c0f4e2dca32e21cbc11ab03ab667a27c359" [metadata.files] appdirs = [ @@ -1050,8 +1050,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.3.tar.gz", hash = "sha256:0ffcb267923731b3578d4377de67c59c5779c80e514ef9883c47c8877c059d74"}, - {file = "python_semantic_release-7.15.3-py3-none-any.whl", hash = "sha256:9b5c6e7ff9887b0cc8178004aa101aae2bfec8a464316cf287be8acbdf1e4954"}, + {file = "python-semantic-release-7.15.4.tar.gz", hash = "sha256:cb2a02a35c48d8ea81b83c3d913ee0bf5f4e26e97f4cbc8f25930e4a80792eae"}, + {file = "python_semantic_release-7.15.4-py3-none-any.whl", hash = "sha256:a62ff8a9c909737fb45adb1c90dfa4938eb0e329831b91a26b7b586b378e4f94"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 36efecf29..1fed8d2ab 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.5.1,<0.23.0" black = "^21.4b2" isort = "^5.8.0" pytest = "^6.2.3" -python-semantic-release = "^7.15.3" +python-semantic-release = "^7.15.4" [tool.black] target-version = ["py38"] From 35139ceace60725804bbd0d4cfa9bc570610a0e6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 May 2021 05:29:50 +0000 Subject: [PATCH 0177/1554] chore(deps): bump beet from 0.22.0 to 0.22.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.22.0 to 0.22.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.22.0...v0.22.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f22a64406..8b9d47662 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.22.0" +version = "0.22.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.22.0-py3-none-any.whl", hash = "sha256:697c60b6527cb2c7418e3567bc8cd66141b8c546506814091f79c2fb1c7fb7a8"}, - {file = "beet-0.22.0.tar.gz", hash = "sha256:5c76595dfc7d96528321ddbe12f0baa048cab3473272b1166cd55af5e1cfe55b"}, + {file = "beet-0.22.1-py3-none-any.whl", hash = "sha256:75010a6a90c29625a5f84436266c8bee8ede774ca738e66f2d350560d8f08f55"}, + {file = "beet-0.22.1.tar.gz", hash = "sha256:d354be21b2ebc5bee83cb686a88bedc26bbd1b7a4225fc85277232221629c785"}, ] black = [ {file = "black-21.4b2-py3-none-any.whl", hash = "sha256:bff7067d8bc25eb21dcfdbc8c72f2baafd9ec6de4663241a52fb904b304d391f"}, From bf647dfa2f4f01f57644f88f3ccd756c3be5420c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 05:26:29 +0000 Subject: [PATCH 0178/1554] chore(deps): bump beet from 0.22.1 to 0.22.2 Bumps [beet](https://github.com/mcbeet/beet) from 0.22.1 to 0.22.2. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.22.1...v0.22.2) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 8b9d47662..68b1b26da 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.22.1" +version = "0.22.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.22.1-py3-none-any.whl", hash = "sha256:75010a6a90c29625a5f84436266c8bee8ede774ca738e66f2d350560d8f08f55"}, - {file = "beet-0.22.1.tar.gz", hash = "sha256:d354be21b2ebc5bee83cb686a88bedc26bbd1b7a4225fc85277232221629c785"}, + {file = "beet-0.22.2-py3-none-any.whl", hash = "sha256:700cca328860e96eca04af8ca9fb35f5ed5c217849a73ec0babd7a74f0a893a8"}, + {file = "beet-0.22.2.tar.gz", hash = "sha256:ba84acf260295d5fe0186156fb97415781e6faca78825e420cc9819368152b34"}, ] black = [ {file = "black-21.4b2-py3-none-any.whl", hash = "sha256:bff7067d8bc25eb21dcfdbc8c72f2baafd9ec6de4663241a52fb904b304d391f"}, From 9b624f8c5a6b66f3f7d88003be1e0c460c6c12b8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 05:27:23 +0000 Subject: [PATCH 0179/1554] chore(deps-dev): bump black from 21.4b2 to 21.5b0 Bumps [black](https://github.com/psf/black) from 21.4b2 to 21.5b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/master/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 8b9d47662..0f2d7d5ed 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.4b2" +version = "21.5b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e5230875e967d043b9ad0c0edb5b4c0f4e2dca32e21cbc11ab03ab667a27c359" +content-hash = "f78b2a4ee8162bb462e27e170164acec4a0be37d6515fae9f27643310957cb61" [metadata.files] appdirs = [ @@ -719,8 +719,8 @@ beet = [ {file = "beet-0.22.1.tar.gz", hash = "sha256:d354be21b2ebc5bee83cb686a88bedc26bbd1b7a4225fc85277232221629c785"}, ] black = [ - {file = "black-21.4b2-py3-none-any.whl", hash = "sha256:bff7067d8bc25eb21dcfdbc8c72f2baafd9ec6de4663241a52fb904b304d391f"}, - {file = "black-21.4b2.tar.gz", hash = "sha256:fc9bcf3b482b05c1f35f6a882c079dc01b9c7795827532f4cc43c0ec88067bbc"}, + {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, + {file = "black-21.5b0.tar.gz", hash = "sha256:9dc2042018ca10735366d944c2c12d9cad6dec74a3d5f679d09384ea185d9943"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1fed8d2ab..59296f6b3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.23.0" [tool.poetry.dev-dependencies] -black = "^21.4b2" +black = "^21.5b0" isort = "^5.8.0" pytest = "^6.2.3" python-semantic-release = "^7.15.4" From 37e2f6131161bdc4034b2e6069c77b7b19ba65a7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 05:31:01 +0000 Subject: [PATCH 0180/1554] chore(deps-dev): bump pytest from 6.2.3 to 6.2.4 Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.3 to 6.2.4. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.2.3...6.2.4) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 67061493b..6a39975f1 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -441,7 +441,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.3" +version = "6.2.4" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f78b2a4ee8162bb462e27e170164acec4a0be37d6515fae9f27643310957cb61" +content-hash = "35499eb02835f1acce8e16f6243a4ad94021793040896a8081d7e7c39da5c05b" [metadata.files] appdirs = [ @@ -1042,8 +1042,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"}, - {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"}, + {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, + {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, ] python-gitlab = [ {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 59296f6b3..d3fec5e25 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -28,7 +28,7 @@ beet = ">=0.5.1,<0.23.0" [tool.poetry.dev-dependencies] black = "^21.5b0" isort = "^5.8.0" -pytest = "^6.2.3" +pytest = "^6.2.4" python-semantic-release = "^7.15.4" [tool.black] From 45abd0748301525a95ee918585930554caa49705 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 05:20:26 +0000 Subject: [PATCH 0181/1554] chore(deps): bump beet from 0.22.2 to 0.22.3 Bumps [beet](https://github.com/mcbeet/beet) from 0.22.2 to 0.22.3. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.22.2...v0.22.3) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6a39975f1..0d20b556b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.22.2" +version = "0.22.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.22.2-py3-none-any.whl", hash = "sha256:700cca328860e96eca04af8ca9fb35f5ed5c217849a73ec0babd7a74f0a893a8"}, - {file = "beet-0.22.2.tar.gz", hash = "sha256:ba84acf260295d5fe0186156fb97415781e6faca78825e420cc9819368152b34"}, + {file = "beet-0.22.3-py3-none-any.whl", hash = "sha256:16fec4b80a323b42cded53e2db55b47ff134a0bbff4e2c17ca58adf855aa3dc4"}, + {file = "beet-0.22.3.tar.gz", hash = "sha256:50b121f5a0d659ccefa205e8bba352e52fb2e9f6279f870bb1261dc02ed3c2ba"}, ] black = [ {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, From 7004f6006609dad9be77b7dae021e2f123a08e26 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 12:20:24 +0200 Subject: [PATCH 0182/1554] chore: update deps --- packages/lectern/poetry.lock | 54 ++++++++++++++++----------------- packages/lectern/pyproject.toml | 8 ++--- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index c371f39aa..f37269192 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.22.0" +version = "0.22.5" description = "The Minecraft pack development kit" category = "main" optional = false @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.4b0" +version = "21.5b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -71,7 +71,7 @@ python-versions = ">=3.6.2" appdirs = "*" click = ">=7.1.2" mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" +pathspec = ">=0.8.1,<1" regex = ">=2020.1.8" toml = ">=0.10.1" @@ -476,7 +476,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.8.1" +version = "2.9.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -492,7 +492,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.3" +version = "6.2.4" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -541,7 +541,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.15.3" +version = "7.15.4" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -628,7 +628,7 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rfc3986" -version = "1.4.0" +version = "1.5.0" description = "Validating URI References per RFC 3986" category = "dev" optional = false @@ -681,7 +681,7 @@ toml = ["toml"] [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false @@ -745,7 +745,7 @@ tqdm = ">=4.14" [[package]] name = "typing-extensions" -version = "3.7.4.3" +version = "3.10.0.0" description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false @@ -795,7 +795,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "744c28ba3c2a53ef985ba98e08a699ceda2fa93cc3e8172f63bef09717752465" +content-hash = "067356030039ff480f37bd02e001bb6ada1a4dd7c5e6896f20735f592a6171e0" [metadata.files] appdirs = [ @@ -815,12 +815,12 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.22.0-py3-none-any.whl", hash = "sha256:697c60b6527cb2c7418e3567bc8cd66141b8c546506814091f79c2fb1c7fb7a8"}, - {file = "beet-0.22.0.tar.gz", hash = "sha256:5c76595dfc7d96528321ddbe12f0baa048cab3473272b1166cd55af5e1cfe55b"}, + {file = "beet-0.22.5-py3-none-any.whl", hash = "sha256:d181b93931fd21c5fa77f9f833d8bcfa8d8ee9e77566808cb2a928c4fff543f4"}, + {file = "beet-0.22.5.tar.gz", hash = "sha256:928fd5393ff8e05d09b567a2e9e54f2e6e4580dd6f04650ad474e7d7c3a6af13"}, ] black = [ - {file = "black-21.4b0-py3-none-any.whl", hash = "sha256:2db7040bbbbaa46247bfcc05c6efdebd7ebe50c1c3ca745ca6e0f6776438c96c"}, - {file = "black-21.4b0.tar.gz", hash = "sha256:915d916c48646dbe8040d5265cff7111421a60a3dfe7f7e07273176a57c24a34"}, + {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, + {file = "black-21.5b0.tar.gz", hash = "sha256:9dc2042018ca10735366d944c2c12d9cad6dec74a3d5f679d09384ea185d9943"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -1134,16 +1134,16 @@ pydantic = [ {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, ] pygments = [ - {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"}, - {file = "Pygments-2.8.1.tar.gz", hash = "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94"}, + {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, + {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"}, - {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"}, + {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, + {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, ] pytest-insta = [ {file = "pytest-insta-0.1.10.tar.gz", hash = "sha256:27670ed8aa63cf34726106586dadadb12137102e22372ec918e64ee524d56f1f"}, @@ -1154,8 +1154,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.3.tar.gz", hash = "sha256:0ffcb267923731b3578d4377de67c59c5779c80e514ef9883c47c8877c059d74"}, - {file = "python_semantic_release-7.15.3-py3-none-any.whl", hash = "sha256:9b5c6e7ff9887b0cc8178004aa101aae2bfec8a464316cf287be8acbdf1e4954"}, + {file = "python-semantic-release-7.15.4.tar.gz", hash = "sha256:cb2a02a35c48d8ea81b83c3d913ee0bf5f4e26e97f4cbc8f25930e4a80792eae"}, + {file = "python_semantic_release-7.15.4-py3-none-any.whl", hash = "sha256:a62ff8a9c909737fb45adb1c90dfa4938eb0e329831b91a26b7b586b378e4f94"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1217,8 +1217,8 @@ requests-toolbelt = [ {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] rfc3986 = [ - {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, - {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] rope = [ {file = "rope-0.19.0.tar.gz", hash = "sha256:64e6d747532e1f5c8009ec5aae3e5523a5bcedf516f39a750d57d8ed749d90da"}, @@ -1236,8 +1236,8 @@ setuptools-scm = [ {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] smmap = [ {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, @@ -1260,9 +1260,9 @@ twine = [ {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, + {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, + {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, + {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] urllib3 = [ {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index e8915ab1f..07571b203 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,16 +25,16 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.22.0" +beet = ">=0.22.5" markdown-it-py = "^0.6.2" click = "^7.1.2" [tool.poetry.dev-dependencies] -black = "^21.4b0" +black = "^21.5b0" rope = "^0.19.0" -pytest = "^6.2.3" +pytest = "^6.2.4" isort = "^5.8.0" -python-semantic-release = "^7.15.3" +python-semantic-release = "^7.15.4" pytest-insta = "^0.1.10" [tool.poetry.scripts] From 432c11e2a32c454a5a45880742edc02b7f32d3f7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 12:25:08 +0200 Subject: [PATCH 0183/1554] feat: add download modifier --- packages/lectern/README.md | 8 +++++ .../lectern/examples/download_fragment.txt | 2 ++ packages/lectern/lectern/fragment.py | 9 ++++++ .../examples__markdown_README_md__0.pack.md | 10 +++++++ ..._examples_download_fragment_txt__0.pack.md | 30 +++++++++++++++++++ .../README.md | 10 +++++++ .../examples__text_README_md__0.pack.txt | 3 ++ ...examples_download_fragment_txt__0.pack.txt | 10 +++++++ 8 files changed, 82 insertions(+) create mode 100644 packages/lectern/examples/download_fragment.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 85c7be06e..0326f1222 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -340,6 +340,14 @@ There are also modifiers that are applied to the content of the fragment directl ewogICJ2YWx1ZXMiOiBbInR1dG9yaWFsOnN0cmlwcGVkIl0KfQ== ``` +You can use block fragments to download remote files with the `download` modifier. + +`@function_tag(download) tutorial:from_github` + +```json +https://raw.githubusercontent.com/mcbeet/beet/main/examples/load_basic/src/data/demo/functions/foo.mcfunction +``` + Finally, there's a `strip_final_newline` modifier that removes the final newline at the end of code block fragments. It's mostly used to make sure that `lectern` snapshots can reconstruct the original content byte for byte in case the file wasn't terminated by a newline. `@function(strip_final_newline) tutorial:stripped` diff --git a/packages/lectern/examples/download_fragment.txt b/packages/lectern/examples/download_fragment.txt new file mode 100644 index 000000000..c02b67a08 --- /dev/null +++ b/packages/lectern/examples/download_fragment.txt @@ -0,0 +1,2 @@ +@function(download) demo:foo +https://raw.githubusercontent.com/mcbeet/beet/main/examples/load_basic/src/data/demo/functions/foo.mcfunction diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index b0e1d5448..fdf24edee 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -71,6 +71,15 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: if content is not None and self.modifier == "base64": content = b64decode(content.strip()) + elif content is not None and self.modifier == "download": + url = content.strip() + + if self.cache and not url.startswith("data:"): + return file_type(source_path=self.cache.download(url)) + + with urlopen(url) as f: + content = f.read() + elif content is not None: if self.modifier == "strip_final_newline" and content.endswith("\n"): content = content[:-1] diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index 010047626..14e60ac78 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -122,6 +122,16 @@
+- `@function_tag tutorial:from_github` + +
+ + ```json + say foo + ``` + +
+ ### minecraft - `@function_tag minecraft:load` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md new file mode 100644 index 000000000..b2a105168 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + say foo + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index 136256ada..46e18704c 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -122,6 +122,16 @@
+- `@function_tag tutorial:from_github` + +
+ + ```json + say foo + ``` + +
+ ### minecraft - `@function_tag minecraft:load` diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index 0853b6b47..c33743e9f 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -53,6 +53,9 @@ say This function doesn't have a final newline. { "values": ["tutorial:stripped"] } +@function_tag tutorial:from_github +say foo + @function_tag minecraft:load { "values": [ diff --git a/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt new file mode 100644 index 000000000..c8fcffb95 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt @@ -0,0 +1,10 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +say foo From 7a0ec9abaa1aa82704643d416ba3159a8914b8a5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 12:43:57 +0200 Subject: [PATCH 0184/1554] chore: update pyright --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index fa6021977..414e0b95b 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.135" + "pyright": "^1.1.138" } }, "node_modules/pyright": { - "version": "1.1.135", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.135.tgz", - "integrity": "sha512-veb8la4UJJfxkuHopZoJo3fM77X7pBaJ4LvF2KP0nnqTjw0+x9rYVcjKhEVLKGighy2MNpe/SQ9ytoQPRMkkEw==", + "version": "1.1.138", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.138.tgz", + "integrity": "sha512-y8Jr8jS4elYEXg+vJY/0yKxMissV5ByZIgi2WGmv5imvLULBuEBaCNExMTdq16lfyoAXqrFOAuW8PFm7syrnUA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.135", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.135.tgz", - "integrity": "sha512-veb8la4UJJfxkuHopZoJo3fM77X7pBaJ4LvF2KP0nnqTjw0+x9rYVcjKhEVLKGighy2MNpe/SQ9ytoQPRMkkEw==", + "version": "1.1.138", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.138.tgz", + "integrity": "sha512-y8Jr8jS4elYEXg+vJY/0yKxMissV5ByZIgi2WGmv5imvLULBuEBaCNExMTdq16lfyoAXqrFOAuW8PFm7syrnUA==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 3d4888def..6d2c4e210 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.135" + "pyright": "^1.1.138" } } From 08c15a7325879aa5a36a6c49321bbdc85f8675aa Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 13:15:13 +0200 Subject: [PATCH 0185/1554] test: add merge_lang example --- packages/lectern/examples/merge_lang.txt | 9 +++++ ...arkdown_examples_merge_lang_txt__0.pack.md | 33 +++++++++++++++++++ ...__text_examples_merge_lang_txt__0.pack.txt | 13 ++++++++ 3 files changed, 55 insertions(+) create mode 100644 packages/lectern/examples/merge_lang.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt diff --git a/packages/lectern/examples/merge_lang.txt b/packages/lectern/examples/merge_lang.txt new file mode 100644 index 000000000..87e73fce1 --- /dev/null +++ b/packages/lectern/examples/merge_lang.txt @@ -0,0 +1,9 @@ +@language(merge) minecraft:custom +{ + "custom.foo": "foo" +} + +@language(merge) minecraft:custom +{ + "custom.bar": "bar" +} diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md new file mode 100644 index 000000000..e652f1439 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md @@ -0,0 +1,33 @@ +# Lectern snapshot + +## Resource pack + +- `@resource_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### minecraft + +- `@language minecraft:custom` + +
+ + ```json + { + "custom.foo": "foo", + "custom.bar": "bar" + } + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt new file mode 100644 index 000000000..51adc19ee --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt @@ -0,0 +1,13 @@ +@resource_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@language minecraft:custom +{ + "custom.foo": "foo", + "custom.bar": "bar" +} From 3bc4e3503e3b35961025a4184c01e6bdd55edcf3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 14:02:06 +0200 Subject: [PATCH 0186/1554] feat: add directive escaping --- .../lectern/examples/escaped_fragment.txt | 8 +++++ packages/lectern/lectern/extract.py | 18 +++++++++- packages/lectern/lectern/serialize.py | 18 +++++++++- ...n_examples_escaped_fragment_txt__0.pack.md | 34 +++++++++++++++++++ ..._examples_escaped_fragment_txt__0.pack.txt | 14 ++++++++ 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 packages/lectern/examples/escaped_fragment.txt create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt diff --git a/packages/lectern/examples/escaped_fragment.txt b/packages/lectern/examples/escaped_fragment.txt new file mode 100644 index 000000000..0878742ea --- /dev/null +++ b/packages/lectern/examples/escaped_fragment.txt @@ -0,0 +1,8 @@ +@function demo:foo +@@function demo:foo +@@blah demo:foo + +@function(append) demo:foo +@@function(@@) demo:bar +@@@function(@@@) demo:bar +@@function demo:bar diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index de01cf59b..e2876ad04 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -33,20 +33,27 @@ class Extractor: directives: Dict[str, Directive] regex: Optional["re.Pattern[str]"] + escaped_regex: Optional["re.Pattern[str]"] cache: Optional[Cache] def __init__(self, cache: Optional[Cache] = None): self.directives = {} self.regex = None + self.escaped_regex = None self.cache = cache def generate_regex(self) -> str: """Return a regex that can match the current directives.""" - names = "|".join(name for name in self.directives) + names = "|".join(self.directives) modifier = r"(?:\((?P[^)]*)\)|\b)" arguments = r"(?P.*)" return f"@(?P{names}){modifier}{arguments}" + def generate_escaped_regex(self) -> str: + """Return a regex that can match escaped fragments.""" + names = "|".join(self.directives) + return fr"(@@+(?:{names})\b.*)" + def compile_regex(self, regex: str) -> "re.Pattern[str]": """Return the compiled pattern for the directive regex.""" return re.compile(f"^{regex}$", flags=re.MULTILINE) @@ -58,6 +65,7 @@ def get_regex(self, directives: Mapping[str, Directive]) -> "re.Pattern[str]": if self.regex is None or self.directives != directives: self.directives = directives self.regex = self.compile_regex(self.generate_regex()) + self.escaped_regex = self.compile_regex(self.generate_escaped_regex()) return self.regex @@ -143,6 +151,7 @@ def parse_fragments( directives: Mapping[str, Directive], ) -> Iterator[Fragment]: tokens = self.get_regex(directives).split(source + "\n") + assert self.escaped_regex it = iter(tokens) newlines = next(it).count("\n") @@ -154,6 +163,10 @@ def parse_fragments( return else: content = content.partition("\n")[-1] + content = "".join( + s.replace("@@", "@", 1) if i % 2 else s + for i, s in enumerate(self.escaped_regex.split(content)) + ) yield Fragment( start_line=newlines, end_line=(newlines := newlines + content.count("\n") + 1), @@ -171,6 +184,9 @@ class EmbeddedExtractor(TextExtractor): def generate_regex(self) -> str: return r"(?://|#)\s*" + super().generate_regex() + def generate_escaped_regex(self) -> str: + return r"(?://|#)\s*" + super().generate_escaped_regex() + class MarkdownExtractor(Extractor): """Extractor for markdown files.""" diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 93cf4b987..b6becf1de 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -8,6 +8,7 @@ ] import os +import re from base64 import b64encode from dataclasses import dataclass, field from itertools import chain @@ -131,11 +132,19 @@ def generate_link_target( class TextSerializer: """Document serializer that outputs plain text.""" + escaped_regex: "re.Pattern[str]" + + def __init__(self): + names = "|".join( + [*NAMESPACED_RESOURCE_DIRECTIVES.values(), "resource_pack", "data_pack"] + ) + self.escaped_regex = re.compile(fr"^(@+(?:{names})\b.*)$", flags=re.MULTILINE) + def serialize(self, assets: ResourcePack, data: DataPack) -> str: """Return the serialized representation.""" return "\n".join( ( - f"@{directive_name} {argument}\n{content}" + f"@{directive_name} {argument}\n{self.escape_fragment(content)}" if isinstance(content := file_instance.ensure_serialized(), str) else f"@{directive_name}(base64) {argument}\n" + b64encode(content).decode() @@ -173,6 +182,13 @@ def serialize(self, assets: ResourcePack, data: DataPack) -> str: ) ) + def escape_fragment(self, content: str) -> str: + """Escape embedded directives.""" + return "".join( + s.replace("@", "@@", 1) if i % 2 else s + for i, s in enumerate(self.escaped_regex.split(content)) + ) + class MarkdownSerializer: """Document serializer that outputs markdown and emits associated files.""" diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md new file mode 100644 index 000000000..6f145bb4a --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md @@ -0,0 +1,34 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 6, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + @function demo:foo + @@blah demo:foo + @function(@@) demo:bar + @@function(@@@) demo:bar + @function demo:bar + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt new file mode 100644 index 000000000..05bb67191 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt @@ -0,0 +1,14 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 6, + "description": "" + } +} + +@function demo:foo +@@function demo:foo +@@blah demo:foo +@@function(@@) demo:bar +@@@function(@@@) demo:bar +@@function demo:bar From c9adf08ce73a175fe145dfca7f35681491bb2106 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 14:16:44 +0200 Subject: [PATCH 0187/1554] feat: add script directive --- packages/lectern/README.md | 10 ++ packages/lectern/examples/with_beet/script.md | 29 ++++ packages/lectern/lectern/directive.py | 22 ++- packages/lectern/lectern/document.py | 8 +- .../examples__beet_project__0.pack.md | 132 ++++++++++++++++++ 5 files changed, 198 insertions(+), 3 deletions(-) create mode 100644 packages/lectern/examples/with_beet/script.md diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 0326f1222..3a6af4cb8 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -162,6 +162,16 @@ If you're using `lectern` as a `beet` plugin you will be able to require plugins @require my_plugins.hello ``` +With `beet` you can also use the `@script` directive to render a fragment with Jinja and interpret the result as `lectern` text. Note that the text format requires you to escape the directives in the fragment with an additional `@` symbol. + +``` +@script +{% for i in range(10) %} +@@function demo:script_{{ i }} +say {{ i }} +{% endfor %} +``` + Finally, the `@skip` directive is simply ignored and allows you to end a previous fragment in the plain text format. ``` diff --git a/packages/lectern/examples/with_beet/script.md b/packages/lectern/examples/with_beet/script.md new file mode 100644 index 000000000..5265b4036 --- /dev/null +++ b/packages/lectern/examples/with_beet/script.md @@ -0,0 +1,29 @@ +# Script directive example + +`@script` + +``` +@function demo:script_foo +say something + +{% for i in range(10) %} +@function demo:script_{{ i }} +say {{ i }} +{% endfor %} +``` + +This one is nested 🤯 + +`@script` + +``` +@script +@@function demo:script_nested +say wow + +@script +@@script +@@@script +@@@@function demo:script_please_avoid_this +say no +``` diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 66ec0206d..e9e1d961d 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -5,6 +5,7 @@ "ResourcePackDirective", "BundleFragmentMixin", "RequireDirective", + "ScriptDirective", "SkipDirective", "get_builtin_directives", ] @@ -15,7 +16,7 @@ from typing import Any, Dict, Protocol, Type, Union from zipfile import ZipFile -from beet import Context, DataPack, ResourcePack +from beet import Context, DataPack, ResourcePack, TextFile from beet.library.base import NamespaceFile from beet.library.data_pack import ( Advancement, @@ -134,7 +135,24 @@ class RequireDirective: ctx: Context def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): - self.ctx.require(fragment.expect("plugin")) + plugin = fragment.expect("plugin") + + self.ctx.require(plugin) + + +@dataclass +class ScriptDirective: + """Directive that renders the fragment and interprets the result as lectern text.""" + + ctx: Context + document: Any + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + fragment.expect() + file_instance = fragment.as_file(TextFile) + + source = self.ctx.template.render_file(file_instance) + self.document.add_text(source.text) @dataclass diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index dadeb6dc7..4d16f9fa1 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -10,7 +10,12 @@ from beet import Cache, Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field -from .directive import Directive, RequireDirective, get_builtin_directives +from .directive import ( + Directive, + RequireDirective, + ScriptDirective, + get_builtin_directives, +) from .extract import MarkdownExtractor, TextExtractor from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer @@ -56,6 +61,7 @@ def __post_init__( self.assets = ctx.assets self.data = ctx.data self.directives["require"] = RequireDirective(ctx) + self.directives["script"] = ScriptDirective(ctx, self) if cache is None: cache = ctx.cache["lectern"] if cache: diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 2e3bf6e9c..6ae214905 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -39,6 +39,138 @@
+- `@function demo:script_foo` + +
+ + ```mcfunction + say something + + ``` + +
+ +- `@function demo:script_0` + +
+ + ```mcfunction + say 0 + ``` + +
+ +- `@function demo:script_1` + +
+ + ```mcfunction + say 1 + ``` + +
+ +- `@function demo:script_2` + +
+ + ```mcfunction + say 2 + ``` + +
+ +- `@function demo:script_3` + +
+ + ```mcfunction + say 3 + ``` + +
+ +- `@function demo:script_4` + +
+ + ```mcfunction + say 4 + ``` + +
+ +- `@function demo:script_5` + +
+ + ```mcfunction + say 5 + ``` + +
+ +- `@function demo:script_6` + +
+ + ```mcfunction + say 6 + ``` + +
+ +- `@function demo:script_7` + +
+ + ```mcfunction + say 7 + ``` + +
+ +- `@function demo:script_8` + +
+ + ```mcfunction + say 8 + ``` + +
+ +- `@function demo:script_9` + +
+ + ```mcfunction + say 9 + + ``` + +
+ +- `@function demo:script_nested` + +
+ + ```mcfunction + say wow + ``` + +
+ +- `@function demo:script_please_avoid_this` + +
+ + ```mcfunction + say no + ``` + +
+ ### embedded - `@function(strip_final_newline) embedded:foo` From 7822a4d0124e4e7f99b2ede0266cb19f66df89dd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 19:22:52 +0200 Subject: [PATCH 0188/1554] chore: update markdown-it --- packages/lectern/lectern/extract.py | 30 ++++++++++++++--------- packages/lectern/poetry.lock | 37 +++++++---------------------- packages/lectern/pyproject.toml | 2 +- 3 files changed, 29 insertions(+), 40 deletions(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index e2876ad04..41669f246 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -3,6 +3,7 @@ "TextExtractor", "EmbeddedExtractor", "MarkdownExtractor", + "MarkdownParserWithUncheckedLinks", ] @@ -10,23 +11,17 @@ from dataclasses import replace from itertools import islice from pathlib import Path -from typing import Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union -from urllib.parse import unquote, urlparse +from typing import Any, Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union +from urllib.parse import urlparse from beet import Cache, DataPack, ResourcePack from beet.core.utils import FileSystemPath from markdown_it import MarkdownIt -from markdown_it.common import normalize_url from markdown_it.token import Token from .directive import Directive from .fragment import Fragment -# Patch markdown_it to allow arbitrary data urls -# https://github.com/executablebooks/markdown-it-py/issues/128 -# TODO: Will soon be able to use custom validateLink -normalize_url.GOOD_DATA_RE = re.compile(r"^data:") - class Extractor: """Base class for extractors.""" @@ -188,6 +183,19 @@ def generate_escaped_regex(self) -> str: return r"(?://|#)\s*" + super().generate_escaped_regex() +class MarkdownParserWithUncheckedLinks(MarkdownIt): + """MarkownIt subclass that removes link checks because lectern has its own logic.""" + + def normalizeLink(self, url: str) -> str: + return url + + def normalizeLinkText(self, link: str) -> str: + return link + + def validateLink(self, url: str) -> bool: + return True + + class MarkdownExtractor(Extractor): """Extractor for markdown files.""" @@ -200,7 +208,7 @@ def __init__(self, cache: Optional[Cache] = None): super().__init__(cache) self.embedded_extractor = EmbeddedExtractor(cache) self.comment_extractor = TextExtractor(cache) - self.parser = MarkdownIt() + self.parser = MarkdownParserWithUncheckedLinks() self.html_comment_regex = re.compile(r"\s*\s*") def extract( @@ -531,11 +539,11 @@ def create_link_fragment( start_line: int, end_line: int, match: "re.Match[str]", - link: str, + link: Any, external_files: Optional[FileSystemPath] = None, ) -> Fragment: """Helper for creating a fragment from a link.""" - url = unquote(link) # TODO: Will soon be able to use custom normalizeLink + url = str(link) path = None if urlparse(url).path == url: diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index f37269192..d49ccf34a 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -327,22 +327,22 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "markdown-it-py" -version = "0.6.2" +version = "1.1.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "main" optional = false python-versions = "~=3.6" [package.dependencies] -attrs = ">=19,<21" -mdit-py-plugins = ">=0.2.1,<0.3.0" +attrs = ">=19,<22" [package.extras] code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistune (>=0.8.4,<0.9.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "panflute (>=1.12,<2.0)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["myst-nb (>=0.11.1,<0.12.0)", "sphinx-book-theme", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-copybutton", "sphinx (>=2,<4)", "pyyaml"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions", "pytest-benchmark (>=3.2,<4.0)", "psutil"] +plugins = ["mdit-py-plugins"] +rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" @@ -352,21 +352,6 @@ category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -[[package]] -name = "mdit-py-plugins" -version = "0.2.6" -description = "Collection of plugins for markdown-it-py" -category = "main" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -markdown-it-py = ">=0.5.8,<2.0.0" - -[package.extras] -code_style = ["pre-commit (==2.6)"] -testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -795,7 +780,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "067356030039ff480f37bd02e001bb6ada1a4dd7c5e6896f20735f592a6171e0" +content-hash = "7598e4dc7552a37087f358ef156a36234a89378b8cf6b2896c29012f18512ec6" [metadata.files] appdirs = [ @@ -955,8 +940,8 @@ keyring = [ {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] markdown-it-py = [ - {file = "markdown-it-py-0.6.2.tar.gz", hash = "sha256:c3b9f995be0792cbbc8ab2f53d74072eb7ff8a8b622be8d61d38ab879709eca3"}, - {file = "markdown_it_py-0.6.2-py3-none-any.whl", hash = "sha256:30b3e9f8198dc82a5df0dcb73fd31d56cd9a43bf8a747feb10b2ba74f962bcb1"}, + {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, + {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -1012,10 +997,6 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] -mdit-py-plugins = [ - {file = "mdit-py-plugins-0.2.6.tar.gz", hash = "sha256:1e467ca2ea056e8065cbd5d6c61e5052bb50826bde84c40f6a5ed77e82125710"}, - {file = "mdit_py_plugins-0.2.6-py3-none-any.whl", hash = "sha256:77fd75dad81109ee91f30eb49146196f79afbbae041f298ae4886c8c2b5e23d7"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 07571b203..36a335e09 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -26,7 +26,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.22.5" -markdown-it-py = "^0.6.2" +markdown-it-py = "^1.1.0" click = "^7.1.2" [tool.poetry.dev-dependencies] From eaf6288b262f143aec1090c613a819a5259e47b9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 19:48:59 +0200 Subject: [PATCH 0189/1554] feat: clean error message for invalid urls --- packages/lectern/lectern/fragment.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index fdf24edee..3aea3ba46 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -71,8 +71,11 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: if content is not None and self.modifier == "base64": content = b64decode(content.strip()) - elif content is not None and self.modifier == "download": - url = content.strip() + elif content is not None and self.modifier == "download" or self.url: + url = content.strip() if content is not None else self.url + + if not (url and url.startswith(("http:", "https:", "data:"))): + raise InvalidFragment(f"Invalid url {url!r}.", self.start_line) if self.cache and not url.startswith("data:"): return file_type(source_path=self.cache.download(url)) @@ -89,13 +92,6 @@ def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: elif self.path: return file_type(source_path=self.path) - elif self.url: - if self.cache and not self.url.startswith("data:"): - return file_type(source_path=self.cache.download(self.url)) - - with urlopen(self.url) as f: - content = f.read() - else: msg = f"Expected content, path or url for directive @{self.directive}." raise InvalidFragment(msg, self.start_line) From 6e3ca4659185ef78b0ad6106237b98cfc6070ef8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 9 May 2021 18:05:04 +0000 Subject: [PATCH 0190/1554] 0.12.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 7 +++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index a2ce6a75b..e2b646661 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.12.0 (2021-05-09) +### Feature +* Clean error message for invalid urls ([`7964d24`](https://github.com/mcbeet/lectern/commit/7964d24ba0991cfa8a8b8d40d426a295075117ae)) +* Add script directive ([`81603f9`](https://github.com/mcbeet/lectern/commit/81603f9b845e178d011e66c70f85495dcaaf00ea)) +* Add directive escaping ([`5fbd90c`](https://github.com/mcbeet/lectern/commit/5fbd90c8d95a341a56942cd6d4df1e73f4da31b9)) +* Add download modifier ([`77f0864`](https://github.com/mcbeet/lectern/commit/77f086407a9393a735bec32fc437e4b45a097893)) + ## v0.11.1 (2021-04-27) ### Fix * Serialize namespace extra ([`94f1995`](https://github.com/mcbeet/lectern/commit/94f1995808d9be25c5a604132b99aff7554984ba)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 3a6f600f7..82a9b2f65 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.11.1" +__version__ = "0.12.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 36a335e09..a99a76df6 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.11.1" +version = "0.12.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 3ce72ec7d6e0929c1c0861289586b7e66cf591d2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 21:53:08 +0200 Subject: [PATCH 0191/1554] chore: update beet --- packages/lectern/poetry.lock | 24 ++++++++++++------------ packages/lectern/pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index d49ccf34a..61c8d87ee 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -16,17 +16,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "20.3.0" +version = "21.2.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] [[package]] name = "base58" @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.22.5" +version = "0.23.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -780,7 +780,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7598e4dc7552a37087f358ef156a36234a89378b8cf6b2896c29012f18512ec6" +content-hash = "eb7e6cd89c4aec9da590a80cda2baea75a3e4fb4b32582f8c6d37dca860f4a30" [metadata.files] appdirs = [ @@ -792,16 +792,16 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] base58 = [ {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.22.5-py3-none-any.whl", hash = "sha256:d181b93931fd21c5fa77f9f833d8bcfa8d8ee9e77566808cb2a928c4fff543f4"}, - {file = "beet-0.22.5.tar.gz", hash = "sha256:928fd5393ff8e05d09b567a2e9e54f2e6e4580dd6f04650ad474e7d7c3a6af13"}, + {file = "beet-0.23.0-py3-none-any.whl", hash = "sha256:6cacca43c1452c32b22db72f3ecb48a9ebdba820b76e7c68316af75ed9d0f8b8"}, + {file = "beet-0.23.0.tar.gz", hash = "sha256:911ea738918616ca7974e98cc03e7e6afb2e4de9d70fdd932bfc4009b63fb945"}, ] black = [ {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index a99a76df6..7c7474d00 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.22.5" +beet = ">=0.23.0" markdown-it-py = "^1.1.0" click = "^7.1.2" From 7e47d7c2f046423c38dfc9813e3e5bdda9766c5f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 22:07:02 +0200 Subject: [PATCH 0192/1554] fix: pack.png url now uses a static revision --- packages/lectern/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 3a6af4cb8..90c662b5f 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -282,7 +282,7 @@ You can include inline markdown images in the output data pack or resource pack `@data_pack pack.png` -![](https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/3a/Pack.png/revision/latest?cb=20210210114950) +![](https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/3a/Pack.png/revision/20210509190015) Image fragments support the same variations as code block fragments. You can put the directive in a comment or surround the image with a `
` element to make it foldable. From 469590a313daca5816c979555839fbacbd3974cb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 22:33:59 +0200 Subject: [PATCH 0193/1554] feat: move require and script directives into their own beet plugins --- packages/lectern/README.md | 57 +++++++++++++------ packages/lectern/examples/with_beet/beet.json | 7 ++- packages/lectern/lectern/contrib/__init__.py | 0 packages/lectern/lectern/contrib/require.py | 30 ++++++++++ packages/lectern/lectern/contrib/script.py | 34 +++++++++++ packages/lectern/lectern/directive.py | 31 +--------- packages/lectern/lectern/document.py | 9 +-- 7 files changed, 113 insertions(+), 55 deletions(-) create mode 100644 packages/lectern/lectern/contrib/__init__.py create mode 100644 packages/lectern/lectern/contrib/require.py create mode 100644 packages/lectern/lectern/contrib/script.py diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 90c662b5f..32cebbe0b 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -156,22 +156,6 @@ There are also two built-in directives that can be used to include files using a This is useful for adding files that aren't part of any particular namespace. -If you're using `lectern` as a `beet` plugin you will be able to require plugins dynamically wih the `@require` directive. - -``` -@require my_plugins.hello -``` - -With `beet` you can also use the `@script` directive to render a fragment with Jinja and interpret the result as `lectern` text. Note that the text format requires you to escape the directives in the fragment with an additional `@` symbol. - -``` -@script -{% for i in range(10) %} -@@function demo:script_{{ i }} -say {{ i }} -{% endfor %} -``` - Finally, the `@skip` directive is simply ignored and allows you to end a previous fragment in the plain text format. ``` @@ -597,6 +581,47 @@ def download_every_day(ctx: Context): ctx.cache["lectern"].timeout(hours=24) ``` +## Extra directives + +If you're using `lectern` as a `beet` plugin you will be able to use additional directives by adding the corresponding plugins to the `require` option. + +```json +{ + "require": ["lectern.contrib.require", "lectern.contrib.script"], + "pipeline": ["lectern"], + "meta": { + "lectern": { + "load": ["*.md"] + } + } +} +``` + +The `lectern.contrib.require` plugin adds a directive that lets you require plugins dynamically. + +`@require my_plugins.hello` + +The `lectern.contrib.script` plugin adds a directive that renders a fragment with Jinja and interprets the result as `lectern` text. + +`@script` + +``` +{% for i in range(10) %} +@function demo:script_{{ i }} +say {{ i }} +{% endfor %} +``` + +Note that using `@script` with the text format requires you to escape the directives in the fragment with an additional `@` symbol. + +``` +@script +{% for i in range(10) %} +@@function demo:script_{{ i }} +say {{ i }} +{% endfor %} +``` + ## Lectern scripts The text format is pretty well-suited for writing basic data pack and resource pack generators. You can very easily write scripts that produce lectern syntax that can then be turned into a data pack or a resource pack. diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index a3b258db5..735458296 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -1,5 +1,10 @@ { - "require": ["custom_directive", "hello_directive"], + "require": [ + "lectern.contrib.require", + "lectern.contrib.script", + "custom_directive", + "hello_directive" + ], "pipeline": ["lectern"], "meta": { "lectern": { diff --git a/packages/lectern/lectern/contrib/__init__.py b/packages/lectern/lectern/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/lectern/lectern/contrib/require.py b/packages/lectern/lectern/contrib/require.py new file mode 100644 index 000000000..3ab40d98a --- /dev/null +++ b/packages/lectern/lectern/contrib/require.py @@ -0,0 +1,30 @@ +"""Plugin that adds a directive for requiring plugins dynamically.""" + + +__all__ = [ + "RequireDirective", +] + + +from dataclasses import dataclass + +from beet import Context, DataPack, ResourcePack + +from lectern import Document, Fragment + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.directives["require"] = RequireDirective(ctx) + + +@dataclass +class RequireDirective: + """Directive that requires a given plugin.""" + + ctx: Context + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + plugin = fragment.expect("plugin") + + self.ctx.require(plugin) diff --git a/packages/lectern/lectern/contrib/script.py b/packages/lectern/lectern/contrib/script.py new file mode 100644 index 000000000..fd38d1ed8 --- /dev/null +++ b/packages/lectern/lectern/contrib/script.py @@ -0,0 +1,34 @@ +"""Plugin that adds a directive for interpreting lectern text templates.""" + + +__all__ = [ + "ScriptDirective", +] + + +from dataclasses import dataclass + +from beet import Context, DataPack, ResourcePack, TextFile + +from lectern import Document, Fragment + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.directives["script"] = ScriptDirective(ctx) + + +@dataclass +class ScriptDirective: + """Directive that renders the fragment and interprets the result as lectern text.""" + + ctx: Context + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + fragment.expect() + file_instance = fragment.as_file(TextFile) + + source = self.ctx.template.render_file(file_instance) + + document = self.ctx.inject(Document) + document.add_text(source.text) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index e9e1d961d..25f19eda0 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -4,8 +4,6 @@ "DataPackDirective", "ResourcePackDirective", "BundleFragmentMixin", - "RequireDirective", - "ScriptDirective", "SkipDirective", "get_builtin_directives", ] @@ -16,7 +14,7 @@ from typing import Any, Dict, Protocol, Type, Union from zipfile import ZipFile -from beet import Context, DataPack, ResourcePack, TextFile +from beet import DataPack, ResourcePack from beet.library.base import NamespaceFile from beet.library.data_pack import ( Advancement, @@ -128,33 +126,6 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): assets.load(self.bundle_pack_fragment(fragment)) -@dataclass -class RequireDirective: - """Directive that requires a given plugin.""" - - ctx: Context - - def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): - plugin = fragment.expect("plugin") - - self.ctx.require(plugin) - - -@dataclass -class ScriptDirective: - """Directive that renders the fragment and interprets the result as lectern text.""" - - ctx: Context - document: Any - - def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): - fragment.expect() - file_instance = fragment.as_file(TextFile) - - source = self.ctx.template.render_file(file_instance) - self.document.add_text(source.text) - - @dataclass class SkipDirective: """Directive that ignores the fragment and skips to the next one.""" diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 4d16f9fa1..9705b6f50 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -10,12 +10,7 @@ from beet import Cache, Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field -from .directive import ( - Directive, - RequireDirective, - ScriptDirective, - get_builtin_directives, -) +from .directive import Directive, get_builtin_directives from .extract import MarkdownExtractor, TextExtractor from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer @@ -60,8 +55,6 @@ def __post_init__( if ctx: self.assets = ctx.assets self.data = ctx.data - self.directives["require"] = RequireDirective(ctx) - self.directives["script"] = ScriptDirective(ctx, self) if cache is None: cache = ctx.cache["lectern"] if cache: From 3842d0b7893309214703d774e0aef6ff71cb57c9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 9 May 2021 22:59:34 +0200 Subject: [PATCH 0194/1554] feat: add define directive --- packages/lectern/README.md | 14 +++++++- packages/lectern/examples/with_beet/beet.json | 1 + packages/lectern/examples/with_beet/define.md | 32 +++++++++++++++++++ packages/lectern/lectern/contrib/define.py | 32 +++++++++++++++++++ .../examples__beet_project__0.pack.md | 30 +++++++++++++++++ 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 packages/lectern/examples/with_beet/define.md create mode 100644 packages/lectern/lectern/contrib/define.py diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 32cebbe0b..e1657c4d7 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -587,7 +587,11 @@ If you're using `lectern` as a `beet` plugin you will be able to use additional ```json { - "require": ["lectern.contrib.require", "lectern.contrib.script"], + "require": [ + "lectern.contrib.require", + "lectern.contrib.script", + "lectern.contrib.define" + ], "pipeline": ["lectern"], "meta": { "lectern": { @@ -622,6 +626,14 @@ say {{ i }} {% endfor %} ``` +The `lectern.contrib.define` plugin adds a directive that renders a fragment with Jinja and stores the resulting string as a template global. + +`@define(strip_final_newline) math_message` + +``` +2 + 2 is {{ 2 + 2 }} +``` + ## Lectern scripts The text format is pretty well-suited for writing basic data pack and resource pack generators. You can very easily write scripts that produce lectern syntax that can then be turned into a data pack or a resource pack. diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index 735458296..c11c8c38b 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -2,6 +2,7 @@ "require": [ "lectern.contrib.require", "lectern.contrib.script", + "lectern.contrib.define", "custom_directive", "hello_directive" ], diff --git a/packages/lectern/examples/with_beet/define.md b/packages/lectern/examples/with_beet/define.md new file mode 100644 index 000000000..411074e9e --- /dev/null +++ b/packages/lectern/examples/with_beet/define.md @@ -0,0 +1,32 @@ +# Testing the define directive + +`@define abc` + +``` +azertyuiop +``` + +`@define def` + +``` +{{ abc.strip() }}qsdfghjklm +``` + +`@define(strip_final_newline) math_message` + +``` +2 + 2 is {{ 2 + 2 }} +``` + +`@script` + +``` +@function demo:define_1 +say {{ abc.strip() }} + +@function demo:define_2 +say {{ def.strip() }} + +@function demo:define_3 +say {{ math_message }} (end of citation) +``` diff --git a/packages/lectern/lectern/contrib/define.py b/packages/lectern/lectern/contrib/define.py new file mode 100644 index 000000000..534e9d093 --- /dev/null +++ b/packages/lectern/lectern/contrib/define.py @@ -0,0 +1,32 @@ +"""Plugin that adds a directive for rendering a fragment and storing the output.""" + + +__all__ = [ + "DefineDirective", +] + + +from dataclasses import dataclass + +from beet import Context, DataPack, ResourcePack, TextFile + +from lectern import Document, Fragment + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.directives["define"] = DefineDirective(ctx) + + +@dataclass +class DefineDirective: + """Directive that renders the fragment and stores the resulting string as a template global.""" + + ctx: Context + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + variable = fragment.expect("variable") + file_instance = fragment.as_file(TextFile) + + result = self.ctx.template.render_file(file_instance) + self.ctx.template.globals[variable] = result.text diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 6ae214905..094d7dfae 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -171,6 +171,36 @@
+- `@function demo:define_1` + +
+ + ```mcfunction + say azertyuiop + ``` + +
+ +- `@function demo:define_2` + +
+ + ```mcfunction + say azertyuiopqsdfghjklm + ``` + +
+ +- `@function demo:define_3` + +
+ + ```mcfunction + say 2 + 2 is 4 (end of citation) + ``` + +
+ ### embedded - `@function(strip_final_newline) embedded:foo` From 7682ff647e49fac1cb9a2f42445f368fe03b41e8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 9 May 2021 21:01:52 +0000 Subject: [PATCH 0195/1554] 0.13.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 8 ++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index e2b646661..43e51282e 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.13.0 (2021-05-09) +### Feature +* Add define directive ([`85ec3cc`](https://github.com/mcbeet/lectern/commit/85ec3ccdd682f35c0e3556e116dab48cb55a27a9)) +* Move require and script directives into their own beet plugins ([`a1e33cd`](https://github.com/mcbeet/lectern/commit/a1e33cd1312040794cb11900b0c64ae1835208b5)) + +### Fix +* Pack.png url now uses a static revision ([`1f7013c`](https://github.com/mcbeet/lectern/commit/1f7013cad5b6bd185322da5fb5880f285df30de5)) + ## v0.12.0 (2021-05-09) ### Feature * Clean error message for invalid urls ([`7964d24`](https://github.com/mcbeet/lectern/commit/7964d24ba0991cfa8a8b8d40d426a295075117ae)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 82a9b2f65..804c19307 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.12.0" +__version__ = "0.13.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 7c7474d00..b4eabd79e 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.12.0" +version = "0.13.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From e43869c337093fa6606784b22cac832014379c19 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 05:37:11 +0000 Subject: [PATCH 0196/1554] chore(deps): bump beet from 0.22.3 to 0.23.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.22.3 to 0.23.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.22.3...v0.23.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 0d20b556b..27bda8a9d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.22.3" +version = "0.23.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "35499eb02835f1acce8e16f6243a4ad94021793040896a8081d7e7c39da5c05b" +content-hash = "9c8860256a57f5b196e4fb9b0044c553931282bad90b8075e9d190438ee0d018" [metadata.files] appdirs = [ @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.22.3-py3-none-any.whl", hash = "sha256:16fec4b80a323b42cded53e2db55b47ff134a0bbff4e2c17ca58adf855aa3dc4"}, - {file = "beet-0.22.3.tar.gz", hash = "sha256:50b121f5a0d659ccefa205e8bba352e52fb2e9f6279f870bb1261dc02ed3c2ba"}, + {file = "beet-0.23.0-py3-none-any.whl", hash = "sha256:6cacca43c1452c32b22db72f3ecb48a9ebdba820b76e7c68316af75ed9d0f8b8"}, + {file = "beet-0.23.0.tar.gz", hash = "sha256:911ea738918616ca7974e98cc03e7e6afb2e4de9d70fdd932bfc4009b63fb945"}, ] black = [ {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index d3fec5e25..d0536f1d0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.23.0" +beet = ">=0.5.1,<0.24.0" [tool.poetry.dev-dependencies] black = "^21.5b0" From c0ff5dfc2510923d3a26ae0853b269bff538c00a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 05:30:22 +0000 Subject: [PATCH 0197/1554] chore(deps-dev): bump black from 21.5b0 to 21.5b1 Bumps [black](https://github.com/psf/black) from 21.5b0 to 21.5b1. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 27bda8a9d..b3fcae7e9 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.5b0" +version = "21.5b1" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,7 +77,7 @@ toml = ">=0.10.1" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors"] python2 = ["typed-ast (>=1.4.2)"] [[package]] @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9c8860256a57f5b196e4fb9b0044c553931282bad90b8075e9d190438ee0d018" +content-hash = "d0d831447aa52266ed157cde25a5df5fda0639a3debf32804d8a673c6cc047f4" [metadata.files] appdirs = [ @@ -719,8 +719,8 @@ beet = [ {file = "beet-0.23.0.tar.gz", hash = "sha256:911ea738918616ca7974e98cc03e7e6afb2e4de9d70fdd932bfc4009b63fb945"}, ] black = [ - {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, - {file = "black-21.5b0.tar.gz", hash = "sha256:9dc2042018ca10735366d944c2c12d9cad6dec74a3d5f679d09384ea185d9943"}, + {file = "black-21.5b1-py3-none-any.whl", hash = "sha256:8a60071a0043876a4ae96e6c69bd3a127dad2c1ca7c8083573eb82f92705d008"}, + {file = "black-21.5b1.tar.gz", hash = "sha256:23695358dbcb3deafe7f0a3ad89feee5999a46be5fec21f4f1d108be0bcdb3b1"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index d0536f1d0..9b37e438e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.24.0" [tool.poetry.dev-dependencies] -black = "^21.5b0" +black = "^21.5b1" isort = "^5.8.0" pytest = "^6.2.4" python-semantic-release = "^7.15.4" From 49855187a839c2ad7521eaa346a34df7967c8fa6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 05:20:57 +0000 Subject: [PATCH 0198/1554] chore(deps): bump beet from 0.23.0 to 0.24.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.23.0 to 0.24.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.23.0...v0.24.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index b3fcae7e9..83320cd8d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.23.0" +version = "0.24.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d0d831447aa52266ed157cde25a5df5fda0639a3debf32804d8a673c6cc047f4" +content-hash = "c783612c565eb67c1bd3d8f422b672b9db8749cce06cfd8888b2738f05f6295c" [metadata.files] appdirs = [ @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.23.0-py3-none-any.whl", hash = "sha256:6cacca43c1452c32b22db72f3ecb48a9ebdba820b76e7c68316af75ed9d0f8b8"}, - {file = "beet-0.23.0.tar.gz", hash = "sha256:911ea738918616ca7974e98cc03e7e6afb2e4de9d70fdd932bfc4009b63fb945"}, + {file = "beet-0.24.1-py3-none-any.whl", hash = "sha256:40f66daa57e3431ec6935eb405ce1fa52c3efaa4090674dd6ee4e2556a69744a"}, + {file = "beet-0.24.1.tar.gz", hash = "sha256:07d7d811edf236c3156d06a6744df2808af58b2907e71aea81d1062d22c0c6e7"}, ] black = [ {file = "black-21.5b1-py3-none-any.whl", hash = "sha256:8a60071a0043876a4ae96e6c69bd3a127dad2c1ca7c8083573eb82f92705d008"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9b37e438e..0afa9503a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.24.0" +beet = ">=0.5.1,<0.25.0" [tool.poetry.dev-dependencies] black = "^21.5b1" From fe4cdac609bcd90b824808530f6152a6f70c6f29 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 13 May 2021 20:26:26 +0000 Subject: [PATCH 0199/1554] chore(deps): [security] bump pydantic from 1.8.1 to 1.8.2 Bumps [pydantic](https://github.com/samuelcolvin/pydantic) from 1.8.1 to 1.8.2. **This update includes a security fix.** - [Release notes](https://github.com/samuelcolvin/pydantic/releases) - [Changelog](https://github.com/samuelcolvin/pydantic/blob/master/HISTORY.md) - [Commits](https://github.com/samuelcolvin/pydantic/compare/v1.8.1...v1.8.2) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 83320cd8d..1d6da7858 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -410,7 +410,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.8.1" +version = "1.8.2" description = "Data validation and settings management using python 3.6 type hinting" category = "main" optional = false @@ -1010,28 +1010,28 @@ pycparser = [ {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pydantic = [ - {file = "pydantic-1.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0c40162796fc8d0aa744875b60e4dc36834db9f2a25dbf9ba9664b1915a23850"}, - {file = "pydantic-1.8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fff29fe54ec419338c522b908154a2efabeee4f483e48990f87e189661f31ce3"}, - {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:fbfb608febde1afd4743c6822c19060a8dbdd3eb30f98e36061ba4973308059e"}, - {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:eb8ccf12295113ce0de38f80b25f736d62f0a8d87c6b88aca645f168f9c78771"}, - {file = "pydantic-1.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:20d42f1be7c7acc352b3d09b0cf505a9fab9deb93125061b376fbe1f06a5459f"}, - {file = "pydantic-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dde4ca368e82791de97c2ec019681ffb437728090c0ff0c3852708cf923e0c7d"}, - {file = "pydantic-1.8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3bbd023c981cbe26e6e21c8d2ce78485f85c2e77f7bab5ec15b7d2a1f491918f"}, - {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:830ef1a148012b640186bf4d9789a206c56071ff38f2460a32ae67ca21880eb8"}, - {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:fb77f7a7e111db1832ae3f8f44203691e15b1fa7e5a1cb9691d4e2659aee41c4"}, - {file = "pydantic-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3bcb9d7e1f9849a6bdbd027aabb3a06414abd6068cb3b21c49427956cce5038a"}, - {file = "pydantic-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2287ebff0018eec3cc69b1d09d4b7cebf277726fa1bd96b45806283c1d808683"}, - {file = "pydantic-1.8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4bbc47cf7925c86a345d03b07086696ed916c7663cb76aa409edaa54546e53e2"}, - {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6388ef4ef1435364c8cc9a8192238aed030595e873d8462447ccef2e17387125"}, - {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:dd4888b300769ecec194ca8f2699415f5f7760365ddbe243d4fd6581485fa5f0"}, - {file = "pydantic-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:8fbb677e4e89c8ab3d450df7b1d9caed23f254072e8597c33279460eeae59b99"}, - {file = "pydantic-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f2736d9a996b976cfdfe52455ad27462308c9d3d0ae21a2aa8b4cd1a78f47b9"}, - {file = "pydantic-1.8.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3114d74329873af0a0e8004627f5389f3bb27f956b965ddd3e355fe984a1789c"}, - {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:258576f2d997ee4573469633592e8b99aa13bda182fcc28e875f866016c8e07e"}, - {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c17a0b35c854049e67c68b48d55e026c84f35593c66d69b278b8b49e2484346f"}, - {file = "pydantic-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8bc082afef97c5fd3903d05c6f7bb3a6af9fc18631b4cc9fedeb4720efb0c58"}, - {file = "pydantic-1.8.1-py3-none-any.whl", hash = "sha256:e3f8790c47ac42549dc8b045a67b0ca371c7f66e73040d0197ce6172b385e520"}, - {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, + {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, + {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, + {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, + {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, + {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, + {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, + {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, + {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, + {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, + {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pygments = [ {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, From 23b77209e8fcaedad9d03f0145a8235182051afc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 20 May 2021 05:21:07 +0000 Subject: [PATCH 0200/1554] chore(deps): bump beet from 0.24.1 to 0.25.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.24.1 to 0.25.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.24.1...v0.25.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1d6da7858..264212cca 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.24.1" +version = "0.25.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -53,7 +53,7 @@ click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" -Jinja2 = ">=2.11.3,<3.0.0" +Jinja2 = ">=2.11.3,<4.0.0" nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" Pillow = ">=8.2.0,<9.0.0" @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "c783612c565eb67c1bd3d8f422b672b9db8749cce06cfd8888b2738f05f6295c" +content-hash = "8b227cb7f3c164ca023089c8f1d8a7bcd72cd5e4ecd0778c8c1d2dcad730e0a2" [metadata.files] appdirs = [ @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.24.1-py3-none-any.whl", hash = "sha256:40f66daa57e3431ec6935eb405ce1fa52c3efaa4090674dd6ee4e2556a69744a"}, - {file = "beet-0.24.1.tar.gz", hash = "sha256:07d7d811edf236c3156d06a6744df2808af58b2907e71aea81d1062d22c0c6e7"}, + {file = "beet-0.25.0-py3-none-any.whl", hash = "sha256:9af77ef5a9c0f8e52e1585147824e79182df427e7b5305b96ec1d86a860e5544"}, + {file = "beet-0.25.0.tar.gz", hash = "sha256:19e15c9ef0ad0f4607dbf8528d94685c147d7238ff2d5725bb645b921c7f4db5"}, ] black = [ {file = "black-21.5b1-py3-none-any.whl", hash = "sha256:8a60071a0043876a4ae96e6c69bd3a127dad2c1ca7c8083573eb82f92705d008"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0afa9503a..bb16af7c0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.25.0" +beet = ">=0.5.1,<0.26.0" [tool.poetry.dev-dependencies] black = "^21.5b1" From 349093a0acd90225c54a531284b1cc9580bb412e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 05:19:43 +0000 Subject: [PATCH 0201/1554] chore(deps-dev): bump pyright from 1.1.115 to 1.1.142 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.115 to 1.1.142. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.142/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 0b33998cd..3c7d565e3 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.115", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.115.tgz", - "integrity": "sha512-MFi3Q7agfL1MRTkBTkqitfS1FIwPFZ8viB7f2w4GySBKOXQJSC66iRdXnWmLqkrUi3hSHefu/rt4ul1/8YyTeA==", + "version": "1.1.142", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.142.tgz", + "integrity": "sha512-L6hsiUlI+EMMgDmyyt5ODogS9EwVtWP/YomNnR1A6d4kiTZgh02BXo1pzh0fYhg/ICV36hrp1OmLPqhpJfkrrA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 5899ca1f3..569625234 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.115" + "pyright": "^1.1.142" } } From 81a9bc6bac2653c44bf3f94e7eede01cd0d97c20 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 05:07:49 +0000 Subject: [PATCH 0202/1554] chore(deps-dev): bump pyright from 1.1.142 to 1.1.143 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.142 to 1.1.143. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.143/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 3c7d565e3..db3de862a 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.142", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.142.tgz", - "integrity": "sha512-L6hsiUlI+EMMgDmyyt5ODogS9EwVtWP/YomNnR1A6d4kiTZgh02BXo1pzh0fYhg/ICV36hrp1OmLPqhpJfkrrA==", + "version": "1.1.143", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.143.tgz", + "integrity": "sha512-QlaVXQU5926WYgLfPfOQ26/0qcVoF72cJR5v+uqvOD7EO43x2Zxj3dtmhLIULY4FFN+MIGez9ALnPo7/025+jg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 569625234..3297d72e2 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.142" + "pyright": "^1.1.143" } } From 7abf086a69534afd78d1c76ca7a204ec9174ded1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 05:09:38 +0000 Subject: [PATCH 0203/1554] chore(deps-dev): bump pyright from 1.1.143 to 1.1.144 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.143 to 1.1.144. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.144/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index db3de862a..c110e6c99 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.143", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.143.tgz", - "integrity": "sha512-QlaVXQU5926WYgLfPfOQ26/0qcVoF72cJR5v+uqvOD7EO43x2Zxj3dtmhLIULY4FFN+MIGez9ALnPo7/025+jg==", + "version": "1.1.144", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.144.tgz", + "integrity": "sha512-nzCTqxg7JPHy5FkyX4+meD4c7Zt/mgPBI+nFGS9HoN/3GVPHAlTcCKa1JPTEh7O/N5+8W/9WZUuUntBW2R3adg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 3297d72e2..6d09aac53 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.143" + "pyright": "^1.1.144" } } From 7d6b744a15be1ac7e8c98a143887dff2166db8be Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 05:12:42 +0000 Subject: [PATCH 0204/1554] chore(deps-dev): bump python-semantic-release from 7.15.4 to 7.15.5 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.4 to 7.15.5. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.4...v7.15.5) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 11 ++++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 264212cca..f0b1366dd 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -474,7 +474,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.15.4" +version = "7.15.5" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -489,7 +489,7 @@ invoke = ">=1.4.1,<2" python-gitlab = ">=1.10,<3" requests = ">=2.25,<3" semver = ">=2.10,<3" -tomlkit = ">=0.7.0,<1.0.0" +tomlkit = "0.7.0" twine = ">=3,<4" [package.extras] @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "8b227cb7f3c164ca023089c8f1d8a7bcd72cd5e4ecd0778c8c1d2dcad730e0a2" +content-hash = "604134e5255a3a1a76637029e21dc8840c3be3d953995933b55b6d242f4a6680" [metadata.files] appdirs = [ @@ -991,6 +991,7 @@ pillow = [ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ @@ -1050,8 +1051,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.4.tar.gz", hash = "sha256:cb2a02a35c48d8ea81b83c3d913ee0bf5f4e26e97f4cbc8f25930e4a80792eae"}, - {file = "python_semantic_release-7.15.4-py3-none-any.whl", hash = "sha256:a62ff8a9c909737fb45adb1c90dfa4938eb0e329831b91a26b7b586b378e4f94"}, + {file = "python-semantic-release-7.15.5.tar.gz", hash = "sha256:b5d726026701ff0c1e428c1ffe9666fb8dcdfbf6328a747504d1eefd3c8779d3"}, + {file = "python_semantic_release-7.15.5-py3-none-any.whl", hash = "sha256:798de4c09e6ac26aecd489d002a6ddbf0b9d1e6aae8cab64ff4df8e4a1107e15"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index bb16af7c0..a0a46e170 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.5.1,<0.26.0" black = "^21.5b1" isort = "^5.8.0" pytest = "^6.2.4" -python-semantic-release = "^7.15.4" +python-semantic-release = "^7.15.5" [tool.black] target-version = ["py38"] From cc01149dec087c7c0add0fbe202a8990855937d6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 05:16:33 +0000 Subject: [PATCH 0205/1554] chore(deps): bump beet from 0.25.0 to 0.26.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.25.0 to 0.26.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.25.0...v0.26.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 112 ++++++++++++++-------------------- packages/mecha/pyproject.toml | 2 +- 2 files changed, 48 insertions(+), 66 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f0b1366dd..bae5fce9a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.25.0" +version = "0.26.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -53,7 +53,7 @@ click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" -Jinja2 = ">=2.11.3,<4.0.0" +Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" Pillow = ">=8.2.0,<9.0.0" @@ -279,17 +279,17 @@ test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] name = "jinja2" -version = "2.11.3" +version = "3.0.1" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" @@ -310,11 +310,11 @@ testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake [[package]] name = "markupsafe" -version = "1.1.1" +version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.6" [[package]] name = "mypy-extensions" @@ -695,7 +695,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "604134e5255a3a1a76637029e21dc8840c3be3d953995933b55b6d242f4a6680" +content-hash = "04a5b21408e2610e9a5d99828dd6c077585bcdbace7605501ad09d1fce73f6d5" [metadata.files] appdirs = [ @@ -715,8 +715,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.25.0-py3-none-any.whl", hash = "sha256:9af77ef5a9c0f8e52e1585147824e79182df427e7b5305b96ec1d86a860e5544"}, - {file = "beet-0.25.0.tar.gz", hash = "sha256:19e15c9ef0ad0f4607dbf8528d94685c147d7238ff2d5725bb645b921c7f4db5"}, + {file = "beet-0.26.0-py3-none-any.whl", hash = "sha256:ba9c72e62d583951c43754949a13a309512d92743aa47c61fcb4994efc524166"}, + {file = "beet-0.26.0.tar.gz", hash = "sha256:f4e10cb61e43a935294b54d4c342e7c33323325302960d1405856f1574ebf91b"}, ] black = [ {file = "black-21.5b1-py3-none-any.whl", hash = "sha256:8a60071a0043876a4ae96e6c69bd3a127dad2c1ca7c8083573eb82f92705d008"}, @@ -845,66 +845,48 @@ jeepney = [ {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, + {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, + {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] keyring = [ {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, ] markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a0a46e170..eade97f09 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.26.0" +beet = ">=0.5.1,<0.27.0" [tool.poetry.dev-dependencies] black = "^21.5b1" From af96683b01a6cef319e247bbf3af3674e902cc9d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 31 May 2021 05:12:27 +0000 Subject: [PATCH 0206/1554] chore(deps-dev): bump pyright from 1.1.144 to 1.1.145 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.144 to 1.1.145. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.145/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index c110e6c99..4247fdecb 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.144", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.144.tgz", - "integrity": "sha512-nzCTqxg7JPHy5FkyX4+meD4c7Zt/mgPBI+nFGS9HoN/3GVPHAlTcCKa1JPTEh7O/N5+8W/9WZUuUntBW2R3adg==", + "version": "1.1.145", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.145.tgz", + "integrity": "sha512-eyrK9Ilut2shvqi/TFmpfUrm7U6DrkskMa8UPofkGJZCO1PJzVwzKaGWrR57zlbcAxs5PVvK9JGSIO9DJUVNyA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 6d09aac53..3582262cb 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.144" + "pyright": "^1.1.145" } } From 879e5cfa38f83c6f079b35dc83eaec529de433af Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 05:11:55 +0000 Subject: [PATCH 0207/1554] chore(deps-dev): bump black from 21.5b1 to 21.5b2 Bumps [black](https://github.com/psf/black) from 21.5b1 to 21.5b2. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 11 ++++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index bae5fce9a..e03ad126b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.5b1" +version = "21.5b2" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,8 +77,9 @@ toml = ">=0.10.1" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" @@ -695,7 +696,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "04a5b21408e2610e9a5d99828dd6c077585bcdbace7605501ad09d1fce73f6d5" +content-hash = "a720ccb5dec92f1cf49d7334072242449e2896502e87dba1f7f7314eab7dcd07" [metadata.files] appdirs = [ @@ -719,8 +720,8 @@ beet = [ {file = "beet-0.26.0.tar.gz", hash = "sha256:f4e10cb61e43a935294b54d4c342e7c33323325302960d1405856f1574ebf91b"}, ] black = [ - {file = "black-21.5b1-py3-none-any.whl", hash = "sha256:8a60071a0043876a4ae96e6c69bd3a127dad2c1ca7c8083573eb82f92705d008"}, - {file = "black-21.5b1.tar.gz", hash = "sha256:23695358dbcb3deafe7f0a3ad89feee5999a46be5fec21f4f1d108be0bcdb3b1"}, + {file = "black-21.5b2-py3-none-any.whl", hash = "sha256:e5cf21ebdffc7a9b29d73912b6a6a9a4df4ce70220d523c21647da2eae0751ef"}, + {file = "black-21.5b2.tar.gz", hash = "sha256:1fc0e0a2c8ae7d269dfcf0c60a89afa299664f3e811395d40b1922dff8f854b5"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index eade97f09..6edef08fe 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.27.0" [tool.poetry.dev-dependencies] -black = "^21.5b1" +black = "^21.5b2" isort = "^5.8.0" pytest = "^6.2.4" python-semantic-release = "^7.15.5" From b01408bab635e7a5f332cd26077140baf0954a86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 06:31:47 +0000 Subject: [PATCH 0208/1554] chore(deps-dev): bump black from 21.5b0 to 21.5b2 Bumps [black](https://github.com/psf/black) from 21.5b0 to 21.5b2. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 24 +++++++++++++++++++----- packages/lectern/pyproject.toml | 2 +- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 61c8d87ee..0617d53d3 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -61,7 +61,7 @@ pydantic = ">=1.8.1,<2.0.0" [[package]] name = "black" -version = "21.5b0" +version = "21.5b2" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,8 +77,9 @@ toml = ">=0.10.1" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" @@ -780,7 +781,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "eb7e6cd89c4aec9da590a80cda2baea75a3e4fb4b32582f8c6d37dca860f4a30" +content-hash = "b6f9ca7bdcd9b33c401b85c1a91bc164f16d44689087904614651add9f466de8" [metadata.files] appdirs = [ @@ -804,8 +805,8 @@ beet = [ {file = "beet-0.23.0.tar.gz", hash = "sha256:911ea738918616ca7974e98cc03e7e6afb2e4de9d70fdd932bfc4009b63fb945"}, ] black = [ - {file = "black-21.5b0-py3-none-any.whl", hash = "sha256:0e80435b8a88f383c9149ae89d671eb2095b72344b0fe8a1d61d2ff5110ed173"}, - {file = "black-21.5b0.tar.gz", hash = "sha256:9dc2042018ca10735366d944c2c12d9cad6dec74a3d5f679d09384ea185d9943"}, + {file = "black-21.5b2-py3-none-any.whl", hash = "sha256:e5cf21ebdffc7a9b29d73912b6a6a9a4df4ce70220d523c21647da2eae0751ef"}, + {file = "black-21.5b2.tar.gz", hash = "sha256:1fc0e0a2c8ae7d269dfcf0c60a89afa299664f3e811395d40b1922dff8f854b5"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -832,24 +833,36 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -1072,6 +1085,7 @@ pillow = [ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index b4eabd79e..34de04881 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -30,7 +30,7 @@ markdown-it-py = "^1.1.0" click = "^7.1.2" [tool.poetry.dev-dependencies] -black = "^21.5b0" +black = "^21.5b2" rope = "^0.19.0" pytest = "^6.2.4" isort = "^5.8.0" From 9108e1838aa4f768ff759cb5bec1134f8cfdc021 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 05:19:27 +0000 Subject: [PATCH 0209/1554] chore(deps-dev): bump pyright from 1.1.145 to 1.1.146 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.145 to 1.1.146. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.146/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 4247fdecb..a4f1bdc01 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.145", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.145.tgz", - "integrity": "sha512-eyrK9Ilut2shvqi/TFmpfUrm7U6DrkskMa8UPofkGJZCO1PJzVwzKaGWrR57zlbcAxs5PVvK9JGSIO9DJUVNyA==", + "version": "1.1.146", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.146.tgz", + "integrity": "sha512-1VRaCsLvD0bIH02lGcVvjFkxAU/V9OJgIKmMq3lbm5cZEMDYS/N1d8Xk9WqYzjAme/XfFvG6N/AJNT32CEjsbQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 3582262cb..72bd8cca6 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.145" + "pyright": "^1.1.146" } } From 7105877ee8a8a7c3877530d7deea0903789524fd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 7 Jun 2021 05:10:19 +0000 Subject: [PATCH 0210/1554] chore(deps-dev): bump pyright from 1.1.146 to 1.1.147 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.146 to 1.1.147. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.147/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index a4f1bdc01..5c8f3f063 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.146", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.146.tgz", - "integrity": "sha512-1VRaCsLvD0bIH02lGcVvjFkxAU/V9OJgIKmMq3lbm5cZEMDYS/N1d8Xk9WqYzjAme/XfFvG6N/AJNT32CEjsbQ==", + "version": "1.1.147", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.147.tgz", + "integrity": "sha512-xHfJWctf83cQF/F/PfgByknHUB0ydE9ChnQGdWZ+Hb2zjy/Qniq77xUZkCehl24RgQbk0M0nGxvMApO77PhIxw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 72bd8cca6..1d54d1135 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.146" + "pyright": "^1.1.147" } } From 468571261fa2093928c17bb2fb20bed051f5522b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jun 2021 07:21:52 +0000 Subject: [PATCH 0211/1554] chore(deps-dev): bump pyright from 1.1.138 to 1.1.147 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.138 to 1.1.147. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.147/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 414e0b95b..7bf4ce634 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.138" + "pyright": "^1.1.147" } }, "node_modules/pyright": { - "version": "1.1.138", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.138.tgz", - "integrity": "sha512-y8Jr8jS4elYEXg+vJY/0yKxMissV5ByZIgi2WGmv5imvLULBuEBaCNExMTdq16lfyoAXqrFOAuW8PFm7syrnUA==", + "version": "1.1.147", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.147.tgz", + "integrity": "sha512-xHfJWctf83cQF/F/PfgByknHUB0ydE9ChnQGdWZ+Hb2zjy/Qniq77xUZkCehl24RgQbk0M0nGxvMApO77PhIxw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.138", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.138.tgz", - "integrity": "sha512-y8Jr8jS4elYEXg+vJY/0yKxMissV5ByZIgi2WGmv5imvLULBuEBaCNExMTdq16lfyoAXqrFOAuW8PFm7syrnUA==", + "version": "1.1.147", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.147.tgz", + "integrity": "sha512-xHfJWctf83cQF/F/PfgByknHUB0ydE9ChnQGdWZ+Hb2zjy/Qniq77xUZkCehl24RgQbk0M0nGxvMApO77PhIxw==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 6d2c4e210..1d54d1135 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.138" + "pyright": "^1.1.147" } } From 113a118799ca61e125744fed2c690ddf80e2955a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 9 Jun 2021 05:19:40 +0000 Subject: [PATCH 0212/1554] chore(deps-dev): bump python-semantic-release from 7.15.5 to 7.16.1 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.5 to 7.16.1. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.5...v7.16.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e03ad126b..500a654a8 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -475,14 +475,14 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.15.5" +version = "7.16.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" [package.dependencies] -click = ">=7,<8" +click = ">=7,<9" click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" @@ -696,7 +696,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "a720ccb5dec92f1cf49d7334072242449e2896502e87dba1f7f7314eab7dcd07" +content-hash = "498d1ff30345a8c82c9bc13f2964ab651940955d46e9bda8a944941e7c3816a4" [metadata.files] appdirs = [ @@ -1034,8 +1034,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.5.tar.gz", hash = "sha256:b5d726026701ff0c1e428c1ffe9666fb8dcdfbf6328a747504d1eefd3c8779d3"}, - {file = "python_semantic_release-7.15.5-py3-none-any.whl", hash = "sha256:798de4c09e6ac26aecd489d002a6ddbf0b9d1e6aae8cab64ff4df8e4a1107e15"}, + {file = "python-semantic-release-7.16.1.tar.gz", hash = "sha256:78875764c08bf6b8c76e2c4f1764c27c12f7a64f95515109d61dc56eed001876"}, + {file = "python_semantic_release-7.16.1-py3-none-any.whl", hash = "sha256:f981005f168b2a985ec726eae8fda2c5629f35a69f331e848a8b91316b51ee0e"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 6edef08fe..686a7ceeb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.5.1,<0.27.0" black = "^21.5b2" isort = "^5.8.0" pytest = "^6.2.4" -python-semantic-release = "^7.15.5" +python-semantic-release = "^7.16.1" [tool.black] target-version = ["py38"] From 6d06557739fc957b827a0853945df8f75c855d5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jun 2021 06:09:10 +0000 Subject: [PATCH 0213/1554] chore(deps-dev): bump python-semantic-release from 7.15.4 to 7.16.1 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.15.4 to 7.16.1. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.15.4...v7.16.1) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 12 ++++++------ packages/lectern/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 0617d53d3..1e3134051 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -527,14 +527,14 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.15.4" +version = "7.16.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" [package.dependencies] -click = ">=7,<8" +click = ">=7,<9" click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" @@ -542,7 +542,7 @@ invoke = ">=1.4.1,<2" python-gitlab = ">=1.10,<3" requests = ">=2.25,<3" semver = ">=2.10,<3" -tomlkit = ">=0.7.0,<1.0.0" +tomlkit = "0.7.0" twine = ">=3,<4" [package.extras] @@ -781,7 +781,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b6f9ca7bdcd9b33c401b85c1a91bc164f16d44689087904614651add9f466de8" +content-hash = "d39a1b72ba54db623909d50a4d68bcb0de5babfefdcce52ea7f9cc2efb27be08" [metadata.files] appdirs = [ @@ -1149,8 +1149,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.15.4.tar.gz", hash = "sha256:cb2a02a35c48d8ea81b83c3d913ee0bf5f4e26e97f4cbc8f25930e4a80792eae"}, - {file = "python_semantic_release-7.15.4-py3-none-any.whl", hash = "sha256:a62ff8a9c909737fb45adb1c90dfa4938eb0e329831b91a26b7b586b378e4f94"}, + {file = "python-semantic-release-7.16.1.tar.gz", hash = "sha256:78875764c08bf6b8c76e2c4f1764c27c12f7a64f95515109d61dc56eed001876"}, + {file = "python_semantic_release-7.16.1-py3-none-any.whl", hash = "sha256:f981005f168b2a985ec726eae8fda2c5629f35a69f331e848a8b91316b51ee0e"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 34de04881..992c29839 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -34,7 +34,7 @@ black = "^21.5b2" rope = "^0.19.0" pytest = "^6.2.4" isort = "^5.8.0" -python-semantic-release = "^7.15.4" +python-semantic-release = "^7.16.1" pytest-insta = "^0.1.10" [tool.poetry.scripts] From 0dfac6decebc9bad4388f025414be9dd9784b36d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 10 Jun 2021 05:10:13 +0000 Subject: [PATCH 0214/1554] chore(deps-dev): bump pyright from 1.1.147 to 1.1.148 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.147 to 1.1.148. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.148/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 6 +++--- packages/mecha/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 5c8f3f063..54f2e0efc 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "pyright": { - "version": "1.1.147", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.147.tgz", - "integrity": "sha512-xHfJWctf83cQF/F/PfgByknHUB0ydE9ChnQGdWZ+Hb2zjy/Qniq77xUZkCehl24RgQbk0M0nGxvMApO77PhIxw==", + "version": "1.1.148", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.148.tgz", + "integrity": "sha512-cM1Bs/5XSqqfaTfl+zSvXvrq1YMUYOmo2QGBqZ4Cczq0hDo4oJAihzszJONO9H5riTgmEduid5aU3Rpkx+Y/xw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 1d54d1135..f01f984c9 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.147" + "pyright": "^1.1.148" } } From 368cbeceab50d234ede13a1ef885b32cc4881c3d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 10 Jun 2021 05:10:30 +0000 Subject: [PATCH 0215/1554] chore(deps): bump beet from 0.26.0 to 0.28.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.26.0 to 0.28.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.26.0...v0.28.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 51 +++++++++++++++++++++++++++++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 500a654a8..96fad23e9 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.26.0" +version = "0.28.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -58,6 +58,8 @@ nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" Pillow = ">=8.2.0,<9.0.0" pydantic = ">=1.8.1,<2.0.0" +PyYAML = ">=5.4.1,<6.0.0" +toml = ">=0.10.2,<0.11.0" [[package]] name = "black" @@ -506,6 +508,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + [[package]] name = "readme-renderer" version = "28.0" @@ -622,7 +632,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -696,7 +706,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "498d1ff30345a8c82c9bc13f2964ab651940955d46e9bda8a944941e7c3816a4" +content-hash = "0ca036df7244974402f25f6d2b1a8bd66c71406972eaa8b7908082961a43a047" [metadata.files] appdirs = [ @@ -716,8 +726,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.26.0-py3-none-any.whl", hash = "sha256:ba9c72e62d583951c43754949a13a309512d92743aa47c61fcb4994efc524166"}, - {file = "beet-0.26.0.tar.gz", hash = "sha256:f4e10cb61e43a935294b54d4c342e7c33323325302960d1405856f1574ebf91b"}, + {file = "beet-0.28.0-py3-none-any.whl", hash = "sha256:713960978cb7ca5d4d3aad2c0cc6efd993fda30f3f7865685f15cda7d503553b"}, + {file = "beet-0.28.0.tar.gz", hash = "sha256:8f163ee2c03fcab5440a7b99d9847611d63264505a269df14434cd68998a5324"}, ] black = [ {file = "black-21.5b2-py3-none-any.whl", hash = "sha256:e5cf21ebdffc7a9b29d73912b6a6a9a4df4ce70220d523c21647da2eae0751ef"}, @@ -1041,6 +1051,37 @@ pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] +pyyaml = [ + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, +] readme-renderer = [ {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 686a7ceeb..aa5f264e1 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.27.0" +beet = ">=0.5.1,<0.29.0" [tool.poetry.dev-dependencies] black = "^21.5b2" From 39ee53817efaa82919899d1e09917dda5823f059 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 11 Jun 2021 07:10:42 +0200 Subject: [PATCH 0216/1554] fix: update logo --- packages/lectern/README.md | 2 +- packages/lectern/logo.png | Bin 282645 -> 190499 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index e1657c4d7..539a54d91 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -1,4 +1,4 @@ -logo +logo # Lectern diff --git a/packages/lectern/logo.png b/packages/lectern/logo.png index b0dbc5f21d718412b5ae431cbf37247db6939661..c7a5770c68d40ba25e11cf50ca2bb9be38b09f51 100755 GIT binary patch literal 190499 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 Date: Fri, 11 Jun 2021 05:11:40 +0000 Subject: [PATCH 0217/1554] 0.13.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 43e51282e..53a8698d4 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.13.1 (2021-06-11) +### Fix +* Update logo ([`cafaf65`](https://github.com/mcbeet/lectern/commit/cafaf65ef92c141cc952409fd6962cef1b801a99)) + ## v0.13.0 (2021-05-09) ### Feature * Add define directive ([`85ec3cc`](https://github.com/mcbeet/lectern/commit/85ec3ccdd682f35c0e3556e116dab48cb55a27a9)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 804c19307..318abfaef 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.13.0" +__version__ = "0.13.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 992c29839..0be0c4ce7 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.13.0" +version = "0.13.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From c9a176b974d5f938ce5f29e681b9dc5603fa8374 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 11 Jun 2021 05:13:08 +0000 Subject: [PATCH 0218/1554] chore(deps-dev): bump black from 21.5b2 to 21.6b0 Bumps [black](https://github.com/psf/black) from 21.5b2 to 21.6b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 96fad23e9..39f0a1e14 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -63,7 +63,7 @@ toml = ">=0.10.2,<0.11.0" [[package]] name = "black" -version = "21.5b2" +version = "21.6b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -706,7 +706,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0ca036df7244974402f25f6d2b1a8bd66c71406972eaa8b7908082961a43a047" +content-hash = "b145acd853ace46fa70bbf32c23d55bfeb91a6150e8fa5ce91cd233bc4b39a09" [metadata.files] appdirs = [ @@ -730,8 +730,8 @@ beet = [ {file = "beet-0.28.0.tar.gz", hash = "sha256:8f163ee2c03fcab5440a7b99d9847611d63264505a269df14434cd68998a5324"}, ] black = [ - {file = "black-21.5b2-py3-none-any.whl", hash = "sha256:e5cf21ebdffc7a9b29d73912b6a6a9a4df4ce70220d523c21647da2eae0751ef"}, - {file = "black-21.5b2.tar.gz", hash = "sha256:1fc0e0a2c8ae7d269dfcf0c60a89afa299664f3e811395d40b1922dff8f854b5"}, + {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, + {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index aa5f264e1..6ec2b80f4 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -26,7 +26,7 @@ python = "^3.8" beet = ">=0.5.1,<0.29.0" [tool.poetry.dev-dependencies] -black = "^21.5b2" +black = "^21.6b0" isort = "^5.8.0" pytest = "^6.2.4" python-semantic-release = "^7.16.1" From 79c5092a83f41982308f9f4b066a1186a6ca8cfd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 11 Jun 2021 05:17:13 +0000 Subject: [PATCH 0219/1554] chore(deps): bump beet from 0.28.0 to 0.31.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.28.0 to 0.31.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.28.0...v0.31.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 39f0a1e14..6d3d96221 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.28.0" +version = "0.31.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -706,7 +706,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b145acd853ace46fa70bbf32c23d55bfeb91a6150e8fa5ce91cd233bc4b39a09" +content-hash = "b2c88658cda4c0e773a30b666085b824258b88130557cc1c6b905a120597b153" [metadata.files] appdirs = [ @@ -726,8 +726,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.28.0-py3-none-any.whl", hash = "sha256:713960978cb7ca5d4d3aad2c0cc6efd993fda30f3f7865685f15cda7d503553b"}, - {file = "beet-0.28.0.tar.gz", hash = "sha256:8f163ee2c03fcab5440a7b99d9847611d63264505a269df14434cd68998a5324"}, + {file = "beet-0.31.1-py3-none-any.whl", hash = "sha256:258730425ba06fbd6fa96d72eedfd700c760e205bf1cea67679a2b475eed8de4"}, + {file = "beet-0.31.1.tar.gz", hash = "sha256:648e4d960761f406eb7dcba4fd153af0e67c45456c45903b2ca30ffe00abf0db"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 6ec2b80f4..f64c71f0d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.29.0" +beet = ">=0.5.1,<0.32.0" [tool.poetry.dev-dependencies] black = "^21.6b0" From 872268c6dbc25f1e41e24b4a6ceb3e9323d48bfc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 12 Jun 2021 04:48:29 +0200 Subject: [PATCH 0220/1554] chore: update stuff --- packages/mecha/README.md | 4 ++-- packages/mecha/docs/assets/logo.svg | 23 ----------------------- packages/mecha/examples/.gitkeep | 0 packages/mecha/logo.png | Bin 0 -> 131615 bytes packages/mecha/package-lock.json | 23 ++++++++++++++++++++++- packages/mecha/poetry.lock | 9 ++++----- packages/mecha/pyproject.toml | 4 ++-- 7 files changed, 30 insertions(+), 33 deletions(-) delete mode 100755 packages/mecha/docs/assets/logo.svg create mode 100644 packages/mecha/examples/.gitkeep create mode 100644 packages/mecha/logo.png diff --git a/packages/mecha/README.md b/packages/mecha/README.md index ebb15a0be..79c3d1c99 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -1,4 +1,4 @@ -logo +logo # Mecha @@ -7,7 +7,7 @@ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mecha.svg)](https://pypi.org/project/mecha/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) -> A flexible Minecraft command generation library. +> A flexible Minecraft command library. ## Introduction diff --git a/packages/mecha/docs/assets/logo.svg b/packages/mecha/docs/assets/logo.svg deleted file mode 100755 index af959c1d4..000000000 --- a/packages/mecha/docs/assets/logo.svg +++ /dev/null @@ -1,23 +0,0 @@ - -Made with Pixels to Svg https://codepen.io/shshaw/pen/XbxvNj - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/mecha/examples/.gitkeep b/packages/mecha/examples/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/logo.png b/packages/mecha/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f84d6b4d43325921b8846e808a6915390f2627 GIT binary patch literal 131615 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 literal 0 HcmV?d00001 diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 54f2e0efc..36e097914 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -1,6 +1,27 @@ { + "name": "mecha", + "lockfileVersion": 2, "requires": true, - "lockfileVersion": 1, + "packages": { + "": { + "devDependencies": { + "pyright": "^1.1.148" + } + }, + "node_modules/pyright": { + "version": "1.1.148", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.148.tgz", + "integrity": "sha512-cM1Bs/5XSqqfaTfl+zSvXvrq1YMUYOmo2QGBqZ4Cczq0hDo4oJAihzszJONO9H5riTgmEduid5aU3Rpkx+Y/xw==", + "dev": true, + "bin": { + "pyright": "index.js", + "pyright-langserver": "langserver.index.js" + }, + "engines": { + "node": ">=12.0.0" + } + } + }, "dependencies": { "pyright": { "version": "1.1.148", diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6d3d96221..b3ab056fd 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.31.1" +version = "0.31.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -706,7 +706,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b2c88658cda4c0e773a30b666085b824258b88130557cc1c6b905a120597b153" +content-hash = "9a4f6cc914330eaced2d808dd8a11c4e2ce775d681396b39dba1e580d22c2afe" [metadata.files] appdirs = [ @@ -726,8 +726,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.31.1-py3-none-any.whl", hash = "sha256:258730425ba06fbd6fa96d72eedfd700c760e205bf1cea67679a2b475eed8de4"}, - {file = "beet-0.31.1.tar.gz", hash = "sha256:648e4d960761f406eb7dcba4fd153af0e67c45456c45903b2ca30ffe00abf0db"}, + {file = "beet-0.31.3-py3-none-any.whl", hash = "sha256:58e034915ed20d82682ce9155fa16779e39cd92e0dba843a2308e466cc738a81"}, + {file = "beet-0.31.3.tar.gz", hash = "sha256:4f376249eb36df2d7ae77ca287d309dd6bad1f52232683ae6c8ac04818a15d43"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, @@ -984,7 +984,6 @@ pillow = [ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f64c71f0d..dd998e07b 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "mecha" version = "0.0.1" -description = "A flexible Minecraft command generation library" +description = "A flexible Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.5.1,<0.32.0" +beet = ">=0.31.3" [tool.poetry.dev-dependencies] black = "^21.6b0" From bc2abdd01d53383957ac9243a65a96103100e04b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 12 Jun 2021 13:14:11 +0200 Subject: [PATCH 0221/1554] feat: start working on a parser --- packages/mecha/mecha/parse.py | 331 ++++++++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 packages/mecha/mecha/parse.py diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py new file mode 100644 index 000000000..67ed36193 --- /dev/null +++ b/packages/mecha/mecha/parse.py @@ -0,0 +1,331 @@ +__all__ = [ + "Token", + "TokenSpec", + "TokenStream", + "InvalidSyntax", + "UnexpectedEOF", + "UnexpectedToken", +] + + +import re +from contextlib import contextmanager +from dataclasses import dataclass +from typing import Dict, Iterable, Iterator, List, NamedTuple, Optional, Tuple + +from beet.core.utils import extra_field + + +class Token(NamedTuple): + """Class representing a token.""" + + type: str + value: str + pos: int + lineno: int + col_start: int + col_end: int + + +class InvalidSyntax(Exception): + """Raised when the parser encounters invalid syntax.""" + + +class UnexpectedEOF(InvalidSyntax): + """Raised when the parser reaches the end of the file unexpectedly.""" + + expected_type: str + expected_value: Optional[str] + + def __init__( + self, + expected_type: str, + expected_value: Optional[str] = None, + ) -> None: + super().__init__(expected_type, expected_value) + self.expected_type = expected_type + self.expected_value = expected_value + + def __str__(self) -> str: + value = "" if self.expected_value is None else " " + repr(self.expected_value) + return f"Reached end of file instead of expected {self.expected_type}{value}" + + +class UnexpectedToken(InvalidSyntax): + """Raised when the parser encounters an unexpected token.""" + + token: Token + expected_type: str + expected_value: Optional[str] + + def __init__( + self, + token: Token, + expected_type: str, + expected_value: Optional[str] = None, + ) -> None: + super().__init__(token) + self.token = token + self.expected_type = expected_type + self.expected_value = expected_value + + def __str__(self) -> str: + value = "" if self.expected_value is None else " " + repr(self.expected_value) + return f"Expected {self.expected_type}{value} but got {self.token.type} {self.token.value!r}" + + +@dataclass +class Checkpoint: + """Allows committing the modifications.""" + + committed: bool = False + + def commit(self): + """Commit the checkpoint.""" + self.committed = True + + +TokenSpec = Tuple[Tuple[str, str], ...] + + +@dataclass +class TokenStream: + """Stream for processing tokens extracted from an input string.""" + + source: str + token_spec: TokenSpec = () + + pos: int = 0 + lineno: int = 1 + colno: int = 1 + + index: int = -1 + tokens: List[Token] = extra_field(default_factory=list) + indentation: List[int] = extra_field(default_factory=lambda: [0]) + + regex: "re.Pattern[str]" = extra_field(init=False) + regex_cache: Dict[TokenSpec, "re.Pattern[str]"] = extra_field(default_factory=dict) + + generator: Iterator[Token] = extra_field(init=False) + + def __post_init__(self): + self.bake_regex() + self.generator = self.tokenize() + + def bake_regex(self): + """Turn the syntax in the `token_spec` attribute into a regex.""" + spec = self.token_spec + ( + ("comment", r"#.+$"), + ("whitespace", r"\s+"), + ) + self.regex = re.compile( + "|".join(f"(?P<{name}>{regex})" for name, regex in spec), re.MULTILINE + ) + + @contextmanager + def syntax(self, **kwargs: str) -> Iterator[None]: + """Define token rules using regular expressions.""" + previous_spec = self.token_spec + previous_tokens = self.tokens + self.token_spec = tuple(kwargs.items()) + + if self.index + 1 < len(previous_tokens): + self.tokens = previous_tokens[: self.index + 1] + + if regex := self.regex_cache.get(self.token_spec): + self.regex = regex + else: + self.bake_regex() + self.regex_cache[self.token_spec] = self.regex + + try: + yield + finally: + self.token_spec = previous_spec + self.tokens = previous_tokens + + def filter(self, *token_types: str) -> Iterator[Token]: + """Yield tokens matching the given types.""" + types = set(token_types) + + for token in self: + if token.type in types: + yield token + + def reject(self, *token_types: str, blanks: bool = False) -> Iterator[Token]: + """Yield tokens expect those matching the given types.""" + types = set(token_types) + + if blanks: + types |= {"whitespace", "newline", "indent", "dedent", "comment"} + + for token in self: + if token.type not in types: + yield token + + def skip(self, *token_types: str, blanks: bool = False) -> Optional[Token]: + """Return the first token that doesn't match the given types.""" + types = set(token_types) + + if blanks: + types |= {"whitespace", "newline", "indent", "dedent", "comment"} + + for token in self: + if token.type not in types: + return token + + return None + + @property + def current(self) -> Token: + """The current token.""" + return self.tokens[self.index] + + @property + def previous(self) -> Token: + """The previous token.""" + return self.tokens[self.index - 1] + + @property + def rest(self) -> str: + """The remaining input to parse.""" + return self.source[self.pos :] + + def head(self, characters: int = 50) -> str: + """Return the next characters to parse.""" + return self.source[self.pos : self.pos + characters].partition("\n")[0] + + def emit(self, token_type: str, value: str = "") -> int: + """Generate a token and return its index in the `tokens` list.""" + token = Token( + token_type, + value, + self.pos, + self.lineno, + self.colno, + self.colno + len(value), + ) + + self.pos += len(value) + self.colno += len(value) + self.tokens.append(token) + + return len(self.tokens) - 1 + + def tokenize(self) -> Iterator[Token]: + """Extract tokens from the input string.""" + while self.pos < len(self.source): + if self.source[self.pos] == "\n": + self.index = self.emit("newline", "\n") + self.lineno += 1 + self.colno = 1 + yield self.current + + elif match := self.regex.match(self.source, self.pos): + assert match.lastgroup + + if ( + match.lastgroup != "comment" + and ( + len(self.tokens) == 1 + or len(self.tokens) > 1 + and self.previous.type == "newline" + ) + and self.current.type == "whitespace" + ): + indent = len(self.current.value.expandtabs()) + + while indent < self.indentation[-1]: + self.index = self.emit("dedent") + self.indentation.pop() + yield self.current + + if indent > self.indentation[-1]: + self.index = self.emit("indent") + self.indentation.append(indent) + yield self.current + + self.index = self.emit(match.lastgroup, match.group()) + yield self.current + + else: + raise InvalidSyntax(self.head()) + + while len(self.indentation) > 1: + self.index = self.emit("dedent") + self.indentation.pop() + yield self.current + + def __iter__(self) -> "TokenStream": + return self + + def __next__(self) -> Token: + if self.index + 1 < len(self.tokens): + self.index += 1 + return self.current + return next(self.generator) + + @contextmanager + def checkpoint(self) -> Iterator[Checkpoint]: + """Reset the stream to the current token at the end of the with statement.""" + checkpoint = Checkpoint() + previous_index = self.index + + try: + yield checkpoint + finally: + if not checkpoint.committed: + self.index = previous_index + + def peek(self, n: int = 1) -> Optional[Token]: + """Return a token relative to the current index.""" + index = self.index + n + + if index < 0: + return None + if index < len(self.tokens): + return self.tokens[index] + + with self.checkpoint(): + self.index = len(self.tokens) - 1 + + for token in self: + if self.index == index: + return token + + def expect( + self, + token_type: str, + value: Optional[str] = None, + skip: Iterable[str] = (), + skip_blanks: bool = False, + ) -> Token: + """Check that the next token has a given type and value.""" + token = self.skip(*skip, blanks=skip_blanks) + + if not token: + raise UnexpectedEOF(token_type, value) + if token.type != token_type or value is not None and token.value != value: + raise UnexpectedToken(token, token_type, value) + + return token + + def get( + self, + token_type: str, + value: Optional[str] = None, + skip: Iterable[str] = (), + skip_blanks: bool = False, + ) -> Optional[Token]: + """Return the next token with the given type and value.""" + token = self.skip(*skip, blanks=skip_blanks) + + if ( + not token + or token.type != token_type + or value is not None + and token.value != value + ): + return None + + return token From 4c23a1394c30d660cc59143cb1c32dd4074eb2d0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 12 Jun 2021 11:15:06 +0000 Subject: [PATCH 0222/1554] 0.1.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 9d18bb2d5..e3665f094 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.1.0 (2021-06-12) +### Feature +* Start working on a parser ([`739335c`](https://github.com/vberlier/mecha/commit/739335c4d2f1d09136291e03c2324491eb69279b)) + ## v0.0.1 (2021-01-27) ### Fix * Trigger automatic release ([`bd9e578`](https://github.com/vberlier/mecha/commit/bd9e578e353faa958514625761bb28e43ca6694c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 39e02896f..ae2d9e371 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,3 +1,3 @@ from .api import * -__version__ = "0.0.1" +__version__ = "0.1.0" diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index dd998e07b..548575650 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.0.1" +version = "0.1.0" description = "A flexible Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From f8396961553fd635bbf5f418aa8148c370561b22 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 15 Jun 2021 05:18:07 +0000 Subject: [PATCH 0223/1554] chore(deps-dev): bump pyright from 1.1.148 to 1.1.149 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.148 to 1.1.149. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.149/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 36e097914..379f0659d 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.148" + "pyright": "^1.1.149" } }, "node_modules/pyright": { - "version": "1.1.148", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.148.tgz", - "integrity": "sha512-cM1Bs/5XSqqfaTfl+zSvXvrq1YMUYOmo2QGBqZ4Cczq0hDo4oJAihzszJONO9H5riTgmEduid5aU3Rpkx+Y/xw==", + "version": "1.1.149", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.149.tgz", + "integrity": "sha512-RnXJ8tqbCwwiYFANoZgHblglLN/qFvXn0AKfl+NZHv+ErSibasySaNPRk9Nd3ObctS2OgkIVkvWQHO9jb/na7A==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.148", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.148.tgz", - "integrity": "sha512-cM1Bs/5XSqqfaTfl+zSvXvrq1YMUYOmo2QGBqZ4Cczq0hDo4oJAihzszJONO9H5riTgmEduid5aU3Rpkx+Y/xw==", + "version": "1.1.149", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.149.tgz", + "integrity": "sha512-RnXJ8tqbCwwiYFANoZgHblglLN/qFvXn0AKfl+NZHv+ErSibasySaNPRk9Nd3ObctS2OgkIVkvWQHO9jb/na7A==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index f01f984c9..02bf71f48 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.148" + "pyright": "^1.1.149" } } From 28ef54dcb2bedbec15212610c187dfda0eb10501 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 05:19:40 +0000 Subject: [PATCH 0224/1554] chore(deps): bump beet from 0.31.3 to 0.31.4 Bumps [beet](https://github.com/mcbeet/beet) from 0.31.3 to 0.31.4. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.31.3...v0.31.4) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index b3ab056fd..e46e616d3 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.31.3" +version = "0.31.4" description = "The Minecraft pack development kit" category = "main" optional = false @@ -726,8 +726,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.31.3-py3-none-any.whl", hash = "sha256:58e034915ed20d82682ce9155fa16779e39cd92e0dba843a2308e466cc738a81"}, - {file = "beet-0.31.3.tar.gz", hash = "sha256:4f376249eb36df2d7ae77ca287d309dd6bad1f52232683ae6c8ac04818a15d43"}, + {file = "beet-0.31.4-py3-none-any.whl", hash = "sha256:181852b896024f2121a0d6e39f48dbf21274112dcdf06c63feb52345dc1949b3"}, + {file = "beet-0.31.4.tar.gz", hash = "sha256:466558c8d1cb8c0c3e9c94dbc6ff1f56076c80e32e879653a2361decd3b78afb"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, @@ -984,6 +984,7 @@ pillow = [ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ From 18404f7c086ac65d399d058e076351d597a7c831 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 18 Jun 2021 05:22:09 +0000 Subject: [PATCH 0225/1554] chore(deps-dev): bump pyright from 1.1.149 to 1.1.150 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.149 to 1.1.150. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.150/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 379f0659d..c41b192de 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.149" + "pyright": "^1.1.150" } }, "node_modules/pyright": { - "version": "1.1.149", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.149.tgz", - "integrity": "sha512-RnXJ8tqbCwwiYFANoZgHblglLN/qFvXn0AKfl+NZHv+ErSibasySaNPRk9Nd3ObctS2OgkIVkvWQHO9jb/na7A==", + "version": "1.1.150", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.150.tgz", + "integrity": "sha512-Ktv1AiV+vaex0kFR3K4155fbtbfGfHZO9k3GgzUhxwOFqM7v/UNB0vz7gnSnyBpjGQAC/ZDhAflwf20yVsPeww==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.149", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.149.tgz", - "integrity": "sha512-RnXJ8tqbCwwiYFANoZgHblglLN/qFvXn0AKfl+NZHv+ErSibasySaNPRk9Nd3ObctS2OgkIVkvWQHO9jb/na7A==", + "version": "1.1.150", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.150.tgz", + "integrity": "sha512-Ktv1AiV+vaex0kFR3K4155fbtbfGfHZO9k3GgzUhxwOFqM7v/UNB0vz7gnSnyBpjGQAC/ZDhAflwf20yVsPeww==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 02bf71f48..6df2fa751 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.149" + "pyright": "^1.1.150" } } From 9947fe72cd7f9cd8c2d1b11d88c2d5756979b308 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 21 Jun 2021 05:14:39 +0000 Subject: [PATCH 0226/1554] chore(deps): bump beet from 0.31.4 to 0.32.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.31.4 to 0.32.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.31.4...v0.32.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 54 +++++--------------------------------- 1 file changed, 6 insertions(+), 48 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e46e616d3..5704edc74 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.31.4" +version = "0.32.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -56,11 +56,13 @@ fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" -Pillow = ">=8.2.0,<9.0.0" pydantic = ">=1.8.1,<2.0.0" PyYAML = ">=5.4.1,<6.0.0" toml = ">=0.10.2,<0.11.0" +[package.extras] +image = ["pillow"] + [[package]] name = "black" version = "21.6b0" @@ -365,14 +367,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -[[package]] -name = "pillow" -version = "8.2.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "pkginfo" version = "1.7.0" @@ -726,8 +720,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.31.4-py3-none-any.whl", hash = "sha256:181852b896024f2121a0d6e39f48dbf21274112dcdf06c63feb52345dc1949b3"}, - {file = "beet-0.31.4.tar.gz", hash = "sha256:466558c8d1cb8c0c3e9c94dbc6ff1f56076c80e32e879653a2361decd3b78afb"}, + {file = "beet-0.32.0-py3-none-any.whl", hash = "sha256:5ec3322bc0192d468cbbd2a96f6f8c1399599bbfd890b8441ea8a3cdef06e995"}, + {file = "beet-0.32.0.tar.gz", hash = "sha256:bb503523ee1383fbab0ca297efd4cb03570837c93a55dbf75c8e4ca74c32ac37"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, @@ -951,42 +945,6 @@ pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] -pillow = [ - {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, - {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, - {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, - {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, - {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, - {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, - {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, - {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, - {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, - {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, - {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, - {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, - {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, - {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, -] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, From 13dccfb726485c941a87b64089d9d540c06fa33e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 21 Jun 2021 05:19:50 +0000 Subject: [PATCH 0227/1554] chore(deps-dev): bump pyright from 1.1.150 to 1.1.151 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.150 to 1.1.151. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.151/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index c41b192de..cb8a78805 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.150" + "pyright": "^1.1.151" } }, "node_modules/pyright": { - "version": "1.1.150", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.150.tgz", - "integrity": "sha512-Ktv1AiV+vaex0kFR3K4155fbtbfGfHZO9k3GgzUhxwOFqM7v/UNB0vz7gnSnyBpjGQAC/ZDhAflwf20yVsPeww==", + "version": "1.1.151", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.151.tgz", + "integrity": "sha512-R/Zr6VqXghuFLm7y3a8HoCrA+mfy+Zp+mp6P8gFZeJO9Rl1kQLJhfc/y4QKSQHZWxXOBGo+AFDi/rWLZfNBEgQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.150", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.150.tgz", - "integrity": "sha512-Ktv1AiV+vaex0kFR3K4155fbtbfGfHZO9k3GgzUhxwOFqM7v/UNB0vz7gnSnyBpjGQAC/ZDhAflwf20yVsPeww==", + "version": "1.1.151", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.151.tgz", + "integrity": "sha512-R/Zr6VqXghuFLm7y3a8HoCrA+mfy+Zp+mp6P8gFZeJO9Rl1kQLJhfc/y4QKSQHZWxXOBGo+AFDi/rWLZfNBEgQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 6df2fa751..62d4623dc 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.150" + "pyright": "^1.1.151" } } From 72022194a2f3e61e028769915a5c71e1b2ebcf23 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 22 Jun 2021 05:17:36 +0000 Subject: [PATCH 0228/1554] chore(deps-dev): bump isort from 5.8.0 to 5.9.1 Bumps [isort](https://github.com/pycqa/isort) from 5.8.0 to 5.9.1. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.8.0...5.9.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 11 ++++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 5704edc74..c591afece 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -260,16 +260,17 @@ python-versions = "*" [[package]] name = "isort" -version = "5.8.0" +version = "5.9.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6.1,<4.0" [package.extras] pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] [[package]] name = "jeepney" @@ -700,7 +701,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9a4f6cc914330eaced2d808dd8a11c4e2ce775d681396b39dba1e580d22c2afe" +content-hash = "1c3bfdfe8d9d5db506a692267e0083e3c96ce5afb8970b59ff138716435f7516" [metadata.files] appdirs = [ @@ -842,8 +843,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, - {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, + {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, + {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 548575650..02b3082ec 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.31.3" [tool.poetry.dev-dependencies] black = "^21.6b0" -isort = "^5.8.0" +isort = "^5.9.1" pytest = "^6.2.4" python-semantic-release = "^7.16.1" From 0e11244d9621a111b64fce2a5957635da2484d80 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 22 Jun 2021 16:50:22 +0000 Subject: [PATCH 0229/1554] chore(deps): [security] bump urllib3 from 1.26.4 to 1.26.5 Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.4 to 1.26.5. **This update includes a security fix.** - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.4...1.26.5) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index c591afece..1218f4635 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -679,16 +679,16 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.4" +version = "1.26.5" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] +brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "webencodings" @@ -1148,8 +1148,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, - {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, + {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, + {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, From f4f97f197506bdad825961c3c49364ab100bcee2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 24 Jun 2021 06:51:08 +0200 Subject: [PATCH 0230/1554] chore: update pyright --- packages/lectern/lectern/directive.py | 2 +- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 25f19eda0..ffba13233 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -77,7 +77,7 @@ class NamespacedResourceDirective: def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): full_name = fragment.expect("full_name") - file_instance: Any = fragment.as_file(self.file_type) + file_instance: Any = fragment.as_file(self.file_type) # type: ignore pack = assets if self.file_type in assets.namespace_type.field_map else data proxy: Any = pack[self.file_type] # type: ignore diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 7bf4ce634..40df6cc1f 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.147" + "pyright": "^1.1.152" } }, "node_modules/pyright": { - "version": "1.1.147", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.147.tgz", - "integrity": "sha512-xHfJWctf83cQF/F/PfgByknHUB0ydE9ChnQGdWZ+Hb2zjy/Qniq77xUZkCehl24RgQbk0M0nGxvMApO77PhIxw==", + "version": "1.1.152", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", + "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.147", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.147.tgz", - "integrity": "sha512-xHfJWctf83cQF/F/PfgByknHUB0ydE9ChnQGdWZ+Hb2zjy/Qniq77xUZkCehl24RgQbk0M0nGxvMApO77PhIxw==", + "version": "1.1.152", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", + "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 1d54d1135..746ca26b9 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.147" + "pyright": "^1.1.152" } } From ed1445f696ee486767634d1821823dcdd2eb9f97 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 24 Jun 2021 06:55:29 +0200 Subject: [PATCH 0231/1554] chore: update deps --- packages/lectern/poetry.lock | 230 ++++++++---------- packages/lectern/pyproject.toml | 6 +- .../examples__beet_project__0.pack.md | 4 +- .../examples__markdown_README_md__0.pack.md | 2 +- ...wn_examples_append_modifier_txt__0.pack.md | 2 +- ...s__markdown_examples_basic1_txt__0.pack.md | 2 +- ...s__markdown_examples_basic2_txt__0.pack.md | 2 +- ...s__markdown_examples_basic3_txt__0.pack.md | 2 +- ...down_examples_code_fragments_md__0.pack.md | 2 +- ...__markdown_examples_combined_md__0.pack.md | 2 +- ...__markdown_examples_compact_txt__0.pack.md | 2 +- ..._examples_download_fragment_txt__0.pack.md | 2 +- ...wn_examples_empty_functions_txt__0.pack.md | 2 +- ...n_examples_escaped_fragment_txt__0.pack.md | 2 +- ...own_examples_folded_sections_md__0.pack.md | 2 +- ...arkdown_examples_merge_lang_txt__0.pack.md | 2 +- ...own_examples_merge_modifier_txt__0.pack.md | 2 +- ...n_examples_prepend_modifier_txt__0.pack.md | 2 +- ...down_examples_readme_example_md__0.pack.md | 2 +- ...es__markdown_examples_sound_txt__0.pack.md | 2 +- ...xamples_strip_final_newline_txt__0.pack.md | 2 +- ...ples_with_links_inline_image_md__0.pack.md | 4 +- ..._with_links_lots_of_textures_md__0.pack.md | 2 +- ...ith_links_pack_icon_data_url_md__0.pack.md | 4 +- ...es_with_links_pack_icon_link_md__0.pack.md | 2 +- ...s_with_links_pack_local_icon_md__0.pack.md | 2 +- ...s_with_links_structure_files_md__0.pack.md | 2 +- .../README.md | 2 +- .../README.md | 4 +- .../README.md | 2 +- .../README.md | 4 +- .../README.md | 2 +- .../README.md | 2 +- .../README.md | 2 +- .../examples__text_README_md__0.pack.txt | 2 +- ...t_examples_append_modifier_txt__0.pack.txt | 2 +- ...ples__text_examples_basic1_txt__0.pack.txt | 2 +- ...ples__text_examples_basic2_txt__0.pack.txt | 2 +- ...ples__text_examples_basic3_txt__0.pack.txt | 2 +- ...ext_examples_code_fragments_md__0.pack.txt | 2 +- ...les__text_examples_combined_md__0.pack.txt | 2 +- ...les__text_examples_compact_txt__0.pack.txt | 2 +- ...examples_download_fragment_txt__0.pack.txt | 2 +- ...t_examples_empty_functions_txt__0.pack.txt | 2 +- ..._examples_escaped_fragment_txt__0.pack.txt | 2 +- ...xt_examples_folded_sections_md__0.pack.txt | 2 +- ...__text_examples_merge_lang_txt__0.pack.txt | 2 +- ...xt_examples_merge_modifier_txt__0.pack.txt | 2 +- ..._examples_prepend_modifier_txt__0.pack.txt | 2 +- ...ext_examples_readme_example_md__0.pack.txt | 2 +- ...mples__text_examples_sound_txt__0.pack.txt | 2 +- ...amples_strip_final_newline_txt__0.pack.txt | 2 +- ...les_with_links_inline_image_md__0.pack.txt | 4 +- ...with_links_lots_of_textures_md__0.pack.txt | 2 +- ...th_links_pack_icon_data_url_md__0.pack.txt | 4 +- ...s_with_links_pack_icon_link_md__0.pack.txt | 2 +- ..._with_links_pack_local_icon_md__0.pack.txt | 2 +- ..._with_links_structure_files_md__0.pack.txt | 2 +- 58 files changed, 166 insertions(+), 196 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 1e3134051..ad2fbcfaa 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.23.0" +version = "0.32.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -53,15 +53,19 @@ click = ">=7.1.2,<8.0.0" click-help-colors = ">=0.9,<0.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" -Jinja2 = ">=2.11.3,<3.0.0" +Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.0,<2.0.0" pathspec = ">=0.8.1,<0.9.0" -Pillow = ">=8.2.0,<9.0.0" pydantic = ">=1.8.1,<2.0.0" +PyYAML = ">=5.4.1,<6.0.0" +toml = ">=0.10.2,<0.11.0" + +[package.extras] +image = ["pillow"] [[package]] name = "black" -version = "21.5b2" +version = "21.6b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -272,16 +276,17 @@ python-versions = "*" [[package]] name = "isort" -version = "5.8.0" +version = "5.9.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6.1,<4.0" [package.extras] pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] [[package]] name = "jeepney" @@ -296,17 +301,17 @@ test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] name = "jinja2" -version = "2.11.3" +version = "3.0.1" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" @@ -347,11 +352,11 @@ testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,< [[package]] name = "markupsafe" -version = "1.1.1" +version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.6" [[package]] name = "mypy-extensions" @@ -399,14 +404,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -[[package]] -name = "pillow" -version = "8.2.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "pkginfo" version = "1.7.0" @@ -558,6 +555,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + [[package]] name = "readme-renderer" version = "29.0" @@ -685,7 +690,7 @@ python-versions = ">=3.5" name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -781,7 +786,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d39a1b72ba54db623909d50a4d68bcb0de5babfefdcce52ea7f9cc2efb27be08" +content-hash = "5a979e52b1641606e09e8dd87f3b5e2188d48ac477095a54280cf6e1f95d2d3a" [metadata.files] appdirs = [ @@ -801,12 +806,12 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.23.0-py3-none-any.whl", hash = "sha256:6cacca43c1452c32b22db72f3ecb48a9ebdba820b76e7c68316af75ed9d0f8b8"}, - {file = "beet-0.23.0.tar.gz", hash = "sha256:911ea738918616ca7974e98cc03e7e6afb2e4de9d70fdd932bfc4009b63fb945"}, + {file = "beet-0.32.1-py3-none-any.whl", hash = "sha256:a1999daaddaaa66db0819286472262570361ce203c39a89824ea20fa8e2d7e62"}, + {file = "beet-0.32.1.tar.gz", hash = "sha256:b67f1d36900f1c8c77bfbd467bb18ed80d74163892635e1ce0ffbabb7db2d3d3"}, ] black = [ - {file = "black-21.5b2-py3-none-any.whl", hash = "sha256:e5cf21ebdffc7a9b29d73912b6a6a9a4df4ce70220d523c21647da2eae0751ef"}, - {file = "black-21.5b2.tar.gz", hash = "sha256:1fc0e0a2c8ae7d269dfcf0c60a89afa299664f3e811395d40b1922dff8f854b5"}, + {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, + {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -833,36 +838,24 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -937,16 +930,16 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, - {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, + {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, + {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, + {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, + {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] keyring = [ {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, @@ -957,58 +950,40 @@ markdown-it-py = [ {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1052,42 +1027,6 @@ pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] -pillow = [ - {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, - {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, - {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, - {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, - {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, - {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, - {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, - {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, - {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, - {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, - {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, - {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, - {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, - {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, -] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, @@ -1156,6 +1095,37 @@ pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] +pyyaml = [ + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, +] readme-renderer = [ {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 0be0c4ce7..9217b9062 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,15 +25,15 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.23.0" +beet = ">=0.32.1" markdown-it-py = "^1.1.0" click = "^7.1.2" [tool.poetry.dev-dependencies] -black = "^21.5b2" +black = {version = "^21.6b0", allow-prereleases = true} rope = "^0.19.0" pytest = "^6.2.4" -isort = "^5.8.0" +isort = {version = "^5.9.1", allow-prereleases = true} python-semantic-release = "^7.16.1" pytest-insta = "^0.1.10" diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 094d7dfae..0fdde6c16 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -335,7 +335,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index 14e60ac78..9e618c22f 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md index 96330d2f4..d37690fa5 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md index f37417bd6..f7ab82cec 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md index 08503a2ac..687592ce6 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md index fc16d8186..57d312488 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md index e153cd47f..262f4eace 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md index 7d4d02758..aea6c2e93 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md @@ -38,7 +38,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md index 52d0907ea..51c0dca43 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md index b2a105168..88ea1ccaa 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md index ae3739e62..f5ec5bca5 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md index 6f145bb4a..86a464d6b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md index f37417bd6..f7ab82cec 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md index e652f1439..b9feab42b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md index adacebf49..b879dbe6b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md index 8098c16a3..b45320268 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md index 749ae1ec9..54df5e900 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md index 80f7bf05a..b81c99d86 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md index ba99de899..d6270118b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md index b3df4cb1a..d4b8aef4a 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md index ec96b707e..d45fdd01e 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md index ee93f949b..c98dd1c3b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md index e5ba16ae0..4be1adb83 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md index e7297641a..c50236701 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md index bf7982004..f8c7150e8 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index 46e18704c..75ab088f2 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md index 6623e6aac..53a7ba7df 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md index 7f3ae4119..8e56d9c1a 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md index bcb71093f..b430ce67c 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md index cf7bcee59..eba4b83c7 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md index cf7bcee59..eba4b83c7 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md index 4af17f2c8..a1a8fa9e9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index c33743e9f..6eac9bbe5 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt index 2953a6a03..ff4b3242d 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt index a5cf6a2c9..567d8a1df 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt index c15cd86ed..266639d49 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt index 197353dbf..f27b60b5c 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt index 357162e41..ce9f661ce 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt index 001d102ab..00ae54c1c 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt index 9cf604d66..0c4f6a976 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt index c8fcffb95..5ca9c40e7 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt index b0bf7ad10..3cc70fe3c 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt index 05bb67191..29b74af1b 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt index a5cf6a2c9..567d8a1df 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt index 51adc19ee..b98af6e26 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt index b6d116ea2..5d9ae2946 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt index 89cef2109..31e538ab9 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt index 678731126..6893b00fb 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt index 56c2a7c13..96462bfdd 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt index 588c0683f..5f5b67b15 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt index 58c2e2c3d..e21fa36ac 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -18,7 +18,7 @@ UklGRsQ0AABXRUJQVlA4WAoAAAAQAAAAKwEAKwEAQUxQSBQCAAABCbdtJDkSZmq8yz/i1XXi34zo/wTE @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt index 7a9973944..32c8933da 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt index f050d0f0d..bf43b22e9 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } @@ -12,7 +12,7 @@ UklGRsQ0AABXRUJQVlA4WAoAAAAQAAAAKwEAKwEAQUxQSBQCAAABCbdtJDkSZmq8yz/i1XXi34zo/wTE @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt index 20c8bbfd9..7ac72e3f9 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt index 792fb8fbc..9b2a8d143 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt index 5883c93cf..ba814f208 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 6, + "pack_format": 7, "description": "" } } From 49f7a1c6778aeee489a093228a7f12e45d4e52c5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 05:07:58 +0000 Subject: [PATCH 0232/1554] chore(deps): bump beet from 0.32.0 to 0.32.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.32.0 to 0.32.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.32.0...v0.32.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1218f4635..e547a2d0a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.32.0" +version = "0.32.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -721,8 +721,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.32.0-py3-none-any.whl", hash = "sha256:5ec3322bc0192d468cbbd2a96f6f8c1399599bbfd890b8441ea8a3cdef06e995"}, - {file = "beet-0.32.0.tar.gz", hash = "sha256:bb503523ee1383fbab0ca297efd4cb03570837c93a55dbf75c8e4ca74c32ac37"}, + {file = "beet-0.32.1-py3-none-any.whl", hash = "sha256:a1999daaddaaa66db0819286472262570361ce203c39a89824ea20fa8e2d7e62"}, + {file = "beet-0.32.1.tar.gz", hash = "sha256:b67f1d36900f1c8c77bfbd467bb18ed80d74163892635e1ce0ffbabb7db2d3d3"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, From 746242b1f22961401ed5f0153c256511a340f07e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 05:15:38 +0000 Subject: [PATCH 0233/1554] chore(deps-dev): bump pyright from 1.1.151 to 1.1.152 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.151 to 1.1.152. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.152/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index cb8a78805..ca5c32a8a 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.151" + "pyright": "^1.1.152" } }, "node_modules/pyright": { - "version": "1.1.151", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.151.tgz", - "integrity": "sha512-R/Zr6VqXghuFLm7y3a8HoCrA+mfy+Zp+mp6P8gFZeJO9Rl1kQLJhfc/y4QKSQHZWxXOBGo+AFDi/rWLZfNBEgQ==", + "version": "1.1.152", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", + "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.151", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.151.tgz", - "integrity": "sha512-R/Zr6VqXghuFLm7y3a8HoCrA+mfy+Zp+mp6P8gFZeJO9Rl1kQLJhfc/y4QKSQHZWxXOBGo+AFDi/rWLZfNBEgQ==", + "version": "1.1.152", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", + "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 62d4623dc..746ca26b9 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.151" + "pyright": "^1.1.152" } } From d3d26588960c6e51b7ec78af304d12ec04cfee92 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 24 Jun 2021 07:36:08 +0200 Subject: [PATCH 0234/1554] fix: add type alias for AnyDirective --- packages/lectern/lectern/directive.py | 19 ++++++++++--------- packages/lectern/lectern/document.py | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index ffba13233..68d0fcd5b 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -1,5 +1,6 @@ __all__ = [ "Directive", + "AnyDirective", "NamespacedResourceDirective", "DataPackDirective", "ResourcePackDirective", @@ -61,6 +62,14 @@ from .fragment import Fragment +AnyDirective = Union[ + "Directive", + "NamespacedResourceDirective", + "DataPackDirective", + "ResourcePackDirective", + "SkipDirective", +] + class Directive(Protocol): """Protocol for detecting directives.""" @@ -134,15 +143,7 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): fragment.expect() -def get_builtin_directives() -> Dict[ - str, - Union[ - NamespacedResourceDirective, - DataPackDirective, - ResourcePackDirective, - SkipDirective, - ], -]: +def get_builtin_directives() -> Dict[str, AnyDirective]: """Return the built-in directives.""" return { # fmt: off diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 9705b6f50..53ac790a4 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -10,7 +10,7 @@ from beet import Cache, Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field -from .directive import Directive, get_builtin_directives +from .directive import AnyDirective, get_builtin_directives from .extract import MarkdownExtractor, TextExtractor from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer @@ -29,7 +29,7 @@ class Document: assets: ResourcePack = field(default_factory=ResourcePack) data: DataPack = field(default_factory=DataPack) - directives: MutableMapping[str, Directive] = extra_field( + directives: MutableMapping[str, AnyDirective] = extra_field( default_factory=get_builtin_directives ) From 5d1f5d4bc0338d6e0829e56a4b545d43cc9f0660 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 24 Jun 2021 08:14:07 +0200 Subject: [PATCH 0235/1554] feat: add lectern.contrib.relative_location --- packages/lectern/README.md | 37 +++++++++++++++++++ packages/lectern/examples/with_beet/beet.json | 3 +- .../lectern/examples/with_beet/relative.md | 13 +++++++ .../lectern/contrib/relative_location.py | 37 +++++++++++++++++++ .../examples__beet_project__0.pack.md | 24 +++++++++++- 5 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 packages/lectern/examples/with_beet/relative.md create mode 100644 packages/lectern/lectern/contrib/relative_location.py diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 539a54d91..f85269126 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -667,6 +667,43 @@ The `beet` plugin supports this use-case natively and allows you to run lectern The `scripts` option lets you specify the command-line arguments for your scripts. The scripts don't even have to be written in Python. As long as the command prints out valid `lectern` syntax you can use any language you want. +## Relative resource locations + +The `lectern.contrib.relative_location` plugin uses the `beet` context generator to generate namespaced resources in a default location automatically if you don't specify any namespace. + +``` +@function foo +function tutorial:bar + +@function bar +say hello +``` + +You can customize the root of unqualified resource locations by using the `generate_namespace` and `generate_prefix` meta variables. By default, `generate_namespace` is set to the `project_id` and `generate_prefix` is empty. + +The plugin works pretty nicely with `beet.contrib.relative_function_path`. + +```json +// beet.json +{ + "require": ["lectern.contrib.relative_location"], + "pipeline": ["lectern", "beet.contrib.relative_function_path"], + "meta": { + "lectern": { + "load": ["*.md"] + } + } +} +``` + +``` +@function foo +function ./bar + +@function bar +say hello +``` + ## Snapshot testing A lot of Minecraft tooling involves generating data packs and resource packs. Writing tests for this kind of tooling takes time because you need to painstakingly compare everything that you care about with a reference value. This makes it hard to get good coverage, and then even harder to keep making changes to the code being tested afterwards. You're trading robustness and stability for a shackle that massively slows down development. diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index c11c8c38b..b82e2437e 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -3,10 +3,11 @@ "lectern.contrib.require", "lectern.contrib.script", "lectern.contrib.define", + "lectern.contrib.relative_location", "custom_directive", "hello_directive" ], - "pipeline": ["lectern"], + "pipeline": ["lectern", "beet.contrib.relative_function_path"], "meta": { "lectern": { "load": ["*.md"], diff --git a/packages/lectern/examples/with_beet/relative.md b/packages/lectern/examples/with_beet/relative.md new file mode 100644 index 000000000..212a81020 --- /dev/null +++ b/packages/lectern/examples/with_beet/relative.md @@ -0,0 +1,13 @@ +# Example with relative locations + +`@function abc` + +```mcfunction +function ./def +``` + +`@function def` + +```mcfunction +say relative +``` diff --git a/packages/lectern/lectern/contrib/relative_location.py b/packages/lectern/lectern/contrib/relative_location.py new file mode 100644 index 000000000..a5a8eec3c --- /dev/null +++ b/packages/lectern/lectern/contrib/relative_location.py @@ -0,0 +1,37 @@ +"""Plugin that handles relative resource locations.""" + + +__all__ = [ + "RelativeNamespacedResourceDirective", +] + + +from dataclasses import dataclass, replace + +from beet import Context, DataPack, ResourcePack + +from lectern import Document, Fragment, NamespacedResourceDirective + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.directives.update( + (name, RelativeNamespacedResourceDirective(directive.file_type, ctx)) + for name, directive in document.directives.items() + if isinstance(directive, NamespacedResourceDirective) + ) + + +@dataclass +class RelativeNamespacedResourceDirective(NamespacedResourceDirective): + """Directive that handles relative resource locations.""" + + ctx: Context + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + name = fragment.expect("name") + + if ":" not in name: + fragment = replace(fragment, arguments=[self.ctx.generate.path(name)]) + + super().__call__(fragment, assets, data) diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 0fdde6c16..6dc754980 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -17,6 +17,28 @@ +### with_beet + +- `@function with_beet:abc` + +

+ + ```mcfunction + function with_beet:def + ``` + +
+ +- `@function with_beet:def` + +
+ + ```mcfunction + say relative + ``` + +
+ ### demo - `@function demo:foo` @@ -203,7 +225,7 @@ ### embedded -- `@function(strip_final_newline) embedded:foo` +- `@function embedded:foo`
From c0fafcca1ded303eb7e077a3950e083a8dc00adb Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 24 Jun 2021 06:15:31 +0000 Subject: [PATCH 0236/1554] 0.14.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 7 +++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 53a8698d4..433bd05e7 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.14.0 (2021-06-24) +### Feature +* Add lectern.contrib.relative_location ([`9ce8cff`](https://github.com/mcbeet/lectern/commit/9ce8cff3681b0a54d15cf3db5a8e328d56e80784)) + +### Fix +* Add type alias for AnyDirective ([`87b73de`](https://github.com/mcbeet/lectern/commit/87b73deea1aab47eeb374100e33ddff8d74a3548)) + ## v0.13.1 (2021-06-11) ### Fix * Update logo ([`cafaf65`](https://github.com/mcbeet/lectern/commit/cafaf65ef92c141cc952409fd6962cef1b801a99)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 318abfaef..0d2ac7382 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.13.1" +__version__ = "0.14.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9217b9062..9304c9276 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.13.1" +version = "0.14.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 39c34264492c95986977f2da1327eceab32df8b8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 26 Jun 2021 18:35:59 +0200 Subject: [PATCH 0237/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index ad2fbcfaa..158f9aeaf 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.32.1" +version = "0.33.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -786,7 +786,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "5a979e52b1641606e09e8dd87f3b5e2188d48ac477095a54280cf6e1f95d2d3a" +content-hash = "908746bdbcba19a2108340dfdd0c908fe9f3cfaa65d2eccb84cea03fbe807a31" [metadata.files] appdirs = [ @@ -806,8 +806,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.32.1-py3-none-any.whl", hash = "sha256:a1999daaddaaa66db0819286472262570361ce203c39a89824ea20fa8e2d7e62"}, - {file = "beet-0.32.1.tar.gz", hash = "sha256:b67f1d36900f1c8c77bfbd467bb18ed80d74163892635e1ce0ffbabb7db2d3d3"}, + {file = "beet-0.33.0-py3-none-any.whl", hash = "sha256:4eb903003d3892b36572e0d5db6dcf4328c0f1e89c0ad5c7cf7e1d7b67b1e3fc"}, + {file = "beet-0.33.0.tar.gz", hash = "sha256:a7fdfb3cc3e1b4660fd7e6587a1c8139cc8eabed9b85ac55df3383adc80e3485"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9304c9276..42aef3532 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.32.1" +beet = ">=0.33.0" markdown-it-py = "^1.1.0" click = "^7.1.2" From b6dabfcf655edaf9bc84ce40653d257a5de8b5a2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 26 Jun 2021 19:24:37 +0200 Subject: [PATCH 0238/1554] feat: add fragment loaders --- packages/lectern/README.md | 22 +++++++++++++++++ packages/lectern/lectern/document.py | 22 ++++++++++++++--- packages/lectern/lectern/extract.py | 32 +++++++++++++++++++++---- packages/lectern/tests/test_document.py | 18 +++++++++++++- 4 files changed, 86 insertions(+), 8 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index f85269126..7120ed7b9 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -514,6 +514,28 @@ The `as_file` method will take care of reading the file or downloading it if the You can handle custom modifiers by checking the content of the `modifier` attribute. +## Fragment loaders + +The `Document` object lets you register fragment loaders that intercept and potentially modify fragments before they're handled by directives. The `loaders` attribute is a list of callable objects that receive the fragment and the available directives as arguments. Each loader can then forward the fragment as-is or return a modified fragment. You can also return `None` to drop the fragment. + +```python +from typing import Mapping, Optional +from lectern import Directive, Document, Fragment + +def handle_ignore_modifier( + fragment: Fragment, + directives: Mapping[str, Directive], +) -> Optional[Fragment]: + if fragment.modifier == "ignore": + return None + return fragment + +document = Document() +document.loaders.append(handle_ignore_modifier) +document.add_text("@function(ignore) demo:foo\nsay hello") +assert not document.data +``` + ## Beet plugin Using `lectern` as a `beet` plugin makes it possible to combine your markdown files with arbitrary `beet` plugins for further processing. The plugin can load files using the plain text and markdown document formats and emit a snapshot of the `beet` context at the end of the build. diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 53ac790a4..8c59c70f7 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -5,13 +5,23 @@ from dataclasses import InitVar, dataclass, field from pathlib import Path -from typing import Any, Dict, Literal, MutableMapping, Optional, Tuple, Union, overload +from typing import ( + Any, + Dict, + List, + Literal, + MutableMapping, + Optional, + Tuple, + Union, + overload, +) from beet import Cache, Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field from .directive import AnyDirective, get_builtin_directives -from .extract import MarkdownExtractor, TextExtractor +from .extract import FragmentLoader, MarkdownExtractor, TextExtractor from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer @@ -29,6 +39,7 @@ class Document: assets: ResourcePack = field(default_factory=ResourcePack) data: DataPack = field(default_factory=DataPack) + loaders: List[FragmentLoader] = extra_field(default_factory=list) directives: MutableMapping[str, AnyDirective] = extra_field( default_factory=get_builtin_directives ) @@ -77,7 +88,11 @@ def load(self, path: FileSystemPath): def add_text(self, source: str): """Extract pack fragments from plain text.""" - assets, data = self.text_extractor.extract(source, self.directives) + assets, data = self.text_extractor.extract( + source=source, + directives=self.directives, + loaders=self.loaders, + ) self.assets.merge(assets) self.data.merge(data) @@ -90,6 +105,7 @@ def add_markdown( assets, data = self.markdown_extractor.extract( source=source, directives=self.directives, + loaders=self.loaders, external_files=external_files, ) self.assets.merge(assets) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index 41669f246..dd6063c38 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -4,6 +4,7 @@ "EmbeddedExtractor", "MarkdownExtractor", "MarkdownParserWithUncheckedLinks", + "FragmentLoader", ] @@ -11,7 +12,18 @@ from dataclasses import replace from itertools import islice from pathlib import Path -from typing import Any, Dict, Iterable, Iterator, List, Mapping, Optional, Tuple, Union +from typing import ( + Any, + Callable, + Dict, + Iterable, + Iterator, + List, + Mapping, + Optional, + Tuple, + Union, +) from urllib.parse import urlparse from beet import Cache, DataPack, ResourcePack @@ -22,6 +34,8 @@ from .directive import Directive from .fragment import Fragment +FragmentLoader = Callable[[Fragment, Mapping[str, Directive]], Optional[Fragment]] + class Extractor: """Base class for extractors.""" @@ -86,22 +100,29 @@ def extract( self, source: str, directives: Mapping[str, Directive], + loaders: Iterable[FragmentLoader] = (), ) -> Tuple[ResourcePack, DataPack]: """Extract a resource pack and a data pack.""" return self.apply_directives( - directives, self.parse_fragments(source, directives) + directives, self.parse_fragments(source, directives), loaders ) def apply_directives( self, directives: Mapping[str, Directive], fragments: Iterable[Fragment], + loaders: Iterable[FragmentLoader] = (), ) -> Tuple[ResourcePack, DataPack]: """Apply directives into a blank data pack and a blank resource pack.""" assets, data = ResourcePack(), DataPack() for fragment in fragments: - directives[fragment.directive](fragment, assets, data) + for loader in loaders: + fragment = loader(fragment, directives) + if not fragment: + break + if fragment: + directives[fragment.directive](fragment, assets, data) return assets, data @@ -215,10 +236,13 @@ def extract( self, source: str, directives: Mapping[str, Directive], + loaders: Iterable[FragmentLoader] = (), external_files: Optional[FileSystemPath] = None, ) -> Tuple[ResourcePack, DataPack]: return self.apply_directives( - directives, self.parse_fragments(source, directives, external_files) + directives, + self.parse_fragments(source, directives, external_files), + loaders, ) def parse_fragments( diff --git a/packages/lectern/tests/test_document.py b/packages/lectern/tests/test_document.py index b45f490e0..2174c304e 100644 --- a/packages/lectern/tests/test_document.py +++ b/packages/lectern/tests/test_document.py @@ -1,7 +1,9 @@ +from typing import Mapping, Optional + import pytest from beet import DataPack, Function, ResourcePack -from lectern import Document, InvalidFragment +from lectern import Directive, Document, Fragment, InvalidFragment def test_empty(): @@ -80,3 +82,17 @@ def test_no_content(): InvalidFragment, match="Expected content, path or url for directive @function." ): Document(markdown="`@function demo:foo`\n") + + +def test_loader(): + def handle_ignore_modifier( + fragment: Fragment, directives: Mapping[str, Directive] + ) -> Optional[Fragment]: + if fragment.modifier == "ignore": + return None + return fragment + + document = Document() + document.loaders.append(handle_ignore_modifier) + document.add_text("@function(ignore) demo:foo\nsay hello") + assert not document.data From f9b1c99e72ad0ace478b3ad7622adf7e1a4b5c2a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 26 Jun 2021 19:25:05 +0200 Subject: [PATCH 0239/1554] feat: rewrite lectern.contrib.relative_location with a fragment loader --- .../lectern/contrib/relative_location.py | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/lectern/lectern/contrib/relative_location.py b/packages/lectern/lectern/contrib/relative_location.py index a5a8eec3c..6deadc25e 100644 --- a/packages/lectern/lectern/contrib/relative_location.py +++ b/packages/lectern/lectern/contrib/relative_location.py @@ -2,36 +2,36 @@ __all__ = [ - "RelativeNamespacedResourceDirective", + "RelativeNamespacedResourceLoader", ] from dataclasses import dataclass, replace +from typing import Mapping -from beet import Context, DataPack, ResourcePack +from beet import Context -from lectern import Document, Fragment, NamespacedResourceDirective +from lectern import AnyDirective, Document, Fragment, NamespacedResourceDirective def beet_default(ctx: Context): document = ctx.inject(Document) - document.directives.update( - (name, RelativeNamespacedResourceDirective(directive.file_type, ctx)) - for name, directive in document.directives.items() - if isinstance(directive, NamespacedResourceDirective) - ) + document.loaders.append(RelativeNamespacedResourceLoader(ctx)) @dataclass -class RelativeNamespacedResourceDirective(NamespacedResourceDirective): - """Directive that handles relative resource locations.""" +class RelativeNamespacedResourceLoader: + """Loader that resolves relative resource locations.""" ctx: Context - def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): - name = fragment.expect("name") - - if ":" not in name: - fragment = replace(fragment, arguments=[self.ctx.generate.path(name)]) - - super().__call__(fragment, assets, data) + def __call__( + self, + fragment: Fragment, + directives: Mapping[str, AnyDirective], + ) -> Fragment: + if isinstance(directives[fragment.directive], NamespacedResourceDirective): + name = fragment.expect("name") + if ":" not in name: + fragment = replace(fragment, arguments=[self.ctx.generate.path(name)]) + return fragment From 73a90acd0ae698a78f40138c3541447828b6abda Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 27 Jun 2021 00:49:32 +0200 Subject: [PATCH 0240/1554] feat: baked files can now be stored back into fragments --- packages/lectern/lectern/fragment.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index 3aea3ba46..07c83bd4b 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -35,6 +35,7 @@ class Fragment: content: Optional[str] = None url: Optional[str] = None path: Optional[FileSystemPath] = None + file: Optional[File[Any, Any]] = None cache: Optional[Cache] = None @overload @@ -65,6 +66,9 @@ def expect(self, *names: str): def as_file(self, file_type: Type[FileType] = BinaryFile) -> FileType: """Retrieve the content of the fragment as a file.""" + if self.file: + return file_type(self.file.ensure_serialized()) + is_binary = issubclass(file_type, BinaryFileBase) content = self.content From d6bd2cfb556ac56fc7402681f22b304816a15fdd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 27 Jun 2021 01:23:27 +0200 Subject: [PATCH 0241/1554] feat: add lectern.contrib.yaml_to_json plugin --- packages/lectern/README.md | 20 +++ packages/lectern/examples/with_beet/beet.json | 14 +- .../examples/with_beet/isolated/yaml_test.md | 63 +++++++++ .../lectern/lectern/contrib/yaml_to_json.py | 53 ++++++++ .../examples__beet_project__0.pack.md | 126 ++++++++++++++++++ 5 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 packages/lectern/examples/with_beet/isolated/yaml_test.md create mode 100644 packages/lectern/lectern/contrib/yaml_to_json.py diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 7120ed7b9..c3c485ea2 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -726,6 +726,26 @@ function ./bar say hello ``` +## Using YAML + +You can use the `lectern.contrib.yaml_to_json` plugin to author JSON files with YAML. Since YAML is a superset of JSON, you don't have to do anything when you use the plugin. YAML fragments are transparently converted to JSON. + +``` +@function_tag minecraft:tick +values: + - demo:foo +``` + +The `@data_pack` and `@resource_pack` directives will also convert the fragment to JSON if the file extension matches `.yml` or `.yaml`. + +``` +@resource_pack assets/minecraft/sounds.yml +block.note_block.bit_1: + sounds: + - block/note_block/bit_1 + subtitle: subtitles.block.note_block.note +``` + ## Snapshot testing A lot of Minecraft tooling involves generating data packs and resource packs. Writing tests for this kind of tooling takes time because you need to painstakingly compare everything that you care about with a reference value. This makes it hard to get good coverage, and then even harder to keep making changes to the code being tested afterwards. You're trading robustness and stability for a shackle that massively slows down development. diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index b82e2437e..490d2201f 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -7,7 +7,19 @@ "custom_directive", "hello_directive" ], - "pipeline": ["lectern", "beet.contrib.relative_function_path"], + "pipeline": [ + "lectern", + "beet.contrib.relative_function_path", + { + "require": ["lectern.contrib.yaml_to_json"], + "pipeline": ["lectern"], + "meta": { + "lectern": { + "load": ["isolated/yaml_test.md"] + } + } + } + ], "meta": { "lectern": { "load": ["*.md"], diff --git a/packages/lectern/examples/with_beet/isolated/yaml_test.md b/packages/lectern/examples/with_beet/isolated/yaml_test.md new file mode 100644 index 000000000..f17fc4ee8 --- /dev/null +++ b/packages/lectern/examples/with_beet/isolated/yaml_test.md @@ -0,0 +1,63 @@ +# Loot table with yaml + +`@loot_table minecraft:blocks/yellow_shulker_box` + +```yaml +type: minecraft:block +pools: + - rolls: 1 + entries: + - type: minecraft:alternatives + children: + - type: minecraft:dynamic + name: minecraft:contents + conditions: + - condition: minecraft:match_tool + predicate: + items: [minecraft:air] + nbt: "{drop_contents:1b}" + - type: minecraft:item + name: minecraft:yellow_shulker_box + functions: + - function: minecraft:copy_name + source: block_entity + - function: minecraft:copy_nbt + source: block_entity + ops: + - source: Lock + target: BlockEntityTag.Lock + op: replace + - source: LootTable + target: BlockEntityTag.LootTable + op: replace + - source: LootTableSeed + target: BlockEntityTag.LootTableSeed + op: replace + - function: minecraft:set_contents + entries: + - type: minecraft:dynamic + name: minecraft:contents +``` + +`@function isolated:thing` + +```mcfunction +say this is not affected +``` + +`@function_tag minecraft:tick` + +```json +{ + "values": ["isolated:thing"] +} +``` + +`@resource_pack assets/minecraft/sounds.yml` + +```yaml +block.note_block.bit_1: + sounds: + - block/note_block/bit_1 + subtitle: subtitles.block.note_block.note +``` diff --git a/packages/lectern/lectern/contrib/yaml_to_json.py b/packages/lectern/lectern/contrib/yaml_to_json.py new file mode 100644 index 000000000..383373adb --- /dev/null +++ b/packages/lectern/lectern/contrib/yaml_to_json.py @@ -0,0 +1,53 @@ +"""Plugin that handles yaml fragments for json files.""" + + +__all__ = [ + "handle_yaml", +] + + +from dataclasses import replace +from typing import Mapping + +import yaml +from beet import Context, JsonFile + +from lectern import ( + AnyDirective, + DataPackDirective, + Document, + Fragment, + NamespacedResourceDirective, + ResourcePackDirective, +) + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.loaders.append(handle_yaml) + + +def handle_yaml(fragment: Fragment, directives: Mapping[str, AnyDirective]) -> Fragment: + """Loader that converts yaml to json.""" + directive = directives[fragment.directive] + is_yaml = False + + if isinstance(directive, NamespacedResourceDirective): + is_yaml = directive.file_type.extension == ".json" + + elif isinstance(directive, (DataPackDirective, ResourcePackDirective)): + relative_path = fragment.expect("relative_path") + if is_yaml := relative_path.endswith((".yml", ".yaml")): + fragment = replace( + fragment, + arguments=[ + relative_path.replace(".yml", ".json").replace(".yaml", ".json") + ], + ) + + if is_yaml: + yaml_file = fragment.as_file(JsonFile) + yaml_file.ensure_deserialized(yaml.safe_load) + fragment = replace(fragment, file=yaml_file) + + return fragment diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 6dc754980..ac5857470 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -348,6 +348,113 @@
+### minecraft + +- `@loot_table minecraft:blocks/yellow_shulker_box` + +
+ + ```json + { + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:air" + ], + "nbt": "{drop_contents:1b}" + } + } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ``` + +
+ +- `@function_tag minecraft:tick` + +
+ + ```json + { + "values": [ + "isolated:thing" + ] + } + ``` + +
+ +### isolated + +- `@function isolated:thing` + +
+ + ```mcfunction + say this is not affected + ``` + +
+ ## Resource pack - `@resource_pack pack.mcmeta` @@ -372,3 +479,22 @@ ![resource_pack.png](data:image/png;base64,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) + +### minecraft + +- `@resource_pack assets/minecraft/sounds.json` + +
+ + ```json + { + "block.note_block.bit_1": { + "sounds": [ + "block/note_block/bit_1" + ], + "subtitle": "subtitles.block.note_block.note" + } + } + ``` + +
From c1973e51b02ec184512c82e2355eb6e11e7383fa Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 26 Jun 2021 23:24:51 +0000 Subject: [PATCH 0242/1554] 0.15.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 7 +++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 433bd05e7..d21e898f2 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.15.0 (2021-06-26) +### Feature +* Add lectern.contrib.yaml_to_json plugin ([`9a3ab5e`](https://github.com/mcbeet/lectern/commit/9a3ab5eb30740b3946d765246f3ad40545768989)) +* Baked files can now be stored back into fragments ([`430e539`](https://github.com/mcbeet/lectern/commit/430e539e7fcb9496c8245c81159aed9a59f8ec40)) +* Rewrite lectern.contrib.relative_location with a fragment loader ([`f26e167`](https://github.com/mcbeet/lectern/commit/f26e1672f42208a257dfea68a081f13e6fd4c809)) +* Add fragment loaders ([`c46184a`](https://github.com/mcbeet/lectern/commit/c46184a557438024e604efe5accdb168c9402e05)) + ## v0.14.0 (2021-06-24) ### Feature * Add lectern.contrib.relative_location ([`9ce8cff`](https://github.com/mcbeet/lectern/commit/9ce8cff3681b0a54d15cf3db5a8e328d56e80784)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 0d2ac7382..0897a1a45 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.14.0" +__version__ = "0.15.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 42aef3532..4eea989b0 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.14.0" +version = "0.15.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 3c0b4fad613c4207bc979412e8eced617823998a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 27 Jun 2021 01:29:13 +0200 Subject: [PATCH 0243/1554] fix: forgot to document lectern.contrib.yaml_to_json usage in config file --- packages/lectern/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index c3c485ea2..b4b94412c 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -730,6 +730,18 @@ say hello You can use the `lectern.contrib.yaml_to_json` plugin to author JSON files with YAML. Since YAML is a superset of JSON, you don't have to do anything when you use the plugin. YAML fragments are transparently converted to JSON. +```json +{ + "require": ["lectern.contrib.yaml_to_json"], + "pipeline": ["lectern"], + "meta": { + "lectern": { + "load": ["*.md"] + } + } +} +``` + ``` @function_tag minecraft:tick values: From 0bd7e2463c3ee909e98a54a97de315e6400795c5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 26 Jun 2021 23:30:00 +0000 Subject: [PATCH 0244/1554] 0.15.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index d21e898f2..204551f22 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.15.1 (2021-06-26) +### Fix +* Forgot to document lectern.contrib.yaml_to_json usage in config file ([`97d5cab`](https://github.com/mcbeet/lectern/commit/97d5cabbc9376d141f05dc687647ce49524f01f5)) + ## v0.15.0 (2021-06-26) ### Feature * Add lectern.contrib.yaml_to_json plugin ([`9a3ab5e`](https://github.com/mcbeet/lectern/commit/9a3ab5eb30740b3946d765246f3ad40545768989)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 0897a1a45..fbd7a3bae 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.15.0" +__version__ = "0.15.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 4eea989b0..dd7322ef7 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.15.0" +version = "0.15.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From fe908702235a371ef38198300ed8e0500d875348 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 01:17:23 +0000 Subject: [PATCH 0245/1554] chore(deps-dev): bump pyright from 1.1.152 to 1.1.153 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.152 to 1.1.153. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.153/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 40df6cc1f..e01e84b67 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.152" + "pyright": "^1.1.153" } }, "node_modules/pyright": { - "version": "1.1.152", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", - "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", + "version": "1.1.153", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", + "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.152", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", - "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", + "version": "1.1.153", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", + "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 746ca26b9..e70f9a689 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.152" + "pyright": "^1.1.153" } } From 0551cbadfb4d5d503d0594b80837dd18ad23279b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 01:20:01 +0000 Subject: [PATCH 0246/1554] chore(deps-dev): bump python-semantic-release from 7.16.1 to 7.16.2 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.16.1 to 7.16.2. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.16.1...v7.16.2) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 25 +++++++++++++++++++------ packages/lectern/pyproject.toml | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 158f9aeaf..6af603c30 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -524,7 +524,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.16.1" +version = "7.16.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -543,9 +543,10 @@ tomlkit = "0.7.0" twine = ">=3,<4" [package.extras] -dev = ["mypy", "tox", "isort", "black"] +dev = ["tox", "isort", "black"] docs = ["Sphinx (==1.3.6)"] -test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.5.0)", "mock (==1.3.0)"] +mypy = ["mypy", "types-requests"] +test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] [[package]] name = "pywin32-ctypes" @@ -786,7 +787,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "908746bdbcba19a2108340dfdd0c908fe9f3cfaa65d2eccb84cea03fbe807a31" +content-hash = "162b1538b5e687271fd54b6014d164b132b8a55d1178a10c37cc1243971d725a" [metadata.files] appdirs = [ @@ -838,24 +839,36 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -1088,8 +1101,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.16.1.tar.gz", hash = "sha256:78875764c08bf6b8c76e2c4f1764c27c12f7a64f95515109d61dc56eed001876"}, - {file = "python_semantic_release-7.16.1-py3-none-any.whl", hash = "sha256:f981005f168b2a985ec726eae8fda2c5629f35a69f331e848a8b91316b51ee0e"}, + {file = "python-semantic-release-7.16.2.tar.gz", hash = "sha256:b0679f5ca5ef860bcf07836949e0956bffa965197315b01c6e089467c144c674"}, + {file = "python_semantic_release-7.16.2-py3-none-any.whl", hash = "sha256:c54aca1d2d5121608f5152975b6cbc4f3cfd1e5d9d64293ad44aa4b62acc670d"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index dd7322ef7..265f44923 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -34,7 +34,7 @@ black = {version = "^21.6b0", allow-prereleases = true} rope = "^0.19.0" pytest = "^6.2.4" isort = {version = "^5.9.1", allow-prereleases = true} -python-semantic-release = "^7.16.1" +python-semantic-release = "^7.16.2" pytest-insta = "^0.1.10" [tool.poetry.scripts] From 33909adb5b96ea78fb507775da0c059cf91cd1e9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 05:18:03 +0000 Subject: [PATCH 0247/1554] chore(deps): bump beet from 0.32.1 to 0.33.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.32.1 to 0.33.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.32.1...v0.33.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e547a2d0a..9928c2441 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.32.1" +version = "0.33.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -721,8 +721,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.32.1-py3-none-any.whl", hash = "sha256:a1999daaddaaa66db0819286472262570361ce203c39a89824ea20fa8e2d7e62"}, - {file = "beet-0.32.1.tar.gz", hash = "sha256:b67f1d36900f1c8c77bfbd467bb18ed80d74163892635e1ce0ffbabb7db2d3d3"}, + {file = "beet-0.33.0-py3-none-any.whl", hash = "sha256:4eb903003d3892b36572e0d5db6dcf4328c0f1e89c0ad5c7cf7e1d7b67b1e3fc"}, + {file = "beet-0.33.0.tar.gz", hash = "sha256:a7fdfb3cc3e1b4660fd7e6587a1c8139cc8eabed9b85ac55df3383adc80e3485"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, From 6d8f3be1d7d478690d468ff6496f154849e89473 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 05:18:32 +0000 Subject: [PATCH 0248/1554] chore(deps-dev): bump python-semantic-release from 7.16.1 to 7.16.2 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.16.1 to 7.16.2. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.16.1...v7.16.2) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 13 +++++++------ packages/mecha/pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e547a2d0a..49105f923 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -472,7 +472,7 @@ six = "*" [[package]] name = "python-semantic-release" -version = "7.16.1" +version = "7.16.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -491,9 +491,10 @@ tomlkit = "0.7.0" twine = ">=3,<4" [package.extras] -dev = ["mypy", "tox", "isort", "black"] +dev = ["tox", "isort", "black"] docs = ["Sphinx (==1.3.6)"] -test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.5.0)", "mock (==1.3.0)"] +mypy = ["mypy", "types-requests"] +test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] [[package]] name = "pywin32-ctypes" @@ -701,7 +702,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "1c3bfdfe8d9d5db506a692267e0083e3c96ce5afb8970b59ff138716435f7516" +content-hash = "00a257e2e83ff833bd010b5dc00fbded9dc9e66f072945db9195b4b66a511b75" [metadata.files] appdirs = [ @@ -1003,8 +1004,8 @@ python-gitlab = [ {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.16.1.tar.gz", hash = "sha256:78875764c08bf6b8c76e2c4f1764c27c12f7a64f95515109d61dc56eed001876"}, - {file = "python_semantic_release-7.16.1-py3-none-any.whl", hash = "sha256:f981005f168b2a985ec726eae8fda2c5629f35a69f331e848a8b91316b51ee0e"}, + {file = "python-semantic-release-7.16.2.tar.gz", hash = "sha256:b0679f5ca5ef860bcf07836949e0956bffa965197315b01c6e089467c144c674"}, + {file = "python_semantic_release-7.16.2-py3-none-any.whl", hash = "sha256:c54aca1d2d5121608f5152975b6cbc4f3cfd1e5d9d64293ad44aa4b62acc670d"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 02b3082ec..ed2c33cff 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -29,7 +29,7 @@ beet = ">=0.31.3" black = "^21.6b0" isort = "^5.9.1" pytest = "^6.2.4" -python-semantic-release = "^7.16.1" +python-semantic-release = "^7.16.2" [tool.black] target-version = ["py38"] From e8fc7ec18bd0c6c765bf6391056dd9b0c617c742 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 05:22:55 +0000 Subject: [PATCH 0249/1554] chore(deps-dev): bump pyright from 1.1.152 to 1.1.153 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.152 to 1.1.153. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.153/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index ca5c32a8a..48c432c8f 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.152" + "pyright": "^1.1.153" } }, "node_modules/pyright": { - "version": "1.1.152", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", - "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", + "version": "1.1.153", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", + "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.152", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.152.tgz", - "integrity": "sha512-mHSJ46fEm/9U42eU6ofUwm8mjkOrbHQazduZtrhj5dMgKEK0WU/azWrMU2Y9L6s0IY1yVH9JENh2o8QtDvvkHw==", + "version": "1.1.153", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", + "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 746ca26b9..e70f9a689 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.152" + "pyright": "^1.1.153" } } From f63b1daf5f73e1318e648c2e4afb89523ab4f373 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Jun 2021 05:20:06 +0000 Subject: [PATCH 0250/1554] chore(deps): bump beet from 0.33.0 to 0.34.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.33.0 to 0.34.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.33.0...v0.34.0) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 165aa0ad9..6b062d9e0 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.33.0" +version = "0.34.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -722,8 +722,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.33.0-py3-none-any.whl", hash = "sha256:4eb903003d3892b36572e0d5db6dcf4328c0f1e89c0ad5c7cf7e1d7b67b1e3fc"}, - {file = "beet-0.33.0.tar.gz", hash = "sha256:a7fdfb3cc3e1b4660fd7e6587a1c8139cc8eabed9b85ac55df3383adc80e3485"}, + {file = "beet-0.34.0-py3-none-any.whl", hash = "sha256:1b33609dfa6c19d629ae2522e95f51b161a36debdf04b39c1a4347a06fc1a45b"}, + {file = "beet-0.34.0.tar.gz", hash = "sha256:e694abf3e2ba05a5682bce3f4d0c96eb57af54b5019ef4972ab41def5256f307"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, From 62da0ef0f5a51ce31b1ea573d1695f6606864fb3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 1 Jul 2021 05:13:11 +0000 Subject: [PATCH 0251/1554] chore(deps-dev): bump pyright from 1.1.153 to 1.1.154 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.153 to 1.1.154. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.154/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 48c432c8f..9f4ac26b8 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.153" + "pyright": "^1.1.154" } }, "node_modules/pyright": { - "version": "1.1.153", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", - "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", + "version": "1.1.154", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.154.tgz", + "integrity": "sha512-J2P5Iurkl7smCyB8CH5fsm8GOGeKRk7d1HWcFiro94E0vJW/5sSKXrkfjPxo7XZ+e96UiW1qyiVTCC++db3Tfg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.153", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", - "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", + "version": "1.1.154", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.154.tgz", + "integrity": "sha512-J2P5Iurkl7smCyB8CH5fsm8GOGeKRk7d1HWcFiro94E0vJW/5sSKXrkfjPxo7XZ+e96UiW1qyiVTCC++db3Tfg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index e70f9a689..e889c20d8 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.153" + "pyright": "^1.1.154" } } From 0cc9fdb2d70ff7217988a08593ab2cd28357f24a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 1 Jul 2021 15:02:36 +0200 Subject: [PATCH 0252/1554] fix: declare lectern plugin with configurable decorator --- packages/lectern/lectern/plugin.py | 82 ++++++++++++++---------------- packages/lectern/poetry.lock | 20 ++------ packages/lectern/pyproject.toml | 2 +- 3 files changed, 42 insertions(+), 62 deletions(-) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index d7317d1c7..9a03c631e 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -5,55 +5,47 @@ import subprocess -from typing import Iterable, List, Optional, cast +from typing import List, Optional -from beet import Context, Plugin -from beet.core.utils import JsonDict +from beet import Context, configurable +from pydantic import BaseModel from .document import Document -def beet_default(ctx: Context): - config = ctx.meta.get("lectern", cast(JsonDict, {})) - - load = config.get("load", ()) - snapshot = config.get("snapshot") - external_files = config.get("external_files") - scripts = config.get("scripts", ()) - - ctx.require(lectern(load, snapshot, external_files, scripts)) - - -def lectern( - load: Iterable[str] = (), - snapshot: Optional[str] = None, - external_files: Optional[str] = None, - scripts: Iterable[List[str]] = (), -) -> Plugin: - """Return a plugin that handles markdown files with lectern.""" +class LecternOptions(BaseModel): + load: List[str] = [] + snapshot: Optional[str] = None + external_files: Optional[str] = None + scripts: List[List[str]] = [] - def plugin(ctx: Context): - document = ctx.inject(Document) - for pattern in load: - for path in ctx.directory.glob(pattern): - document.load(path) - - for arguments in scripts: - result = subprocess.run( - arguments, - cwd=ctx.directory, - check=True, - stdout=subprocess.PIPE, - ) - document.add_text(result.stdout.decode()) - - yield - - if snapshot: - document.save( - ctx.directory / snapshot, - ctx.directory / external_files if external_files else None, - ) - - return plugin +def beet_default(ctx: Context): + ctx.require(lectern) + + +@configurable(validator=LecternOptions) +def lectern(ctx: Context, opts: LecternOptions): + """Plugin that handles markdown files with lectern.""" + document = ctx.inject(Document) + + for pattern in opts.load: + for path in ctx.directory.glob(pattern): + document.load(path) + + for arguments in opts.scripts: + result = subprocess.run( + arguments, + cwd=ctx.directory, + check=True, + stdout=subprocess.PIPE, + ) + document.add_text(result.stdout.decode()) + + yield + + if opts.snapshot: + document.save( + ctx.directory / opts.snapshot, + ctx.directory / opts.external_files if opts.external_files else None, + ) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 6af603c30..56c466396 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.33.0" +version = "0.34.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -787,7 +787,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "162b1538b5e687271fd54b6014d164b132b8a55d1178a10c37cc1243971d725a" +content-hash = "4ef8882051f01e32b13b1183b6ff0ce52d3122e593482d50949d5d225828dae9" [metadata.files] appdirs = [ @@ -807,8 +807,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.33.0-py3-none-any.whl", hash = "sha256:4eb903003d3892b36572e0d5db6dcf4328c0f1e89c0ad5c7cf7e1d7b67b1e3fc"}, - {file = "beet-0.33.0.tar.gz", hash = "sha256:a7fdfb3cc3e1b4660fd7e6587a1c8139cc8eabed9b85ac55df3383adc80e3485"}, + {file = "beet-0.34.1-py3-none-any.whl", hash = "sha256:512018454490d6ed2495d63f6f26a205c05e0d404eaea2438f407194311a5c48"}, + {file = "beet-0.34.1.tar.gz", hash = "sha256:a4bc78ee5c9f154a0233f80147d420cf6921517f2b9ddb3d3a273b1c21ff3cf4"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, @@ -839,36 +839,24 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 265f44923..cb5ebc046 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.33.0" +beet = ">=0.34.1" markdown-it-py = "^1.1.0" click = "^7.1.2" From 0f4c8b4b8a4fd326af5cc29dd8f47b0eb2fb80ca Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 Jul 2021 13:03:47 +0000 Subject: [PATCH 0253/1554] 0.15.2 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 204551f22..28d1dc76e 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.15.2 (2021-07-01) +### Fix +* Declare lectern plugin with configurable decorator ([`dbcd46c`](https://github.com/mcbeet/lectern/commit/dbcd46c6c7fd3acc476268576344a60e6095b652)) + ## v0.15.1 (2021-06-26) ### Fix * Forgot to document lectern.contrib.yaml_to_json usage in config file ([`97d5cab`](https://github.com/mcbeet/lectern/commit/97d5cabbc9376d141f05dc687647ce49524f01f5)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index fbd7a3bae..6c62f62ad 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.15.1" +__version__ = "0.15.2" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index cb5ebc046..f4ffb89a7 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.15.1" +version = "0.15.2" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 71a3c1203bf6d999526704a7cd9bc4b70cfff6aa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 2 Jul 2021 05:11:55 +0000 Subject: [PATCH 0254/1554] chore(deps): bump beet from 0.34.0 to 0.34.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.34.0 to 0.34.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.34.0...v0.34.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6b062d9e0..6817fc246 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.34.0" +version = "0.34.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -722,8 +722,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.34.0-py3-none-any.whl", hash = "sha256:1b33609dfa6c19d629ae2522e95f51b161a36debdf04b39c1a4347a06fc1a45b"}, - {file = "beet-0.34.0.tar.gz", hash = "sha256:e694abf3e2ba05a5682bce3f4d0c96eb57af54b5019ef4972ab41def5256f307"}, + {file = "beet-0.34.1-py3-none-any.whl", hash = "sha256:512018454490d6ed2495d63f6f26a205c05e0d404eaea2438f407194311a5c48"}, + {file = "beet-0.34.1.tar.gz", hash = "sha256:a4bc78ee5c9f154a0233f80147d420cf6921517f2b9ddb3d3a273b1c21ff3cf4"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, From e460df32285a9cd2872e078d31e8e13641467403 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 05:21:03 +0000 Subject: [PATCH 0255/1554] chore(deps-dev): bump pyright from 1.1.154 to 1.1.155 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.154 to 1.1.155. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.155/packages/pyright) Signed-off-by: dependabot-preview[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 9f4ac26b8..49d8df1f2 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.154" + "pyright": "^1.1.155" } }, "node_modules/pyright": { - "version": "1.1.154", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.154.tgz", - "integrity": "sha512-J2P5Iurkl7smCyB8CH5fsm8GOGeKRk7d1HWcFiro94E0vJW/5sSKXrkfjPxo7XZ+e96UiW1qyiVTCC++db3Tfg==", + "version": "1.1.155", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.155.tgz", + "integrity": "sha512-y7VqgiOMiLqzFzQ6LCVUtyb8VCsVbwzOHw16A5YxidGmARRYvFn1kIf1uCDqj3ytxrOcVHyptq90/TSffU0hZg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.154", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.154.tgz", - "integrity": "sha512-J2P5Iurkl7smCyB8CH5fsm8GOGeKRk7d1HWcFiro94E0vJW/5sSKXrkfjPxo7XZ+e96UiW1qyiVTCC++db3Tfg==", + "version": "1.1.155", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.155.tgz", + "integrity": "sha512-y7VqgiOMiLqzFzQ6LCVUtyb8VCsVbwzOHw16A5YxidGmARRYvFn1kIf1uCDqj3ytxrOcVHyptq90/TSffU0hZg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index e889c20d8..097a6f717 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.154" + "pyright": "^1.1.155" } } From f8e087641fa1e8dda4d6fe2cdcac5d91662cdafd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 6 Jul 2021 05:15:11 +0000 Subject: [PATCH 0256/1554] chore(deps): bump beet from 0.34.1 to 0.35.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.34.1 to 0.35.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.34.1...v0.35.1) Signed-off-by: dependabot-preview[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6817fc246..f41c85fa5 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -41,7 +41,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.34.1" +version = "0.35.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -722,8 +722,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.34.1-py3-none-any.whl", hash = "sha256:512018454490d6ed2495d63f6f26a205c05e0d404eaea2438f407194311a5c48"}, - {file = "beet-0.34.1.tar.gz", hash = "sha256:a4bc78ee5c9f154a0233f80147d420cf6921517f2b9ddb3d3a273b1c21ff3cf4"}, + {file = "beet-0.35.1-py3-none-any.whl", hash = "sha256:8f67c44078d6c19406c818bbf33d55b1c7c5ae8965cfd5f06c35aa38cef0cf19"}, + {file = "beet-0.35.1.tar.gz", hash = "sha256:b9c300ecfa538a85295c1540c6bac6207119b47f5b04bbbf84a5e934a62d6054"}, ] black = [ {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, From 53e5f041e7c0492518bee3776492fdf6975da531 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 24 Jul 2021 08:46:56 +0200 Subject: [PATCH 0257/1554] feat: add initial parser implementation --- packages/mecha/.github/dependabot.yml | 12 + packages/mecha/README.md | 33 +- packages/mecha/logo.png | Bin 131615 -> 128525 bytes packages/mecha/mecha/__init__.py | 7 +- packages/mecha/mecha/api.py | 65 +- packages/mecha/mecha/ast.py | 78 + packages/mecha/mecha/parse.py | 390 +- packages/mecha/mecha/py.typed | 1 - packages/mecha/mecha/resources/1_16.json | 7377 ++++++++++++++++ packages/mecha/mecha/resources/1_17.json | 7596 +++++++++++++++++ packages/mecha/mecha/resources/__init__.py | 0 packages/mecha/mecha/resources/patch.json | 14 + .../mecha/resources/wiki_examples.mcfunction | 7 + packages/mecha/mecha/spec.py | 278 + packages/mecha/package-lock.json | 14 +- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 698 +- packages/mecha/pyproject.toml | 12 +- packages/mecha/pytest.ini | 3 +- packages/mecha/scripts.py | 46 + packages/mecha/tests/conftest.py | 8 + .../tests/snapshots/parse__basic1__0.txt | 9 + .../tests/snapshots/parse__basic2__0.txt | 23 + .../snapshots/parse__wiki_examples__0.txt | 68 + .../tests/snapshots/spec__prototypes__0.json | 792 ++ packages/mecha/tests/test_api.py | 43 - packages/mecha/tests/test_parse.py | 25 + packages/mecha/tests/test_spec.py | 7 + 28 files changed, 16962 insertions(+), 646 deletions(-) create mode 100644 packages/mecha/.github/dependabot.yml create mode 100644 packages/mecha/mecha/ast.py create mode 100644 packages/mecha/mecha/resources/1_16.json create mode 100644 packages/mecha/mecha/resources/1_17.json create mode 100644 packages/mecha/mecha/resources/__init__.py create mode 100644 packages/mecha/mecha/resources/patch.json create mode 100644 packages/mecha/mecha/resources/wiki_examples.mcfunction create mode 100644 packages/mecha/mecha/spec.py create mode 100644 packages/mecha/scripts.py create mode 100644 packages/mecha/tests/conftest.py create mode 100644 packages/mecha/tests/snapshots/parse__basic1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__basic2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__wiki_examples__0.txt create mode 100644 packages/mecha/tests/snapshots/spec__prototypes__0.json delete mode 100644 packages/mecha/tests/test_api.py create mode 100644 packages/mecha/tests/test_parse.py create mode 100644 packages/mecha/tests/test_spec.py diff --git a/packages/mecha/.github/dependabot.yml b/packages/mecha/.github/dependabot.yml new file mode 100644 index 000000000..41a3fe387 --- /dev/null +++ b/packages/mecha/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 + +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" diff --git a/packages/mecha/README.md b/packages/mecha/README.md index 79c3d1c99..36af07508 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -1,4 +1,4 @@ -logo +logo # Mecha @@ -7,7 +7,7 @@ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mecha.svg)](https://pypi.org/project/mecha/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) -> A flexible Minecraft command library. +> A powerful Minecraft command library. ## Introduction @@ -45,6 +45,35 @@ The package can be installed with `pip`. $ pip install mecha ``` +## Contributing + +Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses [`poetry`](https://python-poetry.org/). + +```bash +$ poetry install +``` + +You can run the tests with `poetry run pytest`. + +```bash +$ poetry run pytest +``` + +The project must type-check with [`pyright`](https://github.com/microsoft/pyright). If you're using VSCode the [`pylance`](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) extension should report diagnostics automatically. You can also install the type-checker locally with `npm install` and run it from the command-line. + +```bash +$ npm run watch +$ npm run check +``` + +The code follows the [`black`](https://github.com/psf/black) code style. Import statements are sorted with [`isort`](https://pycqa.github.io/isort/). + +```bash +$ poetry run isort mecha tests +$ poetry run black mecha tests +$ poetry run black --check mecha tests +``` + --- License - [MIT](https://github.com/vberlier/mecha/blob/main/LICENSE) diff --git a/packages/mecha/logo.png b/packages/mecha/logo.png index e5f84d6b4d43325921b8846e808a6915390f2627..104f5e3ad3649a0fbde7a3e4b42a28a7c184f1ec 100644 GIT binary patch literal 128525 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 diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index ae2d9e371..b62e0d1e4 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,3 +1,6 @@ -from .api import * - __version__ = "0.1.0" + + +from .api import * +from .parse import * +from .spec import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 63708cc6e..fdd0485fc 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -3,47 +3,54 @@ ] -from dataclasses import InitVar, dataclass, field -from typing import Optional, Union +from dataclasses import InitVar, dataclass, replace +from typing import Any, List, Optional, Union -from beet import Context, DataPack +from beet import Context, Function, TextFileBase +from beet.core.utils import extra_field +from tokenstream import TokenStream + +from .ast import AstCommand, AstRoot +from .parse import delegate, get_default_parsers +from .spec import CommandSpecification @dataclass class Mecha: """Class exposing the command api.""" - target: InitVar[Union[Context, DataPack]] + ctx: InitVar[Optional[Context]] = None - default_namespace: Optional[str] = None - default_path: Optional[str] = None + spec: CommandSpecification = extra_field( + default_factory=lambda: CommandSpecification(parsers=get_default_parsers()) + ) - data_pack: DataPack = field(init=False) + def parse_function( + self, + function: Union[TextFileBase[Any], str, List[str]], + filename: Optional[str] = None, + ) -> AstRoot: + """Parse a function and return the ast.""" + if isinstance(function, (str, list)): + function = Function(function) - def __post_init__(self, target: Union[Context, DataPack]): - if isinstance(target, Context): - self.data_pack = target.data - config = target.meta.get("mecha", {}) - default_namespace = config.get("default_namespace", target.project_name) - default_path = config.get("default_path", "") - else: - self.data_pack = target - default_namespace = self.data_pack.name or "" - default_path = "" + if not filename and function.source_path: + filename = str(function.source_path) - if self.default_namespace is None: - self.default_namespace = default_namespace + stream = TokenStream(function.text + "\n") - if self.default_path is None: - self.default_path = default_path + with stream.provide(spec=self.spec): + return replace(delegate(stream, "root"), filename=filename) - def resolve_path(self, path: str) -> str: - """Resolve partial path.""" - namespace, sep, path = path.rpartition(":") + def parse_command(self, command: str) -> AstCommand: + """Parse a single command from a string and return the ast.""" + ast = self.parse_function(command) - if not namespace: - namespace = self.default_namespace - if not sep: - path = f"{self.default_path}/{path}" + if len(ast.commands) != 1: + raise ValueError( + "Expected a single command but more than one command were provided." + if ast.commands + else "Expected a single command but no command were provided.", + ) - return f"{namespace}:{path.strip('/')}".replace("//", "/").lower() + return ast.commands[0] diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py new file mode 100644 index 000000000..fafb5428f --- /dev/null +++ b/packages/mecha/mecha/ast.py @@ -0,0 +1,78 @@ +__all__ = [ + "AstNode", + "AstChildren", + "AstRoot", + "AstCommand", + "AstValue", +] + + +from dataclasses import dataclass, field, fields +from typing import Generic, Iterator, Optional, Tuple, TypeVar + +from tokenstream import SourceLocation + +T = TypeVar("T") +AstNodeType = TypeVar("AstNodeType", bound="AstNode") + + +@dataclass(frozen=True) +class AstNode: + """Base class for all ast nodes.""" + + location: SourceLocation = field(repr=False, hash=False, compare=False) + end_location: SourceLocation = field(repr=False, hash=False, compare=False) + + def __iter__(self) -> Iterator["AstNode"]: + yield self + + for f in fields(self): + attribute = getattr(self, f.name) + + if isinstance(attribute, AstChildren): + for child in attribute: # type: ignore + yield from child + + elif isinstance(attribute, AstNode): + yield from attribute + + def dump(self, prefix: str = "") -> str: + """Return a pretty-printed representation of the ast.""" + return f"{prefix}{self.__class__}\n" + "\n".join( + f"{prefix} {f.name}:" + + ( + "\n" + "\n".join(child.dump(prefix + " ") for child in attribute) # type: ignore + if isinstance(attribute := getattr(self, f.name), AstChildren) + else "\n" + attribute.dump(prefix + " ") + if isinstance(attribute, AstNode) + else f" {attribute!r}" + ) + for f in fields(self) + ) + + +class AstChildren(Tuple[AstNodeType, ...]): + """Specialized tuple subclass for holding multiple child ast nodes.""" + + +@dataclass(frozen=True) +class AstRoot(AstNode): + """Root ast node""" + + filename: Optional[str] + commands: AstChildren["AstCommand"] + + +@dataclass(frozen=True) +class AstCommand(AstNode): + """Command ast node""" + + identifier: str + arguments: AstChildren["AstNode"] + + +@dataclass(frozen=True) +class AstValue(AstNode, Generic[T]): + """Value ast node""" + + value: T diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 67ed36193..520fd63ca 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1,331 +1,127 @@ __all__ = [ - "Token", - "TokenSpec", - "TokenStream", - "InvalidSyntax", - "UnexpectedEOF", - "UnexpectedToken", + "get_default_parsers", + "delegate", + "parse_root", + "parse_command", + "parse_argument", + "parse_brigadier_bool", ] -import re -from contextlib import contextmanager -from dataclasses import dataclass -from typing import Dict, Iterable, Iterator, List, NamedTuple, Optional, Tuple +from contextlib import nullcontext +from typing import TYPE_CHECKING, Any, Dict, List, Tuple -from beet.core.utils import extra_field +from tokenstream import SourceLocation, TokenStream +from .ast import AstChildren, AstCommand, AstNode, AstRoot, AstValue +from .spec import CommandSpecification, Parser -class Token(NamedTuple): - """Class representing a token.""" - type: str - value: str - pos: int - lineno: int - col_start: int - col_end: int +def get_default_parsers() -> Dict[str, Parser]: + """Return the default parsers.""" + return { + "root": parse_root, + "command": parse_command, + "argument": parse_argument, + "brigadier:bool": parse_brigadier_bool, + } -class InvalidSyntax(Exception): - """Raised when the parser encounters invalid syntax.""" +def delegate(stream: TokenStream, parser: str) -> Any: + """Delegate parsing to a registered subparser.""" + spec: CommandSpecification = stream.data["spec"] + if parser not in spec.parsers: + raise ValueError(f"Unrecognized parser {parser!r}.") -class UnexpectedEOF(InvalidSyntax): - """Raised when the parser reaches the end of the file unexpectedly.""" + return spec.parsers[parser](stream) - expected_type: str - expected_value: Optional[str] - def __init__( - self, - expected_type: str, - expected_value: Optional[str] = None, - ) -> None: - super().__init__(expected_type, expected_value) - self.expected_type = expected_type - self.expected_value = expected_value +def parse_root(stream: TokenStream) -> AstRoot: + """Parse root.""" + with stream.syntax(comment=r"#.+$", literal=r"\S+"), stream.intercept("newline"): + start = stream.peek() - def __str__(self) -> str: - value = "" if self.expected_value is None else " " + repr(self.expected_value) - return f"Reached end of file instead of expected {self.expected_type}{value}" + if not start: + return AstRoot( + filename=None, + commands=AstChildren(), + location=SourceLocation(0, 1, 1), + end_location=SourceLocation(0, 1, 1), + ) + commands: List[AstCommand] = [] -class UnexpectedToken(InvalidSyntax): - """Raised when the parser encounters an unexpected token.""" + for _ in stream.peek_until(): + while stream.get("newline", "comment"): + continue + if stream.peek(): + commands.append(delegate(stream, "command")) - token: Token - expected_type: str - expected_value: Optional[str] - - def __init__( - self, - token: Token, - expected_type: str, - expected_value: Optional[str] = None, - ) -> None: - super().__init__(token) - self.token = token - self.expected_type = expected_type - self.expected_value = expected_value - - def __str__(self) -> str: - value = "" if self.expected_value is None else " " + repr(self.expected_value) - return f"Expected {self.expected_type}{value} but got {self.token.type} {self.token.value!r}" + return AstRoot( + filename=None, + commands=AstChildren(commands), + location=start.location, + end_location=stream.current.end_location, + ) -@dataclass -class Checkpoint: - """Allows committing the modifications.""" +def parse_command(stream: TokenStream) -> AstCommand: + """Parse command.""" + spec: CommandSpecification = stream.data["spec"] - committed: bool = False + arguments: List[AstNode] = [] + scope: Tuple[str, ...] = () - def commit(self): - """Commit the checkpoint.""" - self.committed = True + with stream.checkpoint(): + location = stream.expect().location + end_location = location + while (tree := spec.flattened_tree[scope]) and not ( + tree.executable and stream.get("newline") + ): + literal_names = list(tree.get_literal_children()) + argument_names = list(tree.get_argument_children()) -TokenSpec = Tuple[Tuple[str, str], ...] + with stream.alternative() if argument_names else nullcontext(): + patterns = [("literal", name) for name in literal_names] + token = stream.expect_any(*patterns) + scope += (token.value,) + if not TYPE_CHECKING: + continue + for name, alternative in stream.choose(*argument_names): + with alternative, stream.provide(scope=scope + (name,)): + arguments.append(delegate(stream, "argument")) + scope += (name,) -@dataclass -class TokenStream: - """Stream for processing tokens extracted from an input string.""" + end_location = stream.current.end_location - source: str - token_spec: TokenSpec = () + return AstCommand( + identifier=":".join(scope), + arguments=AstChildren(arguments), + location=location, + end_location=end_location, + ) - pos: int = 0 - lineno: int = 1 - colno: int = 1 - index: int = -1 - tokens: List[Token] = extra_field(default_factory=list) - indentation: List[int] = extra_field(default_factory=lambda: [0]) +def parse_argument(stream: TokenStream) -> AstNode: + """Parse argument.""" + spec: CommandSpecification = stream.data["spec"] + tree = spec.flattened_tree[stream.data["scope"]] - regex: "re.Pattern[str]" = extra_field(init=False) - regex_cache: Dict[TokenSpec, "re.Pattern[str]"] = extra_field(default_factory=dict) + if tree.parser: + return delegate(stream, tree.parser) - generator: Iterator[Token] = extra_field(init=False) + raise ValueError(f"Missing argument parser in command tree {stream.data['scope']}.") - def __post_init__(self): - self.bake_regex() - self.generator = self.tokenize() - def bake_regex(self): - """Turn the syntax in the `token_spec` attribute into a regex.""" - spec = self.token_spec + ( - ("comment", r"#.+$"), - ("whitespace", r"\s+"), - ) - self.regex = re.compile( - "|".join(f"(?P<{name}>{regex})" for name, regex in spec), re.MULTILINE - ) - - @contextmanager - def syntax(self, **kwargs: str) -> Iterator[None]: - """Define token rules using regular expressions.""" - previous_spec = self.token_spec - previous_tokens = self.tokens - self.token_spec = tuple(kwargs.items()) - - if self.index + 1 < len(previous_tokens): - self.tokens = previous_tokens[: self.index + 1] - - if regex := self.regex_cache.get(self.token_spec): - self.regex = regex - else: - self.bake_regex() - self.regex_cache[self.token_spec] = self.regex - - try: - yield - finally: - self.token_spec = previous_spec - self.tokens = previous_tokens - - def filter(self, *token_types: str) -> Iterator[Token]: - """Yield tokens matching the given types.""" - types = set(token_types) - - for token in self: - if token.type in types: - yield token - - def reject(self, *token_types: str, blanks: bool = False) -> Iterator[Token]: - """Yield tokens expect those matching the given types.""" - types = set(token_types) - - if blanks: - types |= {"whitespace", "newline", "indent", "dedent", "comment"} - - for token in self: - if token.type not in types: - yield token - - def skip(self, *token_types: str, blanks: bool = False) -> Optional[Token]: - """Return the first token that doesn't match the given types.""" - types = set(token_types) - - if blanks: - types |= {"whitespace", "newline", "indent", "dedent", "comment"} - - for token in self: - if token.type not in types: - return token - - return None - - @property - def current(self) -> Token: - """The current token.""" - return self.tokens[self.index] - - @property - def previous(self) -> Token: - """The previous token.""" - return self.tokens[self.index - 1] - - @property - def rest(self) -> str: - """The remaining input to parse.""" - return self.source[self.pos :] - - def head(self, characters: int = 50) -> str: - """Return the next characters to parse.""" - return self.source[self.pos : self.pos + characters].partition("\n")[0] - - def emit(self, token_type: str, value: str = "") -> int: - """Generate a token and return its index in the `tokens` list.""" - token = Token( - token_type, - value, - self.pos, - self.lineno, - self.colno, - self.colno + len(value), - ) +def parse_brigadier_bool(stream: TokenStream) -> AstValue[bool]: + """Parse brigadier bool.""" + token = stream.expect_any(("literal", "true"), ("literal", "false")) - self.pos += len(value) - self.colno += len(value) - self.tokens.append(token) - - return len(self.tokens) - 1 - - def tokenize(self) -> Iterator[Token]: - """Extract tokens from the input string.""" - while self.pos < len(self.source): - if self.source[self.pos] == "\n": - self.index = self.emit("newline", "\n") - self.lineno += 1 - self.colno = 1 - yield self.current - - elif match := self.regex.match(self.source, self.pos): - assert match.lastgroup - - if ( - match.lastgroup != "comment" - and ( - len(self.tokens) == 1 - or len(self.tokens) > 1 - and self.previous.type == "newline" - ) - and self.current.type == "whitespace" - ): - indent = len(self.current.value.expandtabs()) - - while indent < self.indentation[-1]: - self.index = self.emit("dedent") - self.indentation.pop() - yield self.current - - if indent > self.indentation[-1]: - self.index = self.emit("indent") - self.indentation.append(indent) - yield self.current - - self.index = self.emit(match.lastgroup, match.group()) - yield self.current - - else: - raise InvalidSyntax(self.head()) - - while len(self.indentation) > 1: - self.index = self.emit("dedent") - self.indentation.pop() - yield self.current - - def __iter__(self) -> "TokenStream": - return self - - def __next__(self) -> Token: - if self.index + 1 < len(self.tokens): - self.index += 1 - return self.current - return next(self.generator) - - @contextmanager - def checkpoint(self) -> Iterator[Checkpoint]: - """Reset the stream to the current token at the end of the with statement.""" - checkpoint = Checkpoint() - previous_index = self.index - - try: - yield checkpoint - finally: - if not checkpoint.committed: - self.index = previous_index - - def peek(self, n: int = 1) -> Optional[Token]: - """Return a token relative to the current index.""" - index = self.index + n - - if index < 0: - return None - if index < len(self.tokens): - return self.tokens[index] - - with self.checkpoint(): - self.index = len(self.tokens) - 1 - - for token in self: - if self.index == index: - return token - - def expect( - self, - token_type: str, - value: Optional[str] = None, - skip: Iterable[str] = (), - skip_blanks: bool = False, - ) -> Token: - """Check that the next token has a given type and value.""" - token = self.skip(*skip, blanks=skip_blanks) - - if not token: - raise UnexpectedEOF(token_type, value) - if token.type != token_type or value is not None and token.value != value: - raise UnexpectedToken(token, token_type, value) - - return token - - def get( - self, - token_type: str, - value: Optional[str] = None, - skip: Iterable[str] = (), - skip_blanks: bool = False, - ) -> Optional[Token]: - """Return the next token with the given type and value.""" - token = self.skip(*skip, blanks=skip_blanks) - - if ( - not token - or token.type != token_type - or value is not None - and token.value != value - ): - return None - - return token + return AstValue[bool]( + value=token.value == "true", + location=token.location, + end_location=token.end_location, + ) diff --git a/packages/mecha/mecha/py.typed b/packages/mecha/mecha/py.typed index 6c8e6b979..e69de29bb 100644 --- a/packages/mecha/mecha/py.typed +++ b/packages/mecha/mecha/py.typed @@ -1 +0,0 @@ -__version__ = "0.0.0" diff --git a/packages/mecha/mecha/resources/1_16.json b/packages/mecha/mecha/resources/1_16.json new file mode 100644 index 000000000..b44571f04 --- /dev/null +++ b/packages/mecha/mecha/resources/1_16.json @@ -0,0 +1,7377 @@ +{ + "type": "root", + "children": { + "advancement": { + "type": "literal", + "children": { + "grant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "everything": { + "type": "literal", + "executable": true + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "criterion": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + }, + "revoke": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "everything": { + "type": "literal", + "executable": true + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "criterion": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + } + } + }, + "attribute": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "attribute": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "base": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + }, + "modifier": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "children": { + "value": { + "type": "argument", + "parser": "brigadier:double", + "children": { + "add": { + "type": "literal", + "executable": true + }, + "multiply": { + "type": "literal", + "executable": true + }, + "multiply_base": { + "type": "literal", + "executable": true + } + } + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "ban": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "ban-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "banlist": { + "type": "literal", + "children": { + "ips": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "bossbar": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "max": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + }, + "value": { + "type": "literal", + "executable": true + }, + "visible": { + "type": "literal", + "executable": true + } + } + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "color": { + "type": "literal", + "children": { + "blue": { + "type": "literal", + "executable": true + }, + "green": { + "type": "literal", + "executable": true + }, + "pink": { + "type": "literal", + "executable": true + }, + "purple": { + "type": "literal", + "executable": true + }, + "red": { + "type": "literal", + "executable": true + }, + "white": { + "type": "literal", + "executable": true + }, + "yellow": { + "type": "literal", + "executable": true + } + } + }, + "max": { + "type": "literal", + "children": { + "max": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1 + }, + "executable": true + } + } + }, + "name": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "players": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "style": { + "type": "literal", + "children": { + "notched_10": { + "type": "literal", + "executable": true + }, + "notched_12": { + "type": "literal", + "executable": true + }, + "notched_20": { + "type": "literal", + "executable": true + }, + "notched_6": { + "type": "literal", + "executable": true + }, + "progress": { + "type": "literal", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "visible": { + "type": "literal", + "children": { + "visible": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + } + } + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_predicate", + "children": { + "maxCount": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "clone": { + "type": "literal", + "children": { + "begin": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "parser": "minecraft:block_predicate", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "data": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + } + } + } + } + }, + "datapack": { + "type": "literal", + "children": { + "disable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "enable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "children": { + "after": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "before": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "first": { + "type": "literal", + "executable": true + }, + "last": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "children": { + "available": { + "type": "literal", + "executable": true + }, + "enabled": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "debug": { + "type": "literal", + "children": { + "report": { + "type": "literal", + "executable": true + }, + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "defaultgamemode": { + "type": "literal", + "children": { + "adventure": { + "type": "literal", + "executable": true + }, + "creative": { + "type": "literal", + "executable": true + }, + "spectator": { + "type": "literal", + "executable": true + }, + "survival": { + "type": "literal", + "executable": true + } + } + }, + "deop": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "difficulty": { + "type": "literal", + "children": { + "easy": { + "type": "literal", + "executable": true + }, + "hard": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + }, + "peaceful": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "effect": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "effect": { + "type": "argument", + "parser": "minecraft:mob_effect", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "effect": { + "type": "argument", + "parser": "minecraft:mob_effect", + "children": { + "seconds": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 1000000 + }, + "children": { + "amplifier": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 255 + }, + "children": { + "hideParticles": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "enchant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "enchantment": { + "type": "argument", + "parser": "minecraft:item_enchantment", + "children": { + "level": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "execute": { + "type": "literal", + "children": { + "align": { + "type": "literal", + "children": { + "axes": { + "type": "argument", + "parser": "minecraft:swizzle", + "redirect": ["execute"] + } + } + }, + "anchored": { + "type": "literal", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "at": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "if": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "data": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true, + "redirect": ["execute"] + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "parser": "minecraft:int_range", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + }, + "in": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, + "positioned": { + "type": "literal", + "children": { + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "rotated": { + "type": "literal", + "children": { + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "rot": { + "type": "argument", + "parser": "minecraft:rotation", + "redirect": ["execute"] + } + } + }, + "run": { + "type": "literal" + }, + "store": { + "type": "literal", + "children": { + "result": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "max": { + "type": "literal", + "redirect": ["execute"] + }, + "value": { + "type": "literal", + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + }, + "success": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "max": { + "type": "literal", + "redirect": ["execute"] + }, + "value": { + "type": "literal", + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + } + } + }, + "unless": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "data": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true, + "redirect": ["execute"] + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "parser": "minecraft:int_range", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + } + } + }, + "experience": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "amount": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "query": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "players" + }, + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "amount": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "fill": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_state", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "hollow": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "outline": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "forceload": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:column_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + } + } + }, + "query": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "all": { + "type": "literal", + "executable": true + }, + "from": { + "type": "argument", + "parser": "minecraft:column_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:function", + "executable": true + } + } + }, + "gamemode": { + "type": "literal", + "children": { + "adventure": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "creative": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "spectator": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "survival": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "gamerule": { + "type": "literal", + "children": { + "announceAdvancements": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "commandBlockOutput": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "disableElytraMovementCheck": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "disableRaids": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doDaylightCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doEntityDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doFireTick": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doImmediateRespawn": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doInsomnia": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doLimitedCrafting": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doMobLoot": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doMobSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doPatrolSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doTileDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doTraderSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doWeatherCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "drowningDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "fallDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "fireDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "forgiveDeadPlayers": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "keepInventory": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "logAdminCommands": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "maxCommandChainLength": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "maxEntityCramming": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "mobGriefing": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "naturalRegeneration": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "randomTickSpeed": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "reducedDebugInfo": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "sendCommandFeedback": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "showDeathMessages": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "spawnRadius": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "spectatorsGenerateChunks": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "universalAnger": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + } + } + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "help": { + "type": "literal", + "children": { + "command": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + }, + "kick": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + }, + "executable": true + }, + "list": { + "type": "literal", + "children": { + "uuids": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "locate": { + "type": "literal", + "children": { + "bastion_remnant": { + "type": "literal", + "executable": true + }, + "buried_treasure": { + "type": "literal", + "executable": true + }, + "desert_pyramid": { + "type": "literal", + "executable": true + }, + "endcity": { + "type": "literal", + "executable": true + }, + "fortress": { + "type": "literal", + "executable": true + }, + "igloo": { + "type": "literal", + "executable": true + }, + "jungle_pyramid": { + "type": "literal", + "executable": true + }, + "mansion": { + "type": "literal", + "executable": true + }, + "mineshaft": { + "type": "literal", + "executable": true + }, + "monument": { + "type": "literal", + "executable": true + }, + "nether_fossil": { + "type": "literal", + "executable": true + }, + "ocean_ruin": { + "type": "literal", + "executable": true + }, + "pillager_outpost": { + "type": "literal", + "executable": true + }, + "ruined_portal": { + "type": "literal", + "executable": true + }, + "shipwreck": { + "type": "literal", + "executable": true + }, + "stronghold": { + "type": "literal", + "executable": true + }, + "swamp_hut": { + "type": "literal", + "executable": true + }, + "village": { + "type": "literal", + "executable": true + } + } + }, + "locatebiome": { + "type": "literal", + "children": { + "biome": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "players": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + }, + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + }, + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "spawn": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + }, + "me": { + "type": "literal", + "children": { + "action": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + }, + "msg": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + } + } + }, + "op": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "pardon": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "pardon-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "particle": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:particle", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "delta": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "speed": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "force": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "normal": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "playsound": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "ambient": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "hostile": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "master": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "music": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "neutral": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "player": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "record": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "voice": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "weather": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "publish": { + "type": "literal", + "children": { + "port": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 65535 + }, + "executable": true + } + }, + "executable": true + }, + "recipe": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "*": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + }, + "take": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "*": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + }, + "reload": { + "type": "literal", + "executable": true + }, + "replaceitem": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 64 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 64 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + }, + "save-all": { + "type": "literal", + "children": { + "flush": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "save-off": { + "type": "literal", + "executable": true + }, + "save-on": { + "type": "literal", + "executable": true + }, + "say": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + }, + "schedule": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + }, + "function": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "minecraft:function", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "children": { + "append": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "scoreboard": { + "type": "literal", + "children": { + "objectives": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "criteria": { + "type": "argument", + "parser": "minecraft:objective_criteria", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "modify": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "displayname": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "rendertype": { + "type": "literal", + "children": { + "hearts": { + "type": "literal", + "executable": true + }, + "integer": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + }, + "setdisplay": { + "type": "literal", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:scoreboard_slot", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "players": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "enable": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + }, + "list": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "executable": true + } + }, + "executable": true + }, + "operation": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "operation": { + "type": "argument", + "parser": "minecraft:operation", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "reset": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + }, + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "seed": { + "type": "literal", + "executable": true + }, + "setblock": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_state", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "setidletimeout": { + "type": "literal", + "children": { + "minutes": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "setworldspawn": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "angle": { + "type": "argument", + "parser": "minecraft:angle", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spawnpoint": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "angle": { + "type": "argument", + "parser": "minecraft:angle", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spectate": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "player": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spreadplayers": { + "type": "literal", + "children": { + "center": { + "type": "argument", + "parser": "minecraft:vec2", + "children": { + "spreadDistance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "maxRange": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 1.0 + }, + "children": { + "under": { + "type": "literal", + "children": { + "maxHeight": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "respectTeams": { + "type": "argument", + "parser": "brigadier:bool", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + } + } + } + } + } + }, + "respectTeams": { + "type": "argument", + "parser": "brigadier:bool", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "stop": { + "type": "literal", + "executable": true + }, + "stopsound": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "*": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "ambient": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "block": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "hostile": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "master": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "music": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "neutral": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "player": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "record": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "voice": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "weather": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:entity_summon", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "tag": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "add": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + } + } + } + } + }, + "team": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + }, + "executable": true + } + } + }, + "empty": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + } + }, + "join": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "children": { + "members": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "leave": { + "type": "literal", + "children": { + "members": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + }, + "executable": true + }, + "modify": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "children": { + "collisionRule": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + }, + "pushOtherTeams": { + "type": "literal", + "executable": true + }, + "pushOwnTeam": { + "type": "literal", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:color", + "executable": true + } + } + }, + "deathMessageVisibility": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + } + } + }, + "displayName": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "friendlyFire": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "nametagVisibility": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + } + } + }, + "prefix": { + "type": "literal", + "children": { + "prefix": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "seeFriendlyInvisibles": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "suffix": { + "type": "literal", + "children": { + "suffix": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + } + } + } + }, + "teammsg": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + }, + "teleport": { + "type": "literal", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + }, + "location": { + "type": "argument", + "parser": "minecraft:vec3", + "executable": true + }, + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + }, + "location": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "facingEntity": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "facingAnchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "executable": true + } + }, + "executable": true + } + } + }, + "facingLocation": { + "type": "argument", + "parser": "minecraft:vec3", + "executable": true + } + } + }, + "rotation": { + "type": "argument", + "parser": "minecraft:rotation", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "tell": { + "type": "literal", + "redirect": ["msg"] + }, + "tellraw": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "message": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + }, + "time": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "executable": true + } + } + }, + "query": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "daytime": { + "type": "literal", + "executable": true + }, + "gametime": { + "type": "literal", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "midnight": { + "type": "literal", + "executable": true + }, + "night": { + "type": "literal", + "executable": true + }, + "noon": { + "type": "literal", + "executable": true + }, + "time": { + "type": "argument", + "parser": "minecraft:time", + "executable": true + } + } + } + } + }, + "title": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "actionbar": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "clear": { + "type": "literal", + "executable": true + }, + "reset": { + "type": "literal", + "executable": true + }, + "subtitle": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "times": { + "type": "literal", + "children": { + "fadeIn": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "stay": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fadeOut": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "title": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + } + } + }, + "tm": { + "type": "literal", + "redirect": ["teammsg"] + }, + "tp": { + "type": "literal", + "redirect": ["teleport"] + }, + "trigger": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "add": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + } + }, + "executable": true + } + } + }, + "w": { + "type": "literal", + "redirect": ["msg"] + }, + "weather": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + }, + "rain": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + }, + "thunder": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "whitelist": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "off": { + "type": "literal", + "executable": true + }, + "on": { + "type": "literal", + "executable": true + }, + "reload": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + } + } + }, + "worldborder": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": -6.0e7, + "max": 6.0e7 + }, + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "center": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec2", + "executable": true + } + } + }, + "damage": { + "type": "literal", + "children": { + "amount": { + "type": "literal", + "children": { + "damagePerBlock": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "executable": true + } + } + }, + "buffer": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "executable": true + }, + "set": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": -6.0e7, + "max": 6.0e7 + }, + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "warning": { + "type": "literal", + "children": { + "distance": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "time": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "xp": { + "type": "literal", + "redirect": ["experience"] + } + } +} diff --git a/packages/mecha/mecha/resources/1_17.json b/packages/mecha/mecha/resources/1_17.json new file mode 100644 index 000000000..21f8d995f --- /dev/null +++ b/packages/mecha/mecha/resources/1_17.json @@ -0,0 +1,7596 @@ +{ + "type": "root", + "children": { + "advancement": { + "type": "literal", + "children": { + "grant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "criterion": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "everything": { + "type": "literal", + "executable": true + } + } + } + } + }, + "revoke": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "criterion": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "everything": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "attribute": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "attribute": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + }, + "base": { + "type": "literal", + "children": { + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + } + }, + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + } + }, + "modifier": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "children": { + "value": { + "type": "argument", + "parser": "brigadier:double", + "children": { + "add": { + "type": "literal", + "executable": true + }, + "multiply": { + "type": "literal", + "executable": true + }, + "multiply_base": { + "type": "literal", + "executable": true + } + } + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "execute": { + "type": "literal", + "children": { + "run": { + "type": "literal" + }, + "if": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "parser": "minecraft:int_range", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true, + "redirect": ["execute"] + } + } + }, + "data": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "unless": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "parser": "minecraft:int_range", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true, + "redirect": ["execute"] + } + } + }, + "data": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "at": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "store": { + "type": "literal", + "children": { + "result": { + "type": "literal", + "children": { + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "value": { + "type": "literal", + "redirect": ["execute"] + }, + "max": { + "type": "literal", + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + }, + "success": { + "type": "literal", + "children": { + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "value": { + "type": "literal", + "redirect": ["execute"] + }, + "max": { + "type": "literal", + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + } + } + }, + "positioned": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + } + } + }, + "rotated": { + "type": "literal", + "children": { + "rot": { + "type": "argument", + "parser": "minecraft:rotation", + "redirect": ["execute"] + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + } + } + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "align": { + "type": "literal", + "children": { + "axes": { + "type": "argument", + "parser": "minecraft:swizzle", + "redirect": ["execute"] + } + } + }, + "anchored": { + "type": "literal", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + }, + "in": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "set": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "name": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "pink": { + "type": "literal", + "executable": true + }, + "blue": { + "type": "literal", + "executable": true + }, + "red": { + "type": "literal", + "executable": true + }, + "green": { + "type": "literal", + "executable": true + }, + "yellow": { + "type": "literal", + "executable": true + }, + "purple": { + "type": "literal", + "executable": true + }, + "white": { + "type": "literal", + "executable": true + } + } + }, + "style": { + "type": "literal", + "children": { + "progress": { + "type": "literal", + "executable": true + }, + "notched_6": { + "type": "literal", + "executable": true + }, + "notched_10": { + "type": "literal", + "executable": true + }, + "notched_12": { + "type": "literal", + "executable": true + }, + "notched_20": { + "type": "literal", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "max": { + "type": "literal", + "children": { + "max": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1 + }, + "executable": true + } + } + }, + "visible": { + "type": "literal", + "children": { + "visible": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "players": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "value": { + "type": "literal", + "executable": true + }, + "max": { + "type": "literal", + "executable": true + }, + "visible": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_predicate", + "children": { + "maxCount": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "clone": { + "type": "literal", + "children": { + "begin": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "parser": "minecraft:block_predicate", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + }, + "executable": true + } + } + } + } + } + } + }, + "data": { + "type": "literal", + "children": { + "merge": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "datapack": { + "type": "literal", + "children": { + "enable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "children": { + "after": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "before": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "last": { + "type": "literal", + "executable": true + }, + "first": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "disable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "children": { + "available": { + "type": "literal", + "executable": true + }, + "enabled": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "debug": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:function", + "executable": true + } + } + } + } + }, + "defaultgamemode": { + "type": "literal", + "children": { + "survival": { + "type": "literal", + "executable": true + }, + "creative": { + "type": "literal", + "executable": true + }, + "adventure": { + "type": "literal", + "executable": true + }, + "spectator": { + "type": "literal", + "executable": true + } + } + }, + "difficulty": { + "type": "literal", + "children": { + "peaceful": { + "type": "literal", + "executable": true + }, + "easy": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + }, + "hard": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "effect": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "effect": { + "type": "argument", + "parser": "minecraft:mob_effect", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "effect": { + "type": "argument", + "parser": "minecraft:mob_effect", + "children": { + "seconds": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 1000000 + }, + "children": { + "amplifier": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 255 + }, + "children": { + "hideParticles": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "me": { + "type": "literal", + "children": { + "action": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + }, + "enchant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "enchantment": { + "type": "argument", + "parser": "minecraft:item_enchantment", + "children": { + "level": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "experience": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "amount": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "points": { + "type": "literal", + "executable": true + }, + "levels": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "amount": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "points": { + "type": "literal", + "executable": true + }, + "levels": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "query": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "players" + }, + "children": { + "points": { + "type": "literal", + "executable": true + }, + "levels": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "xp": { + "type": "literal", + "redirect": ["experience"] + }, + "fill": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_state", + "children": { + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true + } + }, + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "outline": { + "type": "literal", + "executable": true + }, + "hollow": { + "type": "literal", + "executable": true + }, + "destroy": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "forceload": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:column_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:column_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + }, + "all": { + "type": "literal", + "executable": true + } + } + }, + "query": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + } + } + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:function", + "executable": true + } + } + }, + "gamemode": { + "type": "literal", + "children": { + "survival": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "creative": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "adventure": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "spectator": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "gamerule": { + "type": "literal", + "children": { + "announceAdvancements": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "commandBlockOutput": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "disableElytraMovementCheck": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "disableRaids": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doDaylightCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doEntityDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doFireTick": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doImmediateRespawn": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doInsomnia": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doLimitedCrafting": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doMobLoot": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doMobSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doPatrolSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doTileDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doTraderSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doWeatherCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "drowningDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "fallDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "fireDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "forgiveDeadPlayers": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "freezeDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "keepInventory": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "logAdminCommands": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "maxCommandChainLength": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "maxEntityCramming": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "mobGriefing": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "naturalRegeneration": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "playersSleepingPercentage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "randomTickSpeed": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "reducedDebugInfo": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "sendCommandFeedback": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "showDeathMessages": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "spawnRadius": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "spectatorsGenerateChunks": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "universalAnger": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + } + } + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "help": { + "type": "literal", + "children": { + "command": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + }, + "item": { + "type": "literal", + "children": { + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 64 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 64 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "kick": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + }, + "executable": true + }, + "list": { + "type": "literal", + "children": { + "uuids": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "locate": { + "type": "literal", + "children": { + "pillager_outpost": { + "type": "literal", + "executable": true + }, + "mineshaft": { + "type": "literal", + "executable": true + }, + "mansion": { + "type": "literal", + "executable": true + }, + "jungle_pyramid": { + "type": "literal", + "executable": true + }, + "desert_pyramid": { + "type": "literal", + "executable": true + }, + "igloo": { + "type": "literal", + "executable": true + }, + "ruined_portal": { + "type": "literal", + "executable": true + }, + "shipwreck": { + "type": "literal", + "executable": true + }, + "swamp_hut": { + "type": "literal", + "executable": true + }, + "stronghold": { + "type": "literal", + "executable": true + }, + "monument": { + "type": "literal", + "executable": true + }, + "ocean_ruin": { + "type": "literal", + "executable": true + }, + "fortress": { + "type": "literal", + "executable": true + }, + "endcity": { + "type": "literal", + "executable": true + }, + "buried_treasure": { + "type": "literal", + "executable": true + }, + "village": { + "type": "literal", + "executable": true + }, + "nether_fossil": { + "type": "literal", + "executable": true + }, + "bastion_remnant": { + "type": "literal", + "executable": true + } + } + }, + "locatebiome": { + "type": "literal", + "children": { + "biome": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "replace": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "give": { + "type": "literal", + "children": { + "players": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "spawn": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + }, + "msg": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + } + } + }, + "tell": { + "type": "literal", + "redirect": ["msg"] + }, + "w": { + "type": "literal", + "redirect": ["msg"] + }, + "particle": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:particle", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "delta": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "speed": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "force": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "normal": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "playsound": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "master": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "music": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "record": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "weather": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "hostile": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "neutral": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "player": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "ambient": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "voice": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "reload": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "recipe": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + }, + "*": { + "type": "literal", + "executable": true + } + } + } + } + }, + "take": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "recipe": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + }, + "*": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "say": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + }, + "schedule": { + "type": "literal", + "children": { + "function": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "minecraft:function", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "children": { + "append": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + } + } + }, + "scoreboard": { + "type": "literal", + "children": { + "objectives": { + "type": "literal", + "children": { + "list": { + "type": "literal", + "executable": true + }, + "add": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "criteria": { + "type": "argument", + "parser": "minecraft:objective_criteria", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "displayname": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "rendertype": { + "type": "literal", + "children": { + "integer": { + "type": "literal", + "executable": true + }, + "hearts": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + }, + "setdisplay": { + "type": "literal", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:scoreboard_slot", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "players": { + "type": "literal", + "children": { + "list": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "executable": true + } + }, + "executable": true + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + }, + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "reset": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + }, + "executable": true + } + } + }, + "enable": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + }, + "operation": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "operation": { + "type": "argument", + "parser": "minecraft:operation", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "seed": { + "type": "literal", + "executable": true + }, + "setblock": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_state", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "spawnpoint": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "angle": { + "type": "argument", + "parser": "minecraft:angle", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "setworldspawn": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "angle": { + "type": "argument", + "parser": "minecraft:angle", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spectate": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "player": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spreadplayers": { + "type": "literal", + "children": { + "center": { + "type": "argument", + "parser": "minecraft:vec2", + "children": { + "spreadDistance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "maxRange": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 1.0 + }, + "children": { + "respectTeams": { + "type": "argument", + "parser": "brigadier:bool", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + } + }, + "under": { + "type": "literal", + "children": { + "maxHeight": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "respectTeams": { + "type": "argument", + "parser": "brigadier:bool", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "stopsound": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "*": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "master": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "music": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "record": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "weather": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "block": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "hostile": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "neutral": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "player": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "ambient": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "voice": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:entity_summon", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "tag": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "add": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "executable": true + } + } + } + } + }, + "team": { + "type": "literal", + "children": { + "list": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + }, + "executable": true + }, + "add": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + }, + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + } + }, + "empty": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + } + }, + "join": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "children": { + "members": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "leave": { + "type": "literal", + "children": { + "members": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "executable": true + } + } + }, + "modify": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "children": { + "displayName": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:color", + "executable": true + } + } + }, + "friendlyFire": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "seeFriendlyInvisibles": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "nametagVisibility": { + "type": "literal", + "children": { + "never": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "always": { + "type": "literal", + "executable": true + } + } + }, + "deathMessageVisibility": { + "type": "literal", + "children": { + "never": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "always": { + "type": "literal", + "executable": true + } + } + }, + "collisionRule": { + "type": "literal", + "children": { + "never": { + "type": "literal", + "executable": true + }, + "pushOwnTeam": { + "type": "literal", + "executable": true + }, + "pushOtherTeams": { + "type": "literal", + "executable": true + }, + "always": { + "type": "literal", + "executable": true + } + } + }, + "prefix": { + "type": "literal", + "children": { + "prefix": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "suffix": { + "type": "literal", + "children": { + "suffix": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + } + } + } + } + }, + "teammsg": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + }, + "tm": { + "type": "literal", + "redirect": ["teammsg"] + }, + "teleport": { + "type": "literal", + "children": { + "location": { + "type": "argument", + "parser": "minecraft:vec3", + "executable": true + }, + "destination": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + }, + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "location": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "rotation": { + "type": "argument", + "parser": "minecraft:rotation", + "executable": true + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "facingEntity": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "facingAnchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "executable": true + } + }, + "executable": true + } + } + }, + "facingLocation": { + "type": "argument", + "parser": "minecraft:vec3", + "executable": true + } + } + } + }, + "executable": true + }, + "destination": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + } + } + }, + "tp": { + "type": "literal", + "redirect": ["teleport"] + }, + "tellraw": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "message": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + }, + "time": { + "type": "literal", + "children": { + "set": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "noon": { + "type": "literal", + "executable": true + }, + "night": { + "type": "literal", + "executable": true + }, + "midnight": { + "type": "literal", + "executable": true + }, + "time": { + "type": "argument", + "parser": "minecraft:time", + "executable": true + } + } + }, + "add": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "executable": true + } + } + }, + "query": { + "type": "literal", + "children": { + "daytime": { + "type": "literal", + "executable": true + }, + "gametime": { + "type": "literal", + "executable": true + }, + "day": { + "type": "literal", + "executable": true + } + } + } + } + }, + "title": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "clear": { + "type": "literal", + "executable": true + }, + "reset": { + "type": "literal", + "executable": true + }, + "title": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "subtitle": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "actionbar": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "times": { + "type": "literal", + "children": { + "fadeIn": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "stay": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fadeOut": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "trigger": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "add": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + } + }, + "executable": true + } + } + }, + "weather": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + }, + "rain": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + }, + "thunder": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "worldborder": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:double", + "properties": { + "min": -5.9999968e7, + "max": 5.9999968e7 + }, + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:double", + "properties": { + "min": -5.9999968e7, + "max": 5.9999968e7 + }, + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "center": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec2", + "executable": true + } + } + }, + "damage": { + "type": "literal", + "children": { + "amount": { + "type": "literal", + "children": { + "damagePerBlock": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "executable": true + } + } + }, + "buffer": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "executable": true + }, + "warning": { + "type": "literal", + "children": { + "distance": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "time": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "ban-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "banlist": { + "type": "literal", + "children": { + "ips": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "ban": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "deop": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "op": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "pardon": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "pardon-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "perf": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "save-all": { + "type": "literal", + "children": { + "flush": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "save-off": { + "type": "literal", + "executable": true + }, + "save-on": { + "type": "literal", + "executable": true + }, + "setidletimeout": { + "type": "literal", + "children": { + "minutes": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "stop": { + "type": "literal", + "executable": true + }, + "whitelist": { + "type": "literal", + "children": { + "on": { + "type": "literal", + "executable": true + }, + "off": { + "type": "literal", + "executable": true + }, + "list": { + "type": "literal", + "executable": true + }, + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "reload": { + "type": "literal", + "executable": true + } + } + }, + "publish": { + "type": "literal", + "children": { + "port": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 65535 + }, + "executable": true + } + }, + "executable": true + } + } +} diff --git a/packages/mecha/mecha/resources/__init__.py b/packages/mecha/mecha/resources/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/mecha/resources/patch.json b/packages/mecha/mecha/resources/patch.json new file mode 100644 index 000000000..4109aeada --- /dev/null +++ b/packages/mecha/mecha/resources/patch.json @@ -0,0 +1,14 @@ +{ + "type": "root", + "children": { + "execute": { + "type": "literal", + "children": { + "run": { + "type": "literal", + "redirect": [] + } + } + } + } +} diff --git a/packages/mecha/mecha/resources/wiki_examples.mcfunction b/packages/mecha/mecha/resources/wiki_examples.mcfunction new file mode 100644 index 000000000..9fb4ac71e --- /dev/null +++ b/packages/mecha/mecha/resources/wiki_examples.mcfunction @@ -0,0 +1,7 @@ +gamerule doDaylightCycle false +gamerule naturalRegeneration false +gamerule mobGriefing false +gamerule doWeatherCycle false +gamerule keepInventory true +gamerule commandBlockOutput false +gamerule doInsomnia false diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py new file mode 100644 index 000000000..7017dbc57 --- /dev/null +++ b/packages/mecha/mecha/spec.py @@ -0,0 +1,278 @@ +__all__ = [ + "Parser", + "CommandSpecification", + "CommandTree", + "CommandPrototype", + "CommandSignature", + "CommandArgument", +] + + +from dataclasses import dataclass +from importlib.resources import read_text +from pathlib import Path +from typing import ( + Any, + Dict, + Iterable, + List, + Literal, + NamedTuple, + Optional, + Protocol, + Tuple, + Union, +) + +from beet.core.utils import FileSystemPath, JsonDict, extra_field +from pydantic import BaseModel +from tokenstream import TokenStream + + +class Parser(Protocol): + """Protocol describing parser signature.""" + + def __call__(self, stream: TokenStream) -> Any: + ... + + +CommandSignature = Tuple[Union[str, "CommandArgument"], ...] + + +class CommandArgument(NamedTuple): + """Class representing an argument in a command prototype.""" + + name: str + scope: Tuple[str, ...] + + +class CommandPrototype(NamedTuple): + """Class representing a command prototype.""" + + identifier: str + signature: CommandSignature + arguments: Tuple[int, ...] + + def get_argument(self, arg: Union[str, int]) -> CommandArgument: + """Return the argument corresponding to the given name or index.""" + if isinstance(arg, str): + for i in self.arguments: + if self.get_argument(i).name == arg: + arg = i + break + else: + arg = len(self.signature) + + return self.signature[self.arguments[arg]] # type: ignore + + +class CommandTree(BaseModel): + """Deserialized representation of the command tree.""" + + type: Literal["root", "literal", "argument"] + parser: Optional[str] = None + properties: Optional[JsonDict] = None + executable: Optional[bool] = None + redirect: Optional[Tuple[str, ...]] = None + children: Optional[Dict[str, "CommandTree"]] = None + + @classmethod + def load( + cls, + filename: Optional[FileSystemPath] = None, + version: Optional[str] = None, + patch: bool = True, + ) -> "CommandTree": + """Load the command tree from a file.""" + sources: List[str] = [] + + if filename: + sources.append(Path(filename).read_text()) + if version: + sources.append(read_text("mecha.resources", f"{version}.json")) + if patch: + sources.append(read_text("mecha.resources", "patch.json")) + + tree = cls.parse_raw(sources[0]) + + for source in sources[1:]: + tree = tree.extend(cls.parse_raw(source)) + + return tree + + def extend(self, other: "CommandTree") -> "CommandTree": + """Merge nodes from another command tree.""" + self.type = other.type + + if other.parser is not None: + self.parser = other.parser + + if other.properties is not None: + self.properties = other.properties + + if other.executable is not None: + self.executable = other.executable + + if other.redirect is not None: + self.redirect = other.redirect + + if other.children: + if self.children is None: + self.children = {} + for name, child in other.children.items(): + if name in self.children: + self.children[name].extend(child) + else: + self.children[name] = child + + return self + + def get(self, *scope: str) -> Optional["CommandTree"]: + """Retrieve a nested node.""" + if not scope: + return self + if not self.children: + return None + child = self.children.get(scope[0]) + return child and child.get(*scope[1:]) + + def get_literal_children(self) -> Iterable[str]: + """Yield the name of all the literal children.""" + if self.children: + for name, child in self.children.items(): + if child.type == "literal": + yield name + + def get_argument_children(self) -> Iterable[str]: + """Yield the name of all the argument children.""" + if self.children: + for name, child in self.children.items(): + if child.type == "argument": + yield name + + +CommandTree.update_forward_refs() + + +@dataclass +class CommandSpecification: + """Class responsible for managing the command specification.""" + + tree: CommandTree = extra_field( + default_factory=lambda: CommandTree.load(version="1_17") + ) + flattened_tree: Dict[Tuple[str, ...], CommandTree] = extra_field( + default_factory=dict + ) + prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) + parsers: Dict[str, Parser] = extra_field(default_factory=dict) + + def __post_init__(self): + self.update() + + def add_commands(self, tree: CommandTree): + """Extend the command tree and regenerate prototypes.""" + self.tree.extend(tree) + self.update() + + def update(self): + """Recalculate flattened tree and command prototypes.""" + self.flattened_tree = {} + self.prototypes = {} + + self.generate_flattened_tree(self.tree) + self.generate_prototypes(self.tree) + + subcommands = { + last_arg.scope: ":".join(last_arg.scope) + ":" + for prototype in self.prototypes.values() + if prototype.signature + and isinstance(last_arg := prototype.signature[-1], CommandArgument) + and last_arg.name == "subcommand" + and last_arg.scope + } + + truncated: Dict[Tuple[str, ...], CommandPrototype] = {} + + for identifier, prototype in self.prototypes.items(): + for scope, prefix in subcommands.items(): + pivot = len(scope) + if identifier.startswith(prefix): + truncated[scope] = prototype + self.prototypes[identifier] = CommandPrototype( + prototype.identifier, + prototype.signature[pivot:], + tuple( + offset + for arg in prototype.arguments + if (offset := arg - pivot) >= 0 + ), + ) + + for scope, prototype in truncated.items(): + pivot = len(scope) + identifier = ":".join(scope + ("subcommand",)) + self.prototypes[identifier] = CommandPrototype( + identifier, + prototype.signature[:pivot] + (CommandArgument("subcommand", scope),), + tuple(arg for arg in prototype.arguments if arg < pivot) + (pivot,), + ) + + def generate_flattened_tree( + self, + tree: CommandTree, + scope: Tuple[str, ...] = (), + ): + """Traverse command tree and generate flattened lookup table.""" + self.flattened_tree[scope] = tree + + if tree.children: + for name, child in tree.children.items(): + self.generate_flattened_tree(child, scope + (name,)) + + def generate_prototypes( + self, + tree: CommandTree, + scope: Tuple[str, ...] = (), + signature: CommandSignature = (), + arguments: Tuple[int, ...] = (), + ): + """Traverse command tree and generate prototypes.""" + subcommand = ( + tree.redirect is not None and scope[: len(tree.redirect)] == tree.redirect + ) + + if tree.redirect is not None and subcommand: + identifier = ":".join(scope + ("subcommand",)) + self.prototypes[identifier] = CommandPrototype( + identifier, + signature + (CommandArgument("subcommand", tree.redirect),), + arguments + (len(signature),), + ) + + if tree.executable: + identifier = ":".join(scope) + self.prototypes[identifier] = CommandPrototype( + identifier, signature, arguments + ) + + children: Dict[str, CommandTree] = {} + + if tree.children: + children.update(tree.children) + if tree.redirect is not None and not subcommand: + if redirect := self.flattened_tree[tree.redirect]: + children.update(redirect.children or {}) + + for name, child in children.items(): + self.generate_prototypes( + child, + scope + (name,), + signature + + ( + CommandArgument(name, scope + (name,)) + if child.type == "argument" + else name, + ), + arguments + ((len(signature),) if child.type == "argument" else ()), + ) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 49d8df1f2..f375091aa 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.155" + "pyright": "^1.1.157" } }, "node_modules/pyright": { - "version": "1.1.155", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.155.tgz", - "integrity": "sha512-y7VqgiOMiLqzFzQ6LCVUtyb8VCsVbwzOHw16A5YxidGmARRYvFn1kIf1uCDqj3ytxrOcVHyptq90/TSffU0hZg==", + "version": "1.1.157", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.157.tgz", + "integrity": "sha512-slTex47hQKuyoi579Zk7lEhVH+4Dmn+eZ3gP1JGcFBcbcmDwd9ZI1ESww3jY3YoOYdNbYTafxBNuh3RHGkGiMA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.155", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.155.tgz", - "integrity": "sha512-y7VqgiOMiLqzFzQ6LCVUtyb8VCsVbwzOHw16A5YxidGmARRYvFn1kIf1uCDqj3ytxrOcVHyptq90/TSffU0hZg==", + "version": "1.1.157", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.157.tgz", + "integrity": "sha512-slTex47hQKuyoi579Zk7lEhVH+4Dmn+eZ3gP1JGcFBcbcmDwd9ZI1ESww3jY3YoOYdNbYTafxBNuh3RHGkGiMA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 097a6f717..a2f2e1641 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.155" + "pyright": "^1.1.157" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f41c85fa5..78cdd01a8 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -16,17 +16,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "20.3.0" +version = "21.2.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] [[package]] name = "base58" @@ -39,9 +39,24 @@ python-versions = ">=3.5" [package.extras] tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)", "coveralls", "pytest-benchmark"] +[[package]] +name = "beautifulsoup4" +version = "4.9.3" +description = "Screen-scraping library" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +soupsieve = {version = ">1.2", markers = "python_version >= \"3.0\""} + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "beet" -version = "0.35.1" +version = "0.36.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -65,7 +80,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.6b0" +version = "21.7b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,7 +92,7 @@ click = ">=7.1.2" mypy-extensions = ">=0.4.3" pathspec = ">=0.8.1,<1" regex = ">=2020.1.8" -toml = ">=0.10.1" +tomli = ">=0.2.6,<2.0.0" [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -87,7 +102,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "3.3.0" +version = "3.3.1" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false @@ -100,7 +115,7 @@ webencodings = "*" [[package]] name = "certifi" -version = "2020.12.5" +version = "2021.5.30" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -108,7 +123,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.4" +version = "1.14.6" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -118,12 +133,15 @@ python-versions = "*" pycparser = "*" [[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" +name = "charset-normalizer" +version = "2.0.3" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] [[package]] name = "click" @@ -135,7 +153,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "click-help-colors" -version = "0.9" +version = "0.9.1" description = "Colorization of help messages in Click" category = "main" optional = false @@ -168,26 +186,26 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.3.2" +version = "3.4.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.6" [package.dependencies] cffi = ">=1.12" -six = ">=1.4.1" [package.extras] docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "docutils" -version = "0.16" +version = "0.17.1" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false @@ -214,33 +232,50 @@ python-versions = "*" [[package]] name = "gitdb" -version = "4.0.5" +version = "4.0.7" description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.4" [package.dependencies] -smmap = ">=3.0.1,<4" +smmap = ">=3.0.1,<5" [[package]] name = "gitpython" -version = "3.1.12" +version = "3.1.18" description = "Python Git Library" category = "dev" optional = false -python-versions = ">=3.4" +python-versions = ">=3.6" [package.dependencies] gitdb = ">=4.0.1,<5" +typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "idna" -version = "2.10" +version = "3.2" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "4.6.1" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -252,7 +287,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.5.0" +version = "1.6.0" description = "Pythonic task execution" category = "dev" optional = false @@ -260,7 +295,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.9.1" +version = "5.9.2" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -274,7 +309,7 @@ plugins = ["setuptools"] [[package]] name = "jeepney" -version = "0.6.0" +version = "0.7.0" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false @@ -282,6 +317,7 @@ python-versions = ">=3.6" [package.extras] test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +trio = ["trio", "async-generator"] [[package]] name = "jinja2" @@ -299,20 +335,53 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "22.0.1" +version = "23.0.1" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] +importlib-metadata = ">=3.6" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lectern" +version = "0.15.2" +description = "Literate Minecraft data packs and resource packs." +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +beet = ">=0.34.1" +click = ">=7.1.2,<8.0.0" +markdown-it-py = ">=1.1.0,<2.0.0" + +[[package]] +name = "markdown-it-py" +version = "1.1.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +attrs = ">=19,<22" + +[package.extras] +code_style = ["pre-commit (==2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" @@ -322,6 +391,18 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "mcwiki" +version = "0.2.0" +description = "A scraping library for the Minecraft Wiki" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +beautifulsoup4 = ">=4.9.3,<5.0.0" +requests = ">=2.26.0,<3.0.0" + [[package]] name = "mypy-extensions" version = "0.4.3" @@ -343,19 +424,19 @@ numpy = ">1.16,<1.20.2" [[package]] name = "numpy" -version = "1.19.3" +version = "1.20.1" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "packaging" -version = "20.8" +version = "21.0" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] pyparsing = ">=2.0.2" @@ -370,7 +451,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pkginfo" -version = "1.7.0" +version = "1.7.1" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false @@ -423,7 +504,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.7.4" +version = "2.9.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -458,17 +539,33 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +name = "pytest-insta" +version = "0.1.10" +description = "A practical snapshot testing plugin for pytest" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +pytest = ">=6.0.2,<7.0.0" +wrapt = ">=1.12.1,<2.0.0" + [[package]] name = "python-gitlab" -version = "1.15.0" +version = "2.9.0" description = "Interact with GitLab API" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6.0" [package.dependencies] -requests = ">=2.4.2" -six = "*" +requests = ">=2.22.0" +requests-toolbelt = ">=0.9.1" + +[package.extras] +autocompletion = ["argcomplete (>=1.10.0,<2)"] +yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" @@ -514,7 +611,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "readme-renderer" -version = "28.0" +version = "29.0" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -527,11 +624,11 @@ Pygments = ">=2.5.1" six = "*" [package.extras] -md = ["cmarkgfm (>=0.2.0)"] +md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" -version = "2020.11.13" +version = "2021.7.6" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -539,21 +636,21 @@ python-versions = "*" [[package]] name = "requests" -version = "2.25.1" +version = "2.26.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-toolbelt" @@ -568,7 +665,7 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rfc3986" -version = "1.4.0" +version = "1.5.0" description = "Validating URI References per RFC 3986" category = "dev" optional = false @@ -579,7 +676,7 @@ idna2008 = ["idna"] [[package]] name = "secretstorage" -version = "3.3.0" +version = "3.3.1" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false @@ -599,18 +696,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "5.0.1" +version = "6.0.1" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.extras] toml = ["toml"] [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false @@ -618,11 +715,27 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" -version = "3.0.5" +version = "4.0.0" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" + +[[package]] +name = "soupsieve" +version = "2.2.1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tokenstream" +version = "0.6.2" +description = "A versatile token stream for handwritten parsers" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" [[package]] name = "toml" @@ -632,6 +745,14 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "tomli" +version = "1.1.0" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "tomlkit" version = "0.7.0" @@ -642,19 +763,23 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.56.0" +version = "4.61.2" description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] telegram = ["requests"] [[package]] name = "twine" -version = "3.3.0" +version = "3.4.2" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -662,6 +787,7 @@ python-versions = ">=3.6" [package.dependencies] colorama = ">=0.4.3" +importlib-metadata = ">=3.6" keyring = ">=15.1" pkginfo = ">=1.4.2" readme-renderer = ">=21.0" @@ -672,7 +798,7 @@ tqdm = ">=4.14" [[package]] name = "typing-extensions" -version = "3.7.4.3" +version = "3.10.0.0" description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false @@ -680,7 +806,7 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.5" +version = "1.26.6" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false @@ -699,10 +825,30 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "wrapt" +version = "1.12.1" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.5.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "00a257e2e83ff833bd010b5dc00fbded9dc9e66f072945db9195b4b66a511b75" +content-hash = "8bccf356911d154beb5ac213aa20dad6656baf78f7f2afd9d5f1d093d4dee47d" [metadata.files] appdirs = [ @@ -714,79 +860,92 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] base58 = [ {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.9.3-py2-none-any.whl", hash = "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35"}, + {file = "beautifulsoup4-4.9.3-py3-none-any.whl", hash = "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"}, + {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"}, +] beet = [ - {file = "beet-0.35.1-py3-none-any.whl", hash = "sha256:8f67c44078d6c19406c818bbf33d55b1c7c5ae8965cfd5f06c35aa38cef0cf19"}, - {file = "beet-0.35.1.tar.gz", hash = "sha256:b9c300ecfa538a85295c1540c6bac6207119b47f5b04bbbf84a5e934a62d6054"}, + {file = "beet-0.36.0-py3-none-any.whl", hash = "sha256:4f9d68621af4c558c28755dcefa886125baef439ee827ba62fe42fca6290c96f"}, + {file = "beet-0.36.0.tar.gz", hash = "sha256:3e1e52408e9745ab43a23482db1cd771d57bc262ee5944c33bab9560c6ed62c7"}, ] black = [ - {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, - {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, + {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, + {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, ] bleach = [ - {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, - {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, + {file = "bleach-3.3.1-py2.py3-none-any.whl", hash = "sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78"}, + {file = "bleach-3.3.1.tar.gz", hash = "sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa"}, ] certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, ] cffi = [ - {file = "cffi-1.14.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26"}, - {file = "cffi-1.14.4-cp27-cp27m-win32.whl", hash = "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c"}, - {file = "cffi-1.14.4-cp27-cp27m-win_amd64.whl", hash = "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca"}, - {file = "cffi-1.14.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293"}, - {file = "cffi-1.14.4-cp35-cp35m-win32.whl", hash = "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2"}, - {file = "cffi-1.14.4-cp35-cp35m-win_amd64.whl", hash = "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7"}, - {file = "cffi-1.14.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b"}, - {file = "cffi-1.14.4-cp36-cp36m-win32.whl", hash = "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668"}, - {file = "cffi-1.14.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009"}, - {file = "cffi-1.14.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01"}, - {file = "cffi-1.14.4-cp37-cp37m-win32.whl", hash = "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e"}, - {file = "cffi-1.14.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35"}, - {file = "cffi-1.14.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e"}, - {file = "cffi-1.14.4-cp38-cp38-win32.whl", hash = "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d"}, - {file = "cffi-1.14.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375"}, - {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7ef7d4ced6b325e92eb4d3502946c78c5367bc416398d387b39591532536734e"}, - {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, - {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, - {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, + {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, + {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, + {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, + {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, + {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, + {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, + {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, + {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, + {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, + {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, + {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, + {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, + {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, + {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, + {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, + {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, + {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, + {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, + {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, ] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] click-help-colors = [ - {file = "click-help-colors-0.9.tar.gz", hash = "sha256:eb037a2dd95a9e20b3897c2b3ca57e7f6797f76a8d93f7eeedda7fcdcbc9b635"}, - {file = "click_help_colors-0.9-py3-none-any.whl", hash = "sha256:f6c3d1fe86b07790e6ef0339f458196a8814de90946d876774ea4b4f30a5a539"}, + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, ] click-log = [ {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, @@ -797,24 +956,22 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.3.2-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:541dd758ad49b45920dda3b5b48c968f8b2533d8981bcdb43002798d8f7a89ed"}, - {file = "cryptography-3.3.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:49570438e60f19243e7e0d504527dd5fe9b4b967b5a1ff21cc12b57602dd85d3"}, - {file = "cryptography-3.3.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a4ac9648d39ce71c2f63fe7dc6db144b9fa567ddfc48b9fde1b54483d26042"}, - {file = "cryptography-3.3.2-cp27-cp27m-win32.whl", hash = "sha256:aa4969f24d536ae2268c902b2c3d62ab464b5a66bcb247630d208a79a8098e9b"}, - {file = "cryptography-3.3.2-cp27-cp27m-win_amd64.whl", hash = "sha256:1bd0ccb0a1ed775cd7e2144fe46df9dc03eefd722bbcf587b3e0616ea4a81eff"}, - {file = "cryptography-3.3.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e18e6ab84dfb0ab997faf8cca25a86ff15dfea4027b986322026cc99e0a892da"}, - {file = "cryptography-3.3.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c7390f9b2119b2b43160abb34f63277a638504ef8df99f11cb52c1fda66a2e6f"}, - {file = "cryptography-3.3.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0d7b69674b738068fa6ffade5c962ecd14969690585aaca0a1b1fc9058938a72"}, - {file = "cryptography-3.3.2-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:922f9602d67c15ade470c11d616f2b2364950602e370c76f0c94c94ae672742e"}, - {file = "cryptography-3.3.2-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:a0f0b96c572fc9f25c3f4ddbf4688b9b38c69836713fb255f4a2715d93cbaf44"}, - {file = "cryptography-3.3.2-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:a777c096a49d80f9d2979695b835b0f9c9edab73b59e4ceb51f19724dda887ed"}, - {file = "cryptography-3.3.2-cp36-abi3-win32.whl", hash = "sha256:3c284fc1e504e88e51c428db9c9274f2da9f73fdf5d7e13a36b8ecb039af6e6c"}, - {file = "cryptography-3.3.2-cp36-abi3-win_amd64.whl", hash = "sha256:7951a966613c4211b6612b0352f5bf29989955ee592c4a885d8c7d0f830d0433"}, - {file = "cryptography-3.3.2.tar.gz", hash = "sha256:5a60d3780149e13b7a6ff7ad6526b38846354d11a15e21068e57073e29e19bed"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, + {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, + {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, + {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] docutils = [ - {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, - {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, @@ -823,41 +980,53 @@ fnvhash = [ {file = "fnvhash-0.1.0.tar.gz", hash = "sha256:3e82d505054f9f3987b2b5b649f7e7b6f48349f6af8a1b8e4d66779699c85a8e"}, ] gitdb = [ - {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, - {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, + {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, + {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, ] gitpython = [ - {file = "GitPython-3.1.12-py3-none-any.whl", hash = "sha256:867ec3dfb126aac0f8296b19fb63b8c4a399f32b4b6fafe84c4b10af5fa9f7b5"}, - {file = "GitPython-3.1.12.tar.gz", hash = "sha256:42dbefd8d9e2576c496ed0059f3103dcef7125b9ce16f9d5f9c834aed44a1dac"}, + {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"}, + {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"}, ] idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, + {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, - {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, - {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, + {file = "invoke-1.6.0-py2-none-any.whl", hash = "sha256:e6c9917a1e3e73e7ea91fdf82d5f151ccfe85bf30cc65cdb892444c02dbb5f74"}, + {file = "invoke-1.6.0-py3-none-any.whl", hash = "sha256:769e90caeb1bd07d484821732f931f1ad8916a38e3f3e618644687fc09cb6317"}, + {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"}, ] isort = [ - {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, - {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, + {file = "isort-5.9.2-py3-none-any.whl", hash = "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813"}, + {file = "isort-5.9.2.tar.gz", hash = "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"}, ] jeepney = [ - {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, - {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, + {file = "jeepney-0.7.0-py3-none-any.whl", hash = "sha256:71335e7a4e93817982f473f3507bffc2eff7a544119ab9b73e089c8ba1409ba3"}, + {file = "jeepney-0.7.0.tar.gz", hash = "sha256:1237cd64c8f7ac3aa4b3f332c4d0fb4a8216f39eaa662ec904302d4d77de5a54"}, ] jinja2 = [ {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] keyring = [ - {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, - {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, + {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, + {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, +] +lectern = [ + {file = "lectern-0.15.2-py3-none-any.whl", hash = "sha256:71942bf4d601dbc303be13714e6a83abed1717b4a288fdaaa730506fb8413f12"}, + {file = "lectern-0.15.2.tar.gz", hash = "sha256:93052ab087a35b99d0453bf93f39a27aaa9dd11a81940c721ccd00ff70604ab7"}, +] +markdown-it-py = [ + {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, + {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, @@ -895,6 +1064,10 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] +mcwiki = [ + {file = "mcwiki-0.2.0-py3-none-any.whl", hash = "sha256:64495234e6648c40001aa3c9e33c2fd38fc340d9eb21af853857035703f20894"}, + {file = "mcwiki-0.2.0.tar.gz", hash = "sha256:0d09949c1c7ddf3b9988de4507e26fc6675c8b907e620642d30371e7f9484569"}, +] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, @@ -904,52 +1077,42 @@ nbtlib = [ {file = "nbtlib-1.12.0.tar.gz", hash = "sha256:2554d16bbf51b087442f4d55981ba476ae5d1f046f89dd7904914a7412a80a2e"}, ] numpy = [ - {file = "numpy-1.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add"}, - {file = "numpy-1.19.3-cp36-cp36m-win32.whl", hash = "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d"}, - {file = "numpy-1.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f"}, - {file = "numpy-1.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6"}, - {file = "numpy-1.19.3-cp37-cp37m-win32.whl", hash = "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7"}, - {file = "numpy-1.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f"}, - {file = "numpy-1.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98"}, - {file = "numpy-1.19.3-cp38-cp38-win32.whl", hash = "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c"}, - {file = "numpy-1.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4"}, - {file = "numpy-1.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5"}, - {file = "numpy-1.19.3-cp39-cp39-win32.whl", hash = "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170"}, - {file = "numpy-1.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6"}, - {file = "numpy-1.19.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9"}, - {file = "numpy-1.19.3.zip", hash = "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72"}, + {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, + {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, + {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, + {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, + {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, + {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, + {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, + {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, + {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, + {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, + {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, ] packaging = [ - {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, - {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pkginfo = [ - {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, - {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, + {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, + {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -988,8 +1151,8 @@ pydantic = [ {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pygments = [ - {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, - {file = "Pygments-2.7.4.tar.gz", hash = "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"}, + {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, + {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -999,9 +1162,13 @@ pytest = [ {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, ] +pytest-insta = [ + {file = "pytest-insta-0.1.10.tar.gz", hash = "sha256:27670ed8aa63cf34726106586dadadb12137102e22372ec918e64ee524d56f1f"}, + {file = "pytest_insta-0.1.10-py3-none-any.whl", hash = "sha256:3043c4a668224f473df3de1d60fb356e356687b6931338c42c487abd0c9a19d8"}, +] python-gitlab = [ - {file = "python-gitlab-1.15.0.tar.gz", hash = "sha256:45125a0ed4d0027d4317bdbd71ca02fc52b0ac160b9d2c3c5be131b4d19f867e"}, - {file = "python_gitlab-1.15.0-py3-none-any.whl", hash = "sha256:51ad36873b5c20cd21d9373db0936fb99c521575668320025d0fb519398d2e17"}, + {file = "python-gitlab-2.9.0.tar.gz", hash = "sha256:2c51b14cdd9a68028315a2b0e88525d3760967388f99faa57de8902b45465be6"}, + {file = "python_gitlab-2.9.0-py3-none-any.whl", hash = "sha256:956dfaf5d5f16c005fd064a7efd3059683dc348e9d46a1a555ddfac2e831e537"}, ] python-semantic-release = [ {file = "python-semantic-release-7.16.2.tar.gz", hash = "sha256:b0679f5ca5ef860bcf07836949e0956bffa965197315b01c6e089467c144c674"}, @@ -1043,116 +1210,129 @@ pyyaml = [ {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] readme-renderer = [ - {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, - {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, + {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, + {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, + {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, + {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, + {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, + {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, + {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, + {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, + {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, + {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, + {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, + {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, + {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, + {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, + {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, ] requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] rfc3986 = [ - {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, - {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] secretstorage = [ - {file = "SecretStorage-3.3.0-py3-none-any.whl", hash = "sha256:5c36f6537a523ec5f969ef9fad61c98eb9e017bc601d811e53aa25bece64892f"}, - {file = "SecretStorage-3.3.0.tar.gz", hash = "sha256:30cfdef28829dad64d6ea1ed08f8eff6aa115a77068926bcc9f5225d5a3246aa"}, + {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, + {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, ] semver = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-5.0.1-py2.7.egg", hash = "sha256:db4ab2e0c2644ba71b1e5212b14ff65dbf0af465796d314a75e0cf6128f605f7"}, - {file = "setuptools_scm-5.0.1-py2.py3-none-any.whl", hash = "sha256:62fa535edb31ece9fa65dc9dcb3056145b8020c8c26c0ef1018aef33db95c40d"}, - {file = "setuptools_scm-5.0.1-py3.5.egg", hash = "sha256:1fc4e25df445351d172bb4788f4d07f9e9ce0e8b7dee6b19584e46110172ca13"}, - {file = "setuptools_scm-5.0.1-py3.6.egg", hash = "sha256:e878036c2527dfd05818727846338be86b2be6955741b85fab2625f63d001021"}, - {file = "setuptools_scm-5.0.1-py3.7.egg", hash = "sha256:eb19b46816fc106a4c2d4180022687eab40f9773cf61390b845afb093d1f4ecd"}, - {file = "setuptools_scm-5.0.1-py3.8.egg", hash = "sha256:48b31488d089270500f120efea723968c01abd85fd4876043a3b7c7ef7d0b761"}, - {file = "setuptools_scm-5.0.1-py3.9.egg", hash = "sha256:b928021c4381f96d577847d540d6e03065f8f8851c768a0c9bc552d463bae0d4"}, - {file = "setuptools_scm-5.0.1.tar.gz", hash = "sha256:c85b6b46d0edd40d2301038cdea96bb6adc14d62ef943e75afb08b3e7bcf142a"}, + {file = "setuptools_scm-6.0.1-py3-none-any.whl", hash = "sha256:c3bd5f701c8def44a5c0bfe8d407bef3f80342217ef3492b951f3777bd2d915c"}, + {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] smmap = [ - {file = "smmap-3.0.5-py2.py3-none-any.whl", hash = "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714"}, - {file = "smmap-3.0.5.tar.gz", hash = "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50"}, + {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, + {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, +] +soupsieve = [ + {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"}, + {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, +] +tokenstream = [ + {file = "tokenstream-0.6.2-py3-none-any.whl", hash = "sha256:fe30bb66038673998e7d3290e622abaca5d2ed13edc8500cbae4b9f0d301b46c"}, + {file = "tokenstream-0.6.2.tar.gz", hash = "sha256:3ad0391f8d81b25f636c8abe0bdbf7ee34715812ef482a3ebe162e24f5a382b3"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +tomli = [ + {file = "tomli-1.1.0-py3-none-any.whl", hash = "sha256:f4a182048010e89cbec0ae4686b21f550a7f2903f665e34a6de58ec15424f919"}, + {file = "tomli-1.1.0.tar.gz", hash = "sha256:33d7984738f8bb699c9b0a816eb646a8178a69eaa792d258486776a5d21b8ca5"}, +] tomlkit = [ {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.56.0-py2.py3-none-any.whl", hash = "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a"}, - {file = "tqdm-4.56.0.tar.gz", hash = "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"}, + {file = "tqdm-4.61.2-py2.py3-none-any.whl", hash = "sha256:5aa445ea0ad8b16d82b15ab342de6b195a722d75fc1ef9934a46bba6feafbc64"}, + {file = "tqdm-4.61.2.tar.gz", hash = "sha256:8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"}, ] twine = [ - {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, - {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, + {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, + {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, + {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, + {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, + {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] urllib3 = [ - {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, - {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, + {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, + {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +wrapt = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] +zipp = [ + {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, + {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, +] diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ed2c33cff..c1c1838e5 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "mecha" version = "0.1.0" -description = "A flexible Minecraft command library" +description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" @@ -23,13 +23,17 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.31.3" +beet = ">=0.36.0" +tokenstream = ">=0.6.2" [tool.poetry.dev-dependencies] -black = "^21.6b0" -isort = "^5.9.1" +black = "^21.7b0" +isort = "^5.9.2" pytest = "^6.2.4" +pytest-insta = "^0.1.10" python-semantic-release = "^7.16.2" +mcwiki = "^0.2.0" +lectern = "^0.15.2" [tool.black] target-version = ["py38"] diff --git a/packages/mecha/pytest.ini b/packages/mecha/pytest.ini index c8cd4b380..24138b5b7 100644 --- a/packages/mecha/pytest.ini +++ b/packages/mecha/pytest.ini @@ -1,2 +1,3 @@ [pytest] -addopts = tests +addopts = tests mecha --doctest-modules +doctest_optionflags = NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py new file mode 100644 index 000000000..b452cdc3b --- /dev/null +++ b/packages/mecha/scripts.py @@ -0,0 +1,46 @@ +from pathlib import Path + +import click +import mcwiki +from beet import Function + +PROJECT_DIRECTORY = Path(__file__).parent + + +@click.group() +def cli(): + """A collection of utilities for the project.""" + + +@cli.command() +def download_wiki_examples(): + """Download command examples from the wiki.""" + generated_function = Function() + + commands = [ + "gamerule", + ] + + ignored_examples = { + "gamerule tntExplodes false", + } + + for command in commands: + page = mcwiki.load(f"commands/{command}") + examples = page.get("examples") + + if examples is not None: + for code in examples.extract_all(mcwiki.CODE): + if code.startswith("/"): + code = code[1:] + if code.startswith(command) and code not in ignored_examples: + generated_function.lines.append(code) + + generated_function.dump( + PROJECT_DIRECTORY / "mecha/resources", + "wiki_examples.mcfunction", + ) + + +if __name__ == "__main__": + cli() diff --git a/packages/mecha/tests/conftest.py b/packages/mecha/tests/conftest.py new file mode 100644 index 000000000..56d584cf6 --- /dev/null +++ b/packages/mecha/tests/conftest.py @@ -0,0 +1,8 @@ +import pytest + +from mecha import Mecha + + +@pytest.fixture(scope="session") +def mc(): + return Mecha() diff --git a/packages/mecha/tests/snapshots/parse__basic1__0.txt b/packages/mecha/tests/snapshots/parse__basic1__0.txt new file mode 100644 index 000000000..a5a8d4764 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__basic1__0.txt @@ -0,0 +1,9 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + identifier: 'gamerule:fallDamage:value' + arguments: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__basic2__0.txt b/packages/mecha/tests/snapshots/parse__basic2__0.txt new file mode 100644 index 000000000..aff43fd83 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__basic2__0.txt @@ -0,0 +1,23 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=57, lineno=4, colno=1) + filename: None + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + identifier: 'gamerule:doMobLoot:value' + arguments: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: False + + location: SourceLocation(pos=25, lineno=2, colno=1) + end_location: SourceLocation(pos=55, lineno=2, colno=31) + identifier: 'gamerule:doDaylightCycle:value' + arguments: + + location: SourceLocation(pos=50, lineno=2, colno=26) + end_location: SourceLocation(pos=55, lineno=2, colno=31) + value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__wiki_examples__0.txt b/packages/mecha/tests/snapshots/parse__wiki_examples__0.txt new file mode 100644 index 000000000..36c54c456 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__wiki_examples__0.txt @@ -0,0 +1,68 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=212, lineno=9, colno=1) + filename: None + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + identifier: 'gamerule:doDaylightCycle:value' + arguments: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + value: False + + location: SourceLocation(pos=31, lineno=2, colno=1) + end_location: SourceLocation(pos=65, lineno=2, colno=35) + identifier: 'gamerule:naturalRegeneration:value' + arguments: + + location: SourceLocation(pos=60, lineno=2, colno=30) + end_location: SourceLocation(pos=65, lineno=2, colno=35) + value: False + + location: SourceLocation(pos=66, lineno=3, colno=1) + end_location: SourceLocation(pos=92, lineno=3, colno=27) + identifier: 'gamerule:mobGriefing:value' + arguments: + + location: SourceLocation(pos=87, lineno=3, colno=22) + end_location: SourceLocation(pos=92, lineno=3, colno=27) + value: False + + location: SourceLocation(pos=93, lineno=4, colno=1) + end_location: SourceLocation(pos=122, lineno=4, colno=30) + identifier: 'gamerule:doWeatherCycle:value' + arguments: + + location: SourceLocation(pos=117, lineno=4, colno=25) + end_location: SourceLocation(pos=122, lineno=4, colno=30) + value: False + + location: SourceLocation(pos=123, lineno=5, colno=1) + end_location: SourceLocation(pos=150, lineno=5, colno=28) + identifier: 'gamerule:keepInventory:value' + arguments: + + location: SourceLocation(pos=146, lineno=5, colno=24) + end_location: SourceLocation(pos=150, lineno=5, colno=28) + value: True + + location: SourceLocation(pos=151, lineno=6, colno=1) + end_location: SourceLocation(pos=184, lineno=6, colno=34) + identifier: 'gamerule:commandBlockOutput:value' + arguments: + + location: SourceLocation(pos=179, lineno=6, colno=29) + end_location: SourceLocation(pos=184, lineno=6, colno=34) + value: False + + location: SourceLocation(pos=185, lineno=7, colno=1) + end_location: SourceLocation(pos=210, lineno=7, colno=26) + identifier: 'gamerule:doInsomnia:value' + arguments: + + location: SourceLocation(pos=205, lineno=7, colno=21) + end_location: SourceLocation(pos=210, lineno=7, colno=26) + value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json new file mode 100644 index 000000000..ed075e4d3 --- /dev/null +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -0,0 +1,792 @@ +[ + "advancement:grant:targets:only:advancement", + "advancement:grant:targets:only:advancement:criterion", + "advancement:grant:targets:from:advancement", + "advancement:grant:targets:until:advancement", + "advancement:grant:targets:through:advancement", + "advancement:grant:targets:everything", + "advancement:revoke:targets:only:advancement", + "advancement:revoke:targets:only:advancement:criterion", + "advancement:revoke:targets:from:advancement", + "advancement:revoke:targets:until:advancement", + "advancement:revoke:targets:through:advancement", + "advancement:revoke:targets:everything", + "attribute:target:attribute:get", + "attribute:target:attribute:get:scale", + "attribute:target:attribute:base:set:value", + "attribute:target:attribute:base:get", + "attribute:target:attribute:base:get:scale", + "attribute:target:attribute:modifier:add:uuid:name:value:add", + "attribute:target:attribute:modifier:add:uuid:name:value:multiply", + "attribute:target:attribute:modifier:add:uuid:name:value:multiply_base", + "attribute:target:attribute:modifier:remove:uuid", + "attribute:target:attribute:modifier:value:get:uuid", + "attribute:target:attribute:modifier:value:get:uuid:scale", + "execute:run:subcommand", + "execute:if:block:pos:block:subcommand", + "execute:if:block:pos:block", + "execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:=:source:sourceObjective", + "execute:if:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:<:source:sourceObjective", + "execute:if:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:<=:source:sourceObjective", + "execute:if:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>:source:sourceObjective", + "execute:if:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>=:source:sourceObjective", + "execute:if:score:target:targetObjective:matches:range:subcommand", + "execute:if:score:target:targetObjective:matches:range", + "execute:if:blocks:start:end:destination:all:subcommand", + "execute:if:blocks:start:end:destination:all", + "execute:if:blocks:start:end:destination:masked:subcommand", + "execute:if:blocks:start:end:destination:masked", + "execute:if:entity:entities:subcommand", + "execute:if:entity:entities", + "execute:if:predicate:predicate:subcommand", + "execute:if:predicate:predicate", + "execute:if:data:entity:source:path:subcommand", + "execute:if:data:entity:source:path", + "execute:if:data:block:sourcePos:path:subcommand", + "execute:if:data:block:sourcePos:path", + "execute:if:data:storage:source:path:subcommand", + "execute:if:data:storage:source:path", + "execute:unless:block:pos:block:subcommand", + "execute:unless:block:pos:block", + "execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:=:source:sourceObjective", + "execute:unless:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:<:source:sourceObjective", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective", + "execute:unless:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>:source:sourceObjective", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective", + "execute:unless:score:target:targetObjective:matches:range:subcommand", + "execute:unless:score:target:targetObjective:matches:range", + "execute:unless:blocks:start:end:destination:all:subcommand", + "execute:unless:blocks:start:end:destination:all", + "execute:unless:blocks:start:end:destination:masked:subcommand", + "execute:unless:blocks:start:end:destination:masked", + "execute:unless:entity:entities:subcommand", + "execute:unless:entity:entities", + "execute:unless:predicate:predicate:subcommand", + "execute:unless:predicate:predicate", + "execute:unless:data:entity:source:path:subcommand", + "execute:unless:data:entity:source:path", + "execute:unless:data:block:sourcePos:path:subcommand", + "execute:unless:data:block:sourcePos:path", + "execute:unless:data:storage:source:path:subcommand", + "execute:unless:data:storage:source:path", + "execute:as:targets:subcommand", + "execute:at:targets:subcommand", + "execute:store:result:score:targets:objective:subcommand", + "execute:store:result:bossbar:id:value:subcommand", + "execute:store:result:bossbar:id:max:subcommand", + "execute:store:result:entity:target:path:int:scale:subcommand", + "execute:store:result:entity:target:path:float:scale:subcommand", + "execute:store:result:entity:target:path:short:scale:subcommand", + "execute:store:result:entity:target:path:long:scale:subcommand", + "execute:store:result:entity:target:path:double:scale:subcommand", + "execute:store:result:entity:target:path:byte:scale:subcommand", + "execute:store:result:block:targetPos:path:int:scale:subcommand", + "execute:store:result:block:targetPos:path:float:scale:subcommand", + "execute:store:result:block:targetPos:path:short:scale:subcommand", + "execute:store:result:block:targetPos:path:long:scale:subcommand", + "execute:store:result:block:targetPos:path:double:scale:subcommand", + "execute:store:result:block:targetPos:path:byte:scale:subcommand", + "execute:store:result:storage:target:path:int:scale:subcommand", + "execute:store:result:storage:target:path:float:scale:subcommand", + "execute:store:result:storage:target:path:short:scale:subcommand", + "execute:store:result:storage:target:path:long:scale:subcommand", + "execute:store:result:storage:target:path:double:scale:subcommand", + "execute:store:result:storage:target:path:byte:scale:subcommand", + "execute:store:success:score:targets:objective:subcommand", + "execute:store:success:bossbar:id:value:subcommand", + "execute:store:success:bossbar:id:max:subcommand", + "execute:store:success:entity:target:path:int:scale:subcommand", + "execute:store:success:entity:target:path:float:scale:subcommand", + "execute:store:success:entity:target:path:short:scale:subcommand", + "execute:store:success:entity:target:path:long:scale:subcommand", + "execute:store:success:entity:target:path:double:scale:subcommand", + "execute:store:success:entity:target:path:byte:scale:subcommand", + "execute:store:success:block:targetPos:path:int:scale:subcommand", + "execute:store:success:block:targetPos:path:float:scale:subcommand", + "execute:store:success:block:targetPos:path:short:scale:subcommand", + "execute:store:success:block:targetPos:path:long:scale:subcommand", + "execute:store:success:block:targetPos:path:double:scale:subcommand", + "execute:store:success:block:targetPos:path:byte:scale:subcommand", + "execute:store:success:storage:target:path:int:scale:subcommand", + "execute:store:success:storage:target:path:float:scale:subcommand", + "execute:store:success:storage:target:path:short:scale:subcommand", + "execute:store:success:storage:target:path:long:scale:subcommand", + "execute:store:success:storage:target:path:double:scale:subcommand", + "execute:store:success:storage:target:path:byte:scale:subcommand", + "execute:positioned:pos:subcommand", + "execute:positioned:as:targets:subcommand", + "execute:rotated:rot:subcommand", + "execute:rotated:as:targets:subcommand", + "execute:facing:entity:targets:anchor:subcommand", + "execute:facing:pos:subcommand", + "execute:align:axes:subcommand", + "execute:anchored:anchor:subcommand", + "execute:in:dimension:subcommand", + "bossbar:add:id:name", + "bossbar:remove:id", + "bossbar:list", + "bossbar:set:id:name:name", + "bossbar:set:id:color:pink", + "bossbar:set:id:color:blue", + "bossbar:set:id:color:red", + "bossbar:set:id:color:green", + "bossbar:set:id:color:yellow", + "bossbar:set:id:color:purple", + "bossbar:set:id:color:white", + "bossbar:set:id:style:progress", + "bossbar:set:id:style:notched_6", + "bossbar:set:id:style:notched_10", + "bossbar:set:id:style:notched_12", + "bossbar:set:id:style:notched_20", + "bossbar:set:id:value:value", + "bossbar:set:id:max:max", + "bossbar:set:id:visible:visible", + "bossbar:set:id:players", + "bossbar:set:id:players:targets", + "bossbar:get:id:value", + "bossbar:get:id:max", + "bossbar:get:id:visible", + "bossbar:get:id:players", + "clear", + "clear:targets", + "clear:targets:item", + "clear:targets:item:maxCount", + "clone:begin:end:destination", + "clone:begin:end:destination:replace", + "clone:begin:end:destination:replace:force", + "clone:begin:end:destination:replace:move", + "clone:begin:end:destination:replace:normal", + "clone:begin:end:destination:masked", + "clone:begin:end:destination:masked:force", + "clone:begin:end:destination:masked:move", + "clone:begin:end:destination:masked:normal", + "clone:begin:end:destination:filtered:filter", + "clone:begin:end:destination:filtered:filter:force", + "clone:begin:end:destination:filtered:filter:move", + "clone:begin:end:destination:filtered:filter:normal", + "data:merge:entity:target:nbt", + "data:merge:block:targetPos:nbt", + "data:merge:storage:target:nbt", + "data:get:entity:target", + "data:get:entity:target:path", + "data:get:entity:target:path:scale", + "data:get:block:targetPos", + "data:get:block:targetPos:path", + "data:get:block:targetPos:path:scale", + "data:get:storage:target", + "data:get:storage:target:path", + "data:get:storage:target:path:scale", + "data:remove:entity:target:path", + "data:remove:block:targetPos:path", + "data:remove:storage:target:path", + "data:modify:entity:target:targetPath:insert:index:from:entity:source", + "data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", + "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:insert:index:from:storage:source", + "data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:value:value", + "data:modify:entity:target:targetPath:prepend:from:entity:source", + "data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:from:block:sourcePos", + "data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:prepend:from:storage:source", + "data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:value:value", + "data:modify:entity:target:targetPath:append:from:entity:source", + "data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:append:from:block:sourcePos", + "data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:append:from:storage:source", + "data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:value:value", + "data:modify:entity:target:targetPath:set:from:entity:source", + "data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:set:from:block:sourcePos", + "data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:set:from:storage:source", + "data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:value:value", + "data:modify:entity:target:targetPath:merge:from:entity:source", + "data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:merge:from:block:sourcePos", + "data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:merge:from:storage:source", + "data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:value:value", + "data:modify:block:targetPos:targetPath:insert:index:from:entity:source", + "data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:from:storage:source", + "data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:value:value", + "data:modify:block:targetPos:targetPath:prepend:from:entity:source", + "data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:from:storage:source", + "data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:value:value", + "data:modify:block:targetPos:targetPath:append:from:entity:source", + "data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:append:from:storage:source", + "data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:value:value", + "data:modify:block:targetPos:targetPath:set:from:entity:source", + "data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:set:from:storage:source", + "data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:value:value", + "data:modify:block:targetPos:targetPath:merge:from:entity:source", + "data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:storage:source", + "data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:value:value", + "data:modify:storage:target:targetPath:insert:index:from:entity:source", + "data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", + "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:insert:index:from:storage:source", + "data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:value:value", + "data:modify:storage:target:targetPath:prepend:from:entity:source", + "data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:from:block:sourcePos", + "data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:prepend:from:storage:source", + "data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:value:value", + "data:modify:storage:target:targetPath:append:from:entity:source", + "data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:append:from:block:sourcePos", + "data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:append:from:storage:source", + "data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:value:value", + "data:modify:storage:target:targetPath:set:from:entity:source", + "data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:set:from:block:sourcePos", + "data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:set:from:storage:source", + "data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:set:value:value", + "data:modify:storage:target:targetPath:merge:from:entity:source", + "data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:merge:from:block:sourcePos", + "data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:merge:from:storage:source", + "data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:value:value", + "datapack:enable:name", + "datapack:enable:name:after:existing", + "datapack:enable:name:before:existing", + "datapack:enable:name:last", + "datapack:enable:name:first", + "datapack:disable:name", + "datapack:list", + "datapack:list:available", + "datapack:list:enabled", + "debug:start", + "debug:stop", + "debug:function:name", + "defaultgamemode:survival", + "defaultgamemode:creative", + "defaultgamemode:adventure", + "defaultgamemode:spectator", + "difficulty", + "difficulty:peaceful", + "difficulty:easy", + "difficulty:normal", + "difficulty:hard", + "effect:clear", + "effect:clear:targets", + "effect:clear:targets:effect", + "effect:give:targets:effect", + "effect:give:targets:effect:seconds", + "effect:give:targets:effect:seconds:amplifier", + "effect:give:targets:effect:seconds:amplifier:hideParticles", + "me:action", + "enchant:targets:enchantment", + "enchant:targets:enchantment:level", + "experience:add:targets:amount", + "experience:add:targets:amount:points", + "experience:add:targets:amount:levels", + "experience:set:targets:amount", + "experience:set:targets:amount:points", + "experience:set:targets:amount:levels", + "experience:query:targets:points", + "experience:query:targets:levels", + "xp:add:targets:amount", + "xp:add:targets:amount:points", + "xp:add:targets:amount:levels", + "xp:set:targets:amount", + "xp:set:targets:amount:points", + "xp:set:targets:amount:levels", + "xp:query:targets:points", + "xp:query:targets:levels", + "fill:from:to:block", + "fill:from:to:block:replace", + "fill:from:to:block:replace:filter", + "fill:from:to:block:keep", + "fill:from:to:block:outline", + "fill:from:to:block:hollow", + "fill:from:to:block:destroy", + "forceload:add:from", + "forceload:add:from:to", + "forceload:remove:from", + "forceload:remove:from:to", + "forceload:remove:all", + "forceload:query", + "forceload:query:pos", + "function:name", + "gamemode:survival", + "gamemode:survival:target", + "gamemode:creative", + "gamemode:creative:target", + "gamemode:adventure", + "gamemode:adventure:target", + "gamemode:spectator", + "gamemode:spectator:target", + "gamerule:announceAdvancements", + "gamerule:announceAdvancements:value", + "gamerule:commandBlockOutput", + "gamerule:commandBlockOutput:value", + "gamerule:disableElytraMovementCheck", + "gamerule:disableElytraMovementCheck:value", + "gamerule:disableRaids", + "gamerule:disableRaids:value", + "gamerule:doDaylightCycle", + "gamerule:doDaylightCycle:value", + "gamerule:doEntityDrops", + "gamerule:doEntityDrops:value", + "gamerule:doFireTick", + "gamerule:doFireTick:value", + "gamerule:doImmediateRespawn", + "gamerule:doImmediateRespawn:value", + "gamerule:doInsomnia", + "gamerule:doInsomnia:value", + "gamerule:doLimitedCrafting", + "gamerule:doLimitedCrafting:value", + "gamerule:doMobLoot", + "gamerule:doMobLoot:value", + "gamerule:doMobSpawning", + "gamerule:doMobSpawning:value", + "gamerule:doPatrolSpawning", + "gamerule:doPatrolSpawning:value", + "gamerule:doTileDrops", + "gamerule:doTileDrops:value", + "gamerule:doTraderSpawning", + "gamerule:doTraderSpawning:value", + "gamerule:doWeatherCycle", + "gamerule:doWeatherCycle:value", + "gamerule:drowningDamage", + "gamerule:drowningDamage:value", + "gamerule:fallDamage", + "gamerule:fallDamage:value", + "gamerule:fireDamage", + "gamerule:fireDamage:value", + "gamerule:forgiveDeadPlayers", + "gamerule:forgiveDeadPlayers:value", + "gamerule:freezeDamage", + "gamerule:freezeDamage:value", + "gamerule:keepInventory", + "gamerule:keepInventory:value", + "gamerule:logAdminCommands", + "gamerule:logAdminCommands:value", + "gamerule:maxCommandChainLength", + "gamerule:maxCommandChainLength:value", + "gamerule:maxEntityCramming", + "gamerule:maxEntityCramming:value", + "gamerule:mobGriefing", + "gamerule:mobGriefing:value", + "gamerule:naturalRegeneration", + "gamerule:naturalRegeneration:value", + "gamerule:playersSleepingPercentage", + "gamerule:playersSleepingPercentage:value", + "gamerule:randomTickSpeed", + "gamerule:randomTickSpeed:value", + "gamerule:reducedDebugInfo", + "gamerule:reducedDebugInfo:value", + "gamerule:sendCommandFeedback", + "gamerule:sendCommandFeedback:value", + "gamerule:showDeathMessages", + "gamerule:showDeathMessages:value", + "gamerule:spawnRadius", + "gamerule:spawnRadius:value", + "gamerule:spectatorsGenerateChunks", + "gamerule:spectatorsGenerateChunks:value", + "gamerule:universalAnger", + "gamerule:universalAnger:value", + "give:targets:item", + "give:targets:item:count", + "help", + "help:command", + "item:replace:block:pos:slot:with:item", + "item:replace:block:pos:slot:with:item:count", + "item:replace:block:pos:slot:from:block:source:sourceSlot", + "item:replace:block:pos:slot:from:block:source:sourceSlot:modifier", + "item:replace:block:pos:slot:from:entity:source:sourceSlot", + "item:replace:block:pos:slot:from:entity:source:sourceSlot:modifier", + "item:replace:entity:targets:slot:with:item", + "item:replace:entity:targets:slot:with:item:count", + "item:replace:entity:targets:slot:from:block:source:sourceSlot", + "item:replace:entity:targets:slot:from:block:source:sourceSlot:modifier", + "item:replace:entity:targets:slot:from:entity:source:sourceSlot", + "item:replace:entity:targets:slot:from:entity:source:sourceSlot:modifier", + "item:modify:block:pos:slot:modifier", + "item:modify:entity:targets:slot:modifier", + "kick:targets", + "kick:targets:reason", + "kill", + "kill:targets", + "list", + "list:uuids", + "locate:pillager_outpost", + "locate:mineshaft", + "locate:mansion", + "locate:jungle_pyramid", + "locate:desert_pyramid", + "locate:igloo", + "locate:ruined_portal", + "locate:shipwreck", + "locate:swamp_hut", + "locate:stronghold", + "locate:monument", + "locate:ocean_ruin", + "locate:fortress", + "locate:endcity", + "locate:buried_treasure", + "locate:village", + "locate:nether_fossil", + "locate:bastion_remnant", + "locatebiome:biome", + "loot:replace:entity:entities:slot:fish:loot_table:pos", + "loot:replace:entity:entities:slot:fish:loot_table:pos:tool", + "loot:replace:entity:entities:slot:fish:loot_table:pos:mainhand", + "loot:replace:entity:entities:slot:fish:loot_table:pos:offhand", + "loot:replace:entity:entities:slot:loot:loot_table", + "loot:replace:entity:entities:slot:kill:target", + "loot:replace:entity:entities:slot:mine:pos", + "loot:replace:entity:entities:slot:mine:pos:tool", + "loot:replace:entity:entities:slot:mine:pos:mainhand", + "loot:replace:entity:entities:slot:mine:pos:offhand", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:tool", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:mainhand", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:offhand", + "loot:replace:entity:entities:slot:count:loot:loot_table", + "loot:replace:entity:entities:slot:count:kill:target", + "loot:replace:entity:entities:slot:count:mine:pos", + "loot:replace:entity:entities:slot:count:mine:pos:tool", + "loot:replace:entity:entities:slot:count:mine:pos:mainhand", + "loot:replace:entity:entities:slot:count:mine:pos:offhand", + "loot:replace:block:targetPos:slot:fish:loot_table:pos", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:tool", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:mainhand", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:offhand", + "loot:replace:block:targetPos:slot:loot:loot_table", + "loot:replace:block:targetPos:slot:kill:target", + "loot:replace:block:targetPos:slot:mine:pos", + "loot:replace:block:targetPos:slot:mine:pos:tool", + "loot:replace:block:targetPos:slot:mine:pos:mainhand", + "loot:replace:block:targetPos:slot:mine:pos:offhand", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:tool", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:mainhand", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:offhand", + "loot:replace:block:targetPos:slot:count:loot:loot_table", + "loot:replace:block:targetPos:slot:count:kill:target", + "loot:replace:block:targetPos:slot:count:mine:pos", + "loot:replace:block:targetPos:slot:count:mine:pos:tool", + "loot:replace:block:targetPos:slot:count:mine:pos:mainhand", + "loot:replace:block:targetPos:slot:count:mine:pos:offhand", + "loot:insert:targetPos:fish:loot_table:pos", + "loot:insert:targetPos:fish:loot_table:pos:tool", + "loot:insert:targetPos:fish:loot_table:pos:mainhand", + "loot:insert:targetPos:fish:loot_table:pos:offhand", + "loot:insert:targetPos:loot:loot_table", + "loot:insert:targetPos:kill:target", + "loot:insert:targetPos:mine:pos", + "loot:insert:targetPos:mine:pos:tool", + "loot:insert:targetPos:mine:pos:mainhand", + "loot:insert:targetPos:mine:pos:offhand", + "loot:give:players:fish:loot_table:pos", + "loot:give:players:fish:loot_table:pos:tool", + "loot:give:players:fish:loot_table:pos:mainhand", + "loot:give:players:fish:loot_table:pos:offhand", + "loot:give:players:loot:loot_table", + "loot:give:players:kill:target", + "loot:give:players:mine:pos", + "loot:give:players:mine:pos:tool", + "loot:give:players:mine:pos:mainhand", + "loot:give:players:mine:pos:offhand", + "loot:spawn:targetPos:fish:loot_table:pos", + "loot:spawn:targetPos:fish:loot_table:pos:tool", + "loot:spawn:targetPos:fish:loot_table:pos:mainhand", + "loot:spawn:targetPos:fish:loot_table:pos:offhand", + "loot:spawn:targetPos:loot:loot_table", + "loot:spawn:targetPos:kill:target", + "loot:spawn:targetPos:mine:pos", + "loot:spawn:targetPos:mine:pos:tool", + "loot:spawn:targetPos:mine:pos:mainhand", + "loot:spawn:targetPos:mine:pos:offhand", + "msg:targets:message", + "tell:targets:message", + "w:targets:message", + "particle:name", + "particle:name:pos", + "particle:name:pos:delta:speed:count", + "particle:name:pos:delta:speed:count:force", + "particle:name:pos:delta:speed:count:force:viewers", + "particle:name:pos:delta:speed:count:normal", + "particle:name:pos:delta:speed:count:normal:viewers", + "playsound:sound:master:targets", + "playsound:sound:master:targets:pos", + "playsound:sound:master:targets:pos:volume", + "playsound:sound:master:targets:pos:volume:pitch", + "playsound:sound:master:targets:pos:volume:pitch:minVolume", + "playsound:sound:music:targets", + "playsound:sound:music:targets:pos", + "playsound:sound:music:targets:pos:volume", + "playsound:sound:music:targets:pos:volume:pitch", + "playsound:sound:music:targets:pos:volume:pitch:minVolume", + "playsound:sound:record:targets", + "playsound:sound:record:targets:pos", + "playsound:sound:record:targets:pos:volume", + "playsound:sound:record:targets:pos:volume:pitch", + "playsound:sound:record:targets:pos:volume:pitch:minVolume", + "playsound:sound:weather:targets", + "playsound:sound:weather:targets:pos", + "playsound:sound:weather:targets:pos:volume", + "playsound:sound:weather:targets:pos:volume:pitch", + "playsound:sound:weather:targets:pos:volume:pitch:minVolume", + "playsound:sound:block:targets", + "playsound:sound:block:targets:pos", + "playsound:sound:block:targets:pos:volume", + "playsound:sound:block:targets:pos:volume:pitch", + "playsound:sound:block:targets:pos:volume:pitch:minVolume", + "playsound:sound:hostile:targets", + "playsound:sound:hostile:targets:pos", + "playsound:sound:hostile:targets:pos:volume", + "playsound:sound:hostile:targets:pos:volume:pitch", + "playsound:sound:hostile:targets:pos:volume:pitch:minVolume", + "playsound:sound:neutral:targets", + "playsound:sound:neutral:targets:pos", + "playsound:sound:neutral:targets:pos:volume", + "playsound:sound:neutral:targets:pos:volume:pitch", + "playsound:sound:neutral:targets:pos:volume:pitch:minVolume", + "playsound:sound:player:targets", + "playsound:sound:player:targets:pos", + "playsound:sound:player:targets:pos:volume", + "playsound:sound:player:targets:pos:volume:pitch", + "playsound:sound:player:targets:pos:volume:pitch:minVolume", + "playsound:sound:ambient:targets", + "playsound:sound:ambient:targets:pos", + "playsound:sound:ambient:targets:pos:volume", + "playsound:sound:ambient:targets:pos:volume:pitch", + "playsound:sound:ambient:targets:pos:volume:pitch:minVolume", + "playsound:sound:voice:targets", + "playsound:sound:voice:targets:pos", + "playsound:sound:voice:targets:pos:volume", + "playsound:sound:voice:targets:pos:volume:pitch", + "playsound:sound:voice:targets:pos:volume:pitch:minVolume", + "reload", + "recipe:give:targets:recipe", + "recipe:give:targets:*", + "recipe:take:targets:recipe", + "recipe:take:targets:*", + "say:message", + "schedule:function:function:time", + "schedule:function:function:time:append", + "schedule:function:function:time:replace", + "schedule:clear:function", + "scoreboard:objectives:list", + "scoreboard:objectives:add:objective:criteria", + "scoreboard:objectives:add:objective:criteria:displayName", + "scoreboard:objectives:modify:objective:displayname:displayName", + "scoreboard:objectives:modify:objective:rendertype:integer", + "scoreboard:objectives:modify:objective:rendertype:hearts", + "scoreboard:objectives:remove:objective", + "scoreboard:objectives:setdisplay:slot", + "scoreboard:objectives:setdisplay:slot:objective", + "scoreboard:players:list", + "scoreboard:players:list:target", + "scoreboard:players:set:targets:objective:score", + "scoreboard:players:get:target:objective", + "scoreboard:players:add:targets:objective:score", + "scoreboard:players:remove:targets:objective:score", + "scoreboard:players:reset:targets", + "scoreboard:players:reset:targets:objective", + "scoreboard:players:enable:targets:objective", + "scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective", + "seed", + "setblock:pos:block", + "setblock:pos:block:destroy", + "setblock:pos:block:keep", + "setblock:pos:block:replace", + "spawnpoint", + "spawnpoint:targets", + "spawnpoint:targets:pos", + "spawnpoint:targets:pos:angle", + "setworldspawn", + "setworldspawn:pos", + "setworldspawn:pos:angle", + "spectate", + "spectate:target", + "spectate:target:player", + "spreadplayers:center:spreadDistance:maxRange:respectTeams:targets", + "spreadplayers:center:spreadDistance:maxRange:under:maxHeight:respectTeams:targets", + "stopsound:targets", + "stopsound:targets:*:sound", + "stopsound:targets:master", + "stopsound:targets:master:sound", + "stopsound:targets:music", + "stopsound:targets:music:sound", + "stopsound:targets:record", + "stopsound:targets:record:sound", + "stopsound:targets:weather", + "stopsound:targets:weather:sound", + "stopsound:targets:block", + "stopsound:targets:block:sound", + "stopsound:targets:hostile", + "stopsound:targets:hostile:sound", + "stopsound:targets:neutral", + "stopsound:targets:neutral:sound", + "stopsound:targets:player", + "stopsound:targets:player:sound", + "stopsound:targets:ambient", + "stopsound:targets:ambient:sound", + "stopsound:targets:voice", + "stopsound:targets:voice:sound", + "summon:entity", + "summon:entity:pos", + "summon:entity:pos:nbt", + "tag:targets:add:name", + "tag:targets:remove:name", + "tag:targets:list", + "team:list", + "team:list:team", + "team:add:team", + "team:add:team:displayName", + "team:remove:team", + "team:empty:team", + "team:join:team", + "team:join:team:members", + "team:leave:members", + "team:modify:team:displayName:displayName", + "team:modify:team:color:value", + "team:modify:team:friendlyFire:allowed", + "team:modify:team:seeFriendlyInvisibles:allowed", + "team:modify:team:nametagVisibility:never", + "team:modify:team:nametagVisibility:hideForOtherTeams", + "team:modify:team:nametagVisibility:hideForOwnTeam", + "team:modify:team:nametagVisibility:always", + "team:modify:team:deathMessageVisibility:never", + "team:modify:team:deathMessageVisibility:hideForOtherTeams", + "team:modify:team:deathMessageVisibility:hideForOwnTeam", + "team:modify:team:deathMessageVisibility:always", + "team:modify:team:collisionRule:never", + "team:modify:team:collisionRule:pushOwnTeam", + "team:modify:team:collisionRule:pushOtherTeams", + "team:modify:team:collisionRule:always", + "team:modify:team:prefix:prefix", + "team:modify:team:suffix:suffix", + "teammsg:message", + "tm:message", + "teleport:location", + "teleport:destination", + "teleport:targets:location", + "teleport:targets:location:rotation", + "teleport:targets:location:facing:entity:facingEntity", + "teleport:targets:location:facing:entity:facingEntity:facingAnchor", + "teleport:targets:location:facing:facingLocation", + "teleport:targets:destination", + "tp:location", + "tp:destination", + "tp:targets:location", + "tp:targets:location:rotation", + "tp:targets:location:facing:entity:facingEntity", + "tp:targets:location:facing:entity:facingEntity:facingAnchor", + "tp:targets:location:facing:facingLocation", + "tp:targets:destination", + "tellraw:targets:message", + "time:set:day", + "time:set:noon", + "time:set:night", + "time:set:midnight", + "time:set:time", + "time:add:time", + "time:query:daytime", + "time:query:gametime", + "time:query:day", + "title:targets:clear", + "title:targets:reset", + "title:targets:title:title", + "title:targets:subtitle:title", + "title:targets:actionbar:title", + "title:targets:times:fadeIn:stay:fadeOut", + "trigger:objective", + "trigger:objective:add:value", + "trigger:objective:set:value", + "weather:clear", + "weather:clear:duration", + "weather:rain", + "weather:rain:duration", + "weather:thunder", + "weather:thunder:duration", + "worldborder:add:distance", + "worldborder:add:distance:time", + "worldborder:set:distance", + "worldborder:set:distance:time", + "worldborder:center:pos", + "worldborder:damage:amount:damagePerBlock", + "worldborder:damage:buffer:distance", + "worldborder:get", + "worldborder:warning:distance:distance", + "worldborder:warning:time:time", + "ban-ip:target", + "ban-ip:target:reason", + "banlist", + "banlist:ips", + "banlist:players", + "ban:targets", + "ban:targets:reason", + "deop:targets", + "op:targets", + "pardon:targets", + "pardon-ip:target", + "perf:start", + "perf:stop", + "save-all", + "save-all:flush", + "save-off", + "save-on", + "setidletimeout:minutes", + "stop", + "whitelist:on", + "whitelist:off", + "whitelist:list", + "whitelist:add:targets", + "whitelist:remove:targets", + "whitelist:reload", + "publish", + "publish:port", + "execute:subcommand" +] diff --git a/packages/mecha/tests/test_api.py b/packages/mecha/tests/test_api.py deleted file mode 100644 index d795b896e..000000000 --- a/packages/mecha/tests/test_api.py +++ /dev/null @@ -1,43 +0,0 @@ -from beet import DataPack - -from mecha import Mecha - - -def test_init_data_pack(): - pack = DataPack("demo") - mc = Mecha(pack) - - assert mc.default_namespace == "demo" - assert mc.default_path == "" - assert mc.data_pack is pack - - -def test_init_data_pack_with_args(): - pack = DataPack("demo") - mc = Mecha(pack, default_namespace="hello", default_path="world") - - assert mc.default_namespace == "hello" - assert mc.default_path == "world" - assert mc.data_pack is pack - - -def test_resolve_path(): - mc = Mecha(DataPack("demo")) - - assert mc.resolve_path("foo") == "demo:foo" - assert mc.resolve_path("foo/bar") == "demo:foo/bar" - assert mc.resolve_path(":foo") == "demo:foo" - assert mc.resolve_path(":foo/bar") == "demo:foo/bar" - assert mc.resolve_path("thing:foo") == "thing:foo" - assert mc.resolve_path("thing:foo/bar") == "thing:foo/bar" - - -def test_resolve_path_with_root(): - mc = Mecha(DataPack("demo"), default_path="root") - - assert mc.resolve_path("foo") == "demo:root/foo" - assert mc.resolve_path("foo/bar") == "demo:root/foo/bar" - assert mc.resolve_path(":foo") == "demo:foo" - assert mc.resolve_path(":foo/bar") == "demo:foo/bar" - assert mc.resolve_path("thing:foo") == "thing:foo" - assert mc.resolve_path("thing:foo/bar") == "thing:foo/bar" diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py new file mode 100644 index 000000000..661963499 --- /dev/null +++ b/packages/mecha/tests/test_parse.py @@ -0,0 +1,25 @@ +from importlib.resources import read_text + +from beet import Function +from pytest_insta import SnapshotFixture + +from mecha import Mecha + + +def test_basic1(snapshot: SnapshotFixture, mc: Mecha): + assert snapshot() == mc.parse_command("gamerule fallDamage false").dump() + + +def test_basic2(snapshot: SnapshotFixture, mc: Mecha): + function = Function( + [ + "gamerule doMobLoot false", + "gamerule doDaylightCycle false", + ] + ) + assert snapshot() == mc.parse_function(function).dump() + + +def test_wiki_examples(snapshot: SnapshotFixture, mc: Mecha): + function = read_text("mecha.resources", "wiki_examples.mcfunction") + assert snapshot() == mc.parse_function(function).dump() diff --git a/packages/mecha/tests/test_spec.py b/packages/mecha/tests/test_spec.py new file mode 100644 index 000000000..6ce292060 --- /dev/null +++ b/packages/mecha/tests/test_spec.py @@ -0,0 +1,7 @@ +from pytest_insta import SnapshotFixture + +from mecha import Mecha + + +def test_prototypes(snapshot: SnapshotFixture, mc: Mecha): + assert snapshot("json") == list(mc.spec.prototypes) From 6c73edfb59f4603fb1c05609e82b6d8a78958fb9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 24 Jul 2021 06:47:58 +0000 Subject: [PATCH 0258/1554] 0.2.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index e3665f094..899414949 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.2.0 (2021-07-24) +### Feature +* Add initial parser implementation ([`117d76d`](https://github.com/vberlier/mecha/commit/117d76d807b5a27e8b83a9cebd63c0d8ec70d8d4)) + ## v0.1.0 (2021-06-12) ### Feature * Start working on a parser ([`739335c`](https://github.com/vberlier/mecha/commit/739335c4d2f1d09136291e03c2324491eb69279b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index b62e0d1e4..364930dd5 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.1.0" +__version__ = "0.2.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c1c1838e5..57ec6e1c3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.1.0" +version = "0.2.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 293a35f51ad37c8351c57c9d4cf6d10d655ab9da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 26 Aug 2021 18:00:29 +0200 Subject: [PATCH 0259/1554] chore: download argument type examples and setup tests --- packages/mecha/mecha/__init__.py | 1 + packages/mecha/mecha/api.py | 12 +- packages/mecha/mecha/parse.py | 3 +- packages/mecha/mecha/resources/__init__.py | 19 ++ .../mecha/resources/wiki_argument_types.json | 247 ++++++++++++++++++ packages/mecha/mecha/spec.py | 4 +- packages/mecha/scripts.py | 20 ++ ...argument_types_brigadier_bool_false__0.txt | 4 + ..._argument_types_brigadier_bool_true__0.txt | 4 + packages/mecha/tests/test_parse.py | 31 ++- 10 files changed, 332 insertions(+), 13 deletions(-) create mode 100644 packages/mecha/mecha/resources/wiki_argument_types.json create mode 100644 packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 364930dd5..05539cfd4 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -3,4 +3,5 @@ from .api import * from .parse import * +from .resources import * from .spec import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index fdd0485fc..6fb70546f 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -25,6 +25,12 @@ class Mecha: default_factory=lambda: CommandSpecification(parsers=get_default_parsers()) ) + def create_token_stream(self, text: str) -> TokenStream: + """Instantiate a token stream for parsing the given input.""" + stream = TokenStream(text) + stream.data["spec"] = self.spec + return stream + def parse_function( self, function: Union[TextFileBase[Any], str, List[str]], @@ -37,10 +43,8 @@ def parse_function( if not filename and function.source_path: filename = str(function.source_path) - stream = TokenStream(function.text + "\n") - - with stream.provide(spec=self.spec): - return replace(delegate(stream, "root"), filename=filename) + ast = delegate(self.create_token_stream(function.text + "\n"), "root") + return replace(ast, filename=filename) def parse_command(self, command: str) -> AstCommand: """Parse a single command from a string and return the ast.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 520fd63ca..8fe8c714e 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -8,7 +8,6 @@ ] -from contextlib import nullcontext from typing import TYPE_CHECKING, Any, Dict, List, Tuple from tokenstream import SourceLocation, TokenStream @@ -83,7 +82,7 @@ def parse_command(stream: TokenStream) -> AstCommand: literal_names = list(tree.get_literal_children()) argument_names = list(tree.get_argument_children()) - with stream.alternative() if argument_names else nullcontext(): + with stream.alternative(bool(argument_names)): patterns = [("literal", name) for name in literal_names] token = stream.expect_any(*patterns) scope += (token.value,) diff --git a/packages/mecha/mecha/resources/__init__.py b/packages/mecha/mecha/resources/__init__.py index e69de29bb..56c68d492 100644 --- a/packages/mecha/mecha/resources/__init__.py +++ b/packages/mecha/mecha/resources/__init__.py @@ -0,0 +1,19 @@ +__all__ = [ + "get_wiki_argument_types", + "get_wiki_examples", +] + + +import json +from importlib.resources import read_text +from typing import Dict, List + +from beet import Function + + +def get_wiki_argument_types() -> Dict[str, List[str]]: + return json.loads(read_text("mecha.resources", "wiki_argument_types.json")) + + +def get_wiki_examples() -> Function: + return Function(read_text("mecha.resources", "wiki_examples.mcfunction")) diff --git a/packages/mecha/mecha/resources/wiki_argument_types.json b/packages/mecha/mecha/resources/wiki_argument_types.json new file mode 100644 index 000000000..3c738eed9 --- /dev/null +++ b/packages/mecha/mecha/resources/wiki_argument_types.json @@ -0,0 +1,247 @@ +{ + "brigadier:bool": [ + "true", + "false" + ], + "brigadier:double": [ + "0", + "1.2", + ".5", + "-1", + "-.5", + "-1234.56" + ], + "brigadier:float": [ + "0", + "1.2", + ".5", + "-1", + "-.5", + "-1234.56" + ], + "brigadier:integer": [ + "0", + "123", + "-123" + ], + "brigadier:long": [ + "0", + "123", + "\u2013123" + ], + "brigadier:string": [ + "word", + "word_with_underscores", + "\"quoted phrase\"", + "word", + "\"\"", + "word", + "words with spaces", + "\"and symbols\"" + ], + "minecraft:angle": [ + "0", + "~", + "~-0.5" + ], + "minecraft:block_pos": [ + "0 0 0", + "~ ~ ~", + "^ ^ ^", + "^1 ^ ^-5", + "~0.5 ~1 ~-5" + ], + "minecraft:block_predicate": [ + "stone", + "minecraft:stone", + "stone[foo=bar]", + "#stone", + "#stone[foo=bar]{baz:nbt}" + ], + "minecraft:block_state": [ + "stone", + "minecraft:stone", + "stone[foo=bar]", + "foo{bar:baz}" + ], + "minecraft:color": [ + "red", + "green" + ], + "minecraft:column_pos": [ + "0 0", + "~ ~", + "~1 ~-2" + ], + "minecraft:component": [ + "\"hello world\"", + "\"\"", + "\"{\"text\":\"hello world\"}\"", + "[\"\"]" + ], + "minecraft:dimension": [ + "minecraft:overworld", + "minecraft:the_nether" + ], + "minecraft:entity": [ + "Player", + "0123", + "@e", + "@e[type=foo]", + "dd12be42-52a9-4a91-a8a1-11c01849e498" + ], + "minecraft:entity_anchor": [ + "eyes", + "feet" + ], + "minecraft:entity_summon": [ + "minecraft:pig", + "cow" + ], + "minecraft:float_range": [ + "0..5.2", + "0", + "-5.4", + "-100.76..", + "..100" + ], + "minecraft:function": [ + "foo", + "foo:bar", + "#foo" + ], + "minecraft:game_profile": [ + "Player", + "0123", + "dd12be42-52a9-4a91-a8a1-11c01849e498", + "@e" + ], + "minecraft:int_range": [ + "0..5", + "0", + "-5", + "-100..", + "..100" + ], + "minecraft:item_enchantment": [ + "unbreaking", + "silk_touch" + ], + "minecraft:item_predicate": [ + "stick", + "minecraft:stick", + "#stick", + "#stick{foo:bar}" + ], + "minecraft:item_slot": [ + "container.5", + "12", + "weapon" + ], + "minecraft:item_stack": [ + "stick", + "minecraft:stick", + "stick{foo:bar}" + ], + "minecraft:message": [ + "Hello world!", + "foo", + "@e", + "Hello @p :)" + ], + "minecraft:mob_effect": [ + "spooky", + "effect" + ], + "minecraft:nbt_compound_tag": [ + "{}", + "{foo:bar}" + ], + "minecraft:nbt_path": [ + "foo", + "foo.bar", + "foo[0]", + "[0]", + "[]", + "{foo:bar}" + ], + "minecraft:nbt_tag": [ + "0", + "0b", + "0l", + "0.0", + "\"foo\"", + "{foo:bar}" + ], + "minecraft:objective": [ + "foo", + "*", + "012" + ], + "minecraft:objective_criteria": [ + "foo", + "foo.bar.baz", + "minecraft:foo" + ], + "minecraft:operation": [ + "=", + ">", + "<" + ], + "minecraft:particle": [ + "foo", + "foo:bar", + "particle with options" + ], + "minecraft:resource_location": [ + "foo", + "foo:bar", + "012" + ], + "minecraft:rotation": [ + "0 0", + "~ ~", + "~-5 ~5" + ], + "minecraft:score_holder": [ + "Player", + "0123", + "*", + "@e" + ], + "minecraft:scoreboard_slot": [ + "sidebar", + "foo.bar" + ], + "minecraft:swizzle": [ + "xyz", + "x" + ], + "minecraft:team": [ + "foo", + "123" + ], + "minecraft:time": [ + "0d", + "0s", + "0t", + "0" + ], + "minecraft:uuid": [ + "dd12be42-52a9-4a91-a8a1-11c01849e498" + ], + "minecraft:vec2": [ + "0 0", + "~ ~", + "0.1 -0.5", + "~1 ~-2" + ], + "minecraft:vec3": [ + "0 0 0", + "~ ~ ~", + "^ ^ ^", + "^1 ^ ^-5", + "0.1 -0.5 .9", + "~0.5 ~1 ~-5" + ] +} diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 7017dbc57..052cebea3 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -77,7 +77,7 @@ class CommandTree(BaseModel): children: Optional[Dict[str, "CommandTree"]] = None @classmethod - def load( + def load_from( cls, filename: Optional[FileSystemPath] = None, version: Optional[str] = None, @@ -159,7 +159,7 @@ class CommandSpecification: """Class responsible for managing the command specification.""" tree: CommandTree = extra_field( - default_factory=lambda: CommandTree.load(version="1_17") + default_factory=lambda: CommandTree.load_from(version="1_17") ) flattened_tree: Dict[Tuple[str, ...], CommandTree] = extra_field( default_factory=dict diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py index b452cdc3b..a6556d214 100644 --- a/packages/mecha/scripts.py +++ b/packages/mecha/scripts.py @@ -3,6 +3,7 @@ import click import mcwiki from beet import Function +from beet.core.utils import dump_json PROJECT_DIRECTORY = Path(__file__).parent @@ -42,5 +43,24 @@ def download_wiki_examples(): ) +@cli.command() +def download_wiki_argument_types(): + """Download argument type examples from the wiki.""" + page = mcwiki.load("argument types") + section = page["java edition"] + + examples = mcwiki.TextExtractor(".collapsible-content > ul > li > code") + output_file = PROJECT_DIRECTORY / "mecha/resources/wiki_argument_types.json" + + output_file.write_text( + dump_json( + { + argument_type: list(documentation.extract_all(examples)) + for argument_type, documentation in section.items() + } + ) + ) + + if __name__ == "__main__": cli() diff --git a/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt b/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt new file mode 100644 index 000000000..3f91f75b5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt @@ -0,0 +1,4 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt b/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt new file mode 100644 index 000000000..891a0d000 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt @@ -0,0 +1,4 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True \ No newline at end of file diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 661963499..13c216702 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -1,9 +1,8 @@ -from importlib.resources import read_text - +import pytest from beet import Function from pytest_insta import SnapshotFixture -from mecha import Mecha +from mecha import Mecha, delegate, get_wiki_argument_types, get_wiki_examples def test_basic1(snapshot: SnapshotFixture, mc: Mecha): @@ -21,5 +20,27 @@ def test_basic2(snapshot: SnapshotFixture, mc: Mecha): def test_wiki_examples(snapshot: SnapshotFixture, mc: Mecha): - function = read_text("mecha.resources", "wiki_examples.mcfunction") - assert snapshot() == mc.parse_function(function).dump() + assert snapshot() == mc.parse_function(get_wiki_examples()).dump() + + +@pytest.mark.parametrize( + "argument_type, value", + [ + (argument_type, value) + for argument_type, examples in get_wiki_argument_types().items() + for value in examples + ], +) +def test_wiki_argument_types( + snapshot: SnapshotFixture, + mc: Mecha, + argument_type: str, + value: str, +): + if argument_type not in mc.spec.parsers: + pytest.skip() + + stream = mc.create_token_stream(value) + + with stream.syntax(literal=r"\S+"): + assert snapshot() == delegate(stream, argument_type).dump() From 606168402c45c7920ba64c6b5a41450d07a6afac Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 26 Aug 2021 18:03:43 +0200 Subject: [PATCH 0260/1554] chore: update tokenstream --- packages/mecha/poetry.lock | 9 ++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 78cdd01a8..323278472 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -251,7 +251,6 @@ python-versions = ">=3.6" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "idna" @@ -731,7 +730,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "0.6.2" +version = "0.7.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -848,7 +847,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "8bccf356911d154beb5ac213aa20dad6656baf78f7f2afd9d5f1d093d4dee47d" +content-hash = "bcd8ecac257bad9cf73cd289951f27e953e7a47aae4da210d67ea597da52eed2" [metadata.files] appdirs = [ @@ -1293,8 +1292,8 @@ soupsieve = [ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, ] tokenstream = [ - {file = "tokenstream-0.6.2-py3-none-any.whl", hash = "sha256:fe30bb66038673998e7d3290e622abaca5d2ed13edc8500cbae4b9f0d301b46c"}, - {file = "tokenstream-0.6.2.tar.gz", hash = "sha256:3ad0391f8d81b25f636c8abe0bdbf7ee34715812ef482a3ebe162e24f5a382b3"}, + {file = "tokenstream-0.7.0-py3-none-any.whl", hash = "sha256:c2e7302ded3f326adca228160173126fbe85a5c31ebe18d598fbebe84adf818d"}, + {file = "tokenstream-0.7.0.tar.gz", hash = "sha256:5201459d2482cef050db254ee47727915f71e6cd9fc0ab5044843019ffa705b1"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 57ec6e1c3..58f16a9a0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.36.0" -tokenstream = ">=0.6.2" +tokenstream = ">=0.7.0" [tool.poetry.dev-dependencies] black = "^21.7b0" From 498da68b2fea273f163ae5e840bd1d62c0e014da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 Aug 2021 18:04:06 +0200 Subject: [PATCH 0261/1554] feat: add a bunch of parsers --- packages/mecha/mecha/ast.py | 30 +- packages/mecha/mecha/parse.py | 298 +++++++++++++++++- packages/mecha/mecha/resources/__init__.py | 14 +- .../mecha/resources/argument_examples.json | 269 ++++++++++++++++ ...mcfunction => command_examples.mcfunction} | 0 .../mecha/resources/wiki_argument_types.json | 247 --------------- packages/mecha/scripts.py | 34 +- ...argument_examples_brigadier_bool_0__0.txt} | 6 + ...argument_examples_brigadier_bool_1__0.txt} | 6 + ...rgument_examples_brigadier_double_2__0.txt | 10 + ...rgument_examples_brigadier_double_3__0.txt | 10 + ...rgument_examples_brigadier_double_4__0.txt | 10 + ...rgument_examples_brigadier_double_5__0.txt | 10 + ...rgument_examples_brigadier_double_6__0.txt | 10 + ...rgument_examples_brigadier_double_7__0.txt | 10 + ...rgument_examples_brigadier_float_10__0.txt | 10 + ...rgument_examples_brigadier_float_11__0.txt | 10 + ...rgument_examples_brigadier_float_12__0.txt | 10 + ...rgument_examples_brigadier_float_13__0.txt | 10 + ...argument_examples_brigadier_float_8__0.txt | 10 + ...argument_examples_brigadier_float_9__0.txt | 10 + ...ument_examples_brigadier_integer_14__0.txt | 10 + ...ument_examples_brigadier_integer_15__0.txt | 10 + ...ument_examples_brigadier_integer_16__0.txt | 10 + ...argument_examples_brigadier_long_17__0.txt | 10 + ...argument_examples_brigadier_long_18__0.txt | 10 + ...argument_examples_brigadier_long_19__0.txt | 10 + ...gument_examples_brigadier_string_20__0.txt | 10 + ...gument_examples_brigadier_string_21__0.txt | 10 + ...gument_examples_brigadier_string_22__0.txt | 10 + ...gument_examples_brigadier_string_23__0.txt | 10 + ...gument_examples_brigadier_string_24__0.txt | 10 + ...gument_examples_brigadier_string_25__0.txt | 10 + ...gument_examples_brigadier_string_26__0.txt | 10 + ...gument_examples_brigadier_string_27__0.txt | 10 + ...rgument_examples_minecraft_angle_28__0.txt | 11 + ...rgument_examples_minecraft_angle_29__0.txt | 11 + ...rgument_examples_minecraft_angle_30__0.txt | 11 + ...ent_examples_minecraft_block_pos_31__0.txt | 27 ++ ...ent_examples_minecraft_block_pos_32__0.txt | 27 ++ ...ent_examples_minecraft_block_pos_33__0.txt | 27 ++ ...ent_examples_minecraft_block_pos_34__0.txt | 27 ++ ...ent_examples_minecraft_block_pos_35__0.txt | 27 ++ ...__0.txt => parse__command_examples__0.txt} | 0 packages/mecha/tests/test_parse.py | 37 ++- 45 files changed, 1067 insertions(+), 302 deletions(-) create mode 100644 packages/mecha/mecha/resources/argument_examples.json rename packages/mecha/mecha/resources/{wiki_examples.mcfunction => command_examples.mcfunction} (100%) delete mode 100644 packages/mecha/mecha/resources/wiki_argument_types.json rename packages/mecha/tests/snapshots/{parse__wiki_argument_types_brigadier_bool_true__0.txt => parse__argument_examples_brigadier_bool_0__0.txt} (81%) rename packages/mecha/tests/snapshots/{parse__wiki_argument_types_brigadier_bool_false__0.txt => parse__argument_examples_brigadier_bool_1__0.txt} (80%) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt rename packages/mecha/tests/snapshots/{parse__wiki_examples__0.txt => parse__command_examples__0.txt} (100%) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index fafb5428f..e4a55437a 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -4,15 +4,19 @@ "AstRoot", "AstCommand", "AstValue", + "AstCoordinate", + "AstVector2", + "AstVector3", ] from dataclasses import dataclass, field, fields -from typing import Generic, Iterator, Optional, Tuple, TypeVar +from typing import Generic, Iterator, Literal, Optional, Tuple, TypeVar from tokenstream import SourceLocation T = TypeVar("T") +NumericType = TypeVar("NumericType", float, int) AstNodeType = TypeVar("AstNodeType", bound="AstNode") @@ -76,3 +80,27 @@ class AstValue(AstNode, Generic[T]): """Value ast node""" value: T + + +@dataclass(frozen=True) +class AstCoordinate(AstValue[NumericType]): + """Coordinate ast node.""" + + prefix: Literal["absolute", "relative", "local"] + + +@dataclass(frozen=True) +class AstVector2(AstNode, Generic[NumericType]): + """Vector 2 ast node.""" + + x: AstCoordinate[NumericType] + y: AstCoordinate[NumericType] + + +@dataclass(frozen=True) +class AstVector3(AstNode, Generic[NumericType]): + """Vector 3 ast node.""" + + x: AstCoordinate[NumericType] + y: AstCoordinate[NumericType] + z: AstCoordinate[NumericType] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 8fe8c714e..73ac2868b 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1,19 +1,56 @@ __all__ = [ "get_default_parsers", + "get_stream_spec", + "get_stream_scope", + "get_stream_properties", "delegate", "parse_root", "parse_command", "parse_argument", - "parse_brigadier_bool", + "parse_bool", + "NumericParser", + "StringParser", + "CoordinateParser", + "Vector2Parser", + "Vector3Parser", + "INTEGER_PATTERN", + "FLOAT_PATTERN", ] -from typing import TYPE_CHECKING, Any, Dict, List, Tuple +import re +from dataclasses import dataclass, field +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Generic, + List, + Optional, + Tuple, + Type, + TypeVar, +) + +from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream + +from .ast import ( + AstChildren, + AstCommand, + AstCoordinate, + AstNode, + AstRoot, + AstValue, + AstVector2, + AstVector3, +) +from .spec import CommandSpecification, Parser -from tokenstream import SourceLocation, TokenStream +NumericType = TypeVar("NumericType", float, int) -from .ast import AstChildren, AstCommand, AstNode, AstRoot, AstValue -from .spec import CommandSpecification, Parser + +INTEGER_PATTERN: str = r"-?\d+" +FLOAT_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" def get_default_parsers() -> Dict[str, Parser]: @@ -22,13 +59,67 @@ def get_default_parsers() -> Dict[str, Parser]: "root": parse_root, "command": parse_command, "argument": parse_argument, - "brigadier:bool": parse_brigadier_bool, + "brigadier:bool": parse_bool, + "brigadier:double": NumericParser( + type=float, + name="double", + pattern=FLOAT_PATTERN, + min=-1.7976931348623157e308, + max=1.7976931348623157e308, + ), + "brigadier:float": NumericParser( + type=float, + name="float", + pattern=FLOAT_PATTERN, + min=-3.4028234663852886e38, + max=3.4028234663852886e38, + ), + "brigadier:integer": NumericParser( + type=int, + name="integer", + pattern=INTEGER_PATTERN, + min=-2147483648, + max=2147483647, + ), + "brigadier:long": NumericParser( + type=int, + name="long", + pattern=INTEGER_PATTERN, + min=-9223372036854775808, + max=9223372036854775807, + ), + "brigadier:string": StringParser(), + "minecraft:angle": CoordinateParser( + type=float, + name="angle", + min=-180.0, + max=180.0, + allow_local=False, + ), + "minecraft:block_pos": Vector3Parser( + coordinate_parser=CoordinateParser(type=float), + ), } +def get_stream_spec(stream: TokenStream) -> CommandSpecification: + """Return the command specification associated with the token stream.""" + return stream.data["spec"] + + +def get_stream_scope(stream: TokenStream) -> Tuple[str, ...]: + """Return the current scope associated with the token stream.""" + return stream.data.get("scope", ()) + + +def get_stream_properties(stream: TokenStream) -> Dict[str, Any]: + """Return the current command node properties associated with the token stream.""" + return stream.data.get("properties", {}) + + def delegate(stream: TokenStream, parser: str) -> Any: """Delegate parsing to a registered subparser.""" - spec: CommandSpecification = stream.data["spec"] + spec = get_stream_spec(stream) if parser not in spec.parsers: raise ValueError(f"Unrecognized parser {parser!r}.") @@ -67,7 +158,7 @@ def parse_root(stream: TokenStream) -> AstRoot: def parse_command(stream: TokenStream) -> AstCommand: """Parse command.""" - spec: CommandSpecification = stream.data["spec"] + spec = get_stream_spec(stream) arguments: List[AstNode] = [] scope: Tuple[str, ...] = () @@ -106,16 +197,19 @@ def parse_command(stream: TokenStream) -> AstCommand: def parse_argument(stream: TokenStream) -> AstNode: """Parse argument.""" - spec: CommandSpecification = stream.data["spec"] - tree = spec.flattened_tree[stream.data["scope"]] + spec = get_stream_spec(stream) + scope = get_stream_scope(stream) + + tree = spec.flattened_tree[scope] if tree.parser: - return delegate(stream, tree.parser) + with stream.provide(properties=tree.properties or {}): + return delegate(stream, tree.parser) - raise ValueError(f"Missing argument parser in command tree {stream.data['scope']}.") + raise ValueError(f"Missing argument parser in command tree {scope}.") -def parse_brigadier_bool(stream: TokenStream) -> AstValue[bool]: +def parse_bool(stream: TokenStream) -> AstValue[bool]: """Parse brigadier bool.""" token = stream.expect_any(("literal", "true"), ("literal", "false")) @@ -124,3 +218,181 @@ def parse_brigadier_bool(stream: TokenStream) -> AstValue[bool]: location=token.location, end_location=token.end_location, ) + + +@dataclass +class NumericParser(Generic[NumericType]): + """Parser for numeric values.""" + + type: Type[NumericType] + name: str + pattern: str + min: Optional[NumericType] = None + max: Optional[NumericType] = None + + def __call__(self, stream: TokenStream) -> AstValue[NumericType]: + properties = get_stream_properties(stream) + + with stream.syntax(**{self.name: self.pattern}): + stream.expect(self.name) + + node = self.create_node(stream) + + minimum = properties.get("min", self.min) + maximum = properties.get("max", self.max) + + if minimum is not None and node.value < minimum: + raise stream.emit_error( + InvalidSyntax(f"Expected value to be at least {minimum}.") + ) + if maximum is not None and node.value > maximum: + raise stream.emit_error( + InvalidSyntax(f"Expected value to be at most {maximum}.") + ) + + return node + + def create_node(self, stream: TokenStream) -> AstValue[NumericType]: + """Create the ast node.""" + token = stream.current + value = self.type(token.value) + + return AstValue[NumericType]( + value=value, + location=token.location, + end_location=token.end_location, + ) + + +@dataclass +class StringParser: + """Parser for string values.""" + + type: str = "phrase" + escape_regex: "re.Pattern[str]" = field(default_factory=lambda: re.compile(r"\\.")) + escape_sequences: Dict[str, str] = field( + default_factory=lambda: { + r"\n": "\n", + r"\"": '"', + r"\\": "\\", + } + ) + + def __call__(self, stream: TokenStream) -> AstValue[str]: + properties = get_stream_properties(stream) + string_type = properties.get("type", self.type) + + if string_type == "greedy": + with stream.syntax(line=r".+"): + token = stream.expect("line") + else: + with stream.syntax( + word=r"[0-9A-Za-z_\.\+\-]+", + quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", + ): + if string_type == "word": + token = stream.expect("word") + elif string_type == "phrase": + token = stream.expect_any("word", "quoted_string") + else: + raise ValueError(f"Invalid string type {string_type!r}.") + + return AstValue[str]( + value=( + self.unquote_string(token) + if token.match("quoted_string") + else token.value + ), + location=token.location, + end_location=token.end_location, + ) + + def unquote_string(self, token: Token) -> str: + """Remove quotes and substitute escaped characters.""" + return self.escape_regex.sub( + lambda match: self.escape_sequences[match[0]], token.value[1:-1] + ) + + +@dataclass +class CoordinateParser(NumericParser[NumericType]): + """Parser for coordinates.""" + + name: str = "coordinate" + pattern: str = r"[~^]?" + FLOAT_PATTERN + r"|[~^]" + allow_absolute: bool = True + allow_relative: bool = True + allow_local: bool = True + + def __call__(self, stream: TokenStream) -> AstCoordinate[NumericType]: + return super().__call__(stream) # type: ignore + + def create_node(self, stream: TokenStream) -> AstCoordinate[NumericType]: + token = stream.current + + if issubclass(self.type, int) and "." in token.value: + raise stream.emit_error(InvalidSyntax(f"Decimal {self.name} not allowed.")) + + value = token.value + + if token.value.startswith("~"): + if not self.allow_relative: + raise stream.emit_error( + InvalidSyntax(f"Relative {self.name} not allowed.") + ) + prefix = "relative" + value = value[1:] + elif token.value.startswith("^"): + if not self.allow_local: + raise stream.emit_error( + InvalidSyntax(f"Local {self.name} not allowed.") + ) + prefix = "local" + value = value[1:] + else: + prefix = "absolute" + + return AstCoordinate[NumericType]( + prefix=prefix, + value=self.type(value or "0"), + location=token.location, + end_location=token.end_location, + ) + + +@dataclass +class Vector2Parser(Generic[NumericType]): + """Parser for vector2.""" + + coordinate_parser: Parser + + def __call__(self, stream: TokenStream) -> AstVector2[NumericType]: + x = self.coordinate_parser(stream) + y = self.coordinate_parser(stream) + + return AstVector2[NumericType]( + x=x, + y=y, + location=x.location, + end_location=y.end_location, + ) + + +@dataclass +class Vector3Parser(Generic[NumericType]): + """Parser for vector3.""" + + coordinate_parser: Parser + + def __call__(self, stream: TokenStream) -> AstVector3[NumericType]: + x = self.coordinate_parser(stream) + y = self.coordinate_parser(stream) + z = self.coordinate_parser(stream) + + return AstVector3[NumericType]( + x=x, + y=y, + z=z, + location=x.location, + end_location=z.end_location, + ) diff --git a/packages/mecha/mecha/resources/__init__.py b/packages/mecha/mecha/resources/__init__.py index 56c68d492..4b64dc98d 100644 --- a/packages/mecha/mecha/resources/__init__.py +++ b/packages/mecha/mecha/resources/__init__.py @@ -1,19 +1,19 @@ __all__ = [ - "get_wiki_argument_types", - "get_wiki_examples", + "get_argument_examples", + "get_command_examples", ] import json from importlib.resources import read_text -from typing import Dict, List from beet import Function +from beet.core.utils import JsonDict -def get_wiki_argument_types() -> Dict[str, List[str]]: - return json.loads(read_text("mecha.resources", "wiki_argument_types.json")) +def get_argument_examples() -> JsonDict: + return json.loads(read_text("mecha.resources", "argument_examples.json")) -def get_wiki_examples() -> Function: - return Function(read_text("mecha.resources", "wiki_examples.mcfunction")) +def get_command_examples() -> Function: + return Function(read_text("mecha.resources", "command_examples.mcfunction")) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json new file mode 100644 index 000000000..cbf89f936 --- /dev/null +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -0,0 +1,269 @@ +{ + "brigadier:bool": [ + { + "examples": ["true", "false"] + } + ], + "brigadier:double": [ + { + "examples": ["0", "1.2", ".5", "-1", "-.5", "-1234.56"] + } + ], + "brigadier:float": [ + { + "examples": ["0", "1.2", ".5", "-1", "-.5", "-1234.56"] + } + ], + "brigadier:integer": [ + { + "examples": ["0", "123", "-123"] + } + ], + "brigadier:long": [ + { + "examples": ["0", "123", "-123"] + } + ], + "brigadier:string": [ + { + "properties": { "type": "word" }, + "examples": ["word", "word_with_underscores"] + }, + { + "properties": { "type": "phrase" }, + "examples": ["\"quoted phrase\"", "word", "\"\""] + }, + { + "properties": { "type": "greedy" }, + "examples": ["word", "words with spaces", "\"and symbols\""] + } + ], + "minecraft:angle": [ + { + "examples": ["0", "~", "~-0.5"] + } + ], + "minecraft:block_pos": [ + { + "examples": ["0 0 0", "~ ~ ~", "^ ^ ^", "^1 ^ ^-5", "~0.5 ~1 ~-5"] + } + ], + "minecraft:block_predicate": [ + { + "examples": [ + "stone", + "minecraft:stone", + "stone[foo=bar]", + "#stone", + "#stone[foo=bar]{baz:nbt}" + ] + } + ], + "minecraft:block_state": [ + { + "examples": ["stone", "minecraft:stone", "stone[foo=bar]", "foo{bar:baz}"] + } + ], + "minecraft:color": [ + { + "examples": ["red", "green"] + } + ], + "minecraft:column_pos": [ + { + "examples": ["0 0", "~ ~", "~1 ~-2"] + } + ], + "minecraft:component": [ + { + "examples": [ + "\"hello world\"", + "\"\"", + "\"{\"text\":\"hello world\"}\"", + "[\"\"]" + ] + } + ], + "minecraft:dimension": [ + { + "examples": ["minecraft:overworld", "minecraft:the_nether"] + } + ], + "minecraft:entity": [ + { + "examples": [ + "Player", + "0123", + "@e", + "@e[type=foo]", + "dd12be42-52a9-4a91-a8a1-11c01849e498" + ] + } + ], + "minecraft:entity_anchor": [ + { + "examples": ["eyes", "feet"] + } + ], + "minecraft:entity_summon": [ + { + "examples": ["minecraft:pig", "cow"] + } + ], + "minecraft:float_range": [ + { + "examples": ["0..5.2", "0", "-5.4", "-100.76..", "..100"] + } + ], + "minecraft:function": [ + { + "examples": ["foo", "foo:bar", "#foo"] + } + ], + "minecraft:game_profile": [ + { + "examples": [ + "Player", + "0123", + "dd12be42-52a9-4a91-a8a1-11c01849e498", + "@e" + ] + } + ], + "minecraft:int_range": [ + { + "examples": ["0..5", "0", "-5", "-100..", "..100"] + } + ], + "minecraft:item_enchantment": [ + { + "examples": ["unbreaking", "silk_touch"] + } + ], + "minecraft:item_predicate": [ + { + "examples": ["stick", "minecraft:stick", "#stick", "#stick{foo:bar}"] + } + ], + "minecraft:item_slot": [ + { + "examples": ["container.5", "12", "weapon"] + } + ], + "minecraft:item_stack": [ + { + "examples": ["stick", "minecraft:stick", "stick{foo:bar}"] + } + ], + "minecraft:message": [ + { + "examples": ["Hello world!", "foo", "@e", "Hello @p\u00a0:)"] + } + ], + "minecraft:mob_effect": [ + { + "examples": ["spooky", "effect"] + } + ], + "minecraft:nbt_compound_tag": [ + { + "examples": ["{}", "{foo:bar}"] + } + ], + "minecraft:nbt_path": [ + { + "examples": ["foo", "bar", "A [crazy name]"] + }, + { + "examples": ["bar", "A [crazy name]"] + }, + { + "examples": ["A [crazy name]"] + }, + { + "examples": ["A [crazy name]"] + } + ], + "minecraft:nbt_tag": [ + { + "examples": ["0", "0b", "0l", "0.0", "\"foo\"", "{foo:bar}"] + } + ], + "minecraft:objective": [ + { + "examples": ["foo", "*", "012"] + } + ], + "minecraft:objective_criteria": [ + { + "examples": ["foo", "foo.bar.baz", "minecraft:foo"] + } + ], + "minecraft:operation": [ + { + "examples": ["=", ">", "<"] + } + ], + "minecraft:particle": [ + { + "examples": ["foo", "foo:bar", "particle with options"] + } + ], + "minecraft:resource_location": [ + { + "examples": ["foo", "foo:bar", "012"] + } + ], + "minecraft:rotation": [ + { + "examples": ["0 0", "~ ~", "~-5 ~5"] + } + ], + "minecraft:score_holder": [ + { + "examples": ["Player", "0123", "*", "@e"] + } + ], + "minecraft:scoreboard_slot": [ + { + "examples": ["sidebar", "foo.bar"] + } + ], + "minecraft:swizzle": [ + { + "examples": ["xyz", "x"] + } + ], + "minecraft:team": [ + { + "examples": ["foo", "123"] + } + ], + "minecraft:time": [ + { + "examples": ["0d", "0s", "0t", "0"] + } + ], + "minecraft:uuid": [ + { + "examples": ["dd12be42-52a9-4a91-a8a1-11c01849e498"] + } + ], + "minecraft:vec2": [ + { + "examples": ["0 0", "~ ~", "0.1 -0.5", "~1 ~-2"] + } + ], + "minecraft:vec3": [ + { + "examples": [ + "0 0 0", + "~ ~ ~", + "^ ^ ^", + "^1 ^ ^-5", + "0.1 -0.5 .9", + "~0.5 ~1 ~-5" + ] + } + ] +} diff --git a/packages/mecha/mecha/resources/wiki_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction similarity index 100% rename from packages/mecha/mecha/resources/wiki_examples.mcfunction rename to packages/mecha/mecha/resources/command_examples.mcfunction diff --git a/packages/mecha/mecha/resources/wiki_argument_types.json b/packages/mecha/mecha/resources/wiki_argument_types.json deleted file mode 100644 index 3c738eed9..000000000 --- a/packages/mecha/mecha/resources/wiki_argument_types.json +++ /dev/null @@ -1,247 +0,0 @@ -{ - "brigadier:bool": [ - "true", - "false" - ], - "brigadier:double": [ - "0", - "1.2", - ".5", - "-1", - "-.5", - "-1234.56" - ], - "brigadier:float": [ - "0", - "1.2", - ".5", - "-1", - "-.5", - "-1234.56" - ], - "brigadier:integer": [ - "0", - "123", - "-123" - ], - "brigadier:long": [ - "0", - "123", - "\u2013123" - ], - "brigadier:string": [ - "word", - "word_with_underscores", - "\"quoted phrase\"", - "word", - "\"\"", - "word", - "words with spaces", - "\"and symbols\"" - ], - "minecraft:angle": [ - "0", - "~", - "~-0.5" - ], - "minecraft:block_pos": [ - "0 0 0", - "~ ~ ~", - "^ ^ ^", - "^1 ^ ^-5", - "~0.5 ~1 ~-5" - ], - "minecraft:block_predicate": [ - "stone", - "minecraft:stone", - "stone[foo=bar]", - "#stone", - "#stone[foo=bar]{baz:nbt}" - ], - "minecraft:block_state": [ - "stone", - "minecraft:stone", - "stone[foo=bar]", - "foo{bar:baz}" - ], - "minecraft:color": [ - "red", - "green" - ], - "minecraft:column_pos": [ - "0 0", - "~ ~", - "~1 ~-2" - ], - "minecraft:component": [ - "\"hello world\"", - "\"\"", - "\"{\"text\":\"hello world\"}\"", - "[\"\"]" - ], - "minecraft:dimension": [ - "minecraft:overworld", - "minecraft:the_nether" - ], - "minecraft:entity": [ - "Player", - "0123", - "@e", - "@e[type=foo]", - "dd12be42-52a9-4a91-a8a1-11c01849e498" - ], - "minecraft:entity_anchor": [ - "eyes", - "feet" - ], - "minecraft:entity_summon": [ - "minecraft:pig", - "cow" - ], - "minecraft:float_range": [ - "0..5.2", - "0", - "-5.4", - "-100.76..", - "..100" - ], - "minecraft:function": [ - "foo", - "foo:bar", - "#foo" - ], - "minecraft:game_profile": [ - "Player", - "0123", - "dd12be42-52a9-4a91-a8a1-11c01849e498", - "@e" - ], - "minecraft:int_range": [ - "0..5", - "0", - "-5", - "-100..", - "..100" - ], - "minecraft:item_enchantment": [ - "unbreaking", - "silk_touch" - ], - "minecraft:item_predicate": [ - "stick", - "minecraft:stick", - "#stick", - "#stick{foo:bar}" - ], - "minecraft:item_slot": [ - "container.5", - "12", - "weapon" - ], - "minecraft:item_stack": [ - "stick", - "minecraft:stick", - "stick{foo:bar}" - ], - "minecraft:message": [ - "Hello world!", - "foo", - "@e", - "Hello @p :)" - ], - "minecraft:mob_effect": [ - "spooky", - "effect" - ], - "minecraft:nbt_compound_tag": [ - "{}", - "{foo:bar}" - ], - "minecraft:nbt_path": [ - "foo", - "foo.bar", - "foo[0]", - "[0]", - "[]", - "{foo:bar}" - ], - "minecraft:nbt_tag": [ - "0", - "0b", - "0l", - "0.0", - "\"foo\"", - "{foo:bar}" - ], - "minecraft:objective": [ - "foo", - "*", - "012" - ], - "minecraft:objective_criteria": [ - "foo", - "foo.bar.baz", - "minecraft:foo" - ], - "minecraft:operation": [ - "=", - ">", - "<" - ], - "minecraft:particle": [ - "foo", - "foo:bar", - "particle with options" - ], - "minecraft:resource_location": [ - "foo", - "foo:bar", - "012" - ], - "minecraft:rotation": [ - "0 0", - "~ ~", - "~-5 ~5" - ], - "minecraft:score_holder": [ - "Player", - "0123", - "*", - "@e" - ], - "minecraft:scoreboard_slot": [ - "sidebar", - "foo.bar" - ], - "minecraft:swizzle": [ - "xyz", - "x" - ], - "minecraft:team": [ - "foo", - "123" - ], - "minecraft:time": [ - "0d", - "0s", - "0t", - "0" - ], - "minecraft:uuid": [ - "dd12be42-52a9-4a91-a8a1-11c01849e498" - ], - "minecraft:vec2": [ - "0 0", - "~ ~", - "0.1 -0.5", - "~1 ~-2" - ], - "minecraft:vec3": [ - "0 0 0", - "~ ~ ~", - "^ ^ ^", - "^1 ^ ^-5", - "0.1 -0.5 .9", - "~0.5 ~1 ~-5" - ] -} diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py index a6556d214..8365837bf 100644 --- a/packages/mecha/scripts.py +++ b/packages/mecha/scripts.py @@ -1,12 +1,8 @@ -from pathlib import Path - import click import mcwiki from beet import Function from beet.core.utils import dump_json -PROJECT_DIRECTORY = Path(__file__).parent - @click.group() def cli(): @@ -14,7 +10,7 @@ def cli(): @cli.command() -def download_wiki_examples(): +def download_command_examples(): """Download command examples from the wiki.""" generated_function = Function() @@ -37,29 +33,25 @@ def download_wiki_examples(): if code.startswith(command) and code not in ignored_examples: generated_function.lines.append(code) - generated_function.dump( - PROJECT_DIRECTORY / "mecha/resources", - "wiki_examples.mcfunction", - ) + click.echo(generated_function.text, nl=False) @cli.command() -def download_wiki_argument_types(): - """Download argument type examples from the wiki.""" +def download_argument_examples(): + """Download argument examples from the wiki.""" page = mcwiki.load("argument types") section = page["java edition"] - examples = mcwiki.TextExtractor(".collapsible-content > ul > li > code") - output_file = PROJECT_DIRECTORY / "mecha/resources/wiki_argument_types.json" + argument_examples = { + argument_type: [ + {"examples": examples} + for ul in documentation.html.select_one(".collapsible-content").select("ul") # type: ignore + if (examples := [example.string for example in ul.select("li > code")]) # type: ignore + ] + for argument_type, documentation in section.items() + } - output_file.write_text( - dump_json( - { - argument_type: list(documentation.extract_all(examples)) - for argument_type, documentation in section.items() - } - ) - ) + click.echo(dump_json(argument_examples), nl=False) if __name__ == "__main__": diff --git a/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0__0.txt similarity index 81% rename from packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0__0.txt index 891a0d000..de4157ee0 100644 --- a/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_true__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0__0.txt @@ -1,3 +1,9 @@ +brigadier:bool +--- +{} +--- +true +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1__0.txt similarity index 80% rename from packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1__0.txt index 3f91f75b5..4e36f450e 100644 --- a/packages/mecha/tests/snapshots/parse__wiki_argument_types_brigadier_bool_false__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1__0.txt @@ -1,3 +1,9 @@ +brigadier:bool +--- +{} +--- +false +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt new file mode 100644 index 000000000..b4bc6f694 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt @@ -0,0 +1,10 @@ +brigadier:double +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt new file mode 100644 index 000000000..b1beeb8eb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt @@ -0,0 +1,10 @@ +brigadier:double +--- +{} +--- +1.2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 1.2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt new file mode 100644 index 000000000..2b12f80cc --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt @@ -0,0 +1,10 @@ +brigadier:double +--- +{} +--- +.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt new file mode 100644 index 000000000..02839d1c5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt @@ -0,0 +1,10 @@ +brigadier:double +--- +{} +--- +-1 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: -1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt new file mode 100644 index 000000000..652dcd77d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt @@ -0,0 +1,10 @@ +brigadier:double +--- +{} +--- +-.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: -0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt new file mode 100644 index 000000000..834e82d3a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt @@ -0,0 +1,10 @@ +brigadier:double +--- +{} +--- +-1234.56 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -1234.56 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt new file mode 100644 index 000000000..2439c1488 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt @@ -0,0 +1,10 @@ +brigadier:float +--- +{} +--- +.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt new file mode 100644 index 000000000..cf938ae94 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt @@ -0,0 +1,10 @@ +brigadier:float +--- +{} +--- +-1 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: -1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt new file mode 100644 index 000000000..a753c5d3c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt @@ -0,0 +1,10 @@ +brigadier:float +--- +{} +--- +-.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: -0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt new file mode 100644 index 000000000..ac2bf12f2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt @@ -0,0 +1,10 @@ +brigadier:float +--- +{} +--- +-1234.56 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -1234.56 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt new file mode 100644 index 000000000..76760aa62 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt @@ -0,0 +1,10 @@ +brigadier:float +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt new file mode 100644 index 000000000..9a0b6e86d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt @@ -0,0 +1,10 @@ +brigadier:float +--- +{} +--- +1.2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 1.2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt new file mode 100644 index 000000000..8304697a1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt @@ -0,0 +1,10 @@ +brigadier:integer +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt new file mode 100644 index 000000000..5ecf0a721 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt @@ -0,0 +1,10 @@ +brigadier:integer +--- +{} +--- +123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt new file mode 100644 index 000000000..ddc38ee4b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt @@ -0,0 +1,10 @@ +brigadier:integer +--- +{} +--- +-123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: -123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt new file mode 100644 index 000000000..5fa276314 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt @@ -0,0 +1,10 @@ +brigadier:long +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt new file mode 100644 index 000000000..1692ede33 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt @@ -0,0 +1,10 @@ +brigadier:long +--- +{} +--- +123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt new file mode 100644 index 000000000..6e82a9e1a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt @@ -0,0 +1,10 @@ +brigadier:long +--- +{} +--- +-123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: -123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt new file mode 100644 index 000000000..a5345374b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'word'} +--- +word +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt new file mode 100644 index 000000000..a12df5179 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'word'} +--- +word_with_underscores +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'word_with_underscores' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt new file mode 100644 index 000000000..2cd617b6b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'phrase'} +--- +"quoted phrase" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'quoted phrase' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt new file mode 100644 index 000000000..a1c224cc8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'phrase'} +--- +word +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt new file mode 100644 index 000000000..b0c5b7ed6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'phrase'} +--- +"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: '' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt new file mode 100644 index 000000000..07607de4a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'greedy'} +--- +word +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt new file mode 100644 index 000000000..8fb722c21 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'greedy'} +--- +words with spaces +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'words with spaces' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt new file mode 100644 index 000000000..6f3759dc9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt @@ -0,0 +1,10 @@ +brigadier:string +--- +{'type': 'greedy'} +--- +"and symbols" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: '"and symbols"' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt new file mode 100644 index 000000000..d0c4209f0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt @@ -0,0 +1,11 @@ +minecraft:angle +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt new file mode 100644 index 000000000..4bdf0ce99 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt @@ -0,0 +1,11 @@ +minecraft:angle +--- +{} +--- +~ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt new file mode 100644 index 000000000..9225ed2a1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt @@ -0,0 +1,11 @@ +minecraft:angle +--- +{} +--- +~-0.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: -0.5 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt new file mode 100644 index 000000000..a8280b16e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt @@ -0,0 +1,27 @@ +minecraft:block_pos +--- +{} +--- +0 0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt new file mode 100644 index 000000000..14862f585 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt @@ -0,0 +1,27 @@ +minecraft:block_pos +--- +{} +--- +~ ~ ~ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt new file mode 100644 index 000000000..5bc86ecef --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt @@ -0,0 +1,27 @@ +minecraft:block_pos +--- +{} +--- +^ ^ ^ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'local' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'local' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'local' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt new file mode 100644 index 000000000..1494c6da2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt @@ -0,0 +1,27 @@ +minecraft:block_pos +--- +{} +--- +^1 ^ ^-5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 1.0 + prefix: 'local' + y: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 0.0 + prefix: 'local' + z: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -5.0 + prefix: 'local' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt new file mode 100644 index 000000000..9b2ed713e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt @@ -0,0 +1,27 @@ +minecraft:block_pos +--- +{} +--- +~0.5 ~1 ~-5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 0.5 + prefix: 'relative' + y: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: -5.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__wiki_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt similarity index 100% rename from packages/mecha/tests/snapshots/parse__wiki_examples__0.txt rename to packages/mecha/tests/snapshots/parse__command_examples__0.txt diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 13c216702..740228677 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -1,8 +1,9 @@ import pytest from beet import Function +from beet.core.utils import JsonDict from pytest_insta import SnapshotFixture -from mecha import Mecha, delegate, get_wiki_argument_types, get_wiki_examples +from mecha import Mecha, delegate, get_argument_examples, get_command_examples def test_basic1(snapshot: SnapshotFixture, mc: Mecha): @@ -19,28 +20,38 @@ def test_basic2(snapshot: SnapshotFixture, mc: Mecha): assert snapshot() == mc.parse_function(function).dump() -def test_wiki_examples(snapshot: SnapshotFixture, mc: Mecha): - assert snapshot() == mc.parse_function(get_wiki_examples()).dump() +def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): + assert snapshot() == mc.parse_function(get_command_examples()).dump() @pytest.mark.parametrize( - "argument_type, value", - [ - (argument_type, value) - for argument_type, examples in get_wiki_argument_types().items() - for value in examples + "argument_parser, properties, value", + params := [ + (argument_parser, suite.get("properties", {}), value) + for argument_parser, suites in get_argument_examples().items() + for suite in suites + for value in suite["examples"] ], + ids=[f"{argument_parser}_{i}" for i, (argument_parser, _, _) in enumerate(params)], ) -def test_wiki_argument_types( +def test_argument_examples( snapshot: SnapshotFixture, mc: Mecha, - argument_type: str, + argument_parser: str, + properties: JsonDict, value: str, ): - if argument_type not in mc.spec.parsers: + if argument_parser not in mc.spec.parsers: pytest.skip() stream = mc.create_token_stream(value) - with stream.syntax(literal=r"\S+"): - assert snapshot() == delegate(stream, argument_type).dump() + with stream.syntax(literal=r"\S+"), stream.provide(properties=properties): + assert snapshot() == "\n---\n".join( + [ + argument_parser, + str(properties), + value, + delegate(stream, argument_parser).dump(), + ] + ) From 8b36e8cf2a1c5eab130bc12d5a489cb9e0345109 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 00:13:41 +0200 Subject: [PATCH 0262/1554] feat: add json parsing --- packages/mecha/mecha/__init__.py | 1 + packages/mecha/mecha/api.py | 2 +- packages/mecha/mecha/ast.py | 69 +++++- packages/mecha/mecha/error.py | 19 ++ packages/mecha/mecha/parse.py | 222 +++++++++++++++--- .../mecha/resources/argument_examples.json | 2 +- packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- ...ent_examples_minecraft_component_50__0.txt | 10 + ...ent_examples_minecraft_component_51__0.txt | 10 + ...ent_examples_minecraft_component_52__0.txt | 23 ++ ...ent_examples_minecraft_component_53__0.txt | 14 ++ packages/mecha/tests/test_parse.py | 2 +- 13 files changed, 338 insertions(+), 46 deletions(-) create mode 100644 packages/mecha/mecha/error.py create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 05539cfd4..e2654c5a3 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -2,6 +2,7 @@ from .api import * +from .error import * from .parse import * from .resources import * from .spec import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 6fb70546f..16f0a3ae8 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -43,7 +43,7 @@ def parse_function( if not filename and function.source_path: filename = str(function.source_path) - ast = delegate(self.create_token_stream(function.text + "\n"), "root") + ast = delegate("root", self.create_token_stream(function.text + "\n")) return replace(ast, filename=filename) def parse_command(self, command: str) -> AstCommand: diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index e4a55437a..d07ea9662 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -7,12 +7,28 @@ "AstCoordinate", "AstVector2", "AstVector3", + "AstJson", + "AstJsonValue", + "AstJsonArray", + "AstJsonObjectEntry", + "AstJsonObject", ] from dataclasses import dataclass, field, fields -from typing import Generic, Iterator, Literal, Optional, Tuple, TypeVar - +from typing import ( + Any, + Generic, + Iterator, + List, + Literal, + Optional, + Tuple, + TypeVar, + Union, +) + +from beet.core.utils import JsonDict from tokenstream import SourceLocation T = TypeVar("T") @@ -72,7 +88,7 @@ class AstCommand(AstNode): """Command ast node""" identifier: str - arguments: AstChildren["AstNode"] + arguments: AstChildren[AstNode] @dataclass(frozen=True) @@ -104,3 +120,50 @@ class AstVector3(AstNode, Generic[NumericType]): x: AstCoordinate[NumericType] y: AstCoordinate[NumericType] z: AstCoordinate[NumericType] + + +@dataclass(frozen=True) +class AstJson(AstNode): + """Base ast node for json.""" + + def get_value(self) -> Any: + """Return the json value.""" + raise NotImplementedError() + + +@dataclass(frozen=True) +class AstJsonValue(AstJson): + """Ast json value node.""" + + value: Union[None, bool, str, float] + + def get_value(self) -> Union[None, bool, str, float]: + return self.value + + +@dataclass(frozen=True) +class AstJsonArray(AstJson): + """Ast json array node.""" + + elements: AstChildren[AstJson] + + def get_value(self) -> List[Any]: + return [element.get_value() for element in self.elements] + + +@dataclass(frozen=True) +class AstJsonObjectEntry(AstNode): + """Ast json object entry node.""" + + key: AstValue[str] + value: AstJson + + +@dataclass(frozen=True) +class AstJsonObject(AstJson): + """Ast json object node.""" + + entries: AstChildren[AstJsonObjectEntry] + + def get_value(self) -> JsonDict: + return {entry.key.value: entry.value.get_value() for entry in self.entries} diff --git a/packages/mecha/mecha/error.py b/packages/mecha/mecha/error.py new file mode 100644 index 000000000..9d1c553df --- /dev/null +++ b/packages/mecha/mecha/error.py @@ -0,0 +1,19 @@ +__all__ = [ + "MechaError", + "InvalidEscapeSequence", +] + + +class MechaError(Exception): + """Base class for all mecha errors.""" + + +class InvalidEscapeSequence(MechaError): + """Raised when a QuotedStringHandler encounters an invalid escape sequence.""" + + characters: str + index: int + + def __init__(self, characters: str, index: int): + self.characters = characters + self.index = index diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 73ac2868b..6173402db 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -13,13 +13,14 @@ "CoordinateParser", "Vector2Parser", "Vector3Parser", + "JsonParser", "INTEGER_PATTERN", "FLOAT_PATTERN", ] - import re from dataclasses import dataclass, field +from functools import partial from typing import ( TYPE_CHECKING, Any, @@ -30,6 +31,7 @@ Tuple, Type, TypeVar, + overload, ) from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream @@ -38,12 +40,18 @@ AstChildren, AstCommand, AstCoordinate, + AstJson, + AstJsonArray, + AstJsonObject, + AstJsonObjectEntry, + AstJsonValue, AstNode, AstRoot, AstValue, AstVector2, AstVector3, ) +from .error import InvalidEscapeSequence from .spec import CommandSpecification, Parser NumericType = TypeVar("NumericType", float, int) @@ -59,29 +67,30 @@ def get_default_parsers() -> Dict[str, Parser]: "root": parse_root, "command": parse_command, "argument": parse_argument, + "json": JsonParser(), "brigadier:bool": parse_bool, - "brigadier:double": NumericParser( + "brigadier:double": NumericParser[float]( type=float, name="double", pattern=FLOAT_PATTERN, min=-1.7976931348623157e308, max=1.7976931348623157e308, ), - "brigadier:float": NumericParser( + "brigadier:float": NumericParser[float]( type=float, name="float", pattern=FLOAT_PATTERN, min=-3.4028234663852886e38, max=3.4028234663852886e38, ), - "brigadier:integer": NumericParser( + "brigadier:integer": NumericParser[int]( type=int, name="integer", pattern=INTEGER_PATTERN, min=-2147483648, max=2147483647, ), - "brigadier:long": NumericParser( + "brigadier:long": NumericParser[int]( type=int, name="long", pattern=INTEGER_PATTERN, @@ -89,16 +98,17 @@ def get_default_parsers() -> Dict[str, Parser]: max=9223372036854775807, ), "brigadier:string": StringParser(), - "minecraft:angle": CoordinateParser( + "minecraft:angle": CoordinateParser[float]( type=float, name="angle", min=-180.0, max=180.0, allow_local=False, ), - "minecraft:block_pos": Vector3Parser( - coordinate_parser=CoordinateParser(type=float), + "minecraft:block_pos": Vector3Parser[float]( + coordinate_parser=CoordinateParser[float](type=float), ), + "minecraft:component": delegate("json"), } @@ -117,8 +127,21 @@ def get_stream_properties(stream: TokenStream) -> Dict[str, Any]: return stream.data.get("properties", {}) -def delegate(stream: TokenStream, parser: str) -> Any: +@overload +def delegate(parser: str) -> Parser: + ... + + +@overload +def delegate(parser: str, stream: TokenStream) -> Any: + ... + + +def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: """Delegate parsing to a registered subparser.""" + if stream is None: + return partial(delegate, parser) + spec = get_stream_spec(stream) if parser not in spec.parsers: @@ -127,6 +150,44 @@ def delegate(stream: TokenStream, parser: str) -> Any: return spec.parsers[parser](stream) +@dataclass +class QuotedStringHandler: + """Class responsible for removing quotes and interpreting escape sequences.""" + + escape_regex: "re.Pattern[str]" = field(default_factory=lambda: re.compile(r"\\.")) + escape_sequences: Dict[str, str] = field(default_factory=dict) + + def unquote_string(self, token: Token) -> str: + """Remove quotes and substitute escaped characters.""" + try: + return self.escape_regex.sub( + lambda match: self.handle_substitution(token, match), + token.value[1:-1], + ) + except InvalidEscapeSequence as exc: + location = token.location.with_horizontal_offset(exc.index + 1) + raise ( + InvalidSyntax( + f"Invalid escape sequence {exc.characters!r}." + ).set_location( + location, + location.with_horizontal_offset(len(exc.characters)), + ) + ) + + def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: + """Handle escaped character sequence.""" + characters = match[0] + + if characters == "\\" + token.value[0]: + return token.value[0] + + try: + return self.escape_sequences[characters] + except KeyError: + raise InvalidEscapeSequence(characters, match.pos) from None + + def parse_root(stream: TokenStream) -> AstRoot: """Parse root.""" with stream.syntax(comment=r"#.+$", literal=r"\S+"), stream.intercept("newline"): @@ -146,7 +207,7 @@ def parse_root(stream: TokenStream) -> AstRoot: while stream.get("newline", "comment"): continue if stream.peek(): - commands.append(delegate(stream, "command")) + commands.append(delegate("command", stream)) return AstRoot( filename=None, @@ -182,7 +243,7 @@ def parse_command(stream: TokenStream) -> AstCommand: for name, alternative in stream.choose(*argument_names): with alternative, stream.provide(scope=scope + (name,)): - arguments.append(delegate(stream, "argument")) + arguments.append(delegate("argument", stream)) scope += (name,) end_location = stream.current.end_location @@ -204,13 +265,13 @@ def parse_argument(stream: TokenStream) -> AstNode: if tree.parser: with stream.provide(properties=tree.properties or {}): - return delegate(stream, tree.parser) + return delegate(tree.parser, stream) raise ValueError(f"Missing argument parser in command tree {scope}.") def parse_bool(stream: TokenStream) -> AstValue[bool]: - """Parse brigadier bool.""" + """Parse bool.""" token = stream.expect_any(("literal", "true"), ("literal", "false")) return AstValue[bool]( @@ -234,7 +295,7 @@ def __call__(self, stream: TokenStream) -> AstValue[NumericType]: properties = get_stream_properties(stream) with stream.syntax(**{self.name: self.pattern}): - stream.expect(self.name) + token = stream.expect(self.name) node = self.create_node(stream) @@ -242,11 +303,11 @@ def __call__(self, stream: TokenStream) -> AstValue[NumericType]: maximum = properties.get("max", self.max) if minimum is not None and node.value < minimum: - raise stream.emit_error( + raise token.emit_error( InvalidSyntax(f"Expected value to be at least {minimum}.") ) if maximum is not None and node.value > maximum: - raise stream.emit_error( + raise token.emit_error( InvalidSyntax(f"Expected value to be at most {maximum}.") ) @@ -269,13 +330,8 @@ class StringParser: """Parser for string values.""" type: str = "phrase" - escape_regex: "re.Pattern[str]" = field(default_factory=lambda: re.compile(r"\\.")) - escape_sequences: Dict[str, str] = field( - default_factory=lambda: { - r"\n": "\n", - r"\"": '"', - r"\\": "\\", - } + quoted_string_handler: QuotedStringHandler = field( + default_factory=QuotedStringHandler ) def __call__(self, stream: TokenStream) -> AstValue[str]: @@ -299,7 +355,7 @@ def __call__(self, stream: TokenStream) -> AstValue[str]: return AstValue[str]( value=( - self.unquote_string(token) + self.quoted_string_handler.unquote_string(token) if token.match("quoted_string") else token.value ), @@ -307,12 +363,6 @@ def __call__(self, stream: TokenStream) -> AstValue[str]: end_location=token.end_location, ) - def unquote_string(self, token: Token) -> str: - """Remove quotes and substitute escaped characters.""" - return self.escape_regex.sub( - lambda match: self.escape_sequences[match[0]], token.value[1:-1] - ) - @dataclass class CoordinateParser(NumericParser[NumericType]): @@ -331,22 +381,20 @@ def create_node(self, stream: TokenStream) -> AstCoordinate[NumericType]: token = stream.current if issubclass(self.type, int) and "." in token.value: - raise stream.emit_error(InvalidSyntax(f"Decimal {self.name} not allowed.")) + raise token.emit_error(InvalidSyntax(f"Decimal {self.name} not allowed.")) value = token.value if token.value.startswith("~"): if not self.allow_relative: - raise stream.emit_error( + raise token.emit_error( InvalidSyntax(f"Relative {self.name} not allowed.") ) prefix = "relative" value = value[1:] elif token.value.startswith("^"): if not self.allow_local: - raise stream.emit_error( - InvalidSyntax(f"Local {self.name} not allowed.") - ) + raise token.emit_error(InvalidSyntax(f"Local {self.name} not allowed.")) prefix = "local" value = value[1:] else: @@ -396,3 +444,107 @@ def __call__(self, stream: TokenStream) -> AstVector3[NumericType]: location=x.location, end_location=z.end_location, ) + + +@dataclass +class JsonParser: + """Parser for json values.""" + + quoted_string_handler: QuotedStringHandler = field( + default_factory=lambda: QuotedStringHandler( + escape_sequences={ + r"\\": "\\", + r"\f": "\f", + r"\n": "\n", + r"\r": "\r", + r"\t": "\t", + } + ) + ) + + def __call__(self, stream: TokenStream) -> AstJson: + with stream.syntax( + curly=r"\{|\}", + bracket=r"\[|\]", + string=r'"(?:\\.|[^\\\n])*?"', + number=r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?", + colon=r":", + comma=r",", + ): + curly, bracket, string, number, null, true, false = stream.expect( + ("curly", "{"), + ("bracket", "["), + "string", + "number", + ("literal", "null"), + ("literal", "true"), + ("literal", "false"), + ) + + if curly: + entries: List[AstJsonObjectEntry] = [] + + for key in stream.collect("string"): + stream.expect("colon") + value = self(stream) + entries.append( + AstJsonObjectEntry( + key=AstValue[str]( + value=self.quoted_string_handler.unquote_string(key), + location=key.location, + end_location=key.end_location, + ), + value=value, + location=key.location, + end_location=value.end_location, + ) + ) + + if not stream.get("comma"): + break + + close_curly = stream.expect(("curly", "}")) + + return AstJsonObject( + entries=AstChildren(entries), + location=curly.location, + end_location=close_curly.end_location, + ) + + elif bracket: + elements: List[AstJson] = [] + + close_bracket = stream.get(("bracket", "]")) + + if not close_bracket: + elements.append(self(stream)) + + for _ in stream.collect("comma"): + elements.append(self(stream)) + + close_bracket = stream.expect(("bracket", "]")) + + return AstJsonArray( + elements=AstChildren(elements), + location=bracket.location, + end_location=close_bracket.end_location, + ) + + value = None + + if null: + pass + elif true: + value = True + elif false: + value = False + elif string: + value = self.quoted_string_handler.unquote_string(string) + elif number: + value = float(number.value) + + return AstJsonValue( + value=value, + location=stream.current.location, + end_location=stream.current.end_location, + ) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index cbf89f936..04cb02e35 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -79,7 +79,7 @@ "examples": [ "\"hello world\"", "\"\"", - "\"{\"text\":\"hello world\"}\"", + "{\"text\":\"hello world\"}", "[\"\"]" ] } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 323278472..766efe843 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -730,7 +730,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "0.7.0" +version = "0.7.1" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -847,7 +847,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "bcd8ecac257bad9cf73cd289951f27e953e7a47aae4da210d67ea597da52eed2" +content-hash = "2c073d95f4cd36df15d3bf06fa3c8af3a361733bc221c2b48729b9c9fa3cdb3a" [metadata.files] appdirs = [ @@ -1292,8 +1292,8 @@ soupsieve = [ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, ] tokenstream = [ - {file = "tokenstream-0.7.0-py3-none-any.whl", hash = "sha256:c2e7302ded3f326adca228160173126fbe85a5c31ebe18d598fbebe84adf818d"}, - {file = "tokenstream-0.7.0.tar.gz", hash = "sha256:5201459d2482cef050db254ee47727915f71e6cd9fc0ab5044843019ffa705b1"}, + {file = "tokenstream-0.7.1-py3-none-any.whl", hash = "sha256:9ac6629bc6ebd07d2ca4d8db83b3c789d937cdaac21b57760003873773fe400d"}, + {file = "tokenstream-0.7.1.tar.gz", hash = "sha256:75e46c2524c9bd404aacfd4c40b280f129f1405c35989ea0fdfd9389702ad095"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 58f16a9a0..e83c3078a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.36.0" -tokenstream = ">=0.7.0" +tokenstream = "^0.7.1" [tool.poetry.dev-dependencies] black = "^21.7b0" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt new file mode 100644 index 000000000..b7b367b9d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt @@ -0,0 +1,10 @@ +minecraft:component +--- +{} +--- +"hello world" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello world' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt new file mode 100644 index 000000000..5f4274ccf --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt @@ -0,0 +1,10 @@ +minecraft:component +--- +{} +--- +"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: '' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt new file mode 100644 index 000000000..7bd4c6729 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt @@ -0,0 +1,23 @@ +minecraft:component +--- +{} +--- +{"text":"hello world"} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'text' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'hello world' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt new file mode 100644 index 000000000..6642c03f7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt @@ -0,0 +1,14 @@ +minecraft:component +--- +{} +--- +[""] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + elements: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: '' \ No newline at end of file diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 740228677..2db859350 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -52,6 +52,6 @@ def test_argument_examples( argument_parser, str(properties), value, - delegate(stream, argument_parser).dump(), + delegate(argument_parser, stream).dump(), ] ) From 186eb41164797e1aa114eaa73e3307d082704a56 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 01:53:06 +0200 Subject: [PATCH 0263/1554] feat: show empty children in ast dump --- packages/mecha/mecha/ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index d07ea9662..80e25c645 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -61,7 +61,7 @@ def dump(self, prefix: str = "") -> str: return f"{prefix}{self.__class__}\n" + "\n".join( f"{prefix} {f.name}:" + ( - "\n" + "\n".join(child.dump(prefix + " ") for child in attribute) # type: ignore + "\n" + ("\n".join(child.dump(prefix + " ") for child in attribute) if attribute else prefix + " \n") # type: ignore if isinstance(attribute := getattr(self, f.name), AstChildren) else "\n" + attribute.dump(prefix + " ") if isinstance(attribute, AstNode) From a7aaa6956bd717fd9aad80019c9e9118bd1fd8b5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 02:00:07 +0200 Subject: [PATCH 0264/1554] feat: parse block and resource location --- packages/mecha/mecha/ast.py | 25 ++++ packages/mecha/mecha/parse.py | 117 ++++++++++++++++++ ...amples_minecraft_block_predicate_36__0.txt | 22 ++++ ...amples_minecraft_block_predicate_37__0.txt | 26 ++++ ...amples_minecraft_block_predicate_38__0.txt | 34 +++++ ...amples_minecraft_block_predicate_39__0.txt | 22 ++++ ...amples_minecraft_block_predicate_40__0.txt | 34 +++++ ...t_examples_minecraft_block_state_41__0.txt | 22 ++++ ...t_examples_minecraft_block_state_42__0.txt | 26 ++++ ...t_examples_minecraft_block_state_43__0.txt | 34 +++++ ...t_examples_minecraft_block_state_44__0.txt | 22 ++++ ...ent_examples_minecraft_dimension_54__0.txt | 20 +++ ...ent_examples_minecraft_dimension_55__0.txt | 20 +++ ...examples_minecraft_entity_summon_63__0.txt | 20 +++ ...examples_minecraft_entity_summon_64__0.txt | 16 +++ ...ment_examples_minecraft_function_70__0.txt | 16 +++ ...ment_examples_minecraft_function_71__0.txt | 20 +++ ...ment_examples_minecraft_function_72__0.txt | 16 +++ ...les_minecraft_resource_location_127__0.txt | 16 +++ ...les_minecraft_resource_location_128__0.txt | 20 +++ ...les_minecraft_resource_location_129__0.txt | 16 +++ 21 files changed, 564 insertions(+) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 80e25c645..5c4953a36 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -167,3 +167,28 @@ class AstJsonObject(AstJson): def get_value(self) -> JsonDict: return {entry.key.value: entry.value.get_value() for entry in self.entries} + + +@dataclass(frozen=True) +class AstResourceLocation(AstNode): + """Ast resource location node.""" + + is_tag: bool + namespace: Optional[AstValue[str]] + path: AstValue[str] + + +@dataclass(frozen=True) +class AstBlockState(AstNode): + """Ast block state node.""" + + name: AstValue[str] + value: AstValue[str] + + +@dataclass(frozen=True) +class AstBlock(AstNode): + """Ast block node.""" + + identifier: AstResourceLocation + block_states: AstChildren[AstBlockState] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 6173402db..6ed1c253b 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -14,6 +14,8 @@ "Vector2Parser", "Vector3Parser", "JsonParser", + "ResourceLocationParser", + "BlockParser", "INTEGER_PATTERN", "FLOAT_PATTERN", ] @@ -37,6 +39,8 @@ from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream from .ast import ( + AstBlock, + AstBlockState, AstChildren, AstCommand, AstCoordinate, @@ -46,6 +50,7 @@ AstJsonObjectEntry, AstJsonValue, AstNode, + AstResourceLocation, AstRoot, AstValue, AstVector2, @@ -108,7 +113,15 @@ def get_default_parsers() -> Dict[str, Parser]: "minecraft:block_pos": Vector3Parser[float]( coordinate_parser=CoordinateParser[float](type=float), ), + "minecraft:block_predicate": BlockParser(), + "minecraft:block_state": BlockParser( + resource_location_parser=ResourceLocationParser(allow_tag=False) + ), "minecraft:component": delegate("json"), + "minecraft:dimension": delegate("minecraft:resource_location"), + "minecraft:entity_summon": delegate("minecraft:resource_location"), + "minecraft:function": ResourceLocationParser(), + "minecraft:resource_location": ResourceLocationParser(allow_tag=False), } @@ -548,3 +561,107 @@ def __call__(self, stream: TokenStream) -> AstJson: location=stream.current.location, end_location=stream.current.end_location, ) + + +@dataclass +class ResourceLocationParser: + """Parser for resource locations.""" + + allow_tag: bool = True + + def __call__(self, stream: TokenStream) -> AstResourceLocation: + with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_\-\.]+"): + token = stream.expect("resource_location") + value = token.value + location = token.location + + if is_tag := value.startswith("#"): + if not self.allow_tag: + raise token.emit_error( + InvalidSyntax(f"Reference to tag {token.value!r} not allowed.") + ) + value = value[1:] + location = location.with_horizontal_offset(1) + + namespace, _, path = value.rpartition(":") + + if namespace: + namespace = AstValue[str]( + value=namespace, + location=location, + end_location=location.with_horizontal_offset(len(namespace)), + ) + location = namespace.end_location.with_horizontal_offset(1) + else: + namespace = None + + return AstResourceLocation( + is_tag=is_tag, + namespace=namespace, + path=AstValue[str]( + value=path, location=location, end_location=token.end_location + ), + location=token.location, + end_location=token.end_location, + ) + + +@dataclass +class BlockParser: + """Parser for minecraft blocks.""" + + resource_location_parser: Parser = field(default_factory=ResourceLocationParser) + + allow_block_states: bool = True + + def __call__(self, stream: TokenStream) -> AstBlock: + identifier = self.resource_location_parser(stream) + location = identifier.location + end_location = identifier.end_location + + with stream.syntax( + bracket=r"\[|\]", + state=r"[a-z0-9_]+", + equal=r"=", + comma=r",", + ), stream.checkpoint() as commit: + block_states: List[AstBlockState] = [] + + with stream.intercept("whitespace"): + stream.expect(("bracket", "[")) + + commit() + + for name in stream.collect("state"): + stream.expect("equal") + value = stream.expect("state") + + block_states.append( + AstBlockState( + name=AstValue[str]( + value=name.value, + location=name.location, + end_location=name.end_location, + ), + value=AstValue[str]( + value=value.value, + location=value.location, + end_location=value.end_location, + ), + location=name.location, + end_location=value.end_location, + ) + ) + + if not stream.get("comma"): + break + + close_bracket = stream.expect(("bracket", "]")) + end_location = close_bracket.end_location + + return AstBlock( + identifier=identifier, + block_states=AstChildren(block_states), + location=location, + end_location=end_location, + ) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt new file mode 100644 index 000000000..d9e330c37 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt @@ -0,0 +1,22 @@ +minecraft:block_predicate +--- +{} +--- +stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stone' + block_states: + diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt new file mode 100644 index 000000000..0af25350f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt @@ -0,0 +1,26 @@ +minecraft:block_predicate +--- +{} +--- +minecraft:stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'stone' + block_states: + diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt new file mode 100644 index 000000000..00734d904 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt @@ -0,0 +1,34 @@ +minecraft:block_predicate +--- +{} +--- +stone[foo=bar] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stone' + block_states: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt new file mode 100644 index 000000000..fd0c293a0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt @@ -0,0 +1,22 @@ +minecraft:block_predicate +--- +{} +--- +#stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + is_tag: True + namespace: None + path: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'stone' + block_states: + diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt new file mode 100644 index 000000000..efcb1f40e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt @@ -0,0 +1,34 @@ +minecraft:block_predicate +--- +{} +--- +#stone[foo=bar]{baz:nbt} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + is_tag: True + namespace: None + path: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'stone' + block_states: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + name: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'foo' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt new file mode 100644 index 000000000..66ef40a30 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt @@ -0,0 +1,22 @@ +minecraft:block_state +--- +{} +--- +stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stone' + block_states: + diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt new file mode 100644 index 000000000..124dd24dc --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt @@ -0,0 +1,26 @@ +minecraft:block_state +--- +{} +--- +minecraft:stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'stone' + block_states: + diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt new file mode 100644 index 000000000..67627b204 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt @@ -0,0 +1,34 @@ +minecraft:block_state +--- +{} +--- +stone[foo=bar] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stone' + block_states: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt new file mode 100644 index 000000000..827cc6e21 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt @@ -0,0 +1,22 @@ +minecraft:block_state +--- +{} +--- +foo{bar:baz} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + block_states: + diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt new file mode 100644 index 000000000..b7d7809f4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt @@ -0,0 +1,20 @@ +minecraft:dimension +--- +{} +--- +minecraft:overworld +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'overworld' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt new file mode 100644 index 000000000..1335f9969 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt @@ -0,0 +1,20 @@ +minecraft:dimension +--- +{} +--- +minecraft:the_nether +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'the_nether' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt new file mode 100644 index 000000000..0bc2e86df --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt @@ -0,0 +1,20 @@ +minecraft:entity_summon +--- +{} +--- +minecraft:pig +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'pig' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt new file mode 100644 index 000000000..3c4fbe5df --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt @@ -0,0 +1,16 @@ +minecraft:entity_summon +--- +{} +--- +cow +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'cow' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt new file mode 100644 index 000000000..3397ca6a2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt @@ -0,0 +1,16 @@ +minecraft:function +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt new file mode 100644 index 000000000..719baf24c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt @@ -0,0 +1,20 @@ +minecraft:function +--- +{} +--- +foo:bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + path: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt new file mode 100644 index 000000000..778bd9e89 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt @@ -0,0 +1,16 @@ +minecraft:function +--- +{} +--- +#foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + is_tag: True + namespace: None + path: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt new file mode 100644 index 000000000..2c7ca4c10 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt @@ -0,0 +1,16 @@ +minecraft:resource_location +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt new file mode 100644 index 000000000..a13068ace --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt @@ -0,0 +1,20 @@ +minecraft:resource_location +--- +{} +--- +foo:bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + path: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt new file mode 100644 index 000000000..2eb357f56 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt @@ -0,0 +1,16 @@ +minecraft:resource_location +--- +{} +--- +012 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: '012' \ No newline at end of file From 8e6fee5e44360051f35b712670f206f3c6399770 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 02:21:41 +0200 Subject: [PATCH 0265/1554] refactor: rename blockstate name to key --- packages/mecha/mecha/ast.py | 2 +- packages/mecha/mecha/parse.py | 2 +- ...parse__argument_examples_minecraft_block_predicate_38__0.txt | 2 +- ...parse__argument_examples_minecraft_block_predicate_40__0.txt | 2 +- .../parse__argument_examples_minecraft_block_state_43__0.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 5c4953a36..cee3c3f66 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -182,7 +182,7 @@ class AstResourceLocation(AstNode): class AstBlockState(AstNode): """Ast block state node.""" - name: AstValue[str] + key: AstValue[str] value: AstValue[str] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 6ed1c253b..517af69ab 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -638,7 +638,7 @@ def __call__(self, stream: TokenStream) -> AstBlock: block_states.append( AstBlockState( - name=AstValue[str]( + key=AstValue[str]( value=name.value, location=name.location, end_location=name.end_location, diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt index 00734d904..a9911937f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt @@ -22,7 +22,7 @@ stone[foo=bar] location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: + key: location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt index efcb1f40e..2be0c55a6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt @@ -22,7 +22,7 @@ minecraft:block_predicate location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=14, lineno=1, colno=15) - name: + key: location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt index 67627b204..5700afec7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt @@ -22,7 +22,7 @@ stone[foo=bar] location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: + key: location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) From 1b0de6e3a3f5afdcbcfa34f9476d3a7dfb6d7a86 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 04:22:37 +0200 Subject: [PATCH 0266/1554] feat: parse nbt --- packages/mecha/mecha/ast.py | 65 +++++- packages/mecha/mecha/parse.py | 205 +++++++++++++++++- ...amples_minecraft_block_predicate_36__0.txt | 1 + ...amples_minecraft_block_predicate_37__0.txt | 1 + ...amples_minecraft_block_predicate_38__0.txt | 3 +- ...amples_minecraft_block_predicate_39__0.txt | 1 + ...amples_minecraft_block_predicate_40__0.txt | 22 +- ...t_examples_minecraft_block_state_41__0.txt | 1 + ...t_examples_minecraft_block_state_42__0.txt | 1 + ...t_examples_minecraft_block_state_43__0.txt | 3 +- ...t_examples_minecraft_block_state_44__0.txt | 20 +- ...ples_minecraft_nbt_compound_tag_100__0.txt | 11 + ...ples_minecraft_nbt_compound_tag_101__0.txt | 23 ++ ...ment_examples_minecraft_nbt_tag_109__0.txt | 10 + ...ment_examples_minecraft_nbt_tag_110__0.txt | 10 + ...ment_examples_minecraft_nbt_tag_111__0.txt | 10 + ...ment_examples_minecraft_nbt_tag_112__0.txt | 10 + ...ment_examples_minecraft_nbt_tag_113__0.txt | 10 + ...ment_examples_minecraft_nbt_tag_114__0.txt | 23 ++ 19 files changed, 419 insertions(+), 11 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index cee3c3f66..92f3c422d 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -12,6 +12,14 @@ "AstJsonArray", "AstJsonObjectEntry", "AstJsonObject", + "AstNbt", + "AstNbtValue", + "AstNbtList", + "AstNbtCompoundEntry", + "AstNbtCompound", + "AstResourceLocation", + "AstBlockState", + "AstBlock", ] @@ -29,6 +37,11 @@ ) from beet.core.utils import JsonDict + +# pyright: reportMissingTypeStubs=false +from nbtlib import Byte, Compound, Double, Float, Int +from nbtlib import List as ListTag +from nbtlib import Long, Short, String from tokenstream import SourceLocation T = TypeVar("T") @@ -61,7 +74,7 @@ def dump(self, prefix: str = "") -> str: return f"{prefix}{self.__class__}\n" + "\n".join( f"{prefix} {f.name}:" + ( - "\n" + ("\n".join(child.dump(prefix + " ") for child in attribute) if attribute else prefix + " \n") # type: ignore + "\n" + ("\n".join(child.dump(prefix + " ") for child in attribute) if attribute else prefix + " ") # type: ignore if isinstance(attribute := getattr(self, f.name), AstChildren) else "\n" + attribute.dump(prefix + " ") if isinstance(attribute, AstNode) @@ -169,6 +182,55 @@ def get_value(self) -> JsonDict: return {entry.key.value: entry.value.get_value() for entry in self.entries} +@dataclass(frozen=True) +class AstNbt(AstNode): + """Base ast node for nbt.""" + + def get_value(self) -> Any: + """Return the nbt value.""" + raise NotImplementedError() + + +@dataclass(frozen=True) +class AstNbtValue(AstNbt): + """Ast nbt value node.""" + + value: Union[Byte, Short, Int, Long, Float, Double, String] + + def get_value(self) -> Union[Byte, Short, Int, Long, Float, Double, String]: + return self.value + + +@dataclass(frozen=True) +class AstNbtList(AstNbt): + """Ast nbt list node.""" + + elements: AstChildren[AstNbt] + + def get_value(self) -> ListTag: + return ListTag([element.get_value() for element in self.elements]) + + +@dataclass(frozen=True) +class AstNbtCompoundEntry(AstNode): + """Ast nbt compound entry node.""" + + key: AstValue[str] + value: AstNbt + + +@dataclass(frozen=True) +class AstNbtCompound(AstNbt): + """Ast nbt compound node.""" + + entries: AstChildren[AstNbtCompoundEntry] + + def get_value(self) -> Any: + return Compound( + {entry.key.value: entry.value.get_value() for entry in self.entries}, + ) + + @dataclass(frozen=True) class AstResourceLocation(AstNode): """Ast resource location node.""" @@ -192,3 +254,4 @@ class AstBlock(AstNode): identifier: AstResourceLocation block_states: AstChildren[AstBlockState] + data_tags: Optional[AstNbt] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 517af69ab..078c9395b 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -14,6 +14,9 @@ "Vector2Parser", "Vector3Parser", "JsonParser", + "NbtParser", + "parse_compound_tag", + "parse_adjacent_nbt", "ResourceLocationParser", "BlockParser", "INTEGER_PATTERN", @@ -36,6 +39,8 @@ overload, ) +# pyright: reportMissingTypeStubs=false +from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream from .ast import ( @@ -49,6 +54,11 @@ AstJsonObject, AstJsonObjectEntry, AstJsonValue, + AstNbt, + AstNbtCompound, + AstNbtCompoundEntry, + AstNbtList, + AstNbtValue, AstNode, AstResourceLocation, AstRoot, @@ -73,6 +83,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command": parse_command, "argument": parse_argument, "json": JsonParser(), + "nbt": NbtParser(), "brigadier:bool": parse_bool, "brigadier:double": NumericParser[float]( type=float, @@ -121,6 +132,8 @@ def get_default_parsers() -> Dict[str, Parser]: "minecraft:dimension": delegate("minecraft:resource_location"), "minecraft:entity_summon": delegate("minecraft:resource_location"), "minecraft:function": ResourceLocationParser(), + "minecraft:nbt_compound_tag": parse_compound_tag, + "minecraft:nbt_tag": delegate("nbt"), "minecraft:resource_location": ResourceLocationParser(allow_tag=False), } @@ -543,10 +556,8 @@ def __call__(self, stream: TokenStream) -> AstJson: end_location=close_bracket.end_location, ) - value = None - if null: - pass + value = None elif true: value = True elif false: @@ -557,12 +568,178 @@ def __call__(self, stream: TokenStream) -> AstJson: value = float(number.value) return AstJsonValue( - value=value, + value=value, # type: ignore location=stream.current.location, end_location=stream.current.end_location, ) +@dataclass +class NbtParser: + """Parser for nbt tags.""" + + number_suffixes: Dict[str, Type[Any]] = field( + default_factory=lambda: { + "b": Byte, + "s": Short, + "l": Long, + "f": Float, + "d": Double, + } + ) + + literal_aliases: Dict[str, Any] = field( + default_factory=lambda: { + "true": Byte(1), + "false": Byte(0), + } + ) + + quoted_string_handler: QuotedStringHandler = field( + default_factory=lambda: QuotedStringHandler( + escape_sequences={ + r"\\": "\\", + } + ) + ) + + def __call__(self, stream: TokenStream) -> AstNbt: + with stream.syntax( + curly=r"\{|\}", + bracket=r"\[|\]", + quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", + number=r"[+-]?(?:[0-9]*?\.[0-9]+|[0-9]+\.[0-9]*?|[1-9][0-9]*|0)([eE][+-]?[0-9]+)?[bslfdBSLFD]?(?![a-zA-Z0-9._+-])", + string=r"[a-zA-Z0-9._+-]+", + colon=r":", + comma=r",", + ): + curly, bracket, number, string, quoted_string = stream.expect( + ("curly", "{"), + ("bracket", "["), + "number", + "string", + "quoted_string", + ) + + if curly: + entries: List[AstNbtCompoundEntry] = [] + + for key in stream.collect_any("number", "string", "quoted_string"): + stream.expect("colon") + value = self(stream) + entries.append( + AstNbtCompoundEntry( + key=AstValue[str]( + value=( + self.quoted_string_handler.unquote_string(key) + if key.match("quoted_string") + else key.value + ), + location=key.location, + end_location=key.end_location, + ), + value=value, + location=key.location, + end_location=value.end_location, + ) + ) + + if not stream.get("comma"): + break + + close_curly = stream.expect(("curly", "}")) + + return AstNbtCompound( + entries=AstChildren(entries), + location=curly.location, + end_location=close_curly.end_location, + ) + + elif bracket: + elements: List[AstNbt] = [] + + for _ in stream.peek_until(("bracket", "]")): + elements.append(self(stream)) + + if not stream.get("comma"): + stream.expect(("bracket", "]")) + break + + for element in elements[1:]: + node_type = type(elements[0]) + if ( + type(element) != node_type + or isinstance(element, AstNbtValue) + and type(element.get_value()) != type(elements[0].get_value()) + ): + raise InvalidSyntax( + "All the elements should have the same type." + ).set_location( + location=elements[0].location, + end_location=elements[-1].end_location, + ) + + return AstNbtList( + elements=AstChildren(elements), + location=bracket.location, + end_location=stream.current.end_location, + ) + + if number: + suffix = number.value[-1].lower() + + try: + if suffix in self.number_suffixes: + value = self.number_suffixes[suffix](number.value[:-1]) + else: + value = ( + Double(number.value) + if "." in number.value + else Int(number.value) + ) + except (OutOfRange, ValueError): + value = String(number.value) + + elif string: + alias = string.value.lower() + + if alias in self.literal_aliases: + value = self.literal_aliases[alias] + else: + value = String(string.value) + + elif quoted_string: + value = String(self.quoted_string_handler.unquote_string(quoted_string)) + + return AstNbtValue( + value=value, # type: ignore + location=stream.current.location, + end_location=stream.current.end_location, + ) + + +def parse_compound_tag(stream: TokenStream) -> AstNbtCompound: + """Parse compound tag.""" + node = delegate("nbt", stream) + + if isinstance(node, AstNbtCompound): + return node + + raise InvalidSyntax("Expected nbt compound tag.").set_location( + location=node.location, + end_location=node.end_location, + ) + + +def parse_adjacent_nbt(stream: TokenStream) -> Optional[AstNbtCompound]: + """Parse adjacent nbt.""" + with stream.syntax(curly=r"\{"), stream.intercept("whitespace"): + found_curly = ( + lookahead.match("curly") if (lookahead := stream.peek()) else False + ) + return parse_compound_tag(stream) if found_curly else None + + @dataclass class ResourceLocationParser: """Parser for resource locations.""" @@ -613,6 +790,7 @@ class BlockParser: resource_location_parser: Parser = field(default_factory=ResourceLocationParser) allow_block_states: bool = True + allow_data_tags: bool = True def __call__(self, stream: TokenStream) -> AstBlock: identifier = self.resource_location_parser(stream) @@ -659,9 +837,26 @@ def __call__(self, stream: TokenStream) -> AstBlock: close_bracket = stream.expect(("bracket", "]")) end_location = close_bracket.end_location + data_tags = parse_adjacent_nbt(stream) + + if block_states and not self.allow_block_states: + raise InvalidSyntax("Block states not allowed.").set_location( + location=block_states[0].location, + end_location=block_states[-1].end_location, + ) + + if data_tags is not None and not self.allow_data_tags: + raise InvalidSyntax("Data tags not allowed.").set_location( + location=data_tags.location, + end_location=data_tags.end_location, + ) + return AstBlock( identifier=identifier, block_states=AstChildren(block_states), + data_tags=data_tags, location=location, - end_location=end_location, + end_location=( + data_tags.end_location if data_tags is not None else end_location + ), ) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt index d9e330c37..aebe88fc4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt @@ -20,3 +20,4 @@ stone value: 'stone' block_states: + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt index 0af25350f..a70530b1b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt @@ -24,3 +24,4 @@ minecraft:stone value: 'stone' block_states: + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt index a9911937f..b35a7661f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt @@ -31,4 +31,5 @@ stone[foo=bar] location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'bar' \ No newline at end of file + value: 'bar' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt index fd0c293a0..5ca01d24c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt @@ -20,3 +20,4 @@ minecraft:block_predicate value: 'stone' block_states: + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt index 2be0c55a6..ed45cfef7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt @@ -6,7 +6,7 @@ minecraft:block_predicate --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=24, lineno=1, colno=25) identifier: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -31,4 +31,22 @@ minecraft:block_predicate location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'bar' \ No newline at end of file + value: 'bar' + data_tags: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + entries: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + key: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'baz' + value: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: String('nbt') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt index 66ef40a30..17cdb5f30 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt @@ -20,3 +20,4 @@ stone value: 'stone' block_states: + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt index 124dd24dc..57011615d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt @@ -24,3 +24,4 @@ minecraft:stone value: 'stone' block_states: + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt index 5700afec7..021389745 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt @@ -31,4 +31,5 @@ stone[foo=bar] location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'bar' \ No newline at end of file + value: 'bar' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt index 827cc6e21..64e404b06 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt @@ -6,7 +6,7 @@ foo{bar:baz} --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=12, lineno=1, colno=13) identifier: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -20,3 +20,21 @@ foo{bar:baz} value: 'foo' block_states: + data_tags: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + entries: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: String('baz') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt new file mode 100644 index 000000000..2fd4f3bbf --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt @@ -0,0 +1,11 @@ +minecraft:nbt_compound_tag +--- +{} +--- +{} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + entries: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt new file mode 100644 index 000000000..51af89d2c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt @@ -0,0 +1,23 @@ +minecraft:nbt_compound_tag +--- +{} +--- +{foo:bar} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: String('bar') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt new file mode 100644 index 000000000..cad85f4d0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: Int(0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt new file mode 100644 index 000000000..65439dc3a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag +--- +{} +--- +0b +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: Byte(0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt new file mode 100644 index 000000000..3a4ce815e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag +--- +{} +--- +0l +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: Long(0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt new file mode 100644 index 000000000..772589570 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag +--- +{} +--- +0.0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: Double(0.0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt new file mode 100644 index 000000000..5bad61fc1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag +--- +{} +--- +"foo" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: String('foo') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt new file mode 100644 index 000000000..58b3f3cae --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt @@ -0,0 +1,23 @@ +minecraft:nbt_tag +--- +{} +--- +{foo:bar} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: String('bar') \ No newline at end of file From f3fb9f46b1a4eb1f68762c7b87bb14347d866258 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 04:30:50 +0200 Subject: [PATCH 0267/1554] chore: pyright really doesn't like nbtlib :( --- packages/mecha/mecha/ast.py | 35 +++++++++++------------------------ packages/mecha/mecha/parse.py | 12 ++++++------ 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 92f3c422d..38d016e42 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -24,24 +24,11 @@ from dataclasses import dataclass, field, fields -from typing import ( - Any, - Generic, - Iterator, - List, - Literal, - Optional, - Tuple, - TypeVar, - Union, -) - -from beet.core.utils import JsonDict +from typing import Any, Generic, Iterator, Literal, Optional, Tuple, TypeVar # pyright: reportMissingTypeStubs=false -from nbtlib import Byte, Compound, Double, Float, Int +from nbtlib import Compound from nbtlib import List as ListTag -from nbtlib import Long, Short, String from tokenstream import SourceLocation T = TypeVar("T") @@ -148,9 +135,9 @@ def get_value(self) -> Any: class AstJsonValue(AstJson): """Ast json value node.""" - value: Union[None, bool, str, float] + value: Any - def get_value(self) -> Union[None, bool, str, float]: + def get_value(self) -> Any: return self.value @@ -160,7 +147,7 @@ class AstJsonArray(AstJson): elements: AstChildren[AstJson] - def get_value(self) -> List[Any]: + def get_value(self) -> Any: return [element.get_value() for element in self.elements] @@ -178,7 +165,7 @@ class AstJsonObject(AstJson): entries: AstChildren[AstJsonObjectEntry] - def get_value(self) -> JsonDict: + def get_value(self) -> Any: return {entry.key.value: entry.value.get_value() for entry in self.entries} @@ -195,9 +182,9 @@ def get_value(self) -> Any: class AstNbtValue(AstNbt): """Ast nbt value node.""" - value: Union[Byte, Short, Int, Long, Float, Double, String] + value: Any - def get_value(self) -> Union[Byte, Short, Int, Long, Float, Double, String]: + def get_value(self) -> Any: return self.value @@ -207,8 +194,8 @@ class AstNbtList(AstNbt): elements: AstChildren[AstNbt] - def get_value(self) -> ListTag: - return ListTag([element.get_value() for element in self.elements]) + def get_value(self) -> Any: + return ListTag([element.get_value() for element in self.elements]) # type: ignore @dataclass(frozen=True) @@ -226,7 +213,7 @@ class AstNbtCompound(AstNbt): entries: AstChildren[AstNbtCompoundEntry] def get_value(self) -> Any: - return Compound( + return Compound( # type: ignore {entry.key.value: entry.value.get_value() for entry in self.entries}, ) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 078c9395b..c8c31a865 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -579,7 +579,7 @@ class NbtParser: """Parser for nbt tags.""" number_suffixes: Dict[str, Type[Any]] = field( - default_factory=lambda: { + default_factory=lambda: { # type: ignore "b": Byte, "s": Short, "l": Long, @@ -589,7 +589,7 @@ class NbtParser: ) literal_aliases: Dict[str, Any] = field( - default_factory=lambda: { + default_factory=lambda: { # type: ignore "true": Byte(1), "false": Byte(0), } @@ -692,13 +692,13 @@ def __call__(self, stream: TokenStream) -> AstNbt: if suffix in self.number_suffixes: value = self.number_suffixes[suffix](number.value[:-1]) else: - value = ( + value = ( # type: ignore Double(number.value) if "." in number.value else Int(number.value) ) except (OutOfRange, ValueError): - value = String(number.value) + value = String(number.value) # type: ignore elif string: alias = string.value.lower() @@ -706,10 +706,10 @@ def __call__(self, stream: TokenStream) -> AstNbt: if alias in self.literal_aliases: value = self.literal_aliases[alias] else: - value = String(string.value) + value = String(string.value) # type: ignore elif quoted_string: - value = String(self.quoted_string_handler.unquote_string(quoted_string)) + value = String(self.quoted_string_handler.unquote_string(quoted_string)) # type: ignore return AstNbtValue( value=value, # type: ignore From 4b530044f91db50a83718053f3dacc5fc04fe05f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 04:44:11 +0200 Subject: [PATCH 0268/1554] feat: add item parser --- packages/mecha/mecha/ast.py | 9 +++++ packages/mecha/mecha/parse.py | 39 ++++++++++++++++++- ...xamples_minecraft_item_predicate_84__0.txt | 21 ++++++++++ ...xamples_minecraft_item_predicate_85__0.txt | 25 ++++++++++++ ...xamples_minecraft_item_predicate_86__0.txt | 21 ++++++++++ ...xamples_minecraft_item_predicate_87__0.txt | 38 ++++++++++++++++++ ...nt_examples_minecraft_item_stack_91__0.txt | 21 ++++++++++ ...nt_examples_minecraft_item_stack_92__0.txt | 25 ++++++++++++ ...nt_examples_minecraft_item_stack_93__0.txt | 38 ++++++++++++++++++ 9 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 38d016e42..180ea13a1 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -20,6 +20,7 @@ "AstResourceLocation", "AstBlockState", "AstBlock", + "AstItem", ] @@ -242,3 +243,11 @@ class AstBlock(AstNode): identifier: AstResourceLocation block_states: AstChildren[AstBlockState] data_tags: Optional[AstNbt] + + +@dataclass(frozen=True) +class AstItem(AstNode): + """Ast item node.""" + + identifier: AstResourceLocation + data_tags: Optional[AstNbt] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index c8c31a865..bb2f99832 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -19,6 +19,7 @@ "parse_adjacent_nbt", "ResourceLocationParser", "BlockParser", + "ItemParser", "INTEGER_PATTERN", "FLOAT_PATTERN", ] @@ -49,6 +50,7 @@ AstChildren, AstCommand, AstCoordinate, + AstItem, AstJson, AstJsonArray, AstJsonObject, @@ -126,12 +128,16 @@ def get_default_parsers() -> Dict[str, Parser]: ), "minecraft:block_predicate": BlockParser(), "minecraft:block_state": BlockParser( - resource_location_parser=ResourceLocationParser(allow_tag=False) + resource_location_parser=ResourceLocationParser(allow_tag=False), ), "minecraft:component": delegate("json"), "minecraft:dimension": delegate("minecraft:resource_location"), "minecraft:entity_summon": delegate("minecraft:resource_location"), "minecraft:function": ResourceLocationParser(), + "minecraft:item_predicate": ItemParser(), + "minecraft:item_stack": ItemParser( + resource_location_parser=ResourceLocationParser(allow_tag=False), + ), "minecraft:nbt_compound_tag": parse_compound_tag, "minecraft:nbt_tag": delegate("nbt"), "minecraft:resource_location": ResourceLocationParser(allow_tag=False), @@ -860,3 +866,34 @@ def __call__(self, stream: TokenStream) -> AstBlock: data_tags.end_location if data_tags is not None else end_location ), ) + + +@dataclass +class ItemParser: + """Parser for minecraft items.""" + + resource_location_parser: Parser = field(default_factory=ResourceLocationParser) + + allow_data_tags: bool = True + + def __call__(self, stream: TokenStream) -> AstItem: + identifier = self.resource_location_parser(stream) + location = identifier.location + end_location = identifier.end_location + + data_tags = parse_adjacent_nbt(stream) + + if data_tags is not None and not self.allow_data_tags: + raise InvalidSyntax("Data tags not allowed.").set_location( + location=data_tags.location, + end_location=data_tags.end_location, + ) + + return AstItem( + identifier=identifier, + data_tags=data_tags, + location=location, + end_location=( + data_tags.end_location if data_tags is not None else end_location + ), + ) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt new file mode 100644 index 000000000..f8237b328 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt @@ -0,0 +1,21 @@ +minecraft:item_predicate +--- +{} +--- +stick +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stick' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt new file mode 100644 index 000000000..1bdacf2d9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt @@ -0,0 +1,25 @@ +minecraft:item_predicate +--- +{} +--- +minecraft:stick +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'stick' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt new file mode 100644 index 000000000..bd8c01fbc --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt @@ -0,0 +1,21 @@ +minecraft:item_predicate +--- +{} +--- +#stick +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + is_tag: True + namespace: None + path: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'stick' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt new file mode 100644 index 000000000..e58fb2758 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt @@ -0,0 +1,38 @@ +minecraft:item_predicate +--- +{} +--- +#stick{foo:bar} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + is_tag: True + namespace: None + path: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'stick' + data_tags: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + entries: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + key: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'foo' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: String('bar') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt new file mode 100644 index 000000000..e36a6e8ab --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt @@ -0,0 +1,21 @@ +minecraft:item_stack +--- +{} +--- +stick +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stick' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt new file mode 100644 index 000000000..0a3daf7c3 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt @@ -0,0 +1,25 @@ +minecraft:item_stack +--- +{} +--- +minecraft:stick +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'stick' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt new file mode 100644 index 000000000..ca9cad38f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt @@ -0,0 +1,38 @@ +minecraft:item_stack +--- +{} +--- +stick{foo:bar} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'stick' + data_tags: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + entries: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + key: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: String('bar') \ No newline at end of file From ba8221ba7f2248b18a08a2dc8942d34c1962a1b5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 18:23:09 +0200 Subject: [PATCH 0269/1554] feat: implement more parsers --- packages/mecha/mecha/ast.py | 19 +++++ packages/mecha/mecha/parse.py | 80 +++++++++++++++++++ packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- ...rgument_examples_minecraft_color_45__0.txt | 10 +++ ...rgument_examples_minecraft_color_46__0.txt | 10 +++ ...nt_examples_minecraft_column_pos_47__0.txt | 21 +++++ ...nt_examples_minecraft_column_pos_48__0.txt | 21 +++++ ...nt_examples_minecraft_column_pos_49__0.txt | 21 +++++ ...examples_minecraft_entity_anchor_61__0.txt | 10 +++ ...examples_minecraft_entity_anchor_62__0.txt | 10 +++ ...t_examples_minecraft_float_range_65__0.txt | 11 +++ ...t_examples_minecraft_float_range_66__0.txt | 11 +++ ...t_examples_minecraft_float_range_67__0.txt | 11 +++ ...t_examples_minecraft_float_range_68__0.txt | 11 +++ ...t_examples_minecraft_float_range_69__0.txt | 11 +++ ...ent_examples_minecraft_int_range_77__0.txt | 11 +++ ...ent_examples_minecraft_int_range_78__0.txt | 11 +++ ...ent_examples_minecraft_int_range_79__0.txt | 11 +++ ...ent_examples_minecraft_int_range_80__0.txt | 11 +++ ...ent_examples_minecraft_int_range_81__0.txt | 11 +++ 21 files changed, 317 insertions(+), 5 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 180ea13a1..c7d520856 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -21,6 +21,7 @@ "AstBlockState", "AstBlock", "AstItem", + "AstRange", ] @@ -251,3 +252,21 @@ class AstItem(AstNode): identifier: AstResourceLocation data_tags: Optional[AstNbt] + + +@dataclass(frozen=True) +class AstRange(AstNode, Generic[NumericType]): + """Ast range node.""" + + min: Optional[NumericType] + max: Optional[NumericType] + + @property + def exact(self) -> bool: + """Wether the range is an exact match.""" + return self.min == self.max + + @property + def value(self) -> NumericType: + """Return the exact value.""" + return self.min # type: ignore diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index bb2f99832..824c6058a 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -20,6 +20,8 @@ "ResourceLocationParser", "BlockParser", "ItemParser", + "LiteralStringParser", + "RangeParser", "INTEGER_PATTERN", "FLOAT_PATTERN", ] @@ -62,6 +64,7 @@ AstNbtList, AstNbtValue, AstNode, + AstRange, AstResourceLocation, AstRoot, AstValue, @@ -130,9 +133,39 @@ def get_default_parsers() -> Dict[str, Parser]: "minecraft:block_state": BlockParser( resource_location_parser=ResourceLocationParser(allow_tag=False), ), + "minecraft:color": LiteralStringParser( + [ + "reset", + "black", + "dark_blue", + "dark_green", + "dark_aqua", + "dark_red", + "dark_purple", + "gold", + "gray", + "dark_gray", + "blue", + "green", + "aqua", + "red", + "light_purple", + "yellow", + "white", + ] + ), + "minecraft:column_pos": Vector2Parser( + coordinate_parser=CoordinateParser[int]( + type=int, + allow_local=False, + ), + ), "minecraft:component": delegate("json"), "minecraft:dimension": delegate("minecraft:resource_location"), + "minecraft:entity_anchor": LiteralStringParser(["eyes", "feet"]), "minecraft:entity_summon": delegate("minecraft:resource_location"), + "minecraft:float_range": RangeParser[float](type=float), + "minecraft:int_range": RangeParser[int](type=int), "minecraft:function": ResourceLocationParser(), "minecraft:item_predicate": ItemParser(), "minecraft:item_stack": ItemParser( @@ -897,3 +930,50 @@ def __call__(self, stream: TokenStream) -> AstItem: data_tags.end_location if data_tags is not None else end_location ), ) + + +@dataclass +class LiteralStringParser: + """Parser for literal strings.""" + + values: List[str] + + def __call__(self, stream: TokenStream) -> AstValue[str]: + patterns = [("literal", value) for value in self.values] + token = stream.expect_any(*patterns) + + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) + + +@dataclass +class RangeParser(Generic[NumericType]): + """Parser for ranges.""" + + type: Type[NumericType] + pattern: str = ( + fr"\.\.{FLOAT_PATTERN}|{FLOAT_PATTERN}\.\.(?:{FLOAT_PATTERN})?|{FLOAT_PATTERN}" + ) + + def __call__(self, stream: TokenStream) -> AstRange[NumericType]: + with stream.syntax(range=self.pattern): + token = stream.expect("range") + minimum, separator, maximum = token.value.partition("..") + + if not separator: + maximum = minimum + + if issubclass(self.type, int) and "." in minimum: + raise token.emit_error(InvalidSyntax(f"Decimal minimum not allowed.")) + if issubclass(self.type, int) and "." in maximum: + raise token.emit_error(InvalidSyntax(f"Decimal maximum not allowed.")) + + return AstRange[NumericType]( + min=self.type(minimum) if minimum else None, + max=self.type(maximum) if maximum else None, + location=token.location, + end_location=token.end_location, + ) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 766efe843..a8e4cc38b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -730,7 +730,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "0.7.1" +version = "0.7.2" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -847,7 +847,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "2c073d95f4cd36df15d3bf06fa3c8af3a361733bc221c2b48729b9c9fa3cdb3a" +content-hash = "34af40fc7704495fe089b39b395fdbc01c8d04eecff3bcdafddb3110d20dc6e4" [metadata.files] appdirs = [ @@ -1292,8 +1292,8 @@ soupsieve = [ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, ] tokenstream = [ - {file = "tokenstream-0.7.1-py3-none-any.whl", hash = "sha256:9ac6629bc6ebd07d2ca4d8db83b3c789d937cdaac21b57760003873773fe400d"}, - {file = "tokenstream-0.7.1.tar.gz", hash = "sha256:75e46c2524c9bd404aacfd4c40b280f129f1405c35989ea0fdfd9389702ad095"}, + {file = "tokenstream-0.7.2-py3-none-any.whl", hash = "sha256:e2229be2978887ddd52192e3d63c25ce6fe6fa5aa6217bb4428c2a182efed8da"}, + {file = "tokenstream-0.7.2.tar.gz", hash = "sha256:c276fa74b5473e1ee295bbc1c9b689903ff00e56b83d5ff7a027ecee1036fbb1"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e83c3078a..735814b99 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.36.0" -tokenstream = "^0.7.1" +tokenstream = "^0.7.2" [tool.poetry.dev-dependencies] black = "^21.7b0" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt new file mode 100644 index 000000000..811ab39a7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt @@ -0,0 +1,10 @@ +minecraft:color +--- +{} +--- +red +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'red' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt new file mode 100644 index 000000000..d021abbe3 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt @@ -0,0 +1,10 @@ +minecraft:color +--- +{} +--- +green +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'green' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt new file mode 100644 index 000000000..10b98f0ad --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt @@ -0,0 +1,21 @@ +minecraft:column_pos +--- +{} +--- +0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt new file mode 100644 index 000000000..74cf6df7c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt @@ -0,0 +1,21 @@ +minecraft:column_pos +--- +{} +--- +~ ~ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 + prefix: 'relative' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt new file mode 100644 index 000000000..c01fd7c72 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt @@ -0,0 +1,21 @@ +minecraft:column_pos +--- +{} +--- +~1 ~-2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 1 + prefix: 'relative' + y: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: -2 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt new file mode 100644 index 000000000..dd473b7a4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt @@ -0,0 +1,10 @@ +minecraft:entity_anchor +--- +{} +--- +eyes +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'eyes' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt new file mode 100644 index 000000000..c12931637 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt @@ -0,0 +1,10 @@ +minecraft:entity_anchor +--- +{} +--- +feet +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'feet' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt new file mode 100644 index 000000000..370ec43da --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt @@ -0,0 +1,11 @@ +minecraft:float_range +--- +{} +--- +0..5.2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + min: 0.0 + max: 5.2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt new file mode 100644 index 000000000..624fb14d2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt @@ -0,0 +1,11 @@ +minecraft:float_range +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + min: 0.0 + max: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt new file mode 100644 index 000000000..a1a7dd28b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt @@ -0,0 +1,11 @@ +minecraft:float_range +--- +{} +--- +-5.4 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + min: -5.4 + max: -5.4 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt new file mode 100644 index 000000000..563b2944d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt @@ -0,0 +1,11 @@ +minecraft:float_range +--- +{} +--- +-100.76.. +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + min: -100.76 + max: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt new file mode 100644 index 000000000..5f80127df --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt @@ -0,0 +1,11 @@ +minecraft:float_range +--- +{} +--- +..100 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + min: None + max: 100.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt new file mode 100644 index 000000000..3198e93aa --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt @@ -0,0 +1,11 @@ +minecraft:int_range +--- +{} +--- +0..5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + min: 0 + max: 5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt new file mode 100644 index 000000000..7ce0b4fba --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt @@ -0,0 +1,11 @@ +minecraft:int_range +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + min: 0 + max: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt new file mode 100644 index 000000000..fac1d5ea0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt @@ -0,0 +1,11 @@ +minecraft:int_range +--- +{} +--- +-5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + min: -5 + max: -5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt new file mode 100644 index 000000000..3f6964a33 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt @@ -0,0 +1,11 @@ +minecraft:int_range +--- +{} +--- +-100.. +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + min: -100 + max: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt new file mode 100644 index 000000000..adf5b358c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt @@ -0,0 +1,11 @@ +minecraft:int_range +--- +{} +--- +..100 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + min: None + max: 100 \ No newline at end of file From ed69941274bab2a3198e181f37022e424a0a54bf Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Aug 2021 19:49:41 +0200 Subject: [PATCH 0270/1554] feat: add even more parsers --- packages/mecha/mecha/ast.py | 12 +- packages/mecha/mecha/parse.py | 186 +++++++++++++++--- ...mples_minecraft_item_enchantment_82__0.txt | 10 + ...mples_minecraft_item_enchantment_83__0.txt | 10 + ...ent_examples_minecraft_item_slot_88__0.txt | 10 + ...ent_examples_minecraft_item_slot_89__0.txt | 10 + ...ent_examples_minecraft_item_slot_90__0.txt | 10 + ...nt_examples_minecraft_mob_effect_98__0.txt | 10 + ...nt_examples_minecraft_mob_effect_99__0.txt | 10 + ...nt_examples_minecraft_objective_115__0.txt | 10 + ...nt_examples_minecraft_objective_116__0.txt | 10 + ...nt_examples_minecraft_objective_117__0.txt | 10 + ...es_minecraft_objective_criteria_118__0.txt | 16 ++ ...es_minecraft_objective_criteria_119__0.txt | 16 ++ ...es_minecraft_objective_criteria_120__0.txt | 20 ++ ...nt_examples_minecraft_operation_121__0.txt | 10 + ...nt_examples_minecraft_operation_122__0.txt | 10 + ...nt_examples_minecraft_operation_123__0.txt | 10 + ...ent_examples_minecraft_rotation_130__0.txt | 21 ++ ...ent_examples_minecraft_rotation_131__0.txt | 21 ++ ...ent_examples_minecraft_rotation_132__0.txt | 21 ++ ...mples_minecraft_scoreboard_slot_137__0.txt | 10 + ...mples_minecraft_scoreboard_slot_138__0.txt | 10 + ...ment_examples_minecraft_swizzle_139__0.txt | 10 + ...ment_examples_minecraft_swizzle_140__0.txt | 10 + ...rgument_examples_minecraft_team_141__0.txt | 10 + ...rgument_examples_minecraft_team_142__0.txt | 10 + ...rgument_examples_minecraft_time_143__0.txt | 11 ++ ...rgument_examples_minecraft_time_144__0.txt | 11 ++ ...rgument_examples_minecraft_time_145__0.txt | 11 ++ ...rgument_examples_minecraft_time_146__0.txt | 11 ++ ...rgument_examples_minecraft_uuid_147__0.txt | 10 + ...rgument_examples_minecraft_vec2_148__0.txt | 21 ++ ...rgument_examples_minecraft_vec2_149__0.txt | 21 ++ ...rgument_examples_minecraft_vec2_150__0.txt | 21 ++ ...rgument_examples_minecraft_vec2_151__0.txt | 21 ++ ...rgument_examples_minecraft_vec3_152__0.txt | 27 +++ ...rgument_examples_minecraft_vec3_153__0.txt | 27 +++ ...rgument_examples_minecraft_vec3_154__0.txt | 27 +++ ...rgument_examples_minecraft_vec3_155__0.txt | 27 +++ ...rgument_examples_minecraft_vec3_156__0.txt | 27 +++ ...rgument_examples_minecraft_vec3_157__0.txt | 27 +++ 42 files changed, 774 insertions(+), 29 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index c7d520856..64b7396b9 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -22,6 +22,7 @@ "AstBlock", "AstItem", "AstRange", + "AstTime", ] @@ -101,9 +102,10 @@ class AstValue(AstNode, Generic[T]): @dataclass(frozen=True) -class AstCoordinate(AstValue[NumericType]): +class AstCoordinate(AstNode, Generic[NumericType]): """Coordinate ast node.""" + value: NumericType prefix: Literal["absolute", "relative", "local"] @@ -270,3 +272,11 @@ def exact(self) -> bool: def value(self) -> NumericType: """Return the exact value.""" return self.min # type: ignore + + +@dataclass(frozen=True) +class AstTime(AstNode): + """Ast time node.""" + + value: float + suffix: Literal[None, "d", "s", "t"] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 824c6058a..517c60bd6 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -22,8 +22,14 @@ "ItemParser", "LiteralStringParser", "RangeParser", + "parse_objective", + "parse_swizzle", + "parse_team", + "TimeParser", + "parse_uuid", "INTEGER_PATTERN", "FLOAT_PATTERN", + "CHAT_COLORS", ] import re @@ -67,6 +73,7 @@ AstRange, AstResourceLocation, AstRoot, + AstTime, AstValue, AstVector2, AstVector3, @@ -81,6 +88,26 @@ FLOAT_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" +CHAT_COLORS: List[str] = [ + "black", + "dark_blue", + "dark_green", + "dark_aqua", + "dark_red", + "dark_purple", + "gold", + "gray", + "dark_gray", + "blue", + "green", + "aqua", + "red", + "light_purple", + "yellow", + "white", +] + + def get_default_parsers() -> Dict[str, Parser]: """Return the default parsers.""" return { @@ -133,28 +160,8 @@ def get_default_parsers() -> Dict[str, Parser]: "minecraft:block_state": BlockParser( resource_location_parser=ResourceLocationParser(allow_tag=False), ), - "minecraft:color": LiteralStringParser( - [ - "reset", - "black", - "dark_blue", - "dark_green", - "dark_aqua", - "dark_red", - "dark_purple", - "gold", - "gray", - "dark_gray", - "blue", - "green", - "aqua", - "red", - "light_purple", - "yellow", - "white", - ] - ), - "minecraft:column_pos": Vector2Parser( + "minecraft:color": LiteralStringParser(["reset"] + CHAT_COLORS), + "minecraft:column_pos": Vector2Parser[int]( coordinate_parser=CoordinateParser[int]( type=int, allow_local=False, @@ -162,18 +169,62 @@ def get_default_parsers() -> Dict[str, Parser]: ), "minecraft:component": delegate("json"), "minecraft:dimension": delegate("minecraft:resource_location"), + # TODO: "minecraft:entity" "minecraft:entity_anchor": LiteralStringParser(["eyes", "feet"]), "minecraft:entity_summon": delegate("minecraft:resource_location"), "minecraft:float_range": RangeParser[float](type=float), - "minecraft:int_range": RangeParser[int](type=int), "minecraft:function": ResourceLocationParser(), + # TODO: "minecraft:game_profile" + "minecraft:int_range": RangeParser[int](type=int), + "minecraft:item_enchantment": StringParser(type="word"), "minecraft:item_predicate": ItemParser(), + "minecraft:item_slot": StringParser(type="word"), "minecraft:item_stack": ItemParser( resource_location_parser=ResourceLocationParser(allow_tag=False), ), + # TODO: "minecraft:message" + "minecraft:mob_effect": StringParser(type="word"), "minecraft:nbt_compound_tag": parse_compound_tag, + # TODO: "minecraft:nbt_path" "minecraft:nbt_tag": delegate("nbt"), + "minecraft:objective": parse_objective, + "minecraft:objective_criteria": ResourceLocationParser(allow_tag=False), + "minecraft:operation": LiteralStringParser( + [ + "+=", + "-=", + "*=", + "/=", + "%=", + "=", + "<", + ">", + "><", + ], + ), + # TODO: "minecraft:particle" "minecraft:resource_location": ResourceLocationParser(allow_tag=False), + "minecraft:rotation": Vector2Parser[float]( + coordinate_parser=CoordinateParser[float]( + type=float, + name="angle", + min=-180.0, + max=180.0, + allow_local=False, + ) + ), + # TODO: "minecraft:score_holder" + "minecraft:scoreboard_slot": StringParser(type="word"), + "minecraft:swizzle": parse_swizzle, + "minecraft:team": parse_team, + "minecraft:time": TimeParser(), + "minecraft:uuid": parse_uuid, + "minecraft:vec2": Vector2Parser( + coordinate_parser=CoordinateParser[float](type=float), + ), + "minecraft:vec3": Vector3Parser( + coordinate_parser=CoordinateParser[float](type=float), + ), } @@ -439,10 +490,7 @@ class CoordinateParser(NumericParser[NumericType]): allow_relative: bool = True allow_local: bool = True - def __call__(self, stream: TokenStream) -> AstCoordinate[NumericType]: - return super().__call__(stream) # type: ignore - - def create_node(self, stream: TokenStream) -> AstCoordinate[NumericType]: + def create_node(self, stream: TokenStream) -> AstCoordinate[NumericType]: # type: ignore token = stream.current if issubclass(self.type, int) and "." in token.value: @@ -786,7 +834,7 @@ class ResourceLocationParser: allow_tag: bool = True def __call__(self, stream: TokenStream) -> AstResourceLocation: - with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_\-\.]+"): + with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): token = stream.expect("resource_location") value = token.value location = token.location @@ -977,3 +1025,85 @@ def __call__(self, stream: TokenStream) -> AstRange[NumericType]: location=token.location, end_location=token.end_location, ) + + +def parse_objective(stream: TokenStream) -> AstValue[str]: + """Parse objective.""" + with stream.syntax(objective=r"[a-zA-Z0-9_.+-]+|\*"): + token = stream.expect("objective") + + if len(token.value) > 16: + raise token.emit_error( + InvalidSyntax("Objective name must be limited to 16 characters.") + ) + + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) + + +def parse_swizzle(stream: TokenStream) -> AstValue[str]: + """Parse swizzle.""" + token = stream.expect("literal") + + if not 1 <= len(token.value) <= 3 or len(set(token.value)) < len(token.value): + raise token.emit_error(InvalidSyntax(f"Invalid swizzle {token.value!r}.")) + + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) + + +def parse_team(stream: TokenStream) -> AstValue[str]: + """Parse team.""" + with stream.syntax(team=r"[a-zA-Z0-9_.+-]+"): + token = stream.expect("team") + + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) + + +@dataclass +class TimeParser(NumericParser[float]): + """Parser for time.""" + + type: Type[float] = float + name: str = "time" + pattern: str = FLOAT_PATTERN + r"[dst]?" + + def create_node(self, stream: TokenStream) -> AstTime: # type: ignore + """Create the ast node.""" + token = stream.current + value = token.value + + if value.endswith(("d", "s", "t")): + suffix = value[-1] + value = value[:-1] + else: + suffix = None + + return AstTime( + value=self.type(value), + suffix=suffix, # type: ignore + location=token.location, + end_location=token.end_location, + ) + + +def parse_uuid(stream: TokenStream) -> AstValue[str]: + """Parse uuid.""" + with stream.syntax(uuid="-".join([r"[a-fA-F0-9]+"] * 5)): + token = stream.expect("uuid") + + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt new file mode 100644 index 000000000..947e49081 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt @@ -0,0 +1,10 @@ +minecraft:item_enchantment +--- +{} +--- +unbreaking +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'unbreaking' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt new file mode 100644 index 000000000..f3e746c25 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt @@ -0,0 +1,10 @@ +minecraft:item_enchantment +--- +{} +--- +silk_touch +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'silk_touch' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt new file mode 100644 index 000000000..d7ac0d9da --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt @@ -0,0 +1,10 @@ +minecraft:item_slot +--- +{} +--- +container.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'container.5' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt new file mode 100644 index 000000000..5e7bb04ab --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt @@ -0,0 +1,10 @@ +minecraft:item_slot +--- +{} +--- +12 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: '12' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt new file mode 100644 index 000000000..3f0a12b15 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt @@ -0,0 +1,10 @@ +minecraft:item_slot +--- +{} +--- +weapon +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'weapon' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt new file mode 100644 index 000000000..80c198439 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt @@ -0,0 +1,10 @@ +minecraft:mob_effect +--- +{} +--- +spooky +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'spooky' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt new file mode 100644 index 000000000..37f92db5b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt @@ -0,0 +1,10 @@ +minecraft:mob_effect +--- +{} +--- +effect +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'effect' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt new file mode 100644 index 000000000..2366758d6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt @@ -0,0 +1,10 @@ +minecraft:objective +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt new file mode 100644 index 000000000..052f6760d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt @@ -0,0 +1,10 @@ +minecraft:objective +--- +{} +--- +* +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt new file mode 100644 index 000000000..4a5a21e48 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt @@ -0,0 +1,10 @@ +minecraft:objective +--- +{} +--- +012 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: '012' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt new file mode 100644 index 000000000..03e65bd42 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt @@ -0,0 +1,16 @@ +minecraft:objective_criteria +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt new file mode 100644 index 000000000..5db54766e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt @@ -0,0 +1,16 @@ +minecraft:objective_criteria +--- +{} +--- +foo.bar.baz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'foo.bar.baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt new file mode 100644 index 000000000..ff9baf8a2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt @@ -0,0 +1,20 @@ +minecraft:objective_criteria +--- +{} +--- +minecraft:foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt new file mode 100644 index 000000000..309cebe6d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt @@ -0,0 +1,10 @@ +minecraft:operation +--- +{} +--- += +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '=' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt new file mode 100644 index 000000000..798974534 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt @@ -0,0 +1,10 @@ +minecraft:operation +--- +{} +--- +> +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '>' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt new file mode 100644 index 000000000..94c8fedaa --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt @@ -0,0 +1,10 @@ +minecraft:operation +--- +{} +--- +< +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '<' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt new file mode 100644 index 000000000..3a2982247 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt @@ -0,0 +1,21 @@ +minecraft:rotation +--- +{} +--- +0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt new file mode 100644 index 000000000..66110a799 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt @@ -0,0 +1,21 @@ +minecraft:rotation +--- +{} +--- +~ ~ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt new file mode 100644 index 000000000..a11c1ac43 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt @@ -0,0 +1,21 @@ +minecraft:rotation +--- +{} +--- +~-5 ~5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: -5.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 5.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt new file mode 100644 index 000000000..b30ac9be5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt @@ -0,0 +1,10 @@ +minecraft:scoreboard_slot +--- +{} +--- +sidebar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'sidebar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt new file mode 100644 index 000000000..2a35d5f8a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt @@ -0,0 +1,10 @@ +minecraft:scoreboard_slot +--- +{} +--- +foo.bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'foo.bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt new file mode 100644 index 000000000..41f8b1555 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle +--- +{} +--- +xyz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'xyz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt new file mode 100644 index 000000000..7addae79d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle +--- +{} +--- +x +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'x' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt new file mode 100644 index 000000000..560697b32 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt @@ -0,0 +1,10 @@ +minecraft:team +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt new file mode 100644 index 000000000..55deaedfa --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt @@ -0,0 +1,10 @@ +minecraft:team +--- +{} +--- +123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: '123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt new file mode 100644 index 000000000..af8786b05 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt @@ -0,0 +1,11 @@ +minecraft:time +--- +{} +--- +0d +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 0.0 + suffix: 'd' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt new file mode 100644 index 000000000..edd602a8e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt @@ -0,0 +1,11 @@ +minecraft:time +--- +{} +--- +0s +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 0.0 + suffix: 's' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt new file mode 100644 index 000000000..0dc75219f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt @@ -0,0 +1,11 @@ +minecraft:time +--- +{} +--- +0t +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 0.0 + suffix: 't' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt new file mode 100644 index 000000000..675b34a7d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt @@ -0,0 +1,11 @@ +minecraft:time +--- +{} +--- +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + suffix: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt new file mode 100644 index 000000000..7d08e45d9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt @@ -0,0 +1,10 @@ +minecraft:uuid +--- +{} +--- +dd12be42-52a9-4a91-a8a1-11c01849e498 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 'dd12be42-52a9-4a91-a8a1-11c01849e498' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt new file mode 100644 index 000000000..5b27bcf18 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt @@ -0,0 +1,21 @@ +minecraft:vec2 +--- +{} +--- +0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt new file mode 100644 index 000000000..4400a327b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt @@ -0,0 +1,21 @@ +minecraft:vec2 +--- +{} +--- +~ ~ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt new file mode 100644 index 000000000..44990ef0e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt @@ -0,0 +1,21 @@ +minecraft:vec2 +--- +{} +--- +0.1 -0.5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.1 + prefix: 'absolute' + y: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -0.5 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt new file mode 100644 index 000000000..b82b8a4c9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt @@ -0,0 +1,21 @@ +minecraft:vec2 +--- +{} +--- +~1 ~-2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 1.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: -2.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt new file mode 100644 index 000000000..6903407cb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +0 0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt new file mode 100644 index 000000000..d22139cd5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +~ ~ ~ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt new file mode 100644 index 000000000..ed9c3e267 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +^ ^ ^ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'local' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'local' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'local' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt new file mode 100644 index 000000000..0099f1e2b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +^1 ^ ^-5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 1.0 + prefix: 'local' + y: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 0.0 + prefix: 'local' + z: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -5.0 + prefix: 'local' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt new file mode 100644 index 000000000..605281efd --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +0.1 -0.5 .9 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.1 + prefix: 'absolute' + y: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -0.5 + prefix: 'absolute' + z: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 0.9 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt new file mode 100644 index 000000000..213f513a7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +~0.5 ~1 ~-5 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 0.5 + prefix: 'relative' + y: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: -5.0 + prefix: 'relative' \ No newline at end of file From 79077c1613a772b3f1ec2982ee8dbbef10f138ab Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Aug 2021 00:04:22 +0200 Subject: [PATCH 0271/1554] chore: get more examples from the wiki --- .../resources/command_examples.mcfunction | 21 + packages/mecha/poetry.lock | 14 +- packages/mecha/pyproject.toml | 4 +- packages/mecha/scripts.py | 49 +- .../snapshots/parse__command_examples__0.txt | 1086 ++++++++++++++++- 5 files changed, 1131 insertions(+), 43 deletions(-) diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index 9fb4ac71e..cf1dcbc1e 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -1,3 +1,11 @@ +defaultgamemode survival +fill 52 63 -1516 33 73 -1536 minecraft:gold_block replace minecraft:orange_glazed_terracotta +fill ~-3 ~-3 ~-3 ~3 ~-1 ~3 water +fill ~-3 ~ ~-4 ~3 ~4 ~4 minecraft:stone hollow +fill ~-15 ~-15 ~-15 ~15 ~15 ~15 stone +fill ~-1 ~ ~ ~1 ~ ~ minecraft:prismarine_brick_stairs[facing=south,waterlogged=true] +function custom:example/test +function #custom:example/test gamerule doDaylightCycle false gamerule naturalRegeneration false gamerule mobGriefing false @@ -5,3 +13,16 @@ gamerule doWeatherCycle false gamerule keepInventory true gamerule commandBlockOutput false gamerule doInsomnia false +locate mansion +setblock ~ ~ ~ chest[facing=east] +setblock ~ ~ ~-1 birch_sign{Text1:'"My chest"',Text2:'"Do not open!"'} +setblock ~ ~2 ~ quartz_slab[type=top] +summon lightning_bolt ~-10 ~ ~ +summon creeper ~ ~ ~ {powered:1b,CustomName:'{"text":"Powered Creeper"}'} +summon spider ~ ~ ~ {Passengers:[{id:"minecraft:skeleton",HandItems:[{id:"minecraft:bow",Count:1b}]}]} +summon villager ~ ~ ~ {Offers:{Recipes:[{buy:{id:dirt,Count:1},sell:{id:diamond,Count:1},rewardExp:false}]}} +time set 1000 +time set day +time add 24000 +weather clear 1200 +weather rain diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index a8e4cc38b..951cc59c2 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -392,7 +392,7 @@ python-versions = ">=3.6" [[package]] name = "mcwiki" -version = "0.2.0" +version = "0.2.1" description = "A scraping library for the Minecraft Wiki" category = "dev" optional = false @@ -730,7 +730,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "0.7.2" +version = "0.7.4" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -847,7 +847,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "34af40fc7704495fe089b39b395fdbc01c8d04eecff3bcdafddb3110d20dc6e4" +content-hash = "0c6fc1ead7625348360deb13d43014f84011e34c4a23339546e09eb30727c532" [metadata.files] appdirs = [ @@ -1064,8 +1064,8 @@ markupsafe = [ {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] mcwiki = [ - {file = "mcwiki-0.2.0-py3-none-any.whl", hash = "sha256:64495234e6648c40001aa3c9e33c2fd38fc340d9eb21af853857035703f20894"}, - {file = "mcwiki-0.2.0.tar.gz", hash = "sha256:0d09949c1c7ddf3b9988de4507e26fc6675c8b907e620642d30371e7f9484569"}, + {file = "mcwiki-0.2.1-py3-none-any.whl", hash = "sha256:eefe2fbe9afabe89d4d65158cb646bf4ba261c834b82761da7ee0d1c7fe2db57"}, + {file = "mcwiki-0.2.1.tar.gz", hash = "sha256:8546145e5e8d3d9db5b4a03fefe44ab9655d4d7601fe176694199cb967a1063f"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1292,8 +1292,8 @@ soupsieve = [ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, ] tokenstream = [ - {file = "tokenstream-0.7.2-py3-none-any.whl", hash = "sha256:e2229be2978887ddd52192e3d63c25ce6fe6fa5aa6217bb4428c2a182efed8da"}, - {file = "tokenstream-0.7.2.tar.gz", hash = "sha256:c276fa74b5473e1ee295bbc1c9b689903ff00e56b83d5ff7a027ecee1036fbb1"}, + {file = "tokenstream-0.7.4-py3-none-any.whl", hash = "sha256:bbe62bddb48926c9d49442df05a72ff2f835c2db61488d8c3694c936ad7e5ae8"}, + {file = "tokenstream-0.7.4.tar.gz", hash = "sha256:e435dbab9d8c07622671d9e51cc23a8e999bc4b459a8eb90d69d81bf47239740"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 735814b99..f58561caa 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.36.0" -tokenstream = "^0.7.2" +tokenstream = "^0.7.4" [tool.poetry.dev-dependencies] black = "^21.7b0" @@ -32,7 +32,7 @@ isort = "^5.9.2" pytest = "^6.2.4" pytest-insta = "^0.1.10" python-semantic-release = "^7.16.2" -mcwiki = "^0.2.0" +mcwiki = "^0.2.1" lectern = "^0.15.2" [tool.black] diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py index 8365837bf..1949afa7c 100644 --- a/packages/mecha/scripts.py +++ b/packages/mecha/scripts.py @@ -1,7 +1,40 @@ +from typing import Optional + import click import mcwiki from beet import Function from beet.core.utils import dump_json +from bs4 import BeautifulSoup, Tag + + +class JavaExampleExtractor(mcwiki.TextExtractor): + def scan( # type: ignore + self, + html: BeautifulSoup, + limit: Optional[int] = None, + ) -> mcwiki.ScanResult["JavaExampleExtractor", str]: + result = super().scan(html, limit=limit) + result.elements[:] = [ + element + for element in result.elements + if not ( + isinstance(element, Tag) + and ( + any( + parent.text.startswith("Bedrock Edition:") + for parent in element.find_parents("li") + ) + or element.parent + and (sup := element.parent.find("sup")) + and (annotation := sup.get_text().lower()) # type: ignore + and ( + "[be only]" in annotation + or "[bedrock edition only]" in annotation + ) + ) + ) + ] + return result @click.group() @@ -15,22 +48,28 @@ def download_command_examples(): generated_function = Function() commands = [ + "defaultgamemode", + "fill", + "function", "gamerule", + "locate", + "setblock", + "summon", + "time", + "weather", ] - ignored_examples = { - "gamerule tntExplodes false", - } + java_example = JavaExampleExtractor("li > code") for command in commands: page = mcwiki.load(f"commands/{command}") examples = page.get("examples") if examples is not None: - for code in examples.extract_all(mcwiki.CODE): + for code in examples.extract_all(java_example): if code.startswith("/"): code = code[1:] - if code.startswith(command) and code not in ignored_examples: + if code.startswith(command): generated_function.lines.append(code) click.echo(generated_function.text, nl=False) diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 36c54c456..079a25f86 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,68 +1,1096 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=212, lineno=9, colno=1) + end_location: SourceLocation(pos=1141, lineno=30, colno=1) filename: None commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=1, colno=31) + end_location: SourceLocation(pos=0, lineno=1, colno=1) + identifier: 'defaultgamemode:survival' + arguments: + + + location: SourceLocation(pos=25, lineno=2, colno=1) + end_location: SourceLocation(pos=117, lineno=2, colno=93) + identifier: 'fill:from:to:block:replace:filter' + arguments: + + location: SourceLocation(pos=30, lineno=2, colno=6) + end_location: SourceLocation(pos=41, lineno=2, colno=17) + x: + + location: SourceLocation(pos=30, lineno=2, colno=6) + end_location: SourceLocation(pos=32, lineno=2, colno=8) + value: 52.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=33, lineno=2, colno=9) + end_location: SourceLocation(pos=35, lineno=2, colno=11) + value: 63.0 + prefix: 'absolute' + z: + + location: SourceLocation(pos=36, lineno=2, colno=12) + end_location: SourceLocation(pos=41, lineno=2, colno=17) + value: -1516.0 + prefix: 'absolute' + + location: SourceLocation(pos=42, lineno=2, colno=18) + end_location: SourceLocation(pos=53, lineno=2, colno=29) + x: + + location: SourceLocation(pos=42, lineno=2, colno=18) + end_location: SourceLocation(pos=44, lineno=2, colno=20) + value: 33.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=45, lineno=2, colno=21) + end_location: SourceLocation(pos=47, lineno=2, colno=23) + value: 73.0 + prefix: 'absolute' + z: + + location: SourceLocation(pos=48, lineno=2, colno=24) + end_location: SourceLocation(pos=53, lineno=2, colno=29) + value: -1536.0 + prefix: 'absolute' + + location: SourceLocation(pos=54, lineno=2, colno=30) + end_location: SourceLocation(pos=74, lineno=2, colno=50) + identifier: + + location: SourceLocation(pos=54, lineno=2, colno=30) + end_location: SourceLocation(pos=74, lineno=2, colno=50) + is_tag: False + namespace: + + location: SourceLocation(pos=54, lineno=2, colno=30) + end_location: SourceLocation(pos=63, lineno=2, colno=39) + value: 'minecraft' + path: + + location: SourceLocation(pos=64, lineno=2, colno=40) + end_location: SourceLocation(pos=74, lineno=2, colno=50) + value: 'gold_block' + block_states: + + data_tags: None + + location: SourceLocation(pos=83, lineno=2, colno=59) + end_location: SourceLocation(pos=117, lineno=2, colno=93) + identifier: + + location: SourceLocation(pos=83, lineno=2, colno=59) + end_location: SourceLocation(pos=117, lineno=2, colno=93) + is_tag: False + namespace: + + location: SourceLocation(pos=83, lineno=2, colno=59) + end_location: SourceLocation(pos=92, lineno=2, colno=68) + value: 'minecraft' + path: + + location: SourceLocation(pos=93, lineno=2, colno=69) + end_location: SourceLocation(pos=117, lineno=2, colno=93) + value: 'orange_glazed_terracotta' + block_states: + + data_tags: None + + location: SourceLocation(pos=118, lineno=3, colno=1) + end_location: SourceLocation(pos=150, lineno=3, colno=33) + identifier: 'fill:from:to:block' + arguments: + + location: SourceLocation(pos=123, lineno=3, colno=6) + end_location: SourceLocation(pos=134, lineno=3, colno=17) + x: + + location: SourceLocation(pos=123, lineno=3, colno=6) + end_location: SourceLocation(pos=126, lineno=3, colno=9) + value: -3.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=127, lineno=3, colno=10) + end_location: SourceLocation(pos=130, lineno=3, colno=13) + value: -3.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=131, lineno=3, colno=14) + end_location: SourceLocation(pos=134, lineno=3, colno=17) + value: -3.0 + prefix: 'relative' + + location: SourceLocation(pos=135, lineno=3, colno=18) + end_location: SourceLocation(pos=144, lineno=3, colno=27) + x: + + location: SourceLocation(pos=135, lineno=3, colno=18) + end_location: SourceLocation(pos=137, lineno=3, colno=20) + value: 3.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=138, lineno=3, colno=21) + end_location: SourceLocation(pos=141, lineno=3, colno=24) + value: -1.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=142, lineno=3, colno=25) + end_location: SourceLocation(pos=144, lineno=3, colno=27) + value: 3.0 + prefix: 'relative' + + location: SourceLocation(pos=145, lineno=3, colno=28) + end_location: SourceLocation(pos=150, lineno=3, colno=33) + identifier: + + location: SourceLocation(pos=145, lineno=3, colno=28) + end_location: SourceLocation(pos=150, lineno=3, colno=33) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=145, lineno=3, colno=28) + end_location: SourceLocation(pos=150, lineno=3, colno=33) + value: 'water' + block_states: + + data_tags: None + + location: SourceLocation(pos=151, lineno=4, colno=1) + end_location: SourceLocation(pos=190, lineno=4, colno=40) + identifier: 'fill:from:to:block:hollow' + arguments: + + location: SourceLocation(pos=156, lineno=4, colno=6) + end_location: SourceLocation(pos=165, lineno=4, colno=15) + x: + + location: SourceLocation(pos=156, lineno=4, colno=6) + end_location: SourceLocation(pos=159, lineno=4, colno=9) + value: -3.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=160, lineno=4, colno=10) + end_location: SourceLocation(pos=161, lineno=4, colno=11) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=162, lineno=4, colno=12) + end_location: SourceLocation(pos=165, lineno=4, colno=15) + value: -4.0 + prefix: 'relative' + + location: SourceLocation(pos=166, lineno=4, colno=16) + end_location: SourceLocation(pos=174, lineno=4, colno=24) + x: + + location: SourceLocation(pos=166, lineno=4, colno=16) + end_location: SourceLocation(pos=168, lineno=4, colno=18) + value: 3.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=169, lineno=4, colno=19) + end_location: SourceLocation(pos=171, lineno=4, colno=21) + value: 4.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=172, lineno=4, colno=22) + end_location: SourceLocation(pos=174, lineno=4, colno=24) + value: 4.0 + prefix: 'relative' + + location: SourceLocation(pos=175, lineno=4, colno=25) + end_location: SourceLocation(pos=190, lineno=4, colno=40) + identifier: + + location: SourceLocation(pos=175, lineno=4, colno=25) + end_location: SourceLocation(pos=190, lineno=4, colno=40) + is_tag: False + namespace: + + location: SourceLocation(pos=175, lineno=4, colno=25) + end_location: SourceLocation(pos=184, lineno=4, colno=34) + value: 'minecraft' + path: + + location: SourceLocation(pos=185, lineno=4, colno=35) + end_location: SourceLocation(pos=190, lineno=4, colno=40) + value: 'stone' + block_states: + + data_tags: None + + location: SourceLocation(pos=198, lineno=5, colno=1) + end_location: SourceLocation(pos=235, lineno=5, colno=38) + identifier: 'fill:from:to:block' + arguments: + + location: SourceLocation(pos=203, lineno=5, colno=6) + end_location: SourceLocation(pos=217, lineno=5, colno=20) + x: + + location: SourceLocation(pos=203, lineno=5, colno=6) + end_location: SourceLocation(pos=207, lineno=5, colno=10) + value: -15.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=208, lineno=5, colno=11) + end_location: SourceLocation(pos=212, lineno=5, colno=15) + value: -15.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=213, lineno=5, colno=16) + end_location: SourceLocation(pos=217, lineno=5, colno=20) + value: -15.0 + prefix: 'relative' + + location: SourceLocation(pos=218, lineno=5, colno=21) + end_location: SourceLocation(pos=229, lineno=5, colno=32) + x: + + location: SourceLocation(pos=218, lineno=5, colno=21) + end_location: SourceLocation(pos=221, lineno=5, colno=24) + value: 15.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=222, lineno=5, colno=25) + end_location: SourceLocation(pos=225, lineno=5, colno=28) + value: 15.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=226, lineno=5, colno=29) + end_location: SourceLocation(pos=229, lineno=5, colno=32) + value: 15.0 + prefix: 'relative' + + location: SourceLocation(pos=230, lineno=5, colno=33) + end_location: SourceLocation(pos=235, lineno=5, colno=38) + identifier: + + location: SourceLocation(pos=230, lineno=5, colno=33) + end_location: SourceLocation(pos=235, lineno=5, colno=38) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=230, lineno=5, colno=33) + end_location: SourceLocation(pos=235, lineno=5, colno=38) + value: 'stone' + block_states: + + data_tags: None + + location: SourceLocation(pos=236, lineno=6, colno=1) + end_location: SourceLocation(pos=320, lineno=6, colno=85) + identifier: 'fill:from:to:block' + arguments: + + location: SourceLocation(pos=241, lineno=6, colno=6) + end_location: SourceLocation(pos=248, lineno=6, colno=13) + x: + + location: SourceLocation(pos=241, lineno=6, colno=6) + end_location: SourceLocation(pos=244, lineno=6, colno=9) + value: -1.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=245, lineno=6, colno=10) + end_location: SourceLocation(pos=246, lineno=6, colno=11) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=247, lineno=6, colno=12) + end_location: SourceLocation(pos=248, lineno=6, colno=13) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=249, lineno=6, colno=14) + end_location: SourceLocation(pos=255, lineno=6, colno=20) + x: + + location: SourceLocation(pos=249, lineno=6, colno=14) + end_location: SourceLocation(pos=251, lineno=6, colno=16) + value: 1.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=252, lineno=6, colno=17) + end_location: SourceLocation(pos=253, lineno=6, colno=18) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=254, lineno=6, colno=19) + end_location: SourceLocation(pos=255, lineno=6, colno=20) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=256, lineno=6, colno=21) + end_location: SourceLocation(pos=320, lineno=6, colno=85) + identifier: + + location: SourceLocation(pos=256, lineno=6, colno=21) + end_location: SourceLocation(pos=289, lineno=6, colno=54) + is_tag: False + namespace: + + location: SourceLocation(pos=256, lineno=6, colno=21) + end_location: SourceLocation(pos=265, lineno=6, colno=30) + value: 'minecraft' + path: + + location: SourceLocation(pos=266, lineno=6, colno=31) + end_location: SourceLocation(pos=289, lineno=6, colno=54) + value: 'prismarine_brick_stairs' + block_states: + + location: SourceLocation(pos=290, lineno=6, colno=55) + end_location: SourceLocation(pos=302, lineno=6, colno=67) + key: + + location: SourceLocation(pos=290, lineno=6, colno=55) + end_location: SourceLocation(pos=296, lineno=6, colno=61) + value: 'facing' + value: + + location: SourceLocation(pos=297, lineno=6, colno=62) + end_location: SourceLocation(pos=302, lineno=6, colno=67) + value: 'south' + + location: SourceLocation(pos=303, lineno=6, colno=68) + end_location: SourceLocation(pos=319, lineno=6, colno=84) + key: + + location: SourceLocation(pos=303, lineno=6, colno=68) + end_location: SourceLocation(pos=314, lineno=6, colno=79) + value: 'waterlogged' + value: + + location: SourceLocation(pos=315, lineno=6, colno=80) + end_location: SourceLocation(pos=319, lineno=6, colno=84) + value: 'true' + data_tags: None + + location: SourceLocation(pos=321, lineno=7, colno=1) + end_location: SourceLocation(pos=349, lineno=7, colno=29) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=330, lineno=7, colno=10) + end_location: SourceLocation(pos=349, lineno=7, colno=29) + is_tag: False + namespace: + + location: SourceLocation(pos=330, lineno=7, colno=10) + end_location: SourceLocation(pos=336, lineno=7, colno=16) + value: 'custom' + path: + + location: SourceLocation(pos=337, lineno=7, colno=17) + end_location: SourceLocation(pos=349, lineno=7, colno=29) + value: 'example/test' + + location: SourceLocation(pos=350, lineno=8, colno=1) + end_location: SourceLocation(pos=379, lineno=8, colno=30) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=359, lineno=8, colno=10) + end_location: SourceLocation(pos=379, lineno=8, colno=30) + is_tag: True + namespace: + + location: SourceLocation(pos=360, lineno=8, colno=11) + end_location: SourceLocation(pos=366, lineno=8, colno=17) + value: 'custom' + path: + + location: SourceLocation(pos=367, lineno=8, colno=18) + end_location: SourceLocation(pos=379, lineno=8, colno=30) + value: 'example/test' + + location: SourceLocation(pos=380, lineno=9, colno=1) + end_location: SourceLocation(pos=410, lineno=9, colno=31) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=30, lineno=1, colno=31) + location: SourceLocation(pos=405, lineno=9, colno=26) + end_location: SourceLocation(pos=410, lineno=9, colno=31) value: False - location: SourceLocation(pos=31, lineno=2, colno=1) - end_location: SourceLocation(pos=65, lineno=2, colno=35) + location: SourceLocation(pos=411, lineno=10, colno=1) + end_location: SourceLocation(pos=445, lineno=10, colno=35) identifier: 'gamerule:naturalRegeneration:value' arguments: - location: SourceLocation(pos=60, lineno=2, colno=30) - end_location: SourceLocation(pos=65, lineno=2, colno=35) + location: SourceLocation(pos=440, lineno=10, colno=30) + end_location: SourceLocation(pos=445, lineno=10, colno=35) value: False - location: SourceLocation(pos=66, lineno=3, colno=1) - end_location: SourceLocation(pos=92, lineno=3, colno=27) + location: SourceLocation(pos=446, lineno=11, colno=1) + end_location: SourceLocation(pos=472, lineno=11, colno=27) identifier: 'gamerule:mobGriefing:value' arguments: - location: SourceLocation(pos=87, lineno=3, colno=22) - end_location: SourceLocation(pos=92, lineno=3, colno=27) + location: SourceLocation(pos=467, lineno=11, colno=22) + end_location: SourceLocation(pos=472, lineno=11, colno=27) value: False - location: SourceLocation(pos=93, lineno=4, colno=1) - end_location: SourceLocation(pos=122, lineno=4, colno=30) + location: SourceLocation(pos=473, lineno=12, colno=1) + end_location: SourceLocation(pos=502, lineno=12, colno=30) identifier: 'gamerule:doWeatherCycle:value' arguments: - location: SourceLocation(pos=117, lineno=4, colno=25) - end_location: SourceLocation(pos=122, lineno=4, colno=30) + location: SourceLocation(pos=497, lineno=12, colno=25) + end_location: SourceLocation(pos=502, lineno=12, colno=30) value: False - location: SourceLocation(pos=123, lineno=5, colno=1) - end_location: SourceLocation(pos=150, lineno=5, colno=28) + location: SourceLocation(pos=503, lineno=13, colno=1) + end_location: SourceLocation(pos=530, lineno=13, colno=28) identifier: 'gamerule:keepInventory:value' arguments: - location: SourceLocation(pos=146, lineno=5, colno=24) - end_location: SourceLocation(pos=150, lineno=5, colno=28) + location: SourceLocation(pos=526, lineno=13, colno=24) + end_location: SourceLocation(pos=530, lineno=13, colno=28) value: True - location: SourceLocation(pos=151, lineno=6, colno=1) - end_location: SourceLocation(pos=184, lineno=6, colno=34) + location: SourceLocation(pos=531, lineno=14, colno=1) + end_location: SourceLocation(pos=564, lineno=14, colno=34) identifier: 'gamerule:commandBlockOutput:value' arguments: - location: SourceLocation(pos=179, lineno=6, colno=29) - end_location: SourceLocation(pos=184, lineno=6, colno=34) + location: SourceLocation(pos=559, lineno=14, colno=29) + end_location: SourceLocation(pos=564, lineno=14, colno=34) value: False - location: SourceLocation(pos=185, lineno=7, colno=1) - end_location: SourceLocation(pos=210, lineno=7, colno=26) + location: SourceLocation(pos=565, lineno=15, colno=1) + end_location: SourceLocation(pos=590, lineno=15, colno=26) identifier: 'gamerule:doInsomnia:value' arguments: - location: SourceLocation(pos=205, lineno=7, colno=21) - end_location: SourceLocation(pos=210, lineno=7, colno=26) - value: False \ No newline at end of file + location: SourceLocation(pos=585, lineno=15, colno=21) + end_location: SourceLocation(pos=590, lineno=15, colno=26) + value: False + + location: SourceLocation(pos=591, lineno=16, colno=1) + end_location: SourceLocation(pos=591, lineno=16, colno=1) + identifier: 'locate:mansion' + arguments: + + + location: SourceLocation(pos=606, lineno=17, colno=1) + end_location: SourceLocation(pos=639, lineno=17, colno=34) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=615, lineno=17, colno=10) + end_location: SourceLocation(pos=620, lineno=17, colno=15) + x: + + location: SourceLocation(pos=615, lineno=17, colno=10) + end_location: SourceLocation(pos=616, lineno=17, colno=11) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=617, lineno=17, colno=12) + end_location: SourceLocation(pos=618, lineno=17, colno=13) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=619, lineno=17, colno=14) + end_location: SourceLocation(pos=620, lineno=17, colno=15) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=621, lineno=17, colno=16) + end_location: SourceLocation(pos=639, lineno=17, colno=34) + identifier: + + location: SourceLocation(pos=621, lineno=17, colno=16) + end_location: SourceLocation(pos=626, lineno=17, colno=21) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=621, lineno=17, colno=16) + end_location: SourceLocation(pos=626, lineno=17, colno=21) + value: 'chest' + block_states: + + location: SourceLocation(pos=627, lineno=17, colno=22) + end_location: SourceLocation(pos=638, lineno=17, colno=33) + key: + + location: SourceLocation(pos=627, lineno=17, colno=22) + end_location: SourceLocation(pos=633, lineno=17, colno=28) + value: 'facing' + value: + + location: SourceLocation(pos=634, lineno=17, colno=29) + end_location: SourceLocation(pos=638, lineno=17, colno=33) + value: 'east' + data_tags: None + + location: SourceLocation(pos=640, lineno=18, colno=1) + end_location: SourceLocation(pos=710, lineno=18, colno=71) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=649, lineno=18, colno=10) + end_location: SourceLocation(pos=656, lineno=18, colno=17) + x: + + location: SourceLocation(pos=649, lineno=18, colno=10) + end_location: SourceLocation(pos=650, lineno=18, colno=11) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=651, lineno=18, colno=12) + end_location: SourceLocation(pos=652, lineno=18, colno=13) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=653, lineno=18, colno=14) + end_location: SourceLocation(pos=656, lineno=18, colno=17) + value: -1.0 + prefix: 'relative' + + location: SourceLocation(pos=657, lineno=18, colno=18) + end_location: SourceLocation(pos=710, lineno=18, colno=71) + identifier: + + location: SourceLocation(pos=657, lineno=18, colno=18) + end_location: SourceLocation(pos=667, lineno=18, colno=28) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=657, lineno=18, colno=18) + end_location: SourceLocation(pos=667, lineno=18, colno=28) + value: 'birch_sign' + block_states: + + data_tags: + + location: SourceLocation(pos=667, lineno=18, colno=28) + end_location: SourceLocation(pos=710, lineno=18, colno=71) + entries: + + location: SourceLocation(pos=668, lineno=18, colno=29) + end_location: SourceLocation(pos=686, lineno=18, colno=47) + key: + + location: SourceLocation(pos=668, lineno=18, colno=29) + end_location: SourceLocation(pos=673, lineno=18, colno=34) + value: 'Text1' + value: + + location: SourceLocation(pos=674, lineno=18, colno=35) + end_location: SourceLocation(pos=686, lineno=18, colno=47) + value: String('"My chest"') + + location: SourceLocation(pos=687, lineno=18, colno=48) + end_location: SourceLocation(pos=709, lineno=18, colno=70) + key: + + location: SourceLocation(pos=687, lineno=18, colno=48) + end_location: SourceLocation(pos=692, lineno=18, colno=53) + value: 'Text2' + value: + + location: SourceLocation(pos=693, lineno=18, colno=54) + end_location: SourceLocation(pos=709, lineno=18, colno=70) + value: String('"Do not open!"') + + location: SourceLocation(pos=711, lineno=19, colno=1) + end_location: SourceLocation(pos=748, lineno=19, colno=38) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=720, lineno=19, colno=10) + end_location: SourceLocation(pos=726, lineno=19, colno=16) + x: + + location: SourceLocation(pos=720, lineno=19, colno=10) + end_location: SourceLocation(pos=721, lineno=19, colno=11) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=722, lineno=19, colno=12) + end_location: SourceLocation(pos=724, lineno=19, colno=14) + value: 2.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=725, lineno=19, colno=15) + end_location: SourceLocation(pos=726, lineno=19, colno=16) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=727, lineno=19, colno=17) + end_location: SourceLocation(pos=748, lineno=19, colno=38) + identifier: + + location: SourceLocation(pos=727, lineno=19, colno=17) + end_location: SourceLocation(pos=738, lineno=19, colno=28) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=727, lineno=19, colno=17) + end_location: SourceLocation(pos=738, lineno=19, colno=28) + value: 'quartz_slab' + block_states: + + location: SourceLocation(pos=739, lineno=19, colno=29) + end_location: SourceLocation(pos=747, lineno=19, colno=37) + key: + + location: SourceLocation(pos=739, lineno=19, colno=29) + end_location: SourceLocation(pos=743, lineno=19, colno=33) + value: 'type' + value: + + location: SourceLocation(pos=744, lineno=19, colno=34) + end_location: SourceLocation(pos=747, lineno=19, colno=37) + value: 'top' + data_tags: None + + location: SourceLocation(pos=749, lineno=20, colno=1) + end_location: SourceLocation(pos=779, lineno=20, colno=31) + identifier: 'summon:entity:pos' + arguments: + + location: SourceLocation(pos=756, lineno=20, colno=8) + end_location: SourceLocation(pos=770, lineno=20, colno=22) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=756, lineno=20, colno=8) + end_location: SourceLocation(pos=770, lineno=20, colno=22) + value: 'lightning_bolt' + + location: SourceLocation(pos=771, lineno=20, colno=23) + end_location: SourceLocation(pos=779, lineno=20, colno=31) + x: + + location: SourceLocation(pos=771, lineno=20, colno=23) + end_location: SourceLocation(pos=775, lineno=20, colno=27) + value: -10.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=776, lineno=20, colno=28) + end_location: SourceLocation(pos=777, lineno=20, colno=29) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=778, lineno=20, colno=30) + end_location: SourceLocation(pos=779, lineno=20, colno=31) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=780, lineno=21, colno=1) + end_location: SourceLocation(pos=853, lineno=21, colno=74) + identifier: 'summon:entity:pos:nbt' + arguments: + + location: SourceLocation(pos=787, lineno=21, colno=8) + end_location: SourceLocation(pos=794, lineno=21, colno=15) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=787, lineno=21, colno=8) + end_location: SourceLocation(pos=794, lineno=21, colno=15) + value: 'creeper' + + location: SourceLocation(pos=795, lineno=21, colno=16) + end_location: SourceLocation(pos=800, lineno=21, colno=21) + x: + + location: SourceLocation(pos=795, lineno=21, colno=16) + end_location: SourceLocation(pos=796, lineno=21, colno=17) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=797, lineno=21, colno=18) + end_location: SourceLocation(pos=798, lineno=21, colno=19) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=799, lineno=21, colno=20) + end_location: SourceLocation(pos=800, lineno=21, colno=21) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=801, lineno=21, colno=22) + end_location: SourceLocation(pos=853, lineno=21, colno=74) + entries: + + location: SourceLocation(pos=802, lineno=21, colno=23) + end_location: SourceLocation(pos=812, lineno=21, colno=33) + key: + + location: SourceLocation(pos=802, lineno=21, colno=23) + end_location: SourceLocation(pos=809, lineno=21, colno=30) + value: 'powered' + value: + + location: SourceLocation(pos=810, lineno=21, colno=31) + end_location: SourceLocation(pos=812, lineno=21, colno=33) + value: Byte(1) + + location: SourceLocation(pos=813, lineno=21, colno=34) + end_location: SourceLocation(pos=852, lineno=21, colno=73) + key: + + location: SourceLocation(pos=813, lineno=21, colno=34) + end_location: SourceLocation(pos=823, lineno=21, colno=44) + value: 'CustomName' + value: + + location: SourceLocation(pos=824, lineno=21, colno=45) + end_location: SourceLocation(pos=852, lineno=21, colno=73) + value: String('{"text":"Powered Creeper"}') + + location: SourceLocation(pos=854, lineno=22, colno=1) + end_location: SourceLocation(pos=956, lineno=22, colno=103) + identifier: 'summon:entity:pos:nbt' + arguments: + + location: SourceLocation(pos=861, lineno=22, colno=8) + end_location: SourceLocation(pos=867, lineno=22, colno=14) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=861, lineno=22, colno=8) + end_location: SourceLocation(pos=867, lineno=22, colno=14) + value: 'spider' + + location: SourceLocation(pos=868, lineno=22, colno=15) + end_location: SourceLocation(pos=873, lineno=22, colno=20) + x: + + location: SourceLocation(pos=868, lineno=22, colno=15) + end_location: SourceLocation(pos=869, lineno=22, colno=16) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=870, lineno=22, colno=17) + end_location: SourceLocation(pos=871, lineno=22, colno=18) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=872, lineno=22, colno=19) + end_location: SourceLocation(pos=873, lineno=22, colno=20) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=874, lineno=22, colno=21) + end_location: SourceLocation(pos=956, lineno=22, colno=103) + entries: + + location: SourceLocation(pos=875, lineno=22, colno=22) + end_location: SourceLocation(pos=955, lineno=22, colno=102) + key: + + location: SourceLocation(pos=875, lineno=22, colno=22) + end_location: SourceLocation(pos=885, lineno=22, colno=32) + value: 'Passengers' + value: + + location: SourceLocation(pos=886, lineno=22, colno=33) + end_location: SourceLocation(pos=955, lineno=22, colno=102) + elements: + + location: SourceLocation(pos=887, lineno=22, colno=34) + end_location: SourceLocation(pos=954, lineno=22, colno=101) + entries: + + location: SourceLocation(pos=888, lineno=22, colno=35) + end_location: SourceLocation(pos=911, lineno=22, colno=58) + key: + + location: SourceLocation(pos=888, lineno=22, colno=35) + end_location: SourceLocation(pos=890, lineno=22, colno=37) + value: 'id' + value: + + location: SourceLocation(pos=891, lineno=22, colno=38) + end_location: SourceLocation(pos=911, lineno=22, colno=58) + value: String('minecraft:skeleton') + + location: SourceLocation(pos=912, lineno=22, colno=59) + end_location: SourceLocation(pos=953, lineno=22, colno=100) + key: + + location: SourceLocation(pos=912, lineno=22, colno=59) + end_location: SourceLocation(pos=921, lineno=22, colno=68) + value: 'HandItems' + value: + + location: SourceLocation(pos=922, lineno=22, colno=69) + end_location: SourceLocation(pos=953, lineno=22, colno=100) + elements: + + location: SourceLocation(pos=923, lineno=22, colno=70) + end_location: SourceLocation(pos=952, lineno=22, colno=99) + entries: + + location: SourceLocation(pos=924, lineno=22, colno=71) + end_location: SourceLocation(pos=942, lineno=22, colno=89) + key: + + location: SourceLocation(pos=924, lineno=22, colno=71) + end_location: SourceLocation(pos=926, lineno=22, colno=73) + value: 'id' + value: + + location: SourceLocation(pos=927, lineno=22, colno=74) + end_location: SourceLocation(pos=942, lineno=22, colno=89) + value: String('minecraft:bow') + + location: SourceLocation(pos=943, lineno=22, colno=90) + end_location: SourceLocation(pos=951, lineno=22, colno=98) + key: + + location: SourceLocation(pos=943, lineno=22, colno=90) + end_location: SourceLocation(pos=948, lineno=22, colno=95) + value: 'Count' + value: + + location: SourceLocation(pos=949, lineno=22, colno=96) + end_location: SourceLocation(pos=951, lineno=22, colno=98) + value: Byte(1) + + location: SourceLocation(pos=957, lineno=23, colno=1) + end_location: SourceLocation(pos=1065, lineno=23, colno=109) + identifier: 'summon:entity:pos:nbt' + arguments: + + location: SourceLocation(pos=964, lineno=23, colno=8) + end_location: SourceLocation(pos=972, lineno=23, colno=16) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=964, lineno=23, colno=8) + end_location: SourceLocation(pos=972, lineno=23, colno=16) + value: 'villager' + + location: SourceLocation(pos=973, lineno=23, colno=17) + end_location: SourceLocation(pos=978, lineno=23, colno=22) + x: + + location: SourceLocation(pos=973, lineno=23, colno=17) + end_location: SourceLocation(pos=974, lineno=23, colno=18) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=975, lineno=23, colno=19) + end_location: SourceLocation(pos=976, lineno=23, colno=20) + value: 0.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=977, lineno=23, colno=21) + end_location: SourceLocation(pos=978, lineno=23, colno=22) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=979, lineno=23, colno=23) + end_location: SourceLocation(pos=1065, lineno=23, colno=109) + entries: + + location: SourceLocation(pos=980, lineno=23, colno=24) + end_location: SourceLocation(pos=1064, lineno=23, colno=108) + key: + + location: SourceLocation(pos=980, lineno=23, colno=24) + end_location: SourceLocation(pos=986, lineno=23, colno=30) + value: 'Offers' + value: + + location: SourceLocation(pos=987, lineno=23, colno=31) + end_location: SourceLocation(pos=1064, lineno=23, colno=108) + entries: + + location: SourceLocation(pos=988, lineno=23, colno=32) + end_location: SourceLocation(pos=1063, lineno=23, colno=107) + key: + + location: SourceLocation(pos=988, lineno=23, colno=32) + end_location: SourceLocation(pos=995, lineno=23, colno=39) + value: 'Recipes' + value: + + location: SourceLocation(pos=996, lineno=23, colno=40) + end_location: SourceLocation(pos=1063, lineno=23, colno=107) + elements: + + location: SourceLocation(pos=997, lineno=23, colno=41) + end_location: SourceLocation(pos=1062, lineno=23, colno=106) + entries: + + location: SourceLocation(pos=998, lineno=23, colno=42) + end_location: SourceLocation(pos=1019, lineno=23, colno=63) + key: + + location: SourceLocation(pos=998, lineno=23, colno=42) + end_location: SourceLocation(pos=1001, lineno=23, colno=45) + value: 'buy' + value: + + location: SourceLocation(pos=1002, lineno=23, colno=46) + end_location: SourceLocation(pos=1019, lineno=23, colno=63) + entries: + + location: SourceLocation(pos=1003, lineno=23, colno=47) + end_location: SourceLocation(pos=1010, lineno=23, colno=54) + key: + + location: SourceLocation(pos=1003, lineno=23, colno=47) + end_location: SourceLocation(pos=1005, lineno=23, colno=49) + value: 'id' + value: + + location: SourceLocation(pos=1006, lineno=23, colno=50) + end_location: SourceLocation(pos=1010, lineno=23, colno=54) + value: String('dirt') + + location: SourceLocation(pos=1011, lineno=23, colno=55) + end_location: SourceLocation(pos=1018, lineno=23, colno=62) + key: + + location: SourceLocation(pos=1011, lineno=23, colno=55) + end_location: SourceLocation(pos=1016, lineno=23, colno=60) + value: 'Count' + value: + + location: SourceLocation(pos=1017, lineno=23, colno=61) + end_location: SourceLocation(pos=1018, lineno=23, colno=62) + value: Int(1) + + location: SourceLocation(pos=1020, lineno=23, colno=64) + end_location: SourceLocation(pos=1045, lineno=23, colno=89) + key: + + location: SourceLocation(pos=1020, lineno=23, colno=64) + end_location: SourceLocation(pos=1024, lineno=23, colno=68) + value: 'sell' + value: + + location: SourceLocation(pos=1025, lineno=23, colno=69) + end_location: SourceLocation(pos=1045, lineno=23, colno=89) + entries: + + location: SourceLocation(pos=1026, lineno=23, colno=70) + end_location: SourceLocation(pos=1036, lineno=23, colno=80) + key: + + location: SourceLocation(pos=1026, lineno=23, colno=70) + end_location: SourceLocation(pos=1028, lineno=23, colno=72) + value: 'id' + value: + + location: SourceLocation(pos=1029, lineno=23, colno=73) + end_location: SourceLocation(pos=1036, lineno=23, colno=80) + value: String('diamond') + + location: SourceLocation(pos=1037, lineno=23, colno=81) + end_location: SourceLocation(pos=1044, lineno=23, colno=88) + key: + + location: SourceLocation(pos=1037, lineno=23, colno=81) + end_location: SourceLocation(pos=1042, lineno=23, colno=86) + value: 'Count' + value: + + location: SourceLocation(pos=1043, lineno=23, colno=87) + end_location: SourceLocation(pos=1044, lineno=23, colno=88) + value: Int(1) + + location: SourceLocation(pos=1046, lineno=23, colno=90) + end_location: SourceLocation(pos=1061, lineno=23, colno=105) + key: + + location: SourceLocation(pos=1046, lineno=23, colno=90) + end_location: SourceLocation(pos=1055, lineno=23, colno=99) + value: 'rewardExp' + value: + + location: SourceLocation(pos=1056, lineno=23, colno=100) + end_location: SourceLocation(pos=1061, lineno=23, colno=105) + value: Byte(0) + + location: SourceLocation(pos=1066, lineno=24, colno=1) + end_location: SourceLocation(pos=1079, lineno=24, colno=14) + identifier: 'time:set:time' + arguments: + + location: SourceLocation(pos=1075, lineno=24, colno=10) + end_location: SourceLocation(pos=1079, lineno=24, colno=14) + value: 1000.0 + suffix: None + + location: SourceLocation(pos=1080, lineno=25, colno=1) + end_location: SourceLocation(pos=1080, lineno=25, colno=1) + identifier: 'time:set:day' + arguments: + + + location: SourceLocation(pos=1093, lineno=26, colno=1) + end_location: SourceLocation(pos=1107, lineno=26, colno=15) + identifier: 'time:add:time' + arguments: + + location: SourceLocation(pos=1102, lineno=26, colno=10) + end_location: SourceLocation(pos=1107, lineno=26, colno=15) + value: 24000.0 + suffix: None + + location: SourceLocation(pos=1108, lineno=27, colno=1) + end_location: SourceLocation(pos=1126, lineno=27, colno=19) + identifier: 'weather:clear:duration' + arguments: + + location: SourceLocation(pos=1122, lineno=27, colno=15) + end_location: SourceLocation(pos=1126, lineno=27, colno=19) + value: 1200 + + location: SourceLocation(pos=1127, lineno=28, colno=1) + end_location: SourceLocation(pos=1127, lineno=28, colno=1) + identifier: 'weather:rain' + arguments: + \ No newline at end of file From c35b9530501029b08a4debb6c32eb58142cc3be2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Aug 2021 00:13:56 +0200 Subject: [PATCH 0272/1554] fix: parse uuids into UUID objects --- packages/mecha/mecha/parse.py | 8 +++++--- .../parse__argument_examples_minecraft_uuid_147__0.txt | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 517c60bd6..0fc03caeb 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -32,6 +32,7 @@ "CHAT_COLORS", ] + import re from dataclasses import dataclass, field from functools import partial @@ -47,6 +48,7 @@ TypeVar, overload, ) +from uuid import UUID # pyright: reportMissingTypeStubs=false from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String @@ -1097,13 +1099,13 @@ def create_node(self, stream: TokenStream) -> AstTime: # type: ignore ) -def parse_uuid(stream: TokenStream) -> AstValue[str]: +def parse_uuid(stream: TokenStream) -> AstValue[UUID]: """Parse uuid.""" with stream.syntax(uuid="-".join([r"[a-fA-F0-9]+"] * 5)): token = stream.expect("uuid") - return AstValue[str]( - value=token.value, + return AstValue[UUID]( + value=UUID(token.value), location=token.location, end_location=token.end_location, ) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt index 7d08e45d9..9f1e7470b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt @@ -7,4 +7,4 @@ dd12be42-52a9-4a91-a8a1-11c01849e498 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) - value: 'dd12be42-52a9-4a91-a8a1-11c01849e498' \ No newline at end of file + value: UUID('dd12be42-52a9-4a91-a8a1-11c01849e498') \ No newline at end of file From 70b228dcdd4e09201d398a70230db9a12462b6cb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Aug 2021 03:29:48 +0200 Subject: [PATCH 0273/1554] feat: handle selectors --- packages/mecha/mecha/ast.py | 61 +- packages/mecha/mecha/error.py | 12 + packages/mecha/mecha/parse.py | 312 ++++++++++- .../mecha/resources/argument_examples.json | 2 +- .../resources/command_examples.mcfunction | 1 + packages/mecha/scripts.py | 1 + ...gument_examples_minecraft_entity_56__0.txt | 10 + ...gument_examples_minecraft_entity_57__0.txt | 10 + ...gument_examples_minecraft_entity_58__0.txt | 12 + ...gument_examples_minecraft_entity_59__0.txt | 31 ++ ...gument_examples_minecraft_entity_60__0.txt | 10 + ..._examples_minecraft_game_profile_73__0.txt | 10 + ..._examples_minecraft_game_profile_74__0.txt | 10 + ..._examples_minecraft_game_profile_75__0.txt | 10 + ..._examples_minecraft_game_profile_76__0.txt | 12 + ...ument_examples_minecraft_message_94__0.txt | 18 + ...ument_examples_minecraft_message_95__0.txt | 14 + ...ument_examples_minecraft_message_96__0.txt | 16 + ...ument_examples_minecraft_message_97__0.txt | 24 + ...examples_minecraft_score_holder_133__0.txt | 10 + ...examples_minecraft_score_holder_134__0.txt | 10 + ...examples_minecraft_score_holder_135__0.txt | 10 + ...examples_minecraft_score_holder_136__0.txt | 12 + .../snapshots/parse__command_examples__0.txt | 527 +++++++++--------- 24 files changed, 880 insertions(+), 265 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 64b7396b9..ee1be58a4 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -23,11 +23,16 @@ "AstItem", "AstRange", "AstTime", + "AstSelectorScoreMatch", + "AstSelectorScores", + "AstSelectorArgument", + "AstSelector", + "AstMessage", ] from dataclasses import dataclass, field, fields -from typing import Any, Generic, Iterator, Literal, Optional, Tuple, TypeVar +from typing import Any, Generic, Iterator, Literal, Optional, Tuple, TypeVar, Union # pyright: reportMissingTypeStubs=false from nbtlib import Compound @@ -280,3 +285,57 @@ class AstTime(AstNode): value: float suffix: Literal[None, "d", "s", "t"] + + +@dataclass(frozen=True) +class AstSelectorScoreMatch(AstNode): + """Ast selector score match node.""" + + objective: AstValue[str] + value: AstRange[int] + + +@dataclass(frozen=True) +class AstSelectorScores(AstNode): + """Ast selector scores node.""" + + scores: AstChildren[AstSelectorScoreMatch] + + +@dataclass(frozen=True) +class AstSelectorAdvancementMatch(AstNode): + """Ast selector advancement match node.""" + + name: AstResourceLocation + value: AstValue[bool] + + +@dataclass(frozen=True) +class AstSelectorAdvancements(AstNode): + """Ast selector advancements node.""" + + advancements: AstChildren[AstSelectorAdvancementMatch] + + +@dataclass(frozen=True) +class AstSelectorArgument(AstNode): + """Ast selector argument node.""" + + inverted: bool + key: AstValue[str] + value: AstNode + + +@dataclass(frozen=True) +class AstSelector(AstNode): + """Ast selector node.""" + + variable: Literal["p", "r", "a", "e", "s"] + arguments: AstChildren[AstSelectorArgument] + + +@dataclass(frozen=True) +class AstMessage(AstNode): + """Ast message node.""" + + sentence: AstChildren[Union[AstValue[str], AstSelector]] diff --git a/packages/mecha/mecha/error.py b/packages/mecha/mecha/error.py index 9d1c553df..6ab8842fd 100644 --- a/packages/mecha/mecha/error.py +++ b/packages/mecha/mecha/error.py @@ -1,6 +1,7 @@ __all__ = [ "MechaError", "InvalidEscapeSequence", + "UnrecognizedParser", ] @@ -15,5 +16,16 @@ class InvalidEscapeSequence(MechaError): index: int def __init__(self, characters: str, index: int): + super().__init__(characters, index) self.characters = characters self.index = index + + +class UnrecognizedParser(MechaError): + """Raised when delegating to an unrecognized parser.""" + + parser: str + + def __init__(self, parser: str): + super().__init__(parser) + self.parser = parser diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 0fc03caeb..0482030bd 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -23,10 +23,17 @@ "LiteralStringParser", "RangeParser", "parse_objective", + "parse_player_name", "parse_swizzle", "parse_team", "TimeParser", "parse_uuid", + "SelectorParser", + "parse_selector_scores", + "parse_selector_advancements", + "parse_entity", + "parse_score_holder", + "parse_message", "INTEGER_PATTERN", "FLOAT_PATTERN", "CHAT_COLORS", @@ -66,6 +73,7 @@ AstJsonObject, AstJsonObjectEntry, AstJsonValue, + AstMessage, AstNbt, AstNbtCompound, AstNbtCompoundEntry, @@ -75,12 +83,18 @@ AstRange, AstResourceLocation, AstRoot, + AstSelector, + AstSelectorAdvancementMatch, + AstSelectorAdvancements, + AstSelectorArgument, + AstSelectorScoreMatch, + AstSelectorScores, AstTime, AstValue, AstVector2, AstVector3, ) -from .error import InvalidEscapeSequence +from .error import InvalidEscapeSequence, UnrecognizedParser from .spec import CommandSpecification, Parser NumericType = TypeVar("NumericType", float, int) @@ -110,6 +124,10 @@ ] +# TODO: Move validation that doesn't break parsing into a separate pass +# TODO: Handle the extended syntax by default and validate vanilla compatibility in a separate pass + + def get_default_parsers() -> Dict[str, Parser]: """Return the default parsers.""" return { @@ -118,6 +136,42 @@ def get_default_parsers() -> Dict[str, Parser]: "argument": parse_argument, "json": JsonParser(), "nbt": NbtParser(), + "selector": SelectorParser(), + "selector:argument:x": delegate("brigadier:double"), + "selector:argument:y": delegate("brigadier:double"), + "selector:argument:z": delegate("brigadier:double"), + "selector:argument:distance": delegate("minecraft:float_range"), + "selector:argument:dx": delegate("brigadier:double"), + "selector:argument:dy": delegate("brigadier:double"), + "selector:argument:dz": delegate("brigadier:double"), + "selector:argument:scores": parse_selector_scores, + "selector:argument:tag": StringParser(type="word"), + "selector:argument:team": StringParser(type="word"), + "selector:argument:limit": delegate("brigadier:integer"), + "selector:argument:sort": LiteralStringParser( + [ + "nearest", + "furthest", + "random", + "arbitrary", + ], + ), + "selector:argument:level": delegate("minecraft:int_range"), + "selector:argument:gamemode": LiteralStringParser( + [ + "adventure", + "creative", + "spectator", + "survival", + ], + ), + "selector:argument:name": StringParser(type="phrase"), + "selector:argument:x_rotation": delegate("minecraft:float_range"), + "selector:argument:y_rotation": delegate("minecraft:float_range"), + "selector:argument:type": ResourceLocationParser(), + "selector:argument:nbt": delegate("minecraft:nbt_compound_tag"), + "selector:argument:advancements": parse_selector_advancements, + "selector:argument:predicate": delegate("minecraft:resource_location"), "brigadier:bool": parse_bool, "brigadier:double": NumericParser[float]( type=float, @@ -171,12 +225,12 @@ def get_default_parsers() -> Dict[str, Parser]: ), "minecraft:component": delegate("json"), "minecraft:dimension": delegate("minecraft:resource_location"), - # TODO: "minecraft:entity" + "minecraft:entity": parse_entity, "minecraft:entity_anchor": LiteralStringParser(["eyes", "feet"]), "minecraft:entity_summon": delegate("minecraft:resource_location"), "minecraft:float_range": RangeParser[float](type=float), "minecraft:function": ResourceLocationParser(), - # TODO: "minecraft:game_profile" + "minecraft:game_profile": delegate("minecraft:entity"), "minecraft:int_range": RangeParser[int](type=int), "minecraft:item_enchantment": StringParser(type="word"), "minecraft:item_predicate": ItemParser(), @@ -184,7 +238,7 @@ def get_default_parsers() -> Dict[str, Parser]: "minecraft:item_stack": ItemParser( resource_location_parser=ResourceLocationParser(allow_tag=False), ), - # TODO: "minecraft:message" + "minecraft:message": parse_message, "minecraft:mob_effect": StringParser(type="word"), "minecraft:nbt_compound_tag": parse_compound_tag, # TODO: "minecraft:nbt_path" @@ -215,7 +269,7 @@ def get_default_parsers() -> Dict[str, Parser]: allow_local=False, ) ), - # TODO: "minecraft:score_holder" + "minecraft:score_holder": parse_score_holder, "minecraft:scoreboard_slot": StringParser(type="word"), "minecraft:swizzle": parse_swizzle, "minecraft:team": parse_team, @@ -263,7 +317,7 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: spec = get_stream_spec(stream) if parser not in spec.parsers: - raise ValueError(f"Unrecognized parser {parser!r}.") + raise UnrecognizedParser(parser) return spec.parsers[parser](stream) @@ -457,6 +511,9 @@ def __call__(self, stream: TokenStream) -> AstValue[str]: string_type = properties.get("type", self.type) if string_type == "greedy": + with stream.intercept("whitespace"): + while stream.get("whitespace"): + continue with stream.syntax(line=r".+"): token = stream.expect("line") else: @@ -823,9 +880,7 @@ def parse_compound_tag(stream: TokenStream) -> AstNbtCompound: def parse_adjacent_nbt(stream: TokenStream) -> Optional[AstNbtCompound]: """Parse adjacent nbt.""" with stream.syntax(curly=r"\{"), stream.intercept("whitespace"): - found_curly = ( - lookahead.match("curly") if (lookahead := stream.peek()) else False - ) + found_curly = hint.match("curly") if (hint := stream.peek()) else False return parse_compound_tag(stream) if found_curly else None @@ -1046,6 +1101,23 @@ def parse_objective(stream: TokenStream) -> AstValue[str]: ) +def parse_player_name(stream: TokenStream) -> AstValue[str]: + """Parse player name.""" + with stream.syntax(name=r"[a-zA-Z0-9_.+-]+"): + token = stream.expect("name") + + if len(token.value) > 16: + raise token.emit_error( + InvalidSyntax("Player name must be limited to 16 characters.") + ) + + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) + + def parse_swizzle(stream: TokenStream) -> AstValue[str]: """Parse swizzle.""" token = stream.expect("literal") @@ -1109,3 +1181,225 @@ def parse_uuid(stream: TokenStream) -> AstValue[UUID]: location=token.location, end_location=token.end_location, ) + + +@dataclass +class SelectorParser: + """Parser for selectors.""" + + amount: str = "multiple" + type: str = "entities" + + def __call__(self, stream: TokenStream) -> AstSelector: + properties = get_stream_properties(stream) + + with stream.syntax( + selector=r"@[praes]\[?", + bracket=r"\]", + argument=r"[a-z_]+", + equal=r"=", + comma=r",", + exclamation=r"!", + ): + token = stream.expect("selector") + variable = token.value[1] + location = token.location + end_location = token.end_location + + is_player = variable in "pra" + is_single = variable in "prs" + + arguments: List[AstSelectorArgument] = [] + + if token.value.endswith("["): + for key in stream.collect("argument"): + stream.expect("equal") + + inverted = stream.get("exclamation") is not None + + try: + value = delegate(f"selector:argument:{key.value}", stream) + except UnrecognizedParser as exc: + if not exc.parser.startswith("selector:argument:"): + raise + raise key.emit_error( + InvalidSyntax(f"Invalid selector argument {key.value!r}.") + ) from exc + + arguments.append( + AstSelectorArgument( + inverted=inverted, + key=AstValue[str]( + value=key.value, + location=key.location, + end_location=key.end_location, + ), + value=value, + location=key.location, + end_location=value.end_location, + ) + ) + + if not stream.get("comma"): + break + + close_bracket = stream.expect(("bracket", "]")) + end_location = close_bracket.end_location + + amount = properties.get("amount", self.amount) + type = properties.get("type", self.type) + + if amount not in ["single", "multiple"]: + raise ValueError(f"Invalid selector amount {amount!r}.") + if type not in ["players", "entities"]: + raise ValueError(f"Invalid selector type {type!r}.") + + if amount == "single" and not is_single: + raise InvalidSyntax(f"Multiple entities not allowed.").set_location( + location=location, + end_location=end_location, + ) + if type == "players" and not is_player: + raise InvalidSyntax(f"Non-player entities not allowed.").set_location( + location=location, + end_location=end_location, + ) + + return AstSelector( + variable=variable, # type: ignore + arguments=AstChildren(arguments), + location=location, + end_location=end_location, + ) + + +def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: + """Parse selector scores.""" + with stream.syntax( + curly=r"\{|\}", + objective=r"[a-zA-Z0-9_.+-]+", + equal=r"=", + comma=r",", + ): + curly = stream.expect(("curly", "{")) + + scores: List[AstSelectorScoreMatch] = [] + + for objective in stream.collect("objective"): + stream.expect("equal") + value = delegate("minecraft:integer_range", stream) + + scores.append( + AstSelectorScoreMatch( + objective=AstValue[str]( + value=objective.value, + location=objective.location, + end_location=objective.end_location, + ), + value=value, + location=objective.location, + end_location=value.end_location, + ) + ) + + if not stream.get("comma"): + break + + close_curly = stream.expect(("curly", "}")) + + return AstSelectorScores( + scores=AstChildren(scores), + location=curly.location, + end_location=close_curly.end_location, + ) + + +def parse_selector_advancements(stream: TokenStream) -> AstSelectorAdvancements: + """Parse selector advancements.""" + with stream.syntax(curly=r"\{|\}", equal=r"=", comma=r","): + curly = stream.expect(("curly", "{")) + + advancements: List[AstSelectorAdvancementMatch] = [] + + for _ in stream.peek_until(("curly", "}")): + name = delegate("minecraft:resource_location", stream) + stream.expect("equal") + value = delegate("brigadier:bool", stream) + + advancements.append( + AstSelectorAdvancementMatch( + name=name, + value=value, + location=name.location, + end_location=value.end_location, + ) + ) + + if not stream.get("comma"): + stream.expect(("curly", "}")) + break + + return AstSelectorAdvancements( + advancements=AstChildren(advancements), + location=curly.location, + end_location=stream.current.end_location, + ) + + +def parse_entity(stream: TokenStream) -> Any: + """Parse entity.""" + hint = stream.peek() + + if hint: + if hint.value.startswith("@"): + return delegate("selector", stream) + + if hint.value.count("-") == 4: + with stream.alternative(): + return delegate("minecraft:uuid", stream) + + return parse_player_name(stream) + + +def parse_score_holder(stream: TokenStream) -> Any: + """Parse score holder.""" + with stream.syntax(wildcard=r"\*"): + if token := stream.get("wildcard"): + return AstValue[str]( + value=token.value, + location=token.location, + end_location=token.end_location, + ) + return delegate("minecraft:entity", stream) + + +def parse_message(stream: TokenStream) -> AstMessage: + """Parse message.""" + with stream.intercept("whitespace"): + while stream.get("whitespace"): + continue + + with stream.syntax(selector=r"@[praes]"): + sentence: List[Any] = [] + + for selector, literal in stream.collect("selector", "literal"): + if selector: + stream.index -= 1 + sentence.append(delegate("selector", stream)) + elif literal: + sentence.append( + AstValue[str]( + value=literal.value, + location=literal.location, + end_location=literal.end_location, + ) + ) + + if not sentence: + raise stream.emit_error(InvalidSyntax("Empty message not allowed.")) + + return AstMessage( + sentence=AstChildren(sentence), + location=sentence[0].location, + end_location=sentence[-1].end_location, + ) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 04cb02e35..fa3c96b29 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -157,7 +157,7 @@ ], "minecraft:message": [ { - "examples": ["Hello world!", "foo", "@e", "Hello @p\u00a0:)"] + "examples": ["Hello world!", "foo", "@e", "Hello @p :)"] } ], "minecraft:mob_effect": [ diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index cf1dcbc1e..b8262400d 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -14,6 +14,7 @@ gamerule keepInventory true gamerule commandBlockOutput false gamerule doInsomnia false locate mansion +msg @a Hi setblock ~ ~ ~ chest[facing=east] setblock ~ ~ ~-1 birch_sign{Text1:'"My chest"',Text2:'"Do not open!"'} setblock ~ ~2 ~ quartz_slab[type=top] diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py index 1949afa7c..7652d5f8c 100644 --- a/packages/mecha/scripts.py +++ b/packages/mecha/scripts.py @@ -53,6 +53,7 @@ def download_command_examples(): "function", "gamerule", "locate", + "msg", "setblock", "summon", "time", diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt new file mode 100644 index 000000000..9243b4b9f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt @@ -0,0 +1,10 @@ +minecraft:entity +--- +{} +--- +Player +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt new file mode 100644 index 000000000..415151a21 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt @@ -0,0 +1,10 @@ +minecraft:entity +--- +{} +--- +0123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt new file mode 100644 index 000000000..1a29449cf --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt @@ -0,0 +1,12 @@ +minecraft:entity +--- +{} +--- +@e +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 'e' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt new file mode 100644 index 000000000..83453e83c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt @@ -0,0 +1,31 @@ +minecraft:entity +--- +{} +--- +@e[type=foo] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + variable: 'e' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'type' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt new file mode 100644 index 000000000..f689f10b4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt @@ -0,0 +1,10 @@ +minecraft:entity +--- +{} +--- +dd12be42-52a9-4a91-a8a1-11c01849e498 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: UUID('dd12be42-52a9-4a91-a8a1-11c01849e498') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt new file mode 100644 index 000000000..7d33a94f7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt @@ -0,0 +1,10 @@ +minecraft:game_profile +--- +{} +--- +Player +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt new file mode 100644 index 000000000..e7ed93ea5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt @@ -0,0 +1,10 @@ +minecraft:game_profile +--- +{} +--- +0123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt new file mode 100644 index 000000000..a9f5bcea5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt @@ -0,0 +1,10 @@ +minecraft:game_profile +--- +{} +--- +dd12be42-52a9-4a91-a8a1-11c01849e498 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: UUID('dd12be42-52a9-4a91-a8a1-11c01849e498') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt new file mode 100644 index 000000000..ac997704d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt @@ -0,0 +1,12 @@ +minecraft:game_profile +--- +{} +--- +@e +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 'e' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt new file mode 100644 index 000000000..3ff270a6a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt @@ -0,0 +1,18 @@ +minecraft:message +--- +{} +--- +Hello world! +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + sentence: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'Hello' + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'world!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt new file mode 100644 index 000000000..ea4523d0f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt @@ -0,0 +1,14 @@ +minecraft:message +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + sentence: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt new file mode 100644 index 000000000..4bcf50a2e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt @@ -0,0 +1,16 @@ +minecraft:message +--- +{} +--- +@e +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + sentence: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 'e' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt new file mode 100644 index 000000000..cd45b1e94 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt @@ -0,0 +1,24 @@ +minecraft:message +--- +{} +--- +Hello @p :) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + sentence: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'Hello' + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + variable: 'p' + arguments: + + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: ':)' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt new file mode 100644 index 000000000..2254ac43a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder +--- +{} +--- +Player +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt new file mode 100644 index 000000000..912601f91 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder +--- +{} +--- +0123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt new file mode 100644 index 000000000..938c17d5b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder +--- +{} +--- +* +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt new file mode 100644 index 000000000..eb2640952 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder +--- +{} +--- +@e +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 'e' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 079a25f86..69681f0ff 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1141, lineno=30, colno=1) + end_location: SourceLocation(pos=1151, lineno=31, colno=1) filename: None commands: @@ -496,601 +496,620 @@ location: SourceLocation(pos=606, lineno=17, colno=1) - end_location: SourceLocation(pos=639, lineno=17, colno=34) + end_location: SourceLocation(pos=615, lineno=17, colno=10) + identifier: 'msg:targets:message' + arguments: + + location: SourceLocation(pos=610, lineno=17, colno=5) + end_location: SourceLocation(pos=612, lineno=17, colno=7) + variable: 'a' + arguments: + + + location: SourceLocation(pos=613, lineno=17, colno=8) + end_location: SourceLocation(pos=615, lineno=17, colno=10) + sentence: + + location: SourceLocation(pos=613, lineno=17, colno=8) + end_location: SourceLocation(pos=615, lineno=17, colno=10) + value: 'Hi' + + location: SourceLocation(pos=616, lineno=18, colno=1) + end_location: SourceLocation(pos=649, lineno=18, colno=34) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=615, lineno=17, colno=10) - end_location: SourceLocation(pos=620, lineno=17, colno=15) + location: SourceLocation(pos=625, lineno=18, colno=10) + end_location: SourceLocation(pos=630, lineno=18, colno=15) x: - location: SourceLocation(pos=615, lineno=17, colno=10) - end_location: SourceLocation(pos=616, lineno=17, colno=11) + location: SourceLocation(pos=625, lineno=18, colno=10) + end_location: SourceLocation(pos=626, lineno=18, colno=11) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=617, lineno=17, colno=12) - end_location: SourceLocation(pos=618, lineno=17, colno=13) + location: SourceLocation(pos=627, lineno=18, colno=12) + end_location: SourceLocation(pos=628, lineno=18, colno=13) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=619, lineno=17, colno=14) - end_location: SourceLocation(pos=620, lineno=17, colno=15) + location: SourceLocation(pos=629, lineno=18, colno=14) + end_location: SourceLocation(pos=630, lineno=18, colno=15) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=621, lineno=17, colno=16) - end_location: SourceLocation(pos=639, lineno=17, colno=34) + location: SourceLocation(pos=631, lineno=18, colno=16) + end_location: SourceLocation(pos=649, lineno=18, colno=34) identifier: - location: SourceLocation(pos=621, lineno=17, colno=16) - end_location: SourceLocation(pos=626, lineno=17, colno=21) + location: SourceLocation(pos=631, lineno=18, colno=16) + end_location: SourceLocation(pos=636, lineno=18, colno=21) is_tag: False namespace: None path: - location: SourceLocation(pos=621, lineno=17, colno=16) - end_location: SourceLocation(pos=626, lineno=17, colno=21) + location: SourceLocation(pos=631, lineno=18, colno=16) + end_location: SourceLocation(pos=636, lineno=18, colno=21) value: 'chest' block_states: - location: SourceLocation(pos=627, lineno=17, colno=22) - end_location: SourceLocation(pos=638, lineno=17, colno=33) + location: SourceLocation(pos=637, lineno=18, colno=22) + end_location: SourceLocation(pos=648, lineno=18, colno=33) key: - location: SourceLocation(pos=627, lineno=17, colno=22) - end_location: SourceLocation(pos=633, lineno=17, colno=28) + location: SourceLocation(pos=637, lineno=18, colno=22) + end_location: SourceLocation(pos=643, lineno=18, colno=28) value: 'facing' value: - location: SourceLocation(pos=634, lineno=17, colno=29) - end_location: SourceLocation(pos=638, lineno=17, colno=33) + location: SourceLocation(pos=644, lineno=18, colno=29) + end_location: SourceLocation(pos=648, lineno=18, colno=33) value: 'east' data_tags: None - location: SourceLocation(pos=640, lineno=18, colno=1) - end_location: SourceLocation(pos=710, lineno=18, colno=71) + location: SourceLocation(pos=650, lineno=19, colno=1) + end_location: SourceLocation(pos=720, lineno=19, colno=71) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=649, lineno=18, colno=10) - end_location: SourceLocation(pos=656, lineno=18, colno=17) + location: SourceLocation(pos=659, lineno=19, colno=10) + end_location: SourceLocation(pos=666, lineno=19, colno=17) x: - location: SourceLocation(pos=649, lineno=18, colno=10) - end_location: SourceLocation(pos=650, lineno=18, colno=11) + location: SourceLocation(pos=659, lineno=19, colno=10) + end_location: SourceLocation(pos=660, lineno=19, colno=11) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=651, lineno=18, colno=12) - end_location: SourceLocation(pos=652, lineno=18, colno=13) + location: SourceLocation(pos=661, lineno=19, colno=12) + end_location: SourceLocation(pos=662, lineno=19, colno=13) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=653, lineno=18, colno=14) - end_location: SourceLocation(pos=656, lineno=18, colno=17) + location: SourceLocation(pos=663, lineno=19, colno=14) + end_location: SourceLocation(pos=666, lineno=19, colno=17) value: -1.0 prefix: 'relative' - location: SourceLocation(pos=657, lineno=18, colno=18) - end_location: SourceLocation(pos=710, lineno=18, colno=71) + location: SourceLocation(pos=667, lineno=19, colno=18) + end_location: SourceLocation(pos=720, lineno=19, colno=71) identifier: - location: SourceLocation(pos=657, lineno=18, colno=18) - end_location: SourceLocation(pos=667, lineno=18, colno=28) + location: SourceLocation(pos=667, lineno=19, colno=18) + end_location: SourceLocation(pos=677, lineno=19, colno=28) is_tag: False namespace: None path: - location: SourceLocation(pos=657, lineno=18, colno=18) - end_location: SourceLocation(pos=667, lineno=18, colno=28) + location: SourceLocation(pos=667, lineno=19, colno=18) + end_location: SourceLocation(pos=677, lineno=19, colno=28) value: 'birch_sign' block_states: data_tags: - location: SourceLocation(pos=667, lineno=18, colno=28) - end_location: SourceLocation(pos=710, lineno=18, colno=71) + location: SourceLocation(pos=677, lineno=19, colno=28) + end_location: SourceLocation(pos=720, lineno=19, colno=71) entries: - location: SourceLocation(pos=668, lineno=18, colno=29) - end_location: SourceLocation(pos=686, lineno=18, colno=47) + location: SourceLocation(pos=678, lineno=19, colno=29) + end_location: SourceLocation(pos=696, lineno=19, colno=47) key: - location: SourceLocation(pos=668, lineno=18, colno=29) - end_location: SourceLocation(pos=673, lineno=18, colno=34) + location: SourceLocation(pos=678, lineno=19, colno=29) + end_location: SourceLocation(pos=683, lineno=19, colno=34) value: 'Text1' value: - location: SourceLocation(pos=674, lineno=18, colno=35) - end_location: SourceLocation(pos=686, lineno=18, colno=47) + location: SourceLocation(pos=684, lineno=19, colno=35) + end_location: SourceLocation(pos=696, lineno=19, colno=47) value: String('"My chest"') - location: SourceLocation(pos=687, lineno=18, colno=48) - end_location: SourceLocation(pos=709, lineno=18, colno=70) + location: SourceLocation(pos=697, lineno=19, colno=48) + end_location: SourceLocation(pos=719, lineno=19, colno=70) key: - location: SourceLocation(pos=687, lineno=18, colno=48) - end_location: SourceLocation(pos=692, lineno=18, colno=53) + location: SourceLocation(pos=697, lineno=19, colno=48) + end_location: SourceLocation(pos=702, lineno=19, colno=53) value: 'Text2' value: - location: SourceLocation(pos=693, lineno=18, colno=54) - end_location: SourceLocation(pos=709, lineno=18, colno=70) + location: SourceLocation(pos=703, lineno=19, colno=54) + end_location: SourceLocation(pos=719, lineno=19, colno=70) value: String('"Do not open!"') - location: SourceLocation(pos=711, lineno=19, colno=1) - end_location: SourceLocation(pos=748, lineno=19, colno=38) + location: SourceLocation(pos=721, lineno=20, colno=1) + end_location: SourceLocation(pos=758, lineno=20, colno=38) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=720, lineno=19, colno=10) - end_location: SourceLocation(pos=726, lineno=19, colno=16) + location: SourceLocation(pos=730, lineno=20, colno=10) + end_location: SourceLocation(pos=736, lineno=20, colno=16) x: - location: SourceLocation(pos=720, lineno=19, colno=10) - end_location: SourceLocation(pos=721, lineno=19, colno=11) + location: SourceLocation(pos=730, lineno=20, colno=10) + end_location: SourceLocation(pos=731, lineno=20, colno=11) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=722, lineno=19, colno=12) - end_location: SourceLocation(pos=724, lineno=19, colno=14) + location: SourceLocation(pos=732, lineno=20, colno=12) + end_location: SourceLocation(pos=734, lineno=20, colno=14) value: 2.0 prefix: 'relative' z: - location: SourceLocation(pos=725, lineno=19, colno=15) - end_location: SourceLocation(pos=726, lineno=19, colno=16) + location: SourceLocation(pos=735, lineno=20, colno=15) + end_location: SourceLocation(pos=736, lineno=20, colno=16) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=727, lineno=19, colno=17) - end_location: SourceLocation(pos=748, lineno=19, colno=38) + location: SourceLocation(pos=737, lineno=20, colno=17) + end_location: SourceLocation(pos=758, lineno=20, colno=38) identifier: - location: SourceLocation(pos=727, lineno=19, colno=17) - end_location: SourceLocation(pos=738, lineno=19, colno=28) + location: SourceLocation(pos=737, lineno=20, colno=17) + end_location: SourceLocation(pos=748, lineno=20, colno=28) is_tag: False namespace: None path: - location: SourceLocation(pos=727, lineno=19, colno=17) - end_location: SourceLocation(pos=738, lineno=19, colno=28) + location: SourceLocation(pos=737, lineno=20, colno=17) + end_location: SourceLocation(pos=748, lineno=20, colno=28) value: 'quartz_slab' block_states: - location: SourceLocation(pos=739, lineno=19, colno=29) - end_location: SourceLocation(pos=747, lineno=19, colno=37) + location: SourceLocation(pos=749, lineno=20, colno=29) + end_location: SourceLocation(pos=757, lineno=20, colno=37) key: - location: SourceLocation(pos=739, lineno=19, colno=29) - end_location: SourceLocation(pos=743, lineno=19, colno=33) + location: SourceLocation(pos=749, lineno=20, colno=29) + end_location: SourceLocation(pos=753, lineno=20, colno=33) value: 'type' value: - location: SourceLocation(pos=744, lineno=19, colno=34) - end_location: SourceLocation(pos=747, lineno=19, colno=37) + location: SourceLocation(pos=754, lineno=20, colno=34) + end_location: SourceLocation(pos=757, lineno=20, colno=37) value: 'top' data_tags: None - location: SourceLocation(pos=749, lineno=20, colno=1) - end_location: SourceLocation(pos=779, lineno=20, colno=31) + location: SourceLocation(pos=759, lineno=21, colno=1) + end_location: SourceLocation(pos=789, lineno=21, colno=31) identifier: 'summon:entity:pos' arguments: - location: SourceLocation(pos=756, lineno=20, colno=8) - end_location: SourceLocation(pos=770, lineno=20, colno=22) + location: SourceLocation(pos=766, lineno=21, colno=8) + end_location: SourceLocation(pos=780, lineno=21, colno=22) is_tag: False namespace: None path: - location: SourceLocation(pos=756, lineno=20, colno=8) - end_location: SourceLocation(pos=770, lineno=20, colno=22) + location: SourceLocation(pos=766, lineno=21, colno=8) + end_location: SourceLocation(pos=780, lineno=21, colno=22) value: 'lightning_bolt' - location: SourceLocation(pos=771, lineno=20, colno=23) - end_location: SourceLocation(pos=779, lineno=20, colno=31) + location: SourceLocation(pos=781, lineno=21, colno=23) + end_location: SourceLocation(pos=789, lineno=21, colno=31) x: - location: SourceLocation(pos=771, lineno=20, colno=23) - end_location: SourceLocation(pos=775, lineno=20, colno=27) + location: SourceLocation(pos=781, lineno=21, colno=23) + end_location: SourceLocation(pos=785, lineno=21, colno=27) value: -10.0 prefix: 'relative' y: - location: SourceLocation(pos=776, lineno=20, colno=28) - end_location: SourceLocation(pos=777, lineno=20, colno=29) + location: SourceLocation(pos=786, lineno=21, colno=28) + end_location: SourceLocation(pos=787, lineno=21, colno=29) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=778, lineno=20, colno=30) - end_location: SourceLocation(pos=779, lineno=20, colno=31) + location: SourceLocation(pos=788, lineno=21, colno=30) + end_location: SourceLocation(pos=789, lineno=21, colno=31) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=780, lineno=21, colno=1) - end_location: SourceLocation(pos=853, lineno=21, colno=74) + location: SourceLocation(pos=790, lineno=22, colno=1) + end_location: SourceLocation(pos=863, lineno=22, colno=74) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=787, lineno=21, colno=8) - end_location: SourceLocation(pos=794, lineno=21, colno=15) + location: SourceLocation(pos=797, lineno=22, colno=8) + end_location: SourceLocation(pos=804, lineno=22, colno=15) is_tag: False namespace: None path: - location: SourceLocation(pos=787, lineno=21, colno=8) - end_location: SourceLocation(pos=794, lineno=21, colno=15) + location: SourceLocation(pos=797, lineno=22, colno=8) + end_location: SourceLocation(pos=804, lineno=22, colno=15) value: 'creeper' - location: SourceLocation(pos=795, lineno=21, colno=16) - end_location: SourceLocation(pos=800, lineno=21, colno=21) + location: SourceLocation(pos=805, lineno=22, colno=16) + end_location: SourceLocation(pos=810, lineno=22, colno=21) x: - location: SourceLocation(pos=795, lineno=21, colno=16) - end_location: SourceLocation(pos=796, lineno=21, colno=17) + location: SourceLocation(pos=805, lineno=22, colno=16) + end_location: SourceLocation(pos=806, lineno=22, colno=17) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=797, lineno=21, colno=18) - end_location: SourceLocation(pos=798, lineno=21, colno=19) + location: SourceLocation(pos=807, lineno=22, colno=18) + end_location: SourceLocation(pos=808, lineno=22, colno=19) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=799, lineno=21, colno=20) - end_location: SourceLocation(pos=800, lineno=21, colno=21) + location: SourceLocation(pos=809, lineno=22, colno=20) + end_location: SourceLocation(pos=810, lineno=22, colno=21) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=801, lineno=21, colno=22) - end_location: SourceLocation(pos=853, lineno=21, colno=74) + location: SourceLocation(pos=811, lineno=22, colno=22) + end_location: SourceLocation(pos=863, lineno=22, colno=74) entries: - location: SourceLocation(pos=802, lineno=21, colno=23) - end_location: SourceLocation(pos=812, lineno=21, colno=33) + location: SourceLocation(pos=812, lineno=22, colno=23) + end_location: SourceLocation(pos=822, lineno=22, colno=33) key: - location: SourceLocation(pos=802, lineno=21, colno=23) - end_location: SourceLocation(pos=809, lineno=21, colno=30) + location: SourceLocation(pos=812, lineno=22, colno=23) + end_location: SourceLocation(pos=819, lineno=22, colno=30) value: 'powered' value: - location: SourceLocation(pos=810, lineno=21, colno=31) - end_location: SourceLocation(pos=812, lineno=21, colno=33) + location: SourceLocation(pos=820, lineno=22, colno=31) + end_location: SourceLocation(pos=822, lineno=22, colno=33) value: Byte(1) - location: SourceLocation(pos=813, lineno=21, colno=34) - end_location: SourceLocation(pos=852, lineno=21, colno=73) + location: SourceLocation(pos=823, lineno=22, colno=34) + end_location: SourceLocation(pos=862, lineno=22, colno=73) key: - location: SourceLocation(pos=813, lineno=21, colno=34) - end_location: SourceLocation(pos=823, lineno=21, colno=44) + location: SourceLocation(pos=823, lineno=22, colno=34) + end_location: SourceLocation(pos=833, lineno=22, colno=44) value: 'CustomName' value: - location: SourceLocation(pos=824, lineno=21, colno=45) - end_location: SourceLocation(pos=852, lineno=21, colno=73) + location: SourceLocation(pos=834, lineno=22, colno=45) + end_location: SourceLocation(pos=862, lineno=22, colno=73) value: String('{"text":"Powered Creeper"}') - location: SourceLocation(pos=854, lineno=22, colno=1) - end_location: SourceLocation(pos=956, lineno=22, colno=103) + location: SourceLocation(pos=864, lineno=23, colno=1) + end_location: SourceLocation(pos=966, lineno=23, colno=103) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=861, lineno=22, colno=8) - end_location: SourceLocation(pos=867, lineno=22, colno=14) + location: SourceLocation(pos=871, lineno=23, colno=8) + end_location: SourceLocation(pos=877, lineno=23, colno=14) is_tag: False namespace: None path: - location: SourceLocation(pos=861, lineno=22, colno=8) - end_location: SourceLocation(pos=867, lineno=22, colno=14) + location: SourceLocation(pos=871, lineno=23, colno=8) + end_location: SourceLocation(pos=877, lineno=23, colno=14) value: 'spider' - location: SourceLocation(pos=868, lineno=22, colno=15) - end_location: SourceLocation(pos=873, lineno=22, colno=20) + location: SourceLocation(pos=878, lineno=23, colno=15) + end_location: SourceLocation(pos=883, lineno=23, colno=20) x: - location: SourceLocation(pos=868, lineno=22, colno=15) - end_location: SourceLocation(pos=869, lineno=22, colno=16) + location: SourceLocation(pos=878, lineno=23, colno=15) + end_location: SourceLocation(pos=879, lineno=23, colno=16) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=870, lineno=22, colno=17) - end_location: SourceLocation(pos=871, lineno=22, colno=18) + location: SourceLocation(pos=880, lineno=23, colno=17) + end_location: SourceLocation(pos=881, lineno=23, colno=18) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=872, lineno=22, colno=19) - end_location: SourceLocation(pos=873, lineno=22, colno=20) + location: SourceLocation(pos=882, lineno=23, colno=19) + end_location: SourceLocation(pos=883, lineno=23, colno=20) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=874, lineno=22, colno=21) - end_location: SourceLocation(pos=956, lineno=22, colno=103) + location: SourceLocation(pos=884, lineno=23, colno=21) + end_location: SourceLocation(pos=966, lineno=23, colno=103) entries: - location: SourceLocation(pos=875, lineno=22, colno=22) - end_location: SourceLocation(pos=955, lineno=22, colno=102) + location: SourceLocation(pos=885, lineno=23, colno=22) + end_location: SourceLocation(pos=965, lineno=23, colno=102) key: - location: SourceLocation(pos=875, lineno=22, colno=22) - end_location: SourceLocation(pos=885, lineno=22, colno=32) + location: SourceLocation(pos=885, lineno=23, colno=22) + end_location: SourceLocation(pos=895, lineno=23, colno=32) value: 'Passengers' value: - location: SourceLocation(pos=886, lineno=22, colno=33) - end_location: SourceLocation(pos=955, lineno=22, colno=102) + location: SourceLocation(pos=896, lineno=23, colno=33) + end_location: SourceLocation(pos=965, lineno=23, colno=102) elements: - location: SourceLocation(pos=887, lineno=22, colno=34) - end_location: SourceLocation(pos=954, lineno=22, colno=101) + location: SourceLocation(pos=897, lineno=23, colno=34) + end_location: SourceLocation(pos=964, lineno=23, colno=101) entries: - location: SourceLocation(pos=888, lineno=22, colno=35) - end_location: SourceLocation(pos=911, lineno=22, colno=58) + location: SourceLocation(pos=898, lineno=23, colno=35) + end_location: SourceLocation(pos=921, lineno=23, colno=58) key: - location: SourceLocation(pos=888, lineno=22, colno=35) - end_location: SourceLocation(pos=890, lineno=22, colno=37) + location: SourceLocation(pos=898, lineno=23, colno=35) + end_location: SourceLocation(pos=900, lineno=23, colno=37) value: 'id' value: - location: SourceLocation(pos=891, lineno=22, colno=38) - end_location: SourceLocation(pos=911, lineno=22, colno=58) + location: SourceLocation(pos=901, lineno=23, colno=38) + end_location: SourceLocation(pos=921, lineno=23, colno=58) value: String('minecraft:skeleton') - location: SourceLocation(pos=912, lineno=22, colno=59) - end_location: SourceLocation(pos=953, lineno=22, colno=100) + location: SourceLocation(pos=922, lineno=23, colno=59) + end_location: SourceLocation(pos=963, lineno=23, colno=100) key: - location: SourceLocation(pos=912, lineno=22, colno=59) - end_location: SourceLocation(pos=921, lineno=22, colno=68) + location: SourceLocation(pos=922, lineno=23, colno=59) + end_location: SourceLocation(pos=931, lineno=23, colno=68) value: 'HandItems' value: - location: SourceLocation(pos=922, lineno=22, colno=69) - end_location: SourceLocation(pos=953, lineno=22, colno=100) + location: SourceLocation(pos=932, lineno=23, colno=69) + end_location: SourceLocation(pos=963, lineno=23, colno=100) elements: - location: SourceLocation(pos=923, lineno=22, colno=70) - end_location: SourceLocation(pos=952, lineno=22, colno=99) + location: SourceLocation(pos=933, lineno=23, colno=70) + end_location: SourceLocation(pos=962, lineno=23, colno=99) entries: - location: SourceLocation(pos=924, lineno=22, colno=71) - end_location: SourceLocation(pos=942, lineno=22, colno=89) + location: SourceLocation(pos=934, lineno=23, colno=71) + end_location: SourceLocation(pos=952, lineno=23, colno=89) key: - location: SourceLocation(pos=924, lineno=22, colno=71) - end_location: SourceLocation(pos=926, lineno=22, colno=73) + location: SourceLocation(pos=934, lineno=23, colno=71) + end_location: SourceLocation(pos=936, lineno=23, colno=73) value: 'id' value: - location: SourceLocation(pos=927, lineno=22, colno=74) - end_location: SourceLocation(pos=942, lineno=22, colno=89) + location: SourceLocation(pos=937, lineno=23, colno=74) + end_location: SourceLocation(pos=952, lineno=23, colno=89) value: String('minecraft:bow') - location: SourceLocation(pos=943, lineno=22, colno=90) - end_location: SourceLocation(pos=951, lineno=22, colno=98) + location: SourceLocation(pos=953, lineno=23, colno=90) + end_location: SourceLocation(pos=961, lineno=23, colno=98) key: - location: SourceLocation(pos=943, lineno=22, colno=90) - end_location: SourceLocation(pos=948, lineno=22, colno=95) + location: SourceLocation(pos=953, lineno=23, colno=90) + end_location: SourceLocation(pos=958, lineno=23, colno=95) value: 'Count' value: - location: SourceLocation(pos=949, lineno=22, colno=96) - end_location: SourceLocation(pos=951, lineno=22, colno=98) + location: SourceLocation(pos=959, lineno=23, colno=96) + end_location: SourceLocation(pos=961, lineno=23, colno=98) value: Byte(1) - location: SourceLocation(pos=957, lineno=23, colno=1) - end_location: SourceLocation(pos=1065, lineno=23, colno=109) + location: SourceLocation(pos=967, lineno=24, colno=1) + end_location: SourceLocation(pos=1075, lineno=24, colno=109) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=964, lineno=23, colno=8) - end_location: SourceLocation(pos=972, lineno=23, colno=16) + location: SourceLocation(pos=974, lineno=24, colno=8) + end_location: SourceLocation(pos=982, lineno=24, colno=16) is_tag: False namespace: None path: - location: SourceLocation(pos=964, lineno=23, colno=8) - end_location: SourceLocation(pos=972, lineno=23, colno=16) + location: SourceLocation(pos=974, lineno=24, colno=8) + end_location: SourceLocation(pos=982, lineno=24, colno=16) value: 'villager' - location: SourceLocation(pos=973, lineno=23, colno=17) - end_location: SourceLocation(pos=978, lineno=23, colno=22) + location: SourceLocation(pos=983, lineno=24, colno=17) + end_location: SourceLocation(pos=988, lineno=24, colno=22) x: - location: SourceLocation(pos=973, lineno=23, colno=17) - end_location: SourceLocation(pos=974, lineno=23, colno=18) + location: SourceLocation(pos=983, lineno=24, colno=17) + end_location: SourceLocation(pos=984, lineno=24, colno=18) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=975, lineno=23, colno=19) - end_location: SourceLocation(pos=976, lineno=23, colno=20) + location: SourceLocation(pos=985, lineno=24, colno=19) + end_location: SourceLocation(pos=986, lineno=24, colno=20) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=977, lineno=23, colno=21) - end_location: SourceLocation(pos=978, lineno=23, colno=22) + location: SourceLocation(pos=987, lineno=24, colno=21) + end_location: SourceLocation(pos=988, lineno=24, colno=22) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=979, lineno=23, colno=23) - end_location: SourceLocation(pos=1065, lineno=23, colno=109) + location: SourceLocation(pos=989, lineno=24, colno=23) + end_location: SourceLocation(pos=1075, lineno=24, colno=109) entries: - location: SourceLocation(pos=980, lineno=23, colno=24) - end_location: SourceLocation(pos=1064, lineno=23, colno=108) + location: SourceLocation(pos=990, lineno=24, colno=24) + end_location: SourceLocation(pos=1074, lineno=24, colno=108) key: - location: SourceLocation(pos=980, lineno=23, colno=24) - end_location: SourceLocation(pos=986, lineno=23, colno=30) + location: SourceLocation(pos=990, lineno=24, colno=24) + end_location: SourceLocation(pos=996, lineno=24, colno=30) value: 'Offers' value: - location: SourceLocation(pos=987, lineno=23, colno=31) - end_location: SourceLocation(pos=1064, lineno=23, colno=108) + location: SourceLocation(pos=997, lineno=24, colno=31) + end_location: SourceLocation(pos=1074, lineno=24, colno=108) entries: - location: SourceLocation(pos=988, lineno=23, colno=32) - end_location: SourceLocation(pos=1063, lineno=23, colno=107) + location: SourceLocation(pos=998, lineno=24, colno=32) + end_location: SourceLocation(pos=1073, lineno=24, colno=107) key: - location: SourceLocation(pos=988, lineno=23, colno=32) - end_location: SourceLocation(pos=995, lineno=23, colno=39) + location: SourceLocation(pos=998, lineno=24, colno=32) + end_location: SourceLocation(pos=1005, lineno=24, colno=39) value: 'Recipes' value: - location: SourceLocation(pos=996, lineno=23, colno=40) - end_location: SourceLocation(pos=1063, lineno=23, colno=107) + location: SourceLocation(pos=1006, lineno=24, colno=40) + end_location: SourceLocation(pos=1073, lineno=24, colno=107) elements: - location: SourceLocation(pos=997, lineno=23, colno=41) - end_location: SourceLocation(pos=1062, lineno=23, colno=106) + location: SourceLocation(pos=1007, lineno=24, colno=41) + end_location: SourceLocation(pos=1072, lineno=24, colno=106) entries: - location: SourceLocation(pos=998, lineno=23, colno=42) - end_location: SourceLocation(pos=1019, lineno=23, colno=63) + location: SourceLocation(pos=1008, lineno=24, colno=42) + end_location: SourceLocation(pos=1029, lineno=24, colno=63) key: - location: SourceLocation(pos=998, lineno=23, colno=42) - end_location: SourceLocation(pos=1001, lineno=23, colno=45) + location: SourceLocation(pos=1008, lineno=24, colno=42) + end_location: SourceLocation(pos=1011, lineno=24, colno=45) value: 'buy' value: - location: SourceLocation(pos=1002, lineno=23, colno=46) - end_location: SourceLocation(pos=1019, lineno=23, colno=63) + location: SourceLocation(pos=1012, lineno=24, colno=46) + end_location: SourceLocation(pos=1029, lineno=24, colno=63) entries: - location: SourceLocation(pos=1003, lineno=23, colno=47) - end_location: SourceLocation(pos=1010, lineno=23, colno=54) + location: SourceLocation(pos=1013, lineno=24, colno=47) + end_location: SourceLocation(pos=1020, lineno=24, colno=54) key: - location: SourceLocation(pos=1003, lineno=23, colno=47) - end_location: SourceLocation(pos=1005, lineno=23, colno=49) + location: SourceLocation(pos=1013, lineno=24, colno=47) + end_location: SourceLocation(pos=1015, lineno=24, colno=49) value: 'id' value: - location: SourceLocation(pos=1006, lineno=23, colno=50) - end_location: SourceLocation(pos=1010, lineno=23, colno=54) + location: SourceLocation(pos=1016, lineno=24, colno=50) + end_location: SourceLocation(pos=1020, lineno=24, colno=54) value: String('dirt') - location: SourceLocation(pos=1011, lineno=23, colno=55) - end_location: SourceLocation(pos=1018, lineno=23, colno=62) + location: SourceLocation(pos=1021, lineno=24, colno=55) + end_location: SourceLocation(pos=1028, lineno=24, colno=62) key: - location: SourceLocation(pos=1011, lineno=23, colno=55) - end_location: SourceLocation(pos=1016, lineno=23, colno=60) + location: SourceLocation(pos=1021, lineno=24, colno=55) + end_location: SourceLocation(pos=1026, lineno=24, colno=60) value: 'Count' value: - location: SourceLocation(pos=1017, lineno=23, colno=61) - end_location: SourceLocation(pos=1018, lineno=23, colno=62) + location: SourceLocation(pos=1027, lineno=24, colno=61) + end_location: SourceLocation(pos=1028, lineno=24, colno=62) value: Int(1) - location: SourceLocation(pos=1020, lineno=23, colno=64) - end_location: SourceLocation(pos=1045, lineno=23, colno=89) + location: SourceLocation(pos=1030, lineno=24, colno=64) + end_location: SourceLocation(pos=1055, lineno=24, colno=89) key: - location: SourceLocation(pos=1020, lineno=23, colno=64) - end_location: SourceLocation(pos=1024, lineno=23, colno=68) + location: SourceLocation(pos=1030, lineno=24, colno=64) + end_location: SourceLocation(pos=1034, lineno=24, colno=68) value: 'sell' value: - location: SourceLocation(pos=1025, lineno=23, colno=69) - end_location: SourceLocation(pos=1045, lineno=23, colno=89) + location: SourceLocation(pos=1035, lineno=24, colno=69) + end_location: SourceLocation(pos=1055, lineno=24, colno=89) entries: - location: SourceLocation(pos=1026, lineno=23, colno=70) - end_location: SourceLocation(pos=1036, lineno=23, colno=80) + location: SourceLocation(pos=1036, lineno=24, colno=70) + end_location: SourceLocation(pos=1046, lineno=24, colno=80) key: - location: SourceLocation(pos=1026, lineno=23, colno=70) - end_location: SourceLocation(pos=1028, lineno=23, colno=72) + location: SourceLocation(pos=1036, lineno=24, colno=70) + end_location: SourceLocation(pos=1038, lineno=24, colno=72) value: 'id' value: - location: SourceLocation(pos=1029, lineno=23, colno=73) - end_location: SourceLocation(pos=1036, lineno=23, colno=80) + location: SourceLocation(pos=1039, lineno=24, colno=73) + end_location: SourceLocation(pos=1046, lineno=24, colno=80) value: String('diamond') - location: SourceLocation(pos=1037, lineno=23, colno=81) - end_location: SourceLocation(pos=1044, lineno=23, colno=88) + location: SourceLocation(pos=1047, lineno=24, colno=81) + end_location: SourceLocation(pos=1054, lineno=24, colno=88) key: - location: SourceLocation(pos=1037, lineno=23, colno=81) - end_location: SourceLocation(pos=1042, lineno=23, colno=86) + location: SourceLocation(pos=1047, lineno=24, colno=81) + end_location: SourceLocation(pos=1052, lineno=24, colno=86) value: 'Count' value: - location: SourceLocation(pos=1043, lineno=23, colno=87) - end_location: SourceLocation(pos=1044, lineno=23, colno=88) + location: SourceLocation(pos=1053, lineno=24, colno=87) + end_location: SourceLocation(pos=1054, lineno=24, colno=88) value: Int(1) - location: SourceLocation(pos=1046, lineno=23, colno=90) - end_location: SourceLocation(pos=1061, lineno=23, colno=105) + location: SourceLocation(pos=1056, lineno=24, colno=90) + end_location: SourceLocation(pos=1071, lineno=24, colno=105) key: - location: SourceLocation(pos=1046, lineno=23, colno=90) - end_location: SourceLocation(pos=1055, lineno=23, colno=99) + location: SourceLocation(pos=1056, lineno=24, colno=90) + end_location: SourceLocation(pos=1065, lineno=24, colno=99) value: 'rewardExp' value: - location: SourceLocation(pos=1056, lineno=23, colno=100) - end_location: SourceLocation(pos=1061, lineno=23, colno=105) + location: SourceLocation(pos=1066, lineno=24, colno=100) + end_location: SourceLocation(pos=1071, lineno=24, colno=105) value: Byte(0) - location: SourceLocation(pos=1066, lineno=24, colno=1) - end_location: SourceLocation(pos=1079, lineno=24, colno=14) + location: SourceLocation(pos=1076, lineno=25, colno=1) + end_location: SourceLocation(pos=1089, lineno=25, colno=14) identifier: 'time:set:time' arguments: - location: SourceLocation(pos=1075, lineno=24, colno=10) - end_location: SourceLocation(pos=1079, lineno=24, colno=14) + location: SourceLocation(pos=1085, lineno=25, colno=10) + end_location: SourceLocation(pos=1089, lineno=25, colno=14) value: 1000.0 suffix: None - location: SourceLocation(pos=1080, lineno=25, colno=1) - end_location: SourceLocation(pos=1080, lineno=25, colno=1) + location: SourceLocation(pos=1090, lineno=26, colno=1) + end_location: SourceLocation(pos=1090, lineno=26, colno=1) identifier: 'time:set:day' arguments: - location: SourceLocation(pos=1093, lineno=26, colno=1) - end_location: SourceLocation(pos=1107, lineno=26, colno=15) + location: SourceLocation(pos=1103, lineno=27, colno=1) + end_location: SourceLocation(pos=1117, lineno=27, colno=15) identifier: 'time:add:time' arguments: - location: SourceLocation(pos=1102, lineno=26, colno=10) - end_location: SourceLocation(pos=1107, lineno=26, colno=15) + location: SourceLocation(pos=1112, lineno=27, colno=10) + end_location: SourceLocation(pos=1117, lineno=27, colno=15) value: 24000.0 suffix: None - location: SourceLocation(pos=1108, lineno=27, colno=1) - end_location: SourceLocation(pos=1126, lineno=27, colno=19) + location: SourceLocation(pos=1118, lineno=28, colno=1) + end_location: SourceLocation(pos=1136, lineno=28, colno=19) identifier: 'weather:clear:duration' arguments: - location: SourceLocation(pos=1122, lineno=27, colno=15) - end_location: SourceLocation(pos=1126, lineno=27, colno=19) + location: SourceLocation(pos=1132, lineno=28, colno=15) + end_location: SourceLocation(pos=1136, lineno=28, colno=19) value: 1200 - location: SourceLocation(pos=1127, lineno=28, colno=1) - end_location: SourceLocation(pos=1127, lineno=28, colno=1) + location: SourceLocation(pos=1137, lineno=29, colno=1) + end_location: SourceLocation(pos=1137, lineno=29, colno=1) identifier: 'weather:rain' arguments: \ No newline at end of file From d5f6e7bac8b2e6d7fd39d4a87d00a6e3e5305af2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Aug 2021 18:37:07 +0200 Subject: [PATCH 0274/1554] chore: get nbt_path argument examples --- .../mecha/resources/argument_examples.json | 11 +------- packages/mecha/scripts.py | 5 ++-- ...ent_examples_minecraft_nbt_tag_108__0.txt} | 8 +++--- ...ment_examples_minecraft_nbt_tag_109__0.txt | 6 ++--- ...ment_examples_minecraft_nbt_tag_110__0.txt | 4 +-- ...ment_examples_minecraft_nbt_tag_111__0.txt | 6 ++--- ...ment_examples_minecraft_nbt_tag_112__0.txt | 6 ++--- ...ment_examples_minecraft_nbt_tag_113__0.txt | 21 ++++++++++++--- ...ment_examples_minecraft_nbt_tag_114__0.txt | 23 ---------------- ...t_examples_minecraft_objective_114__0.txt} | 4 +-- ...nt_examples_minecraft_objective_115__0.txt | 6 ++--- ...nt_examples_minecraft_objective_116__0.txt | 6 ++--- ...es_minecraft_objective_criteria_117__0.txt | 16 +++++++++++ ...es_minecraft_objective_criteria_118__0.txt | 8 +++--- ...es_minecraft_objective_criteria_119__0.txt | 16 ++++++----- ...es_minecraft_objective_criteria_120__0.txt | 20 -------------- ...t_examples_minecraft_operation_120__0.txt} | 4 +-- ...nt_examples_minecraft_operation_121__0.txt | 4 +-- ...nt_examples_minecraft_operation_122__0.txt | 4 +-- ...es_minecraft_resource_location_126__0.txt} | 4 +-- ...les_minecraft_resource_location_127__0.txt | 14 ++++++---- ...les_minecraft_resource_location_128__0.txt | 14 ++++------ ...nt_examples_minecraft_rotation_129__0.txt} | 18 ++++++------- ...ent_examples_minecraft_rotation_130__0.txt | 6 ++--- ...ent_examples_minecraft_rotation_131__0.txt | 14 +++++----- ...examples_minecraft_score_holder_132__0.txt | 10 +++++++ ...examples_minecraft_score_holder_133__0.txt | 6 ++--- ...examples_minecraft_score_holder_134__0.txt | 6 ++--- ...examples_minecraft_score_holder_135__0.txt | 10 ++++--- ...examples_minecraft_score_holder_136__0.txt | 12 --------- ...ples_minecraft_scoreboard_slot_136__0.txt} | 4 +-- ...mples_minecraft_scoreboard_slot_137__0.txt | 4 +-- ...ment_examples_minecraft_swizzle_138__0.txt | 10 +++++++ ...ment_examples_minecraft_swizzle_139__0.txt | 6 ++--- ...gument_examples_minecraft_team_140__0.txt} | 4 +-- ...rgument_examples_minecraft_team_141__0.txt | 4 +-- ...gument_examples_minecraft_time_142__0.txt} | 6 ++--- ...rgument_examples_minecraft_time_143__0.txt | 4 +-- ...rgument_examples_minecraft_time_144__0.txt | 4 +-- ...rgument_examples_minecraft_time_145__0.txt | 6 ++--- ...gument_examples_minecraft_uuid_146__0.txt} | 0 ...rgument_examples_minecraft_vec2_147__0.txt | 21 +++++++++++++++ ...rgument_examples_minecraft_vec2_148__0.txt | 6 ++--- ...rgument_examples_minecraft_vec2_149__0.txt | 18 ++++++------- ...rgument_examples_minecraft_vec2_150__0.txt | 18 ++++++------- ...rgument_examples_minecraft_vec2_151__0.txt | 21 --------------- ...rgument_examples_minecraft_vec3_151__0.txt | 27 +++++++++++++++++++ ...rgument_examples_minecraft_vec3_152__0.txt | 8 +++--- ...rgument_examples_minecraft_vec3_153__0.txt | 8 +++--- ...rgument_examples_minecraft_vec3_154__0.txt | 18 ++++++------- ...rgument_examples_minecraft_vec3_155__0.txt | 26 +++++++++--------- ...rgument_examples_minecraft_vec3_156__0.txt | 22 +++++++-------- ...rgument_examples_minecraft_vec3_157__0.txt | 27 ------------------- 53 files changed, 278 insertions(+), 286 deletions(-) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_swizzle_140__0.txt => parse__argument_examples_minecraft_nbt_tag_108__0.txt} (65%) delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_117__0.txt => parse__argument_examples_minecraft_objective_114__0.txt} (90%) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_operation_123__0.txt => parse__argument_examples_minecraft_operation_120__0.txt} (92%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_resource_location_129__0.txt => parse__argument_examples_minecraft_resource_location_126__0.txt} (94%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_rotation_132__0.txt => parse__argument_examples_minecraft_rotation_129__0.txt} (54%) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_scoreboard_slot_138__0.txt => parse__argument_examples_minecraft_scoreboard_slot_136__0.txt} (87%) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_team_142__0.txt => parse__argument_examples_minecraft_team_140__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_time_146__0.txt => parse__argument_examples_minecraft_time_142__0.txt} (62%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_uuid_147__0.txt => parse__argument_examples_minecraft_uuid_146__0.txt} (100%) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index fa3c96b29..29a05b8b5 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -172,16 +172,7 @@ ], "minecraft:nbt_path": [ { - "examples": ["foo", "bar", "A [crazy name]"] - }, - { - "examples": ["bar", "A [crazy name]"] - }, - { - "examples": ["A [crazy name]"] - }, - { - "examples": ["A [crazy name]"] + "examples": ["foo", "foo.bar", "foo[0]", "[0]", "[]", "{foo:bar}"] } ], "minecraft:nbt_tag": [ diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py index 7652d5f8c..a0fc75c6d 100644 --- a/packages/mecha/scripts.py +++ b/packages/mecha/scripts.py @@ -5,6 +5,7 @@ from beet import Function from beet.core.utils import dump_json from bs4 import BeautifulSoup, Tag +from mcwiki.utils import normalize_string class JavaExampleExtractor(mcwiki.TextExtractor): @@ -85,8 +86,8 @@ def download_argument_examples(): argument_examples = { argument_type: [ {"examples": examples} - for ul in documentation.html.select_one(".collapsible-content").select("ul") # type: ignore - if (examples := [example.string for example in ul.select("li > code")]) # type: ignore + for ul in documentation.html.select(".collapsible-content > ul") # type: ignore + if not (ul.parent and (p := ul.parent.find_previous_sibling("p")) and not p.get_text().startswith("Official examples")) and (examples := [normalize_string(example.string) for example in ul.select("li > code")]) # type: ignore ] for argument_type, documentation in section.items() } diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_108__0.txt similarity index 65% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_108__0.txt index 7addae79d..cad85f4d0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_140__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_108__0.txt @@ -1,10 +1,10 @@ -minecraft:swizzle +minecraft:nbt_tag --- {} --- -x +0 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'x' \ No newline at end of file + value: Int(0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt index cad85f4d0..65439dc3a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt @@ -2,9 +2,9 @@ minecraft:nbt_tag --- {} --- -0 +0b --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: Int(0) \ No newline at end of file + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: Byte(0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt index 65439dc3a..3a4ce815e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt @@ -2,9 +2,9 @@ minecraft:nbt_tag --- {} --- -0b +0l --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: Byte(0) \ No newline at end of file + value: Long(0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt index 3a4ce815e..772589570 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt @@ -2,9 +2,9 @@ minecraft:nbt_tag --- {} --- -0l +0.0 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: Long(0) \ No newline at end of file + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: Double(0.0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt index 772589570..5bad61fc1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt @@ -2,9 +2,9 @@ minecraft:nbt_tag --- {} --- -0.0 +"foo" --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: Double(0.0) \ No newline at end of file + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: String('foo') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt index 5bad61fc1..58b3f3cae 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt @@ -2,9 +2,22 @@ minecraft:nbt_tag --- {} --- -"foo" +{foo:bar} --- - + location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: String('foo') \ No newline at end of file + end_location: SourceLocation(pos=9, lineno=1, colno=10) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: String('bar') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt deleted file mode 100644 index 58b3f3cae..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_114__0.txt +++ /dev/null @@ -1,23 +0,0 @@ -minecraft:nbt_tag ---- -{} ---- -{foo:bar} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - entries: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - key: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'foo' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: String('bar') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_114__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_114__0.txt index 4a5a21e48..2366758d6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_117__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_114__0.txt @@ -2,9 +2,9 @@ minecraft:objective --- {} --- -012 +foo --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: '012' \ No newline at end of file + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt index 2366758d6..052f6760d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt @@ -2,9 +2,9 @@ minecraft:objective --- {} --- -foo +* --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt index 052f6760d..4a5a21e48 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt @@ -2,9 +2,9 @@ minecraft:objective --- {} --- -* +012 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: '*' \ No newline at end of file + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: '012' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt new file mode 100644 index 000000000..03e65bd42 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt @@ -0,0 +1,16 @@ +minecraft:objective_criteria +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt index 03e65bd42..5db54766e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt @@ -2,15 +2,15 @@ minecraft:objective_criteria --- {} --- -foo +foo.bar.baz --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=11, lineno=1, colno=12) is_tag: False namespace: None path: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'foo.bar.baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt index 5db54766e..ff9baf8a2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt @@ -2,15 +2,19 @@ minecraft:objective_criteria --- {} --- -foo.bar.baz +minecraft:foo --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=13, lineno=1, colno=14) is_tag: False - namespace: None - path: + namespace: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 'foo.bar.baz' \ No newline at end of file + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt deleted file mode 100644 index ff9baf8a2..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_120__0.txt +++ /dev/null @@ -1,20 +0,0 @@ -minecraft:objective_criteria ---- -{} ---- -minecraft:foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_120__0.txt similarity index 92% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_120__0.txt index 94c8fedaa..309cebe6d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_123__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_120__0.txt @@ -2,9 +2,9 @@ minecraft:operation --- {} --- -< += --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: '<' \ No newline at end of file + value: '=' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt index 309cebe6d..798974534 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt @@ -2,9 +2,9 @@ minecraft:operation --- {} --- -= +> --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: '=' \ No newline at end of file + value: '>' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt index 798974534..94c8fedaa 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt @@ -2,9 +2,9 @@ minecraft:operation --- {} --- -> +< --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: '>' \ No newline at end of file + value: '<' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_126__0.txt similarity index 94% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_126__0.txt index 2eb357f56..2c7ca4c10 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_129__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_126__0.txt @@ -2,7 +2,7 @@ minecraft:resource_location --- {} --- -012 +foo --- location: SourceLocation(pos=0, lineno=1, colno=1) @@ -13,4 +13,4 @@ minecraft:resource_location location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: '012' \ No newline at end of file + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt index 2c7ca4c10..a13068ace 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt @@ -2,15 +2,19 @@ minecraft:resource_location --- {} --- -foo +foo:bar --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) is_tag: False - namespace: None - path: + namespace: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + value: 'foo' + path: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt index a13068ace..2eb357f56 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt @@ -2,19 +2,15 @@ minecraft:resource_location --- {} --- -foo:bar +012 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False - namespace: + namespace: None + path: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - path: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'bar' \ No newline at end of file + value: '012' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt similarity index 54% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt index a11c1ac43..3a2982247 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_132__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt @@ -2,20 +2,20 @@ minecraft:rotation --- {} --- -~-5 ~5 +0 0 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=3, lineno=1, colno=4) x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: -5.0 - prefix: 'relative' + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' y: - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 5.0 - prefix: 'relative' \ No newline at end of file + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt index 3a2982247..66110a799 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt @@ -2,7 +2,7 @@ minecraft:rotation --- {} --- -0 0 +~ ~ --- location: SourceLocation(pos=0, lineno=1, colno=1) @@ -12,10 +12,10 @@ minecraft:rotation location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0.0 - prefix: 'absolute' + prefix: 'relative' y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 0.0 - prefix: 'absolute' \ No newline at end of file + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt index 66110a799..a11c1ac43 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt @@ -2,20 +2,20 @@ minecraft:rotation --- {} --- -~ ~ +~-5 ~5 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: -5.0 prefix: 'relative' y: - location: SourceLocation(pos=2, lineno=1, colno=3) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 5.0 prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt new file mode 100644 index 000000000..2254ac43a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder +--- +{} +--- +Player +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt index 2254ac43a..912601f91 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt @@ -2,9 +2,9 @@ minecraft:score_holder --- {} --- -Player +0123 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'Player' \ No newline at end of file + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt index 912601f91..938c17d5b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt @@ -2,9 +2,9 @@ minecraft:score_holder --- {} --- -0123 +* --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: '0123' \ No newline at end of file + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt index 938c17d5b..eb2640952 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt @@ -2,9 +2,11 @@ minecraft:score_holder --- {} --- -* +@e --- - + location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: '*' \ No newline at end of file + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 'e' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt deleted file mode 100644 index eb2640952..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_136__0.txt +++ /dev/null @@ -1,12 +0,0 @@ -minecraft:score_holder ---- -{} ---- -@e ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - variable: 'e' - arguments: - \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_136__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_136__0.txt index 2a35d5f8a..b30ac9be5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_138__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_136__0.txt @@ -2,9 +2,9 @@ minecraft:scoreboard_slot --- {} --- -foo.bar +sidebar --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'foo.bar' \ No newline at end of file + value: 'sidebar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt index b30ac9be5..2a35d5f8a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt @@ -2,9 +2,9 @@ minecraft:scoreboard_slot --- {} --- -sidebar +foo.bar --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'sidebar' \ No newline at end of file + value: 'foo.bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt new file mode 100644 index 000000000..41f8b1555 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle +--- +{} +--- +xyz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'xyz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt index 41f8b1555..7addae79d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt @@ -2,9 +2,9 @@ minecraft:swizzle --- {} --- -xyz +x --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'xyz' \ No newline at end of file + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'x' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_140__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_140__0.txt index 55deaedfa..560697b32 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_142__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_140__0.txt @@ -2,9 +2,9 @@ minecraft:team --- {} --- -123 +foo --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: '123' \ No newline at end of file + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt index 560697b32..55deaedfa 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt @@ -2,9 +2,9 @@ minecraft:team --- {} --- -foo +123 --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + value: '123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_142__0.txt similarity index 62% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_142__0.txt index 675b34a7d..af8786b05 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_146__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_142__0.txt @@ -2,10 +2,10 @@ minecraft:time --- {} --- -0 +0d --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) value: 0.0 - suffix: None \ No newline at end of file + suffix: 'd' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt index af8786b05..edd602a8e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt @@ -2,10 +2,10 @@ minecraft:time --- {} --- -0d +0s --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: 0.0 - suffix: 'd' \ No newline at end of file + suffix: 's' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt index edd602a8e..0dc75219f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt @@ -2,10 +2,10 @@ minecraft:time --- {} --- -0s +0t --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: 0.0 - suffix: 's' \ No newline at end of file + suffix: 't' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt index 0dc75219f..675b34a7d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt @@ -2,10 +2,10 @@ minecraft:time --- {} --- -0t +0 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0.0 - suffix: 't' \ No newline at end of file + suffix: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_146__0.txt similarity index 100% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_147__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_146__0.txt diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt new file mode 100644 index 000000000..5b27bcf18 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt @@ -0,0 +1,21 @@ +minecraft:vec2 +--- +{} +--- +0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt index 5b27bcf18..4400a327b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt @@ -2,7 +2,7 @@ minecraft:vec2 --- {} --- -0 0 +~ ~ --- location: SourceLocation(pos=0, lineno=1, colno=1) @@ -12,10 +12,10 @@ minecraft:vec2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0.0 - prefix: 'absolute' + prefix: 'relative' y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 0.0 - prefix: 'absolute' \ No newline at end of file + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt index 4400a327b..44990ef0e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt @@ -2,20 +2,20 @@ minecraft:vec2 --- {} --- -~ ~ +0.1 -0.5 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=8, lineno=1, colno=9) x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'relative' + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.1 + prefix: 'absolute' y: - location: SourceLocation(pos=2, lineno=1, colno=3) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'relative' \ No newline at end of file + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -0.5 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt index 44990ef0e..b82b8a4c9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt @@ -2,20 +2,20 @@ minecraft:vec2 --- {} --- -0.1 -0.5 +~1 ~-2 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=6, lineno=1, colno=7) x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.1 - prefix: 'absolute' + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 1.0 + prefix: 'relative' y: - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: -0.5 - prefix: 'absolute' \ No newline at end of file + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: -2.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt deleted file mode 100644 index b82b8a4c9..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_151__0.txt +++ /dev/null @@ -1,21 +0,0 @@ -minecraft:vec2 ---- -{} ---- -~1 ~-2 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - x: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 1.0 - prefix: 'relative' - y: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: -2.0 - prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt new file mode 100644 index 000000000..6903407cb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt @@ -0,0 +1,27 @@ +minecraft:vec3 +--- +{} +--- +0 0 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + x: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.0 + prefix: 'absolute' + z: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0.0 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt index 6903407cb..d22139cd5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt @@ -2,7 +2,7 @@ minecraft:vec3 --- {} --- -0 0 0 +~ ~ ~ --- location: SourceLocation(pos=0, lineno=1, colno=1) @@ -12,16 +12,16 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0.0 - prefix: 'absolute' + prefix: 'relative' y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 0.0 - prefix: 'absolute' + prefix: 'relative' z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 0.0 - prefix: 'absolute' \ No newline at end of file + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt index d22139cd5..ed9c3e267 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt @@ -2,7 +2,7 @@ minecraft:vec3 --- {} --- -~ ~ ~ +^ ^ ^ --- location: SourceLocation(pos=0, lineno=1, colno=1) @@ -12,16 +12,16 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0.0 - prefix: 'relative' + prefix: 'local' y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 0.0 - prefix: 'relative' + prefix: 'local' z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 0.0 - prefix: 'relative' \ No newline at end of file + prefix: 'local' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt index ed9c3e267..0099f1e2b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt @@ -2,26 +2,26 @@ minecraft:vec3 --- {} --- -^ ^ ^ +^1 ^ ^-5 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 1.0 prefix: 'local' y: - location: SourceLocation(pos=2, lineno=1, colno=3) - end_location: SourceLocation(pos=3, lineno=1, colno=4) + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 0.0 prefix: 'local' z: - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -5.0 prefix: 'local' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt index 0099f1e2b..605281efd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt @@ -2,26 +2,26 @@ minecraft:vec3 --- {} --- -^1 ^ ^-5 +0.1 -0.5 .9 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 1.0 - prefix: 'local' + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 0.1 + prefix: 'absolute' y: - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 0.0 - prefix: 'local' + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: -0.5 + prefix: 'absolute' z: - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: -5.0 - prefix: 'local' \ No newline at end of file + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 0.9 + prefix: 'absolute' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt index 605281efd..213f513a7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt @@ -2,7 +2,7 @@ minecraft:vec3 --- {} --- -0.1 -0.5 .9 +~0.5 ~1 ~-5 --- location: SourceLocation(pos=0, lineno=1, colno=1) @@ -10,18 +10,18 @@ minecraft:vec3 x: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.1 - prefix: 'absolute' + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 0.5 + prefix: 'relative' y: - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: -0.5 - prefix: 'absolute' + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1.0 + prefix: 'relative' z: - location: SourceLocation(pos=9, lineno=1, colno=10) + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 0.9 - prefix: 'absolute' \ No newline at end of file + value: -5.0 + prefix: 'relative' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt deleted file mode 100644 index 213f513a7..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_157__0.txt +++ /dev/null @@ -1,27 +0,0 @@ -minecraft:vec3 ---- -{} ---- -~0.5 ~1 ~-5 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - x: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 0.5 - prefix: 'relative' - y: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1.0 - prefix: 'relative' - z: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: -5.0 - prefix: 'relative' \ No newline at end of file From ff8e0a0e0c3772b32434fe0a8029845414d22153 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Aug 2021 19:42:47 +0200 Subject: [PATCH 0275/1554] feat: add nbt path parser --- packages/mecha/mecha/ast.py | 16 ++++ packages/mecha/mecha/parse.py | 93 ++++++++++++++++++- ...ent_examples_minecraft_nbt_path_102__0.txt | 14 +++ ...ent_examples_minecraft_nbt_path_103__0.txt | 18 ++++ ...ent_examples_minecraft_nbt_path_104__0.txt | 22 +++++ ...ent_examples_minecraft_nbt_path_105__0.txt | 18 ++++ ...ent_examples_minecraft_nbt_path_106__0.txt | 14 +++ ...ent_examples_minecraft_nbt_path_107__0.txt | 27 ++++++ 8 files changed, 218 insertions(+), 4 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index ee1be58a4..91690942e 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -28,6 +28,8 @@ "AstSelectorArgument", "AstSelector", "AstMessage", + "AstNbtPathSubscript", + "AstNbtPath", ] @@ -339,3 +341,17 @@ class AstMessage(AstNode): """Ast message node.""" sentence: AstChildren[Union[AstValue[str], AstSelector]] + + +@dataclass(frozen=True) +class AstNbtPathSubscript(AstNode): + """Ast nbt path subscript node.""" + + match: Union[None, AstValue[int], AstNbtCompound] + + +@dataclass(frozen=True) +class AstNbtPath(AstNode): + """Ast nbt path node.""" + + nodes: AstChildren[Union[AstValue[str], AstNbtCompound, AstNbtPathSubscript]] diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 0482030bd..84458676f 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -34,6 +34,7 @@ "parse_entity", "parse_score_holder", "parse_message", + "NbtPathParser", "INTEGER_PATTERN", "FLOAT_PATTERN", "CHAT_COLORS", @@ -48,6 +49,7 @@ Any, Dict, Generic, + Iterator, List, Optional, Tuple, @@ -78,6 +80,8 @@ AstNbtCompound, AstNbtCompoundEntry, AstNbtList, + AstNbtPath, + AstNbtPathSubscript, AstNbtValue, AstNode, AstRange, @@ -241,7 +245,7 @@ def get_default_parsers() -> Dict[str, Parser]: "minecraft:message": parse_message, "minecraft:mob_effect": StringParser(type="word"), "minecraft:nbt_compound_tag": parse_compound_tag, - # TODO: "minecraft:nbt_path" + "minecraft:nbt_path": NbtPathParser(), "minecraft:nbt_tag": delegate("nbt"), "minecraft:objective": parse_objective, "minecraft:objective_criteria": ResourceLocationParser(allow_tag=False), @@ -879,8 +883,8 @@ def parse_compound_tag(stream: TokenStream) -> AstNbtCompound: def parse_adjacent_nbt(stream: TokenStream) -> Optional[AstNbtCompound]: """Parse adjacent nbt.""" - with stream.syntax(curly=r"\{"), stream.intercept("whitespace"): - found_curly = hint.match("curly") if (hint := stream.peek()) else False + with stream.syntax(curly=r"\{|\}"), stream.intercept("whitespace"): + found_curly = hint.match(("curly", "{")) if (hint := stream.peek()) else False return parse_compound_tag(stream) if found_curly else None @@ -1195,7 +1199,7 @@ def __call__(self, stream: TokenStream) -> AstSelector: with stream.syntax( selector=r"@[praes]\[?", - bracket=r"\]", + bracket=r"\[|\]", argument=r"[a-z_]+", equal=r"=", comma=r",", @@ -1403,3 +1407,84 @@ def parse_message(stream: TokenStream) -> AstMessage: location=sentence[0].location, end_location=sentence[-1].end_location, ) + + +@dataclass +class NbtPathParser: + quoted_string_handler: QuotedStringHandler = field( + default_factory=lambda: QuotedStringHandler( + escape_sequences={ + r"\\": "\\", + } + ) + ) + + def __call__(self, stream: TokenStream) -> AstNbtPath: + nodes: List[Any] = [] + + with stream.syntax( + dot=r"\.", + curly=r"\{|\}", + bracket=r"\[|\]", + quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", + string=r"[a-zA-Z0-9_+-]+", + ): + nodes.extend(self.parse_modifiers(stream)) + + while not nodes or stream.get("dot"): + quoted_string, string = stream.expect("quoted_string", "string") + + if quoted_string: + nodes.append( + AstValue[str]( + value=self.quoted_string_handler.unquote_string( + quoted_string + ), + location=quoted_string.location, + end_location=quoted_string.end_location, + ) + ) + elif string: + nodes.append( + AstValue[str]( + value=string.value, + location=string.location, + end_location=string.end_location, + ) + ) + + nodes.extend(self.parse_modifiers(stream)) + + if not nodes: + raise stream.emit_error(InvalidSyntax("Empty nbt path not allowed.")) + + return AstNbtPath( + nodes=AstChildren(nodes), + location=nodes[0].location, + end_location=nodes[-1].end_location, + ) + + def parse_modifiers(self, stream: TokenStream) -> Iterator[Any]: + """Parse named tag modifiers.""" + hint = stream.peek() + + if hint and hint.match(("curly", "{")): + yield delegate("minecraft:nbt_compound_tag", stream) + return + + while bracket := stream.get(("bracket", "[")): + match = None + + hint = stream.peek() + if hint and hint.match(("curly", "{")): + match = delegate("minecraft:nbt_compound_tag", stream) + elif hint and not hint.match(("bracket", "]")): + match = delegate("brigadier:integer", stream) + + close_bracket = stream.expect(("bracket", "]")) + + yield AstNbtPathSubscript( + match=match, + location=bracket.location, + end_location=close_bracket.end_location, + ) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt new file mode 100644 index 000000000..158922da9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt @@ -0,0 +1,14 @@ +minecraft:nbt_path +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + nodes: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt new file mode 100644 index 000000000..7233ddd55 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt @@ -0,0 +1,18 @@ +minecraft:nbt_path +--- +{} +--- +foo.bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + nodes: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt new file mode 100644 index 000000000..318d8edb2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt @@ -0,0 +1,22 @@ +minecraft:nbt_path +--- +{} +--- +foo[0] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + nodes: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + match: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt new file mode 100644 index 000000000..a6cecea8f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt @@ -0,0 +1,18 @@ +minecraft:nbt_path +--- +{} +--- +[0] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + nodes: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + match: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt new file mode 100644 index 000000000..9ae04947f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt @@ -0,0 +1,14 @@ +minecraft:nbt_path +--- +{} +--- +[] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + nodes: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + match: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt new file mode 100644 index 000000000..69e6298d2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt @@ -0,0 +1,27 @@ +minecraft:nbt_path +--- +{} +--- +{foo:bar} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + nodes: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: String('bar') \ No newline at end of file From f8c70729415c58bbcd4d40db0178218b93b27c13 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Sep 2021 17:03:36 +0200 Subject: [PATCH 0276/1554] fix: update dependencies and make pyright happy with new click typings --- packages/lectern/lectern/cli.py | 11 ++- packages/lectern/package-lock.json | 14 +-- packages/lectern/package.json | 2 +- packages/lectern/poetry.lock | 139 +++++++++++++++++++---------- packages/lectern/pyproject.toml | 12 +-- 5 files changed, 115 insertions(+), 63 deletions(-) diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py index d0b9f6a87..9a8ea52b6 100644 --- a/packages/lectern/lectern/cli.py +++ b/packages/lectern/lectern/cli.py @@ -15,6 +15,11 @@ from .prefetch import MarkdownPrefetcher +def echo(*args: Any, **kwargs: Any): + """Wrap click.echo.""" + click.echo(*args, **kwargs) # type: ignore + + @click.command(context_settings={"help_option_names": ("-h", "--help")}) @click.pass_context @click.argument("path", nargs=-1) @@ -62,8 +67,8 @@ def lectern( if prefetch_urls: if len(path) > 1: - click.echo(ctx.get_usage()) - click.echo("\nError: expected a single output path") + echo(ctx.get_usage()) + echo("\nError: expected a single output path") ctx.exit(1) prefetcher = MarkdownPrefetcher() @@ -85,7 +90,7 @@ def lectern( try: *packs, dest = path except ValueError: - click.echo(ctx.get_help()) + echo(ctx.get_help()) ctx.exit(1) config = { "data_pack": {"load": packs}, diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index e01e84b67..7ea34ee2a 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.153" + "pyright": "^1.1.165" } }, "node_modules/pyright": { - "version": "1.1.153", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", - "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", + "version": "1.1.165", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", + "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.153", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.153.tgz", - "integrity": "sha512-t5Y9IojL2Sifm1Q04BEBJDLP86rF4RpXma28HEP/EXJRHyyNxu8css77HC+tZqJXXXZVtAjaJxJSAEwq5afGjg==", + "version": "1.1.165", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", + "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index e70f9a689..ba28f9bb8 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.153" + "pyright": "^1.1.165" } } diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 56c466396..1bc7eeee3 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -1,11 +1,3 @@ -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -41,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.34.1" +version = "0.39.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -49,13 +41,13 @@ python-versions = ">=3.8,<4.0" [package.dependencies] base58 = ">=2.1.0,<3.0.0" -click = ">=7.1.2,<8.0.0" -click-help-colors = ">=0.9,<0.10" +click = ">=8.0.1,<9.0.0" +click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.0,<2.0.0" -pathspec = ">=0.8.1,<0.9.0" +pathspec = ">=0.9.0,<0.10.0" pydantic = ">=1.8.1,<2.0.0" PyYAML = ">=5.4.1,<6.0.0" toml = ">=0.10.2,<0.11.0" @@ -65,23 +57,28 @@ image = ["pillow"] [[package]] name = "black" -version = "21.6b0" +version = "21.8b0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -appdirs = "*" click = ">=7.1.2" mypy-extensions = ">=0.4.3" -pathspec = ">=0.8.1,<1" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" regex = ">=2020.1.8" -toml = ">=0.10.1" +tomli = ">=0.2.6,<2.0.0" +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] python2 = ["typed-ast (>=1.4.2)"] uvloop = ["uvloop (>=0.15.2)"] @@ -127,15 +124,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "click" -version = "7.1.2" +version = "8.0.1" description = "Composable command line interface toolkit" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "click-help-colors" -version = "0.9" +version = "0.9.1" description = "Colorization of help messages in Click" category = "main" optional = false @@ -276,7 +276,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.9.1" +version = "5.9.3" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -398,11 +398,11 @@ pyparsing = ">=2.0.2" [[package]] name = "pathspec" -version = "0.8.1" +version = "0.9.0" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pkginfo" @@ -415,6 +415,18 @@ python-versions = "*" [package.extras] testing = ["nose", "coverage"] +[[package]] +name = "platformdirs" +version = "2.3.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + [[package]] name = "pluggy" version = "0.13.1" @@ -475,7 +487,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.4" +version = "6.2.5" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -487,7 +499,7 @@ attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" @@ -524,7 +536,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.16.2" +version = "7.19.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -695,6 +707,14 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "tomli" +version = "1.2.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "tomlkit" version = "0.7.0" @@ -743,6 +763,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "urllib3" version = "1.26.4" @@ -787,13 +815,9 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "4ef8882051f01e32b13b1183b6ff0ce52d3122e593482d50949d5d225828dae9" +content-hash = "0795ed7384f3e84bb2356ab82f5d9e877745be952ad71f34d735ff6246b9db16" [metadata.files] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -807,12 +831,12 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.34.1-py3-none-any.whl", hash = "sha256:512018454490d6ed2495d63f6f26a205c05e0d404eaea2438f407194311a5c48"}, - {file = "beet-0.34.1.tar.gz", hash = "sha256:a4bc78ee5c9f154a0233f80147d420cf6921517f2b9ddb3d3a273b1c21ff3cf4"}, + {file = "beet-0.39.0-py3-none-any.whl", hash = "sha256:1eb96ca85f444dd136941b003ff3cb793843dd75e928428d401310c938392671"}, + {file = "beet-0.39.0.tar.gz", hash = "sha256:b1ebdc7262c5b0669474275a009eef90e991ce12db6621c72fab6e65981718ce"}, ] black = [ - {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, - {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, + {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, + {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -839,24 +863,36 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -866,12 +902,12 @@ chardet = [ {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, ] click-help-colors = [ - {file = "click-help-colors-0.9.tar.gz", hash = "sha256:eb037a2dd95a9e20b3897c2b3ca57e7f6797f76a8d93f7eeedda7fcdcbc9b635"}, - {file = "click_help_colors-0.9-py3-none-any.whl", hash = "sha256:f6c3d1fe86b07790e6ef0339f458196a8814de90946d876774ea4b4f30a5a539"}, + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, ] click-log = [ {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, @@ -931,8 +967,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, - {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, + {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, + {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, @@ -1025,13 +1061,17 @@ packaging = [ {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, ] +platformdirs = [ + {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, + {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, +] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, @@ -1077,8 +1117,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] pytest-insta = [ {file = "pytest-insta-0.1.10.tar.gz", hash = "sha256:27670ed8aa63cf34726106586dadadb12137102e22372ec918e64ee524d56f1f"}, @@ -1089,8 +1129,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.16.2.tar.gz", hash = "sha256:b0679f5ca5ef860bcf07836949e0956bffa965197315b01c6e089467c144c674"}, - {file = "python_semantic_release-7.16.2-py3-none-any.whl", hash = "sha256:c54aca1d2d5121608f5152975b6cbc4f3cfd1e5d9d64293ad44aa4b62acc670d"}, + {file = "python-semantic-release-7.19.1.tar.gz", hash = "sha256:43f52f9a97677c029009063807f1fec9ffaabf049bd02f3fd898f0edf1ce5155"}, + {file = "python_semantic_release-7.19.1-py3-none-any.whl", hash = "sha256:8f5bfe18e78d44dc296966376f2bae2177ea881b628473d685b46f09a75ea92b"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1213,6 +1253,10 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +tomli = [ + {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, + {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, +] tomlkit = [ {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, @@ -1229,6 +1273,9 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index f4ffb89a7..63b6b99a8 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,16 +25,16 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.34.1" +beet = ">=0.36.0" markdown-it-py = "^1.1.0" -click = "^7.1.2" +click = "^8.0.1" [tool.poetry.dev-dependencies] -black = {version = "^21.6b0", allow-prereleases = true} +black = "^21.8b0" rope = "^0.19.0" -pytest = "^6.2.4" -isort = {version = "^5.9.1", allow-prereleases = true} -python-semantic-release = "^7.16.2" +pytest = "^6.2.5" +isort = "^5.9.3" +python-semantic-release = "^7.19.1" pytest-insta = "^0.1.10" [tool.poetry.scripts] From 74a92976dfb1c0368fee3a90ee560f9f928bc0f0 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 2 Sep 2021 00:42:08 +0200 Subject: [PATCH 0277/1554] chore: update beet --- packages/lectern/poetry.lock | 77 ++++++++++++++------------------- packages/lectern/pyproject.toml | 2 +- 2 files changed, 34 insertions(+), 45 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 1bc7eeee3..a8f9231d9 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.39.0" +version = "0.40.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -46,9 +46,9 @@ click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=3.0.1,<4.0.0" -nbtlib = ">=1.12.0,<2.0.0" +nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" -pydantic = ">=1.8.1,<2.0.0" +pydantic = ">=1.8.2,<2.0.0" PyYAML = ">=5.4.1,<6.0.0" toml = ">=0.10.2,<0.11.0" @@ -368,14 +368,14 @@ python-versions = "*" [[package]] name = "nbtlib" -version = "1.12.0" +version = "1.12.1" description = "A python package to read and edit nbt data" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -numpy = ">1.16,<1.20.2" +numpy = "*" [[package]] name = "numpy" @@ -456,7 +456,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.8.1" +version = "1.8.2" description = "Data validation and settings management using python 3.6 type hinting" category = "main" optional = false @@ -755,14 +755,6 @@ requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" rfc3986 = ">=1.4.0" tqdm = ">=4.14" -[[package]] -name = "typing-extensions" -version = "3.10.0.0" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "typing-extensions" version = "3.10.0.2" @@ -815,7 +807,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0795ed7384f3e84bb2356ab82f5d9e877745be952ad71f34d735ff6246b9db16" +content-hash = "b24230701ee39a7e0d68d4a93f44764079175056b24cd13a53fa57dab008e6d5" [metadata.files] atomicwrites = [ @@ -831,8 +823,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.39.0-py3-none-any.whl", hash = "sha256:1eb96ca85f444dd136941b003ff3cb793843dd75e928428d401310c938392671"}, - {file = "beet-0.39.0.tar.gz", hash = "sha256:b1ebdc7262c5b0669474275a009eef90e991ce12db6621c72fab6e65981718ce"}, + {file = "beet-0.40.1-py3-none-any.whl", hash = "sha256:faac0ea0b0f5300206856329c656384036a45df585ad1e3ca51c7c7f4801ec26"}, + {file = "beet-0.40.1.tar.gz", hash = "sha256:cfb7e7e57c147109c156b960295d3e05bfa62cbc0b731a0149d9649853a20e43"}, ] black = [ {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, @@ -1027,8 +1019,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] nbtlib = [ - {file = "nbtlib-1.12.0-py3-none-any.whl", hash = "sha256:30a3545cf7e654624cd1bf23ec2590d0a0e3a7bca2a8af4725d7d758453d8686"}, - {file = "nbtlib-1.12.0.tar.gz", hash = "sha256:2554d16bbf51b087442f4d55981ba476ae5d1f046f89dd7904914a7412a80a2e"}, + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, @@ -1085,28 +1077,28 @@ pycparser = [ {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pydantic = [ - {file = "pydantic-1.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0c40162796fc8d0aa744875b60e4dc36834db9f2a25dbf9ba9664b1915a23850"}, - {file = "pydantic-1.8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fff29fe54ec419338c522b908154a2efabeee4f483e48990f87e189661f31ce3"}, - {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:fbfb608febde1afd4743c6822c19060a8dbdd3eb30f98e36061ba4973308059e"}, - {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:eb8ccf12295113ce0de38f80b25f736d62f0a8d87c6b88aca645f168f9c78771"}, - {file = "pydantic-1.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:20d42f1be7c7acc352b3d09b0cf505a9fab9deb93125061b376fbe1f06a5459f"}, - {file = "pydantic-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dde4ca368e82791de97c2ec019681ffb437728090c0ff0c3852708cf923e0c7d"}, - {file = "pydantic-1.8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3bbd023c981cbe26e6e21c8d2ce78485f85c2e77f7bab5ec15b7d2a1f491918f"}, - {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:830ef1a148012b640186bf4d9789a206c56071ff38f2460a32ae67ca21880eb8"}, - {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:fb77f7a7e111db1832ae3f8f44203691e15b1fa7e5a1cb9691d4e2659aee41c4"}, - {file = "pydantic-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3bcb9d7e1f9849a6bdbd027aabb3a06414abd6068cb3b21c49427956cce5038a"}, - {file = "pydantic-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2287ebff0018eec3cc69b1d09d4b7cebf277726fa1bd96b45806283c1d808683"}, - {file = "pydantic-1.8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4bbc47cf7925c86a345d03b07086696ed916c7663cb76aa409edaa54546e53e2"}, - {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6388ef4ef1435364c8cc9a8192238aed030595e873d8462447ccef2e17387125"}, - {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:dd4888b300769ecec194ca8f2699415f5f7760365ddbe243d4fd6581485fa5f0"}, - {file = "pydantic-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:8fbb677e4e89c8ab3d450df7b1d9caed23f254072e8597c33279460eeae59b99"}, - {file = "pydantic-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f2736d9a996b976cfdfe52455ad27462308c9d3d0ae21a2aa8b4cd1a78f47b9"}, - {file = "pydantic-1.8.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3114d74329873af0a0e8004627f5389f3bb27f956b965ddd3e355fe984a1789c"}, - {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:258576f2d997ee4573469633592e8b99aa13bda182fcc28e875f866016c8e07e"}, - {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c17a0b35c854049e67c68b48d55e026c84f35593c66d69b278b8b49e2484346f"}, - {file = "pydantic-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8bc082afef97c5fd3903d05c6f7bb3a6af9fc18631b4cc9fedeb4720efb0c58"}, - {file = "pydantic-1.8.1-py3-none-any.whl", hash = "sha256:e3f8790c47ac42549dc8b045a67b0ca371c7f66e73040d0197ce6172b385e520"}, - {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, + {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, + {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, + {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, + {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, + {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, + {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, + {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, + {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, + {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, + {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pygments = [ {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, @@ -1270,9 +1262,6 @@ twine = [ {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 63b6b99a8..d60fbf009 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.36.0" +beet = ">=0.40.1" markdown-it-py = "^1.1.0" click = "^8.0.1" From 845137dbb158f67de5460773e2331c8e0c605329 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Sep 2021 22:43:21 +0000 Subject: [PATCH 0278/1554] 0.15.3 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 28d1dc76e..8a6481a88 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.15.3 (2021-09-01) +### Fix +* Update dependencies and make pyright happy with new click typings ([`9edd063`](https://github.com/mcbeet/lectern/commit/9edd06327146f065ed348bddebf8aec0d1ea128a)) + ## v0.15.2 (2021-07-01) ### Fix * Declare lectern plugin with configurable decorator ([`dbcd46c`](https://github.com/mcbeet/lectern/commit/dbcd46c6c7fd3acc476268576344a60e6095b652)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 6c62f62ad..d6354d237 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.15.2" +__version__ = "0.15.3" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index d60fbf009..417a8976b 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.15.2" +version = "0.15.3" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From b3e711435fec0d2cd96f934e2db6e71191e1a3e5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 2 Sep 2021 02:14:16 +0200 Subject: [PATCH 0279/1554] chore: update dependencies --- packages/mecha/package-lock.json | 14 +- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 381 ++++++++++++++++--------------- packages/mecha/pyproject.toml | 10 +- 4 files changed, 215 insertions(+), 192 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index f375091aa..01d7d3403 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.157" + "pyright": "^1.1.165" } }, "node_modules/pyright": { - "version": "1.1.157", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.157.tgz", - "integrity": "sha512-slTex47hQKuyoi579Zk7lEhVH+4Dmn+eZ3gP1JGcFBcbcmDwd9ZI1ESww3jY3YoOYdNbYTafxBNuh3RHGkGiMA==", + "version": "1.1.165", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", + "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.157", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.157.tgz", - "integrity": "sha512-slTex47hQKuyoi579Zk7lEhVH+4Dmn+eZ3gP1JGcFBcbcmDwd9ZI1ESww3jY3YoOYdNbYTafxBNuh3RHGkGiMA==", + "version": "1.1.165", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", + "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index a2f2e1641..ba28f9bb8 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.157" + "pyright": "^1.1.165" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 951cc59c2..df1f5fecd 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -1,11 +1,3 @@ -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -56,7 +48,7 @@ lxml = ["lxml"] [[package]] name = "beet" -version = "0.36.0" +version = "0.40.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -64,14 +56,14 @@ python-versions = ">=3.8,<4.0" [package.dependencies] base58 = ">=2.1.0,<3.0.0" -click = ">=7.1.2,<8.0.0" -click-help-colors = ">=0.9,<0.10" +click = ">=8.0.1,<9.0.0" +click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=3.0.1,<4.0.0" -nbtlib = ">=1.12.0,<2.0.0" -pathspec = ">=0.8.1,<0.9.0" -pydantic = ">=1.8.1,<2.0.0" +nbtlib = ">=1.12.1,<2.0.0" +pathspec = ">=0.9.0,<0.10.0" +pydantic = ">=1.8.2,<2.0.0" PyYAML = ">=5.4.1,<6.0.0" toml = ">=0.10.2,<0.11.0" @@ -80,33 +72,38 @@ image = ["pillow"] [[package]] name = "black" -version = "21.7b0" +version = "21.8b0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -appdirs = "*" click = ">=7.1.2" mypy-extensions = ">=0.4.3" -pathspec = ">=0.8.1,<1" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" regex = ">=2020.1.8" tomli = ">=0.2.6,<2.0.0" +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] python2 = ["typed-ast (>=1.4.2)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "3.3.1" +version = "4.1.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] packaging = "*" @@ -134,7 +131,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.3" +version = "2.0.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -145,11 +142,14 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "7.1.2" +version = "8.0.1" description = "Composable command line interface toolkit" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "click-help-colors" @@ -186,7 +186,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.4.7" +version = "3.4.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -243,7 +243,7 @@ smmap = ">=3.0.1,<5" [[package]] name = "gitpython" -version = "3.1.18" +version = "3.1.20" description = "Python Git Library" category = "dev" optional = false @@ -251,6 +251,7 @@ python-versions = ">=3.6" [package.dependencies] gitdb = ">=4.0.1,<5" +typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "idna" @@ -262,7 +263,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.6.1" +version = "4.8.1" description = "Read metadata from Python packages" category = "dev" optional = false @@ -294,7 +295,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.9.2" +version = "5.9.3" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -308,14 +309,14 @@ plugins = ["setuptools"] [[package]] name = "jeepney" -version = "0.7.0" +version = "0.7.1" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false python-versions = ">=3.6" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] trio = ["trio", "async-generator"] [[package]] @@ -334,7 +335,7 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.0.1" +version = "23.1.0" description = "Store and access your passwords safely." category = "dev" optional = false @@ -352,15 +353,15 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "lectern" -version = "0.15.2" +version = "0.15.3" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.34.1" -click = ">=7.1.2,<8.0.0" +beet = ">=0.40.1" +click = ">=8.0.1,<9.0.0" markdown-it-py = ">=1.1.0,<2.0.0" [[package]] @@ -412,18 +413,18 @@ python-versions = "*" [[package]] name = "nbtlib" -version = "1.12.0" +version = "1.12.1" description = "A python package to read and edit nbt data" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -numpy = ">1.16,<1.20.2" +numpy = "*" [[package]] name = "numpy" -version = "1.20.1" +version = "1.21.1" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -442,11 +443,11 @@ pyparsing = ">=2.0.2" [[package]] name = "pathspec" -version = "0.8.1" +version = "0.9.0" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pkginfo" @@ -459,16 +460,29 @@ python-versions = "*" [package.extras] testing = ["nose", "coverage"] +[[package]] +name = "platformdirs" +version = "2.3.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -503,7 +517,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.9.0" +version = "2.10.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -519,7 +533,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.4" +version = "6.2.5" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -531,7 +545,7 @@ attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" @@ -552,14 +566,14 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "2.9.0" +version = "2.10.1" description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.6.0" [package.dependencies] -requests = ">=2.22.0" +requests = ">=2.25.0" requests-toolbelt = ">=0.9.1" [package.extras] @@ -568,7 +582,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.16.2" +version = "7.19.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -627,7 +641,7 @@ md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" -version = "2021.7.6" +version = "2021.8.28" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -695,14 +709,14 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "6.0.1" +version = "6.2.0" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false python-versions = ">=3.6" -[package.extras] -toml = ["toml"] +[package.dependencies] +tomli = ">=1.0" [[package]] name = "six" @@ -746,7 +760,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.1.0" +version = "1.2.1" description = "A lil' TOML parser" category = "dev" optional = false @@ -762,7 +776,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.61.2" +version = "4.62.2" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -797,7 +811,7 @@ tqdm = ">=4.14" [[package]] name = "typing-extensions" -version = "3.10.0.0" +version = "3.10.0.2" description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false @@ -847,13 +861,9 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0c6fc1ead7625348360deb13d43014f84011e34c4a23339546e09eb30727c532" +content-hash = "10c04e08945b9674ab12c05f90982182d554f00b5708b26aa56ef073e99b6916" [metadata.files] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -872,16 +882,16 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"}, ] beet = [ - {file = "beet-0.36.0-py3-none-any.whl", hash = "sha256:4f9d68621af4c558c28755dcefa886125baef439ee827ba62fe42fca6290c96f"}, - {file = "beet-0.36.0.tar.gz", hash = "sha256:3e1e52408e9745ab43a23482db1cd771d57bc262ee5944c33bab9560c6ed62c7"}, + {file = "beet-0.40.1-py3-none-any.whl", hash = "sha256:faac0ea0b0f5300206856329c656384036a45df585ad1e3ca51c7c7f4801ec26"}, + {file = "beet-0.40.1.tar.gz", hash = "sha256:cfb7e7e57c147109c156b960295d3e05bfa62cbc0b731a0149d9649853a20e43"}, ] black = [ - {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, - {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, + {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, + {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, ] bleach = [ - {file = "bleach-3.3.1-py2.py3-none-any.whl", hash = "sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78"}, - {file = "bleach-3.3.1.tar.gz", hash = "sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa"}, + {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, + {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, ] certifi = [ {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, @@ -935,12 +945,12 @@ cffi = [ {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, - {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, + {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"}, + {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"}, ] click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, ] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, @@ -955,18 +965,23 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, + {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"}, + {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"}, + {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"}, + {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"}, + {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"}, + {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"}, + {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"}, + {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"}, ] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, @@ -983,16 +998,16 @@ gitdb = [ {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, ] gitpython = [ - {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"}, - {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"}, + {file = "GitPython-3.1.20-py3-none-any.whl", hash = "sha256:b1e1c269deab1b08ce65403cf14e10d2ef1f6c89e33ea7c5e5bb0222ea593b8a"}, + {file = "GitPython-3.1.20.tar.gz", hash = "sha256:df0e072a200703a65387b0cfdf0466e3bab729c0458cf6b7349d0e9877636519"}, ] idna = [ {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1004,24 +1019,24 @@ invoke = [ {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"}, ] isort = [ - {file = "isort-5.9.2-py3-none-any.whl", hash = "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813"}, - {file = "isort-5.9.2.tar.gz", hash = "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"}, + {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, + {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, ] jeepney = [ - {file = "jeepney-0.7.0-py3-none-any.whl", hash = "sha256:71335e7a4e93817982f473f3507bffc2eff7a544119ab9b73e089c8ba1409ba3"}, - {file = "jeepney-0.7.0.tar.gz", hash = "sha256:1237cd64c8f7ac3aa4b3f332c4d0fb4a8216f39eaa662ec904302d4d77de5a54"}, + {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, + {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] keyring = [ - {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, - {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, + {file = "keyring-23.1.0-py3-none-any.whl", hash = "sha256:b32397fd7e7063f8dd74a26db910c9862fc2109285fa16e3b5208bcb42a3e579"}, + {file = "keyring-23.1.0.tar.gz", hash = "sha256:b7e0156667f5dcc73c1f63a518005cd18a4eb23fe77321194fefcc03748b21a4"}, ] lectern = [ - {file = "lectern-0.15.2-py3-none-any.whl", hash = "sha256:71942bf4d601dbc303be13714e6a83abed1717b4a288fdaaa730506fb8413f12"}, - {file = "lectern-0.15.2.tar.gz", hash = "sha256:93052ab087a35b99d0453bf93f39a27aaa9dd11a81940c721ccd00ff70604ab7"}, + {file = "lectern-0.15.3-py3-none-any.whl", hash = "sha256:b2e2718b5f58eb39a973f62b3b1ce49ccfdb8fd262a8bd7390f255285b16b022"}, + {file = "lectern-0.15.3.tar.gz", hash = "sha256:5933d7038eeba730016ec1ab42ada1e0a27b6ead59c80a0dc22c397893be99ba"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, @@ -1072,50 +1087,58 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] nbtlib = [ - {file = "nbtlib-1.12.0-py3-none-any.whl", hash = "sha256:30a3545cf7e654624cd1bf23ec2590d0a0e3a7bca2a8af4725d7d758453d8686"}, - {file = "nbtlib-1.12.0.tar.gz", hash = "sha256:2554d16bbf51b087442f4d55981ba476ae5d1f046f89dd7904914a7412a80a2e"}, + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, - {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, - {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, - {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, - {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, - {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, - {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, - {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, - {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, - {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, - {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, + {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, + {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, + {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, + {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, + {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, + {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, + {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, + {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, + {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, ] packaging = [ {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pkginfo = [ {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, ] +platformdirs = [ + {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, + {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, +] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] py = [ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, @@ -1150,28 +1173,28 @@ pydantic = [ {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] pytest-insta = [ {file = "pytest-insta-0.1.10.tar.gz", hash = "sha256:27670ed8aa63cf34726106586dadadb12137102e22372ec918e64ee524d56f1f"}, {file = "pytest_insta-0.1.10-py3-none-any.whl", hash = "sha256:3043c4a668224f473df3de1d60fb356e356687b6931338c42c487abd0c9a19d8"}, ] python-gitlab = [ - {file = "python-gitlab-2.9.0.tar.gz", hash = "sha256:2c51b14cdd9a68028315a2b0e88525d3760967388f99faa57de8902b45465be6"}, - {file = "python_gitlab-2.9.0-py3-none-any.whl", hash = "sha256:956dfaf5d5f16c005fd064a7efd3059683dc348e9d46a1a555ddfac2e831e537"}, + {file = "python-gitlab-2.10.1.tar.gz", hash = "sha256:7afa7d7c062fa62c173190452265a30feefb844428efc58ea5244f3b9fc0d40f"}, + {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.16.2.tar.gz", hash = "sha256:b0679f5ca5ef860bcf07836949e0956bffa965197315b01c6e089467c144c674"}, - {file = "python_semantic_release-7.16.2-py3-none-any.whl", hash = "sha256:c54aca1d2d5121608f5152975b6cbc4f3cfd1e5d9d64293ad44aa4b62acc670d"}, + {file = "python-semantic-release-7.19.1.tar.gz", hash = "sha256:43f52f9a97677c029009063807f1fec9ffaabf049bd02f3fd898f0edf1ce5155"}, + {file = "python_semantic_release-7.19.1-py3-none-any.whl", hash = "sha256:8f5bfe18e78d44dc296966376f2bae2177ea881b628473d685b46f09a75ea92b"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1213,47 +1236,47 @@ readme-renderer = [ {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, - {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, - {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, - {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, - {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, - {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, - {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, - {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, - {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, - {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, - {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, - {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, - {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, + {file = "regex-2021.8.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308"}, + {file = "regex-2021.8.28-cp310-cp310-win32.whl", hash = "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed"}, + {file = "regex-2021.8.28-cp310-cp310-win_amd64.whl", hash = "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8"}, + {file = "regex-2021.8.28-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f"}, + {file = "regex-2021.8.28-cp36-cp36m-win32.whl", hash = "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354"}, + {file = "regex-2021.8.28-cp36-cp36m-win_amd64.whl", hash = "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645"}, + {file = "regex-2021.8.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906"}, + {file = "regex-2021.8.28-cp37-cp37m-win32.whl", hash = "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a"}, + {file = "regex-2021.8.28-cp37-cp37m-win_amd64.whl", hash = "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc"}, + {file = "regex-2021.8.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e"}, + {file = "regex-2021.8.28-cp38-cp38-win32.whl", hash = "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d"}, + {file = "regex-2021.8.28-cp38-cp38-win_amd64.whl", hash = "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2"}, + {file = "regex-2021.8.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed"}, + {file = "regex-2021.8.28-cp39-cp39-win32.whl", hash = "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374"}, + {file = "regex-2021.8.28-cp39-cp39-win_amd64.whl", hash = "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73"}, + {file = "regex-2021.8.28.tar.gz", hash = "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1"}, ] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, @@ -1276,8 +1299,8 @@ semver = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-6.0.1-py3-none-any.whl", hash = "sha256:c3bd5f701c8def44a5c0bfe8d407bef3f80342217ef3492b951f3777bd2d915c"}, - {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, + {file = "setuptools_scm-6.2.0-py3-none-any.whl", hash = "sha256:3ff3c48a44fcd16b4354a1f82db64daff7434240fe913c51537dca016af466a7"}, + {file = "setuptools_scm-6.2.0.tar.gz", hash = "sha256:19e2cc7768b8cd7d0efd69e264ffcb8e7191cf9b5c69a0e60139c45f1980ca64"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, @@ -1300,25 +1323,25 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.1.0-py3-none-any.whl", hash = "sha256:f4a182048010e89cbec0ae4686b21f550a7f2903f665e34a6de58ec15424f919"}, - {file = "tomli-1.1.0.tar.gz", hash = "sha256:33d7984738f8bb699c9b0a816eb646a8178a69eaa792d258486776a5d21b8ca5"}, + {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, + {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, ] tomlkit = [ {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.61.2-py2.py3-none-any.whl", hash = "sha256:5aa445ea0ad8b16d82b15ab342de6b195a722d75fc1ef9934a46bba6feafbc64"}, - {file = "tqdm-4.61.2.tar.gz", hash = "sha256:8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"}, + {file = "tqdm-4.62.2-py2.py3-none-any.whl", hash = "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588"}, + {file = "tqdm-4.62.2.tar.gz", hash = "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5"}, ] twine = [ {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f58561caa..bea9d7756 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,17 +23,17 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.36.0" +beet = ">=0.40.1" tokenstream = "^0.7.4" [tool.poetry.dev-dependencies] black = "^21.7b0" -isort = "^5.9.2" -pytest = "^6.2.4" +isort = "^5.9.3" +pytest = "^6.2.5" pytest-insta = "^0.1.10" -python-semantic-release = "^7.16.2" +python-semantic-release = "^7.19.1" mcwiki = "^0.2.1" -lectern = "^0.15.2" +lectern = ">=0.15.3" [tool.black] target-version = ["py38"] From 1a1fa8a1c6b8bb6856a3a6c49b6aec2bd0b223b4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 2 Sep 2021 03:00:45 +0200 Subject: [PATCH 0280/1554] chore: test against more example commands --- packages/mecha/mecha/parse.py | 34 +- .../resources/command_examples.mcfunction | 88 +- packages/mecha/scripts.py | 26 +- ...nt_examples_minecraft_mob_effect_98__0.txt | 10 +- ...nt_examples_minecraft_mob_effect_99__0.txt | 10 +- .../snapshots/parse__command_examples__0.txt | 3050 ++++++++++++++--- 6 files changed, 2673 insertions(+), 545 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 84458676f..d8fe5c8d7 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -243,7 +243,7 @@ def get_default_parsers() -> Dict[str, Parser]: resource_location_parser=ResourceLocationParser(allow_tag=False), ), "minecraft:message": parse_message, - "minecraft:mob_effect": StringParser(type="word"), + "minecraft:mob_effect": delegate("minecraft:resource_location"), "minecraft:nbt_compound_tag": parse_compound_tag, "minecraft:nbt_path": NbtPathParser(), "minecraft:nbt_tag": delegate("nbt"), @@ -261,6 +261,7 @@ def get_default_parsers() -> Dict[str, Parser]: ">", "><", ], + r"\S+", ), # TODO: "minecraft:particle" "minecraft:resource_location": ResourceLocationParser(allow_tag=False), @@ -448,7 +449,8 @@ def parse_argument(stream: TokenStream) -> AstNode: def parse_bool(stream: TokenStream) -> AstValue[bool]: """Parse bool.""" - token = stream.expect_any(("literal", "true"), ("literal", "false")) + with stream.syntax(literal=r"\w+"): + token = stream.expect_any(("literal", "true"), ("literal", "false")) return AstValue[bool]( value=token.value == "true", @@ -505,14 +507,13 @@ def create_node(self, stream: TokenStream) -> AstValue[NumericType]: class StringParser: """Parser for string values.""" - type: str = "phrase" + type: Optional[str] = None quoted_string_handler: QuotedStringHandler = field( default_factory=QuotedStringHandler ) def __call__(self, stream: TokenStream) -> AstValue[str]: - properties = get_stream_properties(stream) - string_type = properties.get("type", self.type) + string_type = self.type or get_stream_properties(stream)["type"] if string_type == "greedy": with stream.intercept("whitespace"): @@ -646,6 +647,7 @@ def __call__(self, stream: TokenStream) -> AstJson: number=r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?", colon=r":", comma=r",", + literal=r"\w+", ): curly, bracket, string, number, null, true, false = stream.expect( ("curly", "{"), @@ -1046,10 +1048,12 @@ class LiteralStringParser: """Parser for literal strings.""" values: List[str] + pattern: str = r"\w+" def __call__(self, stream: TokenStream) -> AstValue[str]: - patterns = [("literal", value) for value in self.values] - token = stream.expect_any(*patterns) + with stream.syntax(literal=self.pattern): + patterns = [("literal", value) for value in self.values] + token = stream.expect_any(*patterns) return AstValue[str]( value=token.value, @@ -1124,7 +1128,8 @@ def parse_player_name(stream: TokenStream) -> AstValue[str]: def parse_swizzle(stream: TokenStream) -> AstValue[str]: """Parse swizzle.""" - token = stream.expect("literal") + with stream.syntax(literal=r"\w+"): + token = stream.expect("literal") if not 1 <= len(token.value) <= 3 or len(set(token.value)) < len(token.value): raise token.emit_error(InvalidSyntax(f"Invalid swizzle {token.value!r}.")) @@ -1192,7 +1197,6 @@ class SelectorParser: """Parser for selectors.""" amount: str = "multiple" - type: str = "entities" def __call__(self, stream: TokenStream) -> AstSelector: properties = get_stream_properties(stream) @@ -1210,7 +1214,6 @@ def __call__(self, stream: TokenStream) -> AstSelector: location = token.location end_location = token.end_location - is_player = variable in "pra" is_single = variable in "prs" arguments: List[AstSelectorArgument] = [] @@ -1244,6 +1247,9 @@ def __call__(self, stream: TokenStream) -> AstSelector: ) ) + if key.value == "limit": + is_single = value.value == 1 + if not stream.get("comma"): break @@ -1251,23 +1257,15 @@ def __call__(self, stream: TokenStream) -> AstSelector: end_location = close_bracket.end_location amount = properties.get("amount", self.amount) - type = properties.get("type", self.type) if amount not in ["single", "multiple"]: raise ValueError(f"Invalid selector amount {amount!r}.") - if type not in ["players", "entities"]: - raise ValueError(f"Invalid selector type {type!r}.") if amount == "single" and not is_single: raise InvalidSyntax(f"Multiple entities not allowed.").set_location( location=location, end_location=end_location, ) - if type == "players" and not is_player: - raise InvalidSyntax(f"Non-player entities not allowed.").set_location( - location=location, - end_location=end_location, - ) return AstSelector( variable=variable, # type: ignore diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index b8262400d..52cd346bb 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -1,11 +1,48 @@ +# advancement +advancement grant @s only minecraft:story/shiny_gear +advancement grant @a everything +# attribute +attribute @s minecraft:generic.armor base set 5 +# clear +clear +clear Alice +clear Alice minecraft:wool +clear @p minecraft:golden_sword{Enchantments: [{id: "minecraft:sharpness", lvl: 1s}]} +# data +data get entity @s foodSaturationLevel +data modify entity @e[type=item,distance=..10,limit=1,sort=nearest] PickupDelay set value -1 +data get entity @e[type=item,limit=1,sort=random] Pos[1] +data get entity @p Inventory[{Slot: 0b}].id +data modify entity @e[x=0,y=64,z=0,type=dolphin,limit=1] Attributes[{Name: "generic.armor"}].Base set value 20 +data modify block 1 64 1 Items[0].id set value "minecraft:diamond_block" +data merge entity @e[type=zombie,limit=1,sort=nearest] {HandDropChances: [0f, 0.8f]} +data modify entity @e[type=zombie,limit=1,sort=nearest] HandDropChances[1] set value 0.8f +# defaultgamemode defaultgamemode survival +# effect +effect give @s minecraft:resistance 1000000 4 true +effect give @p minecraft:speed 60 1 +effect give @p minecraft:speed 60 2 +effect clear @a minecraft:haste +effect clear @e[type=zombie] +# enchant +enchant @a infinity +enchant @p sharpness 5 +# experience +experience query Steve levels +# fill fill 52 63 -1516 33 73 -1536 minecraft:gold_block replace minecraft:orange_glazed_terracotta fill ~-3 ~-3 ~-3 ~3 ~-1 ~3 water fill ~-3 ~ ~-4 ~3 ~4 ~4 minecraft:stone hollow fill ~-15 ~-15 ~-15 ~15 ~15 ~15 stone fill ~-1 ~ ~ ~1 ~ ~ minecraft:prismarine_brick_stairs[facing=south,waterlogged=true] +# function function custom:example/test function #custom:example/test +# gamemode +gamemode creative +gamemode survival @a +# gamerule gamerule doDaylightCycle false gamerule naturalRegeneration false gamerule mobGriefing false @@ -13,17 +50,56 @@ gamerule doWeatherCycle false gamerule keepInventory true gamerule commandBlockOutput false gamerule doInsomnia false +# give +give @p minecraft:diamond_sword{display: {Lore: ['"A legendary weapon"']}} 1 +give @a potion{Potion: "minecraft:night_vision"} 1 +give @r diamond_sword{Enchantments: [{id: "minecraft:sharpness", lvl: 10}]} 1 +give @s minecraft:diamond_block{CanPlaceOn: ["minecraft:dirt"]} +give @a potion{Enchantments: [{id: "minecraft:knockback", lvl: 10}], CustomPotionEffects: [{Id: 20, Amplifier: 1}]} 1 +# item +item replace block ~ ~2 ~ container.26 with minecraft:spruce_sapling 4 +item replace entity @p hotbar.8 with minecraft:spruce_sapling 4 +item replace entity @s weapon.offhand from entity @s weapon.mainhand +# kill +kill @s +kill Steve +kill @e[type=item] +kill @e[distance=..10] +kill @e[type=!player] +kill @e[distance=..10,type=creeper] +kill @e[type=arrow,nbt={inBlockState: {Name: "minecraft:target"}}] +# locate locate mansion +# msg msg @a Hi +# setblock setblock ~ ~ ~ chest[facing=east] -setblock ~ ~ ~-1 birch_sign{Text1:'"My chest"',Text2:'"Do not open!"'} +setblock ~ ~ ~-1 birch_sign{Text1: '"My chest"', Text2: '"Do not open!"'} setblock ~ ~2 ~ quartz_slab[type=top] +# spreadplayers +spreadplayers 0 0 200 500 true @a +# summon summon lightning_bolt ~-10 ~ ~ -summon creeper ~ ~ ~ {powered:1b,CustomName:'{"text":"Powered Creeper"}'} -summon spider ~ ~ ~ {Passengers:[{id:"minecraft:skeleton",HandItems:[{id:"minecraft:bow",Count:1b}]}]} -summon villager ~ ~ ~ {Offers:{Recipes:[{buy:{id:dirt,Count:1},sell:{id:diamond,Count:1},rewardExp:false}]}} -time set 1000 +summon creeper ~ ~ ~ {powered: 1b, CustomName: '{"text":"Powered Creeper"}'} +summon spider ~ ~ ~ {Passengers: [{id: "minecraft:skeleton", HandItems: [{id: "minecraft:bow", Count: 1b}]}]} +summon villager ~ ~ ~ {Offers: {Recipes: [{buy: {id: "dirt", Count: 1}, sell: {id: "diamond", Count: 1}, rewardExp: false}]}} +# teleport +teleport Alice +teleport @a @s +teleport 100 ~3 100 +# tellraw +tellraw @a "text to display" +tellraw @a {"text":"I am blue","color":"blue"} +tellraw @a {"text":"I am blue","color":"#5555ff"} +tellraw @a {"text":"Hover me!","hoverEvent":{"action":"show_text","value":"Hi!"}} +tellraw @a "Text1\nText2" +# time +time set 1000t time set day -time add 24000 +time add 24000t +# title +title @a subtitle {"text":"The story begins...","color":"gray","italic":true} +title @a title {"text":"Chapter I","bold":true} +# weather weather clear 1200 weather rain diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py index a0fc75c6d..d6c12c4de 100644 --- a/packages/mecha/scripts.py +++ b/packages/mecha/scripts.py @@ -22,7 +22,9 @@ def scan( # type: ignore isinstance(element, Tag) and ( any( - parent.text.startswith("Bedrock Edition:") + parent.get_text().startswith( + ("Bedrock Edition:", "In Bedrock Edition") + ) for parent in element.find_parents("li") ) or element.parent @@ -49,30 +51,48 @@ def download_command_examples(): generated_function = Function() commands = [ + "advancement", + "attribute", + "clear", + "data", "defaultgamemode", + "effect", + "enchant", + # "execute", + "experience", "fill", "function", + "gamemode", "gamerule", + "give", + "item", + "kill", "locate", "msg", + # "particle", "setblock", + "spreadplayers", "summon", + "teleport", + "tellraw", "time", + "title", "weather", ] - java_example = JavaExampleExtractor("li > code") + java_example = JavaExampleExtractor("li code") for command in commands: page = mcwiki.load(f"commands/{command}") examples = page.get("examples") if examples is not None: + generated_function.append(f"# {command}") for code in examples.extract_all(java_example): if code.startswith("/"): code = code[1:] if code.startswith(command): - generated_function.lines.append(code) + generated_function.append(code) click.echo(generated_function.text, nl=False) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt index 80c198439..9fb829add 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt @@ -4,7 +4,13 @@ minecraft:mob_effect --- spooky --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'spooky' \ No newline at end of file + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'spooky' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt index 37f92db5b..464530d4c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt @@ -4,7 +4,13 @@ minecraft:mob_effect --- effect --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'effect' \ No newline at end of file + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'effect' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 69681f0ff..dd9b4358a 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,1115 +1,3137 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1151, lineno=31, colno=1) + end_location: SourceLocation(pos=3806, lineno=107, colno=1) filename: None commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=66, lineno=2, colno=53) + identifier: 'advancement:grant:targets:only:advancement' + arguments: + + location: SourceLocation(pos=32, lineno=2, colno=19) + end_location: SourceLocation(pos=34, lineno=2, colno=21) + variable: 's' + arguments: + + + location: SourceLocation(pos=40, lineno=2, colno=27) + end_location: SourceLocation(pos=66, lineno=2, colno=53) + is_tag: False + namespace: + + location: SourceLocation(pos=40, lineno=2, colno=27) + end_location: SourceLocation(pos=49, lineno=2, colno=36) + value: 'minecraft' + path: + + location: SourceLocation(pos=50, lineno=2, colno=37) + end_location: SourceLocation(pos=66, lineno=2, colno=53) + value: 'story/shiny_gear' + + location: SourceLocation(pos=67, lineno=3, colno=1) + end_location: SourceLocation(pos=87, lineno=3, colno=21) + identifier: 'advancement:grant:targets:everything' + arguments: + + location: SourceLocation(pos=85, lineno=3, colno=19) + end_location: SourceLocation(pos=87, lineno=3, colno=21) + variable: 'a' + arguments: + + + location: SourceLocation(pos=111, lineno=5, colno=1) + end_location: SourceLocation(pos=158, lineno=5, colno=48) + identifier: 'attribute:target:attribute:base:set:value' + arguments: + + location: SourceLocation(pos=121, lineno=5, colno=11) + end_location: SourceLocation(pos=123, lineno=5, colno=13) + variable: 's' + arguments: + + + location: SourceLocation(pos=124, lineno=5, colno=14) + end_location: SourceLocation(pos=147, lineno=5, colno=37) + is_tag: False + namespace: + + location: SourceLocation(pos=124, lineno=5, colno=14) + end_location: SourceLocation(pos=133, lineno=5, colno=23) + value: 'minecraft' + path: + + location: SourceLocation(pos=134, lineno=5, colno=24) + end_location: SourceLocation(pos=147, lineno=5, colno=37) + value: 'generic.armor' + + location: SourceLocation(pos=157, lineno=5, colno=47) + end_location: SourceLocation(pos=158, lineno=5, colno=48) + value: 5.0 + + location: SourceLocation(pos=167, lineno=7, colno=1) + end_location: SourceLocation(pos=167, lineno=7, colno=1) + identifier: 'clear' + arguments: + + + location: SourceLocation(pos=173, lineno=8, colno=1) + end_location: SourceLocation(pos=184, lineno=8, colno=12) + identifier: 'clear:targets' + arguments: + + location: SourceLocation(pos=179, lineno=8, colno=7) + end_location: SourceLocation(pos=184, lineno=8, colno=12) + value: 'Alice' + + location: SourceLocation(pos=185, lineno=9, colno=1) + end_location: SourceLocation(pos=211, lineno=9, colno=27) + identifier: 'clear:targets:item' + arguments: + + location: SourceLocation(pos=191, lineno=9, colno=7) + end_location: SourceLocation(pos=196, lineno=9, colno=12) + value: 'Alice' + + location: SourceLocation(pos=197, lineno=9, colno=13) + end_location: SourceLocation(pos=211, lineno=9, colno=27) + identifier: + + location: SourceLocation(pos=197, lineno=9, colno=13) + end_location: SourceLocation(pos=211, lineno=9, colno=27) + is_tag: False + namespace: + + location: SourceLocation(pos=197, lineno=9, colno=13) + end_location: SourceLocation(pos=206, lineno=9, colno=22) + value: 'minecraft' + path: + + location: SourceLocation(pos=207, lineno=9, colno=23) + end_location: SourceLocation(pos=211, lineno=9, colno=27) + value: 'wool' + data_tags: None + + location: SourceLocation(pos=212, lineno=10, colno=1) + end_location: SourceLocation(pos=297, lineno=10, colno=86) + identifier: 'clear:targets:item' + arguments: + + location: SourceLocation(pos=218, lineno=10, colno=7) + end_location: SourceLocation(pos=220, lineno=10, colno=9) + variable: 'p' + arguments: + + + location: SourceLocation(pos=221, lineno=10, colno=10) + end_location: SourceLocation(pos=297, lineno=10, colno=86) + identifier: + + location: SourceLocation(pos=221, lineno=10, colno=10) + end_location: SourceLocation(pos=243, lineno=10, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=221, lineno=10, colno=10) + end_location: SourceLocation(pos=230, lineno=10, colno=19) + value: 'minecraft' + path: + + location: SourceLocation(pos=231, lineno=10, colno=20) + end_location: SourceLocation(pos=243, lineno=10, colno=32) + value: 'golden_sword' + data_tags: + + location: SourceLocation(pos=243, lineno=10, colno=32) + end_location: SourceLocation(pos=297, lineno=10, colno=86) + entries: + + location: SourceLocation(pos=244, lineno=10, colno=33) + end_location: SourceLocation(pos=296, lineno=10, colno=85) + key: + + location: SourceLocation(pos=244, lineno=10, colno=33) + end_location: SourceLocation(pos=256, lineno=10, colno=45) + value: 'Enchantments' + value: + + location: SourceLocation(pos=258, lineno=10, colno=47) + end_location: SourceLocation(pos=296, lineno=10, colno=85) + elements: + + location: SourceLocation(pos=259, lineno=10, colno=48) + end_location: SourceLocation(pos=295, lineno=10, colno=84) + entries: + + location: SourceLocation(pos=260, lineno=10, colno=49) + end_location: SourceLocation(pos=285, lineno=10, colno=74) + key: + + location: SourceLocation(pos=260, lineno=10, colno=49) + end_location: SourceLocation(pos=262, lineno=10, colno=51) + value: 'id' + value: + + location: SourceLocation(pos=264, lineno=10, colno=53) + end_location: SourceLocation(pos=285, lineno=10, colno=74) + value: String('minecraft:sharpness') + + location: SourceLocation(pos=287, lineno=10, colno=76) + end_location: SourceLocation(pos=294, lineno=10, colno=83) + key: + + location: SourceLocation(pos=287, lineno=10, colno=76) + end_location: SourceLocation(pos=290, lineno=10, colno=79) + value: 'lvl' + value: + + location: SourceLocation(pos=292, lineno=10, colno=81) + end_location: SourceLocation(pos=294, lineno=10, colno=83) + value: Short(1) + + location: SourceLocation(pos=305, lineno=12, colno=1) + end_location: SourceLocation(pos=343, lineno=12, colno=39) + identifier: 'data:get:entity:target:path' + arguments: + + location: SourceLocation(pos=321, lineno=12, colno=17) + end_location: SourceLocation(pos=323, lineno=12, colno=19) + variable: 's' + arguments: + + + location: SourceLocation(pos=324, lineno=12, colno=20) + end_location: SourceLocation(pos=343, lineno=12, colno=39) + nodes: + + location: SourceLocation(pos=324, lineno=12, colno=20) + end_location: SourceLocation(pos=343, lineno=12, colno=39) + value: 'foodSaturationLevel' + + location: SourceLocation(pos=344, lineno=13, colno=1) + end_location: SourceLocation(pos=436, lineno=13, colno=93) + identifier: 'data:modify:entity:target:targetPath:set:value:value' + arguments: + + location: SourceLocation(pos=363, lineno=13, colno=20) + end_location: SourceLocation(pos=411, lineno=13, colno=68) + variable: 'e' + arguments: + + location: SourceLocation(pos=366, lineno=13, colno=23) + end_location: SourceLocation(pos=375, lineno=13, colno=32) + inverted: False + key: + + location: SourceLocation(pos=366, lineno=13, colno=23) + end_location: SourceLocation(pos=370, lineno=13, colno=27) + value: 'type' + value: + + location: SourceLocation(pos=371, lineno=13, colno=28) + end_location: SourceLocation(pos=375, lineno=13, colno=32) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=371, lineno=13, colno=28) + end_location: SourceLocation(pos=375, lineno=13, colno=32) + value: 'item' + + location: SourceLocation(pos=376, lineno=13, colno=33) + end_location: SourceLocation(pos=389, lineno=13, colno=46) + inverted: False + key: + + location: SourceLocation(pos=376, lineno=13, colno=33) + end_location: SourceLocation(pos=384, lineno=13, colno=41) + value: 'distance' + value: + + location: SourceLocation(pos=385, lineno=13, colno=42) + end_location: SourceLocation(pos=389, lineno=13, colno=46) + min: None + max: 10.0 + + location: SourceLocation(pos=390, lineno=13, colno=47) + end_location: SourceLocation(pos=397, lineno=13, colno=54) + inverted: False + key: + + location: SourceLocation(pos=390, lineno=13, colno=47) + end_location: SourceLocation(pos=395, lineno=13, colno=52) + value: 'limit' + value: + + location: SourceLocation(pos=396, lineno=13, colno=53) + end_location: SourceLocation(pos=397, lineno=13, colno=54) + value: 1 + + location: SourceLocation(pos=398, lineno=13, colno=55) + end_location: SourceLocation(pos=410, lineno=13, colno=67) + inverted: False + key: + + location: SourceLocation(pos=398, lineno=13, colno=55) + end_location: SourceLocation(pos=402, lineno=13, colno=59) + value: 'sort' + value: + + location: SourceLocation(pos=403, lineno=13, colno=60) + end_location: SourceLocation(pos=410, lineno=13, colno=67) + value: 'nearest' + + location: SourceLocation(pos=412, lineno=13, colno=69) + end_location: SourceLocation(pos=423, lineno=13, colno=80) + nodes: + + location: SourceLocation(pos=412, lineno=13, colno=69) + end_location: SourceLocation(pos=423, lineno=13, colno=80) + value: 'PickupDelay' + + location: SourceLocation(pos=434, lineno=13, colno=91) + end_location: SourceLocation(pos=436, lineno=13, colno=93) + value: Int(-1) + + location: SourceLocation(pos=437, lineno=14, colno=1) + end_location: SourceLocation(pos=493, lineno=14, colno=57) + identifier: 'data:get:entity:target:path' + arguments: + + location: SourceLocation(pos=453, lineno=14, colno=17) + end_location: SourceLocation(pos=486, lineno=14, colno=50) + variable: 'e' + arguments: + + location: SourceLocation(pos=456, lineno=14, colno=20) + end_location: SourceLocation(pos=465, lineno=14, colno=29) + inverted: False + key: + + location: SourceLocation(pos=456, lineno=14, colno=20) + end_location: SourceLocation(pos=460, lineno=14, colno=24) + value: 'type' + value: + + location: SourceLocation(pos=461, lineno=14, colno=25) + end_location: SourceLocation(pos=465, lineno=14, colno=29) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=461, lineno=14, colno=25) + end_location: SourceLocation(pos=465, lineno=14, colno=29) + value: 'item' + + location: SourceLocation(pos=466, lineno=14, colno=30) + end_location: SourceLocation(pos=473, lineno=14, colno=37) + inverted: False + key: + + location: SourceLocation(pos=466, lineno=14, colno=30) + end_location: SourceLocation(pos=471, lineno=14, colno=35) + value: 'limit' + value: + + location: SourceLocation(pos=472, lineno=14, colno=36) + end_location: SourceLocation(pos=473, lineno=14, colno=37) + value: 1 + + location: SourceLocation(pos=474, lineno=14, colno=38) + end_location: SourceLocation(pos=485, lineno=14, colno=49) + inverted: False + key: + + location: SourceLocation(pos=474, lineno=14, colno=38) + end_location: SourceLocation(pos=478, lineno=14, colno=42) + value: 'sort' + value: + + location: SourceLocation(pos=479, lineno=14, colno=43) + end_location: SourceLocation(pos=485, lineno=14, colno=49) + value: 'random' + + location: SourceLocation(pos=487, lineno=14, colno=51) + end_location: SourceLocation(pos=493, lineno=14, colno=57) + nodes: + + location: SourceLocation(pos=487, lineno=14, colno=51) + end_location: SourceLocation(pos=490, lineno=14, colno=54) + value: 'Pos' + + location: SourceLocation(pos=490, lineno=14, colno=54) + end_location: SourceLocation(pos=493, lineno=14, colno=57) + match: + + location: SourceLocation(pos=491, lineno=14, colno=55) + end_location: SourceLocation(pos=492, lineno=14, colno=56) + value: 1 + + location: SourceLocation(pos=494, lineno=15, colno=1) + end_location: SourceLocation(pos=537, lineno=15, colno=44) + identifier: 'data:get:entity:target:path' + arguments: + + location: SourceLocation(pos=510, lineno=15, colno=17) + end_location: SourceLocation(pos=512, lineno=15, colno=19) + variable: 'p' + arguments: + + + location: SourceLocation(pos=513, lineno=15, colno=20) + end_location: SourceLocation(pos=537, lineno=15, colno=44) + nodes: + + location: SourceLocation(pos=513, lineno=15, colno=20) + end_location: SourceLocation(pos=522, lineno=15, colno=29) + value: 'Inventory' + + location: SourceLocation(pos=522, lineno=15, colno=29) + end_location: SourceLocation(pos=534, lineno=15, colno=41) + match: + + location: SourceLocation(pos=523, lineno=15, colno=30) + end_location: SourceLocation(pos=533, lineno=15, colno=40) + entries: + + location: SourceLocation(pos=524, lineno=15, colno=31) + end_location: SourceLocation(pos=532, lineno=15, colno=39) + key: + + location: SourceLocation(pos=524, lineno=15, colno=31) + end_location: SourceLocation(pos=528, lineno=15, colno=35) + value: 'Slot' + value: + + location: SourceLocation(pos=530, lineno=15, colno=37) + end_location: SourceLocation(pos=532, lineno=15, colno=39) + value: Byte(0) + + location: SourceLocation(pos=535, lineno=15, colno=42) + end_location: SourceLocation(pos=537, lineno=15, colno=44) + value: 'id' + + location: SourceLocation(pos=538, lineno=16, colno=1) + end_location: SourceLocation(pos=648, lineno=16, colno=111) + identifier: 'data:modify:entity:target:targetPath:set:value:value' + arguments: + + location: SourceLocation(pos=557, lineno=16, colno=20) + end_location: SourceLocation(pos=594, lineno=16, colno=57) + variable: 'e' + arguments: + + location: SourceLocation(pos=560, lineno=16, colno=23) + end_location: SourceLocation(pos=563, lineno=16, colno=26) + inverted: False + key: + + location: SourceLocation(pos=560, lineno=16, colno=23) + end_location: SourceLocation(pos=561, lineno=16, colno=24) + value: 'x' + value: + + location: SourceLocation(pos=562, lineno=16, colno=25) + end_location: SourceLocation(pos=563, lineno=16, colno=26) + value: 0.0 + + location: SourceLocation(pos=564, lineno=16, colno=27) + end_location: SourceLocation(pos=568, lineno=16, colno=31) + inverted: False + key: + + location: SourceLocation(pos=564, lineno=16, colno=27) + end_location: SourceLocation(pos=565, lineno=16, colno=28) + value: 'y' + value: + + location: SourceLocation(pos=566, lineno=16, colno=29) + end_location: SourceLocation(pos=568, lineno=16, colno=31) + value: 64.0 + + location: SourceLocation(pos=569, lineno=16, colno=32) + end_location: SourceLocation(pos=572, lineno=16, colno=35) + inverted: False + key: + + location: SourceLocation(pos=569, lineno=16, colno=32) + end_location: SourceLocation(pos=570, lineno=16, colno=33) + value: 'z' + value: + + location: SourceLocation(pos=571, lineno=16, colno=34) + end_location: SourceLocation(pos=572, lineno=16, colno=35) + value: 0.0 + + location: SourceLocation(pos=573, lineno=16, colno=36) + end_location: SourceLocation(pos=585, lineno=16, colno=48) + inverted: False + key: + + location: SourceLocation(pos=573, lineno=16, colno=36) + end_location: SourceLocation(pos=577, lineno=16, colno=40) + value: 'type' + value: + + location: SourceLocation(pos=578, lineno=16, colno=41) + end_location: SourceLocation(pos=585, lineno=16, colno=48) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=578, lineno=16, colno=41) + end_location: SourceLocation(pos=585, lineno=16, colno=48) + value: 'dolphin' + + location: SourceLocation(pos=586, lineno=16, colno=49) + end_location: SourceLocation(pos=593, lineno=16, colno=56) + inverted: False + key: + + location: SourceLocation(pos=586, lineno=16, colno=49) + end_location: SourceLocation(pos=591, lineno=16, colno=54) + value: 'limit' + value: + + location: SourceLocation(pos=592, lineno=16, colno=55) + end_location: SourceLocation(pos=593, lineno=16, colno=56) + value: 1 + + location: SourceLocation(pos=595, lineno=16, colno=58) + end_location: SourceLocation(pos=635, lineno=16, colno=98) + nodes: + + location: SourceLocation(pos=595, lineno=16, colno=58) + end_location: SourceLocation(pos=605, lineno=16, colno=68) + value: 'Attributes' + + location: SourceLocation(pos=605, lineno=16, colno=68) + end_location: SourceLocation(pos=630, lineno=16, colno=93) + match: + + location: SourceLocation(pos=606, lineno=16, colno=69) + end_location: SourceLocation(pos=629, lineno=16, colno=92) + entries: + + location: SourceLocation(pos=607, lineno=16, colno=70) + end_location: SourceLocation(pos=628, lineno=16, colno=91) + key: + + location: SourceLocation(pos=607, lineno=16, colno=70) + end_location: SourceLocation(pos=611, lineno=16, colno=74) + value: 'Name' + value: + + location: SourceLocation(pos=613, lineno=16, colno=76) + end_location: SourceLocation(pos=628, lineno=16, colno=91) + value: String('generic.armor') + + location: SourceLocation(pos=631, lineno=16, colno=94) + end_location: SourceLocation(pos=635, lineno=16, colno=98) + value: 'Base' + + location: SourceLocation(pos=646, lineno=16, colno=109) + end_location: SourceLocation(pos=648, lineno=16, colno=111) + value: Int(20) + + location: SourceLocation(pos=649, lineno=17, colno=1) + end_location: SourceLocation(pos=721, lineno=17, colno=73) + identifier: 'data:modify:block:targetPos:targetPath:set:value:value' + arguments: + + location: SourceLocation(pos=667, lineno=17, colno=19) + end_location: SourceLocation(pos=673, lineno=17, colno=25) + x: + + location: SourceLocation(pos=667, lineno=17, colno=19) + end_location: SourceLocation(pos=668, lineno=17, colno=20) + value: 1.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=669, lineno=17, colno=21) + end_location: SourceLocation(pos=671, lineno=17, colno=23) + value: 64.0 + prefix: 'absolute' + z: + + location: SourceLocation(pos=672, lineno=17, colno=24) + end_location: SourceLocation(pos=673, lineno=17, colno=25) + value: 1.0 + prefix: 'absolute' + + location: SourceLocation(pos=674, lineno=17, colno=26) + end_location: SourceLocation(pos=685, lineno=17, colno=37) + nodes: + + location: SourceLocation(pos=674, lineno=17, colno=26) + end_location: SourceLocation(pos=679, lineno=17, colno=31) + value: 'Items' + + location: SourceLocation(pos=679, lineno=17, colno=31) + end_location: SourceLocation(pos=682, lineno=17, colno=34) + match: + + location: SourceLocation(pos=680, lineno=17, colno=32) + end_location: SourceLocation(pos=681, lineno=17, colno=33) + value: 0 + + location: SourceLocation(pos=683, lineno=17, colno=35) + end_location: SourceLocation(pos=685, lineno=17, colno=37) + value: 'id' + + location: SourceLocation(pos=696, lineno=17, colno=48) + end_location: SourceLocation(pos=721, lineno=17, colno=73) + value: String('minecraft:diamond_block') + + location: SourceLocation(pos=722, lineno=18, colno=1) + end_location: SourceLocation(pos=806, lineno=18, colno=85) + identifier: 'data:merge:entity:target:nbt' + arguments: + + location: SourceLocation(pos=740, lineno=18, colno=19) + end_location: SourceLocation(pos=776, lineno=18, colno=55) + variable: 'e' + arguments: + + location: SourceLocation(pos=743, lineno=18, colno=22) + end_location: SourceLocation(pos=754, lineno=18, colno=33) + inverted: False + key: + + location: SourceLocation(pos=743, lineno=18, colno=22) + end_location: SourceLocation(pos=747, lineno=18, colno=26) + value: 'type' + value: + + location: SourceLocation(pos=748, lineno=18, colno=27) + end_location: SourceLocation(pos=754, lineno=18, colno=33) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=748, lineno=18, colno=27) + end_location: SourceLocation(pos=754, lineno=18, colno=33) + value: 'zombie' + + location: SourceLocation(pos=755, lineno=18, colno=34) + end_location: SourceLocation(pos=762, lineno=18, colno=41) + inverted: False + key: + + location: SourceLocation(pos=755, lineno=18, colno=34) + end_location: SourceLocation(pos=760, lineno=18, colno=39) + value: 'limit' + value: + + location: SourceLocation(pos=761, lineno=18, colno=40) + end_location: SourceLocation(pos=762, lineno=18, colno=41) + value: 1 + + location: SourceLocation(pos=763, lineno=18, colno=42) + end_location: SourceLocation(pos=775, lineno=18, colno=54) + inverted: False + key: + + location: SourceLocation(pos=763, lineno=18, colno=42) + end_location: SourceLocation(pos=767, lineno=18, colno=46) + value: 'sort' + value: + + location: SourceLocation(pos=768, lineno=18, colno=47) + end_location: SourceLocation(pos=775, lineno=18, colno=54) + value: 'nearest' + + location: SourceLocation(pos=777, lineno=18, colno=56) + end_location: SourceLocation(pos=806, lineno=18, colno=85) + entries: + + location: SourceLocation(pos=778, lineno=18, colno=57) + end_location: SourceLocation(pos=805, lineno=18, colno=84) + key: + + location: SourceLocation(pos=778, lineno=18, colno=57) + end_location: SourceLocation(pos=793, lineno=18, colno=72) + value: 'HandDropChances' + value: + + location: SourceLocation(pos=795, lineno=18, colno=74) + end_location: SourceLocation(pos=805, lineno=18, colno=84) + elements: + + location: SourceLocation(pos=796, lineno=18, colno=75) + end_location: SourceLocation(pos=798, lineno=18, colno=77) + value: Float(0.0) + + location: SourceLocation(pos=800, lineno=18, colno=79) + end_location: SourceLocation(pos=804, lineno=18, colno=83) + value: Float(0.8) + + location: SourceLocation(pos=807, lineno=19, colno=1) + end_location: SourceLocation(pos=896, lineno=19, colno=90) + identifier: 'data:modify:entity:target:targetPath:set:value:value' + arguments: + + location: SourceLocation(pos=826, lineno=19, colno=20) + end_location: SourceLocation(pos=862, lineno=19, colno=56) + variable: 'e' + arguments: + + location: SourceLocation(pos=829, lineno=19, colno=23) + end_location: SourceLocation(pos=840, lineno=19, colno=34) + inverted: False + key: + + location: SourceLocation(pos=829, lineno=19, colno=23) + end_location: SourceLocation(pos=833, lineno=19, colno=27) + value: 'type' + value: + + location: SourceLocation(pos=834, lineno=19, colno=28) + end_location: SourceLocation(pos=840, lineno=19, colno=34) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=834, lineno=19, colno=28) + end_location: SourceLocation(pos=840, lineno=19, colno=34) + value: 'zombie' + + location: SourceLocation(pos=841, lineno=19, colno=35) + end_location: SourceLocation(pos=848, lineno=19, colno=42) + inverted: False + key: + + location: SourceLocation(pos=841, lineno=19, colno=35) + end_location: SourceLocation(pos=846, lineno=19, colno=40) + value: 'limit' + value: + + location: SourceLocation(pos=847, lineno=19, colno=41) + end_location: SourceLocation(pos=848, lineno=19, colno=42) + value: 1 + + location: SourceLocation(pos=849, lineno=19, colno=43) + end_location: SourceLocation(pos=861, lineno=19, colno=55) + inverted: False + key: + + location: SourceLocation(pos=849, lineno=19, colno=43) + end_location: SourceLocation(pos=853, lineno=19, colno=47) + value: 'sort' + value: + + location: SourceLocation(pos=854, lineno=19, colno=48) + end_location: SourceLocation(pos=861, lineno=19, colno=55) + value: 'nearest' + + location: SourceLocation(pos=863, lineno=19, colno=57) + end_location: SourceLocation(pos=881, lineno=19, colno=75) + nodes: + + location: SourceLocation(pos=863, lineno=19, colno=57) + end_location: SourceLocation(pos=878, lineno=19, colno=72) + value: 'HandDropChances' + + location: SourceLocation(pos=878, lineno=19, colno=72) + end_location: SourceLocation(pos=881, lineno=19, colno=75) + match: + + location: SourceLocation(pos=879, lineno=19, colno=73) + end_location: SourceLocation(pos=880, lineno=19, colno=74) + value: 1 + + location: SourceLocation(pos=892, lineno=19, colno=86) + end_location: SourceLocation(pos=896, lineno=19, colno=90) + value: Float(0.8) + + location: SourceLocation(pos=915, lineno=21, colno=1) + end_location: SourceLocation(pos=915, lineno=21, colno=1) identifier: 'defaultgamemode:survival' arguments: - + + + location: SourceLocation(pos=949, lineno=23, colno=1) + end_location: SourceLocation(pos=999, lineno=23, colno=51) + identifier: 'effect:give:targets:effect:seconds:amplifier:hideParticles' + arguments: + + location: SourceLocation(pos=961, lineno=23, colno=13) + end_location: SourceLocation(pos=963, lineno=23, colno=15) + variable: 's' + arguments: + + + location: SourceLocation(pos=964, lineno=23, colno=16) + end_location: SourceLocation(pos=984, lineno=23, colno=36) + is_tag: False + namespace: + + location: SourceLocation(pos=964, lineno=23, colno=16) + end_location: SourceLocation(pos=973, lineno=23, colno=25) + value: 'minecraft' + path: + + location: SourceLocation(pos=974, lineno=23, colno=26) + end_location: SourceLocation(pos=984, lineno=23, colno=36) + value: 'resistance' + + location: SourceLocation(pos=985, lineno=23, colno=37) + end_location: SourceLocation(pos=992, lineno=23, colno=44) + value: 1000000 + + location: SourceLocation(pos=993, lineno=23, colno=45) + end_location: SourceLocation(pos=994, lineno=23, colno=46) + value: 4 + + location: SourceLocation(pos=995, lineno=23, colno=47) + end_location: SourceLocation(pos=999, lineno=23, colno=51) + value: True + + location: SourceLocation(pos=1000, lineno=24, colno=1) + end_location: SourceLocation(pos=1035, lineno=24, colno=36) + identifier: 'effect:give:targets:effect:seconds:amplifier' + arguments: + + location: SourceLocation(pos=1012, lineno=24, colno=13) + end_location: SourceLocation(pos=1014, lineno=24, colno=15) + variable: 'p' + arguments: + + + location: SourceLocation(pos=1015, lineno=24, colno=16) + end_location: SourceLocation(pos=1030, lineno=24, colno=31) + is_tag: False + namespace: + + location: SourceLocation(pos=1015, lineno=24, colno=16) + end_location: SourceLocation(pos=1024, lineno=24, colno=25) + value: 'minecraft' + path: + + location: SourceLocation(pos=1025, lineno=24, colno=26) + end_location: SourceLocation(pos=1030, lineno=24, colno=31) + value: 'speed' + + location: SourceLocation(pos=1031, lineno=24, colno=32) + end_location: SourceLocation(pos=1033, lineno=24, colno=34) + value: 60 + + location: SourceLocation(pos=1034, lineno=24, colno=35) + end_location: SourceLocation(pos=1035, lineno=24, colno=36) + value: 1 + + location: SourceLocation(pos=1036, lineno=25, colno=1) + end_location: SourceLocation(pos=1071, lineno=25, colno=36) + identifier: 'effect:give:targets:effect:seconds:amplifier' + arguments: + + location: SourceLocation(pos=1048, lineno=25, colno=13) + end_location: SourceLocation(pos=1050, lineno=25, colno=15) + variable: 'p' + arguments: + + + location: SourceLocation(pos=1051, lineno=25, colno=16) + end_location: SourceLocation(pos=1066, lineno=25, colno=31) + is_tag: False + namespace: + + location: SourceLocation(pos=1051, lineno=25, colno=16) + end_location: SourceLocation(pos=1060, lineno=25, colno=25) + value: 'minecraft' + path: + + location: SourceLocation(pos=1061, lineno=25, colno=26) + end_location: SourceLocation(pos=1066, lineno=25, colno=31) + value: 'speed' + + location: SourceLocation(pos=1067, lineno=25, colno=32) + end_location: SourceLocation(pos=1069, lineno=25, colno=34) + value: 60 + + location: SourceLocation(pos=1070, lineno=25, colno=35) + end_location: SourceLocation(pos=1071, lineno=25, colno=36) + value: 2 + + location: SourceLocation(pos=1072, lineno=26, colno=1) + end_location: SourceLocation(pos=1103, lineno=26, colno=32) + identifier: 'effect:clear:targets:effect' + arguments: + + location: SourceLocation(pos=1085, lineno=26, colno=14) + end_location: SourceLocation(pos=1087, lineno=26, colno=16) + variable: 'a' + arguments: + + + location: SourceLocation(pos=1088, lineno=26, colno=17) + end_location: SourceLocation(pos=1103, lineno=26, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=1088, lineno=26, colno=17) + end_location: SourceLocation(pos=1097, lineno=26, colno=26) + value: 'minecraft' + path: + + location: SourceLocation(pos=1098, lineno=26, colno=27) + end_location: SourceLocation(pos=1103, lineno=26, colno=32) + value: 'haste' + + location: SourceLocation(pos=1104, lineno=27, colno=1) + end_location: SourceLocation(pos=1132, lineno=27, colno=29) + identifier: 'effect:clear:targets' + arguments: + + location: SourceLocation(pos=1117, lineno=27, colno=14) + end_location: SourceLocation(pos=1132, lineno=27, colno=29) + variable: 'e' + arguments: + + location: SourceLocation(pos=1120, lineno=27, colno=17) + end_location: SourceLocation(pos=1131, lineno=27, colno=28) + inverted: False + key: + + location: SourceLocation(pos=1120, lineno=27, colno=17) + end_location: SourceLocation(pos=1124, lineno=27, colno=21) + value: 'type' + value: + + location: SourceLocation(pos=1125, lineno=27, colno=22) + end_location: SourceLocation(pos=1131, lineno=27, colno=28) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1125, lineno=27, colno=22) + end_location: SourceLocation(pos=1131, lineno=27, colno=28) + value: 'zombie' + + location: SourceLocation(pos=1143, lineno=29, colno=1) + end_location: SourceLocation(pos=1162, lineno=29, colno=20) + identifier: 'enchant:targets:enchantment' + arguments: + + location: SourceLocation(pos=1151, lineno=29, colno=9) + end_location: SourceLocation(pos=1153, lineno=29, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=1154, lineno=29, colno=12) + end_location: SourceLocation(pos=1162, lineno=29, colno=20) + value: 'infinity' + + location: SourceLocation(pos=1163, lineno=30, colno=1) + end_location: SourceLocation(pos=1185, lineno=30, colno=23) + identifier: 'enchant:targets:enchantment:level' + arguments: + + location: SourceLocation(pos=1171, lineno=30, colno=9) + end_location: SourceLocation(pos=1173, lineno=30, colno=11) + variable: 'p' + arguments: + + + location: SourceLocation(pos=1174, lineno=30, colno=12) + end_location: SourceLocation(pos=1183, lineno=30, colno=21) + value: 'sharpness' + + location: SourceLocation(pos=1184, lineno=30, colno=22) + end_location: SourceLocation(pos=1185, lineno=30, colno=23) + value: 5 + + location: SourceLocation(pos=1199, lineno=32, colno=1) + end_location: SourceLocation(pos=1221, lineno=32, colno=23) + identifier: 'experience:query:targets:levels' + arguments: + + location: SourceLocation(pos=1216, lineno=32, colno=18) + end_location: SourceLocation(pos=1221, lineno=32, colno=23) + value: 'Steve' - location: SourceLocation(pos=25, lineno=2, colno=1) - end_location: SourceLocation(pos=117, lineno=2, colno=93) + location: SourceLocation(pos=1236, lineno=34, colno=1) + end_location: SourceLocation(pos=1328, lineno=34, colno=93) identifier: 'fill:from:to:block:replace:filter' arguments: - location: SourceLocation(pos=30, lineno=2, colno=6) - end_location: SourceLocation(pos=41, lineno=2, colno=17) + location: SourceLocation(pos=1241, lineno=34, colno=6) + end_location: SourceLocation(pos=1252, lineno=34, colno=17) x: - location: SourceLocation(pos=30, lineno=2, colno=6) - end_location: SourceLocation(pos=32, lineno=2, colno=8) + location: SourceLocation(pos=1241, lineno=34, colno=6) + end_location: SourceLocation(pos=1243, lineno=34, colno=8) value: 52.0 prefix: 'absolute' y: - location: SourceLocation(pos=33, lineno=2, colno=9) - end_location: SourceLocation(pos=35, lineno=2, colno=11) + location: SourceLocation(pos=1244, lineno=34, colno=9) + end_location: SourceLocation(pos=1246, lineno=34, colno=11) value: 63.0 prefix: 'absolute' z: - location: SourceLocation(pos=36, lineno=2, colno=12) - end_location: SourceLocation(pos=41, lineno=2, colno=17) + location: SourceLocation(pos=1247, lineno=34, colno=12) + end_location: SourceLocation(pos=1252, lineno=34, colno=17) value: -1516.0 prefix: 'absolute' - location: SourceLocation(pos=42, lineno=2, colno=18) - end_location: SourceLocation(pos=53, lineno=2, colno=29) + location: SourceLocation(pos=1253, lineno=34, colno=18) + end_location: SourceLocation(pos=1264, lineno=34, colno=29) x: - location: SourceLocation(pos=42, lineno=2, colno=18) - end_location: SourceLocation(pos=44, lineno=2, colno=20) + location: SourceLocation(pos=1253, lineno=34, colno=18) + end_location: SourceLocation(pos=1255, lineno=34, colno=20) value: 33.0 prefix: 'absolute' y: - location: SourceLocation(pos=45, lineno=2, colno=21) - end_location: SourceLocation(pos=47, lineno=2, colno=23) + location: SourceLocation(pos=1256, lineno=34, colno=21) + end_location: SourceLocation(pos=1258, lineno=34, colno=23) value: 73.0 prefix: 'absolute' z: - location: SourceLocation(pos=48, lineno=2, colno=24) - end_location: SourceLocation(pos=53, lineno=2, colno=29) + location: SourceLocation(pos=1259, lineno=34, colno=24) + end_location: SourceLocation(pos=1264, lineno=34, colno=29) value: -1536.0 prefix: 'absolute' - location: SourceLocation(pos=54, lineno=2, colno=30) - end_location: SourceLocation(pos=74, lineno=2, colno=50) + location: SourceLocation(pos=1265, lineno=34, colno=30) + end_location: SourceLocation(pos=1285, lineno=34, colno=50) identifier: - location: SourceLocation(pos=54, lineno=2, colno=30) - end_location: SourceLocation(pos=74, lineno=2, colno=50) + location: SourceLocation(pos=1265, lineno=34, colno=30) + end_location: SourceLocation(pos=1285, lineno=34, colno=50) is_tag: False namespace: - location: SourceLocation(pos=54, lineno=2, colno=30) - end_location: SourceLocation(pos=63, lineno=2, colno=39) + location: SourceLocation(pos=1265, lineno=34, colno=30) + end_location: SourceLocation(pos=1274, lineno=34, colno=39) value: 'minecraft' path: - location: SourceLocation(pos=64, lineno=2, colno=40) - end_location: SourceLocation(pos=74, lineno=2, colno=50) + location: SourceLocation(pos=1275, lineno=34, colno=40) + end_location: SourceLocation(pos=1285, lineno=34, colno=50) value: 'gold_block' block_states: data_tags: None - location: SourceLocation(pos=83, lineno=2, colno=59) - end_location: SourceLocation(pos=117, lineno=2, colno=93) + location: SourceLocation(pos=1294, lineno=34, colno=59) + end_location: SourceLocation(pos=1328, lineno=34, colno=93) identifier: - location: SourceLocation(pos=83, lineno=2, colno=59) - end_location: SourceLocation(pos=117, lineno=2, colno=93) + location: SourceLocation(pos=1294, lineno=34, colno=59) + end_location: SourceLocation(pos=1328, lineno=34, colno=93) is_tag: False namespace: - location: SourceLocation(pos=83, lineno=2, colno=59) - end_location: SourceLocation(pos=92, lineno=2, colno=68) + location: SourceLocation(pos=1294, lineno=34, colno=59) + end_location: SourceLocation(pos=1303, lineno=34, colno=68) value: 'minecraft' path: - location: SourceLocation(pos=93, lineno=2, colno=69) - end_location: SourceLocation(pos=117, lineno=2, colno=93) + location: SourceLocation(pos=1304, lineno=34, colno=69) + end_location: SourceLocation(pos=1328, lineno=34, colno=93) value: 'orange_glazed_terracotta' block_states: data_tags: None - location: SourceLocation(pos=118, lineno=3, colno=1) - end_location: SourceLocation(pos=150, lineno=3, colno=33) + location: SourceLocation(pos=1329, lineno=35, colno=1) + end_location: SourceLocation(pos=1361, lineno=35, colno=33) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=123, lineno=3, colno=6) - end_location: SourceLocation(pos=134, lineno=3, colno=17) + location: SourceLocation(pos=1334, lineno=35, colno=6) + end_location: SourceLocation(pos=1345, lineno=35, colno=17) x: - location: SourceLocation(pos=123, lineno=3, colno=6) - end_location: SourceLocation(pos=126, lineno=3, colno=9) + location: SourceLocation(pos=1334, lineno=35, colno=6) + end_location: SourceLocation(pos=1337, lineno=35, colno=9) value: -3.0 prefix: 'relative' y: - location: SourceLocation(pos=127, lineno=3, colno=10) - end_location: SourceLocation(pos=130, lineno=3, colno=13) + location: SourceLocation(pos=1338, lineno=35, colno=10) + end_location: SourceLocation(pos=1341, lineno=35, colno=13) value: -3.0 prefix: 'relative' z: - location: SourceLocation(pos=131, lineno=3, colno=14) - end_location: SourceLocation(pos=134, lineno=3, colno=17) + location: SourceLocation(pos=1342, lineno=35, colno=14) + end_location: SourceLocation(pos=1345, lineno=35, colno=17) value: -3.0 prefix: 'relative' - location: SourceLocation(pos=135, lineno=3, colno=18) - end_location: SourceLocation(pos=144, lineno=3, colno=27) + location: SourceLocation(pos=1346, lineno=35, colno=18) + end_location: SourceLocation(pos=1355, lineno=35, colno=27) x: - location: SourceLocation(pos=135, lineno=3, colno=18) - end_location: SourceLocation(pos=137, lineno=3, colno=20) + location: SourceLocation(pos=1346, lineno=35, colno=18) + end_location: SourceLocation(pos=1348, lineno=35, colno=20) value: 3.0 prefix: 'relative' y: - location: SourceLocation(pos=138, lineno=3, colno=21) - end_location: SourceLocation(pos=141, lineno=3, colno=24) + location: SourceLocation(pos=1349, lineno=35, colno=21) + end_location: SourceLocation(pos=1352, lineno=35, colno=24) value: -1.0 prefix: 'relative' z: - location: SourceLocation(pos=142, lineno=3, colno=25) - end_location: SourceLocation(pos=144, lineno=3, colno=27) + location: SourceLocation(pos=1353, lineno=35, colno=25) + end_location: SourceLocation(pos=1355, lineno=35, colno=27) value: 3.0 prefix: 'relative' - location: SourceLocation(pos=145, lineno=3, colno=28) - end_location: SourceLocation(pos=150, lineno=3, colno=33) + location: SourceLocation(pos=1356, lineno=35, colno=28) + end_location: SourceLocation(pos=1361, lineno=35, colno=33) identifier: - location: SourceLocation(pos=145, lineno=3, colno=28) - end_location: SourceLocation(pos=150, lineno=3, colno=33) + location: SourceLocation(pos=1356, lineno=35, colno=28) + end_location: SourceLocation(pos=1361, lineno=35, colno=33) is_tag: False namespace: None path: - location: SourceLocation(pos=145, lineno=3, colno=28) - end_location: SourceLocation(pos=150, lineno=3, colno=33) + location: SourceLocation(pos=1356, lineno=35, colno=28) + end_location: SourceLocation(pos=1361, lineno=35, colno=33) value: 'water' block_states: data_tags: None - location: SourceLocation(pos=151, lineno=4, colno=1) - end_location: SourceLocation(pos=190, lineno=4, colno=40) + location: SourceLocation(pos=1362, lineno=36, colno=1) + end_location: SourceLocation(pos=1401, lineno=36, colno=40) identifier: 'fill:from:to:block:hollow' arguments: - location: SourceLocation(pos=156, lineno=4, colno=6) - end_location: SourceLocation(pos=165, lineno=4, colno=15) + location: SourceLocation(pos=1367, lineno=36, colno=6) + end_location: SourceLocation(pos=1376, lineno=36, colno=15) x: - location: SourceLocation(pos=156, lineno=4, colno=6) - end_location: SourceLocation(pos=159, lineno=4, colno=9) + location: SourceLocation(pos=1367, lineno=36, colno=6) + end_location: SourceLocation(pos=1370, lineno=36, colno=9) value: -3.0 prefix: 'relative' y: - location: SourceLocation(pos=160, lineno=4, colno=10) - end_location: SourceLocation(pos=161, lineno=4, colno=11) + location: SourceLocation(pos=1371, lineno=36, colno=10) + end_location: SourceLocation(pos=1372, lineno=36, colno=11) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=162, lineno=4, colno=12) - end_location: SourceLocation(pos=165, lineno=4, colno=15) + location: SourceLocation(pos=1373, lineno=36, colno=12) + end_location: SourceLocation(pos=1376, lineno=36, colno=15) value: -4.0 prefix: 'relative' - location: SourceLocation(pos=166, lineno=4, colno=16) - end_location: SourceLocation(pos=174, lineno=4, colno=24) + location: SourceLocation(pos=1377, lineno=36, colno=16) + end_location: SourceLocation(pos=1385, lineno=36, colno=24) x: - location: SourceLocation(pos=166, lineno=4, colno=16) - end_location: SourceLocation(pos=168, lineno=4, colno=18) + location: SourceLocation(pos=1377, lineno=36, colno=16) + end_location: SourceLocation(pos=1379, lineno=36, colno=18) value: 3.0 prefix: 'relative' y: - location: SourceLocation(pos=169, lineno=4, colno=19) - end_location: SourceLocation(pos=171, lineno=4, colno=21) + location: SourceLocation(pos=1380, lineno=36, colno=19) + end_location: SourceLocation(pos=1382, lineno=36, colno=21) value: 4.0 prefix: 'relative' z: - location: SourceLocation(pos=172, lineno=4, colno=22) - end_location: SourceLocation(pos=174, lineno=4, colno=24) + location: SourceLocation(pos=1383, lineno=36, colno=22) + end_location: SourceLocation(pos=1385, lineno=36, colno=24) value: 4.0 prefix: 'relative' - location: SourceLocation(pos=175, lineno=4, colno=25) - end_location: SourceLocation(pos=190, lineno=4, colno=40) + location: SourceLocation(pos=1386, lineno=36, colno=25) + end_location: SourceLocation(pos=1401, lineno=36, colno=40) identifier: - location: SourceLocation(pos=175, lineno=4, colno=25) - end_location: SourceLocation(pos=190, lineno=4, colno=40) + location: SourceLocation(pos=1386, lineno=36, colno=25) + end_location: SourceLocation(pos=1401, lineno=36, colno=40) is_tag: False namespace: - location: SourceLocation(pos=175, lineno=4, colno=25) - end_location: SourceLocation(pos=184, lineno=4, colno=34) + location: SourceLocation(pos=1386, lineno=36, colno=25) + end_location: SourceLocation(pos=1395, lineno=36, colno=34) value: 'minecraft' path: - location: SourceLocation(pos=185, lineno=4, colno=35) - end_location: SourceLocation(pos=190, lineno=4, colno=40) + location: SourceLocation(pos=1396, lineno=36, colno=35) + end_location: SourceLocation(pos=1401, lineno=36, colno=40) value: 'stone' block_states: data_tags: None - location: SourceLocation(pos=198, lineno=5, colno=1) - end_location: SourceLocation(pos=235, lineno=5, colno=38) + location: SourceLocation(pos=1409, lineno=37, colno=1) + end_location: SourceLocation(pos=1446, lineno=37, colno=38) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=203, lineno=5, colno=6) - end_location: SourceLocation(pos=217, lineno=5, colno=20) + location: SourceLocation(pos=1414, lineno=37, colno=6) + end_location: SourceLocation(pos=1428, lineno=37, colno=20) x: - location: SourceLocation(pos=203, lineno=5, colno=6) - end_location: SourceLocation(pos=207, lineno=5, colno=10) + location: SourceLocation(pos=1414, lineno=37, colno=6) + end_location: SourceLocation(pos=1418, lineno=37, colno=10) value: -15.0 prefix: 'relative' y: - location: SourceLocation(pos=208, lineno=5, colno=11) - end_location: SourceLocation(pos=212, lineno=5, colno=15) + location: SourceLocation(pos=1419, lineno=37, colno=11) + end_location: SourceLocation(pos=1423, lineno=37, colno=15) value: -15.0 prefix: 'relative' z: - location: SourceLocation(pos=213, lineno=5, colno=16) - end_location: SourceLocation(pos=217, lineno=5, colno=20) + location: SourceLocation(pos=1424, lineno=37, colno=16) + end_location: SourceLocation(pos=1428, lineno=37, colno=20) value: -15.0 prefix: 'relative' - location: SourceLocation(pos=218, lineno=5, colno=21) - end_location: SourceLocation(pos=229, lineno=5, colno=32) + location: SourceLocation(pos=1429, lineno=37, colno=21) + end_location: SourceLocation(pos=1440, lineno=37, colno=32) x: - location: SourceLocation(pos=218, lineno=5, colno=21) - end_location: SourceLocation(pos=221, lineno=5, colno=24) + location: SourceLocation(pos=1429, lineno=37, colno=21) + end_location: SourceLocation(pos=1432, lineno=37, colno=24) value: 15.0 prefix: 'relative' y: - location: SourceLocation(pos=222, lineno=5, colno=25) - end_location: SourceLocation(pos=225, lineno=5, colno=28) + location: SourceLocation(pos=1433, lineno=37, colno=25) + end_location: SourceLocation(pos=1436, lineno=37, colno=28) value: 15.0 prefix: 'relative' z: - location: SourceLocation(pos=226, lineno=5, colno=29) - end_location: SourceLocation(pos=229, lineno=5, colno=32) + location: SourceLocation(pos=1437, lineno=37, colno=29) + end_location: SourceLocation(pos=1440, lineno=37, colno=32) value: 15.0 prefix: 'relative' - location: SourceLocation(pos=230, lineno=5, colno=33) - end_location: SourceLocation(pos=235, lineno=5, colno=38) + location: SourceLocation(pos=1441, lineno=37, colno=33) + end_location: SourceLocation(pos=1446, lineno=37, colno=38) identifier: - location: SourceLocation(pos=230, lineno=5, colno=33) - end_location: SourceLocation(pos=235, lineno=5, colno=38) + location: SourceLocation(pos=1441, lineno=37, colno=33) + end_location: SourceLocation(pos=1446, lineno=37, colno=38) is_tag: False namespace: None path: - location: SourceLocation(pos=230, lineno=5, colno=33) - end_location: SourceLocation(pos=235, lineno=5, colno=38) + location: SourceLocation(pos=1441, lineno=37, colno=33) + end_location: SourceLocation(pos=1446, lineno=37, colno=38) value: 'stone' block_states: data_tags: None - location: SourceLocation(pos=236, lineno=6, colno=1) - end_location: SourceLocation(pos=320, lineno=6, colno=85) + location: SourceLocation(pos=1447, lineno=38, colno=1) + end_location: SourceLocation(pos=1531, lineno=38, colno=85) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=241, lineno=6, colno=6) - end_location: SourceLocation(pos=248, lineno=6, colno=13) + location: SourceLocation(pos=1452, lineno=38, colno=6) + end_location: SourceLocation(pos=1459, lineno=38, colno=13) x: - location: SourceLocation(pos=241, lineno=6, colno=6) - end_location: SourceLocation(pos=244, lineno=6, colno=9) + location: SourceLocation(pos=1452, lineno=38, colno=6) + end_location: SourceLocation(pos=1455, lineno=38, colno=9) value: -1.0 prefix: 'relative' y: - location: SourceLocation(pos=245, lineno=6, colno=10) - end_location: SourceLocation(pos=246, lineno=6, colno=11) + location: SourceLocation(pos=1456, lineno=38, colno=10) + end_location: SourceLocation(pos=1457, lineno=38, colno=11) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=247, lineno=6, colno=12) - end_location: SourceLocation(pos=248, lineno=6, colno=13) + location: SourceLocation(pos=1458, lineno=38, colno=12) + end_location: SourceLocation(pos=1459, lineno=38, colno=13) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=249, lineno=6, colno=14) - end_location: SourceLocation(pos=255, lineno=6, colno=20) + location: SourceLocation(pos=1460, lineno=38, colno=14) + end_location: SourceLocation(pos=1466, lineno=38, colno=20) x: - location: SourceLocation(pos=249, lineno=6, colno=14) - end_location: SourceLocation(pos=251, lineno=6, colno=16) + location: SourceLocation(pos=1460, lineno=38, colno=14) + end_location: SourceLocation(pos=1462, lineno=38, colno=16) value: 1.0 prefix: 'relative' y: - location: SourceLocation(pos=252, lineno=6, colno=17) - end_location: SourceLocation(pos=253, lineno=6, colno=18) + location: SourceLocation(pos=1463, lineno=38, colno=17) + end_location: SourceLocation(pos=1464, lineno=38, colno=18) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=254, lineno=6, colno=19) - end_location: SourceLocation(pos=255, lineno=6, colno=20) + location: SourceLocation(pos=1465, lineno=38, colno=19) + end_location: SourceLocation(pos=1466, lineno=38, colno=20) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=256, lineno=6, colno=21) - end_location: SourceLocation(pos=320, lineno=6, colno=85) + location: SourceLocation(pos=1467, lineno=38, colno=21) + end_location: SourceLocation(pos=1531, lineno=38, colno=85) + identifier: + + location: SourceLocation(pos=1467, lineno=38, colno=21) + end_location: SourceLocation(pos=1500, lineno=38, colno=54) + is_tag: False + namespace: + + location: SourceLocation(pos=1467, lineno=38, colno=21) + end_location: SourceLocation(pos=1476, lineno=38, colno=30) + value: 'minecraft' + path: + + location: SourceLocation(pos=1477, lineno=38, colno=31) + end_location: SourceLocation(pos=1500, lineno=38, colno=54) + value: 'prismarine_brick_stairs' + block_states: + + location: SourceLocation(pos=1501, lineno=38, colno=55) + end_location: SourceLocation(pos=1513, lineno=38, colno=67) + key: + + location: SourceLocation(pos=1501, lineno=38, colno=55) + end_location: SourceLocation(pos=1507, lineno=38, colno=61) + value: 'facing' + value: + + location: SourceLocation(pos=1508, lineno=38, colno=62) + end_location: SourceLocation(pos=1513, lineno=38, colno=67) + value: 'south' + + location: SourceLocation(pos=1514, lineno=38, colno=68) + end_location: SourceLocation(pos=1530, lineno=38, colno=84) + key: + + location: SourceLocation(pos=1514, lineno=38, colno=68) + end_location: SourceLocation(pos=1525, lineno=38, colno=79) + value: 'waterlogged' + value: + + location: SourceLocation(pos=1526, lineno=38, colno=80) + end_location: SourceLocation(pos=1530, lineno=38, colno=84) + value: 'true' + data_tags: None + + location: SourceLocation(pos=1543, lineno=40, colno=1) + end_location: SourceLocation(pos=1571, lineno=40, colno=29) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=1552, lineno=40, colno=10) + end_location: SourceLocation(pos=1571, lineno=40, colno=29) + is_tag: False + namespace: + + location: SourceLocation(pos=1552, lineno=40, colno=10) + end_location: SourceLocation(pos=1558, lineno=40, colno=16) + value: 'custom' + path: + + location: SourceLocation(pos=1559, lineno=40, colno=17) + end_location: SourceLocation(pos=1571, lineno=40, colno=29) + value: 'example/test' + + location: SourceLocation(pos=1572, lineno=41, colno=1) + end_location: SourceLocation(pos=1601, lineno=41, colno=30) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=1581, lineno=41, colno=10) + end_location: SourceLocation(pos=1601, lineno=41, colno=30) + is_tag: True + namespace: + + location: SourceLocation(pos=1582, lineno=41, colno=11) + end_location: SourceLocation(pos=1588, lineno=41, colno=17) + value: 'custom' + path: + + location: SourceLocation(pos=1589, lineno=41, colno=18) + end_location: SourceLocation(pos=1601, lineno=41, colno=30) + value: 'example/test' + + location: SourceLocation(pos=1613, lineno=43, colno=1) + end_location: SourceLocation(pos=1613, lineno=43, colno=1) + identifier: 'gamemode:creative' + arguments: + + + location: SourceLocation(pos=1631, lineno=44, colno=1) + end_location: SourceLocation(pos=1651, lineno=44, colno=21) + identifier: 'gamemode:survival:target' + arguments: + + location: SourceLocation(pos=1649, lineno=44, colno=19) + end_location: SourceLocation(pos=1651, lineno=44, colno=21) + variable: 'a' + arguments: + + + location: SourceLocation(pos=1663, lineno=46, colno=1) + end_location: SourceLocation(pos=1693, lineno=46, colno=31) + identifier: 'gamerule:doDaylightCycle:value' + arguments: + + location: SourceLocation(pos=1688, lineno=46, colno=26) + end_location: SourceLocation(pos=1693, lineno=46, colno=31) + value: False + + location: SourceLocation(pos=1694, lineno=47, colno=1) + end_location: SourceLocation(pos=1728, lineno=47, colno=35) + identifier: 'gamerule:naturalRegeneration:value' + arguments: + + location: SourceLocation(pos=1723, lineno=47, colno=30) + end_location: SourceLocation(pos=1728, lineno=47, colno=35) + value: False + + location: SourceLocation(pos=1729, lineno=48, colno=1) + end_location: SourceLocation(pos=1755, lineno=48, colno=27) + identifier: 'gamerule:mobGriefing:value' + arguments: + + location: SourceLocation(pos=1750, lineno=48, colno=22) + end_location: SourceLocation(pos=1755, lineno=48, colno=27) + value: False + + location: SourceLocation(pos=1756, lineno=49, colno=1) + end_location: SourceLocation(pos=1785, lineno=49, colno=30) + identifier: 'gamerule:doWeatherCycle:value' + arguments: + + location: SourceLocation(pos=1780, lineno=49, colno=25) + end_location: SourceLocation(pos=1785, lineno=49, colno=30) + value: False + + location: SourceLocation(pos=1786, lineno=50, colno=1) + end_location: SourceLocation(pos=1813, lineno=50, colno=28) + identifier: 'gamerule:keepInventory:value' + arguments: + + location: SourceLocation(pos=1809, lineno=50, colno=24) + end_location: SourceLocation(pos=1813, lineno=50, colno=28) + value: True + + location: SourceLocation(pos=1814, lineno=51, colno=1) + end_location: SourceLocation(pos=1847, lineno=51, colno=34) + identifier: 'gamerule:commandBlockOutput:value' + arguments: + + location: SourceLocation(pos=1842, lineno=51, colno=29) + end_location: SourceLocation(pos=1847, lineno=51, colno=34) + value: False + + location: SourceLocation(pos=1848, lineno=52, colno=1) + end_location: SourceLocation(pos=1873, lineno=52, colno=26) + identifier: 'gamerule:doInsomnia:value' + arguments: + + location: SourceLocation(pos=1868, lineno=52, colno=21) + end_location: SourceLocation(pos=1873, lineno=52, colno=26) + value: False + + location: SourceLocation(pos=1881, lineno=54, colno=1) + end_location: SourceLocation(pos=1957, lineno=54, colno=77) + identifier: 'give:targets:item:count' + arguments: + + location: SourceLocation(pos=1886, lineno=54, colno=6) + end_location: SourceLocation(pos=1888, lineno=54, colno=8) + variable: 'p' + arguments: + + + location: SourceLocation(pos=1889, lineno=54, colno=9) + end_location: SourceLocation(pos=1955, lineno=54, colno=75) + identifier: + + location: SourceLocation(pos=1889, lineno=54, colno=9) + end_location: SourceLocation(pos=1912, lineno=54, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=1889, lineno=54, colno=9) + end_location: SourceLocation(pos=1898, lineno=54, colno=18) + value: 'minecraft' + path: + + location: SourceLocation(pos=1899, lineno=54, colno=19) + end_location: SourceLocation(pos=1912, lineno=54, colno=32) + value: 'diamond_sword' + data_tags: + + location: SourceLocation(pos=1912, lineno=54, colno=32) + end_location: SourceLocation(pos=1955, lineno=54, colno=75) + entries: + + location: SourceLocation(pos=1913, lineno=54, colno=33) + end_location: SourceLocation(pos=1954, lineno=54, colno=74) + key: + + location: SourceLocation(pos=1913, lineno=54, colno=33) + end_location: SourceLocation(pos=1920, lineno=54, colno=40) + value: 'display' + value: + + location: SourceLocation(pos=1922, lineno=54, colno=42) + end_location: SourceLocation(pos=1954, lineno=54, colno=74) + entries: + + location: SourceLocation(pos=1923, lineno=54, colno=43) + end_location: SourceLocation(pos=1953, lineno=54, colno=73) + key: + + location: SourceLocation(pos=1923, lineno=54, colno=43) + end_location: SourceLocation(pos=1927, lineno=54, colno=47) + value: 'Lore' + value: + + location: SourceLocation(pos=1929, lineno=54, colno=49) + end_location: SourceLocation(pos=1953, lineno=54, colno=73) + elements: + + location: SourceLocation(pos=1930, lineno=54, colno=50) + end_location: SourceLocation(pos=1952, lineno=54, colno=72) + value: String('"A legendary weapon"') + + location: SourceLocation(pos=1956, lineno=54, colno=76) + end_location: SourceLocation(pos=1957, lineno=54, colno=77) + value: 1 + + location: SourceLocation(pos=1958, lineno=55, colno=1) + end_location: SourceLocation(pos=2008, lineno=55, colno=51) + identifier: 'give:targets:item:count' + arguments: + + location: SourceLocation(pos=1963, lineno=55, colno=6) + end_location: SourceLocation(pos=1965, lineno=55, colno=8) + variable: 'a' + arguments: + + + location: SourceLocation(pos=1966, lineno=55, colno=9) + end_location: SourceLocation(pos=2006, lineno=55, colno=49) + identifier: + + location: SourceLocation(pos=1966, lineno=55, colno=9) + end_location: SourceLocation(pos=1972, lineno=55, colno=15) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1966, lineno=55, colno=9) + end_location: SourceLocation(pos=1972, lineno=55, colno=15) + value: 'potion' + data_tags: + + location: SourceLocation(pos=1972, lineno=55, colno=15) + end_location: SourceLocation(pos=2006, lineno=55, colno=49) + entries: + + location: SourceLocation(pos=1973, lineno=55, colno=16) + end_location: SourceLocation(pos=2005, lineno=55, colno=48) + key: + + location: SourceLocation(pos=1973, lineno=55, colno=16) + end_location: SourceLocation(pos=1979, lineno=55, colno=22) + value: 'Potion' + value: + + location: SourceLocation(pos=1981, lineno=55, colno=24) + end_location: SourceLocation(pos=2005, lineno=55, colno=48) + value: String('minecraft:night_vision') + + location: SourceLocation(pos=2007, lineno=55, colno=50) + end_location: SourceLocation(pos=2008, lineno=55, colno=51) + value: 1 + + location: SourceLocation(pos=2009, lineno=56, colno=1) + end_location: SourceLocation(pos=2086, lineno=56, colno=78) + identifier: 'give:targets:item:count' + arguments: + + location: SourceLocation(pos=2014, lineno=56, colno=6) + end_location: SourceLocation(pos=2016, lineno=56, colno=8) + variable: 'r' + arguments: + + + location: SourceLocation(pos=2017, lineno=56, colno=9) + end_location: SourceLocation(pos=2084, lineno=56, colno=76) + identifier: + + location: SourceLocation(pos=2017, lineno=56, colno=9) + end_location: SourceLocation(pos=2030, lineno=56, colno=22) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2017, lineno=56, colno=9) + end_location: SourceLocation(pos=2030, lineno=56, colno=22) + value: 'diamond_sword' + data_tags: + + location: SourceLocation(pos=2030, lineno=56, colno=22) + end_location: SourceLocation(pos=2084, lineno=56, colno=76) + entries: + + location: SourceLocation(pos=2031, lineno=56, colno=23) + end_location: SourceLocation(pos=2083, lineno=56, colno=75) + key: + + location: SourceLocation(pos=2031, lineno=56, colno=23) + end_location: SourceLocation(pos=2043, lineno=56, colno=35) + value: 'Enchantments' + value: + + location: SourceLocation(pos=2045, lineno=56, colno=37) + end_location: SourceLocation(pos=2083, lineno=56, colno=75) + elements: + + location: SourceLocation(pos=2046, lineno=56, colno=38) + end_location: SourceLocation(pos=2082, lineno=56, colno=74) + entries: + + location: SourceLocation(pos=2047, lineno=56, colno=39) + end_location: SourceLocation(pos=2072, lineno=56, colno=64) + key: + + location: SourceLocation(pos=2047, lineno=56, colno=39) + end_location: SourceLocation(pos=2049, lineno=56, colno=41) + value: 'id' + value: + + location: SourceLocation(pos=2051, lineno=56, colno=43) + end_location: SourceLocation(pos=2072, lineno=56, colno=64) + value: String('minecraft:sharpness') + + location: SourceLocation(pos=2074, lineno=56, colno=66) + end_location: SourceLocation(pos=2081, lineno=56, colno=73) + key: + + location: SourceLocation(pos=2074, lineno=56, colno=66) + end_location: SourceLocation(pos=2077, lineno=56, colno=69) + value: 'lvl' + value: + + location: SourceLocation(pos=2079, lineno=56, colno=71) + end_location: SourceLocation(pos=2081, lineno=56, colno=73) + value: Int(10) + + location: SourceLocation(pos=2085, lineno=56, colno=77) + end_location: SourceLocation(pos=2086, lineno=56, colno=78) + value: 1 + + location: SourceLocation(pos=2087, lineno=57, colno=1) + end_location: SourceLocation(pos=2150, lineno=57, colno=64) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=2092, lineno=57, colno=6) + end_location: SourceLocation(pos=2094, lineno=57, colno=8) + variable: 's' + arguments: + + + location: SourceLocation(pos=2095, lineno=57, colno=9) + end_location: SourceLocation(pos=2150, lineno=57, colno=64) + identifier: + + location: SourceLocation(pos=2095, lineno=57, colno=9) + end_location: SourceLocation(pos=2118, lineno=57, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=2095, lineno=57, colno=9) + end_location: SourceLocation(pos=2104, lineno=57, colno=18) + value: 'minecraft' + path: + + location: SourceLocation(pos=2105, lineno=57, colno=19) + end_location: SourceLocation(pos=2118, lineno=57, colno=32) + value: 'diamond_block' + data_tags: + + location: SourceLocation(pos=2118, lineno=57, colno=32) + end_location: SourceLocation(pos=2150, lineno=57, colno=64) + entries: + + location: SourceLocation(pos=2119, lineno=57, colno=33) + end_location: SourceLocation(pos=2149, lineno=57, colno=63) + key: + + location: SourceLocation(pos=2119, lineno=57, colno=33) + end_location: SourceLocation(pos=2129, lineno=57, colno=43) + value: 'CanPlaceOn' + value: + + location: SourceLocation(pos=2131, lineno=57, colno=45) + end_location: SourceLocation(pos=2149, lineno=57, colno=63) + elements: + + location: SourceLocation(pos=2132, lineno=57, colno=46) + end_location: SourceLocation(pos=2148, lineno=57, colno=62) + value: String('minecraft:dirt') + + location: SourceLocation(pos=2151, lineno=58, colno=1) + end_location: SourceLocation(pos=2268, lineno=58, colno=118) + identifier: 'give:targets:item:count' + arguments: + + location: SourceLocation(pos=2156, lineno=58, colno=6) + end_location: SourceLocation(pos=2158, lineno=58, colno=8) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2159, lineno=58, colno=9) + end_location: SourceLocation(pos=2266, lineno=58, colno=116) + identifier: + + location: SourceLocation(pos=2159, lineno=58, colno=9) + end_location: SourceLocation(pos=2165, lineno=58, colno=15) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2159, lineno=58, colno=9) + end_location: SourceLocation(pos=2165, lineno=58, colno=15) + value: 'potion' + data_tags: + + location: SourceLocation(pos=2165, lineno=58, colno=15) + end_location: SourceLocation(pos=2266, lineno=58, colno=116) + entries: + + location: SourceLocation(pos=2166, lineno=58, colno=16) + end_location: SourceLocation(pos=2218, lineno=58, colno=68) + key: + + location: SourceLocation(pos=2166, lineno=58, colno=16) + end_location: SourceLocation(pos=2178, lineno=58, colno=28) + value: 'Enchantments' + value: + + location: SourceLocation(pos=2180, lineno=58, colno=30) + end_location: SourceLocation(pos=2218, lineno=58, colno=68) + elements: + + location: SourceLocation(pos=2181, lineno=58, colno=31) + end_location: SourceLocation(pos=2217, lineno=58, colno=67) + entries: + + location: SourceLocation(pos=2182, lineno=58, colno=32) + end_location: SourceLocation(pos=2207, lineno=58, colno=57) + key: + + location: SourceLocation(pos=2182, lineno=58, colno=32) + end_location: SourceLocation(pos=2184, lineno=58, colno=34) + value: 'id' + value: + + location: SourceLocation(pos=2186, lineno=58, colno=36) + end_location: SourceLocation(pos=2207, lineno=58, colno=57) + value: String('minecraft:knockback') + + location: SourceLocation(pos=2209, lineno=58, colno=59) + end_location: SourceLocation(pos=2216, lineno=58, colno=66) + key: + + location: SourceLocation(pos=2209, lineno=58, colno=59) + end_location: SourceLocation(pos=2212, lineno=58, colno=62) + value: 'lvl' + value: + + location: SourceLocation(pos=2214, lineno=58, colno=64) + end_location: SourceLocation(pos=2216, lineno=58, colno=66) + value: Int(10) + + location: SourceLocation(pos=2220, lineno=58, colno=70) + end_location: SourceLocation(pos=2265, lineno=58, colno=115) + key: + + location: SourceLocation(pos=2220, lineno=58, colno=70) + end_location: SourceLocation(pos=2239, lineno=58, colno=89) + value: 'CustomPotionEffects' + value: + + location: SourceLocation(pos=2241, lineno=58, colno=91) + end_location: SourceLocation(pos=2265, lineno=58, colno=115) + elements: + + location: SourceLocation(pos=2242, lineno=58, colno=92) + end_location: SourceLocation(pos=2264, lineno=58, colno=114) + entries: + + location: SourceLocation(pos=2243, lineno=58, colno=93) + end_location: SourceLocation(pos=2249, lineno=58, colno=99) + key: + + location: SourceLocation(pos=2243, lineno=58, colno=93) + end_location: SourceLocation(pos=2245, lineno=58, colno=95) + value: 'Id' + value: + + location: SourceLocation(pos=2247, lineno=58, colno=97) + end_location: SourceLocation(pos=2249, lineno=58, colno=99) + value: Int(20) + + location: SourceLocation(pos=2251, lineno=58, colno=101) + end_location: SourceLocation(pos=2263, lineno=58, colno=113) + key: + + location: SourceLocation(pos=2251, lineno=58, colno=101) + end_location: SourceLocation(pos=2260, lineno=58, colno=110) + value: 'Amplifier' + value: + + location: SourceLocation(pos=2262, lineno=58, colno=112) + end_location: SourceLocation(pos=2263, lineno=58, colno=113) + value: Int(1) + + location: SourceLocation(pos=2267, lineno=58, colno=117) + end_location: SourceLocation(pos=2268, lineno=58, colno=118) + value: 1 + + location: SourceLocation(pos=2276, lineno=60, colno=1) + end_location: SourceLocation(pos=2346, lineno=60, colno=71) + identifier: 'item:replace:block:pos:slot:with:item:count' + arguments: + + location: SourceLocation(pos=2295, lineno=60, colno=20) + end_location: SourceLocation(pos=2301, lineno=60, colno=26) + x: + + location: SourceLocation(pos=2295, lineno=60, colno=20) + end_location: SourceLocation(pos=2296, lineno=60, colno=21) + value: 0.0 + prefix: 'relative' + y: + + location: SourceLocation(pos=2297, lineno=60, colno=22) + end_location: SourceLocation(pos=2299, lineno=60, colno=24) + value: 2.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=2300, lineno=60, colno=25) + end_location: SourceLocation(pos=2301, lineno=60, colno=26) + value: 0.0 + prefix: 'relative' + + location: SourceLocation(pos=2302, lineno=60, colno=27) + end_location: SourceLocation(pos=2314, lineno=60, colno=39) + value: 'container.26' + + location: SourceLocation(pos=2320, lineno=60, colno=45) + end_location: SourceLocation(pos=2344, lineno=60, colno=69) identifier: - location: SourceLocation(pos=256, lineno=6, colno=21) - end_location: SourceLocation(pos=289, lineno=6, colno=54) + location: SourceLocation(pos=2320, lineno=60, colno=45) + end_location: SourceLocation(pos=2344, lineno=60, colno=69) is_tag: False namespace: - location: SourceLocation(pos=256, lineno=6, colno=21) - end_location: SourceLocation(pos=265, lineno=6, colno=30) + location: SourceLocation(pos=2320, lineno=60, colno=45) + end_location: SourceLocation(pos=2329, lineno=60, colno=54) value: 'minecraft' path: - location: SourceLocation(pos=266, lineno=6, colno=31) - end_location: SourceLocation(pos=289, lineno=6, colno=54) - value: 'prismarine_brick_stairs' - block_states: - - location: SourceLocation(pos=290, lineno=6, colno=55) - end_location: SourceLocation(pos=302, lineno=6, colno=67) - key: - - location: SourceLocation(pos=290, lineno=6, colno=55) - end_location: SourceLocation(pos=296, lineno=6, colno=61) - value: 'facing' - value: - - location: SourceLocation(pos=297, lineno=6, colno=62) - end_location: SourceLocation(pos=302, lineno=6, colno=67) - value: 'south' - - location: SourceLocation(pos=303, lineno=6, colno=68) - end_location: SourceLocation(pos=319, lineno=6, colno=84) - key: - - location: SourceLocation(pos=303, lineno=6, colno=68) - end_location: SourceLocation(pos=314, lineno=6, colno=79) - value: 'waterlogged' - value: - - location: SourceLocation(pos=315, lineno=6, colno=80) - end_location: SourceLocation(pos=319, lineno=6, colno=84) - value: 'true' + location: SourceLocation(pos=2330, lineno=60, colno=55) + end_location: SourceLocation(pos=2344, lineno=60, colno=69) + value: 'spruce_sapling' data_tags: None + + location: SourceLocation(pos=2345, lineno=60, colno=70) + end_location: SourceLocation(pos=2346, lineno=60, colno=71) + value: 4 - location: SourceLocation(pos=321, lineno=7, colno=1) - end_location: SourceLocation(pos=349, lineno=7, colno=29) - identifier: 'function:name' + location: SourceLocation(pos=2347, lineno=61, colno=1) + end_location: SourceLocation(pos=2410, lineno=61, colno=64) + identifier: 'item:replace:entity:targets:slot:with:item:count' arguments: - - location: SourceLocation(pos=330, lineno=7, colno=10) - end_location: SourceLocation(pos=349, lineno=7, colno=29) - is_tag: False - namespace: - - location: SourceLocation(pos=330, lineno=7, colno=10) - end_location: SourceLocation(pos=336, lineno=7, colno=16) - value: 'custom' - path: - - location: SourceLocation(pos=337, lineno=7, colno=17) - end_location: SourceLocation(pos=349, lineno=7, colno=29) - value: 'example/test' + + location: SourceLocation(pos=2367, lineno=61, colno=21) + end_location: SourceLocation(pos=2369, lineno=61, colno=23) + variable: 'p' + arguments: + + + location: SourceLocation(pos=2370, lineno=61, colno=24) + end_location: SourceLocation(pos=2378, lineno=61, colno=32) + value: 'hotbar.8' + + location: SourceLocation(pos=2384, lineno=61, colno=38) + end_location: SourceLocation(pos=2408, lineno=61, colno=62) + identifier: + + location: SourceLocation(pos=2384, lineno=61, colno=38) + end_location: SourceLocation(pos=2408, lineno=61, colno=62) + is_tag: False + namespace: + + location: SourceLocation(pos=2384, lineno=61, colno=38) + end_location: SourceLocation(pos=2393, lineno=61, colno=47) + value: 'minecraft' + path: + + location: SourceLocation(pos=2394, lineno=61, colno=48) + end_location: SourceLocation(pos=2408, lineno=61, colno=62) + value: 'spruce_sapling' + data_tags: None + + location: SourceLocation(pos=2409, lineno=61, colno=63) + end_location: SourceLocation(pos=2410, lineno=61, colno=64) + value: 4 - location: SourceLocation(pos=350, lineno=8, colno=1) - end_location: SourceLocation(pos=379, lineno=8, colno=30) - identifier: 'function:name' + location: SourceLocation(pos=2411, lineno=62, colno=1) + end_location: SourceLocation(pos=2479, lineno=62, colno=69) + identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' arguments: - - location: SourceLocation(pos=359, lineno=8, colno=10) - end_location: SourceLocation(pos=379, lineno=8, colno=30) - is_tag: True - namespace: - - location: SourceLocation(pos=360, lineno=8, colno=11) - end_location: SourceLocation(pos=366, lineno=8, colno=17) - value: 'custom' - path: - - location: SourceLocation(pos=367, lineno=8, colno=18) - end_location: SourceLocation(pos=379, lineno=8, colno=30) - value: 'example/test' + + location: SourceLocation(pos=2431, lineno=62, colno=21) + end_location: SourceLocation(pos=2433, lineno=62, colno=23) + variable: 's' + arguments: + + + location: SourceLocation(pos=2434, lineno=62, colno=24) + end_location: SourceLocation(pos=2448, lineno=62, colno=38) + value: 'weapon.offhand' + + location: SourceLocation(pos=2461, lineno=62, colno=51) + end_location: SourceLocation(pos=2463, lineno=62, colno=53) + variable: 's' + arguments: + + + location: SourceLocation(pos=2464, lineno=62, colno=54) + end_location: SourceLocation(pos=2479, lineno=62, colno=69) + value: 'weapon.mainhand' - location: SourceLocation(pos=380, lineno=9, colno=1) - end_location: SourceLocation(pos=410, lineno=9, colno=31) - identifier: 'gamerule:doDaylightCycle:value' + location: SourceLocation(pos=2487, lineno=64, colno=1) + end_location: SourceLocation(pos=2494, lineno=64, colno=8) + identifier: 'kill:targets' arguments: - - location: SourceLocation(pos=405, lineno=9, colno=26) - end_location: SourceLocation(pos=410, lineno=9, colno=31) - value: False + + location: SourceLocation(pos=2492, lineno=64, colno=6) + end_location: SourceLocation(pos=2494, lineno=64, colno=8) + variable: 's' + arguments: + - location: SourceLocation(pos=411, lineno=10, colno=1) - end_location: SourceLocation(pos=445, lineno=10, colno=35) - identifier: 'gamerule:naturalRegeneration:value' + location: SourceLocation(pos=2495, lineno=65, colno=1) + end_location: SourceLocation(pos=2505, lineno=65, colno=11) + identifier: 'kill:targets' arguments: - location: SourceLocation(pos=440, lineno=10, colno=30) - end_location: SourceLocation(pos=445, lineno=10, colno=35) - value: False + location: SourceLocation(pos=2500, lineno=65, colno=6) + end_location: SourceLocation(pos=2505, lineno=65, colno=11) + value: 'Steve' - location: SourceLocation(pos=446, lineno=11, colno=1) - end_location: SourceLocation(pos=472, lineno=11, colno=27) - identifier: 'gamerule:mobGriefing:value' + location: SourceLocation(pos=2506, lineno=66, colno=1) + end_location: SourceLocation(pos=2524, lineno=66, colno=19) + identifier: 'kill:targets' arguments: - - location: SourceLocation(pos=467, lineno=11, colno=22) - end_location: SourceLocation(pos=472, lineno=11, colno=27) - value: False + + location: SourceLocation(pos=2511, lineno=66, colno=6) + end_location: SourceLocation(pos=2524, lineno=66, colno=19) + variable: 'e' + arguments: + + location: SourceLocation(pos=2514, lineno=66, colno=9) + end_location: SourceLocation(pos=2523, lineno=66, colno=18) + inverted: False + key: + + location: SourceLocation(pos=2514, lineno=66, colno=9) + end_location: SourceLocation(pos=2518, lineno=66, colno=13) + value: 'type' + value: + + location: SourceLocation(pos=2519, lineno=66, colno=14) + end_location: SourceLocation(pos=2523, lineno=66, colno=18) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2519, lineno=66, colno=14) + end_location: SourceLocation(pos=2523, lineno=66, colno=18) + value: 'item' - location: SourceLocation(pos=473, lineno=12, colno=1) - end_location: SourceLocation(pos=502, lineno=12, colno=30) - identifier: 'gamerule:doWeatherCycle:value' + location: SourceLocation(pos=2525, lineno=67, colno=1) + end_location: SourceLocation(pos=2547, lineno=67, colno=23) + identifier: 'kill:targets' arguments: - - location: SourceLocation(pos=497, lineno=12, colno=25) - end_location: SourceLocation(pos=502, lineno=12, colno=30) - value: False + + location: SourceLocation(pos=2530, lineno=67, colno=6) + end_location: SourceLocation(pos=2547, lineno=67, colno=23) + variable: 'e' + arguments: + + location: SourceLocation(pos=2533, lineno=67, colno=9) + end_location: SourceLocation(pos=2546, lineno=67, colno=22) + inverted: False + key: + + location: SourceLocation(pos=2533, lineno=67, colno=9) + end_location: SourceLocation(pos=2541, lineno=67, colno=17) + value: 'distance' + value: + + location: SourceLocation(pos=2542, lineno=67, colno=18) + end_location: SourceLocation(pos=2546, lineno=67, colno=22) + min: None + max: 10.0 - location: SourceLocation(pos=503, lineno=13, colno=1) - end_location: SourceLocation(pos=530, lineno=13, colno=28) - identifier: 'gamerule:keepInventory:value' + location: SourceLocation(pos=2548, lineno=68, colno=1) + end_location: SourceLocation(pos=2569, lineno=68, colno=22) + identifier: 'kill:targets' arguments: - - location: SourceLocation(pos=526, lineno=13, colno=24) - end_location: SourceLocation(pos=530, lineno=13, colno=28) - value: True + + location: SourceLocation(pos=2553, lineno=68, colno=6) + end_location: SourceLocation(pos=2569, lineno=68, colno=22) + variable: 'e' + arguments: + + location: SourceLocation(pos=2556, lineno=68, colno=9) + end_location: SourceLocation(pos=2568, lineno=68, colno=21) + inverted: True + key: + + location: SourceLocation(pos=2556, lineno=68, colno=9) + end_location: SourceLocation(pos=2560, lineno=68, colno=13) + value: 'type' + value: + + location: SourceLocation(pos=2562, lineno=68, colno=15) + end_location: SourceLocation(pos=2568, lineno=68, colno=21) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2562, lineno=68, colno=15) + end_location: SourceLocation(pos=2568, lineno=68, colno=21) + value: 'player' - location: SourceLocation(pos=531, lineno=14, colno=1) - end_location: SourceLocation(pos=564, lineno=14, colno=34) - identifier: 'gamerule:commandBlockOutput:value' + location: SourceLocation(pos=2570, lineno=69, colno=1) + end_location: SourceLocation(pos=2605, lineno=69, colno=36) + identifier: 'kill:targets' arguments: - - location: SourceLocation(pos=559, lineno=14, colno=29) - end_location: SourceLocation(pos=564, lineno=14, colno=34) - value: False + + location: SourceLocation(pos=2575, lineno=69, colno=6) + end_location: SourceLocation(pos=2605, lineno=69, colno=36) + variable: 'e' + arguments: + + location: SourceLocation(pos=2578, lineno=69, colno=9) + end_location: SourceLocation(pos=2591, lineno=69, colno=22) + inverted: False + key: + + location: SourceLocation(pos=2578, lineno=69, colno=9) + end_location: SourceLocation(pos=2586, lineno=69, colno=17) + value: 'distance' + value: + + location: SourceLocation(pos=2587, lineno=69, colno=18) + end_location: SourceLocation(pos=2591, lineno=69, colno=22) + min: None + max: 10.0 + + location: SourceLocation(pos=2592, lineno=69, colno=23) + end_location: SourceLocation(pos=2604, lineno=69, colno=35) + inverted: False + key: + + location: SourceLocation(pos=2592, lineno=69, colno=23) + end_location: SourceLocation(pos=2596, lineno=69, colno=27) + value: 'type' + value: + + location: SourceLocation(pos=2597, lineno=69, colno=28) + end_location: SourceLocation(pos=2604, lineno=69, colno=35) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2597, lineno=69, colno=28) + end_location: SourceLocation(pos=2604, lineno=69, colno=35) + value: 'creeper' - location: SourceLocation(pos=565, lineno=15, colno=1) - end_location: SourceLocation(pos=590, lineno=15, colno=26) - identifier: 'gamerule:doInsomnia:value' + location: SourceLocation(pos=2606, lineno=70, colno=1) + end_location: SourceLocation(pos=2672, lineno=70, colno=67) + identifier: 'kill:targets' arguments: - - location: SourceLocation(pos=585, lineno=15, colno=21) - end_location: SourceLocation(pos=590, lineno=15, colno=26) - value: False + + location: SourceLocation(pos=2611, lineno=70, colno=6) + end_location: SourceLocation(pos=2672, lineno=70, colno=67) + variable: 'e' + arguments: + + location: SourceLocation(pos=2614, lineno=70, colno=9) + end_location: SourceLocation(pos=2624, lineno=70, colno=19) + inverted: False + key: + + location: SourceLocation(pos=2614, lineno=70, colno=9) + end_location: SourceLocation(pos=2618, lineno=70, colno=13) + value: 'type' + value: + + location: SourceLocation(pos=2619, lineno=70, colno=14) + end_location: SourceLocation(pos=2624, lineno=70, colno=19) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2619, lineno=70, colno=14) + end_location: SourceLocation(pos=2624, lineno=70, colno=19) + value: 'arrow' + + location: SourceLocation(pos=2625, lineno=70, colno=20) + end_location: SourceLocation(pos=2671, lineno=70, colno=66) + inverted: False + key: + + location: SourceLocation(pos=2625, lineno=70, colno=20) + end_location: SourceLocation(pos=2628, lineno=70, colno=23) + value: 'nbt' + value: + + location: SourceLocation(pos=2629, lineno=70, colno=24) + end_location: SourceLocation(pos=2671, lineno=70, colno=66) + entries: + + location: SourceLocation(pos=2630, lineno=70, colno=25) + end_location: SourceLocation(pos=2670, lineno=70, colno=65) + key: + + location: SourceLocation(pos=2630, lineno=70, colno=25) + end_location: SourceLocation(pos=2642, lineno=70, colno=37) + value: 'inBlockState' + value: + + location: SourceLocation(pos=2644, lineno=70, colno=39) + end_location: SourceLocation(pos=2670, lineno=70, colno=65) + entries: + + location: SourceLocation(pos=2645, lineno=70, colno=40) + end_location: SourceLocation(pos=2669, lineno=70, colno=64) + key: + + location: SourceLocation(pos=2645, lineno=70, colno=40) + end_location: SourceLocation(pos=2649, lineno=70, colno=44) + value: 'Name' + value: + + location: SourceLocation(pos=2651, lineno=70, colno=46) + end_location: SourceLocation(pos=2669, lineno=70, colno=64) + value: String('minecraft:target') - location: SourceLocation(pos=591, lineno=16, colno=1) - end_location: SourceLocation(pos=591, lineno=16, colno=1) + location: SourceLocation(pos=2682, lineno=72, colno=1) + end_location: SourceLocation(pos=2682, lineno=72, colno=1) identifier: 'locate:mansion' arguments: - location: SourceLocation(pos=606, lineno=17, colno=1) - end_location: SourceLocation(pos=615, lineno=17, colno=10) + location: SourceLocation(pos=2703, lineno=74, colno=1) + end_location: SourceLocation(pos=2712, lineno=74, colno=10) identifier: 'msg:targets:message' arguments: - location: SourceLocation(pos=610, lineno=17, colno=5) - end_location: SourceLocation(pos=612, lineno=17, colno=7) + location: SourceLocation(pos=2707, lineno=74, colno=5) + end_location: SourceLocation(pos=2709, lineno=74, colno=7) variable: 'a' arguments: - location: SourceLocation(pos=613, lineno=17, colno=8) - end_location: SourceLocation(pos=615, lineno=17, colno=10) + location: SourceLocation(pos=2710, lineno=74, colno=8) + end_location: SourceLocation(pos=2712, lineno=74, colno=10) sentence: - location: SourceLocation(pos=613, lineno=17, colno=8) - end_location: SourceLocation(pos=615, lineno=17, colno=10) + location: SourceLocation(pos=2710, lineno=74, colno=8) + end_location: SourceLocation(pos=2712, lineno=74, colno=10) value: 'Hi' - location: SourceLocation(pos=616, lineno=18, colno=1) - end_location: SourceLocation(pos=649, lineno=18, colno=34) + location: SourceLocation(pos=2724, lineno=76, colno=1) + end_location: SourceLocation(pos=2757, lineno=76, colno=34) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=625, lineno=18, colno=10) - end_location: SourceLocation(pos=630, lineno=18, colno=15) + location: SourceLocation(pos=2733, lineno=76, colno=10) + end_location: SourceLocation(pos=2738, lineno=76, colno=15) x: - location: SourceLocation(pos=625, lineno=18, colno=10) - end_location: SourceLocation(pos=626, lineno=18, colno=11) + location: SourceLocation(pos=2733, lineno=76, colno=10) + end_location: SourceLocation(pos=2734, lineno=76, colno=11) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=627, lineno=18, colno=12) - end_location: SourceLocation(pos=628, lineno=18, colno=13) + location: SourceLocation(pos=2735, lineno=76, colno=12) + end_location: SourceLocation(pos=2736, lineno=76, colno=13) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=629, lineno=18, colno=14) - end_location: SourceLocation(pos=630, lineno=18, colno=15) + location: SourceLocation(pos=2737, lineno=76, colno=14) + end_location: SourceLocation(pos=2738, lineno=76, colno=15) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=631, lineno=18, colno=16) - end_location: SourceLocation(pos=649, lineno=18, colno=34) + location: SourceLocation(pos=2739, lineno=76, colno=16) + end_location: SourceLocation(pos=2757, lineno=76, colno=34) identifier: - location: SourceLocation(pos=631, lineno=18, colno=16) - end_location: SourceLocation(pos=636, lineno=18, colno=21) + location: SourceLocation(pos=2739, lineno=76, colno=16) + end_location: SourceLocation(pos=2744, lineno=76, colno=21) is_tag: False namespace: None path: - location: SourceLocation(pos=631, lineno=18, colno=16) - end_location: SourceLocation(pos=636, lineno=18, colno=21) + location: SourceLocation(pos=2739, lineno=76, colno=16) + end_location: SourceLocation(pos=2744, lineno=76, colno=21) value: 'chest' block_states: - location: SourceLocation(pos=637, lineno=18, colno=22) - end_location: SourceLocation(pos=648, lineno=18, colno=33) + location: SourceLocation(pos=2745, lineno=76, colno=22) + end_location: SourceLocation(pos=2756, lineno=76, colno=33) key: - location: SourceLocation(pos=637, lineno=18, colno=22) - end_location: SourceLocation(pos=643, lineno=18, colno=28) + location: SourceLocation(pos=2745, lineno=76, colno=22) + end_location: SourceLocation(pos=2751, lineno=76, colno=28) value: 'facing' value: - location: SourceLocation(pos=644, lineno=18, colno=29) - end_location: SourceLocation(pos=648, lineno=18, colno=33) + location: SourceLocation(pos=2752, lineno=76, colno=29) + end_location: SourceLocation(pos=2756, lineno=76, colno=33) value: 'east' data_tags: None - location: SourceLocation(pos=650, lineno=19, colno=1) - end_location: SourceLocation(pos=720, lineno=19, colno=71) + location: SourceLocation(pos=2758, lineno=77, colno=1) + end_location: SourceLocation(pos=2831, lineno=77, colno=74) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=659, lineno=19, colno=10) - end_location: SourceLocation(pos=666, lineno=19, colno=17) + location: SourceLocation(pos=2767, lineno=77, colno=10) + end_location: SourceLocation(pos=2774, lineno=77, colno=17) x: - location: SourceLocation(pos=659, lineno=19, colno=10) - end_location: SourceLocation(pos=660, lineno=19, colno=11) + location: SourceLocation(pos=2767, lineno=77, colno=10) + end_location: SourceLocation(pos=2768, lineno=77, colno=11) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=661, lineno=19, colno=12) - end_location: SourceLocation(pos=662, lineno=19, colno=13) + location: SourceLocation(pos=2769, lineno=77, colno=12) + end_location: SourceLocation(pos=2770, lineno=77, colno=13) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=663, lineno=19, colno=14) - end_location: SourceLocation(pos=666, lineno=19, colno=17) + location: SourceLocation(pos=2771, lineno=77, colno=14) + end_location: SourceLocation(pos=2774, lineno=77, colno=17) value: -1.0 prefix: 'relative' - location: SourceLocation(pos=667, lineno=19, colno=18) - end_location: SourceLocation(pos=720, lineno=19, colno=71) + location: SourceLocation(pos=2775, lineno=77, colno=18) + end_location: SourceLocation(pos=2831, lineno=77, colno=74) identifier: - location: SourceLocation(pos=667, lineno=19, colno=18) - end_location: SourceLocation(pos=677, lineno=19, colno=28) + location: SourceLocation(pos=2775, lineno=77, colno=18) + end_location: SourceLocation(pos=2785, lineno=77, colno=28) is_tag: False namespace: None path: - location: SourceLocation(pos=667, lineno=19, colno=18) - end_location: SourceLocation(pos=677, lineno=19, colno=28) + location: SourceLocation(pos=2775, lineno=77, colno=18) + end_location: SourceLocation(pos=2785, lineno=77, colno=28) value: 'birch_sign' block_states: data_tags: - location: SourceLocation(pos=677, lineno=19, colno=28) - end_location: SourceLocation(pos=720, lineno=19, colno=71) + location: SourceLocation(pos=2785, lineno=77, colno=28) + end_location: SourceLocation(pos=2831, lineno=77, colno=74) entries: - location: SourceLocation(pos=678, lineno=19, colno=29) - end_location: SourceLocation(pos=696, lineno=19, colno=47) + location: SourceLocation(pos=2786, lineno=77, colno=29) + end_location: SourceLocation(pos=2805, lineno=77, colno=48) key: - location: SourceLocation(pos=678, lineno=19, colno=29) - end_location: SourceLocation(pos=683, lineno=19, colno=34) + location: SourceLocation(pos=2786, lineno=77, colno=29) + end_location: SourceLocation(pos=2791, lineno=77, colno=34) value: 'Text1' value: - location: SourceLocation(pos=684, lineno=19, colno=35) - end_location: SourceLocation(pos=696, lineno=19, colno=47) + location: SourceLocation(pos=2793, lineno=77, colno=36) + end_location: SourceLocation(pos=2805, lineno=77, colno=48) value: String('"My chest"') - location: SourceLocation(pos=697, lineno=19, colno=48) - end_location: SourceLocation(pos=719, lineno=19, colno=70) + location: SourceLocation(pos=2807, lineno=77, colno=50) + end_location: SourceLocation(pos=2830, lineno=77, colno=73) key: - location: SourceLocation(pos=697, lineno=19, colno=48) - end_location: SourceLocation(pos=702, lineno=19, colno=53) + location: SourceLocation(pos=2807, lineno=77, colno=50) + end_location: SourceLocation(pos=2812, lineno=77, colno=55) value: 'Text2' value: - location: SourceLocation(pos=703, lineno=19, colno=54) - end_location: SourceLocation(pos=719, lineno=19, colno=70) + location: SourceLocation(pos=2814, lineno=77, colno=57) + end_location: SourceLocation(pos=2830, lineno=77, colno=73) value: String('"Do not open!"') - location: SourceLocation(pos=721, lineno=20, colno=1) - end_location: SourceLocation(pos=758, lineno=20, colno=38) + location: SourceLocation(pos=2832, lineno=78, colno=1) + end_location: SourceLocation(pos=2869, lineno=78, colno=38) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=730, lineno=20, colno=10) - end_location: SourceLocation(pos=736, lineno=20, colno=16) + location: SourceLocation(pos=2841, lineno=78, colno=10) + end_location: SourceLocation(pos=2847, lineno=78, colno=16) x: - location: SourceLocation(pos=730, lineno=20, colno=10) - end_location: SourceLocation(pos=731, lineno=20, colno=11) + location: SourceLocation(pos=2841, lineno=78, colno=10) + end_location: SourceLocation(pos=2842, lineno=78, colno=11) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=732, lineno=20, colno=12) - end_location: SourceLocation(pos=734, lineno=20, colno=14) + location: SourceLocation(pos=2843, lineno=78, colno=12) + end_location: SourceLocation(pos=2845, lineno=78, colno=14) value: 2.0 prefix: 'relative' z: - location: SourceLocation(pos=735, lineno=20, colno=15) - end_location: SourceLocation(pos=736, lineno=20, colno=16) + location: SourceLocation(pos=2846, lineno=78, colno=15) + end_location: SourceLocation(pos=2847, lineno=78, colno=16) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=737, lineno=20, colno=17) - end_location: SourceLocation(pos=758, lineno=20, colno=38) + location: SourceLocation(pos=2848, lineno=78, colno=17) + end_location: SourceLocation(pos=2869, lineno=78, colno=38) identifier: - location: SourceLocation(pos=737, lineno=20, colno=17) - end_location: SourceLocation(pos=748, lineno=20, colno=28) + location: SourceLocation(pos=2848, lineno=78, colno=17) + end_location: SourceLocation(pos=2859, lineno=78, colno=28) is_tag: False namespace: None path: - location: SourceLocation(pos=737, lineno=20, colno=17) - end_location: SourceLocation(pos=748, lineno=20, colno=28) + location: SourceLocation(pos=2848, lineno=78, colno=17) + end_location: SourceLocation(pos=2859, lineno=78, colno=28) value: 'quartz_slab' block_states: - location: SourceLocation(pos=749, lineno=20, colno=29) - end_location: SourceLocation(pos=757, lineno=20, colno=37) + location: SourceLocation(pos=2860, lineno=78, colno=29) + end_location: SourceLocation(pos=2868, lineno=78, colno=37) key: - location: SourceLocation(pos=749, lineno=20, colno=29) - end_location: SourceLocation(pos=753, lineno=20, colno=33) + location: SourceLocation(pos=2860, lineno=78, colno=29) + end_location: SourceLocation(pos=2864, lineno=78, colno=33) value: 'type' value: - location: SourceLocation(pos=754, lineno=20, colno=34) - end_location: SourceLocation(pos=757, lineno=20, colno=37) + location: SourceLocation(pos=2865, lineno=78, colno=34) + end_location: SourceLocation(pos=2868, lineno=78, colno=37) value: 'top' data_tags: None - location: SourceLocation(pos=759, lineno=21, colno=1) - end_location: SourceLocation(pos=789, lineno=21, colno=31) + location: SourceLocation(pos=2886, lineno=80, colno=1) + end_location: SourceLocation(pos=2919, lineno=80, colno=34) + identifier: 'spreadplayers:center:spreadDistance:maxRange:respectTeams:targets' + arguments: + + location: SourceLocation(pos=2900, lineno=80, colno=15) + end_location: SourceLocation(pos=2903, lineno=80, colno=18) + x: + + location: SourceLocation(pos=2900, lineno=80, colno=15) + end_location: SourceLocation(pos=2901, lineno=80, colno=16) + value: 0.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=2902, lineno=80, colno=17) + end_location: SourceLocation(pos=2903, lineno=80, colno=18) + value: 0.0 + prefix: 'absolute' + + location: SourceLocation(pos=2904, lineno=80, colno=19) + end_location: SourceLocation(pos=2907, lineno=80, colno=22) + value: 200.0 + + location: SourceLocation(pos=2908, lineno=80, colno=23) + end_location: SourceLocation(pos=2911, lineno=80, colno=26) + value: 500.0 + + location: SourceLocation(pos=2912, lineno=80, colno=27) + end_location: SourceLocation(pos=2916, lineno=80, colno=31) + value: True + + location: SourceLocation(pos=2917, lineno=80, colno=32) + end_location: SourceLocation(pos=2919, lineno=80, colno=34) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2929, lineno=82, colno=1) + end_location: SourceLocation(pos=2959, lineno=82, colno=31) identifier: 'summon:entity:pos' arguments: - location: SourceLocation(pos=766, lineno=21, colno=8) - end_location: SourceLocation(pos=780, lineno=21, colno=22) + location: SourceLocation(pos=2936, lineno=82, colno=8) + end_location: SourceLocation(pos=2950, lineno=82, colno=22) is_tag: False namespace: None path: - location: SourceLocation(pos=766, lineno=21, colno=8) - end_location: SourceLocation(pos=780, lineno=21, colno=22) + location: SourceLocation(pos=2936, lineno=82, colno=8) + end_location: SourceLocation(pos=2950, lineno=82, colno=22) value: 'lightning_bolt' - location: SourceLocation(pos=781, lineno=21, colno=23) - end_location: SourceLocation(pos=789, lineno=21, colno=31) + location: SourceLocation(pos=2951, lineno=82, colno=23) + end_location: SourceLocation(pos=2959, lineno=82, colno=31) x: - location: SourceLocation(pos=781, lineno=21, colno=23) - end_location: SourceLocation(pos=785, lineno=21, colno=27) + location: SourceLocation(pos=2951, lineno=82, colno=23) + end_location: SourceLocation(pos=2955, lineno=82, colno=27) value: -10.0 prefix: 'relative' y: - location: SourceLocation(pos=786, lineno=21, colno=28) - end_location: SourceLocation(pos=787, lineno=21, colno=29) + location: SourceLocation(pos=2956, lineno=82, colno=28) + end_location: SourceLocation(pos=2957, lineno=82, colno=29) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=788, lineno=21, colno=30) - end_location: SourceLocation(pos=789, lineno=21, colno=31) + location: SourceLocation(pos=2958, lineno=82, colno=30) + end_location: SourceLocation(pos=2959, lineno=82, colno=31) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=790, lineno=22, colno=1) - end_location: SourceLocation(pos=863, lineno=22, colno=74) + location: SourceLocation(pos=2960, lineno=83, colno=1) + end_location: SourceLocation(pos=3036, lineno=83, colno=77) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=797, lineno=22, colno=8) - end_location: SourceLocation(pos=804, lineno=22, colno=15) + location: SourceLocation(pos=2967, lineno=83, colno=8) + end_location: SourceLocation(pos=2974, lineno=83, colno=15) is_tag: False namespace: None path: - location: SourceLocation(pos=797, lineno=22, colno=8) - end_location: SourceLocation(pos=804, lineno=22, colno=15) + location: SourceLocation(pos=2967, lineno=83, colno=8) + end_location: SourceLocation(pos=2974, lineno=83, colno=15) value: 'creeper' - location: SourceLocation(pos=805, lineno=22, colno=16) - end_location: SourceLocation(pos=810, lineno=22, colno=21) + location: SourceLocation(pos=2975, lineno=83, colno=16) + end_location: SourceLocation(pos=2980, lineno=83, colno=21) x: - location: SourceLocation(pos=805, lineno=22, colno=16) - end_location: SourceLocation(pos=806, lineno=22, colno=17) + location: SourceLocation(pos=2975, lineno=83, colno=16) + end_location: SourceLocation(pos=2976, lineno=83, colno=17) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=807, lineno=22, colno=18) - end_location: SourceLocation(pos=808, lineno=22, colno=19) + location: SourceLocation(pos=2977, lineno=83, colno=18) + end_location: SourceLocation(pos=2978, lineno=83, colno=19) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=809, lineno=22, colno=20) - end_location: SourceLocation(pos=810, lineno=22, colno=21) + location: SourceLocation(pos=2979, lineno=83, colno=20) + end_location: SourceLocation(pos=2980, lineno=83, colno=21) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=811, lineno=22, colno=22) - end_location: SourceLocation(pos=863, lineno=22, colno=74) + location: SourceLocation(pos=2981, lineno=83, colno=22) + end_location: SourceLocation(pos=3036, lineno=83, colno=77) entries: - location: SourceLocation(pos=812, lineno=22, colno=23) - end_location: SourceLocation(pos=822, lineno=22, colno=33) + location: SourceLocation(pos=2982, lineno=83, colno=23) + end_location: SourceLocation(pos=2993, lineno=83, colno=34) key: - location: SourceLocation(pos=812, lineno=22, colno=23) - end_location: SourceLocation(pos=819, lineno=22, colno=30) + location: SourceLocation(pos=2982, lineno=83, colno=23) + end_location: SourceLocation(pos=2989, lineno=83, colno=30) value: 'powered' value: - location: SourceLocation(pos=820, lineno=22, colno=31) - end_location: SourceLocation(pos=822, lineno=22, colno=33) + location: SourceLocation(pos=2991, lineno=83, colno=32) + end_location: SourceLocation(pos=2993, lineno=83, colno=34) value: Byte(1) - location: SourceLocation(pos=823, lineno=22, colno=34) - end_location: SourceLocation(pos=862, lineno=22, colno=73) + location: SourceLocation(pos=2995, lineno=83, colno=36) + end_location: SourceLocation(pos=3035, lineno=83, colno=76) key: - location: SourceLocation(pos=823, lineno=22, colno=34) - end_location: SourceLocation(pos=833, lineno=22, colno=44) + location: SourceLocation(pos=2995, lineno=83, colno=36) + end_location: SourceLocation(pos=3005, lineno=83, colno=46) value: 'CustomName' value: - location: SourceLocation(pos=834, lineno=22, colno=45) - end_location: SourceLocation(pos=862, lineno=22, colno=73) + location: SourceLocation(pos=3007, lineno=83, colno=48) + end_location: SourceLocation(pos=3035, lineno=83, colno=76) value: String('{"text":"Powered Creeper"}') - location: SourceLocation(pos=864, lineno=23, colno=1) - end_location: SourceLocation(pos=966, lineno=23, colno=103) + location: SourceLocation(pos=3037, lineno=84, colno=1) + end_location: SourceLocation(pos=3146, lineno=84, colno=110) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=871, lineno=23, colno=8) - end_location: SourceLocation(pos=877, lineno=23, colno=14) + location: SourceLocation(pos=3044, lineno=84, colno=8) + end_location: SourceLocation(pos=3050, lineno=84, colno=14) is_tag: False namespace: None path: - location: SourceLocation(pos=871, lineno=23, colno=8) - end_location: SourceLocation(pos=877, lineno=23, colno=14) + location: SourceLocation(pos=3044, lineno=84, colno=8) + end_location: SourceLocation(pos=3050, lineno=84, colno=14) value: 'spider' - location: SourceLocation(pos=878, lineno=23, colno=15) - end_location: SourceLocation(pos=883, lineno=23, colno=20) + location: SourceLocation(pos=3051, lineno=84, colno=15) + end_location: SourceLocation(pos=3056, lineno=84, colno=20) x: - location: SourceLocation(pos=878, lineno=23, colno=15) - end_location: SourceLocation(pos=879, lineno=23, colno=16) + location: SourceLocation(pos=3051, lineno=84, colno=15) + end_location: SourceLocation(pos=3052, lineno=84, colno=16) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=880, lineno=23, colno=17) - end_location: SourceLocation(pos=881, lineno=23, colno=18) + location: SourceLocation(pos=3053, lineno=84, colno=17) + end_location: SourceLocation(pos=3054, lineno=84, colno=18) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=882, lineno=23, colno=19) - end_location: SourceLocation(pos=883, lineno=23, colno=20) + location: SourceLocation(pos=3055, lineno=84, colno=19) + end_location: SourceLocation(pos=3056, lineno=84, colno=20) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=884, lineno=23, colno=21) - end_location: SourceLocation(pos=966, lineno=23, colno=103) + location: SourceLocation(pos=3057, lineno=84, colno=21) + end_location: SourceLocation(pos=3146, lineno=84, colno=110) entries: - location: SourceLocation(pos=885, lineno=23, colno=22) - end_location: SourceLocation(pos=965, lineno=23, colno=102) + location: SourceLocation(pos=3058, lineno=84, colno=22) + end_location: SourceLocation(pos=3145, lineno=84, colno=109) key: - location: SourceLocation(pos=885, lineno=23, colno=22) - end_location: SourceLocation(pos=895, lineno=23, colno=32) + location: SourceLocation(pos=3058, lineno=84, colno=22) + end_location: SourceLocation(pos=3068, lineno=84, colno=32) value: 'Passengers' value: - location: SourceLocation(pos=896, lineno=23, colno=33) - end_location: SourceLocation(pos=965, lineno=23, colno=102) + location: SourceLocation(pos=3070, lineno=84, colno=34) + end_location: SourceLocation(pos=3145, lineno=84, colno=109) elements: - location: SourceLocation(pos=897, lineno=23, colno=34) - end_location: SourceLocation(pos=964, lineno=23, colno=101) + location: SourceLocation(pos=3071, lineno=84, colno=35) + end_location: SourceLocation(pos=3144, lineno=84, colno=108) entries: - location: SourceLocation(pos=898, lineno=23, colno=35) - end_location: SourceLocation(pos=921, lineno=23, colno=58) + location: SourceLocation(pos=3072, lineno=84, colno=36) + end_location: SourceLocation(pos=3096, lineno=84, colno=60) key: - location: SourceLocation(pos=898, lineno=23, colno=35) - end_location: SourceLocation(pos=900, lineno=23, colno=37) + location: SourceLocation(pos=3072, lineno=84, colno=36) + end_location: SourceLocation(pos=3074, lineno=84, colno=38) value: 'id' value: - location: SourceLocation(pos=901, lineno=23, colno=38) - end_location: SourceLocation(pos=921, lineno=23, colno=58) + location: SourceLocation(pos=3076, lineno=84, colno=40) + end_location: SourceLocation(pos=3096, lineno=84, colno=60) value: String('minecraft:skeleton') - location: SourceLocation(pos=922, lineno=23, colno=59) - end_location: SourceLocation(pos=963, lineno=23, colno=100) + location: SourceLocation(pos=3098, lineno=84, colno=62) + end_location: SourceLocation(pos=3143, lineno=84, colno=107) key: - location: SourceLocation(pos=922, lineno=23, colno=59) - end_location: SourceLocation(pos=931, lineno=23, colno=68) + location: SourceLocation(pos=3098, lineno=84, colno=62) + end_location: SourceLocation(pos=3107, lineno=84, colno=71) value: 'HandItems' value: - location: SourceLocation(pos=932, lineno=23, colno=69) - end_location: SourceLocation(pos=963, lineno=23, colno=100) + location: SourceLocation(pos=3109, lineno=84, colno=73) + end_location: SourceLocation(pos=3143, lineno=84, colno=107) elements: - location: SourceLocation(pos=933, lineno=23, colno=70) - end_location: SourceLocation(pos=962, lineno=23, colno=99) + location: SourceLocation(pos=3110, lineno=84, colno=74) + end_location: SourceLocation(pos=3142, lineno=84, colno=106) entries: - location: SourceLocation(pos=934, lineno=23, colno=71) - end_location: SourceLocation(pos=952, lineno=23, colno=89) + location: SourceLocation(pos=3111, lineno=84, colno=75) + end_location: SourceLocation(pos=3130, lineno=84, colno=94) key: - location: SourceLocation(pos=934, lineno=23, colno=71) - end_location: SourceLocation(pos=936, lineno=23, colno=73) + location: SourceLocation(pos=3111, lineno=84, colno=75) + end_location: SourceLocation(pos=3113, lineno=84, colno=77) value: 'id' value: - location: SourceLocation(pos=937, lineno=23, colno=74) - end_location: SourceLocation(pos=952, lineno=23, colno=89) + location: SourceLocation(pos=3115, lineno=84, colno=79) + end_location: SourceLocation(pos=3130, lineno=84, colno=94) value: String('minecraft:bow') - location: SourceLocation(pos=953, lineno=23, colno=90) - end_location: SourceLocation(pos=961, lineno=23, colno=98) + location: SourceLocation(pos=3132, lineno=84, colno=96) + end_location: SourceLocation(pos=3141, lineno=84, colno=105) key: - location: SourceLocation(pos=953, lineno=23, colno=90) - end_location: SourceLocation(pos=958, lineno=23, colno=95) + location: SourceLocation(pos=3132, lineno=84, colno=96) + end_location: SourceLocation(pos=3137, lineno=84, colno=101) value: 'Count' value: - location: SourceLocation(pos=959, lineno=23, colno=96) - end_location: SourceLocation(pos=961, lineno=23, colno=98) + location: SourceLocation(pos=3139, lineno=84, colno=103) + end_location: SourceLocation(pos=3141, lineno=84, colno=105) value: Byte(1) - location: SourceLocation(pos=967, lineno=24, colno=1) - end_location: SourceLocation(pos=1075, lineno=24, colno=109) + location: SourceLocation(pos=3147, lineno=85, colno=1) + end_location: SourceLocation(pos=3272, lineno=85, colno=126) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=974, lineno=24, colno=8) - end_location: SourceLocation(pos=982, lineno=24, colno=16) + location: SourceLocation(pos=3154, lineno=85, colno=8) + end_location: SourceLocation(pos=3162, lineno=85, colno=16) is_tag: False namespace: None path: - location: SourceLocation(pos=974, lineno=24, colno=8) - end_location: SourceLocation(pos=982, lineno=24, colno=16) + location: SourceLocation(pos=3154, lineno=85, colno=8) + end_location: SourceLocation(pos=3162, lineno=85, colno=16) value: 'villager' - location: SourceLocation(pos=983, lineno=24, colno=17) - end_location: SourceLocation(pos=988, lineno=24, colno=22) + location: SourceLocation(pos=3163, lineno=85, colno=17) + end_location: SourceLocation(pos=3168, lineno=85, colno=22) x: - location: SourceLocation(pos=983, lineno=24, colno=17) - end_location: SourceLocation(pos=984, lineno=24, colno=18) + location: SourceLocation(pos=3163, lineno=85, colno=17) + end_location: SourceLocation(pos=3164, lineno=85, colno=18) value: 0.0 prefix: 'relative' y: - location: SourceLocation(pos=985, lineno=24, colno=19) - end_location: SourceLocation(pos=986, lineno=24, colno=20) + location: SourceLocation(pos=3165, lineno=85, colno=19) + end_location: SourceLocation(pos=3166, lineno=85, colno=20) value: 0.0 prefix: 'relative' z: - location: SourceLocation(pos=987, lineno=24, colno=21) - end_location: SourceLocation(pos=988, lineno=24, colno=22) + location: SourceLocation(pos=3167, lineno=85, colno=21) + end_location: SourceLocation(pos=3168, lineno=85, colno=22) value: 0.0 prefix: 'relative' - location: SourceLocation(pos=989, lineno=24, colno=23) - end_location: SourceLocation(pos=1075, lineno=24, colno=109) + location: SourceLocation(pos=3169, lineno=85, colno=23) + end_location: SourceLocation(pos=3272, lineno=85, colno=126) entries: - location: SourceLocation(pos=990, lineno=24, colno=24) - end_location: SourceLocation(pos=1074, lineno=24, colno=108) + location: SourceLocation(pos=3170, lineno=85, colno=24) + end_location: SourceLocation(pos=3271, lineno=85, colno=125) key: - location: SourceLocation(pos=990, lineno=24, colno=24) - end_location: SourceLocation(pos=996, lineno=24, colno=30) + location: SourceLocation(pos=3170, lineno=85, colno=24) + end_location: SourceLocation(pos=3176, lineno=85, colno=30) value: 'Offers' value: - location: SourceLocation(pos=997, lineno=24, colno=31) - end_location: SourceLocation(pos=1074, lineno=24, colno=108) + location: SourceLocation(pos=3178, lineno=85, colno=32) + end_location: SourceLocation(pos=3271, lineno=85, colno=125) entries: - location: SourceLocation(pos=998, lineno=24, colno=32) - end_location: SourceLocation(pos=1073, lineno=24, colno=107) + location: SourceLocation(pos=3179, lineno=85, colno=33) + end_location: SourceLocation(pos=3270, lineno=85, colno=124) key: - location: SourceLocation(pos=998, lineno=24, colno=32) - end_location: SourceLocation(pos=1005, lineno=24, colno=39) + location: SourceLocation(pos=3179, lineno=85, colno=33) + end_location: SourceLocation(pos=3186, lineno=85, colno=40) value: 'Recipes' value: - location: SourceLocation(pos=1006, lineno=24, colno=40) - end_location: SourceLocation(pos=1073, lineno=24, colno=107) + location: SourceLocation(pos=3188, lineno=85, colno=42) + end_location: SourceLocation(pos=3270, lineno=85, colno=124) elements: - location: SourceLocation(pos=1007, lineno=24, colno=41) - end_location: SourceLocation(pos=1072, lineno=24, colno=106) + location: SourceLocation(pos=3189, lineno=85, colno=43) + end_location: SourceLocation(pos=3269, lineno=85, colno=123) entries: - location: SourceLocation(pos=1008, lineno=24, colno=42) - end_location: SourceLocation(pos=1029, lineno=24, colno=63) + location: SourceLocation(pos=3190, lineno=85, colno=44) + end_location: SourceLocation(pos=3217, lineno=85, colno=71) key: - location: SourceLocation(pos=1008, lineno=24, colno=42) - end_location: SourceLocation(pos=1011, lineno=24, colno=45) + location: SourceLocation(pos=3190, lineno=85, colno=44) + end_location: SourceLocation(pos=3193, lineno=85, colno=47) value: 'buy' value: - location: SourceLocation(pos=1012, lineno=24, colno=46) - end_location: SourceLocation(pos=1029, lineno=24, colno=63) + location: SourceLocation(pos=3195, lineno=85, colno=49) + end_location: SourceLocation(pos=3217, lineno=85, colno=71) entries: - location: SourceLocation(pos=1013, lineno=24, colno=47) - end_location: SourceLocation(pos=1020, lineno=24, colno=54) + location: SourceLocation(pos=3196, lineno=85, colno=50) + end_location: SourceLocation(pos=3206, lineno=85, colno=60) key: - location: SourceLocation(pos=1013, lineno=24, colno=47) - end_location: SourceLocation(pos=1015, lineno=24, colno=49) + location: SourceLocation(pos=3196, lineno=85, colno=50) + end_location: SourceLocation(pos=3198, lineno=85, colno=52) value: 'id' value: - location: SourceLocation(pos=1016, lineno=24, colno=50) - end_location: SourceLocation(pos=1020, lineno=24, colno=54) + location: SourceLocation(pos=3200, lineno=85, colno=54) + end_location: SourceLocation(pos=3206, lineno=85, colno=60) value: String('dirt') - location: SourceLocation(pos=1021, lineno=24, colno=55) - end_location: SourceLocation(pos=1028, lineno=24, colno=62) + location: SourceLocation(pos=3208, lineno=85, colno=62) + end_location: SourceLocation(pos=3216, lineno=85, colno=70) key: - location: SourceLocation(pos=1021, lineno=24, colno=55) - end_location: SourceLocation(pos=1026, lineno=24, colno=60) + location: SourceLocation(pos=3208, lineno=85, colno=62) + end_location: SourceLocation(pos=3213, lineno=85, colno=67) value: 'Count' value: - location: SourceLocation(pos=1027, lineno=24, colno=61) - end_location: SourceLocation(pos=1028, lineno=24, colno=62) + location: SourceLocation(pos=3215, lineno=85, colno=69) + end_location: SourceLocation(pos=3216, lineno=85, colno=70) value: Int(1) - location: SourceLocation(pos=1030, lineno=24, colno=64) - end_location: SourceLocation(pos=1055, lineno=24, colno=89) + location: SourceLocation(pos=3219, lineno=85, colno=73) + end_location: SourceLocation(pos=3250, lineno=85, colno=104) key: - location: SourceLocation(pos=1030, lineno=24, colno=64) - end_location: SourceLocation(pos=1034, lineno=24, colno=68) + location: SourceLocation(pos=3219, lineno=85, colno=73) + end_location: SourceLocation(pos=3223, lineno=85, colno=77) value: 'sell' value: - location: SourceLocation(pos=1035, lineno=24, colno=69) - end_location: SourceLocation(pos=1055, lineno=24, colno=89) + location: SourceLocation(pos=3225, lineno=85, colno=79) + end_location: SourceLocation(pos=3250, lineno=85, colno=104) entries: - location: SourceLocation(pos=1036, lineno=24, colno=70) - end_location: SourceLocation(pos=1046, lineno=24, colno=80) + location: SourceLocation(pos=3226, lineno=85, colno=80) + end_location: SourceLocation(pos=3239, lineno=85, colno=93) key: - location: SourceLocation(pos=1036, lineno=24, colno=70) - end_location: SourceLocation(pos=1038, lineno=24, colno=72) + location: SourceLocation(pos=3226, lineno=85, colno=80) + end_location: SourceLocation(pos=3228, lineno=85, colno=82) value: 'id' value: - location: SourceLocation(pos=1039, lineno=24, colno=73) - end_location: SourceLocation(pos=1046, lineno=24, colno=80) + location: SourceLocation(pos=3230, lineno=85, colno=84) + end_location: SourceLocation(pos=3239, lineno=85, colno=93) value: String('diamond') - location: SourceLocation(pos=1047, lineno=24, colno=81) - end_location: SourceLocation(pos=1054, lineno=24, colno=88) + location: SourceLocation(pos=3241, lineno=85, colno=95) + end_location: SourceLocation(pos=3249, lineno=85, colno=103) key: - location: SourceLocation(pos=1047, lineno=24, colno=81) - end_location: SourceLocation(pos=1052, lineno=24, colno=86) + location: SourceLocation(pos=3241, lineno=85, colno=95) + end_location: SourceLocation(pos=3246, lineno=85, colno=100) value: 'Count' value: - location: SourceLocation(pos=1053, lineno=24, colno=87) - end_location: SourceLocation(pos=1054, lineno=24, colno=88) + location: SourceLocation(pos=3248, lineno=85, colno=102) + end_location: SourceLocation(pos=3249, lineno=85, colno=103) value: Int(1) - location: SourceLocation(pos=1056, lineno=24, colno=90) - end_location: SourceLocation(pos=1071, lineno=24, colno=105) + location: SourceLocation(pos=3252, lineno=85, colno=106) + end_location: SourceLocation(pos=3268, lineno=85, colno=122) key: - location: SourceLocation(pos=1056, lineno=24, colno=90) - end_location: SourceLocation(pos=1065, lineno=24, colno=99) + location: SourceLocation(pos=3252, lineno=85, colno=106) + end_location: SourceLocation(pos=3261, lineno=85, colno=115) value: 'rewardExp' value: - location: SourceLocation(pos=1066, lineno=24, colno=100) - end_location: SourceLocation(pos=1071, lineno=24, colno=105) + location: SourceLocation(pos=3263, lineno=85, colno=117) + end_location: SourceLocation(pos=3268, lineno=85, colno=122) value: Byte(0) - location: SourceLocation(pos=1076, lineno=25, colno=1) - end_location: SourceLocation(pos=1089, lineno=25, colno=14) + location: SourceLocation(pos=3284, lineno=87, colno=1) + end_location: SourceLocation(pos=3298, lineno=87, colno=15) + identifier: 'teleport:destination' + arguments: + + location: SourceLocation(pos=3293, lineno=87, colno=10) + end_location: SourceLocation(pos=3298, lineno=87, colno=15) + value: 'Alice' + + location: SourceLocation(pos=3299, lineno=88, colno=1) + end_location: SourceLocation(pos=3313, lineno=88, colno=15) + identifier: 'teleport:targets:destination' + arguments: + + location: SourceLocation(pos=3308, lineno=88, colno=10) + end_location: SourceLocation(pos=3310, lineno=88, colno=12) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3311, lineno=88, colno=13) + end_location: SourceLocation(pos=3313, lineno=88, colno=15) + variable: 's' + arguments: + + + location: SourceLocation(pos=3314, lineno=89, colno=1) + end_location: SourceLocation(pos=3333, lineno=89, colno=20) + identifier: 'teleport:location' + arguments: + + location: SourceLocation(pos=3323, lineno=89, colno=10) + end_location: SourceLocation(pos=3333, lineno=89, colno=20) + x: + + location: SourceLocation(pos=3323, lineno=89, colno=10) + end_location: SourceLocation(pos=3326, lineno=89, colno=13) + value: 100.0 + prefix: 'absolute' + y: + + location: SourceLocation(pos=3327, lineno=89, colno=14) + end_location: SourceLocation(pos=3329, lineno=89, colno=16) + value: 3.0 + prefix: 'relative' + z: + + location: SourceLocation(pos=3330, lineno=89, colno=17) + end_location: SourceLocation(pos=3333, lineno=89, colno=20) + value: 100.0 + prefix: 'absolute' + + location: SourceLocation(pos=3344, lineno=91, colno=1) + end_location: SourceLocation(pos=3372, lineno=91, colno=29) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=3352, lineno=91, colno=9) + end_location: SourceLocation(pos=3354, lineno=91, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3355, lineno=91, colno=12) + end_location: SourceLocation(pos=3372, lineno=91, colno=29) + value: 'text to display' + + location: SourceLocation(pos=3373, lineno=92, colno=1) + end_location: SourceLocation(pos=3419, lineno=92, colno=47) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=3381, lineno=92, colno=9) + end_location: SourceLocation(pos=3383, lineno=92, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3384, lineno=92, colno=12) + end_location: SourceLocation(pos=3419, lineno=92, colno=47) + entries: + + location: SourceLocation(pos=3385, lineno=92, colno=13) + end_location: SourceLocation(pos=3403, lineno=92, colno=31) + key: + + location: SourceLocation(pos=3385, lineno=92, colno=13) + end_location: SourceLocation(pos=3391, lineno=92, colno=19) + value: 'text' + value: + + location: SourceLocation(pos=3392, lineno=92, colno=20) + end_location: SourceLocation(pos=3403, lineno=92, colno=31) + value: 'I am blue' + + location: SourceLocation(pos=3404, lineno=92, colno=32) + end_location: SourceLocation(pos=3418, lineno=92, colno=46) + key: + + location: SourceLocation(pos=3404, lineno=92, colno=32) + end_location: SourceLocation(pos=3411, lineno=92, colno=39) + value: 'color' + value: + + location: SourceLocation(pos=3412, lineno=92, colno=40) + end_location: SourceLocation(pos=3418, lineno=92, colno=46) + value: 'blue' + + location: SourceLocation(pos=3420, lineno=93, colno=1) + end_location: SourceLocation(pos=3469, lineno=93, colno=50) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=3428, lineno=93, colno=9) + end_location: SourceLocation(pos=3430, lineno=93, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3431, lineno=93, colno=12) + end_location: SourceLocation(pos=3469, lineno=93, colno=50) + entries: + + location: SourceLocation(pos=3432, lineno=93, colno=13) + end_location: SourceLocation(pos=3450, lineno=93, colno=31) + key: + + location: SourceLocation(pos=3432, lineno=93, colno=13) + end_location: SourceLocation(pos=3438, lineno=93, colno=19) + value: 'text' + value: + + location: SourceLocation(pos=3439, lineno=93, colno=20) + end_location: SourceLocation(pos=3450, lineno=93, colno=31) + value: 'I am blue' + + location: SourceLocation(pos=3451, lineno=93, colno=32) + end_location: SourceLocation(pos=3468, lineno=93, colno=49) + key: + + location: SourceLocation(pos=3451, lineno=93, colno=32) + end_location: SourceLocation(pos=3458, lineno=93, colno=39) + value: 'color' + value: + + location: SourceLocation(pos=3459, lineno=93, colno=40) + end_location: SourceLocation(pos=3468, lineno=93, colno=49) + value: '#5555ff' + + location: SourceLocation(pos=3470, lineno=94, colno=1) + end_location: SourceLocation(pos=3551, lineno=94, colno=82) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=3478, lineno=94, colno=9) + end_location: SourceLocation(pos=3480, lineno=94, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3481, lineno=94, colno=12) + end_location: SourceLocation(pos=3551, lineno=94, colno=82) + entries: + + location: SourceLocation(pos=3482, lineno=94, colno=13) + end_location: SourceLocation(pos=3500, lineno=94, colno=31) + key: + + location: SourceLocation(pos=3482, lineno=94, colno=13) + end_location: SourceLocation(pos=3488, lineno=94, colno=19) + value: 'text' + value: + + location: SourceLocation(pos=3489, lineno=94, colno=20) + end_location: SourceLocation(pos=3500, lineno=94, colno=31) + value: 'Hover me!' + + location: SourceLocation(pos=3501, lineno=94, colno=32) + end_location: SourceLocation(pos=3550, lineno=94, colno=81) + key: + + location: SourceLocation(pos=3501, lineno=94, colno=32) + end_location: SourceLocation(pos=3513, lineno=94, colno=44) + value: 'hoverEvent' + value: + + location: SourceLocation(pos=3514, lineno=94, colno=45) + end_location: SourceLocation(pos=3550, lineno=94, colno=81) + entries: + + location: SourceLocation(pos=3515, lineno=94, colno=46) + end_location: SourceLocation(pos=3535, lineno=94, colno=66) + key: + + location: SourceLocation(pos=3515, lineno=94, colno=46) + end_location: SourceLocation(pos=3523, lineno=94, colno=54) + value: 'action' + value: + + location: SourceLocation(pos=3524, lineno=94, colno=55) + end_location: SourceLocation(pos=3535, lineno=94, colno=66) + value: 'show_text' + + location: SourceLocation(pos=3536, lineno=94, colno=67) + end_location: SourceLocation(pos=3549, lineno=94, colno=80) + key: + + location: SourceLocation(pos=3536, lineno=94, colno=67) + end_location: SourceLocation(pos=3543, lineno=94, colno=74) + value: 'value' + value: + + location: SourceLocation(pos=3544, lineno=94, colno=75) + end_location: SourceLocation(pos=3549, lineno=94, colno=80) + value: 'Hi!' + + location: SourceLocation(pos=3552, lineno=95, colno=1) + end_location: SourceLocation(pos=3577, lineno=95, colno=26) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=3560, lineno=95, colno=9) + end_location: SourceLocation(pos=3562, lineno=95, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3563, lineno=95, colno=12) + end_location: SourceLocation(pos=3577, lineno=95, colno=26) + value: 'Text1\nText2' + + location: SourceLocation(pos=3585, lineno=97, colno=1) + end_location: SourceLocation(pos=3599, lineno=97, colno=15) identifier: 'time:set:time' arguments: - location: SourceLocation(pos=1085, lineno=25, colno=10) - end_location: SourceLocation(pos=1089, lineno=25, colno=14) + location: SourceLocation(pos=3594, lineno=97, colno=10) + end_location: SourceLocation(pos=3599, lineno=97, colno=15) value: 1000.0 - suffix: None + suffix: 't' - location: SourceLocation(pos=1090, lineno=26, colno=1) - end_location: SourceLocation(pos=1090, lineno=26, colno=1) + location: SourceLocation(pos=3600, lineno=98, colno=1) + end_location: SourceLocation(pos=3600, lineno=98, colno=1) identifier: 'time:set:day' arguments: - location: SourceLocation(pos=1103, lineno=27, colno=1) - end_location: SourceLocation(pos=1117, lineno=27, colno=15) + location: SourceLocation(pos=3613, lineno=99, colno=1) + end_location: SourceLocation(pos=3628, lineno=99, colno=16) identifier: 'time:add:time' arguments: - location: SourceLocation(pos=1112, lineno=27, colno=10) - end_location: SourceLocation(pos=1117, lineno=27, colno=15) + location: SourceLocation(pos=3622, lineno=99, colno=10) + end_location: SourceLocation(pos=3628, lineno=99, colno=16) value: 24000.0 - suffix: None + suffix: 't' + + location: SourceLocation(pos=3637, lineno=101, colno=1) + end_location: SourceLocation(pos=3714, lineno=101, colno=78) + identifier: 'title:targets:subtitle:title' + arguments: + + location: SourceLocation(pos=3643, lineno=101, colno=7) + end_location: SourceLocation(pos=3645, lineno=101, colno=9) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3655, lineno=101, colno=19) + end_location: SourceLocation(pos=3714, lineno=101, colno=78) + entries: + + location: SourceLocation(pos=3656, lineno=101, colno=20) + end_location: SourceLocation(pos=3684, lineno=101, colno=48) + key: + + location: SourceLocation(pos=3656, lineno=101, colno=20) + end_location: SourceLocation(pos=3662, lineno=101, colno=26) + value: 'text' + value: + + location: SourceLocation(pos=3663, lineno=101, colno=27) + end_location: SourceLocation(pos=3684, lineno=101, colno=48) + value: 'The story begins...' + + location: SourceLocation(pos=3685, lineno=101, colno=49) + end_location: SourceLocation(pos=3699, lineno=101, colno=63) + key: + + location: SourceLocation(pos=3685, lineno=101, colno=49) + end_location: SourceLocation(pos=3692, lineno=101, colno=56) + value: 'color' + value: + + location: SourceLocation(pos=3693, lineno=101, colno=57) + end_location: SourceLocation(pos=3699, lineno=101, colno=63) + value: 'gray' + + location: SourceLocation(pos=3700, lineno=101, colno=64) + end_location: SourceLocation(pos=3713, lineno=101, colno=77) + key: + + location: SourceLocation(pos=3700, lineno=101, colno=64) + end_location: SourceLocation(pos=3708, lineno=101, colno=72) + value: 'italic' + value: + + location: SourceLocation(pos=3709, lineno=101, colno=73) + end_location: SourceLocation(pos=3713, lineno=101, colno=77) + value: True + + location: SourceLocation(pos=3715, lineno=102, colno=1) + end_location: SourceLocation(pos=3762, lineno=102, colno=48) + identifier: 'title:targets:title:title' + arguments: + + location: SourceLocation(pos=3721, lineno=102, colno=7) + end_location: SourceLocation(pos=3723, lineno=102, colno=9) + variable: 'a' + arguments: + + + location: SourceLocation(pos=3730, lineno=102, colno=16) + end_location: SourceLocation(pos=3762, lineno=102, colno=48) + entries: + + location: SourceLocation(pos=3731, lineno=102, colno=17) + end_location: SourceLocation(pos=3749, lineno=102, colno=35) + key: + + location: SourceLocation(pos=3731, lineno=102, colno=17) + end_location: SourceLocation(pos=3737, lineno=102, colno=23) + value: 'text' + value: + + location: SourceLocation(pos=3738, lineno=102, colno=24) + end_location: SourceLocation(pos=3749, lineno=102, colno=35) + value: 'Chapter I' + + location: SourceLocation(pos=3750, lineno=102, colno=36) + end_location: SourceLocation(pos=3761, lineno=102, colno=47) + key: + + location: SourceLocation(pos=3750, lineno=102, colno=36) + end_location: SourceLocation(pos=3756, lineno=102, colno=42) + value: 'bold' + value: + + location: SourceLocation(pos=3757, lineno=102, colno=43) + end_location: SourceLocation(pos=3761, lineno=102, colno=47) + value: True - location: SourceLocation(pos=1118, lineno=28, colno=1) - end_location: SourceLocation(pos=1136, lineno=28, colno=19) + location: SourceLocation(pos=3773, lineno=104, colno=1) + end_location: SourceLocation(pos=3791, lineno=104, colno=19) identifier: 'weather:clear:duration' arguments: - location: SourceLocation(pos=1132, lineno=28, colno=15) - end_location: SourceLocation(pos=1136, lineno=28, colno=19) + location: SourceLocation(pos=3787, lineno=104, colno=15) + end_location: SourceLocation(pos=3791, lineno=104, colno=19) value: 1200 - location: SourceLocation(pos=1137, lineno=29, colno=1) - end_location: SourceLocation(pos=1137, lineno=29, colno=1) + location: SourceLocation(pos=3792, lineno=105, colno=1) + end_location: SourceLocation(pos=3792, lineno=105, colno=1) identifier: 'weather:rain' arguments: \ No newline at end of file From f9b1faca611217617fd600151cf804ec3ab5d0be Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 4 Sep 2021 06:54:04 +0200 Subject: [PATCH 0281/1554] feat: parse subcommands --- packages/mecha/mecha/parse.py | 55 +++--- packages/mecha/mecha/spec.py | 175 +++++++----------- .../snapshots/parse__command_examples__0.txt | 18 +- .../tests/snapshots/spec__prototypes__0.json | 60 +++--- 4 files changed, 140 insertions(+), 168 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index d8fe5c8d7..4697b5903 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -45,7 +45,6 @@ from dataclasses import dataclass, field from functools import partial from typing import ( - TYPE_CHECKING, Any, Dict, Generic, @@ -397,33 +396,44 @@ def parse_root(stream: TokenStream) -> AstRoot: def parse_command(stream: TokenStream) -> AstCommand: """Parse command.""" spec = get_stream_spec(stream) + scope = get_stream_scope(stream) + tree = spec.tree.get(scope) arguments: List[AstNode] = [] - scope: Tuple[str, ...] = () with stream.checkpoint(): location = stream.expect().location end_location = location - while (tree := spec.flattened_tree[scope]) and not ( - tree.executable and stream.get("newline") - ): - literal_names = list(tree.get_literal_children()) - argument_names = list(tree.get_argument_children()) - - with stream.alternative(bool(argument_names)): - patterns = [("literal", name) for name in literal_names] - token = stream.expect_any(*patterns) - scope += (token.value,) - if not TYPE_CHECKING: - continue - - for name, alternative in stream.choose(*argument_names): + while tree and tree.children: + for (name, child), alternative in stream.choose(*tree.children.items()): with alternative, stream.provide(scope=scope + (name,)): - arguments.append(delegate("argument", stream)) - scope += (name,) - - end_location = stream.current.end_location + if child.type == "literal": + token = stream.expect(("literal", name)) + end_location = token.end_location + + elif child.type == "argument": + node = delegate("argument", stream) + arguments.append(node) + end_location = node.end_location + + scope = stream.data["scope"] + tree = child + + if tree.executable and stream.get("newline"): + break + + target = spec.tree.get(tree.redirect) + recursive = target and target.subcommand + + if tree.subcommand or recursive: + subcommand_scope = tree.redirect if tree.redirect is not None else scope + with stream.provide(scope=subcommand_scope): + node = delegate("command", stream) + arguments.append(node) + end_location = node.end_location + scope += ("subcommand",) + break return AstCommand( identifier=":".join(scope), @@ -437,10 +447,9 @@ def parse_argument(stream: TokenStream) -> AstNode: """Parse argument.""" spec = get_stream_spec(stream) scope = get_stream_scope(stream) + tree = spec.tree.get(scope) - tree = spec.flattened_tree[scope] - - if tree.parser: + if tree and tree.parser: with stream.provide(properties=tree.properties or {}): return delegate(tree.parser, stream) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 052cebea3..2e0d2b3cd 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -14,7 +14,6 @@ from typing import ( Any, Dict, - Iterable, List, Literal, NamedTuple, @@ -75,6 +74,7 @@ class CommandTree(BaseModel): executable: Optional[bool] = None redirect: Optional[Tuple[str, ...]] = None children: Optional[Dict[str, "CommandTree"]] = None + subcommand: bool = False @classmethod def load_from( @@ -100,6 +100,19 @@ def load_from( return tree + def get(self, *scope: Union[str, Tuple[str, ...], None]) -> Optional["CommandTree"]: + """Retrieve a nested node.""" + node = self + for arg in scope: + if arg is None: + return None + for name in [arg] if isinstance(arg, str) else arg: + if node.children: + node = node.children.get(name) + if not node: + return None + return node + def extend(self, other: "CommandTree") -> "CommandTree": """Merge nodes from another command tree.""" self.type = other.type @@ -127,28 +140,28 @@ def extend(self, other: "CommandTree") -> "CommandTree": return self - def get(self, *scope: str) -> Optional["CommandTree"]: - """Retrieve a nested node.""" - if not scope: - return self - if not self.children: - return None - child = self.children.get(scope[0]) - return child and child.get(*scope[1:]) - - def get_literal_children(self) -> Iterable[str]: - """Yield the name of all the literal children.""" - if self.children: - for name, child in self.children.items(): - if child.type == "literal": - yield name + def resolve( + self, + root: Optional["CommandTree"] = None, + scope: Tuple[str, ...] = (), + ) -> "CommandTree": + """Resolve redirections and subcommands.""" + if not root: + root = self + + if self.redirect is not None: + if target := root.get(self.redirect): + if scope[: len(self.redirect)] == self.redirect: + target.subcommand = True + self.children = target.children + else: + raise ValueError(f"Invalid redirect {self.redirect}.") - def get_argument_children(self) -> Iterable[str]: - """Yield the name of all the argument children.""" - if self.children: + elif self.children: for name, child in self.children.items(): - if child.type == "argument": - yield name + child.resolve(root, scope + (name,)) + + return self CommandTree.update_forward_refs() @@ -161,12 +174,10 @@ class CommandSpecification: tree: CommandTree = extra_field( default_factory=lambda: CommandTree.load_from(version="1_17") ) - flattened_tree: Dict[Tuple[str, ...], CommandTree] = extra_field( - default_factory=dict - ) - prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) parsers: Dict[str, Parser] = extra_field(default_factory=dict) + prototypes: Dict[str, CommandPrototype] = extra_field(init=False) + def __post_init__(self): self.update() @@ -176,60 +187,12 @@ def add_commands(self, tree: CommandTree): self.update() def update(self): - """Recalculate flattened tree and command prototypes.""" - self.flattened_tree = {} - self.prototypes = {} + """Recalculate command prototypes.""" + self.tree.resolve() - self.generate_flattened_tree(self.tree) + self.prototypes = {} self.generate_prototypes(self.tree) - subcommands = { - last_arg.scope: ":".join(last_arg.scope) + ":" - for prototype in self.prototypes.values() - if prototype.signature - and isinstance(last_arg := prototype.signature[-1], CommandArgument) - and last_arg.name == "subcommand" - and last_arg.scope - } - - truncated: Dict[Tuple[str, ...], CommandPrototype] = {} - - for identifier, prototype in self.prototypes.items(): - for scope, prefix in subcommands.items(): - pivot = len(scope) - if identifier.startswith(prefix): - truncated[scope] = prototype - self.prototypes[identifier] = CommandPrototype( - prototype.identifier, - prototype.signature[pivot:], - tuple( - offset - for arg in prototype.arguments - if (offset := arg - pivot) >= 0 - ), - ) - - for scope, prototype in truncated.items(): - pivot = len(scope) - identifier = ":".join(scope + ("subcommand",)) - self.prototypes[identifier] = CommandPrototype( - identifier, - prototype.signature[:pivot] + (CommandArgument("subcommand", scope),), - tuple(arg for arg in prototype.arguments if arg < pivot) + (pivot,), - ) - - def generate_flattened_tree( - self, - tree: CommandTree, - scope: Tuple[str, ...] = (), - ): - """Traverse command tree and generate flattened lookup table.""" - self.flattened_tree[scope] = tree - - if tree.children: - for name, child in tree.children.items(): - self.generate_flattened_tree(child, scope + (name,)) - def generate_prototypes( self, tree: CommandTree, @@ -238,41 +201,41 @@ def generate_prototypes( arguments: Tuple[int, ...] = (), ): """Traverse command tree and generate prototypes.""" - subcommand = ( - tree.redirect is not None and scope[: len(tree.redirect)] == tree.redirect - ) + if tree.executable: + identifier = ":".join(scope) + self.prototypes[identifier] = CommandPrototype( + identifier, signature, arguments + ) - if tree.redirect is not None and subcommand: + target = self.tree.get(tree.redirect) + recursive = target and target.subcommand + + if scope and tree.subcommand or recursive: identifier = ":".join(scope + ("subcommand",)) + argument_scope = tree.redirect if tree.redirect is not None else scope self.prototypes[identifier] = CommandPrototype( identifier, - signature + (CommandArgument("subcommand", tree.redirect),), + signature + (CommandArgument("subcommand", argument_scope),), arguments + (len(signature),), ) - - if tree.executable: - identifier = ":".join(scope) - self.prototypes[identifier] = CommandPrototype( - identifier, signature, arguments + signature = signature[len(scope) :] + arguments = tuple( + offset for arg in arguments if (offset := arg - len(scope)) >= 0 ) - children: Dict[str, CommandTree] = {} - - if tree.children: - children.update(tree.children) - if tree.redirect is not None and not subcommand: - if redirect := self.flattened_tree[tree.redirect]: - children.update(redirect.children or {}) - - for name, child in children.items(): - self.generate_prototypes( - child, - scope + (name,), - signature - + ( - CommandArgument(name, scope + (name,)) - if child.type == "argument" - else name, - ), - arguments + ((len(signature),) if child.type == "argument" else ()), - ) + if tree.children and not recursive: + for name, child in tree.children.items(): + if child.type == "literal": + self.generate_prototypes( + child, + scope + (name,), + signature + (name,), + arguments, + ) + elif child.type == "argument": + self.generate_prototypes( + child, + scope + (name,), + signature + (CommandArgument(name, scope + (name,)),), + arguments + (len(signature),), + ) diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index dd9b4358a..dd6afd267 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -30,7 +30,7 @@ value: 'story/shiny_gear' location: SourceLocation(pos=67, lineno=3, colno=1) - end_location: SourceLocation(pos=87, lineno=3, colno=21) + end_location: SourceLocation(pos=98, lineno=3, colno=32) identifier: 'advancement:grant:targets:everything' arguments: @@ -70,7 +70,7 @@ value: 5.0 location: SourceLocation(pos=167, lineno=7, colno=1) - end_location: SourceLocation(pos=167, lineno=7, colno=1) + end_location: SourceLocation(pos=172, lineno=7, colno=6) identifier: 'clear' arguments: @@ -746,7 +746,7 @@ value: Float(0.8) location: SourceLocation(pos=915, lineno=21, colno=1) - end_location: SourceLocation(pos=915, lineno=21, colno=1) + end_location: SourceLocation(pos=939, lineno=21, colno=25) identifier: 'defaultgamemode:survival' arguments: @@ -944,7 +944,7 @@ value: 5 location: SourceLocation(pos=1199, lineno=32, colno=1) - end_location: SourceLocation(pos=1221, lineno=32, colno=23) + end_location: SourceLocation(pos=1228, lineno=32, colno=30) identifier: 'experience:query:targets:levels' arguments: @@ -1106,7 +1106,7 @@ data_tags: None location: SourceLocation(pos=1362, lineno=36, colno=1) - end_location: SourceLocation(pos=1401, lineno=36, colno=40) + end_location: SourceLocation(pos=1408, lineno=36, colno=47) identifier: 'fill:from:to:block:hollow' arguments: @@ -1369,7 +1369,7 @@ value: 'example/test' location: SourceLocation(pos=1613, lineno=43, colno=1) - end_location: SourceLocation(pos=1613, lineno=43, colno=1) + end_location: SourceLocation(pos=1630, lineno=43, colno=18) identifier: 'gamemode:creative' arguments: @@ -2148,7 +2148,7 @@ value: String('minecraft:target') location: SourceLocation(pos=2682, lineno=72, colno=1) - end_location: SourceLocation(pos=2682, lineno=72, colno=1) + end_location: SourceLocation(pos=2696, lineno=72, colno=15) identifier: 'locate:mansion' arguments: @@ -3011,7 +3011,7 @@ suffix: 't' location: SourceLocation(pos=3600, lineno=98, colno=1) - end_location: SourceLocation(pos=3600, lineno=98, colno=1) + end_location: SourceLocation(pos=3612, lineno=98, colno=13) identifier: 'time:set:day' arguments: @@ -3131,7 +3131,7 @@ value: 1200 location: SourceLocation(pos=3792, lineno=105, colno=1) - end_location: SourceLocation(pos=3792, lineno=105, colno=1) + end_location: SourceLocation(pos=3804, lineno=105, colno=13) identifier: 'weather:rain' arguments: \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json index ed075e4d3..55582d157 100644 --- a/packages/mecha/tests/snapshots/spec__prototypes__0.json +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -22,63 +22,64 @@ "attribute:target:attribute:modifier:remove:uuid", "attribute:target:attribute:modifier:value:get:uuid", "attribute:target:attribute:modifier:value:get:uuid:scale", + "execute:subcommand", "execute:run:subcommand", - "execute:if:block:pos:block:subcommand", "execute:if:block:pos:block", - "execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:if:block:pos:block:subcommand", "execute:if:score:target:targetObjective:=:source:sourceObjective", - "execute:if:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand", "execute:if:score:target:targetObjective:<:source:sourceObjective", - "execute:if:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:<:source:sourceObjective:subcommand", "execute:if:score:target:targetObjective:<=:source:sourceObjective", - "execute:if:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:<=:source:sourceObjective:subcommand", "execute:if:score:target:targetObjective:>:source:sourceObjective", - "execute:if:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>:source:sourceObjective:subcommand", "execute:if:score:target:targetObjective:>=:source:sourceObjective", - "execute:if:score:target:targetObjective:matches:range:subcommand", + "execute:if:score:target:targetObjective:>=:source:sourceObjective:subcommand", "execute:if:score:target:targetObjective:matches:range", - "execute:if:blocks:start:end:destination:all:subcommand", + "execute:if:score:target:targetObjective:matches:range:subcommand", "execute:if:blocks:start:end:destination:all", - "execute:if:blocks:start:end:destination:masked:subcommand", + "execute:if:blocks:start:end:destination:all:subcommand", "execute:if:blocks:start:end:destination:masked", - "execute:if:entity:entities:subcommand", + "execute:if:blocks:start:end:destination:masked:subcommand", "execute:if:entity:entities", - "execute:if:predicate:predicate:subcommand", + "execute:if:entity:entities:subcommand", "execute:if:predicate:predicate", - "execute:if:data:entity:source:path:subcommand", + "execute:if:predicate:predicate:subcommand", "execute:if:data:entity:source:path", - "execute:if:data:block:sourcePos:path:subcommand", + "execute:if:data:entity:source:path:subcommand", "execute:if:data:block:sourcePos:path", - "execute:if:data:storage:source:path:subcommand", + "execute:if:data:block:sourcePos:path:subcommand", "execute:if:data:storage:source:path", - "execute:unless:block:pos:block:subcommand", + "execute:if:data:storage:source:path:subcommand", "execute:unless:block:pos:block", - "execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:unless:block:pos:block:subcommand", "execute:unless:score:target:targetObjective:=:source:sourceObjective", - "execute:unless:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand", "execute:unless:score:target:targetObjective:<:source:sourceObjective", - "execute:unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:<:source:sourceObjective:subcommand", "execute:unless:score:target:targetObjective:<=:source:sourceObjective", - "execute:unless:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", "execute:unless:score:target:targetObjective:>:source:sourceObjective", - "execute:unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>:source:sourceObjective:subcommand", "execute:unless:score:target:targetObjective:>=:source:sourceObjective", - "execute:unless:score:target:targetObjective:matches:range:subcommand", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", "execute:unless:score:target:targetObjective:matches:range", - "execute:unless:blocks:start:end:destination:all:subcommand", + "execute:unless:score:target:targetObjective:matches:range:subcommand", "execute:unless:blocks:start:end:destination:all", - "execute:unless:blocks:start:end:destination:masked:subcommand", + "execute:unless:blocks:start:end:destination:all:subcommand", "execute:unless:blocks:start:end:destination:masked", - "execute:unless:entity:entities:subcommand", + "execute:unless:blocks:start:end:destination:masked:subcommand", "execute:unless:entity:entities", - "execute:unless:predicate:predicate:subcommand", + "execute:unless:entity:entities:subcommand", "execute:unless:predicate:predicate", - "execute:unless:data:entity:source:path:subcommand", + "execute:unless:predicate:predicate:subcommand", "execute:unless:data:entity:source:path", - "execute:unless:data:block:sourcePos:path:subcommand", + "execute:unless:data:entity:source:path:subcommand", "execute:unless:data:block:sourcePos:path", - "execute:unless:data:storage:source:path:subcommand", + "execute:unless:data:block:sourcePos:path:subcommand", "execute:unless:data:storage:source:path", + "execute:unless:data:storage:source:path:subcommand", "execute:as:targets:subcommand", "execute:at:targets:subcommand", "execute:store:result:score:targets:objective:subcommand", @@ -787,6 +788,5 @@ "whitelist:remove:targets", "whitelist:reload", "publish", - "publish:port", - "execute:subcommand" + "publish:port" ] From 643248125b5e03e5ef084fc61a968fea5461243a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 4 Sep 2021 07:55:14 +0200 Subject: [PATCH 0282/1554] chore: update tokenstream --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index df1f5fecd..2fbe2e5df 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -744,7 +744,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "0.7.4" +version = "0.7.5" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -861,7 +861,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "10c04e08945b9674ab12c05f90982182d554f00b5708b26aa56ef073e99b6916" +content-hash = "4ba84303e554d007af09a4b537ed6119ff8dbe0ce53335938abca2d5d2b9496d" [metadata.files] atomicwrites = [ @@ -1315,8 +1315,8 @@ soupsieve = [ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, ] tokenstream = [ - {file = "tokenstream-0.7.4-py3-none-any.whl", hash = "sha256:bbe62bddb48926c9d49442df05a72ff2f835c2db61488d8c3694c936ad7e5ae8"}, - {file = "tokenstream-0.7.4.tar.gz", hash = "sha256:e435dbab9d8c07622671d9e51cc23a8e999bc4b459a8eb90d69d81bf47239740"}, + {file = "tokenstream-0.7.5-py3-none-any.whl", hash = "sha256:ddba116c816d50b97c9236da5bee699f3044d9649e52c2c6e73ff43f4de67574"}, + {file = "tokenstream-0.7.5.tar.gz", hash = "sha256:892d8a55d9612d7b3540ee6f4733e89c84454801ae528aa5fb6107170964c90d"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index bea9d7756..9cd644974 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.40.1" -tokenstream = "^0.7.4" +tokenstream = "^0.7.5" [tool.poetry.dev-dependencies] black = "^21.7b0" From 34e4a80b81fd1f338766e1221ee31bec3ca786ac Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Sep 2021 17:46:36 +0200 Subject: [PATCH 0283/1554] fix: automatically redirect when leaf isn't executable --- packages/mecha/mecha/resources/patch.json | 14 -------------- packages/mecha/mecha/spec.py | 7 ++++--- 2 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 packages/mecha/mecha/resources/patch.json diff --git a/packages/mecha/mecha/resources/patch.json b/packages/mecha/mecha/resources/patch.json deleted file mode 100644 index 4109aeada..000000000 --- a/packages/mecha/mecha/resources/patch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "root", - "children": { - "execute": { - "type": "literal", - "children": { - "run": { - "type": "literal", - "redirect": [] - } - } - } - } -} diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 2e0d2b3cd..80acfbbe0 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -81,7 +81,6 @@ def load_from( cls, filename: Optional[FileSystemPath] = None, version: Optional[str] = None, - patch: bool = True, ) -> "CommandTree": """Load the command tree from a file.""" sources: List[str] = [] @@ -90,8 +89,6 @@ def load_from( sources.append(Path(filename).read_text()) if version: sources.append(read_text("mecha.resources", f"{version}.json")) - if patch: - sources.append(read_text("mecha.resources", "patch.json")) tree = cls.parse_raw(sources[0]) @@ -161,6 +158,10 @@ def resolve( for name, child in self.children.items(): child.resolve(root, scope + (name,)) + elif not self.executable: + self.redirect = () + self.resolve(root, scope) + return self From 77b2d6a2c49898d5738cefecd2a1b627f20bcce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Sep 2021 01:14:20 +0000 Subject: [PATCH 0284/1554] chore(deps-dev): bump python-semantic-release from 7.19.1 to 7.19.2 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.19.1 to 7.19.2. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.19.1...v7.19.2) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 30 ++++++++++++++++++++++++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a8f9231d9..765483caa 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -536,7 +536,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.19.1" +version = "7.19.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -807,7 +807,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b24230701ee39a7e0d68d4a93f44764079175056b24cd13a53fa57dab008e6d5" +content-hash = "6a4b126fe2ccc3bb4f19d647fec6c121cc3b913cbd156e215df458ec816adfff" [metadata.files] atomicwrites = [ @@ -919,8 +919,10 @@ cryptography = [ {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"}, {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"}, {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] docutils = [ @@ -979,12 +981,22 @@ markdown-it-py = [ {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -993,14 +1005,21 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1010,6 +1029,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, @@ -1121,8 +1143,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.19.1.tar.gz", hash = "sha256:43f52f9a97677c029009063807f1fec9ffaabf049bd02f3fd898f0edf1ce5155"}, - {file = "python_semantic_release-7.19.1-py3-none-any.whl", hash = "sha256:8f5bfe18e78d44dc296966376f2bae2177ea881b628473d685b46f09a75ea92b"}, + {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, + {file = "python_semantic_release-7.19.2-py3-none-any.whl", hash = "sha256:b2c8bb16a643fee0831be4d06138bc1440ebd4f252c3397d41abde179ea56852"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 417a8976b..015ec69bf 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -34,7 +34,7 @@ black = "^21.8b0" rope = "^0.19.0" pytest = "^6.2.5" isort = "^5.9.3" -python-semantic-release = "^7.19.1" +python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" [tool.poetry.scripts] From 72d2ce49e87d401492f6996ed86fa84ff74af26b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Sep 2021 01:04:40 +0000 Subject: [PATCH 0285/1554] chore(deps-dev): bump pyright from 1.1.165 to 1.1.166 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.165 to 1.1.166. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.166/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 7ea34ee2a..3bf233998 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.165" + "pyright": "^1.1.166" } }, "node_modules/pyright": { - "version": "1.1.165", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", - "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", + "version": "1.1.166", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.166.tgz", + "integrity": "sha512-mO+iPT2dhHzlplAV3iKE6u4gUstGZxxLyMSRd1PKZqWhwhTCCGjn3/7VqbAwUt4fuhY8g0V+SAsu+MPT4H3FvQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.165", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", - "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", + "version": "1.1.166", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.166.tgz", + "integrity": "sha512-mO+iPT2dhHzlplAV3iKE6u4gUstGZxxLyMSRd1PKZqWhwhTCCGjn3/7VqbAwUt4fuhY8g0V+SAsu+MPT4H3FvQ==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index ba28f9bb8..6d9f96453 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.165" + "pyright": "^1.1.166" } } From d9d0517993faf7986ec2bdce96e393087ec72020 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 01:11:28 +0000 Subject: [PATCH 0286/1554] chore(deps): bump beet from 0.40.1 to 0.41.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.40.1 to 0.41.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.40.1...v0.41.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a8f9231d9..06204466d 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.40.1" +version = "0.41.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -823,8 +823,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.40.1-py3-none-any.whl", hash = "sha256:faac0ea0b0f5300206856329c656384036a45df585ad1e3ca51c7c7f4801ec26"}, - {file = "beet-0.40.1.tar.gz", hash = "sha256:cfb7e7e57c147109c156b960295d3e05bfa62cbc0b731a0149d9649853a20e43"}, + {file = "beet-0.41.0-py3-none-any.whl", hash = "sha256:3f0055cc9457e1addea375187dd56b0dcd5de4eb95133f1d6765d3056b74bed5"}, + {file = "beet-0.41.0.tar.gz", hash = "sha256:9cc8e43bf690c687835de9557b50c916e706f71b1153560058e8ce00f0f7227c"}, ] black = [ {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, @@ -919,8 +919,10 @@ cryptography = [ {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"}, {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"}, {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] docutils = [ @@ -979,12 +981,22 @@ markdown-it-py = [ {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -993,14 +1005,21 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1010,6 +1029,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, From d6aaa2319060b9c6dc50f026cd4b07807c984cf1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 8 Sep 2021 23:23:12 +0200 Subject: [PATCH 0287/1554] feat: add lectern.contrib.plugin --- packages/lectern/examples/with_beet/beet.json | 14 +++++++ .../with_beet/isolated/plugin_test.md | 40 +++++++++++++++++++ packages/lectern/lectern/contrib/plugin.py | 34 ++++++++++++++++ .../examples__beet_project__0.pack.md | 22 ++++++++++ 4 files changed, 110 insertions(+) create mode 100644 packages/lectern/examples/with_beet/isolated/plugin_test.md create mode 100644 packages/lectern/lectern/contrib/plugin.py diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index 490d2201f..aab038a5a 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -18,6 +18,20 @@ "load": ["isolated/yaml_test.md"] } } + }, + { + "require": [ + "lectern.contrib.plugin", + "lectern.contrib.relative_location" + ], + "pipeline": ["lectern"], + "meta": { + "generate_namespace": "isolated", + "generate_prefix": "plugin_test", + "lectern": { + "load": ["isolated/plugin_test.md"] + } + } } ], "meta": { diff --git a/packages/lectern/examples/with_beet/isolated/plugin_test.md b/packages/lectern/examples/with_beet/isolated/plugin_test.md new file mode 100644 index 000000000..781ffca8a --- /dev/null +++ b/packages/lectern/examples/with_beet/isolated/plugin_test.md @@ -0,0 +1,40 @@ +# Plugin test + +```python +# @plugin + +# Wait for lectern to be done +yield + +# Copy all functions +for name, function in list(ctx.data.functions.items()): + ctx.data[f"{name}_copy"] = function +``` + +`@plugin` + +```python +from typing import Mapping +from dataclasses import replace + +from beet import Function +from lectern import Directive, Document, Fragment + +def handle_with_logging_modifier( + fragment: Fragment, + directives: Mapping[str, Directive], +) -> Fragment: + if fragment.modifier == "with_logging": + function = fragment.as_file(Function) + function.prepend(f"say running {fragment.arguments[0]}") + fragment = replace(fragment, file=function) + return fragment + +ctx.inject(Document).loaders.append(handle_with_logging_modifier) +``` + +`@function(with_logging) foo` + +```mcfunction +say hello +``` diff --git a/packages/lectern/lectern/contrib/plugin.py b/packages/lectern/lectern/contrib/plugin.py new file mode 100644 index 000000000..c81cb135a --- /dev/null +++ b/packages/lectern/lectern/contrib/plugin.py @@ -0,0 +1,34 @@ +"""Plugin that adds a directive for running plugin code in a document.""" + + +__all__ = [ + "PluginDirective", +] + + +from dataclasses import dataclass +from textwrap import indent + +from beet import Context, DataPack, ResourcePack, TextFile +from beet.core.utils import JsonDict + +from lectern import Document, Fragment + + +def beet_default(ctx: Context): + document = ctx.inject(Document) + document.directives["plugin"] = PluginDirective(ctx) + + +@dataclass +class PluginDirective: + """Directive that evaluates the fragment as a beet plugin.""" + + ctx: Context + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + file_instance = fragment.as_file(TextFile) + body = indent(file_instance.text.strip() or "pass", " ") + globals_dict: JsonDict = {} + exec("def beet_default(ctx):\n" + body, globals_dict) + self.ctx.require(globals_dict["beet_default"]) diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index ac5857470..d37500118 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -455,6 +455,28 @@ +- `@function isolated:plugin_test/foo` + +

+ + ```mcfunction + say running isolated:plugin_test/foo + say hello + ``` + +
+ +- `@function isolated:plugin_test/foo_copy` + +
+ + ```mcfunction + say running isolated:plugin_test/foo + say hello + ``` + +
+ ## Resource pack - `@resource_pack pack.mcmeta` From 94928eb5455afdae53cafed820ff6909bdd61586 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Sep 2021 21:24:14 +0000 Subject: [PATCH 0288/1554] 0.16.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 8a6481a88..0750b4dcc 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.16.0 (2021-09-08) +### Feature +* Add lectern.contrib.plugin ([`17e1c78`](https://github.com/mcbeet/lectern/commit/17e1c7830d73035b561388aece25d85a542057f8)) + ## v0.15.3 (2021-09-01) ### Fix * Update dependencies and make pyright happy with new click typings ([`9edd063`](https://github.com/mcbeet/lectern/commit/9edd06327146f065ed348bddebf8aec0d1ea128a)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index d6354d237..377112c46 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.15.3" +__version__ = "0.16.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 015ec69bf..75ee90533 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.15.3" +version = "0.16.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 8a58f47a2929dea4354e827fd8d2c47f62fb3908 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 11 Sep 2021 07:58:29 +0200 Subject: [PATCH 0289/1554] feat: tweak parser --- packages/mecha/mecha/__init__.py | 2 + packages/mecha/mecha/api.py | 6 +- packages/mecha/mecha/ast.py | 151 +- packages/mecha/mecha/config.py | 114 ++ packages/mecha/mecha/parse.py | 1491 +++++++++-------- packages/mecha/mecha/prototype.py | 37 + .../mecha/resources/argument_examples.json | 4 +- packages/mecha/mecha/spec.py | 170 +- packages/mecha/poetry.lock | 14 +- packages/mecha/pyproject.toml | 4 +- ...rgument_examples_brigadier_double_2__0.txt | 2 +- ...rgument_examples_brigadier_double_5__0.txt | 2 +- ...rgument_examples_brigadier_float_11__0.txt | 2 +- ...argument_examples_brigadier_float_8__0.txt | 2 +- ...gument_examples_brigadier_string_27__0.txt | 2 +- ...rgument_examples_minecraft_angle_28__0.txt | 4 +- ...rgument_examples_minecraft_angle_29__0.txt | 4 +- ...rgument_examples_minecraft_angle_30__0.txt | 4 +- ...ent_examples_minecraft_block_pos_31__0.txt | 12 +- ...ent_examples_minecraft_block_pos_32__0.txt | 12 +- ...ent_examples_minecraft_block_pos_33__0.txt | 12 +- ...ent_examples_minecraft_block_pos_34__0.txt | 12 +- ...ent_examples_minecraft_block_pos_35__0.txt | 10 +- ...nt_examples_minecraft_column_pos_47__0.txt | 6 +- ...nt_examples_minecraft_column_pos_48__0.txt | 6 +- ...nt_examples_minecraft_column_pos_49__0.txt | 6 +- ...gument_examples_minecraft_entity_56__0.txt | 2 +- ...gument_examples_minecraft_entity_57__0.txt | 2 +- ...gument_examples_minecraft_entity_58__0.txt | 2 +- ...gument_examples_minecraft_entity_59__0.txt | 2 +- ...gument_examples_minecraft_entity_60__0.txt | 2 +- ..._examples_minecraft_game_profile_76__0.txt | 4 +- ...ument_examples_minecraft_message_94__0.txt | 2 +- ...ument_examples_minecraft_message_95__0.txt | 2 +- ...ument_examples_minecraft_message_96__0.txt | 2 +- ...ument_examples_minecraft_message_97__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_102__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_103__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_104__0.txt | 4 +- ...ent_examples_minecraft_nbt_path_105__0.txt | 4 +- ...ent_examples_minecraft_nbt_path_106__0.txt | 4 +- ...ent_examples_minecraft_nbt_path_107__0.txt | 2 +- ...ent_examples_minecraft_rotation_129__0.txt | 8 +- ...ent_examples_minecraft_rotation_130__0.txt | 8 +- ...ent_examples_minecraft_rotation_131__0.txt | 8 +- ...examples_minecraft_score_holder_132__0.txt | 2 +- ...examples_minecraft_score_holder_133__0.txt | 2 +- ...examples_minecraft_score_holder_134__0.txt | 2 +- ...examples_minecraft_score_holder_135__0.txt | 2 +- ...rgument_examples_minecraft_vec2_147__0.txt | 8 +- ...rgument_examples_minecraft_vec2_148__0.txt | 8 +- ...rgument_examples_minecraft_vec2_149__0.txt | 6 +- ...rgument_examples_minecraft_vec2_150__0.txt | 8 +- ...rgument_examples_minecraft_vec3_151__0.txt | 12 +- ...rgument_examples_minecraft_vec3_152__0.txt | 12 +- ...rgument_examples_minecraft_vec3_153__0.txt | 12 +- ...rgument_examples_minecraft_vec3_154__0.txt | 12 +- ...rgument_examples_minecraft_vec3_155__0.txt | 8 +- ...rgument_examples_minecraft_vec3_156__0.txt | 10 +- .../snapshots/parse__command_examples__0.txt | 286 ++-- packages/mecha/tests/test_parse.py | 4 +- 61 files changed, 1293 insertions(+), 1256 deletions(-) create mode 100644 packages/mecha/mecha/config.py create mode 100644 packages/mecha/mecha/prototype.py diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e2654c5a3..739733bb0 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -2,7 +2,9 @@ from .api import * +from .config import * from .error import * from .parse import * +from .prototype import * from .resources import * from .spec import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 16f0a3ae8..279457f0a 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -12,7 +12,7 @@ from .ast import AstCommand, AstRoot from .parse import delegate, get_default_parsers -from .spec import CommandSpecification +from .spec import CommandSpec @dataclass @@ -21,8 +21,8 @@ class Mecha: ctx: InitVar[Optional[Context]] = None - spec: CommandSpecification = extra_field( - default_factory=lambda: CommandSpecification(parsers=get_default_parsers()) + spec: CommandSpec = extra_field( + default_factory=lambda: CommandSpec(parsers=get_default_parsers()) ) def create_token_stream(self, text: str) -> TokenStream: diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 91690942e..f04a1b7dd 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -33,16 +33,17 @@ ] -from dataclasses import dataclass, field, fields +from dataclasses import dataclass, fields from typing import Any, Generic, Iterator, Literal, Optional, Tuple, TypeVar, Union +from beet.core.utils import extra_field, required_field + # pyright: reportMissingTypeStubs=false from nbtlib import Compound from nbtlib import List as ListTag -from tokenstream import SourceLocation +from tokenstream import UNKNOWN_LOCATION, SourceLocation, set_location T = TypeVar("T") -NumericType = TypeVar("NumericType", float, int) AstNodeType = TypeVar("AstNodeType", bound="AstNode") @@ -50,8 +51,8 @@ class AstNode: """Base class for all ast nodes.""" - location: SourceLocation = field(repr=False, hash=False, compare=False) - end_location: SourceLocation = field(repr=False, hash=False, compare=False) + location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) + end_location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) def __iter__(self) -> Iterator["AstNode"]: yield self @@ -80,6 +81,10 @@ def dump(self, prefix: str = "") -> str: for f in fields(self) ) + def emit_error(self, exc: T) -> T: + """Add location information to invalid syntax exceptions.""" + return set_location(exc, self) + class AstChildren(Tuple[AstNodeType, ...]): """Specialized tuple subclass for holding multiple child ast nodes.""" @@ -89,55 +94,55 @@ class AstChildren(Tuple[AstNodeType, ...]): class AstRoot(AstNode): """Root ast node""" - filename: Optional[str] - commands: AstChildren["AstCommand"] + filename: Optional[str] = None + commands: AstChildren["AstCommand"] = required_field() @dataclass(frozen=True) class AstCommand(AstNode): """Command ast node""" - identifier: str - arguments: AstChildren[AstNode] + identifier: str = required_field() + arguments: AstChildren[AstNode] = required_field() @dataclass(frozen=True) class AstValue(AstNode, Generic[T]): """Value ast node""" - value: T + value: T = required_field() @dataclass(frozen=True) -class AstCoordinate(AstNode, Generic[NumericType]): +class AstCoordinate(AstNode): """Coordinate ast node.""" - value: NumericType - prefix: Literal["absolute", "relative", "local"] + type: Literal["absolute", "relative", "local"] = "absolute" + value: Union[int, float] = required_field() @dataclass(frozen=True) -class AstVector2(AstNode, Generic[NumericType]): +class AstVector2(AstNode): """Vector 2 ast node.""" - x: AstCoordinate[NumericType] - y: AstCoordinate[NumericType] + x: AstCoordinate = required_field() + y: AstCoordinate = required_field() @dataclass(frozen=True) -class AstVector3(AstNode, Generic[NumericType]): +class AstVector3(AstNode): """Vector 3 ast node.""" - x: AstCoordinate[NumericType] - y: AstCoordinate[NumericType] - z: AstCoordinate[NumericType] + x: AstCoordinate = required_field() + y: AstCoordinate = required_field() + z: AstCoordinate = required_field() @dataclass(frozen=True) class AstJson(AstNode): """Base ast node for json.""" - def get_value(self) -> Any: + def evaluate(self) -> Any: """Return the json value.""" raise NotImplementedError() @@ -146,9 +151,9 @@ def get_value(self) -> Any: class AstJsonValue(AstJson): """Ast json value node.""" - value: Any + value: Any = required_field() - def get_value(self) -> Any: + def evaluate(self) -> Any: return self.value @@ -156,35 +161,35 @@ def get_value(self) -> Any: class AstJsonArray(AstJson): """Ast json array node.""" - elements: AstChildren[AstJson] + elements: AstChildren[AstJson] = required_field() - def get_value(self) -> Any: - return [element.get_value() for element in self.elements] + def evaluate(self) -> Any: + return [element.evaluate() for element in self.elements] @dataclass(frozen=True) class AstJsonObjectEntry(AstNode): """Ast json object entry node.""" - key: AstValue[str] - value: AstJson + key: AstValue[str] = required_field() + value: AstJson = required_field() @dataclass(frozen=True) class AstJsonObject(AstJson): """Ast json object node.""" - entries: AstChildren[AstJsonObjectEntry] + entries: AstChildren[AstJsonObjectEntry] = required_field() - def get_value(self) -> Any: - return {entry.key.value: entry.value.get_value() for entry in self.entries} + def evaluate(self) -> Any: + return {entry.key.value: entry.value.evaluate() for entry in self.entries} @dataclass(frozen=True) class AstNbt(AstNode): """Base ast node for nbt.""" - def get_value(self) -> Any: + def evaluate(self) -> Any: """Return the nbt value.""" raise NotImplementedError() @@ -193,9 +198,9 @@ def get_value(self) -> Any: class AstNbtValue(AstNbt): """Ast nbt value node.""" - value: Any + value: Any = required_field() - def get_value(self) -> Any: + def evaluate(self) -> Any: return self.value @@ -203,29 +208,29 @@ def get_value(self) -> Any: class AstNbtList(AstNbt): """Ast nbt list node.""" - elements: AstChildren[AstNbt] + elements: AstChildren[AstNbt] = required_field() - def get_value(self) -> Any: - return ListTag([element.get_value() for element in self.elements]) # type: ignore + def evaluate(self) -> Any: + return ListTag([element.evaluate() for element in self.elements]) # type: ignore @dataclass(frozen=True) class AstNbtCompoundEntry(AstNode): """Ast nbt compound entry node.""" - key: AstValue[str] - value: AstNbt + key: AstValue[str] = required_field() + value: AstNbt = required_field() @dataclass(frozen=True) class AstNbtCompound(AstNbt): """Ast nbt compound node.""" - entries: AstChildren[AstNbtCompoundEntry] + entries: AstChildren[AstNbtCompoundEntry] = required_field() - def get_value(self) -> Any: + def evaluate(self) -> Any: return Compound( # type: ignore - {entry.key.value: entry.value.get_value() for entry in self.entries}, + {entry.key.value: entry.value.evaluate() for entry in self.entries}, ) @@ -233,42 +238,42 @@ def get_value(self) -> Any: class AstResourceLocation(AstNode): """Ast resource location node.""" - is_tag: bool - namespace: Optional[AstValue[str]] - path: AstValue[str] + is_tag: bool = False + namespace: Optional[AstValue[str]] = None + path: AstValue[str] = required_field() @dataclass(frozen=True) class AstBlockState(AstNode): """Ast block state node.""" - key: AstValue[str] - value: AstValue[str] + key: AstValue[str] = required_field() + value: AstValue[str] = required_field() @dataclass(frozen=True) class AstBlock(AstNode): """Ast block node.""" - identifier: AstResourceLocation - block_states: AstChildren[AstBlockState] - data_tags: Optional[AstNbt] + identifier: AstResourceLocation = required_field() + block_states: AstChildren[AstBlockState] = AstChildren() + data_tags: Optional[AstNbt] = None @dataclass(frozen=True) class AstItem(AstNode): """Ast item node.""" - identifier: AstResourceLocation - data_tags: Optional[AstNbt] + identifier: AstResourceLocation = required_field() + data_tags: Optional[AstNbt] = None @dataclass(frozen=True) -class AstRange(AstNode, Generic[NumericType]): +class AstRange(AstNode): """Ast range node.""" - min: Optional[NumericType] - max: Optional[NumericType] + min: Optional[Union[int, float]] = required_field() + max: Optional[Union[int, float]] = required_field() @property def exact(self) -> bool: @@ -276,7 +281,7 @@ def exact(self) -> bool: return self.min == self.max @property - def value(self) -> NumericType: + def value(self) -> Union[int, float]: """Return the exact value.""" return self.min # type: ignore @@ -285,73 +290,75 @@ def value(self) -> NumericType: class AstTime(AstNode): """Ast time node.""" - value: float - suffix: Literal[None, "d", "s", "t"] + value: Union[int, float] = required_field() + suffix: Literal[None, "d", "s", "t"] = None @dataclass(frozen=True) class AstSelectorScoreMatch(AstNode): """Ast selector score match node.""" - objective: AstValue[str] - value: AstRange[int] + key: AstValue[str] = required_field() + value: AstRange = required_field() @dataclass(frozen=True) class AstSelectorScores(AstNode): """Ast selector scores node.""" - scores: AstChildren[AstSelectorScoreMatch] + scores: AstChildren[AstSelectorScoreMatch] = required_field() @dataclass(frozen=True) class AstSelectorAdvancementMatch(AstNode): """Ast selector advancement match node.""" - name: AstResourceLocation - value: AstValue[bool] + key: AstResourceLocation = required_field() + value: AstValue[bool] = required_field() @dataclass(frozen=True) class AstSelectorAdvancements(AstNode): """Ast selector advancements node.""" - advancements: AstChildren[AstSelectorAdvancementMatch] + advancements: AstChildren[AstSelectorAdvancementMatch] = required_field() @dataclass(frozen=True) class AstSelectorArgument(AstNode): """Ast selector argument node.""" - inverted: bool - key: AstValue[str] - value: AstNode + inverted: bool = False + key: AstValue[str] = required_field() + value: AstNode = required_field() @dataclass(frozen=True) class AstSelector(AstNode): """Ast selector node.""" - variable: Literal["p", "r", "a", "e", "s"] - arguments: AstChildren[AstSelectorArgument] + variable: Literal["p", "r", "a", "e", "s"] = required_field() + arguments: AstChildren[AstSelectorArgument] = AstChildren() @dataclass(frozen=True) class AstMessage(AstNode): """Ast message node.""" - sentence: AstChildren[Union[AstValue[str], AstSelector]] + words: AstChildren[Union[AstValue[str], AstSelector]] = required_field() @dataclass(frozen=True) class AstNbtPathSubscript(AstNode): """Ast nbt path subscript node.""" - match: Union[None, AstValue[int], AstNbtCompound] + index: Union[None, AstValue[int], AstNbtCompound] = None @dataclass(frozen=True) class AstNbtPath(AstNode): """Ast nbt path node.""" - nodes: AstChildren[Union[AstValue[str], AstNbtCompound, AstNbtPathSubscript]] + components: AstChildren[ + Union[AstValue[str], AstNbtCompound, AstNbtPathSubscript] + ] = required_field() diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py new file mode 100644 index 000000000..ae7814000 --- /dev/null +++ b/packages/mecha/mecha/config.py @@ -0,0 +1,114 @@ +__all__ = [ + "CommandTree", +] + + +from importlib.resources import read_text +from pathlib import Path +from typing import Dict, List, Literal, Optional, Tuple, Union + +from beet.core.utils import FileSystemPath, JsonDict +from pydantic import BaseModel + + +class CommandTree(BaseModel): + """Deserialized representation of the command tree.""" + + type: Literal["root", "literal", "argument"] + parser: Optional[str] = None + properties: Optional[JsonDict] = None + executable: Optional[bool] = None + redirect: Optional[Tuple[str, ...]] = None + children: Optional[Dict[str, "CommandTree"]] = None + subcommand: bool = False + + @classmethod + def load_from( + cls, + filename: Optional[FileSystemPath] = None, + version: Optional[str] = None, + ) -> "CommandTree": + """Load the command tree from a file.""" + sources: List[str] = [] + + if filename: + sources.append(Path(filename).read_text()) + if version: + sources.append(read_text("mecha.resources", f"{version}.json")) + + tree = cls.parse_raw(sources[0]) + + for source in sources[1:]: + tree = tree.extend(cls.parse_raw(source)) + + return tree + + def get(self, *scope: Union[str, Tuple[str, ...], None]) -> Optional["CommandTree"]: + """Retrieve a nested node.""" + node = self + for arg in scope: + if arg is None: + return None + for name in [arg] if isinstance(arg, str) else arg: + if node.children: + node = node.children.get(name) + if not node: + return None + return node + + def extend(self, other: "CommandTree") -> "CommandTree": + """Merge nodes from another command tree.""" + self.type = other.type + + if other.parser is not None: + self.parser = other.parser + + if other.properties is not None: + self.properties = other.properties + + if other.executable is not None: + self.executable = other.executable + + if other.redirect is not None: + self.redirect = other.redirect + + if other.children: + if self.children is None: + self.children = {} + for name, child in other.children.items(): + if name in self.children: + self.children[name].extend(child) + else: + self.children[name] = child + + return self + + def resolve( + self, + root: Optional["CommandTree"] = None, + scope: Tuple[str, ...] = (), + ) -> "CommandTree": + """Resolve redirections and subcommands.""" + if not root: + root = self + + if self.redirect is not None: + if target := root.get(self.redirect): + if scope[: len(self.redirect)] == self.redirect: + target.subcommand = True + self.children = target.children + else: + raise ValueError(f"Invalid redirect {self.redirect}.") + + elif self.children: + for name, child in self.children.items(): + child.resolve(root, scope + (name,)) + + elif not self.executable: + self.redirect = () + self.resolve(root, scope) + + return self + + +CommandTree.update_forward_refs() diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 4697b5903..e5afc857d 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -4,63 +4,63 @@ "get_stream_scope", "get_stream_properties", "delegate", + "QuoteHelper", "parse_root", "parse_command", "parse_argument", "parse_bool", "NumericParser", - "StringParser", "CoordinateParser", + "IntegerConstraint", + "MinMaxConstraint", + "RestrictCoordinateConstraint", + "StringParser", + "parse_string_argument", "Vector2Parser", "Vector3Parser", "JsonParser", "NbtParser", - "parse_compound_tag", - "parse_adjacent_nbt", + "NbtCompoundConstraint", + "AdjacentConstraint", "ResourceLocationParser", + "NoTagConstraint", "BlockParser", "ItemParser", - "LiteralStringParser", + "NoBlockStatesConstraint", + "NoDataTagsConstraint", + "ValueParser", + "ValueConstraint", "RangeParser", - "parse_objective", - "parse_player_name", + "LengthConstraint", "parse_swizzle", - "parse_team", "TimeParser", "parse_uuid", "SelectorParser", + "SelectorArgumentParser", + "SelectorArgumentInvertConstraint", "parse_selector_scores", "parse_selector_advancements", - "parse_entity", - "parse_score_holder", + "SelectorPlayerConstraint", + "SelectorTypeConstraint", + "SelectorSingleConstraint", + "SelectorAmountConstraint", + "EntityParser", + "ScoreHolderParser", "parse_message", "NbtPathParser", - "INTEGER_PATTERN", - "FLOAT_PATTERN", - "CHAT_COLORS", + "NUMBER_PATTERN", ] import re from dataclasses import dataclass, field from functools import partial -from typing import ( - Any, - Dict, - Generic, - Iterator, - List, - Optional, - Tuple, - Type, - TypeVar, - overload, -) +from typing import Any, Dict, Iterator, List, Literal, Optional, Tuple, Type, overload from uuid import UUID # pyright: reportMissingTypeStubs=false from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String -from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream +from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream, set_location from .ast import ( AstBlock, @@ -98,158 +98,193 @@ AstVector3, ) from .error import InvalidEscapeSequence, UnrecognizedParser -from .spec import CommandSpecification, Parser - -NumericType = TypeVar("NumericType", float, int) - - -INTEGER_PATTERN: str = r"-?\d+" -FLOAT_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" - - -CHAT_COLORS: List[str] = [ - "black", - "dark_blue", - "dark_green", - "dark_aqua", - "dark_red", - "dark_purple", - "gold", - "gray", - "dark_gray", - "blue", - "green", - "aqua", - "red", - "light_purple", - "yellow", - "white", -] +from .spec import CommandSpec, Parser + +NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" -# TODO: Move validation that doesn't break parsing into a separate pass # TODO: Handle the extended syntax by default and validate vanilla compatibility in a separate pass def get_default_parsers() -> Dict[str, Parser]: """Return the default parsers.""" return { - "root": parse_root, - "command": parse_command, - "argument": parse_argument, + ################################################################################ + # Primitives + ################################################################################ + "literal": ValueParser(name="literal"), + "bool": parse_bool, + "numeric": NumericParser(), + "integer": IntegerConstraint(delegate("numeric")), + "coordinate": CoordinateParser(), + "integer_coordinate": IntegerConstraint(delegate("coordinate")), + "time": TimeParser(), + "word": StringParser(type="word"), + "phrase": StringParser(type="phrase"), + "greedy": StringParser(type="greedy"), "json": JsonParser(), "nbt": NbtParser(), + "nbt_compound": NbtCompoundConstraint(delegate("nbt")), + "adjacent_nbt_compound": AdjacentConstraint( + parser=delegate("nbt_compound"), + hint=r"\{", + ), + "nbt_path": NbtPathParser(), + "range": RangeParser(type=float), + "integer_range": RangeParser(type=int), + "resource_location_or_tag": ResourceLocationParser(), + "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), + "uuid": parse_uuid, + "objective": LengthConstraint( + parser=ValueParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), + limit=16, + ), + "player_name": LengthConstraint( + parser=ValueParser("player_name", r"[a-zA-Z0-9_.+-]+"), + limit=16, + ), + "swizzle": parse_swizzle, + "team": ValueParser("team", r"[a-zA-Z0-9_.+-]+"), + ################################################################################ + # Selector + ################################################################################ "selector": SelectorParser(), - "selector:argument:x": delegate("brigadier:double"), - "selector:argument:y": delegate("brigadier:double"), - "selector:argument:z": delegate("brigadier:double"), - "selector:argument:distance": delegate("minecraft:float_range"), - "selector:argument:dx": delegate("brigadier:double"), - "selector:argument:dy": delegate("brigadier:double"), - "selector:argument:dz": delegate("brigadier:double"), + "selector:argument": SelectorArgumentInvertConstraint( + SelectorArgumentParser(), + allow_invert=[ + "tag", + "team", + "gamemode", + "name", + "type", + "nbt", + "predicate", + ], + ), + "selector:argument:x": delegate("numeric"), + "selector:argument:y": delegate("numeric"), + "selector:argument:z": delegate("numeric"), + "selector:argument:distance": delegate("range"), + "selector:argument:dx": delegate("numeric"), + "selector:argument:dy": delegate("numeric"), + "selector:argument:dz": delegate("numeric"), "selector:argument:scores": parse_selector_scores, - "selector:argument:tag": StringParser(type="word"), - "selector:argument:team": StringParser(type="word"), - "selector:argument:limit": delegate("brigadier:integer"), - "selector:argument:sort": LiteralStringParser( - [ + "selector:argument:tag": delegate("word"), + "selector:argument:team": delegate("word"), + "selector:argument:limit": delegate("integer"), + "selector:argument:sort": ValueConstraint( + parser=delegate("word"), + values=[ "nearest", "furthest", "random", "arbitrary", ], ), - "selector:argument:level": delegate("minecraft:int_range"), - "selector:argument:gamemode": LiteralStringParser( - [ + "selector:argument:level": delegate("integer_range"), + "selector:argument:gamemode": ValueConstraint( + parser=delegate("word"), + values=[ "adventure", "creative", "spectator", "survival", ], ), - "selector:argument:name": StringParser(type="phrase"), - "selector:argument:x_rotation": delegate("minecraft:float_range"), - "selector:argument:y_rotation": delegate("minecraft:float_range"), - "selector:argument:type": ResourceLocationParser(), - "selector:argument:nbt": delegate("minecraft:nbt_compound_tag"), + "selector:argument:name": delegate("phrase"), + "selector:argument:x_rotation": delegate("range"), + "selector:argument:y_rotation": delegate("range"), + "selector:argument:type": delegate("resource_location_or_tag"), + "selector:argument:nbt": delegate("nbt_compound"), "selector:argument:advancements": parse_selector_advancements, - "selector:argument:predicate": delegate("minecraft:resource_location"), - "brigadier:bool": parse_bool, - "brigadier:double": NumericParser[float]( - type=float, - name="double", - pattern=FLOAT_PATTERN, - min=-1.7976931348623157e308, - max=1.7976931348623157e308, + "selector:argument:predicate": delegate("resource_location"), + ################################################################################ + # Command + ################################################################################ + "root": parse_root, + "command": parse_command, + "command:argument": parse_argument, + "command:argument:brigadier:bool": delegate("bool"), + "command:argument:brigadier:double": MinMaxConstraint(delegate("numeric")), + "command:argument:brigadier:float": MinMaxConstraint(delegate("numeric")), + "command:argument:brigadier:integer": MinMaxConstraint(delegate("integer")), + "command:argument:brigadier:long": MinMaxConstraint(delegate("integer")), + "command:argument:brigadier:string": parse_string_argument, + "command:argument:minecraft:angle": RestrictCoordinateConstraint( + parser=delegate("coordinate"), + disallow=["local"], + ), + "command:argument:minecraft:block_pos": Vector3Parser(delegate("coordinate")), + "command:argument:minecraft:block_predicate": BlockParser( + resource_location_parser=delegate("resource_location_or_tag"), ), - "brigadier:float": NumericParser[float]( - type=float, - name="float", - pattern=FLOAT_PATTERN, - min=-3.4028234663852886e38, - max=3.4028234663852886e38, + "command:argument:minecraft:block_state": BlockParser( + resource_location_parser=delegate("resource_location"), ), - "brigadier:integer": NumericParser[int]( - type=int, - name="integer", - pattern=INTEGER_PATTERN, - min=-2147483648, - max=2147483647, + "command:argument:minecraft:color": ValueConstraint( + parser=delegate("word"), + values=[ + "reset", + "black", + "dark_blue", + "dark_green", + "dark_aqua", + "dark_red", + "dark_purple", + "gold", + "gray", + "dark_gray", + "blue", + "green", + "aqua", + "red", + "light_purple", + "yellow", + "white", + ], ), - "brigadier:long": NumericParser[int]( - type=int, - name="long", - pattern=INTEGER_PATTERN, - min=-9223372036854775808, - max=9223372036854775807, + "command:argument:minecraft:column_pos": Vector2Parser( + coordinate_parser=RestrictCoordinateConstraint( + parser=delegate("integer_coordinate"), + disallow=["local"], + ), ), - "brigadier:string": StringParser(), - "minecraft:angle": CoordinateParser[float]( - type=float, - name="angle", - min=-180.0, - max=180.0, - allow_local=False, + "command:argument:minecraft:component": delegate("json"), + "command:argument:minecraft:dimension": delegate("resource_location"), + "command:argument:minecraft:entity": EntityParser( + selector_parser=SelectorTypeConstraint( + SelectorAmountConstraint(delegate("selector")) + ), ), - "minecraft:block_pos": Vector3Parser[float]( - coordinate_parser=CoordinateParser[float](type=float), + "command:argument:minecraft:entity_anchor": ValueConstraint( + parser=delegate("word"), + values=["eyes", "feet"], ), - "minecraft:block_predicate": BlockParser(), - "minecraft:block_state": BlockParser( - resource_location_parser=ResourceLocationParser(allow_tag=False), + "command:argument:minecraft:entity_summon": delegate("resource_location"), + "command:argument:minecraft:float_range": delegate("range"), + "command:argument:minecraft:function": delegate("resource_location_or_tag"), + "command:argument:minecraft:game_profile": EntityParser( + selector_parser=SelectorPlayerConstraint(delegate("selector")), ), - "minecraft:color": LiteralStringParser(["reset"] + CHAT_COLORS), - "minecraft:column_pos": Vector2Parser[int]( - coordinate_parser=CoordinateParser[int]( - type=int, - allow_local=False, - ), + "command:argument:minecraft:int_range": delegate("integer_range"), + "command:argument:minecraft:item_enchantment": delegate("word"), + "command:argument:minecraft:item_predicate": ItemParser( + resource_location_parser=delegate("resource_location_or_tag"), ), - "minecraft:component": delegate("json"), - "minecraft:dimension": delegate("minecraft:resource_location"), - "minecraft:entity": parse_entity, - "minecraft:entity_anchor": LiteralStringParser(["eyes", "feet"]), - "minecraft:entity_summon": delegate("minecraft:resource_location"), - "minecraft:float_range": RangeParser[float](type=float), - "minecraft:function": ResourceLocationParser(), - "minecraft:game_profile": delegate("minecraft:entity"), - "minecraft:int_range": RangeParser[int](type=int), - "minecraft:item_enchantment": StringParser(type="word"), - "minecraft:item_predicate": ItemParser(), - "minecraft:item_slot": StringParser(type="word"), - "minecraft:item_stack": ItemParser( - resource_location_parser=ResourceLocationParser(allow_tag=False), + "command:argument:minecraft:item_slot": delegate("word"), + "command:argument:minecraft:item_stack": ItemParser( + resource_location_parser=delegate("resource_location"), ), - "minecraft:message": parse_message, - "minecraft:mob_effect": delegate("minecraft:resource_location"), - "minecraft:nbt_compound_tag": parse_compound_tag, - "minecraft:nbt_path": NbtPathParser(), - "minecraft:nbt_tag": delegate("nbt"), - "minecraft:objective": parse_objective, - "minecraft:objective_criteria": ResourceLocationParser(allow_tag=False), - "minecraft:operation": LiteralStringParser( - [ + "command:argument:minecraft:message": parse_message, + "command:argument:minecraft:mob_effect": delegate("resource_location"), + "command:argument:minecraft:nbt_compound_tag": delegate("nbt_compound"), + "command:argument:minecraft:nbt_path": delegate("nbt_path"), + "command:argument:minecraft:nbt_tag": delegate("nbt"), + "command:argument:minecraft:objective": delegate("objective"), + "command:argument:minecraft:objective_criteria": delegate("resource_location"), + "command:argument:minecraft:operation": ValueConstraint( + parser=delegate("literal"), + values=[ "+=", "-=", "*=", @@ -260,35 +295,35 @@ def get_default_parsers() -> Dict[str, Parser]: ">", "><", ], - r"\S+", ), # TODO: "minecraft:particle" - "minecraft:resource_location": ResourceLocationParser(allow_tag=False), - "minecraft:rotation": Vector2Parser[float]( - coordinate_parser=CoordinateParser[float]( - type=float, - name="angle", - min=-180.0, - max=180.0, - allow_local=False, - ) + "command:argument:minecraft:resource_location": delegate("resource_location"), + "command:argument:minecraft:rotation": Vector2Parser( + coordinate_parser=RestrictCoordinateConstraint( + parser=delegate("coordinate"), + disallow=["local"], + ), + ), + "command:argument:minecraft:score_holder": ScoreHolderParser( + entity_parser=EntityParser( + selector_parser=SelectorAmountConstraint(delegate("selector")), + ), ), - "minecraft:score_holder": parse_score_holder, - "minecraft:scoreboard_slot": StringParser(type="word"), - "minecraft:swizzle": parse_swizzle, - "minecraft:team": parse_team, - "minecraft:time": TimeParser(), - "minecraft:uuid": parse_uuid, - "minecraft:vec2": Vector2Parser( - coordinate_parser=CoordinateParser[float](type=float), + "command:argument:minecraft:scoreboard_slot": delegate("word"), + "command:argument:minecraft:swizzle": delegate("swizzle"), + "command:argument:minecraft:team": delegate("team"), + "command:argument:minecraft:time": delegate("time"), + "command:argument:minecraft:uuid": delegate("uuid"), + "command:argument:minecraft:vec2": Vector2Parser( + coordinate_parser=delegate("coordinate"), ), - "minecraft:vec3": Vector3Parser( - coordinate_parser=CoordinateParser[float](type=float), + "command:argument:minecraft:vec3": Vector3Parser( + coordinate_parser=delegate("coordinate"), ), } -def get_stream_spec(stream: TokenStream) -> CommandSpecification: +def get_stream_spec(stream: TokenStream) -> CommandSpec: """Return the command specification associated with the token stream.""" return stream.data["spec"] @@ -327,14 +362,16 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: @dataclass -class QuotedStringHandler: - """Class responsible for removing quotes and interpreting escape sequences.""" +class QuoteHelper: + """Helper for removing quotes and interpreting escape sequences.""" escape_regex: "re.Pattern[str]" = field(default_factory=lambda: re.compile(r"\\.")) escape_sequences: Dict[str, str] = field(default_factory=dict) def unquote_string(self, token: Token) -> str: """Remove quotes and substitute escaped characters.""" + if not token.value.startswith(('"', "'")): + return token.value try: return self.escape_regex.sub( lambda match: self.handle_substitution(token, match), @@ -342,14 +379,9 @@ def unquote_string(self, token: Token) -> str: ) except InvalidEscapeSequence as exc: location = token.location.with_horizontal_offset(exc.index + 1) - raise ( - InvalidSyntax( - f"Invalid escape sequence {exc.characters!r}." - ).set_location( - location, - location.with_horizontal_offset(len(exc.characters)), - ) - ) + end_location = location.with_horizontal_offset(len(exc.characters)) + exc = InvalidSyntax(f"Invalid escape sequence {exc.characters!r}.") + raise set_location(exc, location, end_location) def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: """Handle escaped character sequence.""" @@ -370,12 +402,8 @@ def parse_root(stream: TokenStream) -> AstRoot: start = stream.peek() if not start: - return AstRoot( - filename=None, - commands=AstChildren(), - location=SourceLocation(0, 1, 1), - end_location=SourceLocation(0, 1, 1), - ) + node = AstRoot(filename=None, commands=AstChildren()) + return set_location(node, SourceLocation(0, 1, 1)) commands: List[AstCommand] = [] @@ -385,12 +413,8 @@ def parse_root(stream: TokenStream) -> AstRoot: if stream.peek(): commands.append(delegate("command", stream)) - return AstRoot( - filename=None, - commands=AstChildren(commands), - location=start.location, - end_location=stream.current.end_location, - ) + node = AstRoot(filename=None, commands=AstChildren(commands)) + return set_location(node, start, stream.current) def parse_command(stream: TokenStream) -> AstCommand: @@ -413,7 +437,7 @@ def parse_command(stream: TokenStream) -> AstCommand: end_location = token.end_location elif child.type == "argument": - node = delegate("argument", stream) + node = delegate("command:argument", stream) arguments.append(node) end_location = node.end_location @@ -435,12 +459,8 @@ def parse_command(stream: TokenStream) -> AstCommand: scope += ("subcommand",) break - return AstCommand( - identifier=":".join(scope), - arguments=AstChildren(arguments), - location=location, - end_location=end_location, - ) + node = AstCommand(identifier=":".join(scope), arguments=AstChildren(arguments)) + return set_location(node, location, end_location) def parse_argument(stream: TokenStream) -> AstNode: @@ -451,7 +471,7 @@ def parse_argument(stream: TokenStream) -> AstNode: if tree and tree.parser: with stream.provide(properties=tree.properties or {}): - return delegate(tree.parser, stream) + return delegate(f"command:argument:{tree.parser}", stream) raise ValueError(f"Missing argument parser in command tree {scope}.") @@ -460,71 +480,121 @@ def parse_bool(stream: TokenStream) -> AstValue[bool]: """Parse bool.""" with stream.syntax(literal=r"\w+"): token = stream.expect_any(("literal", "true"), ("literal", "false")) - - return AstValue[bool]( - value=token.value == "true", - location=token.location, - end_location=token.end_location, - ) + node = AstValue[bool](value=token.value == "true") + return set_location(node, token) @dataclass -class NumericParser(Generic[NumericType]): +class NumericParser: """Parser for numeric values.""" - type: Type[NumericType] - name: str - pattern: str - min: Optional[NumericType] = None - max: Optional[NumericType] = None - - def __call__(self, stream: TokenStream) -> AstValue[NumericType]: - properties = get_stream_properties(stream) + name: str = "number" + pattern: str = NUMBER_PATTERN + def __call__(self, stream: TokenStream) -> Any: with stream.syntax(**{self.name: self.pattern}): - token = stream.expect(self.name) + stream.expect(self.name) + return self.create_node(stream) - node = self.create_node(stream) + def create_node(self, stream: TokenStream) -> Any: + """Create the ast node.""" + token = stream.current + node = AstValue[float]( + value=float(token.value) if "." in token.value else int(token.value), + ) + return set_location(node, token) - minimum = properties.get("min", self.min) - maximum = properties.get("max", self.max) - if minimum is not None and node.value < minimum: - raise token.emit_error( - InvalidSyntax(f"Expected value to be at least {minimum}.") - ) - if maximum is not None and node.value > maximum: - raise token.emit_error( - InvalidSyntax(f"Expected value to be at most {maximum}.") - ) +@dataclass +class CoordinateParser(NumericParser): + """Parser for coordinates.""" - return node + name: str = "coordinate" + pattern: str = r"[~^]?" + NUMBER_PATTERN + r"|[~^]" - def create_node(self, stream: TokenStream) -> AstValue[NumericType]: - """Create the ast node.""" + def create_node(self, stream: TokenStream) -> Any: token = stream.current - value = self.type(token.value) + value = token.value - return AstValue[NumericType]( - value=value, - location=token.location, - end_location=token.end_location, - ) + if token.value.startswith("~"): + coordinate_type = "relative" + value = value[1:] + elif token.value.startswith("^"): + coordinate_type = "local" + value = value[1:] + else: + coordinate_type = "absolute" + + if not value: + value = "0" + + value = float(value) if "." in value else int(value) + + node = AstCoordinate(type=coordinate_type, value=value) + return set_location(node, token) + + +@dataclass +class IntegerConstraint: + """Constraint that disallows decimal numeric values.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstValue[Any] = self.parser(stream) + + if not isinstance(node.value, int): + raise node.emit_error(InvalidSyntax("Expected integer value.")) + + return node + + +@dataclass +class MinMaxConstraint: + """Constraint that checks that the value conforms to the min and max properties.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + properties = get_stream_properties(stream) + node: AstValue[float] = self.parser(stream) + + if "min" in properties and node.value < properties["min"]: + exc = InvalidSyntax(f"Expected value to be at least {properties['min']}.") + raise node.emit_error(exc) + if "max" in properties and node.value > properties["max"]: + exc = InvalidSyntax(f"Expected value to be at most {properties['max']}.") + raise node.emit_error(exc) + + return node + + +@dataclass +class RestrictCoordinateConstraint: + """Constraint that disallows certain types of coordinates.""" + + parser: Parser + disallow: List[Literal["absolute", "relative", "local"]] + + def __call__(self, stream: TokenStream) -> Any: + node: AstCoordinate = self.parser(stream) + + if node.type in self.disallow: + exc = InvalidSyntax(f"Specifying {node.type} coordinates not allowed.") + raise node.emit_error(exc) + + return node @dataclass class StringParser: """Parser for string values.""" - type: Optional[str] = None - quoted_string_handler: QuotedStringHandler = field( - default_factory=QuotedStringHandler - ) + type: Literal["word", "phrase", "greedy"] + quote_helper: QuoteHelper = field(default_factory=QuoteHelper) def __call__(self, stream: TokenStream) -> AstValue[str]: - string_type = self.type or get_stream_properties(stream)["type"] - - if string_type == "greedy": + if self.type == "greedy": with stream.intercept("whitespace"): while stream.get("whitespace"): continue @@ -535,109 +605,61 @@ def __call__(self, stream: TokenStream) -> AstValue[str]: word=r"[0-9A-Za-z_\.\+\-]+", quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", ): - if string_type == "word": + if self.type == "word": token = stream.expect("word") - elif string_type == "phrase": - token = stream.expect_any("word", "quoted_string") else: - raise ValueError(f"Invalid string type {string_type!r}.") - - return AstValue[str]( - value=( - self.quoted_string_handler.unquote_string(token) - if token.match("quoted_string") - else token.value - ), - location=token.location, - end_location=token.end_location, - ) - - -@dataclass -class CoordinateParser(NumericParser[NumericType]): - """Parser for coordinates.""" + token = stream.expect_any("word", "quoted_string") - name: str = "coordinate" - pattern: str = r"[~^]?" + FLOAT_PATTERN + r"|[~^]" - allow_absolute: bool = True - allow_relative: bool = True - allow_local: bool = True + node = AstValue[str](value=self.quote_helper.unquote_string(token)) + return set_location(node, token) - def create_node(self, stream: TokenStream) -> AstCoordinate[NumericType]: # type: ignore - token = stream.current - if issubclass(self.type, int) and "." in token.value: - raise token.emit_error(InvalidSyntax(f"Decimal {self.name} not allowed.")) - - value = token.value +def parse_string_argument(stream: TokenStream) -> AstValue[str]: + """Parse string argument.""" + properties = get_stream_properties(stream) + string_type = properties["type"] - if token.value.startswith("~"): - if not self.allow_relative: - raise token.emit_error( - InvalidSyntax(f"Relative {self.name} not allowed.") - ) - prefix = "relative" - value = value[1:] - elif token.value.startswith("^"): - if not self.allow_local: - raise token.emit_error(InvalidSyntax(f"Local {self.name} not allowed.")) - prefix = "local" - value = value[1:] - else: - prefix = "absolute" + if string_type not in ["word", "phrase", "greedy"]: + raise ValueError(f"Invalid string type {string_type!r}.") - return AstCoordinate[NumericType]( - prefix=prefix, - value=self.type(value or "0"), - location=token.location, - end_location=token.end_location, - ) + return delegate(string_type, stream) @dataclass -class Vector2Parser(Generic[NumericType]): +class Vector2Parser: """Parser for vector2.""" coordinate_parser: Parser - def __call__(self, stream: TokenStream) -> AstVector2[NumericType]: + def __call__(self, stream: TokenStream) -> AstVector2: x = self.coordinate_parser(stream) y = self.coordinate_parser(stream) - return AstVector2[NumericType]( - x=x, - y=y, - location=x.location, - end_location=y.end_location, - ) + node = AstVector2(x=x, y=y) + return set_location(node, x, y) @dataclass -class Vector3Parser(Generic[NumericType]): +class Vector3Parser: """Parser for vector3.""" coordinate_parser: Parser - def __call__(self, stream: TokenStream) -> AstVector3[NumericType]: + def __call__(self, stream: TokenStream) -> AstVector3: x = self.coordinate_parser(stream) y = self.coordinate_parser(stream) z = self.coordinate_parser(stream) - return AstVector3[NumericType]( - x=x, - y=y, - z=z, - location=x.location, - end_location=z.end_location, - ) + node = AstVector3(x=x, y=y, z=z) + return set_location(node, x, z) @dataclass class JsonParser: """Parser for json values.""" - quoted_string_handler: QuotedStringHandler = field( - default_factory=lambda: QuotedStringHandler( + quote_helper: QuoteHelper = field( + default_factory=lambda: QuoteHelper( escape_sequences={ r"\\": "\\", r"\f": "\f", @@ -653,7 +675,7 @@ def __call__(self, stream: TokenStream) -> AstJson: curly=r"\{|\}", bracket=r"\[|\]", string=r'"(?:\\.|[^\\\n])*?"', - number=r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?", + number=r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b", colon=r":", comma=r",", literal=r"\w+", @@ -672,50 +694,38 @@ def __call__(self, stream: TokenStream) -> AstJson: entries: List[AstJsonObjectEntry] = [] for key in stream.collect("string"): - stream.expect("colon") - value = self(stream) - entries.append( - AstJsonObjectEntry( - key=AstValue[str]( - value=self.quoted_string_handler.unquote_string(key), - location=key.location, - end_location=key.end_location, - ), - value=value, - location=key.location, - end_location=value.end_location, - ) + key_node = AstValue[str]( + value=self.quote_helper.unquote_string(key), ) + key_node = set_location(key_node, key) + + stream.expect("colon") + + value_node = self(stream) + + entry_node = AstJsonObjectEntry(key=key_node, value=value_node) + entries.append(set_location(entry_node, key_node, value_node)) if not stream.get("comma"): break close_curly = stream.expect(("curly", "}")) - return AstJsonObject( - entries=AstChildren(entries), - location=curly.location, - end_location=close_curly.end_location, - ) + node = AstJsonObject(entries=AstChildren(entries)) + return set_location(node, curly, close_curly) elif bracket: elements: List[AstJson] = [] - close_bracket = stream.get(("bracket", "]")) - - if not close_bracket: + for _ in stream.peek_until(("bracket", "]")): elements.append(self(stream)) - for _ in stream.collect("comma"): - elements.append(self(stream)) - - close_bracket = stream.expect(("bracket", "]")) + if not stream.get("comma"): + stream.expect(("bracket", "]")) + break - return AstJsonArray( - elements=AstChildren(elements), - location=bracket.location, - end_location=close_bracket.end_location, - ) + node = AstJsonArray(elements=AstChildren(elements)) + return set_location(node, bracket, stream.current) if null: value = None @@ -724,15 +734,12 @@ def __call__(self, stream: TokenStream) -> AstJson: elif false: value = False elif string: - value = self.quoted_string_handler.unquote_string(string) + value = self.quote_helper.unquote_string(string) elif number: value = float(number.value) - return AstJsonValue( - value=value, # type: ignore - location=stream.current.location, - end_location=stream.current.end_location, - ) + node = AstJsonValue(value=value) # type: ignore + return set_location(node, stream.current) @dataclass @@ -756,8 +763,8 @@ class NbtParser: } ) - quoted_string_handler: QuotedStringHandler = field( - default_factory=lambda: QuotedStringHandler( + quote_helper: QuoteHelper = field( + default_factory=lambda: QuoteHelper( escape_sequences={ r"\\": "\\", } @@ -769,7 +776,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: curly=r"\{|\}", bracket=r"\[|\]", quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", - number=r"[+-]?(?:[0-9]*?\.[0-9]+|[0-9]+\.[0-9]*?|[1-9][0-9]*|0)([eE][+-]?[0-9]+)?[bslfdBSLFD]?(?![a-zA-Z0-9._+-])", + number=r"[+-]?(?:[0-9]*?\.[0-9]+|[0-9]+\.[0-9]*?|[1-9][0-9]*|0)(?:[eE][+-]?[0-9]+)?[bslfdBSLFD]?\b", string=r"[a-zA-Z0-9._+-]+", colon=r":", comma=r",", @@ -786,35 +793,25 @@ def __call__(self, stream: TokenStream) -> AstNbt: entries: List[AstNbtCompoundEntry] = [] for key in stream.collect_any("number", "string", "quoted_string"): - stream.expect("colon") - value = self(stream) - entries.append( - AstNbtCompoundEntry( - key=AstValue[str]( - value=( - self.quoted_string_handler.unquote_string(key) - if key.match("quoted_string") - else key.value - ), - location=key.location, - end_location=key.end_location, - ), - value=value, - location=key.location, - end_location=value.end_location, - ) + key_node = AstValue[str]( + value=self.quote_helper.unquote_string(key), ) + key_node = set_location(key_node, key) + + stream.expect("colon") + + value_node = self(stream) + + entry_node = AstNbtCompoundEntry(key=key_node, value=value_node) + entries.append(set_location(entry_node, key_node, value_node)) if not stream.get("comma"): break close_curly = stream.expect(("curly", "}")) - return AstNbtCompound( - entries=AstChildren(entries), - location=curly.location, - end_location=close_curly.end_location, - ) + node = AstNbtCompound(entries=AstChildren(entries)) + return set_location(node, curly, close_curly) elif bracket: elements: List[AstNbt] = [] @@ -826,25 +823,8 @@ def __call__(self, stream: TokenStream) -> AstNbt: stream.expect(("bracket", "]")) break - for element in elements[1:]: - node_type = type(elements[0]) - if ( - type(element) != node_type - or isinstance(element, AstNbtValue) - and type(element.get_value()) != type(elements[0].get_value()) - ): - raise InvalidSyntax( - "All the elements should have the same type." - ).set_location( - location=elements[0].location, - end_location=elements[-1].end_location, - ) - - return AstNbtList( - elements=AstChildren(elements), - location=bracket.location, - end_location=stream.current.end_location, - ) + node = AstNbtList(elements=AstChildren(elements)) + return set_location(node, bracket, stream.current) if number: suffix = number.value[-1].lower() @@ -870,41 +850,48 @@ def __call__(self, stream: TokenStream) -> AstNbt: value = String(string.value) # type: ignore elif quoted_string: - value = String(self.quoted_string_handler.unquote_string(quoted_string)) # type: ignore + value = String(self.quote_helper.unquote_string(quoted_string)) # type: ignore - return AstNbtValue( - value=value, # type: ignore - location=stream.current.location, - end_location=stream.current.end_location, - ) + # TODO: Arrays + node = AstNbtValue(value=value) # type: ignore + return set_location(node, stream.current) -def parse_compound_tag(stream: TokenStream) -> AstNbtCompound: - """Parse compound tag.""" - node = delegate("nbt", stream) - if isinstance(node, AstNbtCompound): +@dataclass +class NbtCompoundConstraint: + """Constraint that only allows nbt compound tags.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + + if not isinstance(node, AstNbtCompound): + raise node.emit_error(InvalidSyntax("Expected nbt compound.")) + return node - raise InvalidSyntax("Expected nbt compound tag.").set_location( - location=node.location, - end_location=node.end_location, - ) +@dataclass +class AdjacentConstraint: + """Constraint that ensures that there are no whitespace separators.""" + + parser: Parser + hint: str -def parse_adjacent_nbt(stream: TokenStream) -> Optional[AstNbtCompound]: - """Parse adjacent nbt.""" - with stream.syntax(curly=r"\{|\}"), stream.intercept("whitespace"): - found_curly = hint.match(("curly", "{")) if (hint := stream.peek()) else False - return parse_compound_tag(stream) if found_curly else None + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(hint=self.hint), stream.intercept("whitespace"): + token = stream.peek() + if not token or not token.match("hint"): + return None + return self.parser(stream) @dataclass class ResourceLocationParser: """Parser for resource locations.""" - allow_tag: bool = True - def __call__(self, stream: TokenStream) -> AstResourceLocation: with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): token = stream.expect("resource_location") @@ -912,44 +899,53 @@ def __call__(self, stream: TokenStream) -> AstResourceLocation: location = token.location if is_tag := value.startswith("#"): - if not self.allow_tag: - raise token.emit_error( - InvalidSyntax(f"Reference to tag {token.value!r} not allowed.") - ) value = value[1:] location = location.with_horizontal_offset(1) namespace, _, path = value.rpartition(":") if namespace: - namespace = AstValue[str]( - value=namespace, - location=location, - end_location=location.with_horizontal_offset(len(namespace)), + namespace_node = AstValue[str](value=namespace) + namespace_node = set_location( + namespace_node, + location, + location.with_horizontal_offset(len(namespace)), ) - location = namespace.end_location.with_horizontal_offset(1) + location = namespace_node.end_location.with_horizontal_offset(1) else: - namespace = None + namespace_node = None + + path_node = AstValue[str](value=path) + path_node = set_location(path_node, location, token) - return AstResourceLocation( + node = AstResourceLocation( is_tag=is_tag, - namespace=namespace, - path=AstValue[str]( - value=path, location=location, end_location=token.end_location - ), - location=token.location, - end_location=token.end_location, + namespace=namespace_node, + path=path_node, ) + return set_location(node, token) + + +@dataclass +class NoTagConstraint: + """Constraint that disallows resource locations refering to tags.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstResourceLocation = self.parser(stream) + + if node.is_tag: + raise node.emit_error(InvalidSyntax("Specifying a tag is not allowed.")) + + return node @dataclass class BlockParser: """Parser for minecraft blocks.""" - resource_location_parser: Parser = field(default_factory=ResourceLocationParser) - - allow_block_states: bool = True - allow_data_tags: bool = True + resource_location_parser: Parser def __call__(self, stream: TokenStream) -> AstBlock: identifier = self.resource_location_parser(stream) @@ -969,26 +965,19 @@ def __call__(self, stream: TokenStream) -> AstBlock: commit() - for name in stream.collect("state"): + for key in stream.collect("state"): + key_node = AstValue[str](value=key.value) + key_node = set_location(key_node, key) + stream.expect("equal") + value = stream.expect("state") + value_node = AstValue[str](value=value.value) + value_node = set_location(value_node, value) - block_states.append( - AstBlockState( - key=AstValue[str]( - value=name.value, - location=name.location, - end_location=name.end_location, - ), - value=AstValue[str]( - value=value.value, - location=value.location, - end_location=value.end_location, - ), - location=name.location, - end_location=value.end_location, - ) - ) + entry_node = AstBlockState(key=key_node, value=value_node) + entry_node = set_location(entry_node, key_node, value_node) + block_states.append(entry_node) if not stream.get("comma"): break @@ -996,91 +985,101 @@ def __call__(self, stream: TokenStream) -> AstBlock: close_bracket = stream.expect(("bracket", "]")) end_location = close_bracket.end_location - data_tags = parse_adjacent_nbt(stream) - - if block_states and not self.allow_block_states: - raise InvalidSyntax("Block states not allowed.").set_location( - location=block_states[0].location, - end_location=block_states[-1].end_location, - ) - - if data_tags is not None and not self.allow_data_tags: - raise InvalidSyntax("Data tags not allowed.").set_location( - location=data_tags.location, - end_location=data_tags.end_location, - ) + data_tags = delegate("adjacent_nbt_compound", stream) - return AstBlock( + node = AstBlock( identifier=identifier, block_states=AstChildren(block_states), data_tags=data_tags, - location=location, - end_location=( - data_tags.end_location if data_tags is not None else end_location - ), ) + return set_location(node, location, data_tags if data_tags else end_location) @dataclass class ItemParser: """Parser for minecraft items.""" - resource_location_parser: Parser = field(default_factory=ResourceLocationParser) - - allow_data_tags: bool = True + resource_location_parser: Parser def __call__(self, stream: TokenStream) -> AstItem: identifier = self.resource_location_parser(stream) location = identifier.location end_location = identifier.end_location - data_tags = parse_adjacent_nbt(stream) + data_tags = delegate("adjacent_nbt_compound", stream) - if data_tags is not None and not self.allow_data_tags: - raise InvalidSyntax("Data tags not allowed.").set_location( - location=data_tags.location, - end_location=data_tags.end_location, - ) + node = AstItem(identifier=identifier, data_tags=data_tags) + return set_location(node, location, data_tags if data_tags else end_location) - return AstItem( - identifier=identifier, - data_tags=data_tags, - location=location, - end_location=( - data_tags.end_location if data_tags is not None else end_location - ), - ) + +@dataclass +class NoBlockStatesConstraint: + """Constraint that disallows block states.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstBlock = self.parser(stream) + + if node.block_states: + raise node.emit_error(InvalidSyntax("Specifying block states not allowed.")) + + return node + + +@dataclass +class NoDataTagsConstraint: + """Constraint that disallows data tags.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstBlock = self.parser(stream) + + if node.data_tags: + raise node.emit_error(InvalidSyntax("Specifying data tags not allowed.")) + + return node @dataclass -class LiteralStringParser: - """Parser for literal strings.""" +class ValueParser: + """Parser for simple string values.""" - values: List[str] - pattern: str = r"\w+" + name: str + pattern: str = r"\S+" def __call__(self, stream: TokenStream) -> AstValue[str]: - with stream.syntax(literal=self.pattern): - patterns = [("literal", value) for value in self.values] - token = stream.expect_any(*patterns) - - return AstValue[str]( - value=token.value, - location=token.location, - end_location=token.end_location, - ) + with stream.syntax(**{self.name: self.pattern}): + token = stream.expect(self.name) + node = AstValue[str](value=token.value) + return set_location(node, token) + + +@dataclass +class ValueConstraint: + """Constraint that only allows a set of predefined values.""" + + parser: Parser + values: List[Any] + + def __call__(self, stream: TokenStream) -> Any: + node: AstValue[str] = self.parser(stream) + + if node.value not in self.values: + raise node.emit_error(InvalidSyntax(f"Unexpected value {node.value!r}.")) + + return node @dataclass -class RangeParser(Generic[NumericType]): +class RangeParser: """Parser for ranges.""" - type: Type[NumericType] - pattern: str = ( - fr"\.\.{FLOAT_PATTERN}|{FLOAT_PATTERN}\.\.(?:{FLOAT_PATTERN})?|{FLOAT_PATTERN}" - ) + type: Type[Any] + pattern: str = fr"\.\.{NUMBER_PATTERN}|{NUMBER_PATTERN}\.\.(?:{NUMBER_PATTERN})?|{NUMBER_PATTERN}" - def __call__(self, stream: TokenStream) -> AstRange[NumericType]: + def __call__(self, stream: TokenStream) -> AstRange: with stream.syntax(range=self.pattern): token = stream.expect("range") minimum, separator, maximum = token.value.partition("..") @@ -1088,90 +1087,52 @@ def __call__(self, stream: TokenStream) -> AstRange[NumericType]: if not separator: maximum = minimum - if issubclass(self.type, int) and "." in minimum: - raise token.emit_error(InvalidSyntax(f"Decimal minimum not allowed.")) - if issubclass(self.type, int) and "." in maximum: - raise token.emit_error(InvalidSyntax(f"Decimal maximum not allowed.")) + if issubclass(self.type, int) and ("." in minimum or "." in maximum): + raise token.emit_error(InvalidSyntax("Expected integer range.")) - return AstRange[NumericType]( + node = AstRange( min=self.type(minimum) if minimum else None, max=self.type(maximum) if maximum else None, - location=token.location, - end_location=token.end_location, ) + return set_location(node, token) -def parse_objective(stream: TokenStream) -> AstValue[str]: - """Parse objective.""" - with stream.syntax(objective=r"[a-zA-Z0-9_.+-]+|\*"): - token = stream.expect("objective") +@dataclass +class LengthConstraint: + """Constraint that only allows up to a limited number of characters.""" - if len(token.value) > 16: - raise token.emit_error( - InvalidSyntax("Objective name must be limited to 16 characters.") - ) + parser: Parser + limit: int - return AstValue[str]( - value=token.value, - location=token.location, - end_location=token.end_location, - ) + def __call__(self, stream: TokenStream) -> Any: + node: AstValue[str] = self.parser(stream) + if len(node.value) > self.limit: + exc = InvalidSyntax(f"Expected up to {self.limit} characters.") + raise node.emit_error(exc) -def parse_player_name(stream: TokenStream) -> AstValue[str]: - """Parse player name.""" - with stream.syntax(name=r"[a-zA-Z0-9_.+-]+"): - token = stream.expect("name") - - if len(token.value) > 16: - raise token.emit_error( - InvalidSyntax("Player name must be limited to 16 characters.") - ) - - return AstValue[str]( - value=token.value, - location=token.location, - end_location=token.end_location, - ) + return node def parse_swizzle(stream: TokenStream) -> AstValue[str]: """Parse swizzle.""" - with stream.syntax(literal=r"\w+"): - token = stream.expect("literal") - - if not 1 <= len(token.value) <= 3 or len(set(token.value)) < len(token.value): - raise token.emit_error(InvalidSyntax(f"Invalid swizzle {token.value!r}.")) - - return AstValue[str]( - value=token.value, - location=token.location, - end_location=token.end_location, - ) + node = delegate("literal", stream) + if not 1 <= len(node.value) <= 3 or len(set(node.value)) < len(node.value): + raise node.emit_error(InvalidSyntax(f"Invalid swizzle {node.value!r}.")) -def parse_team(stream: TokenStream) -> AstValue[str]: - """Parse team.""" - with stream.syntax(team=r"[a-zA-Z0-9_.+-]+"): - token = stream.expect("team") - - return AstValue[str]( - value=token.value, - location=token.location, - end_location=token.end_location, - ) + return node @dataclass -class TimeParser(NumericParser[float]): +class TimeParser(NumericParser): """Parser for time.""" type: Type[float] = float name: str = "time" - pattern: str = FLOAT_PATTERN + r"[dst]?" + pattern: str = NUMBER_PATTERN + r"[dst]?" - def create_node(self, stream: TokenStream) -> AstTime: # type: ignore - """Create the ast node.""" + def create_node(self, stream: TokenStream) -> Any: token = stream.current value = token.value @@ -1181,107 +1142,96 @@ def create_node(self, stream: TokenStream) -> AstTime: # type: ignore else: suffix = None - return AstTime( - value=self.type(value), - suffix=suffix, # type: ignore - location=token.location, - end_location=token.end_location, - ) + node = AstTime(value=self.type(value), suffix=suffix) # type: ignore + return set_location(node, token) def parse_uuid(stream: TokenStream) -> AstValue[UUID]: """Parse uuid.""" with stream.syntax(uuid="-".join([r"[a-fA-F0-9]+"] * 5)): token = stream.expect("uuid") - - return AstValue[UUID]( - value=UUID(token.value), - location=token.location, - end_location=token.end_location, - ) + node = AstValue[UUID](value=UUID(token.value)) + return set_location(node, token) @dataclass class SelectorParser: """Parser for selectors.""" - amount: str = "multiple" - def __call__(self, stream: TokenStream) -> AstSelector: - properties = get_stream_properties(stream) - with stream.syntax( selector=r"@[praes]\[?", bracket=r"\[|\]", - argument=r"[a-z_]+", - equal=r"=", comma=r",", - exclamation=r"!", ): token = stream.expect("selector") variable = token.value[1] location = token.location end_location = token.end_location - is_single = variable in "prs" - arguments: List[AstSelectorArgument] = [] if token.value.endswith("["): - for key in stream.collect("argument"): - stream.expect("equal") - - inverted = stream.get("exclamation") is not None - - try: - value = delegate(f"selector:argument:{key.value}", stream) - except UnrecognizedParser as exc: - if not exc.parser.startswith("selector:argument:"): - raise - raise key.emit_error( - InvalidSyntax(f"Invalid selector argument {key.value!r}.") - ) from exc - - arguments.append( - AstSelectorArgument( - inverted=inverted, - key=AstValue[str]( - value=key.value, - location=key.location, - end_location=key.end_location, - ), - value=value, - location=key.location, - end_location=value.end_location, - ) - ) - - if key.value == "limit": - is_single = value.value == 1 - + for _ in stream.peek_until(("bracket", "]")): + arguments.append(delegate("selector:argument", stream)) if not stream.get("comma"): + stream.expect(("bracket", "]")) break - close_bracket = stream.expect(("bracket", "]")) - end_location = close_bracket.end_location - - amount = properties.get("amount", self.amount) + end_location = stream.current.end_location - if amount not in ["single", "multiple"]: - raise ValueError(f"Invalid selector amount {amount!r}.") - - if amount == "single" and not is_single: - raise InvalidSyntax(f"Multiple entities not allowed.").set_location( - location=location, - end_location=end_location, - ) - - return AstSelector( + node = AstSelector( variable=variable, # type: ignore arguments=AstChildren(arguments), - location=location, - end_location=end_location, ) + return set_location(node, location, end_location) + + +@dataclass +class SelectorArgumentParser: + """Parser for selector arguments.""" + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax( + argument=r"[a-z_]+", + equal=r"=", + exclamation=r"!", + ): + key = stream.expect("argument") + key_node = AstValue[str](value=key.value) + key_node = set_location(key_node, key) + + stream.expect("equal") + + inverted = stream.get("exclamation") is not None + + try: + value_node = delegate(f"selector:argument:{key.value}", stream) + except UnrecognizedParser as exc: + if not exc.parser.startswith("selector:argument:"): + raise + syntax_exc = InvalidSyntax(f"Invalid selector argument {key.value!r}.") + raise key_node.emit_error(syntax_exc) from exc + + node = AstSelectorArgument(inverted=inverted, key=key_node, value=value_node) + return set_location(node, key_node, value_node) + + +@dataclass +class SelectorArgumentInvertConstraint: + """Constraint that only allows inverting a specific set of arguments.""" + + parser: Parser + allow_invert: List[str] + + def __call__(self, stream: TokenStream) -> Any: + node: AstSelectorArgument = self.parser(stream) + + if node.inverted and node.key.value not in self.allow_invert: + exc = InvalidSyntax(f"Can not invert argument {node.key.value!r}.") + raise node.emit_error(exc) + + return node def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: @@ -1296,33 +1246,24 @@ def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: scores: List[AstSelectorScoreMatch] = [] - for objective in stream.collect("objective"): + for key in stream.collect("objective"): + key_node = AstValue[str](value=key.value) + key_node = set_location(key_node, key) + stream.expect("equal") - value = delegate("minecraft:integer_range", stream) - - scores.append( - AstSelectorScoreMatch( - objective=AstValue[str]( - value=objective.value, - location=objective.location, - end_location=objective.end_location, - ), - value=value, - location=objective.location, - end_location=value.end_location, - ) - ) + + value_node = delegate("minecraft:integer_range", stream) + + match_node = AstSelectorScoreMatch(key=key_node, value=value_node) + scores.append(set_location(match_node, key_node, value_node)) if not stream.get("comma"): break close_curly = stream.expect(("curly", "}")) - return AstSelectorScores( - scores=AstChildren(scores), - location=curly.location, - end_location=close_curly.end_location, - ) + node = AstSelectorScores(scores=AstChildren(scores)) + return set_location(node, curly, close_curly) def parse_selector_advancements(stream: TokenStream) -> AstSelectorAdvancements: @@ -1333,55 +1274,156 @@ def parse_selector_advancements(stream: TokenStream) -> AstSelectorAdvancements: advancements: List[AstSelectorAdvancementMatch] = [] for _ in stream.peek_until(("curly", "}")): - name = delegate("minecraft:resource_location", stream) + key_node = delegate("minecraft:resource_location", stream) stream.expect("equal") - value = delegate("brigadier:bool", stream) - - advancements.append( - AstSelectorAdvancementMatch( - name=name, - value=value, - location=name.location, - end_location=value.end_location, - ) - ) + value_node = delegate("brigadier:bool", stream) + + match_node = AstSelectorAdvancementMatch(key=key_node, value=value_node) + advancements.append(set_location(match_node, key_node, value_node)) if not stream.get("comma"): stream.expect(("curly", "}")) break - return AstSelectorAdvancements( - advancements=AstChildren(advancements), - location=curly.location, - end_location=stream.current.end_location, - ) + node = AstSelectorAdvancements(advancements=AstChildren(advancements)) + return set_location(node, curly, stream.current) + + +@dataclass +class SelectorPlayerConstraint: + """Constraint that disallows non player-type entities.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstSelector = self.parser(stream) + + is_player = node.variable in "pras" + + for argument in node.arguments: + if argument.key.value in ["gamemode", "level"]: + is_player = True + if ( + argument.key.value == "type" + and not argument.inverted + and argument.value + in [ + AstResourceLocation( + is_tag=False, + namespace=AstValue[str](value="minecraft"), + path=AstValue[str](value="player"), + ), + AstResourceLocation( + is_tag=False, + namespace=None, + path=AstValue[str](value="player"), + ), + ] + ): + is_player = True + if not is_player: + exc = InvalidSyntax("Expected player-type entity selector.") + raise node.emit_error(exc) -def parse_entity(stream: TokenStream) -> Any: - """Parse entity.""" - hint = stream.peek() + return node - if hint: - if hint.value.startswith("@"): - return delegate("selector", stream) - if hint.value.count("-") == 4: - with stream.alternative(): - return delegate("minecraft:uuid", stream) +@dataclass +class SelectorTypeConstraint: + """Constraint that only allows selectors that match the type property.""" - return parse_player_name(stream) + parser: Parser + def __call__(self, stream: TokenStream) -> Any: + properties = get_stream_properties(stream) + selector_type = properties["type"] -def parse_score_holder(stream: TokenStream) -> Any: - """Parse score holder.""" - with stream.syntax(wildcard=r"\*"): - if token := stream.get("wildcard"): - return AstValue[str]( - value=token.value, - location=token.location, - end_location=token.end_location, - ) - return delegate("minecraft:entity", stream) + if selector_type not in ["players", "entities"]: + raise ValueError(f"Invalid selector type {selector_type}.") + + if selector_type == "entities": + return self.parser(stream) + + return SelectorPlayerConstraint(self.parser)(stream) + + +@dataclass +class SelectorSingleConstraint: + """Constraint that disallows selectors that target more than one entity.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstSelector = self.parser(stream) + + is_single = node.variable in "prs" + + for arg in node.arguments: + if arg.key.value == "limit" and arg.value == AstValue[int](value=1): + is_single = True + + if not is_single: + exc = InvalidSyntax("Expected entity selector targeting a single entity.") + raise node.emit_error(exc) + + return node + + +@dataclass +class SelectorAmountConstraint: + """Constraint that only allows selectors that match the amount property.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + properties = get_stream_properties(stream) + + amount = properties["amount"] + + if amount not in ["single", "multiple"]: + raise ValueError(f"Invalid selector amount {amount}.") + + if amount == "multiple": + return self.parser(stream) + + return SelectorSingleConstraint(self.parser)(stream) + + +@dataclass +class EntityParser: + """Parser for entities.""" + + selector_parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + """Parse entity.""" + with stream.syntax(literal=r"\S+"): + hint = stream.peek() + + if hint: + if hint.value.startswith("@"): + return self.selector_parser(stream) + + if hint.value.count("-") == 4: + with stream.alternative(): + return delegate("uuid", stream) + + return delegate("player_name", stream) + + +@dataclass +class ScoreHolderParser: + """Parser for score holder.""" + + entity_parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(wildcard=r"\*"): + if token := stream.get("wildcard"): + node = AstValue[str](value=token.value) + return set_location(node, token) + return self.entity_parser(stream) def parse_message(stream: TokenStream) -> AstMessage: @@ -1390,36 +1432,29 @@ def parse_message(stream: TokenStream) -> AstMessage: while stream.get("whitespace"): continue - with stream.syntax(selector=r"@[praes]"): - sentence: List[Any] = [] + with stream.syntax(selector=r"@[praes]", literal=r"\S+"): + words: List[Any] = [] for selector, literal in stream.collect("selector", "literal"): if selector: stream.index -= 1 - sentence.append(delegate("selector", stream)) + words.append(delegate("selector", stream)) elif literal: - sentence.append( - AstValue[str]( - value=literal.value, - location=literal.location, - end_location=literal.end_location, - ) - ) + word_node = AstValue[str](value=literal.value) + word_node = set_location(word_node, literal) + words.append(word_node) - if not sentence: + if not words: raise stream.emit_error(InvalidSyntax("Empty message not allowed.")) - return AstMessage( - sentence=AstChildren(sentence), - location=sentence[0].location, - end_location=sentence[-1].end_location, - ) + node = AstMessage(words=AstChildren(words)) + return set_location(node, words[0], words[-1]) @dataclass class NbtPathParser: - quoted_string_handler: QuotedStringHandler = field( - default_factory=lambda: QuotedStringHandler( + quote_helper: QuoteHelper = field( + default_factory=lambda: QuoteHelper( escape_sequences={ r"\\": "\\", } @@ -1427,7 +1462,7 @@ class NbtPathParser: ) def __call__(self, stream: TokenStream) -> AstNbtPath: - nodes: List[Any] = [] + components: List[Any] = [] with stream.syntax( dot=r"\.", @@ -1436,62 +1471,48 @@ def __call__(self, stream: TokenStream) -> AstNbtPath: quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", string=r"[a-zA-Z0-9_+-]+", ): - nodes.extend(self.parse_modifiers(stream)) + components.extend(self.parse_modifiers(stream)) - while not nodes or stream.get("dot"): + while not components or stream.get("dot"): quoted_string, string = stream.expect("quoted_string", "string") if quoted_string: - nodes.append( - AstValue[str]( - value=self.quoted_string_handler.unquote_string( - quoted_string - ), - location=quoted_string.location, - end_location=quoted_string.end_location, - ) + component_node = AstValue[str]( + value=self.quote_helper.unquote_string(quoted_string), ) + components.append(set_location(component_node, quoted_string)) elif string: - nodes.append( - AstValue[str]( - value=string.value, - location=string.location, - end_location=string.end_location, - ) - ) + component_node = AstValue[str](value=string.value) + components.append(set_location(component_node, string)) - nodes.extend(self.parse_modifiers(stream)) + components.extend(self.parse_modifiers(stream)) - if not nodes: + if not components: raise stream.emit_error(InvalidSyntax("Empty nbt path not allowed.")) - return AstNbtPath( - nodes=AstChildren(nodes), - location=nodes[0].location, - end_location=nodes[-1].end_location, + node = AstNbtPath( + components=AstChildren(components), ) + return set_location(node, components[0], components[-1]) def parse_modifiers(self, stream: TokenStream) -> Iterator[Any]: """Parse named tag modifiers.""" hint = stream.peek() if hint and hint.match(("curly", "{")): - yield delegate("minecraft:nbt_compound_tag", stream) + yield delegate("nbt_compound", stream) return while bracket := stream.get(("bracket", "[")): - match = None + index = None hint = stream.peek() if hint and hint.match(("curly", "{")): - match = delegate("minecraft:nbt_compound_tag", stream) + index = delegate("nbt_compound", stream) elif hint and not hint.match(("bracket", "]")): - match = delegate("brigadier:integer", stream) + index = delegate("integer", stream) close_bracket = stream.expect(("bracket", "]")) - yield AstNbtPathSubscript( - match=match, - location=bracket.location, - end_location=close_bracket.end_location, - ) + subscript_node = AstNbtPathSubscript(index=index) + yield set_location(subscript_node, bracket, close_bracket) diff --git a/packages/mecha/mecha/prototype.py b/packages/mecha/mecha/prototype.py new file mode 100644 index 000000000..f670e345b --- /dev/null +++ b/packages/mecha/mecha/prototype.py @@ -0,0 +1,37 @@ +__all__ = [ + "CommandSignature", + "CommandPrototype", + "CommandArgument", +] + + +from typing import NamedTuple, Tuple, Union + +CommandSignature = Tuple[Union[str, "CommandArgument"], ...] + + +class CommandArgument(NamedTuple): + """Class representing an argument in a command prototype.""" + + name: str + scope: Tuple[str, ...] + + +class CommandPrototype(NamedTuple): + """Class representing a command prototype.""" + + identifier: str + signature: CommandSignature + arguments: Tuple[int, ...] + + def get_argument(self, arg: Union[str, int]) -> CommandArgument: + """Return the argument corresponding to the given name or index.""" + if isinstance(arg, str): + for i in self.arguments: + if self.get_argument(i).name == arg: + arg = i + break + else: + arg = len(self.signature) + + return self.signature[self.arguments[arg]] # type: ignore diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 29a05b8b5..8bd9658f3 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -91,6 +91,7 @@ ], "minecraft:entity": [ { + "properties": { "type": "entities", "amount": "multiple" }, "examples": [ "Player", "0123", @@ -126,7 +127,7 @@ "Player", "0123", "dd12be42-52a9-4a91-a8a1-11c01849e498", - "@e" + "@p" ] } ], @@ -212,6 +213,7 @@ ], "minecraft:score_holder": [ { + "properties": { "amount": "multiple" }, "examples": ["Player", "0123", "*", "@e"] } ], diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 80acfbbe0..66ed8a22c 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -1,32 +1,19 @@ __all__ = [ "Parser", - "CommandSpecification", - "CommandTree", - "CommandPrototype", - "CommandSignature", - "CommandArgument", + "CommandSpec", ] from dataclasses import dataclass -from importlib.resources import read_text -from pathlib import Path -from typing import ( - Any, - Dict, - List, - Literal, - NamedTuple, - Optional, - Protocol, - Tuple, - Union, -) - -from beet.core.utils import FileSystemPath, JsonDict, extra_field -from pydantic import BaseModel +from typing import Any, Dict, Protocol, Tuple + +from beet.core.utils import extra_field from tokenstream import TokenStream +from mecha.config import CommandTree + +from .prototype import CommandArgument, CommandPrototype, CommandSignature + class Parser(Protocol): """Protocol describing parser signature.""" @@ -35,149 +22,16 @@ def __call__(self, stream: TokenStream) -> Any: ... -CommandSignature = Tuple[Union[str, "CommandArgument"], ...] - - -class CommandArgument(NamedTuple): - """Class representing an argument in a command prototype.""" - - name: str - scope: Tuple[str, ...] - - -class CommandPrototype(NamedTuple): - """Class representing a command prototype.""" - - identifier: str - signature: CommandSignature - arguments: Tuple[int, ...] - - def get_argument(self, arg: Union[str, int]) -> CommandArgument: - """Return the argument corresponding to the given name or index.""" - if isinstance(arg, str): - for i in self.arguments: - if self.get_argument(i).name == arg: - arg = i - break - else: - arg = len(self.signature) - - return self.signature[self.arguments[arg]] # type: ignore - - -class CommandTree(BaseModel): - """Deserialized representation of the command tree.""" - - type: Literal["root", "literal", "argument"] - parser: Optional[str] = None - properties: Optional[JsonDict] = None - executable: Optional[bool] = None - redirect: Optional[Tuple[str, ...]] = None - children: Optional[Dict[str, "CommandTree"]] = None - subcommand: bool = False - - @classmethod - def load_from( - cls, - filename: Optional[FileSystemPath] = None, - version: Optional[str] = None, - ) -> "CommandTree": - """Load the command tree from a file.""" - sources: List[str] = [] - - if filename: - sources.append(Path(filename).read_text()) - if version: - sources.append(read_text("mecha.resources", f"{version}.json")) - - tree = cls.parse_raw(sources[0]) - - for source in sources[1:]: - tree = tree.extend(cls.parse_raw(source)) - - return tree - - def get(self, *scope: Union[str, Tuple[str, ...], None]) -> Optional["CommandTree"]: - """Retrieve a nested node.""" - node = self - for arg in scope: - if arg is None: - return None - for name in [arg] if isinstance(arg, str) else arg: - if node.children: - node = node.children.get(name) - if not node: - return None - return node - - def extend(self, other: "CommandTree") -> "CommandTree": - """Merge nodes from another command tree.""" - self.type = other.type - - if other.parser is not None: - self.parser = other.parser - - if other.properties is not None: - self.properties = other.properties - - if other.executable is not None: - self.executable = other.executable - - if other.redirect is not None: - self.redirect = other.redirect - - if other.children: - if self.children is None: - self.children = {} - for name, child in other.children.items(): - if name in self.children: - self.children[name].extend(child) - else: - self.children[name] = child - - return self - - def resolve( - self, - root: Optional["CommandTree"] = None, - scope: Tuple[str, ...] = (), - ) -> "CommandTree": - """Resolve redirections and subcommands.""" - if not root: - root = self - - if self.redirect is not None: - if target := root.get(self.redirect): - if scope[: len(self.redirect)] == self.redirect: - target.subcommand = True - self.children = target.children - else: - raise ValueError(f"Invalid redirect {self.redirect}.") - - elif self.children: - for name, child in self.children.items(): - child.resolve(root, scope + (name,)) - - elif not self.executable: - self.redirect = () - self.resolve(root, scope) - - return self - - -CommandTree.update_forward_refs() - - @dataclass -class CommandSpecification: +class CommandSpec: """Class responsible for managing the command specification.""" tree: CommandTree = extra_field( default_factory=lambda: CommandTree.load_from(version="1_17") ) - parsers: Dict[str, Parser] = extra_field(default_factory=dict) + prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) - prototypes: Dict[str, CommandPrototype] = extra_field(init=False) + parsers: Dict[str, Parser] = extra_field(default_factory=dict) def __post_init__(self): self.update() @@ -191,7 +45,7 @@ def update(self): """Recalculate command prototypes.""" self.tree.resolve() - self.prototypes = {} + self.prototypes.clear() self.generate_prototypes(self.tree) def generate_prototypes( diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 2fbe2e5df..47b2a643c 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -48,7 +48,7 @@ lxml = ["lxml"] [[package]] name = "beet" -version = "0.40.1" +version = "0.41.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -744,7 +744,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "0.7.5" +version = "1.0.1" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -861,7 +861,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "4ba84303e554d007af09a4b537ed6119ff8dbe0ce53335938abca2d5d2b9496d" +content-hash = "2969aeeaaab6bc58c68b8b24d2354bfae59cbe99819ba448a6245b410c42efde" [metadata.files] atomicwrites = [ @@ -882,8 +882,8 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"}, ] beet = [ - {file = "beet-0.40.1-py3-none-any.whl", hash = "sha256:faac0ea0b0f5300206856329c656384036a45df585ad1e3ca51c7c7f4801ec26"}, - {file = "beet-0.40.1.tar.gz", hash = "sha256:cfb7e7e57c147109c156b960295d3e05bfa62cbc0b731a0149d9649853a20e43"}, + {file = "beet-0.41.1-py3-none-any.whl", hash = "sha256:38381d525c6a2905b7d8615863648657e81c246dd3660d719979c4083dcd57f7"}, + {file = "beet-0.41.1.tar.gz", hash = "sha256:fda29893a304e257f99ff5e632c49dbd932ef8ca3a749a1f70b6287d5eda5f66"}, ] black = [ {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, @@ -1315,8 +1315,8 @@ soupsieve = [ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, ] tokenstream = [ - {file = "tokenstream-0.7.5-py3-none-any.whl", hash = "sha256:ddba116c816d50b97c9236da5bee699f3044d9649e52c2c6e73ff43f4de67574"}, - {file = "tokenstream-0.7.5.tar.gz", hash = "sha256:892d8a55d9612d7b3540ee6f4733e89c84454801ae528aa5fb6107170964c90d"}, + {file = "tokenstream-1.0.1-py3-none-any.whl", hash = "sha256:7464300fb8835986232a93e38579b3b85cf92201b1c24fbea094f624c356f219"}, + {file = "tokenstream-1.0.1.tar.gz", hash = "sha256:fefd356436f69c66095800e8fa59431438e53b503c81b6010f47a61b2ee409f6"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9cd644974..8e423eac7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,8 +23,8 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.40.1" -tokenstream = "^0.7.5" +beet = ">=0.41.1" +tokenstream = "^1.0.1" [tool.poetry.dev-dependencies] black = "^21.7b0" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt index b4bc6f694..c938249b2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt @@ -7,4 +7,4 @@ brigadier:double location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 \ No newline at end of file + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt index 02839d1c5..18ca6dff6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt @@ -7,4 +7,4 @@ brigadier:double location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: -1.0 \ No newline at end of file + value: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt index cf938ae94..114f79dd5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt @@ -7,4 +7,4 @@ brigadier:float location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: -1.0 \ No newline at end of file + value: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt index 76760aa62..b4e9c67f3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt @@ -7,4 +7,4 @@ brigadier:float location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 \ No newline at end of file + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt index 6f3759dc9..0efd16b50 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt @@ -7,4 +7,4 @@ brigadier:string location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: '"and symbols"' \ No newline at end of file + value: 'and symbols' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt index d0c4209f0..174640d62 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt @@ -7,5 +7,5 @@ minecraft:angle location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt index 4bdf0ce99..36be58767 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt @@ -7,5 +7,5 @@ minecraft:angle location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt index 9225ed2a1..5984afaee 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt @@ -7,5 +7,5 @@ minecraft:angle location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: -0.5 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: -0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt index a8280b16e..f0210e6fc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt @@ -11,17 +11,17 @@ minecraft:block_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt index 14862f585..757cf88da 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt @@ -11,17 +11,17 @@ minecraft:block_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt index 5bc86ecef..4572e538b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt @@ -11,17 +11,17 @@ minecraft:block_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'local' + type: 'local' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'local' + type: 'local' + value: 0 z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 - prefix: 'local' \ No newline at end of file + type: 'local' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt index 1494c6da2..ea7e82efa 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt @@ -11,17 +11,17 @@ minecraft:block_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 1.0 - prefix: 'local' + type: 'local' + value: 1 y: location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 0.0 - prefix: 'local' + type: 'local' + value: 0 z: location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: -5.0 - prefix: 'local' \ No newline at end of file + type: 'local' + value: -5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt index 9b2ed713e..dcb173b7d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt @@ -11,17 +11,17 @@ minecraft:block_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) + type: 'relative' value: 0.5 - prefix: 'relative' y: location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1.0 - prefix: 'relative' + type: 'relative' + value: 1 z: location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: -5.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: -5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt index 10b98f0ad..25c33e2e4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt @@ -11,11 +11,11 @@ minecraft:column_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) + type: 'absolute' value: 0 - prefix: 'absolute' y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt index 74cf6df7c..eec83253b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt @@ -11,11 +11,11 @@ minecraft:column_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) + type: 'relative' value: 0 - prefix: 'relative' y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt index c01fd7c72..65e1fcd19 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt @@ -11,11 +11,11 @@ minecraft:column_pos location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) + type: 'relative' value: 1 - prefix: 'relative' y: location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: -2 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: -2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt index 9243b4b9f..f5c76d3f3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt @@ -1,6 +1,6 @@ minecraft:entity --- -{} +{'type': 'entities', 'amount': 'multiple'} --- Player --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt index 415151a21..b6dff8a04 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt @@ -1,6 +1,6 @@ minecraft:entity --- -{} +{'type': 'entities', 'amount': 'multiple'} --- 0123 --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt index 1a29449cf..f2b201a93 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt @@ -1,6 +1,6 @@ minecraft:entity --- -{} +{'type': 'entities', 'amount': 'multiple'} --- @e --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt index 83453e83c..a9375a09f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt @@ -1,6 +1,6 @@ minecraft:entity --- -{} +{'type': 'entities', 'amount': 'multiple'} --- @e[type=foo] --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt index f689f10b4..dce222742 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt @@ -1,6 +1,6 @@ minecraft:entity --- -{} +{'type': 'entities', 'amount': 'multiple'} --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt index ac997704d..af7af8e94 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt @@ -2,11 +2,11 @@ minecraft:game_profile --- {} --- -@e +@p --- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - variable: 'e' + variable: 'p' arguments: \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt index 3ff270a6a..fa15e7782 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt @@ -7,7 +7,7 @@ Hello world! location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) - sentence: + words: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt index ea4523d0f..58175bded 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt @@ -7,7 +7,7 @@ foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - sentence: + words: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt index 4bcf50a2e..7f2bb34f2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt @@ -7,7 +7,7 @@ minecraft:message location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - sentence: + words: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt index cd45b1e94..b7e8b1119 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt @@ -7,7 +7,7 @@ Hello @p :) location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) - sentence: + words: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt index 158922da9..1d54edc5a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt @@ -7,7 +7,7 @@ foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - nodes: + components: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt index 7233ddd55..643de7b6b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt @@ -7,7 +7,7 @@ foo.bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) - nodes: + components: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt index 318d8edb2..dfebd282f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt @@ -7,7 +7,7 @@ foo[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) - nodes: + components: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) @@ -15,7 +15,7 @@ foo[0] location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=6, lineno=1, colno=7) - match: + index: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt index a6cecea8f..802378b60 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt @@ -7,11 +7,11 @@ minecraft:nbt_path location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - nodes: + components: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - match: + index: location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt index 9ae04947f..6cd28ef9c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt @@ -7,8 +7,8 @@ minecraft:nbt_path location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - nodes: + components: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - match: None \ No newline at end of file + index: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt index 69e6298d2..5d2cca362 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt @@ -7,7 +7,7 @@ minecraft:nbt_path location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) - nodes: + components: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt index 3a2982247..2d09816f8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt @@ -11,11 +11,11 @@ minecraft:rotation location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt index 66110a799..b461d5dd1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt @@ -11,11 +11,11 @@ minecraft:rotation location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt index a11c1ac43..0e57f1ebd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt @@ -11,11 +11,11 @@ minecraft:rotation location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: -5.0 - prefix: 'relative' + type: 'relative' + value: -5 y: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 5.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt index 2254ac43a..5899d2301 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt @@ -1,6 +1,6 @@ minecraft:score_holder --- -{} +{'amount': 'multiple'} --- Player --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt index 912601f91..b8427d12b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt @@ -1,6 +1,6 @@ minecraft:score_holder --- -{} +{'amount': 'multiple'} --- 0123 --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt index 938c17d5b..d760a5703 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt @@ -1,6 +1,6 @@ minecraft:score_holder --- -{} +{'amount': 'multiple'} --- * --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt index eb2640952..e834f7af5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt @@ -1,6 +1,6 @@ minecraft:score_holder --- -{} +{'amount': 'multiple'} --- @e --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt index 5b27bcf18..2f8eeb2ff 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt @@ -11,11 +11,11 @@ minecraft:vec2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt index 4400a327b..3ae6db17f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt @@ -11,11 +11,11 @@ minecraft:vec2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt index 44990ef0e..8c37560e0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt @@ -11,11 +11,11 @@ minecraft:vec2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) + type: 'absolute' value: 0.1 - prefix: 'absolute' y: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: -0.5 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: -0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt index b82b8a4c9..d50e97e0b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt @@ -11,11 +11,11 @@ minecraft:vec2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 1.0 - prefix: 'relative' + type: 'relative' + value: 1 y: location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: -2.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: -2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt index 6903407cb..c14489f61 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt @@ -11,17 +11,17 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt index d22139cd5..5676ea00e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt @@ -11,17 +11,17 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt index ed9c3e267..0a7aca5a4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt @@ -11,17 +11,17 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - prefix: 'local' + type: 'local' + value: 0 y: location: SourceLocation(pos=2, lineno=1, colno=3) end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 0.0 - prefix: 'local' + type: 'local' + value: 0 z: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 0.0 - prefix: 'local' \ No newline at end of file + type: 'local' + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt index 0099f1e2b..fa295a8ee 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt @@ -11,17 +11,17 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 1.0 - prefix: 'local' + type: 'local' + value: 1 y: location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 0.0 - prefix: 'local' + type: 'local' + value: 0 z: location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: -5.0 - prefix: 'local' \ No newline at end of file + type: 'local' + value: -5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt index 605281efd..9a53dfb35 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt @@ -11,17 +11,17 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) + type: 'absolute' value: 0.1 - prefix: 'absolute' y: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) + type: 'absolute' value: -0.5 - prefix: 'absolute' z: location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 0.9 - prefix: 'absolute' \ No newline at end of file + type: 'absolute' + value: 0.9 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt index 213f513a7..d6348e7c3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt @@ -11,17 +11,17 @@ minecraft:vec3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) + type: 'relative' value: 0.5 - prefix: 'relative' y: location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1.0 - prefix: 'relative' + type: 'relative' + value: 1 z: location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: -5.0 - prefix: 'relative' \ No newline at end of file + type: 'relative' + value: -5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index dd6afd267..dd3ddf287 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -67,7 +67,7 @@ location: SourceLocation(pos=157, lineno=5, colno=47) end_location: SourceLocation(pos=158, lineno=5, colno=48) - value: 5.0 + value: 5 location: SourceLocation(pos=167, lineno=7, colno=1) end_location: SourceLocation(pos=172, lineno=7, colno=6) @@ -202,7 +202,7 @@ location: SourceLocation(pos=324, lineno=12, colno=20) end_location: SourceLocation(pos=343, lineno=12, colno=39) - nodes: + components: location: SourceLocation(pos=324, lineno=12, colno=20) end_location: SourceLocation(pos=343, lineno=12, colno=39) @@ -283,7 +283,7 @@ location: SourceLocation(pos=412, lineno=13, colno=69) end_location: SourceLocation(pos=423, lineno=13, colno=80) - nodes: + components: location: SourceLocation(pos=412, lineno=13, colno=69) end_location: SourceLocation(pos=423, lineno=13, colno=80) @@ -353,7 +353,7 @@ location: SourceLocation(pos=487, lineno=14, colno=51) end_location: SourceLocation(pos=493, lineno=14, colno=57) - nodes: + components: location: SourceLocation(pos=487, lineno=14, colno=51) end_location: SourceLocation(pos=490, lineno=14, colno=54) @@ -361,7 +361,7 @@ location: SourceLocation(pos=490, lineno=14, colno=54) end_location: SourceLocation(pos=493, lineno=14, colno=57) - match: + index: location: SourceLocation(pos=491, lineno=14, colno=55) end_location: SourceLocation(pos=492, lineno=14, colno=56) @@ -380,7 +380,7 @@ location: SourceLocation(pos=513, lineno=15, colno=20) end_location: SourceLocation(pos=537, lineno=15, colno=44) - nodes: + components: location: SourceLocation(pos=513, lineno=15, colno=20) end_location: SourceLocation(pos=522, lineno=15, colno=29) @@ -388,7 +388,7 @@ location: SourceLocation(pos=522, lineno=15, colno=29) end_location: SourceLocation(pos=534, lineno=15, colno=41) - match: + index: location: SourceLocation(pos=523, lineno=15, colno=30) end_location: SourceLocation(pos=533, lineno=15, colno=40) @@ -433,7 +433,7 @@ location: SourceLocation(pos=562, lineno=16, colno=25) end_location: SourceLocation(pos=563, lineno=16, colno=26) - value: 0.0 + value: 0 location: SourceLocation(pos=564, lineno=16, colno=27) end_location: SourceLocation(pos=568, lineno=16, colno=31) @@ -447,7 +447,7 @@ location: SourceLocation(pos=566, lineno=16, colno=29) end_location: SourceLocation(pos=568, lineno=16, colno=31) - value: 64.0 + value: 64 location: SourceLocation(pos=569, lineno=16, colno=32) end_location: SourceLocation(pos=572, lineno=16, colno=35) @@ -461,7 +461,7 @@ location: SourceLocation(pos=571, lineno=16, colno=34) end_location: SourceLocation(pos=572, lineno=16, colno=35) - value: 0.0 + value: 0 location: SourceLocation(pos=573, lineno=16, colno=36) end_location: SourceLocation(pos=585, lineno=16, colno=48) @@ -499,7 +499,7 @@ location: SourceLocation(pos=595, lineno=16, colno=58) end_location: SourceLocation(pos=635, lineno=16, colno=98) - nodes: + components: location: SourceLocation(pos=595, lineno=16, colno=58) end_location: SourceLocation(pos=605, lineno=16, colno=68) @@ -507,7 +507,7 @@ location: SourceLocation(pos=605, lineno=16, colno=68) end_location: SourceLocation(pos=630, lineno=16, colno=93) - match: + index: location: SourceLocation(pos=606, lineno=16, colno=69) end_location: SourceLocation(pos=629, lineno=16, colno=92) @@ -545,24 +545,24 @@ location: SourceLocation(pos=667, lineno=17, colno=19) end_location: SourceLocation(pos=668, lineno=17, colno=20) - value: 1.0 - prefix: 'absolute' + type: 'absolute' + value: 1 y: location: SourceLocation(pos=669, lineno=17, colno=21) end_location: SourceLocation(pos=671, lineno=17, colno=23) - value: 64.0 - prefix: 'absolute' + type: 'absolute' + value: 64 z: location: SourceLocation(pos=672, lineno=17, colno=24) end_location: SourceLocation(pos=673, lineno=17, colno=25) - value: 1.0 - prefix: 'absolute' + type: 'absolute' + value: 1 location: SourceLocation(pos=674, lineno=17, colno=26) end_location: SourceLocation(pos=685, lineno=17, colno=37) - nodes: + components: location: SourceLocation(pos=674, lineno=17, colno=26) end_location: SourceLocation(pos=679, lineno=17, colno=31) @@ -570,7 +570,7 @@ location: SourceLocation(pos=679, lineno=17, colno=31) end_location: SourceLocation(pos=682, lineno=17, colno=34) - match: + index: location: SourceLocation(pos=680, lineno=17, colno=32) end_location: SourceLocation(pos=681, lineno=17, colno=33) @@ -727,7 +727,7 @@ location: SourceLocation(pos=863, lineno=19, colno=57) end_location: SourceLocation(pos=881, lineno=19, colno=75) - nodes: + components: location: SourceLocation(pos=863, lineno=19, colno=57) end_location: SourceLocation(pos=878, lineno=19, colno=72) @@ -735,7 +735,7 @@ location: SourceLocation(pos=878, lineno=19, colno=72) end_location: SourceLocation(pos=881, lineno=19, colno=75) - match: + index: location: SourceLocation(pos=879, lineno=19, colno=73) end_location: SourceLocation(pos=880, lineno=19, colno=74) @@ -963,20 +963,20 @@ location: SourceLocation(pos=1241, lineno=34, colno=6) end_location: SourceLocation(pos=1243, lineno=34, colno=8) - value: 52.0 - prefix: 'absolute' + type: 'absolute' + value: 52 y: location: SourceLocation(pos=1244, lineno=34, colno=9) end_location: SourceLocation(pos=1246, lineno=34, colno=11) - value: 63.0 - prefix: 'absolute' + type: 'absolute' + value: 63 z: location: SourceLocation(pos=1247, lineno=34, colno=12) end_location: SourceLocation(pos=1252, lineno=34, colno=17) - value: -1516.0 - prefix: 'absolute' + type: 'absolute' + value: -1516 location: SourceLocation(pos=1253, lineno=34, colno=18) end_location: SourceLocation(pos=1264, lineno=34, colno=29) @@ -984,20 +984,20 @@ location: SourceLocation(pos=1253, lineno=34, colno=18) end_location: SourceLocation(pos=1255, lineno=34, colno=20) - value: 33.0 - prefix: 'absolute' + type: 'absolute' + value: 33 y: location: SourceLocation(pos=1256, lineno=34, colno=21) end_location: SourceLocation(pos=1258, lineno=34, colno=23) - value: 73.0 - prefix: 'absolute' + type: 'absolute' + value: 73 z: location: SourceLocation(pos=1259, lineno=34, colno=24) end_location: SourceLocation(pos=1264, lineno=34, colno=29) - value: -1536.0 - prefix: 'absolute' + type: 'absolute' + value: -1536 location: SourceLocation(pos=1265, lineno=34, colno=30) end_location: SourceLocation(pos=1285, lineno=34, colno=50) @@ -1052,20 +1052,20 @@ location: SourceLocation(pos=1334, lineno=35, colno=6) end_location: SourceLocation(pos=1337, lineno=35, colno=9) - value: -3.0 - prefix: 'relative' + type: 'relative' + value: -3 y: location: SourceLocation(pos=1338, lineno=35, colno=10) end_location: SourceLocation(pos=1341, lineno=35, colno=13) - value: -3.0 - prefix: 'relative' + type: 'relative' + value: -3 z: location: SourceLocation(pos=1342, lineno=35, colno=14) end_location: SourceLocation(pos=1345, lineno=35, colno=17) - value: -3.0 - prefix: 'relative' + type: 'relative' + value: -3 location: SourceLocation(pos=1346, lineno=35, colno=18) end_location: SourceLocation(pos=1355, lineno=35, colno=27) @@ -1073,20 +1073,20 @@ location: SourceLocation(pos=1346, lineno=35, colno=18) end_location: SourceLocation(pos=1348, lineno=35, colno=20) - value: 3.0 - prefix: 'relative' + type: 'relative' + value: 3 y: location: SourceLocation(pos=1349, lineno=35, colno=21) end_location: SourceLocation(pos=1352, lineno=35, colno=24) - value: -1.0 - prefix: 'relative' + type: 'relative' + value: -1 z: location: SourceLocation(pos=1353, lineno=35, colno=25) end_location: SourceLocation(pos=1355, lineno=35, colno=27) - value: 3.0 - prefix: 'relative' + type: 'relative' + value: 3 location: SourceLocation(pos=1356, lineno=35, colno=28) end_location: SourceLocation(pos=1361, lineno=35, colno=33) @@ -1116,20 +1116,20 @@ location: SourceLocation(pos=1367, lineno=36, colno=6) end_location: SourceLocation(pos=1370, lineno=36, colno=9) - value: -3.0 - prefix: 'relative' + type: 'relative' + value: -3 y: location: SourceLocation(pos=1371, lineno=36, colno=10) end_location: SourceLocation(pos=1372, lineno=36, colno=11) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=1373, lineno=36, colno=12) end_location: SourceLocation(pos=1376, lineno=36, colno=15) - value: -4.0 - prefix: 'relative' + type: 'relative' + value: -4 location: SourceLocation(pos=1377, lineno=36, colno=16) end_location: SourceLocation(pos=1385, lineno=36, colno=24) @@ -1137,20 +1137,20 @@ location: SourceLocation(pos=1377, lineno=36, colno=16) end_location: SourceLocation(pos=1379, lineno=36, colno=18) - value: 3.0 - prefix: 'relative' + type: 'relative' + value: 3 y: location: SourceLocation(pos=1380, lineno=36, colno=19) end_location: SourceLocation(pos=1382, lineno=36, colno=21) - value: 4.0 - prefix: 'relative' + type: 'relative' + value: 4 z: location: SourceLocation(pos=1383, lineno=36, colno=22) end_location: SourceLocation(pos=1385, lineno=36, colno=24) - value: 4.0 - prefix: 'relative' + type: 'relative' + value: 4 location: SourceLocation(pos=1386, lineno=36, colno=25) end_location: SourceLocation(pos=1401, lineno=36, colno=40) @@ -1184,20 +1184,20 @@ location: SourceLocation(pos=1414, lineno=37, colno=6) end_location: SourceLocation(pos=1418, lineno=37, colno=10) - value: -15.0 - prefix: 'relative' + type: 'relative' + value: -15 y: location: SourceLocation(pos=1419, lineno=37, colno=11) end_location: SourceLocation(pos=1423, lineno=37, colno=15) - value: -15.0 - prefix: 'relative' + type: 'relative' + value: -15 z: location: SourceLocation(pos=1424, lineno=37, colno=16) end_location: SourceLocation(pos=1428, lineno=37, colno=20) - value: -15.0 - prefix: 'relative' + type: 'relative' + value: -15 location: SourceLocation(pos=1429, lineno=37, colno=21) end_location: SourceLocation(pos=1440, lineno=37, colno=32) @@ -1205,20 +1205,20 @@ location: SourceLocation(pos=1429, lineno=37, colno=21) end_location: SourceLocation(pos=1432, lineno=37, colno=24) - value: 15.0 - prefix: 'relative' + type: 'relative' + value: 15 y: location: SourceLocation(pos=1433, lineno=37, colno=25) end_location: SourceLocation(pos=1436, lineno=37, colno=28) - value: 15.0 - prefix: 'relative' + type: 'relative' + value: 15 z: location: SourceLocation(pos=1437, lineno=37, colno=29) end_location: SourceLocation(pos=1440, lineno=37, colno=32) - value: 15.0 - prefix: 'relative' + type: 'relative' + value: 15 location: SourceLocation(pos=1441, lineno=37, colno=33) end_location: SourceLocation(pos=1446, lineno=37, colno=38) @@ -1248,20 +1248,20 @@ location: SourceLocation(pos=1452, lineno=38, colno=6) end_location: SourceLocation(pos=1455, lineno=38, colno=9) - value: -1.0 - prefix: 'relative' + type: 'relative' + value: -1 y: location: SourceLocation(pos=1456, lineno=38, colno=10) end_location: SourceLocation(pos=1457, lineno=38, colno=11) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=1458, lineno=38, colno=12) end_location: SourceLocation(pos=1459, lineno=38, colno=13) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=1460, lineno=38, colno=14) end_location: SourceLocation(pos=1466, lineno=38, colno=20) @@ -1269,20 +1269,20 @@ location: SourceLocation(pos=1460, lineno=38, colno=14) end_location: SourceLocation(pos=1462, lineno=38, colno=16) - value: 1.0 - prefix: 'relative' + type: 'relative' + value: 1 y: location: SourceLocation(pos=1463, lineno=38, colno=17) end_location: SourceLocation(pos=1464, lineno=38, colno=18) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=1465, lineno=38, colno=19) end_location: SourceLocation(pos=1466, lineno=38, colno=20) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=1467, lineno=38, colno=21) end_location: SourceLocation(pos=1531, lineno=38, colno=85) @@ -1822,20 +1822,20 @@ location: SourceLocation(pos=2295, lineno=60, colno=20) end_location: SourceLocation(pos=2296, lineno=60, colno=21) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2297, lineno=60, colno=22) end_location: SourceLocation(pos=2299, lineno=60, colno=24) - value: 2.0 - prefix: 'relative' + type: 'relative' + value: 2 z: location: SourceLocation(pos=2300, lineno=60, colno=25) end_location: SourceLocation(pos=2301, lineno=60, colno=26) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=2302, lineno=60, colno=27) end_location: SourceLocation(pos=2314, lineno=60, colno=39) @@ -2166,7 +2166,7 @@ location: SourceLocation(pos=2710, lineno=74, colno=8) end_location: SourceLocation(pos=2712, lineno=74, colno=10) - sentence: + words: location: SourceLocation(pos=2710, lineno=74, colno=8) end_location: SourceLocation(pos=2712, lineno=74, colno=10) @@ -2183,20 +2183,20 @@ location: SourceLocation(pos=2733, lineno=76, colno=10) end_location: SourceLocation(pos=2734, lineno=76, colno=11) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2735, lineno=76, colno=12) end_location: SourceLocation(pos=2736, lineno=76, colno=13) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=2737, lineno=76, colno=14) end_location: SourceLocation(pos=2738, lineno=76, colno=15) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=2739, lineno=76, colno=16) end_location: SourceLocation(pos=2757, lineno=76, colno=34) @@ -2238,20 +2238,20 @@ location: SourceLocation(pos=2767, lineno=77, colno=10) end_location: SourceLocation(pos=2768, lineno=77, colno=11) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2769, lineno=77, colno=12) end_location: SourceLocation(pos=2770, lineno=77, colno=13) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=2771, lineno=77, colno=14) end_location: SourceLocation(pos=2774, lineno=77, colno=17) - value: -1.0 - prefix: 'relative' + type: 'relative' + value: -1 location: SourceLocation(pos=2775, lineno=77, colno=18) end_location: SourceLocation(pos=2831, lineno=77, colno=74) @@ -2311,20 +2311,20 @@ location: SourceLocation(pos=2841, lineno=78, colno=10) end_location: SourceLocation(pos=2842, lineno=78, colno=11) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2843, lineno=78, colno=12) end_location: SourceLocation(pos=2845, lineno=78, colno=14) - value: 2.0 - prefix: 'relative' + type: 'relative' + value: 2 z: location: SourceLocation(pos=2846, lineno=78, colno=15) end_location: SourceLocation(pos=2847, lineno=78, colno=16) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=2848, lineno=78, colno=17) end_location: SourceLocation(pos=2869, lineno=78, colno=38) @@ -2366,22 +2366,22 @@ location: SourceLocation(pos=2900, lineno=80, colno=15) end_location: SourceLocation(pos=2901, lineno=80, colno=16) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 y: location: SourceLocation(pos=2902, lineno=80, colno=17) end_location: SourceLocation(pos=2903, lineno=80, colno=18) - value: 0.0 - prefix: 'absolute' + type: 'absolute' + value: 0 location: SourceLocation(pos=2904, lineno=80, colno=19) end_location: SourceLocation(pos=2907, lineno=80, colno=22) - value: 200.0 + value: 200 location: SourceLocation(pos=2908, lineno=80, colno=23) end_location: SourceLocation(pos=2911, lineno=80, colno=26) - value: 500.0 + value: 500 location: SourceLocation(pos=2912, lineno=80, colno=27) end_location: SourceLocation(pos=2916, lineno=80, colno=31) @@ -2414,20 +2414,20 @@ location: SourceLocation(pos=2951, lineno=82, colno=23) end_location: SourceLocation(pos=2955, lineno=82, colno=27) - value: -10.0 - prefix: 'relative' + type: 'relative' + value: -10 y: location: SourceLocation(pos=2956, lineno=82, colno=28) end_location: SourceLocation(pos=2957, lineno=82, colno=29) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=2958, lineno=82, colno=30) end_location: SourceLocation(pos=2959, lineno=82, colno=31) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=2960, lineno=83, colno=1) end_location: SourceLocation(pos=3036, lineno=83, colno=77) @@ -2450,20 +2450,20 @@ location: SourceLocation(pos=2975, lineno=83, colno=16) end_location: SourceLocation(pos=2976, lineno=83, colno=17) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=2977, lineno=83, colno=18) end_location: SourceLocation(pos=2978, lineno=83, colno=19) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=2979, lineno=83, colno=20) end_location: SourceLocation(pos=2980, lineno=83, colno=21) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=2981, lineno=83, colno=22) end_location: SourceLocation(pos=3036, lineno=83, colno=77) @@ -2516,20 +2516,20 @@ location: SourceLocation(pos=3051, lineno=84, colno=15) end_location: SourceLocation(pos=3052, lineno=84, colno=16) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=3053, lineno=84, colno=17) end_location: SourceLocation(pos=3054, lineno=84, colno=18) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=3055, lineno=84, colno=19) end_location: SourceLocation(pos=3056, lineno=84, colno=20) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=3057, lineno=84, colno=21) end_location: SourceLocation(pos=3146, lineno=84, colno=110) @@ -2629,20 +2629,20 @@ location: SourceLocation(pos=3163, lineno=85, colno=17) end_location: SourceLocation(pos=3164, lineno=85, colno=18) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 y: location: SourceLocation(pos=3165, lineno=85, colno=19) end_location: SourceLocation(pos=3166, lineno=85, colno=20) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 z: location: SourceLocation(pos=3167, lineno=85, colno=21) end_location: SourceLocation(pos=3168, lineno=85, colno=22) - value: 0.0 - prefix: 'relative' + type: 'relative' + value: 0 location: SourceLocation(pos=3169, lineno=85, colno=23) end_location: SourceLocation(pos=3272, lineno=85, colno=126) @@ -2806,20 +2806,20 @@ location: SourceLocation(pos=3323, lineno=89, colno=10) end_location: SourceLocation(pos=3326, lineno=89, colno=13) - value: 100.0 - prefix: 'absolute' + type: 'absolute' + value: 100 y: location: SourceLocation(pos=3327, lineno=89, colno=14) end_location: SourceLocation(pos=3329, lineno=89, colno=16) - value: 3.0 - prefix: 'relative' + type: 'relative' + value: 3 z: location: SourceLocation(pos=3330, lineno=89, colno=17) end_location: SourceLocation(pos=3333, lineno=89, colno=20) - value: 100.0 - prefix: 'absolute' + type: 'absolute' + value: 100 location: SourceLocation(pos=3344, lineno=91, colno=1) end_location: SourceLocation(pos=3372, lineno=91, colno=29) diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 2db859350..5ab14dd76 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -41,7 +41,7 @@ def test_argument_examples( properties: JsonDict, value: str, ): - if argument_parser not in mc.spec.parsers: + if f"command:argument:{argument_parser}" not in mc.spec.parsers: pytest.skip() stream = mc.create_token_stream(value) @@ -52,6 +52,6 @@ def test_argument_examples( argument_parser, str(properties), value, - delegate(argument_parser, stream).dump(), + delegate(f"command:argument:{argument_parser}", stream).dump(), ] ) From 211b394214c45e41a1b15257c47a5b0da887a111 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 03:03:18 +0200 Subject: [PATCH 0290/1554] fix: properly validate swizzle --- packages/mecha/mecha/parse.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e5afc857d..f0a5ec595 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1118,7 +1118,8 @@ def parse_swizzle(stream: TokenStream) -> AstValue[str]: """Parse swizzle.""" node = delegate("literal", stream) - if not 1 <= len(node.value) <= 3 or len(set(node.value)) < len(node.value): + normalized = set(node.value[:3]) & {"x", "y", "z"} + if not normalized or len(node.value) != len(normalized): raise node.emit_error(InvalidSyntax(f"Invalid swizzle {node.value!r}.")) return node From 9e0277de0d49d2c543d70fa67e188d8fa4b3c6b5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 03:22:52 +0200 Subject: [PATCH 0291/1554] test: use stable generated test names --- ...gument_examples_brigadier_bool_0_0__0.txt} | 2 +- ...gument_examples_brigadier_bool_0_1__0.txt} | 2 +- ...ment_examples_brigadier_double_0_0__0.txt} | 2 +- ...ment_examples_brigadier_double_0_1__0.txt} | 2 +- ...ment_examples_brigadier_double_0_2__0.txt} | 2 +- ...ment_examples_brigadier_double_0_3__0.txt} | 2 +- ...ment_examples_brigadier_double_0_4__0.txt} | 2 +- ...ment_examples_brigadier_double_0_5__0.txt} | 2 +- ...ument_examples_brigadier_float_0_0__0.txt} | 2 +- ...ument_examples_brigadier_float_0_1__0.txt} | 2 +- ...ument_examples_brigadier_float_0_2__0.txt} | 2 +- ...ument_examples_brigadier_float_0_3__0.txt} | 2 +- ...ument_examples_brigadier_float_0_4__0.txt} | 2 +- ...ument_examples_brigadier_float_0_5__0.txt} | 2 +- ...ent_examples_brigadier_integer_0_0__0.txt} | 2 +- ...ent_examples_brigadier_integer_0_1__0.txt} | 2 +- ...ent_examples_brigadier_integer_0_2__0.txt} | 2 +- ...gument_examples_brigadier_long_0_0__0.txt} | 2 +- ...gument_examples_brigadier_long_0_1__0.txt} | 2 +- ...gument_examples_brigadier_long_0_2__0.txt} | 2 +- ...ment_examples_brigadier_string_0_0__0.txt} | 2 +- ...ment_examples_brigadier_string_0_1__0.txt} | 2 +- ...ment_examples_brigadier_string_1_0__0.txt} | 2 +- ...ment_examples_brigadier_string_1_1__0.txt} | 2 +- ...ment_examples_brigadier_string_1_2__0.txt} | 2 +- ...ment_examples_brigadier_string_2_0__0.txt} | 2 +- ...ment_examples_brigadier_string_2_1__0.txt} | 2 +- ...ment_examples_brigadier_string_2_2__0.txt} | 2 +- ...ument_examples_minecraft_angle_0_0__0.txt} | 2 +- ...ument_examples_minecraft_angle_0_1__0.txt} | 2 +- ...ument_examples_minecraft_angle_0_2__0.txt} | 2 +- ...t_examples_minecraft_block_pos_0_0__0.txt} | 2 +- ...t_examples_minecraft_block_pos_0_1__0.txt} | 2 +- ...t_examples_minecraft_block_pos_0_2__0.txt} | 2 +- ...t_examples_minecraft_block_pos_0_3__0.txt} | 2 +- ...t_examples_minecraft_block_pos_0_4__0.txt} | 2 +- ...ples_minecraft_block_predicate_0_0__0.txt} | 2 +- ...ples_minecraft_block_predicate_0_1__0.txt} | 2 +- ...ples_minecraft_block_predicate_0_2__0.txt} | 2 +- ...ples_minecraft_block_predicate_0_3__0.txt} | 2 +- ...ples_minecraft_block_predicate_0_4__0.txt} | 2 +- ...examples_minecraft_block_state_0_0__0.txt} | 2 +- ...examples_minecraft_block_state_0_1__0.txt} | 2 +- ...examples_minecraft_block_state_0_2__0.txt} | 2 +- ...examples_minecraft_block_state_0_3__0.txt} | 2 +- ...ument_examples_minecraft_color_0_0__0.txt} | 2 +- ...ument_examples_minecraft_color_0_1__0.txt} | 2 +- ..._examples_minecraft_column_pos_0_0__0.txt} | 2 +- ..._examples_minecraft_column_pos_0_1__0.txt} | 2 +- ..._examples_minecraft_column_pos_0_2__0.txt} | 2 +- ...t_examples_minecraft_component_0_0__0.txt} | 2 +- ...t_examples_minecraft_component_0_1__0.txt} | 2 +- ...t_examples_minecraft_component_0_2__0.txt} | 2 +- ...t_examples_minecraft_component_0_3__0.txt} | 2 +- ...t_examples_minecraft_dimension_0_0__0.txt} | 2 +- ...t_examples_minecraft_dimension_0_1__0.txt} | 2 +- ...ment_examples_minecraft_entity_0_0__0.txt} | 2 +- ...ment_examples_minecraft_entity_0_1__0.txt} | 2 +- ...ment_examples_minecraft_entity_0_2__0.txt} | 2 +- ...ment_examples_minecraft_entity_0_3__0.txt} | 2 +- ...ment_examples_minecraft_entity_0_4__0.txt} | 2 +- ...amples_minecraft_entity_anchor_0_0__0.txt} | 2 +- ...amples_minecraft_entity_anchor_0_1__0.txt} | 2 +- ...amples_minecraft_entity_summon_0_0__0.txt} | 2 +- ...amples_minecraft_entity_summon_0_1__0.txt} | 2 +- ...examples_minecraft_float_range_0_0__0.txt} | 2 +- ...examples_minecraft_float_range_0_1__0.txt} | 2 +- ...examples_minecraft_float_range_0_2__0.txt} | 2 +- ...examples_minecraft_float_range_0_3__0.txt} | 2 +- ...examples_minecraft_float_range_0_4__0.txt} | 2 +- ...nt_examples_minecraft_function_0_0__0.txt} | 2 +- ...nt_examples_minecraft_function_0_1__0.txt} | 2 +- ...nt_examples_minecraft_function_0_2__0.txt} | 2 +- ...xamples_minecraft_game_profile_0_0__0.txt} | 2 +- ...xamples_minecraft_game_profile_0_1__0.txt} | 2 +- ...xamples_minecraft_game_profile_0_2__0.txt} | 2 +- ...xamples_minecraft_game_profile_0_3__0.txt} | 2 +- ...t_examples_minecraft_int_range_0_0__0.txt} | 2 +- ...t_examples_minecraft_int_range_0_1__0.txt} | 2 +- ...t_examples_minecraft_int_range_0_2__0.txt} | 2 +- ...t_examples_minecraft_int_range_0_3__0.txt} | 2 +- ...t_examples_minecraft_int_range_0_4__0.txt} | 2 +- ...les_minecraft_item_enchantment_0_0__0.txt} | 2 +- ...les_minecraft_item_enchantment_0_1__0.txt} | 2 +- ...mples_minecraft_item_predicate_0_0__0.txt} | 2 +- ...mples_minecraft_item_predicate_0_1__0.txt} | 2 +- ...mples_minecraft_item_predicate_0_2__0.txt} | 2 +- ...mples_minecraft_item_predicate_0_3__0.txt} | 2 +- ...t_examples_minecraft_item_slot_0_0__0.txt} | 2 +- ...t_examples_minecraft_item_slot_0_1__0.txt} | 2 +- ...t_examples_minecraft_item_slot_0_2__0.txt} | 2 +- ..._examples_minecraft_item_stack_0_0__0.txt} | 2 +- ..._examples_minecraft_item_stack_0_1__0.txt} | 2 +- ..._examples_minecraft_item_stack_0_2__0.txt} | 2 +- ...ent_examples_minecraft_message_0_0__0.txt} | 2 +- ...ent_examples_minecraft_message_0_1__0.txt} | 2 +- ...ent_examples_minecraft_message_0_2__0.txt} | 2 +- ...ent_examples_minecraft_message_0_3__0.txt} | 2 +- ..._examples_minecraft_mob_effect_0_0__0.txt} | 2 +- ..._examples_minecraft_mob_effect_0_1__0.txt} | 2 +- ...les_minecraft_nbt_compound_tag_0_0__0.txt} | 2 +- ...les_minecraft_nbt_compound_tag_0_1__0.txt} | 2 +- ...nt_examples_minecraft_nbt_path_0_0__0.txt} | 2 +- ...nt_examples_minecraft_nbt_path_0_1__0.txt} | 2 +- ...nt_examples_minecraft_nbt_path_0_2__0.txt} | 2 +- ...nt_examples_minecraft_nbt_path_0_3__0.txt} | 2 +- ...nt_examples_minecraft_nbt_path_0_4__0.txt} | 2 +- ...nt_examples_minecraft_nbt_path_0_5__0.txt} | 2 +- ...ent_examples_minecraft_nbt_tag_0_0__0.txt} | 2 +- ...ent_examples_minecraft_nbt_tag_0_1__0.txt} | 2 +- ...ent_examples_minecraft_nbt_tag_0_2__0.txt} | 2 +- ...ent_examples_minecraft_nbt_tag_0_3__0.txt} | 2 +- ...ent_examples_minecraft_nbt_tag_0_4__0.txt} | 2 +- ...ent_examples_minecraft_nbt_tag_0_5__0.txt} | 2 +- ...t_examples_minecraft_objective_0_0__0.txt} | 2 +- ...t_examples_minecraft_objective_0_1__0.txt} | 2 +- ...t_examples_minecraft_objective_0_2__0.txt} | 2 +- ...s_minecraft_objective_criteria_0_0__0.txt} | 2 +- ...s_minecraft_objective_criteria_0_1__0.txt} | 2 +- ...s_minecraft_objective_criteria_0_2__0.txt} | 2 +- ...t_examples_minecraft_operation_0_0__0.txt} | 2 +- ...t_examples_minecraft_operation_0_1__0.txt} | 2 +- ...t_examples_minecraft_operation_0_2__0.txt} | 2 +- ...es_minecraft_resource_location_0_0__0.txt} | 2 +- ...es_minecraft_resource_location_0_1__0.txt} | 2 +- ...es_minecraft_resource_location_0_2__0.txt} | 2 +- ...nt_examples_minecraft_rotation_0_0__0.txt} | 2 +- ...nt_examples_minecraft_rotation_0_1__0.txt} | 2 +- ...nt_examples_minecraft_rotation_0_2__0.txt} | 2 +- ...xamples_minecraft_score_holder_0_0__0.txt} | 2 +- ...xamples_minecraft_score_holder_0_1__0.txt} | 2 +- ...xamples_minecraft_score_holder_0_2__0.txt} | 2 +- ...xamples_minecraft_score_holder_0_3__0.txt} | 2 +- ...ples_minecraft_scoreboard_slot_0_0__0.txt} | 2 +- ...ples_minecraft_scoreboard_slot_0_1__0.txt} | 2 +- ...ent_examples_minecraft_swizzle_0_0__0.txt} | 2 +- ...ent_examples_minecraft_swizzle_0_1__0.txt} | 2 +- ...gument_examples_minecraft_team_0_0__0.txt} | 2 +- ...gument_examples_minecraft_team_0_1__0.txt} | 2 +- ...gument_examples_minecraft_time_0_0__0.txt} | 2 +- ...gument_examples_minecraft_time_0_1__0.txt} | 2 +- ...gument_examples_minecraft_time_0_2__0.txt} | 2 +- ...gument_examples_minecraft_time_0_3__0.txt} | 2 +- ...gument_examples_minecraft_uuid_0_0__0.txt} | 2 +- ...gument_examples_minecraft_vec2_0_0__0.txt} | 2 +- ...gument_examples_minecraft_vec2_0_1__0.txt} | 2 +- ...gument_examples_minecraft_vec2_0_2__0.txt} | 2 +- ...gument_examples_minecraft_vec2_0_3__0.txt} | 2 +- ...gument_examples_minecraft_vec3_0_0__0.txt} | 2 +- ...gument_examples_minecraft_vec3_0_1__0.txt} | 2 +- ...gument_examples_minecraft_vec3_0_2__0.txt} | 2 +- ...gument_examples_minecraft_vec3_0_3__0.txt} | 2 +- ...gument_examples_minecraft_vec3_0_4__0.txt} | 2 +- ...gument_examples_minecraft_vec3_0_5__0.txt} | 2 +- packages/mecha/tests/test_parse.py | 50 +++++++++++++------ 155 files changed, 189 insertions(+), 169 deletions(-) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_bool_0__0.txt => parse__argument_examples_brigadier_bool_0_0__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_bool_1__0.txt => parse__argument_examples_brigadier_bool_0_1__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_double_2__0.txt => parse__argument_examples_brigadier_double_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_double_3__0.txt => parse__argument_examples_brigadier_double_0_1__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_float_10__0.txt => parse__argument_examples_brigadier_double_0_2__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_float_11__0.txt => parse__argument_examples_brigadier_double_0_3__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_float_12__0.txt => parse__argument_examples_brigadier_double_0_4__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_float_13__0.txt => parse__argument_examples_brigadier_double_0_5__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_integer_14__0.txt => parse__argument_examples_brigadier_float_0_0__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_float_9__0.txt => parse__argument_examples_brigadier_float_0_1__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_double_4__0.txt => parse__argument_examples_brigadier_float_0_2__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_double_5__0.txt => parse__argument_examples_brigadier_float_0_3__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_double_6__0.txt => parse__argument_examples_brigadier_float_0_4__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_double_7__0.txt => parse__argument_examples_brigadier_float_0_5__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_long_17__0.txt => parse__argument_examples_brigadier_integer_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_long_18__0.txt => parse__argument_examples_brigadier_integer_0_1__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_long_19__0.txt => parse__argument_examples_brigadier_integer_0_2__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_float_8__0.txt => parse__argument_examples_brigadier_long_0_0__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_integer_15__0.txt => parse__argument_examples_brigadier_long_0_1__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_integer_16__0.txt => parse__argument_examples_brigadier_long_0_2__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_20__0.txt => parse__argument_examples_brigadier_string_0_0__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_21__0.txt => parse__argument_examples_brigadier_string_0_1__0.txt} (91%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_22__0.txt => parse__argument_examples_brigadier_string_1_0__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_23__0.txt => parse__argument_examples_brigadier_string_1_1__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_24__0.txt => parse__argument_examples_brigadier_string_1_2__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_25__0.txt => parse__argument_examples_brigadier_string_2_0__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_26__0.txt => parse__argument_examples_brigadier_string_2_1__0.txt} (91%) rename packages/mecha/tests/snapshots/{parse__argument_examples_brigadier_string_27__0.txt => parse__argument_examples_brigadier_string_2_2__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_angle_28__0.txt => parse__argument_examples_minecraft_angle_0_0__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_angle_29__0.txt => parse__argument_examples_minecraft_angle_0_1__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_angle_30__0.txt => parse__argument_examples_minecraft_angle_0_2__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_pos_31__0.txt => parse__argument_examples_minecraft_block_pos_0_0__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_pos_32__0.txt => parse__argument_examples_minecraft_block_pos_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_pos_33__0.txt => parse__argument_examples_minecraft_block_pos_0_2__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_pos_34__0.txt => parse__argument_examples_minecraft_block_pos_0_3__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_pos_35__0.txt => parse__argument_examples_minecraft_block_pos_0_4__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_predicate_36__0.txt => parse__argument_examples_minecraft_block_predicate_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_state_42__0.txt => parse__argument_examples_minecraft_block_predicate_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_state_43__0.txt => parse__argument_examples_minecraft_block_predicate_0_2__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_predicate_39__0.txt => parse__argument_examples_minecraft_block_predicate_0_3__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_predicate_40__0.txt => parse__argument_examples_minecraft_block_predicate_0_4__0.txt} (98%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_state_41__0.txt => parse__argument_examples_minecraft_block_state_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_predicate_37__0.txt => parse__argument_examples_minecraft_block_state_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_predicate_38__0.txt => parse__argument_examples_minecraft_block_state_0_2__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_block_state_44__0.txt => parse__argument_examples_minecraft_block_state_0_3__0.txt} (98%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_color_45__0.txt => parse__argument_examples_minecraft_color_0_0__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_color_46__0.txt => parse__argument_examples_minecraft_color_0_1__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_column_pos_47__0.txt => parse__argument_examples_minecraft_column_pos_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec2_148__0.txt => parse__argument_examples_minecraft_column_pos_0_1__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_column_pos_49__0.txt => parse__argument_examples_minecraft_column_pos_0_2__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_component_50__0.txt => parse__argument_examples_minecraft_component_0_0__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_component_51__0.txt => parse__argument_examples_minecraft_component_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_component_52__0.txt => parse__argument_examples_minecraft_component_0_2__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_component_53__0.txt => parse__argument_examples_minecraft_component_0_3__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_dimension_54__0.txt => parse__argument_examples_minecraft_dimension_0_0__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_dimension_55__0.txt => parse__argument_examples_minecraft_dimension_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_56__0.txt => parse__argument_examples_minecraft_entity_0_0__0.txt} (91%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_57__0.txt => parse__argument_examples_minecraft_entity_0_1__0.txt} (91%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_58__0.txt => parse__argument_examples_minecraft_entity_0_2__0.txt} (91%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_59__0.txt => parse__argument_examples_minecraft_entity_0_3__0.txt} (98%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_60__0.txt => parse__argument_examples_minecraft_entity_0_4__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_anchor_61__0.txt => parse__argument_examples_minecraft_entity_anchor_0_0__0.txt} (86%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_anchor_62__0.txt => parse__argument_examples_minecraft_entity_anchor_0_1__0.txt} (86%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_summon_63__0.txt => parse__argument_examples_minecraft_entity_summon_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_entity_summon_64__0.txt => parse__argument_examples_minecraft_entity_summon_0_1__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_float_range_65__0.txt => parse__argument_examples_minecraft_float_range_0_0__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_float_range_66__0.txt => parse__argument_examples_minecraft_float_range_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_float_range_67__0.txt => parse__argument_examples_minecraft_float_range_0_2__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_float_range_68__0.txt => parse__argument_examples_minecraft_float_range_0_3__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_float_range_69__0.txt => parse__argument_examples_minecraft_float_range_0_4__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_function_70__0.txt => parse__argument_examples_minecraft_function_0_0__0.txt} (94%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_function_71__0.txt => parse__argument_examples_minecraft_function_0_1__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_function_72__0.txt => parse__argument_examples_minecraft_function_0_2__0.txt} (94%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_game_profile_73__0.txt => parse__argument_examples_minecraft_game_profile_0_0__0.txt} (86%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_game_profile_74__0.txt => parse__argument_examples_minecraft_game_profile_0_1__0.txt} (86%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_game_profile_75__0.txt => parse__argument_examples_minecraft_game_profile_0_2__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_game_profile_76__0.txt => parse__argument_examples_minecraft_game_profile_0_3__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_int_range_77__0.txt => parse__argument_examples_minecraft_int_range_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_int_range_78__0.txt => parse__argument_examples_minecraft_int_range_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_int_range_79__0.txt => parse__argument_examples_minecraft_int_range_0_2__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_int_range_80__0.txt => parse__argument_examples_minecraft_int_range_0_3__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_int_range_81__0.txt => parse__argument_examples_minecraft_int_range_0_4__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_enchantment_82__0.txt => parse__argument_examples_minecraft_item_enchantment_0_0__0.txt} (85%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_enchantment_83__0.txt => parse__argument_examples_minecraft_item_enchantment_0_1__0.txt} (85%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_stack_91__0.txt => parse__argument_examples_minecraft_item_predicate_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_predicate_85__0.txt => parse__argument_examples_minecraft_item_predicate_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_predicate_86__0.txt => parse__argument_examples_minecraft_item_predicate_0_2__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_predicate_87__0.txt => parse__argument_examples_minecraft_item_predicate_0_3__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_slot_88__0.txt => parse__argument_examples_minecraft_item_slot_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_slot_89__0.txt => parse__argument_examples_minecraft_item_slot_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_slot_90__0.txt => parse__argument_examples_minecraft_item_slot_0_2__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_predicate_84__0.txt => parse__argument_examples_minecraft_item_stack_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_stack_92__0.txt => parse__argument_examples_minecraft_item_stack_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_item_stack_93__0.txt => parse__argument_examples_minecraft_item_stack_0_2__0.txt} (98%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_message_94__0.txt => parse__argument_examples_minecraft_message_0_0__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_message_95__0.txt => parse__argument_examples_minecraft_message_0_1__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_message_96__0.txt => parse__argument_examples_minecraft_message_0_2__0.txt} (94%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_message_97__0.txt => parse__argument_examples_minecraft_message_0_3__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_mob_effect_98__0.txt => parse__argument_examples_minecraft_mob_effect_0_0__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_mob_effect_99__0.txt => parse__argument_examples_minecraft_mob_effect_0_1__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt => parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt} (85%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt => parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_path_102__0.txt => parse__argument_examples_minecraft_nbt_path_0_0__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_path_103__0.txt => parse__argument_examples_minecraft_nbt_path_0_1__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_path_104__0.txt => parse__argument_examples_minecraft_nbt_path_0_2__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_path_105__0.txt => parse__argument_examples_minecraft_nbt_path_0_3__0.txt} (95%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_path_106__0.txt => parse__argument_examples_minecraft_nbt_path_0_4__0.txt} (93%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_path_107__0.txt => parse__argument_examples_minecraft_nbt_path_0_5__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_tag_108__0.txt => parse__argument_examples_minecraft_nbt_tag_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_tag_109__0.txt => parse__argument_examples_minecraft_nbt_tag_0_1__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_tag_110__0.txt => parse__argument_examples_minecraft_nbt_tag_0_2__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_tag_111__0.txt => parse__argument_examples_minecraft_nbt_tag_0_3__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_tag_112__0.txt => parse__argument_examples_minecraft_nbt_tag_0_4__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_nbt_tag_113__0.txt => parse__argument_examples_minecraft_nbt_tag_0_5__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_114__0.txt => parse__argument_examples_minecraft_objective_0_0__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_115__0.txt => parse__argument_examples_minecraft_objective_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_116__0.txt => parse__argument_examples_minecraft_objective_0_2__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_resource_location_126__0.txt => parse__argument_examples_minecraft_objective_criteria_0_0__0.txt} (92%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_criteria_118__0.txt => parse__argument_examples_minecraft_objective_criteria_0_1__0.txt} (92%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_criteria_119__0.txt => parse__argument_examples_minecraft_objective_criteria_0_2__0.txt} (94%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_operation_120__0.txt => parse__argument_examples_minecraft_operation_0_0__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_operation_121__0.txt => parse__argument_examples_minecraft_operation_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_operation_122__0.txt => parse__argument_examples_minecraft_operation_0_2__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_objective_criteria_117__0.txt => parse__argument_examples_minecraft_resource_location_0_0__0.txt} (92%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_resource_location_127__0.txt => parse__argument_examples_minecraft_resource_location_0_1__0.txt} (94%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_resource_location_128__0.txt => parse__argument_examples_minecraft_resource_location_0_2__0.txt} (92%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_rotation_129__0.txt => parse__argument_examples_minecraft_rotation_0_0__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_column_pos_48__0.txt => parse__argument_examples_minecraft_rotation_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_rotation_131__0.txt => parse__argument_examples_minecraft_rotation_0_2__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_score_holder_132__0.txt => parse__argument_examples_minecraft_score_holder_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_score_holder_133__0.txt => parse__argument_examples_minecraft_score_holder_0_1__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_score_holder_134__0.txt => parse__argument_examples_minecraft_score_holder_0_2__0.txt} (87%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_score_holder_135__0.txt => parse__argument_examples_minecraft_score_holder_0_3__0.txt} (89%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_scoreboard_slot_136__0.txt => parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt} (85%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_scoreboard_slot_137__0.txt => parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt} (85%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_swizzle_138__0.txt => parse__argument_examples_minecraft_swizzle_0_0__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_swizzle_139__0.txt => parse__argument_examples_minecraft_swizzle_0_1__0.txt} (88%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_team_140__0.txt => parse__argument_examples_minecraft_team_0_0__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_team_141__0.txt => parse__argument_examples_minecraft_team_0_1__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_time_142__0.txt => parse__argument_examples_minecraft_time_0_0__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_time_143__0.txt => parse__argument_examples_minecraft_time_0_1__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_time_144__0.txt => parse__argument_examples_minecraft_time_0_2__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_time_145__0.txt => parse__argument_examples_minecraft_time_0_3__0.txt} (90%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_uuid_146__0.txt => parse__argument_examples_minecraft_uuid_0_0__0.txt} (92%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec2_147__0.txt => parse__argument_examples_minecraft_vec2_0_0__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_rotation_130__0.txt => parse__argument_examples_minecraft_vec2_0_1__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec2_149__0.txt => parse__argument_examples_minecraft_vec2_0_2__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec2_150__0.txt => parse__argument_examples_minecraft_vec2_0_3__0.txt} (96%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec3_151__0.txt => parse__argument_examples_minecraft_vec3_0_0__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec3_152__0.txt => parse__argument_examples_minecraft_vec3_0_1__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec3_153__0.txt => parse__argument_examples_minecraft_vec3_0_2__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec3_154__0.txt => parse__argument_examples_minecraft_vec3_0_3__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec3_155__0.txt => parse__argument_examples_minecraft_vec3_0_4__0.txt} (97%) rename packages/mecha/tests/snapshots/{parse__argument_examples_minecraft_vec3_156__0.txt => parse__argument_examples_minecraft_vec3_0_5__0.txt} (97%) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt index de4157ee0..504001381 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt @@ -1,4 +1,4 @@ -brigadier:bool +brigadier:bool 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt index 4e36f450e..7e8171d0f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt @@ -1,4 +1,4 @@ -brigadier:bool +brigadier:bool 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt index c938249b2..edfbf5238 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt @@ -1,4 +1,4 @@ -brigadier:double +brigadier:double 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt index b1beeb8eb..3099cc702 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt @@ -1,4 +1,4 @@ -brigadier:double +brigadier:double 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt index 2439c1488..6096fe9ea 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt @@ -1,4 +1,4 @@ -brigadier:float +brigadier:double 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt index 114f79dd5..89bd9f57c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt @@ -1,4 +1,4 @@ -brigadier:float +brigadier:double 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt index a753c5d3c..5804cc3c8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt @@ -1,4 +1,4 @@ -brigadier:float +brigadier:double 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt index ac2bf12f2..e899c3b83 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt @@ -1,4 +1,4 @@ -brigadier:float +brigadier:double 0 5 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt index 8304697a1..b44008b14 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt @@ -1,4 +1,4 @@ -brigadier:integer +brigadier:float 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt index 9a0b6e86d..a61a3e798 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt @@ -1,4 +1,4 @@ -brigadier:float +brigadier:float 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt index 2b12f80cc..4a8836138 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt @@ -1,4 +1,4 @@ -brigadier:double +brigadier:float 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt index 18ca6dff6..11d27d1a4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt @@ -1,4 +1,4 @@ -brigadier:double +brigadier:float 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt index 652dcd77d..6638613fd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt @@ -1,4 +1,4 @@ -brigadier:double +brigadier:float 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt index 834e82d3a..94470b409 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt @@ -1,4 +1,4 @@ -brigadier:double +brigadier:float 0 5 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt index 5fa276314..bfd1a4c85 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_17__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt @@ -1,4 +1,4 @@ -brigadier:long +brigadier:integer 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt index 1692ede33..539f3e75f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_18__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt @@ -1,4 +1,4 @@ -brigadier:long +brigadier:integer 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt index 6e82a9e1a..0c9e38a24 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_19__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt @@ -1,4 +1,4 @@ -brigadier:long +brigadier:integer 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt index b4e9c67f3..3a9ac2ff7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt @@ -1,4 +1,4 @@ -brigadier:float +brigadier:long 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt index 5ecf0a721..4112b623e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt @@ -1,4 +1,4 @@ -brigadier:integer +brigadier:long 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt index ddc38ee4b..4aa32385c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt @@ -1,4 +1,4 @@ -brigadier:integer +brigadier:long 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt index a5345374b..41a324887 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_20__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 0 0 --- {'type': 'word'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt similarity index 91% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt index a12df5179..d3bdec069 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_21__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 0 1 --- {'type': 'word'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt index 2cd617b6b..705c3b809 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_22__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 1 0 --- {'type': 'phrase'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt index a1c224cc8..3fbfda573 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_23__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 1 1 --- {'type': 'phrase'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt index b0c5b7ed6..202073b56 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_24__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 1 2 --- {'type': 'phrase'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt index 07607de4a..52e18e79b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_25__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 2 0 --- {'type': 'greedy'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt similarity index 91% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt index 8fb722c21..9956fb675 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_26__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 2 1 --- {'type': 'greedy'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt index 0efd16b50..46466ce7c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_27__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt @@ -1,4 +1,4 @@ -brigadier:string +brigadier:string 2 2 --- {'type': 'greedy'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt index 174640d62..f760f51fc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_28__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:angle +minecraft:angle 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt index 36be58767..33c3a88b4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_29__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:angle +minecraft:angle 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt index 5984afaee..66b350738 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_30__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:angle +minecraft:angle 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt index f0210e6fc..142ace70c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_31__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:block_pos +minecraft:block_pos 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt index 757cf88da..924bd5af4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_32__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:block_pos +minecraft:block_pos 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt index 4572e538b..dd7367a59 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_33__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:block_pos +minecraft:block_pos 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt index ea7e82efa..60db5a128 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_34__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:block_pos +minecraft:block_pos 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt index dcb173b7d..c38dfa4a0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_35__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:block_pos +minecraft:block_pos 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt index aebe88fc4..446661dfc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_36__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:block_predicate +minecraft:block_predicate 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt index 57011615d..f2299d2f7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_42__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:block_state +minecraft:block_predicate 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt index 021389745..bd4568891 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_43__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:block_state +minecraft:block_predicate 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt index 5ca01d24c..c493ba005 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_39__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:block_predicate +minecraft:block_predicate 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt similarity index 98% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt index ed45cfef7..56cfe8b0b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_40__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:block_predicate +minecraft:block_predicate 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt index 17cdb5f30..d04868934 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_41__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:block_state +minecraft:block_state 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt index a70530b1b..b1abbaeb1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_37__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:block_predicate +minecraft:block_state 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt index b35a7661f..c99c4d1fe 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_38__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:block_predicate +minecraft:block_state 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt similarity index 98% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt index 64e404b06..76d7f4b78 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_44__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:block_state +minecraft:block_state 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt index 811ab39a7..3b88acc03 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_45__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:color +minecraft:color 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt index d021abbe3..596c7d485 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_46__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:color +minecraft:color 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt index 25c33e2e4..f3a4f96f1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_47__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:column_pos +minecraft:column_pos 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt index 3ae6db17f..a34d80b38 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_148__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:vec2 +minecraft:column_pos 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt index 65e1fcd19..e80ac9e17 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_49__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:column_pos +minecraft:column_pos 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt index b7b367b9d..974ca0a79 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_50__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:component +minecraft:component 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt index 5f4274ccf..e759af5e2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_51__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:component +minecraft:component 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt index 7bd4c6729..0ae0f5100 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_52__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:component +minecraft:component 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt index 6642c03f7..13c7de5fd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_53__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:component +minecraft:component 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt index b7d7809f4..7284d3277 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_54__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:dimension +minecraft:dimension 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt index 1335f9969..7bdc7cd68 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_55__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:dimension +minecraft:dimension 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt similarity index 91% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt index f5c76d3f3..8ed773f20 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_56__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:entity +minecraft:entity 0 0 --- {'type': 'entities', 'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt similarity index 91% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt index b6dff8a04..effe52b94 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_57__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:entity +minecraft:entity 0 1 --- {'type': 'entities', 'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt similarity index 91% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt index f2b201a93..c48ac9a89 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_58__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:entity +minecraft:entity 0 2 --- {'type': 'entities', 'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt similarity index 98% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt index a9375a09f..dabb888ed 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_59__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:entity +minecraft:entity 0 3 --- {'type': 'entities', 'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt index dce222742..f6cabfa41 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_60__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:entity +minecraft:entity 0 4 --- {'type': 'entities', 'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt similarity index 86% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt index dd473b7a4..2e8d695a3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_61__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:entity_anchor +minecraft:entity_anchor 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt similarity index 86% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt index c12931637..8d0a919c6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_62__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:entity_anchor +minecraft:entity_anchor 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt index 0bc2e86df..135aadd63 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_63__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:entity_summon +minecraft:entity_summon 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt index 3c4fbe5df..f7b6703b6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_64__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:entity_summon +minecraft:entity_summon 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt index 370ec43da..e7e4813be 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_65__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:float_range +minecraft:float_range 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt index 624fb14d2..f38f98a8b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_66__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:float_range +minecraft:float_range 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt index a1a7dd28b..ae95c5e6d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_67__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:float_range +minecraft:float_range 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt index 563b2944d..69183443f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_68__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:float_range +minecraft:float_range 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt index 5f80127df..80cda5990 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_69__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:float_range +minecraft:float_range 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt similarity index 94% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt index 3397ca6a2..8ba7b1718 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_70__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:function +minecraft:function 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt index 719baf24c..80901df38 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_71__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:function +minecraft:function 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt similarity index 94% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt index 778bd9e89..6576bb50a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_72__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:function +minecraft:function 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt similarity index 86% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt index 7d33a94f7..75af6821f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_73__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:game_profile +minecraft:game_profile 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt similarity index 86% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt index e7ed93ea5..a8bc31474 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_74__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:game_profile +minecraft:game_profile 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt index a9f5bcea5..4665ef53e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_75__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:game_profile +minecraft:game_profile 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt index af7af8e94..03625ec6c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_76__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:game_profile +minecraft:game_profile 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt index 3198e93aa..a874d6e3d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_77__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:int_range +minecraft:int_range 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt index 7ce0b4fba..becbc66fe 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_78__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:int_range +minecraft:int_range 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt index fac1d5ea0..45c66bd13 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_79__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:int_range +minecraft:int_range 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt index 3f6964a33..abd6bddab 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_80__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:int_range +minecraft:int_range 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt index adf5b358c..967bac195 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_81__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:int_range +minecraft:int_range 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt similarity index 85% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt index 947e49081..1c8cc07b9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_82__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:item_enchantment +minecraft:item_enchantment 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt similarity index 85% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt index f3e746c25..71dd298b7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_83__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:item_enchantment +minecraft:item_enchantment 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt index e36a6e8ab..52fd09924 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_91__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:item_stack +minecraft:item_predicate 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt index 1bdacf2d9..a5b1046a5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_85__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:item_predicate +minecraft:item_predicate 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt index bd8c01fbc..0ca7abb38 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_86__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:item_predicate +minecraft:item_predicate 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt index e58fb2758..584fba9ff 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_87__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:item_predicate +minecraft:item_predicate 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt index d7ac0d9da..d4b019640 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_88__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:item_slot +minecraft:item_slot 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt index 5e7bb04ab..7185d705a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_89__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:item_slot +minecraft:item_slot 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt index 3f0a12b15..0e05ead2f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_90__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:item_slot +minecraft:item_slot 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt index f8237b328..102553cf2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_84__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:item_predicate +minecraft:item_stack 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt index 0a3daf7c3..910c3ca42 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_92__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:item_stack +minecraft:item_stack 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt similarity index 98% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt index ca9cad38f..85c306c31 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_93__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:item_stack +minecraft:item_stack 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt index fa15e7782..9d586da54 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_94__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:message +minecraft:message 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt index 58175bded..af6d7bb12 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_95__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:message +minecraft:message 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt similarity index 94% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt index 7f2bb34f2..346e3f0f2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_96__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:message +minecraft:message 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt index b7e8b1119..c11d5a3fb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_97__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:message +minecraft:message 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt index 9fb829add..addbb23f4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_98__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:mob_effect +minecraft:mob_effect 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt index 464530d4c..49fb2bf47 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_99__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:mob_effect +minecraft:mob_effect 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt similarity index 85% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt index 2fd4f3bbf..1d23b46f0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_100__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_compound_tag +minecraft:nbt_compound_tag 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt index 51af89d2c..78c91be8e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_101__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_compound_tag +minecraft:nbt_compound_tag 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt index 1d54edc5a..f35d00db8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_102__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_path +minecraft:nbt_path 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt index 643de7b6b..78e7d191f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_103__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_path +minecraft:nbt_path 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt index dfebd282f..0a2e45fcc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_104__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_path +minecraft:nbt_path 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt similarity index 95% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt index 802378b60..87644b97b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_105__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_path +minecraft:nbt_path 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt similarity index 93% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt index 6cd28ef9c..a6a3b2790 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_106__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_path +minecraft:nbt_path 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt index 5d2cca362..cf7fde771 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_107__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_path +minecraft:nbt_path 0 5 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_108__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_108__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt index cad85f4d0..8fb0f21b7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_108__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_tag +minecraft:nbt_tag 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt index 65439dc3a..7ecb8aa8d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_109__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_tag +minecraft:nbt_tag 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt index 3a4ce815e..c72b516ee 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_110__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_tag +minecraft:nbt_tag 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt index 772589570..275874a42 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_111__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_tag +minecraft:nbt_tag 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt index 5bad61fc1..cd1d5422a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_112__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_tag +minecraft:nbt_tag 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt index 58b3f3cae..38642fc42 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_113__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt @@ -1,4 +1,4 @@ -minecraft:nbt_tag +minecraft:nbt_tag 0 5 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_114__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_114__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt index 2366758d6..addd2c0e2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_114__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:objective +minecraft:objective 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt index 052f6760d..1c417f063 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_115__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:objective +minecraft:objective 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt index 4a5a21e48..06cc8ce29 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_116__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:objective +minecraft:objective 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_126__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt similarity index 92% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_126__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt index 2c7ca4c10..53c7fb639 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_126__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:resource_location +minecraft:objective_criteria 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt similarity index 92% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt index 5db54766e..73147dcb5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_118__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:objective_criteria +minecraft:objective_criteria 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt similarity index 94% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt index ff9baf8a2..0b8d85594 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_119__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:objective_criteria +minecraft:objective_criteria 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_120__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_120__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt index 309cebe6d..ddfcc0d32 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_120__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:operation +minecraft:operation 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt index 798974534..08882f03d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_121__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:operation +minecraft:operation 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt index 94c8fedaa..874b93892 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_122__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:operation +minecraft:operation 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt similarity index 92% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt index 03e65bd42..f65429b4b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_117__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:objective_criteria +minecraft:resource_location 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt similarity index 94% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt index a13068ace..27dc52319 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_127__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:resource_location +minecraft:resource_location 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt similarity index 92% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt index 2eb357f56..791a304d5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_128__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:resource_location +minecraft:resource_location 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt index 2d09816f8..e069927a9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_129__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:rotation +minecraft:rotation 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt index eec83253b..1d4d90bf5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_48__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:column_pos +minecraft:rotation 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt index 0e57f1ebd..3efd7e3e5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_131__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:rotation +minecraft:rotation 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt index 5899d2301..495a8647f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_132__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:score_holder +minecraft:score_holder 0 0 --- {'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt index b8427d12b..0853058ce 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_133__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:score_holder +minecraft:score_holder 0 1 --- {'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt similarity index 87% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt index d760a5703..00caee89a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_134__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:score_holder +minecraft:score_holder 0 2 --- {'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt similarity index 89% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt index e834f7af5..e7a6929dc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_135__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:score_holder +minecraft:score_holder 0 3 --- {'amount': 'multiple'} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_136__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt similarity index 85% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_136__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt index b30ac9be5..812b6098a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_136__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:scoreboard_slot +minecraft:scoreboard_slot 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt similarity index 85% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt index 2a35d5f8a..202106a62 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_137__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:scoreboard_slot +minecraft:scoreboard_slot 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt index 41f8b1555..27499cdef 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_138__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:swizzle +minecraft:swizzle 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt similarity index 88% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt index 7addae79d..3b1ec957b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_139__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:swizzle +minecraft:swizzle 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_140__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_140__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt index 560697b32..9c0d5a2d9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_140__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:team +minecraft:team 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt index 55deaedfa..7417f7314 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_141__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:team +minecraft:team 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_142__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_142__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt index af8786b05..a469ba840 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_142__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:time +minecraft:time 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt index edd602a8e..403eac258 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_143__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:time +minecraft:time 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt index 0dc75219f..b50b1e453 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_144__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:time +minecraft:time 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt similarity index 90% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt index 675b34a7d..4f2ea80c8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_145__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:time +minecraft:time 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_146__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt similarity index 92% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_146__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt index 9f1e7470b..59fa39bd6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_146__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:uuid +minecraft:uuid 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt index 2f8eeb2ff..0ef2a5f38 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_147__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:vec2 +minecraft:vec2 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt index b461d5dd1..867d0d89c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_130__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:rotation +minecraft:vec2 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt index 8c37560e0..5b93c929b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_149__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:vec2 +minecraft:vec2 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt similarity index 96% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt index d50e97e0b..133636499 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_150__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:vec2 +minecraft:vec2 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt index c14489f61..0e89575a0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_151__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt @@ -1,4 +1,4 @@ -minecraft:vec3 +minecraft:vec3 0 0 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt index 5676ea00e..a71bf4d92 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_152__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt @@ -1,4 +1,4 @@ -minecraft:vec3 +minecraft:vec3 0 1 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt index 0a7aca5a4..31ec33af1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_153__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt @@ -1,4 +1,4 @@ -minecraft:vec3 +minecraft:vec3 0 2 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt index fa295a8ee..8dbd5686a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_154__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt @@ -1,4 +1,4 @@ -minecraft:vec3 +minecraft:vec3 0 3 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt index 9a53dfb35..b44b538bd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_155__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt @@ -1,4 +1,4 @@ -minecraft:vec3 +minecraft:vec3 0 4 --- {} --- diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt similarity index 97% rename from packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt rename to packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt index d6348e7c3..cc032119e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_156__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt @@ -1,4 +1,4 @@ -minecraft:vec3 +minecraft:vec3 0 5 --- {} --- diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 5ab14dd76..4fe504bb2 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -2,6 +2,7 @@ from beet import Function from beet.core.utils import JsonDict from pytest_insta import SnapshotFixture +from tokenstream import InvalidSyntax from mecha import Mecha, delegate, get_argument_examples, get_command_examples @@ -25,33 +26,52 @@ def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): @pytest.mark.parametrize( - "argument_parser, properties, value", + "test_name, properties, is_error, value", params := [ - (argument_parser, suite.get("properties", {}), value) + ( + f"{argument_parser} {i} {j}", + suite.get("properties", {}), + suite.get("is_error", False), + value, + ) for argument_parser, suites in get_argument_examples().items() - for suite in suites - for value in suite["examples"] + for i, suite in enumerate(suites) + for j, value in enumerate(suite["examples"]) ], - ids=[f"{argument_parser}_{i}" for i, (argument_parser, _, _) in enumerate(params)], + ids=[args[0] for args in params], ) def test_argument_examples( snapshot: SnapshotFixture, mc: Mecha, - argument_parser: str, + test_name: str, properties: JsonDict, + is_error: bool, value: str, ): - if f"command:argument:{argument_parser}" not in mc.spec.parsers: + argument_parser = f"command:argument:{test_name.partition(' ')[0]}" + if argument_parser not in mc.spec.parsers: pytest.skip() stream = mc.create_token_stream(value) with stream.syntax(literal=r"\S+"), stream.provide(properties=properties): - assert snapshot() == "\n---\n".join( - [ - argument_parser, - str(properties), - value, - delegate(f"command:argument:{argument_parser}", stream).dump(), - ] - ) + if is_error: + with pytest.raises(InvalidSyntax) as exc_info: + delegate(argument_parser, stream) + assert snapshot() == "\n---\n".join( + [ + test_name, + str(properties), + value, + str(exc_info.value), + ] + ) + else: + assert snapshot() == "\n---\n".join( + [ + test_name, + str(properties), + value, + delegate(argument_parser, stream).dump(), + ] + ) From 41591a98c9facb5db0b44c4abf5975d5a9f2241c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 03:23:38 +0200 Subject: [PATCH 0292/1554] refactor: improve code by omitting fields with default values --- packages/mecha/mecha/parse.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index f0a5ec595..f8efb7725 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1310,13 +1310,10 @@ def __call__(self, stream: TokenStream) -> Any: and argument.value in [ AstResourceLocation( - is_tag=False, namespace=AstValue[str](value="minecraft"), path=AstValue[str](value="player"), ), AstResourceLocation( - is_tag=False, - namespace=None, path=AstValue[str](value="player"), ), ] From c7519525c03de2d824b7b5d32cfbd31e4ca152d2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 04:13:30 +0200 Subject: [PATCH 0293/1554] fix: tweak selector constraints and add more tests --- packages/mecha/mecha/parse.py | 13 +- .../mecha/resources/argument_examples.json | 181 +++++++++++++++++- ...rgument_examples_brigadier_bool_1_0__0.txt | 10 + ...rgument_examples_brigadier_bool_1_1__0.txt | 10 + ...ument_examples_brigadier_double_1_0__0.txt | 10 + ...ument_examples_brigadier_double_1_1__0.txt | 10 + ...ument_examples_brigadier_double_1_2__0.txt | 10 + ...ument_examples_brigadier_double_1_3__0.txt | 10 + ...gument_examples_brigadier_float_1_0__0.txt | 10 + ...gument_examples_brigadier_float_1_1__0.txt | 10 + ...gument_examples_brigadier_float_1_2__0.txt | 10 + ...gument_examples_brigadier_float_1_3__0.txt | 10 + ...ment_examples_brigadier_integer_1_0__0.txt | 10 + ...ment_examples_brigadier_integer_1_1__0.txt | 10 + ...ment_examples_brigadier_integer_1_2__0.txt | 10 + ...ment_examples_brigadier_integer_1_3__0.txt | 10 + ...ment_examples_brigadier_integer_1_4__0.txt | 10 + ...rgument_examples_brigadier_long_1_0__0.txt | 10 + ...rgument_examples_brigadier_long_1_1__0.txt | 10 + ...rgument_examples_brigadier_long_1_2__0.txt | 10 + ...rgument_examples_brigadier_long_1_3__0.txt | 10 + ...gument_examples_minecraft_angle_1_0__0.txt | 10 + ...gument_examples_minecraft_angle_1_1__0.txt | 10 + ...nt_examples_minecraft_block_pos_1_0__0.txt | 10 + ...nt_examples_minecraft_block_pos_1_1__0.txt | 10 + ...nt_examples_minecraft_block_pos_1_2__0.txt | 10 + ...nt_examples_minecraft_block_pos_1_3__0.txt | 10 + ...mples_minecraft_block_predicate_1_0__0.txt | 10 + ...mples_minecraft_block_predicate_1_1__0.txt | 10 + ...mples_minecraft_block_predicate_1_2__0.txt | 10 + ...mples_minecraft_block_predicate_1_3__0.txt | 10 + ...mples_minecraft_block_predicate_1_4__0.txt | 10 + ...mples_minecraft_block_predicate_1_5__0.txt | 10 + ..._examples_minecraft_block_state_1_0__0.txt | 10 + ..._examples_minecraft_block_state_1_1__0.txt | 10 + ..._examples_minecraft_block_state_1_2__0.txt | 10 + ..._examples_minecraft_block_state_1_3__0.txt | 10 + ..._examples_minecraft_block_state_1_4__0.txt | 10 + ..._examples_minecraft_block_state_1_5__0.txt | 10 + ..._examples_minecraft_block_state_1_6__0.txt | 10 + ...gument_examples_minecraft_color_1_0__0.txt | 10 + ...t_examples_minecraft_column_pos_1_0__0.txt | 10 + ...t_examples_minecraft_column_pos_1_1__0.txt | 10 + ...t_examples_minecraft_column_pos_1_2__0.txt | 10 + ...nt_examples_minecraft_component_1_0__0.txt | 10 + ...nt_examples_minecraft_component_1_1__0.txt | 10 + ...nt_examples_minecraft_dimension_1_0__0.txt | 10 + ...ument_examples_minecraft_entity_1_0__0.txt | 26 +++ ...ument_examples_minecraft_entity_1_1__0.txt | 31 +++ ...ument_examples_minecraft_entity_2_0__0.txt | 10 + ...ument_examples_minecraft_entity_2_1__0.txt | 10 + ...ument_examples_minecraft_entity_3_0__0.txt | 25 +++ ...ument_examples_minecraft_entity_3_1__0.txt | 31 +++ ...ument_examples_minecraft_entity_4_0__0.txt | 10 + ...ument_examples_minecraft_entity_4_1__0.txt | 10 + ...xamples_minecraft_entity_summon_1_0__0.txt | 10 + ...xamples_minecraft_entity_summon_1_1__0.txt | 10 + ..._examples_minecraft_float_range_1_0__0.txt | 10 + ..._examples_minecraft_float_range_1_1__0.txt | 10 + ...examples_minecraft_game_profile_0_4__0.txt | 35 ++++ ...examples_minecraft_game_profile_1_0__0.txt | 10 + ...examples_minecraft_game_profile_1_1__0.txt | 10 + ...examples_minecraft_game_profile_1_2__0.txt | 10 + ...nt_examples_minecraft_int_range_1_0__0.txt | 10 + ...nt_examples_minecraft_int_range_1_1__0.txt | 10 + ...nt_examples_minecraft_int_range_1_2__0.txt | 10 + ...nt_examples_minecraft_int_range_1_3__0.txt | 10 + ...nt_examples_minecraft_int_range_1_4__0.txt | 10 + ...t_examples_minecraft_item_stack_1_0__0.txt | 10 + ...ment_examples_minecraft_message_0_4__0.txt | 47 +++++ ...ment_examples_minecraft_message_1_0__0.txt | 10 + ...ples_minecraft_nbt_compound_tag_1_0__0.txt | 10 + ...nt_examples_minecraft_nbt_path_0_10__0.txt | 30 +++ ...nt_examples_minecraft_nbt_path_0_11__0.txt | 34 ++++ ...nt_examples_minecraft_nbt_path_0_12__0.txt | 22 +++ ...nt_examples_minecraft_nbt_path_0_13__0.txt | 26 +++ ...nt_examples_minecraft_nbt_path_0_14__0.txt | 39 ++++ ...nt_examples_minecraft_nbt_path_0_15__0.txt | 31 +++ ...nt_examples_minecraft_nbt_path_0_16__0.txt | 35 ++++ ...ent_examples_minecraft_nbt_path_0_6__0.txt | 15 ++ ...ent_examples_minecraft_nbt_path_0_7__0.txt | 27 +++ ...ent_examples_minecraft_nbt_path_0_8__0.txt | 23 +++ ...ent_examples_minecraft_nbt_path_0_9__0.txt | 26 +++ ...ent_examples_minecraft_nbt_path_1_0__0.txt | 10 + ...nt_examples_minecraft_operation_1_0__0.txt | 10 + ...les_minecraft_resource_location_1_0__0.txt | 10 + ...ent_examples_minecraft_rotation_1_0__0.txt | 10 + ...examples_minecraft_score_holder_1_0__0.txt | 12 ++ ...examples_minecraft_score_holder_1_1__0.txt | 12 ++ ...examples_minecraft_score_holder_1_2__0.txt | 53 +++++ ...examples_minecraft_score_holder_2_0__0.txt | 10 + ...examples_minecraft_score_holder_2_1__0.txt | 10 + ...examples_minecraft_score_holder_2_2__0.txt | 10 + ...ment_examples_minecraft_swizzle_1_0__0.txt | 10 + ...ment_examples_minecraft_swizzle_1_1__0.txt | 10 + ...ment_examples_minecraft_swizzle_1_2__0.txt | 10 + ...ment_examples_minecraft_swizzle_1_3__0.txt | 10 + packages/mecha/tests/test_parse.py | 10 +- 98 files changed, 1517 insertions(+), 17 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index f8efb7725..e72a5bcc6 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1304,11 +1304,8 @@ def __call__(self, stream: TokenStream) -> Any: for argument in node.arguments: if argument.key.value in ["gamemode", "level"]: is_player = True - if ( - argument.key.value == "type" - and not argument.inverted - and argument.value - in [ + if argument.key.value == "type": + is_player = not argument.inverted and argument.value in [ AstResourceLocation( namespace=AstValue[str](value="minecraft"), path=AstValue[str](value="player"), @@ -1317,8 +1314,6 @@ def __call__(self, stream: TokenStream) -> Any: path=AstValue[str](value="player"), ), ] - ): - is_player = True if not is_player: exc = InvalidSyntax("Expected player-type entity selector.") @@ -1358,8 +1353,8 @@ def __call__(self, stream: TokenStream) -> Any: is_single = node.variable in "prs" for arg in node.arguments: - if arg.key.value == "limit" and arg.value == AstValue[int](value=1): - is_single = True + if arg.key.value == "limit": + is_single = arg.value == AstValue[int](value=1) if not is_single: exc = InvalidSyntax("Expected entity selector targeting a single entity.") diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 8bd9658f3..100252afa 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -2,26 +2,50 @@ "brigadier:bool": [ { "examples": ["true", "false"] + }, + { + "invalid": true, + "examples": ["blob", "thing"] } ], "brigadier:double": [ { "examples": ["0", "1.2", ".5", "-1", "-.5", "-1234.56"] + }, + { + "invalid": true, + "properties": { "min": 7, "max": 15 }, + "examples": ["ayy", "-3", "0.5", "100"] } ], "brigadier:float": [ { "examples": ["0", "1.2", ".5", "-1", "-.5", "-1234.56"] + }, + { + "invalid": true, + "properties": { "min": 7, "max": 15 }, + "examples": ["foo", "-3", "0.5", "100"] } ], "brigadier:integer": [ { "examples": ["0", "123", "-123"] + }, + { + "invalid": true, + "properties": { "min": 7, "max": 15 }, + "examples": ["yolo", "-3", "0.5", "100", "11.1"] } ], "brigadier:long": [ { "examples": ["0", "123", "-123"] + }, + { + "invalid": true, + "properties": { "min": 7, "max": 15 }, + "examples": ["-3", "0.5", "100", "11.1"] } ], "brigadier:string": [ @@ -41,11 +65,19 @@ "minecraft:angle": [ { "examples": ["0", "~", "~-0.5"] + }, + { + "invalid": true, + "examples": ["^-3", "wat"] } ], "minecraft:block_pos": [ { "examples": ["0 0 0", "~ ~ ~", "^ ^ ^", "^1 ^ ^-5", "~0.5 ~1 ~-5"] + }, + { + "invalid": true, + "examples": ["^-3", "wat", "17", "{}"] } ], "minecraft:block_predicate": [ @@ -57,21 +89,52 @@ "#stone", "#stone[foo=bar]{baz:nbt}" ] + }, + { + "invalid": true, + "examples": [ + "{}", + "#stone[foo=bar,", + "#stone[", + "#stone[foo", + "#stone[thing=hello]{", + "#stone[thing=hello]{what:is:that}" + ] } ], "minecraft:block_state": [ { "examples": ["stone", "minecraft:stone", "stone[foo=bar]", "foo{bar:baz}"] + }, + { + "invalid": true, + "examples": [ + "{}", + "#stone[foo=bar,", + "stone[foo=bar,", + "stone[", + "stone[foo", + "stone[thing=hello]{", + "stone[thing=hello]{what:is:that}" + ] } ], "minecraft:color": [ { "examples": ["red", "green"] + }, + { + "invalid": true, + "examples": ["creeper"] } ], "minecraft:column_pos": [ { "examples": ["0 0", "~ ~", "~1 ~-2"] + }, + { + "invalid": true, + "examples": ["7", "^7", "@"] } ], "minecraft:component": [ @@ -82,11 +145,19 @@ "{\"text\":\"hello world\"}", "[\"\"]" ] + }, + { + "invalid": true, + "examples": ["wat", "{\"hey\": ]}"] } ], "minecraft:dimension": [ { "examples": ["minecraft:overworld", "minecraft:the_nether"] + }, + { + "invalid": true, + "examples": ["#minecraft:overworld"] } ], "minecraft:entity": [ @@ -99,6 +170,24 @@ "@e[type=foo]", "dd12be42-52a9-4a91-a8a1-11c01849e498" ] + }, + { + "properties": { "type": "players", "amount": "multiple" }, + "examples": ["@e[level=10..]", "@e[type=player]"] + }, + { + "invalid": true, + "properties": { "type": "players", "amount": "multiple" }, + "examples": ["@e", "@e[type=foo]"] + }, + { + "properties": { "type": "entities", "amount": "single" }, + "examples": ["@e[limit=1]", "@s[type=player]"] + }, + { + "invalid": true, + "properties": { "type": "entities", "amount": "single" }, + "examples": ["@r[limit=7]", "@a[tag=!foo]"] } ], "minecraft:entity_anchor": [ @@ -109,11 +198,19 @@ "minecraft:entity_summon": [ { "examples": ["minecraft:pig", "cow"] + }, + { + "invalid": true, + "examples": ["#minecraft:pig", "#cow"] } ], "minecraft:float_range": [ { "examples": ["0..5.2", "0", "-5.4", "-100.76..", "..100"] + }, + { + "invalid": true, + "examples": ["..", "wat"] } ], "minecraft:function": [ @@ -127,13 +224,22 @@ "Player", "0123", "dd12be42-52a9-4a91-a8a1-11c01849e498", - "@p" + "@p", + "@e[type=minecraft:player]" ] + }, + { + "invalid": true, + "examples": ["@e", "@s[type=cow]", "@e[type=!player]"] } ], "minecraft:int_range": [ { "examples": ["0..5", "0", "-5", "-100..", "..100"] + }, + { + "invalid": true, + "examples": ["0..5.2", "0.7", "-5.4", "-100.76..", "..100.4"] } ], "minecraft:item_enchantment": [ @@ -154,11 +260,25 @@ "minecraft:item_stack": [ { "examples": ["stick", "minecraft:stick", "stick{foo:bar}"] + }, + { + "invalid": true, + "examples": ["#minecraft:stone"] } ], "minecraft:message": [ { - "examples": ["Hello world!", "foo", "@e", "Hello @p :)"] + "examples": [ + "Hello world!", + "foo", + "@e", + "Hello @p :)", + "foo @a[tag=a, tag=b]" + ] + }, + { + "invalid": true, + "examples": ["Hello @p[team=winner :)"] } ], "minecraft:mob_effect": [ @@ -169,11 +289,37 @@ "minecraft:nbt_compound_tag": [ { "examples": ["{}", "{foo:bar}"] + }, + { + "invalid": true, + "examples": ["[{foo:bar}]"] } ], "minecraft:nbt_path": [ { - "examples": ["foo", "foo.bar", "foo[0]", "[0]", "[]", "{foo:bar}"] + "examples": [ + "foo", + "foo.bar", + "foo[0]", + "[0]", + "[]", + "{foo:bar}", + "{}", + "{foo:4.0f}", + "foo{}.bar", + "foo.bar[-1]", + "foo.bar[0].\"A [crazy name]!\"", + "foo.bar[0].\"A [crazy name]!\".baz", + "foo.bar[]", + "foo.bar[].baz", + "foo.bar[{baz:5b}]", + "foo{bar:\"baz\"}", + "foo{bar:\"baz\"}.bar" + ] + }, + { + "invalid": true, + "examples": ["{foo:bar foo:bar}"] } ], "minecraft:nbt_tag": [ @@ -194,6 +340,10 @@ "minecraft:operation": [ { "examples": ["=", ">", "<"] + }, + { + "invalid": true, + "examples": ["wat"] } ], "minecraft:particle": [ @@ -204,17 +354,38 @@ "minecraft:resource_location": [ { "examples": ["foo", "foo:bar", "012"] + }, + { + "invalid": true, + "examples": ["#thing"] } ], "minecraft:rotation": [ { "examples": ["0 0", "~ ~", "~-5 ~5"] + }, + { + "invalid": true, + "examples": ["-5 ^5"] } ], "minecraft:score_holder": [ { "properties": { "amount": "multiple" }, "examples": ["Player", "0123", "*", "@e"] + }, + { + "properties": { "amount": "single" }, + "examples": ["@s", "@p", "@e[tag=foo, limit=1, sort=nearest]"] + }, + { + "invalid": true, + "properties": { "amount": "single" }, + "examples": [ + "@a", + "@e[type=minecraft:marker, sort=wat, limit=1]", + "@e[tag=foo, sort=nearest]" + ] } ], "minecraft:scoreboard_slot": [ @@ -225,6 +396,10 @@ "minecraft:swizzle": [ { "examples": ["xyz", "x"] + }, + { + "invalid": true, + "examples": ["sup", "wat", "xx", "yzy"] } ], "minecraft:team": [ diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt new file mode 100644 index 000000000..da2443e84 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt @@ -0,0 +1,10 @@ +brigadier:bool 1 0 +--- +{} +--- +blob +--- +UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'blob' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt new file mode 100644 index 000000000..014618954 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt @@ -0,0 +1,10 @@ +brigadier:bool 1 1 +--- +{} +--- +thing +--- +UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'thing' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt new file mode 100644 index 000000000..4e13ae832 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt @@ -0,0 +1,10 @@ +brigadier:double 1 0 +--- +{'min': 7, 'max': 15} +--- +ayy +--- +UnexpectedToken: Expected number but got literal 'ayy' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt new file mode 100644 index 000000000..a26c97299 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt @@ -0,0 +1,10 @@ +brigadier:double 1 1 +--- +{'min': 7, 'max': 15} +--- +-3 +--- +InvalidSyntax: Expected value to be at least 7. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt new file mode 100644 index 000000000..001e6f29c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt @@ -0,0 +1,10 @@ +brigadier:double 1 2 +--- +{'min': 7, 'max': 15} +--- +0.5 +--- +InvalidSyntax: Expected value to be at least 7. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt new file mode 100644 index 000000000..b19daeb9d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt @@ -0,0 +1,10 @@ +brigadier:double 1 3 +--- +{'min': 7, 'max': 15} +--- +100 +--- +InvalidSyntax: Expected value to be at most 15. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt new file mode 100644 index 000000000..b1b355b8b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt @@ -0,0 +1,10 @@ +brigadier:float 1 0 +--- +{'min': 7, 'max': 15} +--- +foo +--- +UnexpectedToken: Expected number but got literal 'foo' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt new file mode 100644 index 000000000..82569d8f0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt @@ -0,0 +1,10 @@ +brigadier:float 1 1 +--- +{'min': 7, 'max': 15} +--- +-3 +--- +InvalidSyntax: Expected value to be at least 7. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt new file mode 100644 index 000000000..cdccbe1c6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt @@ -0,0 +1,10 @@ +brigadier:float 1 2 +--- +{'min': 7, 'max': 15} +--- +0.5 +--- +InvalidSyntax: Expected value to be at least 7. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt new file mode 100644 index 000000000..7bcfadd52 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt @@ -0,0 +1,10 @@ +brigadier:float 1 3 +--- +{'min': 7, 'max': 15} +--- +100 +--- +InvalidSyntax: Expected value to be at most 15. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt new file mode 100644 index 000000000..7f2519b91 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt @@ -0,0 +1,10 @@ +brigadier:integer 1 0 +--- +{'min': 7, 'max': 15} +--- +yolo +--- +UnexpectedToken: Expected number but got literal 'yolo' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt new file mode 100644 index 000000000..17088837e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt @@ -0,0 +1,10 @@ +brigadier:integer 1 1 +--- +{'min': 7, 'max': 15} +--- +-3 +--- +InvalidSyntax: Expected value to be at least 7. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt new file mode 100644 index 000000000..e11665e26 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt @@ -0,0 +1,10 @@ +brigadier:integer 1 2 +--- +{'min': 7, 'max': 15} +--- +0.5 +--- +InvalidSyntax: Expected integer value. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt new file mode 100644 index 000000000..25066f289 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt @@ -0,0 +1,10 @@ +brigadier:integer 1 3 +--- +{'min': 7, 'max': 15} +--- +100 +--- +InvalidSyntax: Expected value to be at most 15. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt new file mode 100644 index 000000000..b18ff9146 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt @@ -0,0 +1,10 @@ +brigadier:integer 1 4 +--- +{'min': 7, 'max': 15} +--- +11.1 +--- +InvalidSyntax: Expected integer value. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt new file mode 100644 index 000000000..107aac49b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt @@ -0,0 +1,10 @@ +brigadier:long 1 0 +--- +{'min': 7, 'max': 15} +--- +-3 +--- +InvalidSyntax: Expected value to be at least 7. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt new file mode 100644 index 000000000..9d4a27ea9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt @@ -0,0 +1,10 @@ +brigadier:long 1 1 +--- +{'min': 7, 'max': 15} +--- +0.5 +--- +InvalidSyntax: Expected integer value. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt new file mode 100644 index 000000000..415b2acc5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt @@ -0,0 +1,10 @@ +brigadier:long 1 2 +--- +{'min': 7, 'max': 15} +--- +100 +--- +InvalidSyntax: Expected value to be at most 15. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt new file mode 100644 index 000000000..4f0646803 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt @@ -0,0 +1,10 @@ +brigadier:long 1 3 +--- +{'min': 7, 'max': 15} +--- +11.1 +--- +InvalidSyntax: Expected integer value. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt new file mode 100644 index 000000000..71303d6d2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:angle 1 0 +--- +{} +--- +^-3 +--- +InvalidSyntax: Specifying local coordinates not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt new file mode 100644 index 000000000..781e8c3f5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:angle 1 1 +--- +{} +--- +wat +--- +UnexpectedToken: Expected coordinate but got literal 'wat' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt new file mode 100644 index 000000000..db14765b4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:block_pos 1 0 +--- +{} +--- +^-3 +--- +UnexpectedEOF: Expected coordinate but reached end of file + +location = SourceLocation(pos=3, lineno=1, colno=4) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt new file mode 100644 index 000000000..eefee5567 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:block_pos 1 1 +--- +{} +--- +wat +--- +UnexpectedToken: Expected coordinate but got literal 'wat' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt new file mode 100644 index 000000000..7c621dc99 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:block_pos 1 2 +--- +{} +--- +17 +--- +UnexpectedEOF: Expected coordinate but reached end of file + +location = SourceLocation(pos=2, lineno=1, colno=3) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt new file mode 100644 index 000000000..1fc79dd82 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:block_pos 1 3 +--- +{} +--- +{} +--- +UnexpectedToken: Expected coordinate but got literal '{}' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt new file mode 100644 index 000000000..ff118f267 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:block_predicate 1 0 +--- +{} +--- +{} +--- +UnexpectedToken: Expected resource_location but got literal '{}' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt new file mode 100644 index 000000000..44385c92e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:block_predicate 1 1 +--- +{} +--- +#stone[foo=bar, +--- +UnexpectedEOF: Expected bracket ']' but reached end of file + +location = SourceLocation(pos=15, lineno=1, colno=16) +end_location = SourceLocation(pos=15, lineno=1, colno=16) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt new file mode 100644 index 000000000..ae1192c9c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:block_predicate 1 2 +--- +{} +--- +#stone[ +--- +UnexpectedEOF: Expected bracket ']' but reached end of file + +location = SourceLocation(pos=7, lineno=1, colno=8) +end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt new file mode 100644 index 000000000..1c5ba61ee --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:block_predicate 1 3 +--- +{} +--- +#stone[foo +--- +UnexpectedEOF: Expected equal but reached end of file + +location = SourceLocation(pos=10, lineno=1, colno=11) +end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt new file mode 100644 index 000000000..4fa8ee3ee --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt @@ -0,0 +1,10 @@ +minecraft:block_predicate 1 4 +--- +{} +--- +#stone[thing=hello]{ +--- +UnexpectedEOF: Expected curly '}' but reached end of file + +location = SourceLocation(pos=20, lineno=1, colno=21) +end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt new file mode 100644 index 000000000..0d16bb18a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt @@ -0,0 +1,10 @@ +minecraft:block_predicate 1 5 +--- +{} +--- +#stone[thing=hello]{what:is:that} +--- +UnexpectedToken: Expected curly '}' but got colon ':' + +location = SourceLocation(pos=27, lineno=1, colno=28) +end_location = SourceLocation(pos=27, lineno=1, colno=28) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt new file mode 100644 index 000000000..fe07acadb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 0 +--- +{} +--- +{} +--- +UnexpectedToken: Expected resource_location but got literal '{}' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt new file mode 100644 index 000000000..211af7bd4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 1 +--- +{} +--- +#stone[foo=bar, +--- +InvalidSyntax: Specifying a tag is not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt new file mode 100644 index 000000000..53271c17d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 2 +--- +{} +--- +stone[foo=bar, +--- +UnexpectedEOF: Expected bracket ']' but reached end of file + +location = SourceLocation(pos=14, lineno=1, colno=15) +end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt new file mode 100644 index 000000000..14dfdf941 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 3 +--- +{} +--- +stone[ +--- +UnexpectedEOF: Expected bracket ']' but reached end of file + +location = SourceLocation(pos=6, lineno=1, colno=7) +end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt new file mode 100644 index 000000000..6ce0a4d93 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 4 +--- +{} +--- +stone[foo +--- +UnexpectedEOF: Expected equal but reached end of file + +location = SourceLocation(pos=9, lineno=1, colno=10) +end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt new file mode 100644 index 000000000..a407e2ea1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 5 +--- +{} +--- +stone[thing=hello]{ +--- +UnexpectedEOF: Expected curly '}' but reached end of file + +location = SourceLocation(pos=19, lineno=1, colno=20) +end_location = SourceLocation(pos=19, lineno=1, colno=20) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt new file mode 100644 index 000000000..2d01d659f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt @@ -0,0 +1,10 @@ +minecraft:block_state 1 6 +--- +{} +--- +stone[thing=hello]{what:is:that} +--- +UnexpectedToken: Expected curly '}' but got colon ':' + +location = SourceLocation(pos=26, lineno=1, colno=27) +end_location = SourceLocation(pos=26, lineno=1, colno=27) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt new file mode 100644 index 000000000..320577d93 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:color 1 0 +--- +{} +--- +creeper +--- +InvalidSyntax: Unexpected value 'creeper'. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt new file mode 100644 index 000000000..8484b2acf --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:column_pos 1 0 +--- +{} +--- +7 +--- +UnexpectedEOF: Expected coordinate but reached end of file + +location = SourceLocation(pos=1, lineno=1, colno=2) +end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt new file mode 100644 index 000000000..3b227ec31 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:column_pos 1 1 +--- +{} +--- +^7 +--- +InvalidSyntax: Specifying local coordinates not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt new file mode 100644 index 000000000..64b6d31b2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:column_pos 1 2 +--- +{} +--- +@ +--- +UnexpectedToken: Expected coordinate but got literal '@' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt new file mode 100644 index 000000000..0b817e7b5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:component 1 0 +--- +{} +--- +wat +--- +UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got literal 'wat' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt new file mode 100644 index 000000000..d1ff6b7e6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:component 1 1 +--- +{} +--- +{"hey": ]} +--- +UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']' + +location = SourceLocation(pos=7, lineno=1, colno=8) +end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt new file mode 100644 index 000000000..2ff4acb80 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:dimension 1 0 +--- +{} +--- +#minecraft:overworld +--- +InvalidSyntax: Specifying a tag is not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt new file mode 100644 index 000000000..cba28295f --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt @@ -0,0 +1,26 @@ +minecraft:entity 1 0 +--- +{'type': 'players', 'amount': 'multiple'} +--- +@e[level=10..] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + variable: 'e' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'level' + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + min: 10 + max: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt new file mode 100644 index 000000000..4c0923974 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt @@ -0,0 +1,31 @@ +minecraft:entity 1 1 +--- +{'type': 'players', 'amount': 'multiple'} +--- +@e[type=player] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + variable: 'e' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'type' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt new file mode 100644 index 000000000..2aef2931d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt @@ -0,0 +1,10 @@ +minecraft:entity 2 0 +--- +{'type': 'players', 'amount': 'multiple'} +--- +@e +--- +InvalidSyntax: Expected player-type entity selector. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt new file mode 100644 index 000000000..a60ce9803 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt @@ -0,0 +1,10 @@ +minecraft:entity 2 1 +--- +{'type': 'players', 'amount': 'multiple'} +--- +@e[type=foo] +--- +InvalidSyntax: Expected player-type entity selector. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=12, lineno=1, colno=13) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt new file mode 100644 index 000000000..6d9bd77cc --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt @@ -0,0 +1,25 @@ +minecraft:entity 3 0 +--- +{'type': 'entities', 'amount': 'single'} +--- +@e[limit=1] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 'e' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'limit' + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt new file mode 100644 index 000000000..6d2982899 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt @@ -0,0 +1,31 @@ +minecraft:entity 3 1 +--- +{'type': 'entities', 'amount': 'single'} +--- +@s[type=player] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + variable: 's' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'type' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt new file mode 100644 index 000000000..ccb800fce --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt @@ -0,0 +1,10 @@ +minecraft:entity 4 0 +--- +{'type': 'entities', 'amount': 'single'} +--- +@r[limit=7] +--- +InvalidSyntax: Expected entity selector targeting a single entity. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=11, lineno=1, colno=12) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt new file mode 100644 index 000000000..915bcf246 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt @@ -0,0 +1,10 @@ +minecraft:entity 4 1 +--- +{'type': 'entities', 'amount': 'single'} +--- +@a[tag=!foo] +--- +InvalidSyntax: Expected entity selector targeting a single entity. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=12, lineno=1, colno=13) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt new file mode 100644 index 000000000..4e4e2629e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:entity_summon 1 0 +--- +{} +--- +#minecraft:pig +--- +InvalidSyntax: Specifying a tag is not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt new file mode 100644 index 000000000..4fa4700b2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:entity_summon 1 1 +--- +{} +--- +#cow +--- +InvalidSyntax: Specifying a tag is not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt new file mode 100644 index 000000000..282386a92 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:float_range 1 0 +--- +{} +--- +.. +--- +UnexpectedToken: Expected range but got literal '..' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt new file mode 100644 index 000000000..33c9b1c06 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:float_range 1 1 +--- +{} +--- +wat +--- +UnexpectedToken: Expected range but got literal 'wat' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt new file mode 100644 index 000000000..0a6b119b5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt @@ -0,0 +1,35 @@ +minecraft:game_profile 0 4 +--- +{} +--- +@e[type=minecraft:player] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + variable: 'e' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'type' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + is_tag: False + namespace: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'minecraft' + path: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt new file mode 100644 index 000000000..8505c2c39 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:game_profile 1 0 +--- +{} +--- +@e +--- +InvalidSyntax: Expected player-type entity selector. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt new file mode 100644 index 000000000..fe819443b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:game_profile 1 1 +--- +{} +--- +@s[type=cow] +--- +InvalidSyntax: Expected player-type entity selector. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=12, lineno=1, colno=13) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt new file mode 100644 index 000000000..6822c68be --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:game_profile 1 2 +--- +{} +--- +@e[type=!player] +--- +InvalidSyntax: Expected player-type entity selector. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt new file mode 100644 index 000000000..069d094e5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:int_range 1 0 +--- +{} +--- +0..5.2 +--- +InvalidSyntax: Expected integer range. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt new file mode 100644 index 000000000..8178cb444 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:int_range 1 1 +--- +{} +--- +0.7 +--- +InvalidSyntax: Expected integer range. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt new file mode 100644 index 000000000..c91492f36 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:int_range 1 2 +--- +{} +--- +-5.4 +--- +InvalidSyntax: Expected integer range. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt new file mode 100644 index 000000000..efb99a517 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:int_range 1 3 +--- +{} +--- +-100.76.. +--- +InvalidSyntax: Expected integer range. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt new file mode 100644 index 000000000..c30834fc4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt @@ -0,0 +1,10 @@ +minecraft:int_range 1 4 +--- +{} +--- +..100.4 +--- +InvalidSyntax: Expected integer range. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt new file mode 100644 index 000000000..e9d6828c8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:item_stack 1 0 +--- +{} +--- +#minecraft:stone +--- +InvalidSyntax: Specifying a tag is not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt new file mode 100644 index 000000000..b95b29d05 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt @@ -0,0 +1,47 @@ +minecraft:message 0 4 +--- +{} +--- +foo @a[tag=a, tag=b] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + words: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + variable: 'a' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + inverted: False + key: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'tag' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'a' + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + inverted: False + key: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'tag' + value: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'b' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt new file mode 100644 index 000000000..6b8ff8a30 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:message 1 0 +--- +{} +--- +Hello @p[team=winner :) +--- +UnexpectedToken: Expected bracket ']' but got literal ':)' + +location = SourceLocation(pos=20, lineno=1, colno=21) +end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt new file mode 100644 index 000000000..3091cce58 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_compound_tag 1 0 +--- +{} +--- +[{foo:bar}] +--- +InvalidSyntax: Expected nbt compound. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=11, lineno=1, colno=12) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt new file mode 100644 index 000000000..9d1d5f6dd --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt @@ -0,0 +1,30 @@ +minecraft:nbt_path 0 10 +--- +{} +--- +foo.bar[0]."A [crazy name]!" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + index: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 0 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'A [crazy name]!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt new file mode 100644 index 000000000..1ecf10033 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt @@ -0,0 +1,34 @@ +minecraft:nbt_path 0 11 +--- +{} +--- +foo.bar[0]."A [crazy name]!".baz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + index: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 0 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'A [crazy name]!' + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 'baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt new file mode 100644 index 000000000..b0f77df10 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt @@ -0,0 +1,22 @@ +minecraft:nbt_path 0 12 +--- +{} +--- +foo.bar[] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + index: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt new file mode 100644 index 000000000..fbe3ef046 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt @@ -0,0 +1,26 @@ +minecraft:nbt_path 0 13 +--- +{} +--- +foo.bar[].baz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + index: None + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt new file mode 100644 index 000000000..3cd5bed89 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt @@ -0,0 +1,39 @@ +minecraft:nbt_path 0 14 +--- +{} +--- +foo.bar[{baz:5b}] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + index: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + entries: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + key: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'baz' + value: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: Byte(5) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt new file mode 100644 index 000000000..8d893eb62 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt @@ -0,0 +1,31 @@ +minecraft:nbt_path 0 15 +--- +{} +--- +foo{bar:"baz"} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + entries: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: String('baz') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt new file mode 100644 index 000000000..5dc421e1a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt @@ -0,0 +1,35 @@ +minecraft:nbt_path 0 16 +--- +{} +--- +foo{bar:"baz"}.bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + entries: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: String('baz') + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt new file mode 100644 index 000000000..594dba396 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt @@ -0,0 +1,15 @@ +minecraft:nbt_path 0 6 +--- +{} +--- +{} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + entries: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt new file mode 100644 index 000000000..4255630df --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt @@ -0,0 +1,27 @@ +minecraft:nbt_path 0 7 +--- +{} +--- +{foo:4.0f} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: Float(4.0) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt new file mode 100644 index 000000000..e9674cac9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt @@ -0,0 +1,23 @@ +minecraft:nbt_path 0 8 +--- +{} +--- +foo{}.bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + entries: + + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt new file mode 100644 index 000000000..e2569cb87 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt @@ -0,0 +1,26 @@ +minecraft:nbt_path 0 9 +--- +{} +--- +foo.bar[-1] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + components: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + index: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt new file mode 100644 index 000000000..a26e7bc01 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_path 1 0 +--- +{} +--- +{foo:bar foo:bar} +--- +UnexpectedToken: Expected curly '}' but got string 'foo' + +location = SourceLocation(pos=8, lineno=1, colno=9) +end_location = SourceLocation(pos=8, lineno=1, colno=9) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt new file mode 100644 index 000000000..36d4485bf --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:operation 1 0 +--- +{} +--- +wat +--- +InvalidSyntax: Unexpected value 'wat'. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt new file mode 100644 index 000000000..f038c436d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:resource_location 1 0 +--- +{} +--- +#thing +--- +InvalidSyntax: Specifying a tag is not allowed. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt new file mode 100644 index 000000000..c0d402bc3 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:rotation 1 0 +--- +{} +--- +-5 ^5 +--- +InvalidSyntax: Specifying local coordinates not allowed. + +location = SourceLocation(pos=3, lineno=1, colno=4) +end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt new file mode 100644 index 000000000..dcbb9bffb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder 1 0 +--- +{'amount': 'single'} +--- +@s +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 's' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt new file mode 100644 index 000000000..9e3455469 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder 1 1 +--- +{'amount': 'single'} +--- +@p +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + variable: 'p' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt new file mode 100644 index 000000000..d164b8aa0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt @@ -0,0 +1,53 @@ +minecraft:score_holder 1 2 +--- +{'amount': 'single'} +--- +@e[tag=foo, limit=1, sort=nearest] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + variable: 'e' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'tag' + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'foo' + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + inverted: False + key: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'limit' + value: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 1 + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + inverted: False + key: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'sort' + value: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + value: 'nearest' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt new file mode 100644 index 000000000..7b9c2c294 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder 2 0 +--- +{'amount': 'single'} +--- +@a +--- +InvalidSyntax: Expected entity selector targeting a single entity. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt new file mode 100644 index 000000000..6498fa87a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder 2 1 +--- +{'amount': 'single'} +--- +@e[type=minecraft:marker, sort=wat, limit=1] +--- +InvalidSyntax: Unexpected value 'wat'. + +location = SourceLocation(pos=31, lineno=1, colno=32) +end_location = SourceLocation(pos=34, lineno=1, colno=35) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt new file mode 100644 index 000000000..012869fbe --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder 2 2 +--- +{'amount': 'single'} +--- +@e[tag=foo, sort=nearest] +--- +InvalidSyntax: Expected entity selector targeting a single entity. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=25, lineno=1, colno=26) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt new file mode 100644 index 000000000..6842d3cad --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle 1 0 +--- +{} +--- +sup +--- +InvalidSyntax: Invalid swizzle 'sup'. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt new file mode 100644 index 000000000..469340f14 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle 1 1 +--- +{} +--- +wat +--- +InvalidSyntax: Invalid swizzle 'wat'. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt new file mode 100644 index 000000000..9b326bce5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle 1 2 +--- +{} +--- +xx +--- +InvalidSyntax: Invalid swizzle 'xx'. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt new file mode 100644 index 000000000..954763b79 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:swizzle 1 3 +--- +{} +--- +yzy +--- +InvalidSyntax: Invalid swizzle 'yzy'. + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 4fe504bb2..657ff4bfc 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -26,12 +26,12 @@ def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): @pytest.mark.parametrize( - "test_name, properties, is_error, value", + "test_name, properties, invalid, value", params := [ ( f"{argument_parser} {i} {j}", suite.get("properties", {}), - suite.get("is_error", False), + suite.get("invalid", False), value, ) for argument_parser, suites in get_argument_examples().items() @@ -45,7 +45,7 @@ def test_argument_examples( mc: Mecha, test_name: str, properties: JsonDict, - is_error: bool, + invalid: bool, value: str, ): argument_parser = f"command:argument:{test_name.partition(' ')[0]}" @@ -55,7 +55,7 @@ def test_argument_examples( stream = mc.create_token_stream(value) with stream.syntax(literal=r"\S+"), stream.provide(properties=properties): - if is_error: + if invalid: with pytest.raises(InvalidSyntax) as exc_info: delegate(argument_parser, stream) assert snapshot() == "\n---\n".join( @@ -63,7 +63,7 @@ def test_argument_examples( test_name, str(properties), value, - str(exc_info.value), + f"{exc_info.type.__name__}: {exc_info.value}\n\nlocation = {exc_info.value.location}\nend_location = {exc_info.value.end_location}", ] ) else: From ab2fc23469ff7bc0d8d276d4a5cdafc14bc23988 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 04:57:44 +0200 Subject: [PATCH 0294/1554] fix: handle a few selector edge cases and add more tests --- packages/mecha/mecha/ast.py | 14 ++- packages/mecha/mecha/parse.py | 38 ++++++-- .../mecha/resources/argument_examples.json | 48 +++++++++- ...ment_examples_minecraft_entity_0_10__0.txt | 39 ++++++++ ...ment_examples_minecraft_entity_0_11__0.txt | 25 +++++ ...ment_examples_minecraft_entity_0_12__0.txt | 39 ++++++++ ...ment_examples_minecraft_entity_0_13__0.txt | 26 +++++ ...ment_examples_minecraft_entity_0_14__0.txt | 41 ++++++++ ...ment_examples_minecraft_entity_0_15__0.txt | 39 ++++++++ ...ment_examples_minecraft_entity_0_16__0.txt | 39 ++++++++ ...ment_examples_minecraft_entity_0_17__0.txt | 26 +++++ ...ment_examples_minecraft_entity_0_18__0.txt | 59 ++++++++++++ ...ment_examples_minecraft_entity_0_19__0.txt | 59 ++++++++++++ ...ment_examples_minecraft_entity_0_20__0.txt | 59 ++++++++++++ ...ument_examples_minecraft_entity_0_5__0.txt | 12 +++ ...ument_examples_minecraft_entity_0_6__0.txt | 80 ++++++++++++++++ ...ument_examples_minecraft_entity_0_7__0.txt | 41 ++++++++ ...ument_examples_minecraft_entity_0_8__0.txt | 26 +++++ ...ument_examples_minecraft_entity_0_9__0.txt | 41 ++++++++ ...ument_examples_minecraft_entity_2_2__0.txt | 10 ++ ...xamples_minecraft_score_holder_0_10__0.txt | 51 ++++++++++ ...xamples_minecraft_score_holder_0_11__0.txt | 51 ++++++++++ ...xamples_minecraft_score_holder_0_12__0.txt | 31 ++++++ ...xamples_minecraft_score_holder_0_13__0.txt | 31 ++++++ ...xamples_minecraft_score_holder_0_14__0.txt | 95 +++++++++++++++++++ ...xamples_minecraft_score_holder_0_15__0.txt | 67 +++++++++++++ ...xamples_minecraft_score_holder_0_16__0.txt | 41 ++++++++ ...xamples_minecraft_score_holder_0_17__0.txt | 41 ++++++++ ...xamples_minecraft_score_holder_0_18__0.txt | 41 ++++++++ ...examples_minecraft_score_holder_0_4__0.txt | 39 ++++++++ ...examples_minecraft_score_holder_0_5__0.txt | 41 ++++++++ ...examples_minecraft_score_holder_0_6__0.txt | 25 +++++ ...examples_minecraft_score_holder_0_7__0.txt | 39 ++++++++ ...examples_minecraft_score_holder_0_8__0.txt | 39 ++++++++ ...examples_minecraft_score_holder_0_9__0.txt | 39 ++++++++ ...examples_minecraft_score_holder_2_3__0.txt | 10 ++ ...examples_minecraft_score_holder_2_4__0.txt | 10 ++ ...examples_minecraft_score_holder_2_5__0.txt | 10 ++ 38 files changed, 1448 insertions(+), 14 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index f04a1b7dd..5fb074f6b 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -25,6 +25,8 @@ "AstTime", "AstSelectorScoreMatch", "AstSelectorScores", + "AstSelectorAdvancementPredicateMatch", + "AstSelectorAdvancementMatch", "AstSelectorArgument", "AstSelector", "AstMessage", @@ -309,12 +311,22 @@ class AstSelectorScores(AstNode): scores: AstChildren[AstSelectorScoreMatch] = required_field() +@dataclass(frozen=True) +class AstSelectorAdvancementPredicateMatch(AstNode): + """Ast selector advancement predicate match node.""" + + key: AstValue[str] = required_field() + value: AstValue[bool] = required_field() + + @dataclass(frozen=True) class AstSelectorAdvancementMatch(AstNode): """Ast selector advancement match node.""" key: AstResourceLocation = required_field() - value: AstValue[bool] = required_field() + value: Union[ + AstValue[bool], AstChildren[AstSelectorAdvancementPredicateMatch] + ] = required_field() @dataclass(frozen=True) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e72a5bcc6..47c4d29cc 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -88,6 +88,7 @@ AstRoot, AstSelector, AstSelectorAdvancementMatch, + AstSelectorAdvancementPredicateMatch, AstSelectorAdvancements, AstSelectorArgument, AstSelectorScoreMatch, @@ -1194,24 +1195,22 @@ class SelectorArgumentParser: def __call__(self, stream: TokenStream) -> Any: with stream.syntax( - argument=r"[a-z_]+", equal=r"=", exclamation=r"!", ): - key = stream.expect("argument") - key_node = AstValue[str](value=key.value) - key_node = set_location(key_node, key) + key_node = delegate("phrase", stream) + argument = key_node.value stream.expect("equal") inverted = stream.get("exclamation") is not None try: - value_node = delegate(f"selector:argument:{key.value}", stream) + value_node = delegate(f"selector:argument:{argument}", stream) except UnrecognizedParser as exc: if not exc.parser.startswith("selector:argument:"): raise - syntax_exc = InvalidSyntax(f"Invalid selector argument {key.value!r}.") + syntax_exc = InvalidSyntax(f"Invalid selector argument {argument!r}.") raise key_node.emit_error(syntax_exc) from exc node = AstSelectorArgument(inverted=inverted, key=key_node, value=value_node) @@ -1253,7 +1252,7 @@ def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: stream.expect("equal") - value_node = delegate("minecraft:integer_range", stream) + value_node = delegate("integer_range", stream) match_node = AstSelectorScoreMatch(key=key_node, value=value_node) scores.append(set_location(match_node, key_node, value_node)) @@ -1275,9 +1274,30 @@ def parse_selector_advancements(stream: TokenStream) -> AstSelectorAdvancements: advancements: List[AstSelectorAdvancementMatch] = [] for _ in stream.peek_until(("curly", "}")): - key_node = delegate("minecraft:resource_location", stream) + key_node = delegate("resource_location", stream) stream.expect("equal") - value_node = delegate("brigadier:bool", stream) + + if stream.get("curly"): + predicates: List[AstSelectorAdvancementPredicateMatch] = [] + + for _ in stream.peek_until(("curly", "}")): + pkey = delegate("word", stream) + stream.expect("equal") + pvalue = delegate("bool", stream) + + predicate_node = AstSelectorAdvancementPredicateMatch( + key=pkey, + value=pvalue, + ) + predicates.append(set_location(predicate_node, pkey, pvalue)) + + if not stream.get("comma"): + stream.expect(("curly", "}")) + break + + value_node = AstChildren(predicates) + else: + value_node = delegate("bool", stream) match_node = AstSelectorAdvancementMatch(key=key_node, value=value_node) advancements.append(set_location(match_node, key_node, value_node)) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 100252afa..65c6c5607 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -168,7 +168,21 @@ "0123", "@e", "@e[type=foo]", - "dd12be42-52a9-4a91-a8a1-11c01849e498" + "dd12be42-52a9-4a91-a8a1-11c01849e498", + "@a[ ]", + "@a[ advancements = { minecraft:foo = true , minecraft:bar = { qux = true , } , } , ]", + "@a[ advancements = { } , advancements = { } , ]", + "@a[ distance = ..1 , ]", + "@a[ distance = ..-1 , distance = 1..0 , ]", + "@a[ gamemode = ! creative , gamemode = ! adventure , ]", + "@a[ limit = 1 , ]", + "@s[ limit = 0 , limit = 0 , ]", + "@a[ level = 1.. , ]", + "@a[ level = -1 , level = -1 , ]", + "@a[ name = ! \"SPGoding\" , \"name\" = ! Misode ,]", + "@a[ name = \"SPGoding\" , \"name\" = Misode ,]", + "@a[ nbt = {} , ]", + "@a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ]" ] }, { @@ -178,7 +192,11 @@ { "invalid": true, "properties": { "type": "players", "amount": "multiple" }, - "examples": ["@e", "@e[type=foo]"] + "examples": [ + "@e", + "@e[type=foo]", + "@a[ gamemode = creative , gamemode = unknown , ]" + ] }, { "properties": { "type": "entities", "amount": "single" }, @@ -372,7 +390,26 @@ "minecraft:score_holder": [ { "properties": { "amount": "multiple" }, - "examples": ["Player", "0123", "*", "@e"] + "examples": [ + "Player", + "0123", + "*", + "@e", + "@a[ scores = { foo = 1.. , } , ]", + "@a[ scores = { } , scores = { } , ]", + "@a[ sort = arbitrary , ]", + "@a[ tag = foo , tag = ! bar , ]", + "@a[ team = ! foo , team = ! bar , ]", + "@a[ team = foo , team = bar , ]", + "@e[ type = ! skeleton , type = ! zombie , ]", + "@e[ type = skeleton , type = zombie , ]", + "@e[ type = player ]", + "@a[ type = zombie ]", + "@a[ x = 0.0 , y = 0.0 , z = 0.0 , dx = 0.0 , dy = 0.0 , dz = 0.0 , ]", + "@a[ x = 0.0 , x = 0.0 , dz = 0.0, dz = 0.0 , ]", + "@a[ x_rotation = 179.9..-179.9 , y_rotation = 179.9..-179.9 , ]", + "@a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ]" + ] }, { "properties": { "amount": "single" }, @@ -384,7 +421,10 @@ "examples": [ "@a", "@e[type=minecraft:marker, sort=wat, limit=1]", - "@e[tag=foo, sort=nearest]" + "@e[tag=foo, sort=nearest]", + "@a[ = 1 , ]", + "@s[ sort = arbitrary , sort = unknown , ]", + "@a[ unknown = 1 , ]" ] } ], diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt new file mode 100644 index 000000000..c0cfb1f48 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt @@ -0,0 +1,39 @@ +minecraft:entity 0 10 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ gamemode = ! creative , gamemode = ! adventure , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=1, colno=55) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + inverted: True + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'gamemode' + value: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'creative' + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + inverted: True + key: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 'gamemode' + value: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + value: 'adventure' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt new file mode 100644 index 000000000..49e982971 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt @@ -0,0 +1,25 @@ +minecraft:entity 0 11 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ limit = 1 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'limit' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt new file mode 100644 index 000000000..fd9a322f8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt @@ -0,0 +1,39 @@ +minecraft:entity 0 12 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@s[ limit = 0 , limit = 0 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + variable: 's' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'limit' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + inverted: False + key: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'limit' + value: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt new file mode 100644 index 000000000..47fddbb39 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt @@ -0,0 +1,26 @@ +minecraft:entity 0 13 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ level = 1.. , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'level' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + min: 1 + max: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt new file mode 100644 index 000000000..b2a624cb1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt @@ -0,0 +1,41 @@ +minecraft:entity 0 14 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ level = -1 , level = -1 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'level' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + min: -1 + max: -1 + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + inverted: False + key: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: 'level' + value: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: -1 + max: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt new file mode 100644 index 000000000..ec250f2e1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt @@ -0,0 +1,39 @@ +minecraft:entity 0 15 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ name = ! "SPGoding" , "name" = ! Misode ,] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + inverted: True + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'name' + value: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 'SPGoding' + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + inverted: True + key: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 'name' + value: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + value: 'Misode' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt new file mode 100644 index 000000000..66767fcac --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt @@ -0,0 +1,39 @@ +minecraft:entity 0 16 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ name = "SPGoding" , "name" = Misode ,] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'name' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'SPGoding' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + inverted: False + key: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + value: 'name' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 'Misode' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt new file mode 100644 index 000000000..9e2a7c745 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt @@ -0,0 +1,26 @@ +minecraft:entity 0 17 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ nbt = {} , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'nbt' + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + entries: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt new file mode 100644 index 000000000..4b842df56 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt @@ -0,0 +1,59 @@ +minecraft:entity 0 18 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'predicate' + value: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + is_tag: False + namespace: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: 'spgoding' + path: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'foo' + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + inverted: True + key: + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + value: 'predicate' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + is_tag: False + namespace: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + value: 'spgoding' + path: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt new file mode 100644 index 000000000..5de7865d2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt @@ -0,0 +1,59 @@ +minecraft:entity 0 19 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'predicate' + value: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + is_tag: False + namespace: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: 'spgoding' + path: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'foo' + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + inverted: True + key: + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + value: 'predicate' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + is_tag: False + namespace: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + value: 'spgoding' + path: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt new file mode 100644 index 000000000..683f1fc3c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt @@ -0,0 +1,59 @@ +minecraft:entity 0 20 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'predicate' + value: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + is_tag: False + namespace: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: 'spgoding' + path: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'foo' + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + inverted: True + key: + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + value: 'predicate' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + is_tag: False + namespace: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + value: 'spgoding' + path: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt new file mode 100644 index 000000000..ab22ef4da --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt @@ -0,0 +1,12 @@ +minecraft:entity 0 5 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + variable: 'a' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt new file mode 100644 index 000000000..ff8353ec7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt @@ -0,0 +1,80 @@ +minecraft:entity 0 6 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ advancements = { minecraft:foo = true , minecraft:bar = { qux = true , } , } , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=84, lineno=1, colno=85) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'advancements' + value: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + advancements: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + key: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + is_tag: False + namespace: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + value: 'minecraft' + path: + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + value: 'foo' + value: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + value: True + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + key: + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + is_tag: False + namespace: + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + value: 'minecraft' + path: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 'bar' + value: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=72, lineno=1, colno=73) + key: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=65, lineno=1, colno=66) + value: 'qux' + value: + + location: SourceLocation(pos=68, lineno=1, colno=69) + end_location: SourceLocation(pos=72, lineno=1, colno=73) + value: True \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt new file mode 100644 index 000000000..3cb122938 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt @@ -0,0 +1,41 @@ +minecraft:entity 0 7 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ advancements = { } , advancements = { } , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'advancements' + value: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + advancements: + + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + inverted: False + key: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + value: 'advancements' + value: + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + advancements: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt new file mode 100644 index 000000000..a3820e9c6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt @@ -0,0 +1,26 @@ +minecraft:entity 0 8 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ distance = ..1 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'distance' + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + min: None + max: 1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt new file mode 100644 index 000000000..d65fbcd11 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt @@ -0,0 +1,41 @@ +minecraft:entity 0 9 +--- +{'type': 'entities', 'amount': 'multiple'} +--- +@a[ distance = ..-1 , distance = 1..0 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'distance' + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + min: None + max: -1.0 + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + inverted: False + key: + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + value: 'distance' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + min: 1.0 + max: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt new file mode 100644 index 000000000..3e34097e9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt @@ -0,0 +1,10 @@ +minecraft:entity 2 2 +--- +{'type': 'players', 'amount': 'multiple'} +--- +@a[ gamemode = creative , gamemode = unknown , ] +--- +InvalidSyntax: Unexpected value 'unknown'. + +location = SourceLocation(pos=37, lineno=1, colno=38) +end_location = SourceLocation(pos=44, lineno=1, colno=45) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt new file mode 100644 index 000000000..650033e9c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt @@ -0,0 +1,51 @@ +minecraft:score_holder 0 10 +--- +{'amount': 'multiple'} +--- +@e[ type = ! skeleton , type = ! zombie , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + variable: 'e' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + inverted: True + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'type' + value: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'skeleton' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + inverted: True + key: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'type' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 'zombie' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt new file mode 100644 index 000000000..c16c60c30 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt @@ -0,0 +1,51 @@ +minecraft:score_holder 0 11 +--- +{'amount': 'multiple'} +--- +@e[ type = skeleton , type = zombie , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + variable: 'e' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'type' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'skeleton' + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + inverted: False + key: + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 'type' + value: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + value: 'zombie' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt new file mode 100644 index 000000000..967fe20f7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt @@ -0,0 +1,31 @@ +minecraft:score_holder 0 12 +--- +{'amount': 'multiple'} +--- +@e[ type = player ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + variable: 'e' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'type' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt new file mode 100644 index 000000000..fd673e3d4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt @@ -0,0 +1,31 @@ +minecraft:score_holder 0 13 +--- +{'amount': 'multiple'} +--- +@a[ type = zombie ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'type' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'zombie' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt new file mode 100644 index 000000000..fa3f66803 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt @@ -0,0 +1,95 @@ +minecraft:score_holder 0 14 +--- +{'amount': 'multiple'} +--- +@a[ x = 0.0 , y = 0.0 , z = 0.0 , dx = 0.0 , dy = 0.0 , dz = 0.0 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=1, colno=69) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'x' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 0.0 + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + inverted: False + key: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'y' + value: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 0.0 + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + inverted: False + key: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'z' + value: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 0.0 + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + inverted: False + key: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 'dx' + value: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + value: 0.0 + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + inverted: False + key: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + value: 'dy' + value: + + location: SourceLocation(pos=50, lineno=1, colno=51) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + value: 0.0 + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=64, lineno=1, colno=65) + inverted: False + key: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=58, lineno=1, colno=59) + value: 'dz' + value: + + location: SourceLocation(pos=61, lineno=1, colno=62) + end_location: SourceLocation(pos=64, lineno=1, colno=65) + value: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt new file mode 100644 index 000000000..ab306c4ac --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt @@ -0,0 +1,67 @@ +minecraft:score_holder 0 15 +--- +{'amount': 'multiple'} +--- +@a[ x = 0.0 , x = 0.0 , dz = 0.0, dz = 0.0 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'x' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 0.0 + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + inverted: False + key: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'x' + value: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 0.0 + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + inverted: False + key: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 'dz' + value: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 0.0 + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + inverted: False + key: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 'dz' + value: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + value: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt new file mode 100644 index 000000000..8b68ab3b5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt @@ -0,0 +1,41 @@ +minecraft:score_holder 0 16 +--- +{'amount': 'multiple'} +--- +@a[ x_rotation = 179.9..-179.9 , y_rotation = 179.9..-179.9 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=64, lineno=1, colno=65) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'x_rotation' + value: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + min: 179.9 + max: -179.9 + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + inverted: False + key: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'y_rotation' + value: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + min: 179.9 + max: -179.9 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt new file mode 100644 index 000000000..9f76db68a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt @@ -0,0 +1,41 @@ +minecraft:score_holder 0 17 +--- +{'amount': 'multiple'} +--- +@a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=64, lineno=1, colno=65) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'x_rotation' + value: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + min: 179.9 + max: -179.9 + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + inverted: False + key: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'x_rotation' + value: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + min: 179.9 + max: -179.9 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt new file mode 100644 index 000000000..6cec4b0ed --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt @@ -0,0 +1,41 @@ +minecraft:score_holder 0 18 +--- +{'amount': 'multiple'} +--- +@a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=64, lineno=1, colno=65) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'x_rotation' + value: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + min: 179.9 + max: -179.9 + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + inverted: False + key: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'x_rotation' + value: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + min: 179.9 + max: -179.9 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt new file mode 100644 index 000000000..efbaeec28 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt @@ -0,0 +1,39 @@ +minecraft:score_holder 0 4 +--- +{'amount': 'multiple'} +--- +@a[ scores = { foo = 1.. , } , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'scores' + value: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + scores: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + key: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 'foo' + value: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + min: 1 + max: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt new file mode 100644 index 000000000..35b69d1a8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt @@ -0,0 +1,41 @@ +minecraft:score_holder 0 5 +--- +{'amount': 'multiple'} +--- +@a[ scores = { } , scores = { } , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'scores' + value: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + scores: + + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + inverted: False + key: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'scores' + value: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + scores: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt new file mode 100644 index 000000000..80e6f04ff --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt @@ -0,0 +1,25 @@ +minecraft:score_holder 0 6 +--- +{'amount': 'multiple'} +--- +@a[ sort = arbitrary , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'sort' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'arbitrary' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt new file mode 100644 index 000000000..fdc081106 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt @@ -0,0 +1,39 @@ +minecraft:score_holder 0 7 +--- +{'amount': 'multiple'} +--- +@a[ tag = foo , tag = ! bar , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'tag' + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'foo' + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + inverted: True + key: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'tag' + value: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt new file mode 100644 index 000000000..1f6b73bc4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt @@ -0,0 +1,39 @@ +minecraft:score_holder 0 8 +--- +{'amount': 'multiple'} +--- +@a[ team = ! foo , team = ! bar , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + inverted: True + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'team' + value: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'foo' + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + inverted: True + key: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 'team' + value: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt new file mode 100644 index 000000000..a17384271 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt @@ -0,0 +1,39 @@ +minecraft:score_holder 0 9 +--- +{'amount': 'multiple'} +--- +@a[ team = foo , team = bar , ] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + variable: 'a' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + inverted: False + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'team' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'foo' + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + inverted: False + key: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'team' + value: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt new file mode 100644 index 000000000..e598e22a1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder 2 3 +--- +{'amount': 'single'} +--- +@a[ = 1 , ] +--- +UnexpectedToken: Expected word or quoted_string but got equal '=' + +location = SourceLocation(pos=3, lineno=1, colno=4) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt new file mode 100644 index 000000000..1ecc533e7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder 2 4 +--- +{'amount': 'single'} +--- +@s[ sort = arbitrary , sort = unknown , ] +--- +InvalidSyntax: Unexpected value 'unknown'. + +location = SourceLocation(pos=30, lineno=1, colno=31) +end_location = SourceLocation(pos=37, lineno=1, colno=38) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt new file mode 100644 index 000000000..94a5038e5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt @@ -0,0 +1,10 @@ +minecraft:score_holder 2 5 +--- +{'amount': 'single'} +--- +@a[ unknown = 1 , ] +--- +InvalidSyntax: Invalid selector argument 'unknown'. + +location = SourceLocation(pos=4, lineno=1, colno=5) +end_location = SourceLocation(pos=11, lineno=1, colno=12) \ No newline at end of file From 755fa604d6ad8d1db1742264792237fc84a5b537 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 14:35:00 +0200 Subject: [PATCH 0295/1554] fix: handle particle and add more examples --- packages/mecha/mecha/ast.py | 84 + packages/mecha/mecha/parse.py | 123 +- .../mecha/resources/argument_examples.json | 24 +- .../resources/command_examples.mcfunction | 39 + ...ment_examples_minecraft_entity_0_19__0.txt | 59 - ...ment_examples_minecraft_entity_0_20__0.txt | 59 - ...ent_examples_minecraft_particle_0_0__0.txt | 21 + ...ent_examples_minecraft_particle_0_1__0.txt | 25 + ...ent_examples_minecraft_particle_0_2__0.txt | 44 + ...ent_examples_minecraft_particle_0_3__0.txt | 63 + ...ent_examples_minecraft_particle_0_4__0.txt | 58 + ...ent_examples_minecraft_particle_0_5__0.txt | 75 + ...ent_examples_minecraft_particle_0_6__0.txt | 44 + ...ent_examples_minecraft_particle_0_7__0.txt | 61 + ...ent_examples_minecraft_particle_0_8__0.txt | 59 + ...ent_examples_minecraft_particle_1_0__0.txt | 10 + ...ent_examples_minecraft_particle_1_1__0.txt | 10 + ...ent_examples_minecraft_particle_1_2__0.txt | 10 + ...ent_examples_minecraft_particle_1_3__0.txt | 10 + ...ent_examples_minecraft_particle_1_4__0.txt | 10 + ...ent_examples_minecraft_particle_1_5__0.txt | 10 + ...ent_examples_minecraft_particle_1_6__0.txt | 10 + ...xamples_minecraft_score_holder_0_18__0.txt | 41 - .../snapshots/parse__command_examples__0.txt | 4406 +++++++++++++---- 24 files changed, 4265 insertions(+), 1090 deletions(-) delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 5fb074f6b..a3c09b17d 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -32,6 +32,14 @@ "AstMessage", "AstNbtPathSubscript", "AstNbtPath", + "AstParticleParameters", + "AstDustParticleParameters", + "AstDustColorTransitionParticleParameters", + "AstBlockParticleParameters", + "AstFallingDustParticleParameters", + "AstItemParticleParameters", + "AstVibrationParticleParameters", + "AstParticle", ] @@ -244,6 +252,12 @@ class AstResourceLocation(AstNode): namespace: Optional[AstValue[str]] = None path: AstValue[str] = required_field() + def get_canonical_value(self) -> str: + """Return the canonical value of the resource location as a string.""" + prefix = "#" if self.is_tag else "" + namespace = f"{self.namespace.value}:" if self.namespace else "minecraft:" + return prefix + namespace + self.path.value + @dataclass(frozen=True) class AstBlockState(AstNode): @@ -374,3 +388,73 @@ class AstNbtPath(AstNode): components: AstChildren[ Union[AstValue[str], AstNbtCompound, AstNbtPathSubscript] ] = required_field() + + +@dataclass(frozen=True) +class AstParticleParameters(AstNode): + """Base ast node for particle parameters.""" + + +@dataclass(frozen=True) +class AstDustParticleParameters(AstParticleParameters): + """Ast dust particle parameters node.""" + + red: AstValue[Union[int, float]] = required_field() + green: AstValue[Union[int, float]] = required_field() + blue: AstValue[Union[int, float]] = required_field() + size: AstValue[Union[int, float]] = required_field() + + +@dataclass(frozen=True) +class AstDustColorTransitionParticleParameters(AstParticleParameters): + """Ast dust color transition particle parameters node.""" + + red: AstValue[Union[int, float]] = required_field() + green: AstValue[Union[int, float]] = required_field() + blue: AstValue[Union[int, float]] = required_field() + size: AstValue[Union[int, float]] = required_field() + end_red: AstValue[Union[int, float]] = required_field() + end_green: AstValue[Union[int, float]] = required_field() + end_blue: AstValue[Union[int, float]] = required_field() + + +@dataclass(frozen=True) +class AstBlockParticleParameters(AstParticleParameters): + """Ast block particle parameters node.""" + + block: AstBlock = required_field() + + +@dataclass(frozen=True) +class AstFallingDustParticleParameters(AstParticleParameters): + """Ast falling dust particle parameters node.""" + + block: AstBlock = required_field() + + +@dataclass(frozen=True) +class AstItemParticleParameters(AstParticleParameters): + """Ast item particle parameters node.""" + + item: AstItem = required_field() + + +@dataclass(frozen=True) +class AstVibrationParticleParameters(AstParticleParameters): + """Ast vibration particle parameters node.""" + + x1: AstValue[Union[int, float]] = required_field() + y1: AstValue[Union[int, float]] = required_field() + z1: AstValue[Union[int, float]] = required_field() + x2: AstValue[Union[int, float]] = required_field() + y2: AstValue[Union[int, float]] = required_field() + z2: AstValue[Union[int, float]] = required_field() + duration: AstValue[int] = required_field() + + +@dataclass(frozen=True) +class AstParticle(AstNode): + """Ast particle node.""" + + name: AstResourceLocation = required_field() + parameters: Optional[AstParticleParameters] = None diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 47c4d29cc..5541261c0 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -48,6 +48,8 @@ "ScoreHolderParser", "parse_message", "NbtPathParser", + "parse_particle", + "AggregateParser", "NUMBER_PATTERN", ] @@ -64,11 +66,16 @@ from .ast import ( AstBlock, + AstBlockParticleParameters, AstBlockState, AstChildren, AstCommand, AstCoordinate, + AstDustColorTransitionParticleParameters, + AstDustParticleParameters, + AstFallingDustParticleParameters, AstItem, + AstItemParticleParameters, AstJson, AstJsonArray, AstJsonObject, @@ -83,6 +90,7 @@ AstNbtPathSubscript, AstNbtValue, AstNode, + AstParticle, AstRange, AstResourceLocation, AstRoot, @@ -97,6 +105,7 @@ AstValue, AstVector2, AstVector3, + AstVibrationParticleParameters, ) from .error import InvalidEscapeSequence, UnrecognizedParser from .spec import CommandSpec, Parser @@ -147,6 +156,67 @@ def get_default_parsers() -> Dict[str, Parser]: "swizzle": parse_swizzle, "team": ValueParser("team", r"[a-zA-Z0-9_.+-]+"), ################################################################################ + # Particle + ################################################################################ + "particle": parse_particle, + "particle:minecraft:dust": AggregateParser( + type=AstDustParticleParameters, + fields={ + "red": delegate("numeric"), + "green": delegate("numeric"), + "blue": delegate("numeric"), + "size": delegate("numeric"), + }, + ), + "particle:minecraft:dust_color_transition": AggregateParser( + type=AstDustColorTransitionParticleParameters, + fields={ + "red": delegate("numeric"), + "green": delegate("numeric"), + "blue": delegate("numeric"), + "size": delegate("numeric"), + "end_red": delegate("numeric"), + "end_green": delegate("numeric"), + "end_blue": delegate("numeric"), + }, + ), + "particle:minecraft:block": AggregateParser( + type=AstBlockParticleParameters, + fields={ + "block": BlockParser( + resource_location_parser=delegate("resource_location"), + ) + }, + ), + "particle:minecraft:falling_dust": AggregateParser( + type=AstFallingDustParticleParameters, + fields={ + "block": BlockParser( + resource_location_parser=delegate("resource_location"), + ) + }, + ), + "particle:minecraft:item": AggregateParser( + type=AstItemParticleParameters, + fields={ + "item": ItemParser( + resource_location_parser=delegate("resource_location"), + ) + }, + ), + "particle:minecraft:vibration": AggregateParser( + type=AstVibrationParticleParameters, + fields={ + "x1": delegate("numeric"), + "y1": delegate("numeric"), + "z1": delegate("numeric"), + "x2": delegate("numeric"), + "y2": delegate("numeric"), + "z2": delegate("numeric"), + "duration": delegate("integer"), + }, + ), + ################################################################################ # Selector ################################################################################ "selector": SelectorParser(), @@ -297,7 +367,7 @@ def get_default_parsers() -> Dict[str, Parser]: "><", ], ), - # TODO: "minecraft:particle" + "command:argument:minecraft:particle": delegate("particle"), "command:argument:minecraft:resource_location": delegate("resource_location"), "command:argument:minecraft:rotation": Vector2Parser( coordinate_parser=RestrictCoordinateConstraint( @@ -431,6 +501,8 @@ def parse_command(stream: TokenStream) -> AstCommand: end_location = location while tree and tree.children: + newline = None + for (name, child), alternative in stream.choose(*tree.children.items()): with alternative, stream.provide(scope=scope + (name,)): if child.type == "literal": @@ -442,10 +514,15 @@ def parse_command(stream: TokenStream) -> AstCommand: arguments.append(node) end_location = node.end_location + if not child.redirect and not child.children: + newline = stream.expect("newline") + elif child.executable: + newline = stream.get("newline") + scope = stream.data["scope"] tree = child - if tree.executable and stream.get("newline"): + if newline: break target = spec.tree.get(tree.redirect) @@ -1325,15 +1402,11 @@ def __call__(self, stream: TokenStream) -> Any: if argument.key.value in ["gamemode", "level"]: is_player = True if argument.key.value == "type": - is_player = not argument.inverted and argument.value in [ - AstResourceLocation( - namespace=AstValue[str](value="minecraft"), - path=AstValue[str](value="player"), - ), - AstResourceLocation( - path=AstValue[str](value="player"), - ), - ] + is_player = ( + not argument.inverted + and isinstance(entity_type := argument.value, AstResourceLocation) + and entity_type.get_canonical_value() == "minecraft:player" + ) if not is_player: exc = InvalidSyntax("Expected player-type entity selector.") @@ -1529,3 +1602,31 @@ def parse_modifiers(self, stream: TokenStream) -> Iterator[Any]: subscript_node = AstNbtPathSubscript(index=index) yield set_location(subscript_node, bracket, close_bracket) + + +def parse_particle(stream: TokenStream) -> AstParticle: + """Parse particle.""" + name: AstResourceLocation = delegate("resource_location", stream) + parameters = None + + try: + parameters = delegate(f"particle:{name.get_canonical_value()}", stream) + except UnrecognizedParser as exc: + if not exc.parser.startswith("particle:"): + raise + + node = AstParticle(name=name, parameters=parameters) + return set_location(node, name, parameters if parameters else name) + + +@dataclass +class AggregateParser: + """Parser that creates a node by parsing the given fields one after the other.""" + + type: Type[AstNode] + fields: Dict[str, Parser] + + def __call__(self, stream: TokenStream) -> Any: + values = [(name, parser(stream)) for name, parser in self.fields.items()] + node = self.type(**dict(values)) + return set_location(node, values[0][1], values[-1][1]) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 65c6c5607..bd9b51f12 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -366,7 +366,29 @@ ], "minecraft:particle": [ { - "examples": ["foo", "foo:bar", "particle with options"] + "examples": [ + "foo", + "foo:bar", + "dust 1.0 0.5 0.5 1.0", + "minecraft:dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0", + "block minecraft:grass_block[snowy=true]", + "falling_dust minecraft:grass_block[snowy=true]{hello: world}", + "item minecraft:apple", + "item minecraft:apple{foo: bar}", + "vibration 0.0 64.0 0.0 5.0 64.0 0.0 200" + ] + }, + { + "invalid": true, + "examples": [ + "dust 1.0 0.5 0.5", + "minecraft:dust_color_transition 1.0 0.0 0.0 hello", + "block minecraft:grass_block[snowy=]", + "falling_dust grass_block[snowy=true]{hello: world wat}", + "item minecraft:apple{", + "vibration 0.0 64.0 0.0 5.0 thing", + "vibration 0.0 64.0" + ] } ], "minecraft:resource_location": [ diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index 52cd346bb..d4f7f6535 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -28,6 +28,37 @@ effect clear @e[type=zombie] # enchant enchant @a infinity enchant @p sharpness 5 +# execute +execute align yxz run spawnpoint @p ~ ~ ~ +execute anchored eyes run tp ^ ^ ^ +execute anchored eyes run tp ^5 ^ ^ +execute as @e[type=sheep] run data get entity @s +execute as @e[type=villager] run data merge entity @s {Invulnerable: 1} +execute as @e[type=sheep] at @s run tp ~ ~1 ~ +execute at @e[type=sheep] run kill @s +execute facing ^1 ^ ^ run tp ~ ~ ~ +execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 +execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 ~ ~ +execute as @e[type=!player] at @s facing entity @p feet run tp @s ^ ^ ^1 +execute in the_end run locate endcity +execute in minecraft:the_nether positioned as @s run tp ~ ~ ~ +execute in minecraft:the_nether run tp ~ ~ ~ +execute in minecraft:the_nether run tp ~ ~ ~5 +execute positioned 0 64 0 run locate village +execute as @e[type=sheep] at @s rotated as @p run tp @s ^ ^ ^1 +execute as @e[type=sheep] positioned as @s rotated as @p run tp @s ^ ^ ^1 +execute as @a at @s if block ~ ~-1 ~ #wool run kill @s +execute if score @s A = @s B +execute as @a if data entity @s Inventory[{Slot: 0b}].tag.Enchantments[{id: "minecraft:efficiency"}] run tp @s 0 64 0 +execute as @a at @s anchored eyes run particle smoke ^ ^ ^3 +execute as @e[type=pig] at @s store success entity @s Saddle byte 1 if entity @p[distance=..5] +execute as @a at @s if block ~ ~ ~ water run say "My feet are soaked!" +execute as @a unless score @s test = @s test run say "Score is reset" +execute at @p as @e[type=pig,distance=..3] run data merge entity @s {Motion: [0.0d, 2.0d, 0.0d]} +execute as @p at @s run teleport @s ~ ~ ~ ~10 ~ +execute in minecraft:the_nether run teleport ~ ~ ~ +execute as @a in minecraft:the_end run teleport 84 57 79 +execute as Alice in minecraft:overworld run teleport 251 64 -160 # experience experience query Steve levels # fill @@ -72,6 +103,14 @@ kill @e[type=arrow,nbt={inBlockState: {Name: "minecraft:target"}}] locate mansion # msg msg @a Hi +# particle +particle dust 1.0 0.5 0.5 1.0 +particle dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 +particle block minecraft:grass_block[snowy=true] +particle falling_dust minecraft:grass_block[snowy=true] +particle item minecraft:apple +particle vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 +particle vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 ^ ^ ^3 # setblock setblock ~ ~ ~ chest[facing=east] setblock ~ ~ ~-1 birch_sign{Text1: '"My chest"', Text2: '"Do not open!"'} diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt deleted file mode 100644 index 5de7865d2..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_19__0.txt +++ /dev/null @@ -1,59 +0,0 @@ -minecraft:entity 0 19 ---- -{'type': 'entities', 'amount': 'multiple'} ---- -@a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=61, lineno=1, colno=62) - variable: 'a' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - inverted: False - key: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'predicate' - value: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - is_tag: False - namespace: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: 'spgoding' - path: - - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - value: 'foo' - - location: SourceLocation(pos=31, lineno=1, colno=32) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - inverted: True - key: - - location: SourceLocation(pos=31, lineno=1, colno=32) - end_location: SourceLocation(pos=40, lineno=1, colno=41) - value: 'predicate' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - is_tag: False - namespace: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=53, lineno=1, colno=54) - value: 'spgoding' - path: - - location: SourceLocation(pos=54, lineno=1, colno=55) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt deleted file mode 100644 index 683f1fc3c..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_20__0.txt +++ /dev/null @@ -1,59 +0,0 @@ -minecraft:entity 0 20 ---- -{'type': 'entities', 'amount': 'multiple'} ---- -@a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=61, lineno=1, colno=62) - variable: 'a' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - inverted: False - key: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'predicate' - value: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - is_tag: False - namespace: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: 'spgoding' - path: - - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - value: 'foo' - - location: SourceLocation(pos=31, lineno=1, colno=32) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - inverted: True - key: - - location: SourceLocation(pos=31, lineno=1, colno=32) - end_location: SourceLocation(pos=40, lineno=1, colno=41) - value: 'predicate' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - is_tag: False - namespace: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=53, lineno=1, colno=54) - value: 'spgoding' - path: - - location: SourceLocation(pos=54, lineno=1, colno=55) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt new file mode 100644 index 000000000..b52cf98d6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt @@ -0,0 +1,21 @@ +minecraft:particle 0 0 +--- +{} +--- +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + parameters: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt new file mode 100644 index 000000000..309ef9a00 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt @@ -0,0 +1,25 @@ +minecraft:particle 0 1 +--- +{} +--- +foo:bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + path: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'bar' + parameters: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt new file mode 100644 index 000000000..fe934c7e7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt @@ -0,0 +1,44 @@ +minecraft:particle 0 2 +--- +{} +--- +dust 1.0 0.5 0.5 1.0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'dust' + parameters: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + red: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 1.0 + green: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 0.5 + blue: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 0.5 + size: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt new file mode 100644 index 000000000..5f92f64f1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt @@ -0,0 +1,63 @@ +minecraft:particle 0 3 +--- +{} +--- +minecraft:dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'minecraft' + path: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 'dust_color_transition' + parameters: + + location: SourceLocation(pos=32, lineno=1, colno=33) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + red: + + location: SourceLocation(pos=32, lineno=1, colno=33) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + value: 1.0 + green: + + location: SourceLocation(pos=36, lineno=1, colno=37) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 0.0 + blue: + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + value: 0.0 + size: + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + value: 1.0 + end_red: + + location: SourceLocation(pos=48, lineno=1, colno=49) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: 0.0 + end_green: + + location: SourceLocation(pos=52, lineno=1, colno=53) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + value: 0.0 + end_blue: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + value: 1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt new file mode 100644 index 000000000..0d2e5eb72 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt @@ -0,0 +1,58 @@ +minecraft:particle 0 4 +--- +{} +--- +block minecraft:grass_block[snowy=true] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'block' + parameters: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + block: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + is_tag: False + namespace: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'minecraft' + path: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'grass_block' + block_states: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + key: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + value: 'snowy' + value: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'true' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt new file mode 100644 index 000000000..a088db838 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt @@ -0,0 +1,75 @@ +minecraft:particle 0 5 +--- +{} +--- +falling_dust minecraft:grass_block[snowy=true]{hello: world} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'falling_dust' + parameters: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + block: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + identifier: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + is_tag: False + namespace: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: 'minecraft' + path: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + value: 'grass_block' + block_states: + + location: SourceLocation(pos=35, lineno=1, colno=36) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + key: + + location: SourceLocation(pos=35, lineno=1, colno=36) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + value: 'snowy' + value: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + value: 'true' + data_tags: + + location: SourceLocation(pos=46, lineno=1, colno=47) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + entries: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + key: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=52, lineno=1, colno=53) + value: 'hello' + value: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + value: String('world') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt new file mode 100644 index 000000000..863019c25 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt @@ -0,0 +1,44 @@ +minecraft:particle 0 6 +--- +{} +--- +item minecraft:apple +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'item' + parameters: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + item: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + is_tag: False + namespace: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'minecraft' + path: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'apple' + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt new file mode 100644 index 000000000..559f6d9c3 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt @@ -0,0 +1,61 @@ +minecraft:particle 0 7 +--- +{} +--- +item minecraft:apple{foo: bar} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'item' + parameters: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + item: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + is_tag: False + namespace: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'minecraft' + path: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'apple' + data_tags: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + entries: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + key: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: 'foo' + value: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + value: String('bar') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt new file mode 100644 index 000000000..9ac1df44e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt @@ -0,0 +1,59 @@ +minecraft:particle 0 8 +--- +{} +--- +vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + name: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'vibration' + parameters: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + x1: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0.0 + y1: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 64.0 + z1: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: 0.0 + x2: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 5.0 + y2: + + location: SourceLocation(pos=27, lineno=1, colno=28) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 64.0 + z2: + + location: SourceLocation(pos=32, lineno=1, colno=33) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + value: 0.0 + duration: + + location: SourceLocation(pos=36, lineno=1, colno=37) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 200 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt new file mode 100644 index 000000000..8f3c4a5f2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 0 +--- +{} +--- +dust 1.0 0.5 0.5 +--- +UnexpectedEOF: Expected number but reached end of file + +location = SourceLocation(pos=16, lineno=1, colno=17) +end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt new file mode 100644 index 000000000..ab724d130 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 1 +--- +{} +--- +minecraft:dust_color_transition 1.0 0.0 0.0 hello +--- +UnexpectedToken: Expected number but got literal 'hello' + +location = SourceLocation(pos=43, lineno=1, colno=44) +end_location = SourceLocation(pos=43, lineno=1, colno=44) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt new file mode 100644 index 000000000..9ab1e32c3 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 2 +--- +{} +--- +block minecraft:grass_block[snowy=] +--- +UnexpectedToken: Expected state but got bracket ']' + +location = SourceLocation(pos=34, lineno=1, colno=35) +end_location = SourceLocation(pos=34, lineno=1, colno=35) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt new file mode 100644 index 000000000..b16a570fb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 3 +--- +{} +--- +falling_dust grass_block[snowy=true]{hello: world wat} +--- +UnexpectedToken: Expected curly '}' but got string 'wat' + +location = SourceLocation(pos=49, lineno=1, colno=50) +end_location = SourceLocation(pos=49, lineno=1, colno=50) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt new file mode 100644 index 000000000..c7f238255 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 4 +--- +{} +--- +item minecraft:apple{ +--- +UnexpectedEOF: Expected curly '}' but reached end of file + +location = SourceLocation(pos=21, lineno=1, colno=22) +end_location = SourceLocation(pos=21, lineno=1, colno=22) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt new file mode 100644 index 000000000..e7499147b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 5 +--- +{} +--- +vibration 0.0 64.0 0.0 5.0 thing +--- +UnexpectedToken: Expected number but got literal 'thing' + +location = SourceLocation(pos=26, lineno=1, colno=27) +end_location = SourceLocation(pos=26, lineno=1, colno=27) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt new file mode 100644 index 000000000..d5bd4064d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt @@ -0,0 +1,10 @@ +minecraft:particle 1 6 +--- +{} +--- +vibration 0.0 64.0 +--- +UnexpectedEOF: Expected number but reached end of file + +location = SourceLocation(pos=18, lineno=1, colno=19) +end_location = SourceLocation(pos=18, lineno=1, colno=19) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt deleted file mode 100644 index 6cec4b0ed..000000000 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt +++ /dev/null @@ -1,41 +0,0 @@ -minecraft:score_holder 0 18 ---- -{'amount': 'multiple'} ---- -@a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=64, lineno=1, colno=65) - variable: 'a' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=30, lineno=1, colno=31) - inverted: False - key: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'x_rotation' - value: - - location: SourceLocation(pos=17, lineno=1, colno=18) - end_location: SourceLocation(pos=30, lineno=1, colno=31) - min: 179.9 - max: -179.9 - - location: SourceLocation(pos=34, lineno=1, colno=35) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - inverted: False - key: - - location: SourceLocation(pos=34, lineno=1, colno=35) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'x_rotation' - value: - - location: SourceLocation(pos=47, lineno=1, colno=48) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - min: 179.9 - max: -179.9 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index dd3ddf287..653824f69 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3806, lineno=107, colno=1) + end_location: SourceLocation(pos=5877, lineno=146, colno=1) filename: None commands: @@ -943,2195 +943,4763 @@ end_location: SourceLocation(pos=1185, lineno=30, colno=23) value: 5 - location: SourceLocation(pos=1199, lineno=32, colno=1) - end_location: SourceLocation(pos=1228, lineno=32, colno=30) + location: SourceLocation(pos=1196, lineno=32, colno=1) + end_location: SourceLocation(pos=1237, lineno=32, colno=42) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1204, lineno=32, colno=9) + end_location: SourceLocation(pos=1237, lineno=32, colno=42) + identifier: 'execute:align:axes:subcommand' + arguments: + + location: SourceLocation(pos=1210, lineno=32, colno=15) + end_location: SourceLocation(pos=1213, lineno=32, colno=18) + value: 'yxz' + + location: SourceLocation(pos=1214, lineno=32, colno=19) + end_location: SourceLocation(pos=1237, lineno=32, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1218, lineno=32, colno=23) + end_location: SourceLocation(pos=1237, lineno=32, colno=42) + identifier: 'spawnpoint:targets:pos' + arguments: + + location: SourceLocation(pos=1229, lineno=32, colno=34) + end_location: SourceLocation(pos=1231, lineno=32, colno=36) + variable: 'p' + arguments: + + + location: SourceLocation(pos=1232, lineno=32, colno=37) + end_location: SourceLocation(pos=1237, lineno=32, colno=42) + x: + + location: SourceLocation(pos=1232, lineno=32, colno=37) + end_location: SourceLocation(pos=1233, lineno=32, colno=38) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1234, lineno=32, colno=39) + end_location: SourceLocation(pos=1235, lineno=32, colno=40) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=1236, lineno=32, colno=41) + end_location: SourceLocation(pos=1237, lineno=32, colno=42) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1238, lineno=33, colno=1) + end_location: SourceLocation(pos=1272, lineno=33, colno=35) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1246, lineno=33, colno=9) + end_location: SourceLocation(pos=1272, lineno=33, colno=35) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=1255, lineno=33, colno=18) + end_location: SourceLocation(pos=1259, lineno=33, colno=22) + value: 'eyes' + + location: SourceLocation(pos=1260, lineno=33, colno=23) + end_location: SourceLocation(pos=1272, lineno=33, colno=35) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1264, lineno=33, colno=27) + end_location: SourceLocation(pos=1272, lineno=33, colno=35) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1267, lineno=33, colno=30) + end_location: SourceLocation(pos=1272, lineno=33, colno=35) + x: + + location: SourceLocation(pos=1267, lineno=33, colno=30) + end_location: SourceLocation(pos=1268, lineno=33, colno=31) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=1269, lineno=33, colno=32) + end_location: SourceLocation(pos=1270, lineno=33, colno=33) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=1271, lineno=33, colno=34) + end_location: SourceLocation(pos=1272, lineno=33, colno=35) + type: 'local' + value: 0 + + location: SourceLocation(pos=1273, lineno=34, colno=1) + end_location: SourceLocation(pos=1308, lineno=34, colno=36) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1281, lineno=34, colno=9) + end_location: SourceLocation(pos=1308, lineno=34, colno=36) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=1290, lineno=34, colno=18) + end_location: SourceLocation(pos=1294, lineno=34, colno=22) + value: 'eyes' + + location: SourceLocation(pos=1295, lineno=34, colno=23) + end_location: SourceLocation(pos=1308, lineno=34, colno=36) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1299, lineno=34, colno=27) + end_location: SourceLocation(pos=1308, lineno=34, colno=36) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1302, lineno=34, colno=30) + end_location: SourceLocation(pos=1308, lineno=34, colno=36) + x: + + location: SourceLocation(pos=1302, lineno=34, colno=30) + end_location: SourceLocation(pos=1304, lineno=34, colno=32) + type: 'local' + value: 5 + y: + + location: SourceLocation(pos=1305, lineno=34, colno=33) + end_location: SourceLocation(pos=1306, lineno=34, colno=34) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=1307, lineno=34, colno=35) + end_location: SourceLocation(pos=1308, lineno=34, colno=36) + type: 'local' + value: 0 + + location: SourceLocation(pos=1309, lineno=35, colno=1) + end_location: SourceLocation(pos=1357, lineno=35, colno=49) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1317, lineno=35, colno=9) + end_location: SourceLocation(pos=1357, lineno=35, colno=49) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1320, lineno=35, colno=12) + end_location: SourceLocation(pos=1334, lineno=35, colno=26) + variable: 'e' + arguments: + + location: SourceLocation(pos=1323, lineno=35, colno=15) + end_location: SourceLocation(pos=1333, lineno=35, colno=25) + inverted: False + key: + + location: SourceLocation(pos=1323, lineno=35, colno=15) + end_location: SourceLocation(pos=1327, lineno=35, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=1328, lineno=35, colno=20) + end_location: SourceLocation(pos=1333, lineno=35, colno=25) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1328, lineno=35, colno=20) + end_location: SourceLocation(pos=1333, lineno=35, colno=25) + value: 'sheep' + + location: SourceLocation(pos=1335, lineno=35, colno=27) + end_location: SourceLocation(pos=1357, lineno=35, colno=49) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1339, lineno=35, colno=31) + end_location: SourceLocation(pos=1357, lineno=35, colno=49) + identifier: 'data:get:entity:target' + arguments: + + location: SourceLocation(pos=1355, lineno=35, colno=47) + end_location: SourceLocation(pos=1357, lineno=35, colno=49) + variable: 's' + arguments: + + + location: SourceLocation(pos=1358, lineno=36, colno=1) + end_location: SourceLocation(pos=1429, lineno=36, colno=72) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1366, lineno=36, colno=9) + end_location: SourceLocation(pos=1429, lineno=36, colno=72) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1369, lineno=36, colno=12) + end_location: SourceLocation(pos=1386, lineno=36, colno=29) + variable: 'e' + arguments: + + location: SourceLocation(pos=1372, lineno=36, colno=15) + end_location: SourceLocation(pos=1385, lineno=36, colno=28) + inverted: False + key: + + location: SourceLocation(pos=1372, lineno=36, colno=15) + end_location: SourceLocation(pos=1376, lineno=36, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=1377, lineno=36, colno=20) + end_location: SourceLocation(pos=1385, lineno=36, colno=28) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1377, lineno=36, colno=20) + end_location: SourceLocation(pos=1385, lineno=36, colno=28) + value: 'villager' + + location: SourceLocation(pos=1387, lineno=36, colno=30) + end_location: SourceLocation(pos=1429, lineno=36, colno=72) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1391, lineno=36, colno=34) + end_location: SourceLocation(pos=1429, lineno=36, colno=72) + identifier: 'data:merge:entity:target:nbt' + arguments: + + location: SourceLocation(pos=1409, lineno=36, colno=52) + end_location: SourceLocation(pos=1411, lineno=36, colno=54) + variable: 's' + arguments: + + + location: SourceLocation(pos=1412, lineno=36, colno=55) + end_location: SourceLocation(pos=1429, lineno=36, colno=72) + entries: + + location: SourceLocation(pos=1413, lineno=36, colno=56) + end_location: SourceLocation(pos=1428, lineno=36, colno=71) + key: + + location: SourceLocation(pos=1413, lineno=36, colno=56) + end_location: SourceLocation(pos=1425, lineno=36, colno=68) + value: 'Invulnerable' + value: + + location: SourceLocation(pos=1427, lineno=36, colno=70) + end_location: SourceLocation(pos=1428, lineno=36, colno=71) + value: Int(1) + + location: SourceLocation(pos=1430, lineno=37, colno=1) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1438, lineno=37, colno=9) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1441, lineno=37, colno=12) + end_location: SourceLocation(pos=1455, lineno=37, colno=26) + variable: 'e' + arguments: + + location: SourceLocation(pos=1444, lineno=37, colno=15) + end_location: SourceLocation(pos=1454, lineno=37, colno=25) + inverted: False + key: + + location: SourceLocation(pos=1444, lineno=37, colno=15) + end_location: SourceLocation(pos=1448, lineno=37, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=1449, lineno=37, colno=20) + end_location: SourceLocation(pos=1454, lineno=37, colno=25) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1449, lineno=37, colno=20) + end_location: SourceLocation(pos=1454, lineno=37, colno=25) + value: 'sheep' + + location: SourceLocation(pos=1456, lineno=37, colno=27) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=1459, lineno=37, colno=30) + end_location: SourceLocation(pos=1461, lineno=37, colno=32) + variable: 's' + arguments: + + + location: SourceLocation(pos=1462, lineno=37, colno=33) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1466, lineno=37, colno=37) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1469, lineno=37, colno=40) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + x: + + location: SourceLocation(pos=1469, lineno=37, colno=40) + end_location: SourceLocation(pos=1470, lineno=37, colno=41) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1471, lineno=37, colno=42) + end_location: SourceLocation(pos=1473, lineno=37, colno=44) + type: 'relative' + value: 1 + z: + + location: SourceLocation(pos=1474, lineno=37, colno=45) + end_location: SourceLocation(pos=1475, lineno=37, colno=46) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1476, lineno=38, colno=1) + end_location: SourceLocation(pos=1513, lineno=38, colno=38) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1484, lineno=38, colno=9) + end_location: SourceLocation(pos=1513, lineno=38, colno=38) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=1487, lineno=38, colno=12) + end_location: SourceLocation(pos=1501, lineno=38, colno=26) + variable: 'e' + arguments: + + location: SourceLocation(pos=1490, lineno=38, colno=15) + end_location: SourceLocation(pos=1500, lineno=38, colno=25) + inverted: False + key: + + location: SourceLocation(pos=1490, lineno=38, colno=15) + end_location: SourceLocation(pos=1494, lineno=38, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=1495, lineno=38, colno=20) + end_location: SourceLocation(pos=1500, lineno=38, colno=25) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1495, lineno=38, colno=20) + end_location: SourceLocation(pos=1500, lineno=38, colno=25) + value: 'sheep' + + location: SourceLocation(pos=1502, lineno=38, colno=27) + end_location: SourceLocation(pos=1513, lineno=38, colno=38) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1506, lineno=38, colno=31) + end_location: SourceLocation(pos=1513, lineno=38, colno=38) + identifier: 'kill:targets' + arguments: + + location: SourceLocation(pos=1511, lineno=38, colno=36) + end_location: SourceLocation(pos=1513, lineno=38, colno=38) + variable: 's' + arguments: + + + location: SourceLocation(pos=1514, lineno=39, colno=1) + end_location: SourceLocation(pos=1548, lineno=39, colno=35) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1522, lineno=39, colno=9) + end_location: SourceLocation(pos=1548, lineno=39, colno=35) + identifier: 'execute:facing:pos:subcommand' + arguments: + + location: SourceLocation(pos=1529, lineno=39, colno=16) + end_location: SourceLocation(pos=1535, lineno=39, colno=22) + x: + + location: SourceLocation(pos=1529, lineno=39, colno=16) + end_location: SourceLocation(pos=1531, lineno=39, colno=18) + type: 'local' + value: 1 + y: + + location: SourceLocation(pos=1532, lineno=39, colno=19) + end_location: SourceLocation(pos=1533, lineno=39, colno=20) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=1534, lineno=39, colno=21) + end_location: SourceLocation(pos=1535, lineno=39, colno=22) + type: 'local' + value: 0 + + location: SourceLocation(pos=1536, lineno=39, colno=23) + end_location: SourceLocation(pos=1548, lineno=39, colno=35) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1540, lineno=39, colno=27) + end_location: SourceLocation(pos=1548, lineno=39, colno=35) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1543, lineno=39, colno=30) + end_location: SourceLocation(pos=1548, lineno=39, colno=35) + x: + + location: SourceLocation(pos=1543, lineno=39, colno=30) + end_location: SourceLocation(pos=1544, lineno=39, colno=31) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1545, lineno=39, colno=32) + end_location: SourceLocation(pos=1546, lineno=39, colno=33) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=1547, lineno=39, colno=34) + end_location: SourceLocation(pos=1548, lineno=39, colno=35) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1549, lineno=40, colno=1) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1557, lineno=40, colno=9) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1560, lineno=40, colno=12) + end_location: SourceLocation(pos=1562, lineno=40, colno=14) + variable: 'e' + arguments: + + + location: SourceLocation(pos=1563, lineno=40, colno=15) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=1566, lineno=40, colno=18) + end_location: SourceLocation(pos=1568, lineno=40, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=1569, lineno=40, colno=21) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + identifier: 'execute:facing:pos:subcommand' + arguments: + + location: SourceLocation(pos=1576, lineno=40, colno=28) + end_location: SourceLocation(pos=1582, lineno=40, colno=34) + x: + + location: SourceLocation(pos=1576, lineno=40, colno=28) + end_location: SourceLocation(pos=1577, lineno=40, colno=29) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=1578, lineno=40, colno=30) + end_location: SourceLocation(pos=1580, lineno=40, colno=32) + type: 'absolute' + value: 64 + z: + + location: SourceLocation(pos=1581, lineno=40, colno=33) + end_location: SourceLocation(pos=1582, lineno=40, colno=34) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=1583, lineno=40, colno=35) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1587, lineno=40, colno=39) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + identifier: 'tp:targets:location' + arguments: + + location: SourceLocation(pos=1590, lineno=40, colno=42) + end_location: SourceLocation(pos=1592, lineno=40, colno=44) + variable: 's' + arguments: + + + location: SourceLocation(pos=1590, lineno=40, colno=42) + end_location: SourceLocation(pos=1592, lineno=40, colno=44) + variable: 's' + arguments: + + + location: SourceLocation(pos=1593, lineno=40, colno=45) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + x: + + location: SourceLocation(pos=1593, lineno=40, colno=45) + end_location: SourceLocation(pos=1594, lineno=40, colno=46) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=1595, lineno=40, colno=47) + end_location: SourceLocation(pos=1596, lineno=40, colno=48) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=1597, lineno=40, colno=49) + end_location: SourceLocation(pos=1599, lineno=40, colno=51) + type: 'local' + value: 1 + + location: SourceLocation(pos=1600, lineno=41, colno=1) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1608, lineno=41, colno=9) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1611, lineno=41, colno=12) + end_location: SourceLocation(pos=1613, lineno=41, colno=14) + variable: 'e' + arguments: + + + location: SourceLocation(pos=1614, lineno=41, colno=15) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=1617, lineno=41, colno=18) + end_location: SourceLocation(pos=1619, lineno=41, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=1620, lineno=41, colno=21) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + identifier: 'execute:facing:pos:subcommand' + arguments: + + location: SourceLocation(pos=1627, lineno=41, colno=28) + end_location: SourceLocation(pos=1633, lineno=41, colno=34) + x: + + location: SourceLocation(pos=1627, lineno=41, colno=28) + end_location: SourceLocation(pos=1628, lineno=41, colno=29) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=1629, lineno=41, colno=30) + end_location: SourceLocation(pos=1631, lineno=41, colno=32) + type: 'absolute' + value: 64 + z: + + location: SourceLocation(pos=1632, lineno=41, colno=33) + end_location: SourceLocation(pos=1633, lineno=41, colno=34) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=1634, lineno=41, colno=35) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1638, lineno=41, colno=39) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + identifier: 'tp:targets:location:rotation' + arguments: + + location: SourceLocation(pos=1641, lineno=41, colno=42) + end_location: SourceLocation(pos=1643, lineno=41, colno=44) + variable: 's' + arguments: + + + location: SourceLocation(pos=1641, lineno=41, colno=42) + end_location: SourceLocation(pos=1643, lineno=41, colno=44) + variable: 's' + arguments: + + + location: SourceLocation(pos=1644, lineno=41, colno=45) + end_location: SourceLocation(pos=1650, lineno=41, colno=51) + x: + + location: SourceLocation(pos=1644, lineno=41, colno=45) + end_location: SourceLocation(pos=1645, lineno=41, colno=46) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=1646, lineno=41, colno=47) + end_location: SourceLocation(pos=1647, lineno=41, colno=48) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=1648, lineno=41, colno=49) + end_location: SourceLocation(pos=1650, lineno=41, colno=51) + type: 'local' + value: 1 + + location: SourceLocation(pos=1651, lineno=41, colno=52) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + x: + + location: SourceLocation(pos=1651, lineno=41, colno=52) + end_location: SourceLocation(pos=1652, lineno=41, colno=53) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1653, lineno=41, colno=54) + end_location: SourceLocation(pos=1654, lineno=41, colno=55) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1655, lineno=42, colno=1) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1663, lineno=42, colno=9) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1666, lineno=42, colno=12) + end_location: SourceLocation(pos=1682, lineno=42, colno=28) + variable: 'e' + arguments: + + location: SourceLocation(pos=1669, lineno=42, colno=15) + end_location: SourceLocation(pos=1681, lineno=42, colno=27) + inverted: True + key: + + location: SourceLocation(pos=1669, lineno=42, colno=15) + end_location: SourceLocation(pos=1673, lineno=42, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=1675, lineno=42, colno=21) + end_location: SourceLocation(pos=1681, lineno=42, colno=27) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1675, lineno=42, colno=21) + end_location: SourceLocation(pos=1681, lineno=42, colno=27) + value: 'player' + + location: SourceLocation(pos=1683, lineno=42, colno=29) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=1686, lineno=42, colno=32) + end_location: SourceLocation(pos=1688, lineno=42, colno=34) + variable: 's' + arguments: + + + location: SourceLocation(pos=1689, lineno=42, colno=35) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + identifier: 'execute:facing:entity:targets:anchor:subcommand' + arguments: + + location: SourceLocation(pos=1703, lineno=42, colno=49) + end_location: SourceLocation(pos=1705, lineno=42, colno=51) + variable: 'p' + arguments: + + + location: SourceLocation(pos=1706, lineno=42, colno=52) + end_location: SourceLocation(pos=1710, lineno=42, colno=56) + value: 'feet' + + location: SourceLocation(pos=1711, lineno=42, colno=57) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1715, lineno=42, colno=61) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + identifier: 'tp:targets:location' + arguments: + + location: SourceLocation(pos=1718, lineno=42, colno=64) + end_location: SourceLocation(pos=1720, lineno=42, colno=66) + variable: 's' + arguments: + + + location: SourceLocation(pos=1718, lineno=42, colno=64) + end_location: SourceLocation(pos=1720, lineno=42, colno=66) + variable: 's' + arguments: + + + location: SourceLocation(pos=1721, lineno=42, colno=67) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + x: + + location: SourceLocation(pos=1721, lineno=42, colno=67) + end_location: SourceLocation(pos=1722, lineno=42, colno=68) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=1723, lineno=42, colno=69) + end_location: SourceLocation(pos=1724, lineno=42, colno=70) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=1725, lineno=42, colno=71) + end_location: SourceLocation(pos=1727, lineno=42, colno=73) + type: 'local' + value: 1 + + location: SourceLocation(pos=1728, lineno=43, colno=1) + end_location: SourceLocation(pos=1765, lineno=43, colno=38) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1736, lineno=43, colno=9) + end_location: SourceLocation(pos=1765, lineno=43, colno=38) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=1739, lineno=43, colno=12) + end_location: SourceLocation(pos=1746, lineno=43, colno=19) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1739, lineno=43, colno=12) + end_location: SourceLocation(pos=1746, lineno=43, colno=19) + value: 'the_end' + + location: SourceLocation(pos=1747, lineno=43, colno=20) + end_location: SourceLocation(pos=1765, lineno=43, colno=38) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1751, lineno=43, colno=24) + end_location: SourceLocation(pos=1765, lineno=43, colno=38) + identifier: 'locate:endcity' + arguments: + + + location: SourceLocation(pos=1766, lineno=44, colno=1) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1774, lineno=44, colno=9) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=1777, lineno=44, colno=12) + end_location: SourceLocation(pos=1797, lineno=44, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=1777, lineno=44, colno=12) + end_location: SourceLocation(pos=1786, lineno=44, colno=21) + value: 'minecraft' + path: + + location: SourceLocation(pos=1787, lineno=44, colno=22) + end_location: SourceLocation(pos=1797, lineno=44, colno=32) + value: 'the_nether' + + location: SourceLocation(pos=1798, lineno=44, colno=33) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + identifier: 'execute:positioned:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1812, lineno=44, colno=47) + end_location: SourceLocation(pos=1814, lineno=44, colno=49) + variable: 's' + arguments: + + + location: SourceLocation(pos=1815, lineno=44, colno=50) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1819, lineno=44, colno=54) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1822, lineno=44, colno=57) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + x: + + location: SourceLocation(pos=1822, lineno=44, colno=57) + end_location: SourceLocation(pos=1823, lineno=44, colno=58) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1824, lineno=44, colno=59) + end_location: SourceLocation(pos=1825, lineno=44, colno=60) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=1826, lineno=44, colno=61) + end_location: SourceLocation(pos=1827, lineno=44, colno=62) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1828, lineno=45, colno=1) + end_location: SourceLocation(pos=1872, lineno=45, colno=45) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1836, lineno=45, colno=9) + end_location: SourceLocation(pos=1872, lineno=45, colno=45) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=1839, lineno=45, colno=12) + end_location: SourceLocation(pos=1859, lineno=45, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=1839, lineno=45, colno=12) + end_location: SourceLocation(pos=1848, lineno=45, colno=21) + value: 'minecraft' + path: + + location: SourceLocation(pos=1849, lineno=45, colno=22) + end_location: SourceLocation(pos=1859, lineno=45, colno=32) + value: 'the_nether' + + location: SourceLocation(pos=1860, lineno=45, colno=33) + end_location: SourceLocation(pos=1872, lineno=45, colno=45) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1864, lineno=45, colno=37) + end_location: SourceLocation(pos=1872, lineno=45, colno=45) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1867, lineno=45, colno=40) + end_location: SourceLocation(pos=1872, lineno=45, colno=45) + x: + + location: SourceLocation(pos=1867, lineno=45, colno=40) + end_location: SourceLocation(pos=1868, lineno=45, colno=41) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1869, lineno=45, colno=42) + end_location: SourceLocation(pos=1870, lineno=45, colno=43) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=1871, lineno=45, colno=44) + end_location: SourceLocation(pos=1872, lineno=45, colno=45) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1873, lineno=46, colno=1) + end_location: SourceLocation(pos=1918, lineno=46, colno=46) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1881, lineno=46, colno=9) + end_location: SourceLocation(pos=1918, lineno=46, colno=46) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=1884, lineno=46, colno=12) + end_location: SourceLocation(pos=1904, lineno=46, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=1884, lineno=46, colno=12) + end_location: SourceLocation(pos=1893, lineno=46, colno=21) + value: 'minecraft' + path: + + location: SourceLocation(pos=1894, lineno=46, colno=22) + end_location: SourceLocation(pos=1904, lineno=46, colno=32) + value: 'the_nether' + + location: SourceLocation(pos=1905, lineno=46, colno=33) + end_location: SourceLocation(pos=1918, lineno=46, colno=46) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1909, lineno=46, colno=37) + end_location: SourceLocation(pos=1918, lineno=46, colno=46) + identifier: 'tp:location' + arguments: + + location: SourceLocation(pos=1912, lineno=46, colno=40) + end_location: SourceLocation(pos=1918, lineno=46, colno=46) + x: + + location: SourceLocation(pos=1912, lineno=46, colno=40) + end_location: SourceLocation(pos=1913, lineno=46, colno=41) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1914, lineno=46, colno=42) + end_location: SourceLocation(pos=1915, lineno=46, colno=43) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=1916, lineno=46, colno=44) + end_location: SourceLocation(pos=1918, lineno=46, colno=46) + type: 'relative' + value: 5 + + location: SourceLocation(pos=1919, lineno=47, colno=1) + end_location: SourceLocation(pos=1963, lineno=47, colno=45) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1927, lineno=47, colno=9) + end_location: SourceLocation(pos=1963, lineno=47, colno=45) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=1938, lineno=47, colno=20) + end_location: SourceLocation(pos=1944, lineno=47, colno=26) + x: + + location: SourceLocation(pos=1938, lineno=47, colno=20) + end_location: SourceLocation(pos=1939, lineno=47, colno=21) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=1940, lineno=47, colno=22) + end_location: SourceLocation(pos=1942, lineno=47, colno=24) + type: 'absolute' + value: 64 + z: + + location: SourceLocation(pos=1943, lineno=47, colno=25) + end_location: SourceLocation(pos=1944, lineno=47, colno=26) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=1945, lineno=47, colno=27) + end_location: SourceLocation(pos=1963, lineno=47, colno=45) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1949, lineno=47, colno=31) + end_location: SourceLocation(pos=1963, lineno=47, colno=45) + identifier: 'locate:village' + arguments: + + + location: SourceLocation(pos=1964, lineno=48, colno=1) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1972, lineno=48, colno=9) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1975, lineno=48, colno=12) + end_location: SourceLocation(pos=1989, lineno=48, colno=26) + variable: 'e' + arguments: + + location: SourceLocation(pos=1978, lineno=48, colno=15) + end_location: SourceLocation(pos=1988, lineno=48, colno=25) + inverted: False + key: + + location: SourceLocation(pos=1978, lineno=48, colno=15) + end_location: SourceLocation(pos=1982, lineno=48, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=1983, lineno=48, colno=20) + end_location: SourceLocation(pos=1988, lineno=48, colno=25) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=1983, lineno=48, colno=20) + end_location: SourceLocation(pos=1988, lineno=48, colno=25) + value: 'sheep' + + location: SourceLocation(pos=1990, lineno=48, colno=27) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=1993, lineno=48, colno=30) + end_location: SourceLocation(pos=1995, lineno=48, colno=32) + variable: 's' + arguments: + + + location: SourceLocation(pos=1996, lineno=48, colno=33) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + identifier: 'execute:rotated:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2007, lineno=48, colno=44) + end_location: SourceLocation(pos=2009, lineno=48, colno=46) + variable: 'p' + arguments: + + + location: SourceLocation(pos=2010, lineno=48, colno=47) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2014, lineno=48, colno=51) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + identifier: 'tp:targets:location' + arguments: + + location: SourceLocation(pos=2017, lineno=48, colno=54) + end_location: SourceLocation(pos=2019, lineno=48, colno=56) + variable: 's' + arguments: + + + location: SourceLocation(pos=2017, lineno=48, colno=54) + end_location: SourceLocation(pos=2019, lineno=48, colno=56) + variable: 's' + arguments: + + + location: SourceLocation(pos=2020, lineno=48, colno=57) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + x: + + location: SourceLocation(pos=2020, lineno=48, colno=57) + end_location: SourceLocation(pos=2021, lineno=48, colno=58) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=2022, lineno=48, colno=59) + end_location: SourceLocation(pos=2023, lineno=48, colno=60) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=2024, lineno=48, colno=61) + end_location: SourceLocation(pos=2026, lineno=48, colno=63) + type: 'local' + value: 1 + + location: SourceLocation(pos=2027, lineno=49, colno=1) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2035, lineno=49, colno=9) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2038, lineno=49, colno=12) + end_location: SourceLocation(pos=2052, lineno=49, colno=26) + variable: 'e' + arguments: + + location: SourceLocation(pos=2041, lineno=49, colno=15) + end_location: SourceLocation(pos=2051, lineno=49, colno=25) + inverted: False + key: + + location: SourceLocation(pos=2041, lineno=49, colno=15) + end_location: SourceLocation(pos=2045, lineno=49, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=2046, lineno=49, colno=20) + end_location: SourceLocation(pos=2051, lineno=49, colno=25) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2046, lineno=49, colno=20) + end_location: SourceLocation(pos=2051, lineno=49, colno=25) + value: 'sheep' + + location: SourceLocation(pos=2053, lineno=49, colno=27) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + identifier: 'execute:positioned:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2067, lineno=49, colno=41) + end_location: SourceLocation(pos=2069, lineno=49, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=2070, lineno=49, colno=44) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + identifier: 'execute:rotated:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2081, lineno=49, colno=55) + end_location: SourceLocation(pos=2083, lineno=49, colno=57) + variable: 'p' + arguments: + + + location: SourceLocation(pos=2084, lineno=49, colno=58) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2088, lineno=49, colno=62) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + identifier: 'tp:targets:location' + arguments: + + location: SourceLocation(pos=2091, lineno=49, colno=65) + end_location: SourceLocation(pos=2093, lineno=49, colno=67) + variable: 's' + arguments: + + + location: SourceLocation(pos=2091, lineno=49, colno=65) + end_location: SourceLocation(pos=2093, lineno=49, colno=67) + variable: 's' + arguments: + + + location: SourceLocation(pos=2094, lineno=49, colno=68) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + x: + + location: SourceLocation(pos=2094, lineno=49, colno=68) + end_location: SourceLocation(pos=2095, lineno=49, colno=69) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=2096, lineno=49, colno=70) + end_location: SourceLocation(pos=2097, lineno=49, colno=71) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=2098, lineno=49, colno=72) + end_location: SourceLocation(pos=2100, lineno=49, colno=74) + type: 'local' + value: 1 + + location: SourceLocation(pos=2101, lineno=50, colno=1) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2109, lineno=50, colno=9) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2112, lineno=50, colno=12) + end_location: SourceLocation(pos=2114, lineno=50, colno=14) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2115, lineno=50, colno=15) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=2118, lineno=50, colno=18) + end_location: SourceLocation(pos=2120, lineno=50, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=2121, lineno=50, colno=21) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=2130, lineno=50, colno=30) + end_location: SourceLocation(pos=2137, lineno=50, colno=37) + x: + + location: SourceLocation(pos=2130, lineno=50, colno=30) + end_location: SourceLocation(pos=2131, lineno=50, colno=31) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=2132, lineno=50, colno=32) + end_location: SourceLocation(pos=2135, lineno=50, colno=35) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=2136, lineno=50, colno=36) + end_location: SourceLocation(pos=2137, lineno=50, colno=37) + type: 'relative' + value: 0 + + location: SourceLocation(pos=2138, lineno=50, colno=38) + end_location: SourceLocation(pos=2143, lineno=50, colno=43) + identifier: + + location: SourceLocation(pos=2138, lineno=50, colno=38) + end_location: SourceLocation(pos=2143, lineno=50, colno=43) + is_tag: True + namespace: None + path: + + location: SourceLocation(pos=2139, lineno=50, colno=39) + end_location: SourceLocation(pos=2143, lineno=50, colno=43) + value: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=2144, lineno=50, colno=44) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2148, lineno=50, colno=48) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + identifier: 'kill:targets' + arguments: + + location: SourceLocation(pos=2153, lineno=50, colno=53) + end_location: SourceLocation(pos=2155, lineno=50, colno=55) + variable: 's' + arguments: + + + location: SourceLocation(pos=2156, lineno=51, colno=1) + end_location: SourceLocation(pos=2184, lineno=51, colno=29) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2164, lineno=51, colno=9) + end_location: SourceLocation(pos=2184, lineno=51, colno=29) + identifier: 'execute:if:score:target:targetObjective:=:source:sourceObjective' + arguments: + + location: SourceLocation(pos=2173, lineno=51, colno=18) + end_location: SourceLocation(pos=2175, lineno=51, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=2176, lineno=51, colno=21) + end_location: SourceLocation(pos=2177, lineno=51, colno=22) + value: 'A' + + location: SourceLocation(pos=2180, lineno=51, colno=25) + end_location: SourceLocation(pos=2182, lineno=51, colno=27) + variable: 's' + arguments: + + + location: SourceLocation(pos=2183, lineno=51, colno=28) + end_location: SourceLocation(pos=2184, lineno=51, colno=29) + value: 'B' + + location: SourceLocation(pos=2185, lineno=52, colno=1) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2193, lineno=52, colno=9) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2196, lineno=52, colno=12) + end_location: SourceLocation(pos=2198, lineno=52, colno=14) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2199, lineno=52, colno=15) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + identifier: 'execute:if:data:entity:source:path:subcommand' + arguments: + + location: SourceLocation(pos=2214, lineno=52, colno=30) + end_location: SourceLocation(pos=2216, lineno=52, colno=32) + variable: 's' + arguments: + + + location: SourceLocation(pos=2217, lineno=52, colno=33) + end_location: SourceLocation(pos=2285, lineno=52, colno=101) + components: + + location: SourceLocation(pos=2217, lineno=52, colno=33) + end_location: SourceLocation(pos=2226, lineno=52, colno=42) + value: 'Inventory' + + location: SourceLocation(pos=2226, lineno=52, colno=42) + end_location: SourceLocation(pos=2238, lineno=52, colno=54) + index: + + location: SourceLocation(pos=2227, lineno=52, colno=43) + end_location: SourceLocation(pos=2237, lineno=52, colno=53) + entries: + + location: SourceLocation(pos=2228, lineno=52, colno=44) + end_location: SourceLocation(pos=2236, lineno=52, colno=52) + key: + + location: SourceLocation(pos=2228, lineno=52, colno=44) + end_location: SourceLocation(pos=2232, lineno=52, colno=48) + value: 'Slot' + value: + + location: SourceLocation(pos=2234, lineno=52, colno=50) + end_location: SourceLocation(pos=2236, lineno=52, colno=52) + value: Byte(0) + + location: SourceLocation(pos=2239, lineno=52, colno=55) + end_location: SourceLocation(pos=2242, lineno=52, colno=58) + value: 'tag' + + location: SourceLocation(pos=2243, lineno=52, colno=59) + end_location: SourceLocation(pos=2255, lineno=52, colno=71) + value: 'Enchantments' + + location: SourceLocation(pos=2255, lineno=52, colno=71) + end_location: SourceLocation(pos=2285, lineno=52, colno=101) + index: + + location: SourceLocation(pos=2256, lineno=52, colno=72) + end_location: SourceLocation(pos=2284, lineno=52, colno=100) + entries: + + location: SourceLocation(pos=2257, lineno=52, colno=73) + end_location: SourceLocation(pos=2283, lineno=52, colno=99) + key: + + location: SourceLocation(pos=2257, lineno=52, colno=73) + end_location: SourceLocation(pos=2259, lineno=52, colno=75) + value: 'id' + value: + + location: SourceLocation(pos=2261, lineno=52, colno=77) + end_location: SourceLocation(pos=2283, lineno=52, colno=99) + value: String('minecraft:efficiency') + + location: SourceLocation(pos=2286, lineno=52, colno=102) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2290, lineno=52, colno=106) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + identifier: 'tp:targets:location' + arguments: + + location: SourceLocation(pos=2293, lineno=52, colno=109) + end_location: SourceLocation(pos=2295, lineno=52, colno=111) + variable: 's' + arguments: + + + location: SourceLocation(pos=2293, lineno=52, colno=109) + end_location: SourceLocation(pos=2295, lineno=52, colno=111) + variable: 's' + arguments: + + + location: SourceLocation(pos=2296, lineno=52, colno=112) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + x: + + location: SourceLocation(pos=2296, lineno=52, colno=112) + end_location: SourceLocation(pos=2297, lineno=52, colno=113) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=2298, lineno=52, colno=114) + end_location: SourceLocation(pos=2300, lineno=52, colno=116) + type: 'absolute' + value: 64 + z: + + location: SourceLocation(pos=2301, lineno=52, colno=117) + end_location: SourceLocation(pos=2302, lineno=52, colno=118) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=2303, lineno=53, colno=1) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2311, lineno=53, colno=9) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2314, lineno=53, colno=12) + end_location: SourceLocation(pos=2316, lineno=53, colno=14) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2317, lineno=53, colno=15) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=2320, lineno=53, colno=18) + end_location: SourceLocation(pos=2322, lineno=53, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=2323, lineno=53, colno=21) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=2332, lineno=53, colno=30) + end_location: SourceLocation(pos=2336, lineno=53, colno=34) + value: 'eyes' + + location: SourceLocation(pos=2337, lineno=53, colno=35) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2341, lineno=53, colno=39) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + identifier: 'particle:name:pos' + arguments: + + location: SourceLocation(pos=2350, lineno=53, colno=48) + end_location: SourceLocation(pos=2355, lineno=53, colno=53) + name: + + location: SourceLocation(pos=2350, lineno=53, colno=48) + end_location: SourceLocation(pos=2355, lineno=53, colno=53) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2350, lineno=53, colno=48) + end_location: SourceLocation(pos=2355, lineno=53, colno=53) + value: 'smoke' + parameters: None + + location: SourceLocation(pos=2356, lineno=53, colno=54) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + x: + + location: SourceLocation(pos=2356, lineno=53, colno=54) + end_location: SourceLocation(pos=2357, lineno=53, colno=55) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=2358, lineno=53, colno=56) + end_location: SourceLocation(pos=2359, lineno=53, colno=57) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=2360, lineno=53, colno=58) + end_location: SourceLocation(pos=2362, lineno=53, colno=60) + type: 'local' + value: 3 + + location: SourceLocation(pos=2363, lineno=54, colno=1) + end_location: SourceLocation(pos=2457, lineno=54, colno=95) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2371, lineno=54, colno=9) + end_location: SourceLocation(pos=2457, lineno=54, colno=95) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2374, lineno=54, colno=12) + end_location: SourceLocation(pos=2386, lineno=54, colno=24) + variable: 'e' + arguments: + + location: SourceLocation(pos=2377, lineno=54, colno=15) + end_location: SourceLocation(pos=2385, lineno=54, colno=23) + inverted: False + key: + + location: SourceLocation(pos=2377, lineno=54, colno=15) + end_location: SourceLocation(pos=2381, lineno=54, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=2382, lineno=54, colno=20) + end_location: SourceLocation(pos=2385, lineno=54, colno=23) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2382, lineno=54, colno=20) + end_location: SourceLocation(pos=2385, lineno=54, colno=23) + value: 'pig' + + location: SourceLocation(pos=2387, lineno=54, colno=25) + end_location: SourceLocation(pos=2457, lineno=54, colno=95) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=2390, lineno=54, colno=28) + end_location: SourceLocation(pos=2392, lineno=54, colno=30) + variable: 's' + arguments: + + + location: SourceLocation(pos=2393, lineno=54, colno=31) + end_location: SourceLocation(pos=2457, lineno=54, colno=95) + identifier: 'execute:store:success:entity:target:path:byte:scale:subcommand' + arguments: + + location: SourceLocation(pos=2414, lineno=54, colno=52) + end_location: SourceLocation(pos=2416, lineno=54, colno=54) + variable: 's' + arguments: + + + location: SourceLocation(pos=2417, lineno=54, colno=55) + end_location: SourceLocation(pos=2423, lineno=54, colno=61) + components: + + location: SourceLocation(pos=2417, lineno=54, colno=55) + end_location: SourceLocation(pos=2423, lineno=54, colno=61) + value: 'Saddle' + + location: SourceLocation(pos=2429, lineno=54, colno=67) + end_location: SourceLocation(pos=2430, lineno=54, colno=68) + value: 1 + + location: SourceLocation(pos=2431, lineno=54, colno=69) + end_location: SourceLocation(pos=2457, lineno=54, colno=95) + identifier: 'execute:if:entity:entities' + arguments: + + location: SourceLocation(pos=2441, lineno=54, colno=79) + end_location: SourceLocation(pos=2457, lineno=54, colno=95) + variable: 'p' + arguments: + + location: SourceLocation(pos=2444, lineno=54, colno=82) + end_location: SourceLocation(pos=2456, lineno=54, colno=94) + inverted: False + key: + + location: SourceLocation(pos=2444, lineno=54, colno=82) + end_location: SourceLocation(pos=2452, lineno=54, colno=90) + value: 'distance' + value: + + location: SourceLocation(pos=2453, lineno=54, colno=91) + end_location: SourceLocation(pos=2456, lineno=54, colno=94) + min: None + max: 5.0 + + location: SourceLocation(pos=2458, lineno=55, colno=1) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2466, lineno=55, colno=9) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2469, lineno=55, colno=12) + end_location: SourceLocation(pos=2471, lineno=55, colno=14) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2472, lineno=55, colno=15) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=2475, lineno=55, colno=18) + end_location: SourceLocation(pos=2477, lineno=55, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=2478, lineno=55, colno=21) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=2487, lineno=55, colno=30) + end_location: SourceLocation(pos=2492, lineno=55, colno=35) + x: + + location: SourceLocation(pos=2487, lineno=55, colno=30) + end_location: SourceLocation(pos=2488, lineno=55, colno=31) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=2489, lineno=55, colno=32) + end_location: SourceLocation(pos=2490, lineno=55, colno=33) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=2491, lineno=55, colno=34) + end_location: SourceLocation(pos=2492, lineno=55, colno=35) + type: 'relative' + value: 0 + + location: SourceLocation(pos=2493, lineno=55, colno=36) + end_location: SourceLocation(pos=2498, lineno=55, colno=41) + identifier: + + location: SourceLocation(pos=2493, lineno=55, colno=36) + end_location: SourceLocation(pos=2498, lineno=55, colno=41) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2493, lineno=55, colno=36) + end_location: SourceLocation(pos=2498, lineno=55, colno=41) + value: 'water' + block_states: + + data_tags: None + + location: SourceLocation(pos=2499, lineno=55, colno=42) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2503, lineno=55, colno=46) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=2507, lineno=55, colno=50) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + words: + + location: SourceLocation(pos=2507, lineno=55, colno=50) + end_location: SourceLocation(pos=2510, lineno=55, colno=53) + value: '"My' + + location: SourceLocation(pos=2511, lineno=55, colno=54) + end_location: SourceLocation(pos=2515, lineno=55, colno=58) + value: 'feet' + + location: SourceLocation(pos=2516, lineno=55, colno=59) + end_location: SourceLocation(pos=2519, lineno=55, colno=62) + value: 'are' + + location: SourceLocation(pos=2520, lineno=55, colno=63) + end_location: SourceLocation(pos=2528, lineno=55, colno=71) + value: 'soaked!"' + + location: SourceLocation(pos=2529, lineno=56, colno=1) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2537, lineno=56, colno=9) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2540, lineno=56, colno=12) + end_location: SourceLocation(pos=2542, lineno=56, colno=14) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2543, lineno=56, colno=15) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + identifier: 'execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand' + arguments: + + location: SourceLocation(pos=2556, lineno=56, colno=28) + end_location: SourceLocation(pos=2558, lineno=56, colno=30) + variable: 's' + arguments: + + + location: SourceLocation(pos=2559, lineno=56, colno=31) + end_location: SourceLocation(pos=2563, lineno=56, colno=35) + value: 'test' + + location: SourceLocation(pos=2566, lineno=56, colno=38) + end_location: SourceLocation(pos=2568, lineno=56, colno=40) + variable: 's' + arguments: + + + location: SourceLocation(pos=2569, lineno=56, colno=41) + end_location: SourceLocation(pos=2573, lineno=56, colno=45) + value: 'test' + + location: SourceLocation(pos=2574, lineno=56, colno=46) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2578, lineno=56, colno=50) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=2582, lineno=56, colno=54) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + words: + + location: SourceLocation(pos=2582, lineno=56, colno=54) + end_location: SourceLocation(pos=2588, lineno=56, colno=60) + value: '"Score' + + location: SourceLocation(pos=2589, lineno=56, colno=61) + end_location: SourceLocation(pos=2591, lineno=56, colno=63) + value: 'is' + + location: SourceLocation(pos=2592, lineno=56, colno=64) + end_location: SourceLocation(pos=2598, lineno=56, colno=70) + value: 'reset"' + + location: SourceLocation(pos=2599, lineno=57, colno=1) + end_location: SourceLocation(pos=2695, lineno=57, colno=97) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2607, lineno=57, colno=9) + end_location: SourceLocation(pos=2695, lineno=57, colno=97) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=2610, lineno=57, colno=12) + end_location: SourceLocation(pos=2612, lineno=57, colno=14) + variable: 'p' + arguments: + + + location: SourceLocation(pos=2613, lineno=57, colno=15) + end_location: SourceLocation(pos=2695, lineno=57, colno=97) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2616, lineno=57, colno=18) + end_location: SourceLocation(pos=2641, lineno=57, colno=43) + variable: 'e' + arguments: + + location: SourceLocation(pos=2619, lineno=57, colno=21) + end_location: SourceLocation(pos=2627, lineno=57, colno=29) + inverted: False + key: + + location: SourceLocation(pos=2619, lineno=57, colno=21) + end_location: SourceLocation(pos=2623, lineno=57, colno=25) + value: 'type' + value: + + location: SourceLocation(pos=2624, lineno=57, colno=26) + end_location: SourceLocation(pos=2627, lineno=57, colno=29) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=2624, lineno=57, colno=26) + end_location: SourceLocation(pos=2627, lineno=57, colno=29) + value: 'pig' + + location: SourceLocation(pos=2628, lineno=57, colno=30) + end_location: SourceLocation(pos=2640, lineno=57, colno=42) + inverted: False + key: + + location: SourceLocation(pos=2628, lineno=57, colno=30) + end_location: SourceLocation(pos=2636, lineno=57, colno=38) + value: 'distance' + value: + + location: SourceLocation(pos=2637, lineno=57, colno=39) + end_location: SourceLocation(pos=2640, lineno=57, colno=42) + min: None + max: 3.0 + + location: SourceLocation(pos=2642, lineno=57, colno=44) + end_location: SourceLocation(pos=2695, lineno=57, colno=97) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2646, lineno=57, colno=48) + end_location: SourceLocation(pos=2695, lineno=57, colno=97) + identifier: 'data:merge:entity:target:nbt' + arguments: + + location: SourceLocation(pos=2664, lineno=57, colno=66) + end_location: SourceLocation(pos=2666, lineno=57, colno=68) + variable: 's' + arguments: + + + location: SourceLocation(pos=2667, lineno=57, colno=69) + end_location: SourceLocation(pos=2695, lineno=57, colno=97) + entries: + + location: SourceLocation(pos=2668, lineno=57, colno=70) + end_location: SourceLocation(pos=2694, lineno=57, colno=96) + key: + + location: SourceLocation(pos=2668, lineno=57, colno=70) + end_location: SourceLocation(pos=2674, lineno=57, colno=76) + value: 'Motion' + value: + + location: SourceLocation(pos=2676, lineno=57, colno=78) + end_location: SourceLocation(pos=2694, lineno=57, colno=96) + elements: + + location: SourceLocation(pos=2677, lineno=57, colno=79) + end_location: SourceLocation(pos=2681, lineno=57, colno=83) + value: Double(0.0) + + location: SourceLocation(pos=2683, lineno=57, colno=85) + end_location: SourceLocation(pos=2687, lineno=57, colno=89) + value: Double(2.0) + + location: SourceLocation(pos=2689, lineno=57, colno=91) + end_location: SourceLocation(pos=2693, lineno=57, colno=95) + value: Double(0.0) + + location: SourceLocation(pos=2696, lineno=58, colno=1) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2704, lineno=58, colno=9) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2707, lineno=58, colno=12) + end_location: SourceLocation(pos=2709, lineno=58, colno=14) + variable: 'p' + arguments: + + + location: SourceLocation(pos=2710, lineno=58, colno=15) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=2713, lineno=58, colno=18) + end_location: SourceLocation(pos=2715, lineno=58, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=2716, lineno=58, colno=21) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2720, lineno=58, colno=25) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + identifier: 'teleport:targets:location:rotation' + arguments: + + location: SourceLocation(pos=2729, lineno=58, colno=34) + end_location: SourceLocation(pos=2731, lineno=58, colno=36) + variable: 's' + arguments: + + + location: SourceLocation(pos=2729, lineno=58, colno=34) + end_location: SourceLocation(pos=2731, lineno=58, colno=36) + variable: 's' + arguments: + + + location: SourceLocation(pos=2732, lineno=58, colno=37) + end_location: SourceLocation(pos=2737, lineno=58, colno=42) + x: + + location: SourceLocation(pos=2732, lineno=58, colno=37) + end_location: SourceLocation(pos=2733, lineno=58, colno=38) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=2734, lineno=58, colno=39) + end_location: SourceLocation(pos=2735, lineno=58, colno=40) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=2736, lineno=58, colno=41) + end_location: SourceLocation(pos=2737, lineno=58, colno=42) + type: 'relative' + value: 0 + + location: SourceLocation(pos=2738, lineno=58, colno=43) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + x: + + location: SourceLocation(pos=2738, lineno=58, colno=43) + end_location: SourceLocation(pos=2741, lineno=58, colno=46) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=2742, lineno=58, colno=47) + end_location: SourceLocation(pos=2743, lineno=58, colno=48) + type: 'relative' + value: 0 + + location: SourceLocation(pos=2744, lineno=59, colno=1) + end_location: SourceLocation(pos=2794, lineno=59, colno=51) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2752, lineno=59, colno=9) + end_location: SourceLocation(pos=2794, lineno=59, colno=51) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=2755, lineno=59, colno=12) + end_location: SourceLocation(pos=2775, lineno=59, colno=32) + is_tag: False + namespace: + + location: SourceLocation(pos=2755, lineno=59, colno=12) + end_location: SourceLocation(pos=2764, lineno=59, colno=21) + value: 'minecraft' + path: + + location: SourceLocation(pos=2765, lineno=59, colno=22) + end_location: SourceLocation(pos=2775, lineno=59, colno=32) + value: 'the_nether' + + location: SourceLocation(pos=2776, lineno=59, colno=33) + end_location: SourceLocation(pos=2794, lineno=59, colno=51) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2780, lineno=59, colno=37) + end_location: SourceLocation(pos=2794, lineno=59, colno=51) + identifier: 'teleport:location' + arguments: + + location: SourceLocation(pos=2789, lineno=59, colno=46) + end_location: SourceLocation(pos=2794, lineno=59, colno=51) + x: + + location: SourceLocation(pos=2789, lineno=59, colno=46) + end_location: SourceLocation(pos=2790, lineno=59, colno=47) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=2791, lineno=59, colno=48) + end_location: SourceLocation(pos=2792, lineno=59, colno=49) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=2793, lineno=59, colno=50) + end_location: SourceLocation(pos=2794, lineno=59, colno=51) + type: 'relative' + value: 0 + + location: SourceLocation(pos=2795, lineno=60, colno=1) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2803, lineno=60, colno=9) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2806, lineno=60, colno=12) + end_location: SourceLocation(pos=2808, lineno=60, colno=14) + variable: 'a' + arguments: + + + location: SourceLocation(pos=2809, lineno=60, colno=15) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=2812, lineno=60, colno=18) + end_location: SourceLocation(pos=2829, lineno=60, colno=35) + is_tag: False + namespace: + + location: SourceLocation(pos=2812, lineno=60, colno=18) + end_location: SourceLocation(pos=2821, lineno=60, colno=27) + value: 'minecraft' + path: + + location: SourceLocation(pos=2822, lineno=60, colno=28) + end_location: SourceLocation(pos=2829, lineno=60, colno=35) + value: 'the_end' + + location: SourceLocation(pos=2830, lineno=60, colno=36) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2834, lineno=60, colno=40) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + identifier: 'teleport:location' + arguments: + + location: SourceLocation(pos=2843, lineno=60, colno=49) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + x: + + location: SourceLocation(pos=2843, lineno=60, colno=49) + end_location: SourceLocation(pos=2845, lineno=60, colno=51) + type: 'absolute' + value: 84 + y: + + location: SourceLocation(pos=2846, lineno=60, colno=52) + end_location: SourceLocation(pos=2848, lineno=60, colno=54) + type: 'absolute' + value: 57 + z: + + location: SourceLocation(pos=2849, lineno=60, colno=55) + end_location: SourceLocation(pos=2851, lineno=60, colno=57) + type: 'absolute' + value: 79 + + location: SourceLocation(pos=2852, lineno=61, colno=1) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2860, lineno=61, colno=9) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=2863, lineno=61, colno=12) + end_location: SourceLocation(pos=2868, lineno=61, colno=17) + value: 'Alice' + + location: SourceLocation(pos=2869, lineno=61, colno=18) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=2872, lineno=61, colno=21) + end_location: SourceLocation(pos=2891, lineno=61, colno=40) + is_tag: False + namespace: + + location: SourceLocation(pos=2872, lineno=61, colno=21) + end_location: SourceLocation(pos=2881, lineno=61, colno=30) + value: 'minecraft' + path: + + location: SourceLocation(pos=2882, lineno=61, colno=31) + end_location: SourceLocation(pos=2891, lineno=61, colno=40) + value: 'overworld' + + location: SourceLocation(pos=2892, lineno=61, colno=41) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2896, lineno=61, colno=45) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + identifier: 'teleport:location' + arguments: + + location: SourceLocation(pos=2905, lineno=61, colno=54) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + x: + + location: SourceLocation(pos=2905, lineno=61, colno=54) + end_location: SourceLocation(pos=2908, lineno=61, colno=57) + type: 'absolute' + value: 251 + y: + + location: SourceLocation(pos=2909, lineno=61, colno=58) + end_location: SourceLocation(pos=2911, lineno=61, colno=60) + type: 'absolute' + value: 64 + z: + + location: SourceLocation(pos=2912, lineno=61, colno=61) + end_location: SourceLocation(pos=2916, lineno=61, colno=65) + type: 'absolute' + value: -160 + + location: SourceLocation(pos=2930, lineno=63, colno=1) + end_location: SourceLocation(pos=2959, lineno=63, colno=30) identifier: 'experience:query:targets:levels' arguments: - location: SourceLocation(pos=1216, lineno=32, colno=18) - end_location: SourceLocation(pos=1221, lineno=32, colno=23) + location: SourceLocation(pos=2947, lineno=63, colno=18) + end_location: SourceLocation(pos=2952, lineno=63, colno=23) value: 'Steve' - location: SourceLocation(pos=1236, lineno=34, colno=1) - end_location: SourceLocation(pos=1328, lineno=34, colno=93) + location: SourceLocation(pos=2967, lineno=65, colno=1) + end_location: SourceLocation(pos=3059, lineno=65, colno=93) identifier: 'fill:from:to:block:replace:filter' arguments: - location: SourceLocation(pos=1241, lineno=34, colno=6) - end_location: SourceLocation(pos=1252, lineno=34, colno=17) + location: SourceLocation(pos=2972, lineno=65, colno=6) + end_location: SourceLocation(pos=2983, lineno=65, colno=17) x: - location: SourceLocation(pos=1241, lineno=34, colno=6) - end_location: SourceLocation(pos=1243, lineno=34, colno=8) + location: SourceLocation(pos=2972, lineno=65, colno=6) + end_location: SourceLocation(pos=2974, lineno=65, colno=8) type: 'absolute' value: 52 y: - location: SourceLocation(pos=1244, lineno=34, colno=9) - end_location: SourceLocation(pos=1246, lineno=34, colno=11) + location: SourceLocation(pos=2975, lineno=65, colno=9) + end_location: SourceLocation(pos=2977, lineno=65, colno=11) type: 'absolute' value: 63 z: - location: SourceLocation(pos=1247, lineno=34, colno=12) - end_location: SourceLocation(pos=1252, lineno=34, colno=17) + location: SourceLocation(pos=2978, lineno=65, colno=12) + end_location: SourceLocation(pos=2983, lineno=65, colno=17) type: 'absolute' value: -1516 - location: SourceLocation(pos=1253, lineno=34, colno=18) - end_location: SourceLocation(pos=1264, lineno=34, colno=29) + location: SourceLocation(pos=2984, lineno=65, colno=18) + end_location: SourceLocation(pos=2995, lineno=65, colno=29) x: - location: SourceLocation(pos=1253, lineno=34, colno=18) - end_location: SourceLocation(pos=1255, lineno=34, colno=20) + location: SourceLocation(pos=2984, lineno=65, colno=18) + end_location: SourceLocation(pos=2986, lineno=65, colno=20) type: 'absolute' value: 33 y: - location: SourceLocation(pos=1256, lineno=34, colno=21) - end_location: SourceLocation(pos=1258, lineno=34, colno=23) + location: SourceLocation(pos=2987, lineno=65, colno=21) + end_location: SourceLocation(pos=2989, lineno=65, colno=23) type: 'absolute' value: 73 z: - location: SourceLocation(pos=1259, lineno=34, colno=24) - end_location: SourceLocation(pos=1264, lineno=34, colno=29) + location: SourceLocation(pos=2990, lineno=65, colno=24) + end_location: SourceLocation(pos=2995, lineno=65, colno=29) type: 'absolute' value: -1536 - location: SourceLocation(pos=1265, lineno=34, colno=30) - end_location: SourceLocation(pos=1285, lineno=34, colno=50) + location: SourceLocation(pos=2996, lineno=65, colno=30) + end_location: SourceLocation(pos=3016, lineno=65, colno=50) identifier: - location: SourceLocation(pos=1265, lineno=34, colno=30) - end_location: SourceLocation(pos=1285, lineno=34, colno=50) + location: SourceLocation(pos=2996, lineno=65, colno=30) + end_location: SourceLocation(pos=3016, lineno=65, colno=50) is_tag: False namespace: - location: SourceLocation(pos=1265, lineno=34, colno=30) - end_location: SourceLocation(pos=1274, lineno=34, colno=39) + location: SourceLocation(pos=2996, lineno=65, colno=30) + end_location: SourceLocation(pos=3005, lineno=65, colno=39) value: 'minecraft' path: - location: SourceLocation(pos=1275, lineno=34, colno=40) - end_location: SourceLocation(pos=1285, lineno=34, colno=50) + location: SourceLocation(pos=3006, lineno=65, colno=40) + end_location: SourceLocation(pos=3016, lineno=65, colno=50) value: 'gold_block' block_states: data_tags: None - location: SourceLocation(pos=1294, lineno=34, colno=59) - end_location: SourceLocation(pos=1328, lineno=34, colno=93) + location: SourceLocation(pos=3025, lineno=65, colno=59) + end_location: SourceLocation(pos=3059, lineno=65, colno=93) identifier: - location: SourceLocation(pos=1294, lineno=34, colno=59) - end_location: SourceLocation(pos=1328, lineno=34, colno=93) + location: SourceLocation(pos=3025, lineno=65, colno=59) + end_location: SourceLocation(pos=3059, lineno=65, colno=93) is_tag: False namespace: - location: SourceLocation(pos=1294, lineno=34, colno=59) - end_location: SourceLocation(pos=1303, lineno=34, colno=68) + location: SourceLocation(pos=3025, lineno=65, colno=59) + end_location: SourceLocation(pos=3034, lineno=65, colno=68) value: 'minecraft' path: - location: SourceLocation(pos=1304, lineno=34, colno=69) - end_location: SourceLocation(pos=1328, lineno=34, colno=93) + location: SourceLocation(pos=3035, lineno=65, colno=69) + end_location: SourceLocation(pos=3059, lineno=65, colno=93) value: 'orange_glazed_terracotta' block_states: data_tags: None - location: SourceLocation(pos=1329, lineno=35, colno=1) - end_location: SourceLocation(pos=1361, lineno=35, colno=33) + location: SourceLocation(pos=3060, lineno=66, colno=1) + end_location: SourceLocation(pos=3092, lineno=66, colno=33) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=1334, lineno=35, colno=6) - end_location: SourceLocation(pos=1345, lineno=35, colno=17) + location: SourceLocation(pos=3065, lineno=66, colno=6) + end_location: SourceLocation(pos=3076, lineno=66, colno=17) x: - location: SourceLocation(pos=1334, lineno=35, colno=6) - end_location: SourceLocation(pos=1337, lineno=35, colno=9) + location: SourceLocation(pos=3065, lineno=66, colno=6) + end_location: SourceLocation(pos=3068, lineno=66, colno=9) type: 'relative' value: -3 y: - location: SourceLocation(pos=1338, lineno=35, colno=10) - end_location: SourceLocation(pos=1341, lineno=35, colno=13) + location: SourceLocation(pos=3069, lineno=66, colno=10) + end_location: SourceLocation(pos=3072, lineno=66, colno=13) type: 'relative' value: -3 z: - location: SourceLocation(pos=1342, lineno=35, colno=14) - end_location: SourceLocation(pos=1345, lineno=35, colno=17) + location: SourceLocation(pos=3073, lineno=66, colno=14) + end_location: SourceLocation(pos=3076, lineno=66, colno=17) type: 'relative' value: -3 - location: SourceLocation(pos=1346, lineno=35, colno=18) - end_location: SourceLocation(pos=1355, lineno=35, colno=27) + location: SourceLocation(pos=3077, lineno=66, colno=18) + end_location: SourceLocation(pos=3086, lineno=66, colno=27) x: - location: SourceLocation(pos=1346, lineno=35, colno=18) - end_location: SourceLocation(pos=1348, lineno=35, colno=20) + location: SourceLocation(pos=3077, lineno=66, colno=18) + end_location: SourceLocation(pos=3079, lineno=66, colno=20) type: 'relative' value: 3 y: - location: SourceLocation(pos=1349, lineno=35, colno=21) - end_location: SourceLocation(pos=1352, lineno=35, colno=24) + location: SourceLocation(pos=3080, lineno=66, colno=21) + end_location: SourceLocation(pos=3083, lineno=66, colno=24) type: 'relative' value: -1 z: - location: SourceLocation(pos=1353, lineno=35, colno=25) - end_location: SourceLocation(pos=1355, lineno=35, colno=27) + location: SourceLocation(pos=3084, lineno=66, colno=25) + end_location: SourceLocation(pos=3086, lineno=66, colno=27) type: 'relative' value: 3 - location: SourceLocation(pos=1356, lineno=35, colno=28) - end_location: SourceLocation(pos=1361, lineno=35, colno=33) + location: SourceLocation(pos=3087, lineno=66, colno=28) + end_location: SourceLocation(pos=3092, lineno=66, colno=33) identifier: - location: SourceLocation(pos=1356, lineno=35, colno=28) - end_location: SourceLocation(pos=1361, lineno=35, colno=33) + location: SourceLocation(pos=3087, lineno=66, colno=28) + end_location: SourceLocation(pos=3092, lineno=66, colno=33) is_tag: False namespace: None path: - location: SourceLocation(pos=1356, lineno=35, colno=28) - end_location: SourceLocation(pos=1361, lineno=35, colno=33) + location: SourceLocation(pos=3087, lineno=66, colno=28) + end_location: SourceLocation(pos=3092, lineno=66, colno=33) value: 'water' block_states: data_tags: None - location: SourceLocation(pos=1362, lineno=36, colno=1) - end_location: SourceLocation(pos=1408, lineno=36, colno=47) + location: SourceLocation(pos=3093, lineno=67, colno=1) + end_location: SourceLocation(pos=3139, lineno=67, colno=47) identifier: 'fill:from:to:block:hollow' arguments: - location: SourceLocation(pos=1367, lineno=36, colno=6) - end_location: SourceLocation(pos=1376, lineno=36, colno=15) + location: SourceLocation(pos=3098, lineno=67, colno=6) + end_location: SourceLocation(pos=3107, lineno=67, colno=15) x: - location: SourceLocation(pos=1367, lineno=36, colno=6) - end_location: SourceLocation(pos=1370, lineno=36, colno=9) + location: SourceLocation(pos=3098, lineno=67, colno=6) + end_location: SourceLocation(pos=3101, lineno=67, colno=9) type: 'relative' value: -3 y: - location: SourceLocation(pos=1371, lineno=36, colno=10) - end_location: SourceLocation(pos=1372, lineno=36, colno=11) + location: SourceLocation(pos=3102, lineno=67, colno=10) + end_location: SourceLocation(pos=3103, lineno=67, colno=11) type: 'relative' value: 0 z: - location: SourceLocation(pos=1373, lineno=36, colno=12) - end_location: SourceLocation(pos=1376, lineno=36, colno=15) + location: SourceLocation(pos=3104, lineno=67, colno=12) + end_location: SourceLocation(pos=3107, lineno=67, colno=15) type: 'relative' value: -4 - location: SourceLocation(pos=1377, lineno=36, colno=16) - end_location: SourceLocation(pos=1385, lineno=36, colno=24) + location: SourceLocation(pos=3108, lineno=67, colno=16) + end_location: SourceLocation(pos=3116, lineno=67, colno=24) x: - location: SourceLocation(pos=1377, lineno=36, colno=16) - end_location: SourceLocation(pos=1379, lineno=36, colno=18) + location: SourceLocation(pos=3108, lineno=67, colno=16) + end_location: SourceLocation(pos=3110, lineno=67, colno=18) type: 'relative' value: 3 y: - location: SourceLocation(pos=1380, lineno=36, colno=19) - end_location: SourceLocation(pos=1382, lineno=36, colno=21) + location: SourceLocation(pos=3111, lineno=67, colno=19) + end_location: SourceLocation(pos=3113, lineno=67, colno=21) type: 'relative' value: 4 z: - location: SourceLocation(pos=1383, lineno=36, colno=22) - end_location: SourceLocation(pos=1385, lineno=36, colno=24) + location: SourceLocation(pos=3114, lineno=67, colno=22) + end_location: SourceLocation(pos=3116, lineno=67, colno=24) type: 'relative' value: 4 - location: SourceLocation(pos=1386, lineno=36, colno=25) - end_location: SourceLocation(pos=1401, lineno=36, colno=40) + location: SourceLocation(pos=3117, lineno=67, colno=25) + end_location: SourceLocation(pos=3132, lineno=67, colno=40) identifier: - location: SourceLocation(pos=1386, lineno=36, colno=25) - end_location: SourceLocation(pos=1401, lineno=36, colno=40) + location: SourceLocation(pos=3117, lineno=67, colno=25) + end_location: SourceLocation(pos=3132, lineno=67, colno=40) is_tag: False namespace: - location: SourceLocation(pos=1386, lineno=36, colno=25) - end_location: SourceLocation(pos=1395, lineno=36, colno=34) + location: SourceLocation(pos=3117, lineno=67, colno=25) + end_location: SourceLocation(pos=3126, lineno=67, colno=34) value: 'minecraft' path: - location: SourceLocation(pos=1396, lineno=36, colno=35) - end_location: SourceLocation(pos=1401, lineno=36, colno=40) + location: SourceLocation(pos=3127, lineno=67, colno=35) + end_location: SourceLocation(pos=3132, lineno=67, colno=40) value: 'stone' block_states: data_tags: None - location: SourceLocation(pos=1409, lineno=37, colno=1) - end_location: SourceLocation(pos=1446, lineno=37, colno=38) + location: SourceLocation(pos=3140, lineno=68, colno=1) + end_location: SourceLocation(pos=3177, lineno=68, colno=38) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=1414, lineno=37, colno=6) - end_location: SourceLocation(pos=1428, lineno=37, colno=20) + location: SourceLocation(pos=3145, lineno=68, colno=6) + end_location: SourceLocation(pos=3159, lineno=68, colno=20) x: - location: SourceLocation(pos=1414, lineno=37, colno=6) - end_location: SourceLocation(pos=1418, lineno=37, colno=10) + location: SourceLocation(pos=3145, lineno=68, colno=6) + end_location: SourceLocation(pos=3149, lineno=68, colno=10) type: 'relative' value: -15 y: - location: SourceLocation(pos=1419, lineno=37, colno=11) - end_location: SourceLocation(pos=1423, lineno=37, colno=15) + location: SourceLocation(pos=3150, lineno=68, colno=11) + end_location: SourceLocation(pos=3154, lineno=68, colno=15) type: 'relative' value: -15 z: - location: SourceLocation(pos=1424, lineno=37, colno=16) - end_location: SourceLocation(pos=1428, lineno=37, colno=20) + location: SourceLocation(pos=3155, lineno=68, colno=16) + end_location: SourceLocation(pos=3159, lineno=68, colno=20) type: 'relative' value: -15 - location: SourceLocation(pos=1429, lineno=37, colno=21) - end_location: SourceLocation(pos=1440, lineno=37, colno=32) + location: SourceLocation(pos=3160, lineno=68, colno=21) + end_location: SourceLocation(pos=3171, lineno=68, colno=32) x: - location: SourceLocation(pos=1429, lineno=37, colno=21) - end_location: SourceLocation(pos=1432, lineno=37, colno=24) + location: SourceLocation(pos=3160, lineno=68, colno=21) + end_location: SourceLocation(pos=3163, lineno=68, colno=24) type: 'relative' value: 15 y: - location: SourceLocation(pos=1433, lineno=37, colno=25) - end_location: SourceLocation(pos=1436, lineno=37, colno=28) + location: SourceLocation(pos=3164, lineno=68, colno=25) + end_location: SourceLocation(pos=3167, lineno=68, colno=28) type: 'relative' value: 15 z: - location: SourceLocation(pos=1437, lineno=37, colno=29) - end_location: SourceLocation(pos=1440, lineno=37, colno=32) + location: SourceLocation(pos=3168, lineno=68, colno=29) + end_location: SourceLocation(pos=3171, lineno=68, colno=32) type: 'relative' value: 15 - location: SourceLocation(pos=1441, lineno=37, colno=33) - end_location: SourceLocation(pos=1446, lineno=37, colno=38) + location: SourceLocation(pos=3172, lineno=68, colno=33) + end_location: SourceLocation(pos=3177, lineno=68, colno=38) identifier: - location: SourceLocation(pos=1441, lineno=37, colno=33) - end_location: SourceLocation(pos=1446, lineno=37, colno=38) + location: SourceLocation(pos=3172, lineno=68, colno=33) + end_location: SourceLocation(pos=3177, lineno=68, colno=38) is_tag: False namespace: None path: - location: SourceLocation(pos=1441, lineno=37, colno=33) - end_location: SourceLocation(pos=1446, lineno=37, colno=38) + location: SourceLocation(pos=3172, lineno=68, colno=33) + end_location: SourceLocation(pos=3177, lineno=68, colno=38) value: 'stone' block_states: data_tags: None - location: SourceLocation(pos=1447, lineno=38, colno=1) - end_location: SourceLocation(pos=1531, lineno=38, colno=85) + location: SourceLocation(pos=3178, lineno=69, colno=1) + end_location: SourceLocation(pos=3262, lineno=69, colno=85) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=1452, lineno=38, colno=6) - end_location: SourceLocation(pos=1459, lineno=38, colno=13) + location: SourceLocation(pos=3183, lineno=69, colno=6) + end_location: SourceLocation(pos=3190, lineno=69, colno=13) x: - location: SourceLocation(pos=1452, lineno=38, colno=6) - end_location: SourceLocation(pos=1455, lineno=38, colno=9) + location: SourceLocation(pos=3183, lineno=69, colno=6) + end_location: SourceLocation(pos=3186, lineno=69, colno=9) type: 'relative' value: -1 y: - location: SourceLocation(pos=1456, lineno=38, colno=10) - end_location: SourceLocation(pos=1457, lineno=38, colno=11) + location: SourceLocation(pos=3187, lineno=69, colno=10) + end_location: SourceLocation(pos=3188, lineno=69, colno=11) type: 'relative' value: 0 z: - location: SourceLocation(pos=1458, lineno=38, colno=12) - end_location: SourceLocation(pos=1459, lineno=38, colno=13) + location: SourceLocation(pos=3189, lineno=69, colno=12) + end_location: SourceLocation(pos=3190, lineno=69, colno=13) type: 'relative' value: 0 - location: SourceLocation(pos=1460, lineno=38, colno=14) - end_location: SourceLocation(pos=1466, lineno=38, colno=20) + location: SourceLocation(pos=3191, lineno=69, colno=14) + end_location: SourceLocation(pos=3197, lineno=69, colno=20) x: - location: SourceLocation(pos=1460, lineno=38, colno=14) - end_location: SourceLocation(pos=1462, lineno=38, colno=16) + location: SourceLocation(pos=3191, lineno=69, colno=14) + end_location: SourceLocation(pos=3193, lineno=69, colno=16) type: 'relative' value: 1 y: - location: SourceLocation(pos=1463, lineno=38, colno=17) - end_location: SourceLocation(pos=1464, lineno=38, colno=18) + location: SourceLocation(pos=3194, lineno=69, colno=17) + end_location: SourceLocation(pos=3195, lineno=69, colno=18) type: 'relative' value: 0 z: - location: SourceLocation(pos=1465, lineno=38, colno=19) - end_location: SourceLocation(pos=1466, lineno=38, colno=20) + location: SourceLocation(pos=3196, lineno=69, colno=19) + end_location: SourceLocation(pos=3197, lineno=69, colno=20) type: 'relative' value: 0 - location: SourceLocation(pos=1467, lineno=38, colno=21) - end_location: SourceLocation(pos=1531, lineno=38, colno=85) + location: SourceLocation(pos=3198, lineno=69, colno=21) + end_location: SourceLocation(pos=3262, lineno=69, colno=85) identifier: - location: SourceLocation(pos=1467, lineno=38, colno=21) - end_location: SourceLocation(pos=1500, lineno=38, colno=54) + location: SourceLocation(pos=3198, lineno=69, colno=21) + end_location: SourceLocation(pos=3231, lineno=69, colno=54) is_tag: False namespace: - location: SourceLocation(pos=1467, lineno=38, colno=21) - end_location: SourceLocation(pos=1476, lineno=38, colno=30) + location: SourceLocation(pos=3198, lineno=69, colno=21) + end_location: SourceLocation(pos=3207, lineno=69, colno=30) value: 'minecraft' path: - location: SourceLocation(pos=1477, lineno=38, colno=31) - end_location: SourceLocation(pos=1500, lineno=38, colno=54) + location: SourceLocation(pos=3208, lineno=69, colno=31) + end_location: SourceLocation(pos=3231, lineno=69, colno=54) value: 'prismarine_brick_stairs' block_states: - location: SourceLocation(pos=1501, lineno=38, colno=55) - end_location: SourceLocation(pos=1513, lineno=38, colno=67) + location: SourceLocation(pos=3232, lineno=69, colno=55) + end_location: SourceLocation(pos=3244, lineno=69, colno=67) key: - location: SourceLocation(pos=1501, lineno=38, colno=55) - end_location: SourceLocation(pos=1507, lineno=38, colno=61) + location: SourceLocation(pos=3232, lineno=69, colno=55) + end_location: SourceLocation(pos=3238, lineno=69, colno=61) value: 'facing' value: - location: SourceLocation(pos=1508, lineno=38, colno=62) - end_location: SourceLocation(pos=1513, lineno=38, colno=67) + location: SourceLocation(pos=3239, lineno=69, colno=62) + end_location: SourceLocation(pos=3244, lineno=69, colno=67) value: 'south' - location: SourceLocation(pos=1514, lineno=38, colno=68) - end_location: SourceLocation(pos=1530, lineno=38, colno=84) + location: SourceLocation(pos=3245, lineno=69, colno=68) + end_location: SourceLocation(pos=3261, lineno=69, colno=84) key: - location: SourceLocation(pos=1514, lineno=38, colno=68) - end_location: SourceLocation(pos=1525, lineno=38, colno=79) + location: SourceLocation(pos=3245, lineno=69, colno=68) + end_location: SourceLocation(pos=3256, lineno=69, colno=79) value: 'waterlogged' value: - location: SourceLocation(pos=1526, lineno=38, colno=80) - end_location: SourceLocation(pos=1530, lineno=38, colno=84) + location: SourceLocation(pos=3257, lineno=69, colno=80) + end_location: SourceLocation(pos=3261, lineno=69, colno=84) value: 'true' data_tags: None - location: SourceLocation(pos=1543, lineno=40, colno=1) - end_location: SourceLocation(pos=1571, lineno=40, colno=29) + location: SourceLocation(pos=3274, lineno=71, colno=1) + end_location: SourceLocation(pos=3302, lineno=71, colno=29) identifier: 'function:name' arguments: - location: SourceLocation(pos=1552, lineno=40, colno=10) - end_location: SourceLocation(pos=1571, lineno=40, colno=29) + location: SourceLocation(pos=3283, lineno=71, colno=10) + end_location: SourceLocation(pos=3302, lineno=71, colno=29) is_tag: False namespace: - location: SourceLocation(pos=1552, lineno=40, colno=10) - end_location: SourceLocation(pos=1558, lineno=40, colno=16) + location: SourceLocation(pos=3283, lineno=71, colno=10) + end_location: SourceLocation(pos=3289, lineno=71, colno=16) value: 'custom' path: - location: SourceLocation(pos=1559, lineno=40, colno=17) - end_location: SourceLocation(pos=1571, lineno=40, colno=29) + location: SourceLocation(pos=3290, lineno=71, colno=17) + end_location: SourceLocation(pos=3302, lineno=71, colno=29) value: 'example/test' - location: SourceLocation(pos=1572, lineno=41, colno=1) - end_location: SourceLocation(pos=1601, lineno=41, colno=30) + location: SourceLocation(pos=3303, lineno=72, colno=1) + end_location: SourceLocation(pos=3332, lineno=72, colno=30) identifier: 'function:name' arguments: - location: SourceLocation(pos=1581, lineno=41, colno=10) - end_location: SourceLocation(pos=1601, lineno=41, colno=30) + location: SourceLocation(pos=3312, lineno=72, colno=10) + end_location: SourceLocation(pos=3332, lineno=72, colno=30) is_tag: True namespace: - location: SourceLocation(pos=1582, lineno=41, colno=11) - end_location: SourceLocation(pos=1588, lineno=41, colno=17) + location: SourceLocation(pos=3313, lineno=72, colno=11) + end_location: SourceLocation(pos=3319, lineno=72, colno=17) value: 'custom' path: - location: SourceLocation(pos=1589, lineno=41, colno=18) - end_location: SourceLocation(pos=1601, lineno=41, colno=30) + location: SourceLocation(pos=3320, lineno=72, colno=18) + end_location: SourceLocation(pos=3332, lineno=72, colno=30) value: 'example/test' - location: SourceLocation(pos=1613, lineno=43, colno=1) - end_location: SourceLocation(pos=1630, lineno=43, colno=18) + location: SourceLocation(pos=3344, lineno=74, colno=1) + end_location: SourceLocation(pos=3361, lineno=74, colno=18) identifier: 'gamemode:creative' arguments: - location: SourceLocation(pos=1631, lineno=44, colno=1) - end_location: SourceLocation(pos=1651, lineno=44, colno=21) + location: SourceLocation(pos=3362, lineno=75, colno=1) + end_location: SourceLocation(pos=3382, lineno=75, colno=21) identifier: 'gamemode:survival:target' arguments: - location: SourceLocation(pos=1649, lineno=44, colno=19) - end_location: SourceLocation(pos=1651, lineno=44, colno=21) + location: SourceLocation(pos=3380, lineno=75, colno=19) + end_location: SourceLocation(pos=3382, lineno=75, colno=21) variable: 'a' arguments: - location: SourceLocation(pos=1663, lineno=46, colno=1) - end_location: SourceLocation(pos=1693, lineno=46, colno=31) + location: SourceLocation(pos=3394, lineno=77, colno=1) + end_location: SourceLocation(pos=3424, lineno=77, colno=31) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=1688, lineno=46, colno=26) - end_location: SourceLocation(pos=1693, lineno=46, colno=31) + location: SourceLocation(pos=3419, lineno=77, colno=26) + end_location: SourceLocation(pos=3424, lineno=77, colno=31) value: False - location: SourceLocation(pos=1694, lineno=47, colno=1) - end_location: SourceLocation(pos=1728, lineno=47, colno=35) + location: SourceLocation(pos=3425, lineno=78, colno=1) + end_location: SourceLocation(pos=3459, lineno=78, colno=35) identifier: 'gamerule:naturalRegeneration:value' arguments: - location: SourceLocation(pos=1723, lineno=47, colno=30) - end_location: SourceLocation(pos=1728, lineno=47, colno=35) + location: SourceLocation(pos=3454, lineno=78, colno=30) + end_location: SourceLocation(pos=3459, lineno=78, colno=35) value: False - location: SourceLocation(pos=1729, lineno=48, colno=1) - end_location: SourceLocation(pos=1755, lineno=48, colno=27) + location: SourceLocation(pos=3460, lineno=79, colno=1) + end_location: SourceLocation(pos=3486, lineno=79, colno=27) identifier: 'gamerule:mobGriefing:value' arguments: - location: SourceLocation(pos=1750, lineno=48, colno=22) - end_location: SourceLocation(pos=1755, lineno=48, colno=27) + location: SourceLocation(pos=3481, lineno=79, colno=22) + end_location: SourceLocation(pos=3486, lineno=79, colno=27) value: False - location: SourceLocation(pos=1756, lineno=49, colno=1) - end_location: SourceLocation(pos=1785, lineno=49, colno=30) + location: SourceLocation(pos=3487, lineno=80, colno=1) + end_location: SourceLocation(pos=3516, lineno=80, colno=30) identifier: 'gamerule:doWeatherCycle:value' arguments: - location: SourceLocation(pos=1780, lineno=49, colno=25) - end_location: SourceLocation(pos=1785, lineno=49, colno=30) + location: SourceLocation(pos=3511, lineno=80, colno=25) + end_location: SourceLocation(pos=3516, lineno=80, colno=30) value: False - location: SourceLocation(pos=1786, lineno=50, colno=1) - end_location: SourceLocation(pos=1813, lineno=50, colno=28) + location: SourceLocation(pos=3517, lineno=81, colno=1) + end_location: SourceLocation(pos=3544, lineno=81, colno=28) identifier: 'gamerule:keepInventory:value' arguments: - location: SourceLocation(pos=1809, lineno=50, colno=24) - end_location: SourceLocation(pos=1813, lineno=50, colno=28) + location: SourceLocation(pos=3540, lineno=81, colno=24) + end_location: SourceLocation(pos=3544, lineno=81, colno=28) value: True - location: SourceLocation(pos=1814, lineno=51, colno=1) - end_location: SourceLocation(pos=1847, lineno=51, colno=34) + location: SourceLocation(pos=3545, lineno=82, colno=1) + end_location: SourceLocation(pos=3578, lineno=82, colno=34) identifier: 'gamerule:commandBlockOutput:value' arguments: - location: SourceLocation(pos=1842, lineno=51, colno=29) - end_location: SourceLocation(pos=1847, lineno=51, colno=34) + location: SourceLocation(pos=3573, lineno=82, colno=29) + end_location: SourceLocation(pos=3578, lineno=82, colno=34) value: False - location: SourceLocation(pos=1848, lineno=52, colno=1) - end_location: SourceLocation(pos=1873, lineno=52, colno=26) + location: SourceLocation(pos=3579, lineno=83, colno=1) + end_location: SourceLocation(pos=3604, lineno=83, colno=26) identifier: 'gamerule:doInsomnia:value' arguments: - location: SourceLocation(pos=1868, lineno=52, colno=21) - end_location: SourceLocation(pos=1873, lineno=52, colno=26) + location: SourceLocation(pos=3599, lineno=83, colno=21) + end_location: SourceLocation(pos=3604, lineno=83, colno=26) value: False - location: SourceLocation(pos=1881, lineno=54, colno=1) - end_location: SourceLocation(pos=1957, lineno=54, colno=77) + location: SourceLocation(pos=3612, lineno=85, colno=1) + end_location: SourceLocation(pos=3688, lineno=85, colno=77) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=1886, lineno=54, colno=6) - end_location: SourceLocation(pos=1888, lineno=54, colno=8) + location: SourceLocation(pos=3617, lineno=85, colno=6) + end_location: SourceLocation(pos=3619, lineno=85, colno=8) variable: 'p' arguments: - location: SourceLocation(pos=1889, lineno=54, colno=9) - end_location: SourceLocation(pos=1955, lineno=54, colno=75) + location: SourceLocation(pos=3620, lineno=85, colno=9) + end_location: SourceLocation(pos=3686, lineno=85, colno=75) identifier: - location: SourceLocation(pos=1889, lineno=54, colno=9) - end_location: SourceLocation(pos=1912, lineno=54, colno=32) + location: SourceLocation(pos=3620, lineno=85, colno=9) + end_location: SourceLocation(pos=3643, lineno=85, colno=32) is_tag: False namespace: - location: SourceLocation(pos=1889, lineno=54, colno=9) - end_location: SourceLocation(pos=1898, lineno=54, colno=18) + location: SourceLocation(pos=3620, lineno=85, colno=9) + end_location: SourceLocation(pos=3629, lineno=85, colno=18) value: 'minecraft' path: - location: SourceLocation(pos=1899, lineno=54, colno=19) - end_location: SourceLocation(pos=1912, lineno=54, colno=32) + location: SourceLocation(pos=3630, lineno=85, colno=19) + end_location: SourceLocation(pos=3643, lineno=85, colno=32) value: 'diamond_sword' data_tags: - location: SourceLocation(pos=1912, lineno=54, colno=32) - end_location: SourceLocation(pos=1955, lineno=54, colno=75) + location: SourceLocation(pos=3643, lineno=85, colno=32) + end_location: SourceLocation(pos=3686, lineno=85, colno=75) entries: - location: SourceLocation(pos=1913, lineno=54, colno=33) - end_location: SourceLocation(pos=1954, lineno=54, colno=74) + location: SourceLocation(pos=3644, lineno=85, colno=33) + end_location: SourceLocation(pos=3685, lineno=85, colno=74) key: - location: SourceLocation(pos=1913, lineno=54, colno=33) - end_location: SourceLocation(pos=1920, lineno=54, colno=40) + location: SourceLocation(pos=3644, lineno=85, colno=33) + end_location: SourceLocation(pos=3651, lineno=85, colno=40) value: 'display' value: - location: SourceLocation(pos=1922, lineno=54, colno=42) - end_location: SourceLocation(pos=1954, lineno=54, colno=74) + location: SourceLocation(pos=3653, lineno=85, colno=42) + end_location: SourceLocation(pos=3685, lineno=85, colno=74) entries: - location: SourceLocation(pos=1923, lineno=54, colno=43) - end_location: SourceLocation(pos=1953, lineno=54, colno=73) + location: SourceLocation(pos=3654, lineno=85, colno=43) + end_location: SourceLocation(pos=3684, lineno=85, colno=73) key: - location: SourceLocation(pos=1923, lineno=54, colno=43) - end_location: SourceLocation(pos=1927, lineno=54, colno=47) + location: SourceLocation(pos=3654, lineno=85, colno=43) + end_location: SourceLocation(pos=3658, lineno=85, colno=47) value: 'Lore' value: - location: SourceLocation(pos=1929, lineno=54, colno=49) - end_location: SourceLocation(pos=1953, lineno=54, colno=73) + location: SourceLocation(pos=3660, lineno=85, colno=49) + end_location: SourceLocation(pos=3684, lineno=85, colno=73) elements: - location: SourceLocation(pos=1930, lineno=54, colno=50) - end_location: SourceLocation(pos=1952, lineno=54, colno=72) + location: SourceLocation(pos=3661, lineno=85, colno=50) + end_location: SourceLocation(pos=3683, lineno=85, colno=72) value: String('"A legendary weapon"') - location: SourceLocation(pos=1956, lineno=54, colno=76) - end_location: SourceLocation(pos=1957, lineno=54, colno=77) + location: SourceLocation(pos=3687, lineno=85, colno=76) + end_location: SourceLocation(pos=3688, lineno=85, colno=77) value: 1 - location: SourceLocation(pos=1958, lineno=55, colno=1) - end_location: SourceLocation(pos=2008, lineno=55, colno=51) + location: SourceLocation(pos=3689, lineno=86, colno=1) + end_location: SourceLocation(pos=3739, lineno=86, colno=51) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=1963, lineno=55, colno=6) - end_location: SourceLocation(pos=1965, lineno=55, colno=8) + location: SourceLocation(pos=3694, lineno=86, colno=6) + end_location: SourceLocation(pos=3696, lineno=86, colno=8) variable: 'a' arguments: - location: SourceLocation(pos=1966, lineno=55, colno=9) - end_location: SourceLocation(pos=2006, lineno=55, colno=49) + location: SourceLocation(pos=3697, lineno=86, colno=9) + end_location: SourceLocation(pos=3737, lineno=86, colno=49) identifier: - location: SourceLocation(pos=1966, lineno=55, colno=9) - end_location: SourceLocation(pos=1972, lineno=55, colno=15) + location: SourceLocation(pos=3697, lineno=86, colno=9) + end_location: SourceLocation(pos=3703, lineno=86, colno=15) is_tag: False namespace: None path: - location: SourceLocation(pos=1966, lineno=55, colno=9) - end_location: SourceLocation(pos=1972, lineno=55, colno=15) + location: SourceLocation(pos=3697, lineno=86, colno=9) + end_location: SourceLocation(pos=3703, lineno=86, colno=15) value: 'potion' data_tags: - location: SourceLocation(pos=1972, lineno=55, colno=15) - end_location: SourceLocation(pos=2006, lineno=55, colno=49) + location: SourceLocation(pos=3703, lineno=86, colno=15) + end_location: SourceLocation(pos=3737, lineno=86, colno=49) entries: - location: SourceLocation(pos=1973, lineno=55, colno=16) - end_location: SourceLocation(pos=2005, lineno=55, colno=48) + location: SourceLocation(pos=3704, lineno=86, colno=16) + end_location: SourceLocation(pos=3736, lineno=86, colno=48) key: - location: SourceLocation(pos=1973, lineno=55, colno=16) - end_location: SourceLocation(pos=1979, lineno=55, colno=22) + location: SourceLocation(pos=3704, lineno=86, colno=16) + end_location: SourceLocation(pos=3710, lineno=86, colno=22) value: 'Potion' value: - location: SourceLocation(pos=1981, lineno=55, colno=24) - end_location: SourceLocation(pos=2005, lineno=55, colno=48) + location: SourceLocation(pos=3712, lineno=86, colno=24) + end_location: SourceLocation(pos=3736, lineno=86, colno=48) value: String('minecraft:night_vision') - location: SourceLocation(pos=2007, lineno=55, colno=50) - end_location: SourceLocation(pos=2008, lineno=55, colno=51) + location: SourceLocation(pos=3738, lineno=86, colno=50) + end_location: SourceLocation(pos=3739, lineno=86, colno=51) value: 1 - location: SourceLocation(pos=2009, lineno=56, colno=1) - end_location: SourceLocation(pos=2086, lineno=56, colno=78) + location: SourceLocation(pos=3740, lineno=87, colno=1) + end_location: SourceLocation(pos=3817, lineno=87, colno=78) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=2014, lineno=56, colno=6) - end_location: SourceLocation(pos=2016, lineno=56, colno=8) + location: SourceLocation(pos=3745, lineno=87, colno=6) + end_location: SourceLocation(pos=3747, lineno=87, colno=8) variable: 'r' arguments: - location: SourceLocation(pos=2017, lineno=56, colno=9) - end_location: SourceLocation(pos=2084, lineno=56, colno=76) + location: SourceLocation(pos=3748, lineno=87, colno=9) + end_location: SourceLocation(pos=3815, lineno=87, colno=76) identifier: - location: SourceLocation(pos=2017, lineno=56, colno=9) - end_location: SourceLocation(pos=2030, lineno=56, colno=22) + location: SourceLocation(pos=3748, lineno=87, colno=9) + end_location: SourceLocation(pos=3761, lineno=87, colno=22) is_tag: False namespace: None path: - location: SourceLocation(pos=2017, lineno=56, colno=9) - end_location: SourceLocation(pos=2030, lineno=56, colno=22) + location: SourceLocation(pos=3748, lineno=87, colno=9) + end_location: SourceLocation(pos=3761, lineno=87, colno=22) value: 'diamond_sword' data_tags: - location: SourceLocation(pos=2030, lineno=56, colno=22) - end_location: SourceLocation(pos=2084, lineno=56, colno=76) + location: SourceLocation(pos=3761, lineno=87, colno=22) + end_location: SourceLocation(pos=3815, lineno=87, colno=76) entries: - location: SourceLocation(pos=2031, lineno=56, colno=23) - end_location: SourceLocation(pos=2083, lineno=56, colno=75) + location: SourceLocation(pos=3762, lineno=87, colno=23) + end_location: SourceLocation(pos=3814, lineno=87, colno=75) key: - location: SourceLocation(pos=2031, lineno=56, colno=23) - end_location: SourceLocation(pos=2043, lineno=56, colno=35) + location: SourceLocation(pos=3762, lineno=87, colno=23) + end_location: SourceLocation(pos=3774, lineno=87, colno=35) value: 'Enchantments' value: - location: SourceLocation(pos=2045, lineno=56, colno=37) - end_location: SourceLocation(pos=2083, lineno=56, colno=75) + location: SourceLocation(pos=3776, lineno=87, colno=37) + end_location: SourceLocation(pos=3814, lineno=87, colno=75) elements: - location: SourceLocation(pos=2046, lineno=56, colno=38) - end_location: SourceLocation(pos=2082, lineno=56, colno=74) + location: SourceLocation(pos=3777, lineno=87, colno=38) + end_location: SourceLocation(pos=3813, lineno=87, colno=74) entries: - location: SourceLocation(pos=2047, lineno=56, colno=39) - end_location: SourceLocation(pos=2072, lineno=56, colno=64) + location: SourceLocation(pos=3778, lineno=87, colno=39) + end_location: SourceLocation(pos=3803, lineno=87, colno=64) key: - location: SourceLocation(pos=2047, lineno=56, colno=39) - end_location: SourceLocation(pos=2049, lineno=56, colno=41) + location: SourceLocation(pos=3778, lineno=87, colno=39) + end_location: SourceLocation(pos=3780, lineno=87, colno=41) value: 'id' value: - location: SourceLocation(pos=2051, lineno=56, colno=43) - end_location: SourceLocation(pos=2072, lineno=56, colno=64) + location: SourceLocation(pos=3782, lineno=87, colno=43) + end_location: SourceLocation(pos=3803, lineno=87, colno=64) value: String('minecraft:sharpness') - location: SourceLocation(pos=2074, lineno=56, colno=66) - end_location: SourceLocation(pos=2081, lineno=56, colno=73) + location: SourceLocation(pos=3805, lineno=87, colno=66) + end_location: SourceLocation(pos=3812, lineno=87, colno=73) key: - location: SourceLocation(pos=2074, lineno=56, colno=66) - end_location: SourceLocation(pos=2077, lineno=56, colno=69) + location: SourceLocation(pos=3805, lineno=87, colno=66) + end_location: SourceLocation(pos=3808, lineno=87, colno=69) value: 'lvl' value: - location: SourceLocation(pos=2079, lineno=56, colno=71) - end_location: SourceLocation(pos=2081, lineno=56, colno=73) + location: SourceLocation(pos=3810, lineno=87, colno=71) + end_location: SourceLocation(pos=3812, lineno=87, colno=73) value: Int(10) - location: SourceLocation(pos=2085, lineno=56, colno=77) - end_location: SourceLocation(pos=2086, lineno=56, colno=78) + location: SourceLocation(pos=3816, lineno=87, colno=77) + end_location: SourceLocation(pos=3817, lineno=87, colno=78) value: 1 - location: SourceLocation(pos=2087, lineno=57, colno=1) - end_location: SourceLocation(pos=2150, lineno=57, colno=64) + location: SourceLocation(pos=3818, lineno=88, colno=1) + end_location: SourceLocation(pos=3881, lineno=88, colno=64) identifier: 'give:targets:item' arguments: - location: SourceLocation(pos=2092, lineno=57, colno=6) - end_location: SourceLocation(pos=2094, lineno=57, colno=8) + location: SourceLocation(pos=3823, lineno=88, colno=6) + end_location: SourceLocation(pos=3825, lineno=88, colno=8) variable: 's' arguments: - location: SourceLocation(pos=2095, lineno=57, colno=9) - end_location: SourceLocation(pos=2150, lineno=57, colno=64) + location: SourceLocation(pos=3826, lineno=88, colno=9) + end_location: SourceLocation(pos=3881, lineno=88, colno=64) identifier: - location: SourceLocation(pos=2095, lineno=57, colno=9) - end_location: SourceLocation(pos=2118, lineno=57, colno=32) + location: SourceLocation(pos=3826, lineno=88, colno=9) + end_location: SourceLocation(pos=3849, lineno=88, colno=32) is_tag: False namespace: - location: SourceLocation(pos=2095, lineno=57, colno=9) - end_location: SourceLocation(pos=2104, lineno=57, colno=18) + location: SourceLocation(pos=3826, lineno=88, colno=9) + end_location: SourceLocation(pos=3835, lineno=88, colno=18) value: 'minecraft' path: - location: SourceLocation(pos=2105, lineno=57, colno=19) - end_location: SourceLocation(pos=2118, lineno=57, colno=32) + location: SourceLocation(pos=3836, lineno=88, colno=19) + end_location: SourceLocation(pos=3849, lineno=88, colno=32) value: 'diamond_block' data_tags: - location: SourceLocation(pos=2118, lineno=57, colno=32) - end_location: SourceLocation(pos=2150, lineno=57, colno=64) + location: SourceLocation(pos=3849, lineno=88, colno=32) + end_location: SourceLocation(pos=3881, lineno=88, colno=64) entries: - location: SourceLocation(pos=2119, lineno=57, colno=33) - end_location: SourceLocation(pos=2149, lineno=57, colno=63) + location: SourceLocation(pos=3850, lineno=88, colno=33) + end_location: SourceLocation(pos=3880, lineno=88, colno=63) key: - location: SourceLocation(pos=2119, lineno=57, colno=33) - end_location: SourceLocation(pos=2129, lineno=57, colno=43) + location: SourceLocation(pos=3850, lineno=88, colno=33) + end_location: SourceLocation(pos=3860, lineno=88, colno=43) value: 'CanPlaceOn' value: - location: SourceLocation(pos=2131, lineno=57, colno=45) - end_location: SourceLocation(pos=2149, lineno=57, colno=63) + location: SourceLocation(pos=3862, lineno=88, colno=45) + end_location: SourceLocation(pos=3880, lineno=88, colno=63) elements: - location: SourceLocation(pos=2132, lineno=57, colno=46) - end_location: SourceLocation(pos=2148, lineno=57, colno=62) + location: SourceLocation(pos=3863, lineno=88, colno=46) + end_location: SourceLocation(pos=3879, lineno=88, colno=62) value: String('minecraft:dirt') - location: SourceLocation(pos=2151, lineno=58, colno=1) - end_location: SourceLocation(pos=2268, lineno=58, colno=118) + location: SourceLocation(pos=3882, lineno=89, colno=1) + end_location: SourceLocation(pos=3999, lineno=89, colno=118) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=2156, lineno=58, colno=6) - end_location: SourceLocation(pos=2158, lineno=58, colno=8) + location: SourceLocation(pos=3887, lineno=89, colno=6) + end_location: SourceLocation(pos=3889, lineno=89, colno=8) variable: 'a' arguments: - location: SourceLocation(pos=2159, lineno=58, colno=9) - end_location: SourceLocation(pos=2266, lineno=58, colno=116) + location: SourceLocation(pos=3890, lineno=89, colno=9) + end_location: SourceLocation(pos=3997, lineno=89, colno=116) identifier: - location: SourceLocation(pos=2159, lineno=58, colno=9) - end_location: SourceLocation(pos=2165, lineno=58, colno=15) + location: SourceLocation(pos=3890, lineno=89, colno=9) + end_location: SourceLocation(pos=3896, lineno=89, colno=15) is_tag: False namespace: None path: - location: SourceLocation(pos=2159, lineno=58, colno=9) - end_location: SourceLocation(pos=2165, lineno=58, colno=15) + location: SourceLocation(pos=3890, lineno=89, colno=9) + end_location: SourceLocation(pos=3896, lineno=89, colno=15) value: 'potion' data_tags: - location: SourceLocation(pos=2165, lineno=58, colno=15) - end_location: SourceLocation(pos=2266, lineno=58, colno=116) + location: SourceLocation(pos=3896, lineno=89, colno=15) + end_location: SourceLocation(pos=3997, lineno=89, colno=116) entries: - location: SourceLocation(pos=2166, lineno=58, colno=16) - end_location: SourceLocation(pos=2218, lineno=58, colno=68) + location: SourceLocation(pos=3897, lineno=89, colno=16) + end_location: SourceLocation(pos=3949, lineno=89, colno=68) key: - location: SourceLocation(pos=2166, lineno=58, colno=16) - end_location: SourceLocation(pos=2178, lineno=58, colno=28) + location: SourceLocation(pos=3897, lineno=89, colno=16) + end_location: SourceLocation(pos=3909, lineno=89, colno=28) value: 'Enchantments' value: - location: SourceLocation(pos=2180, lineno=58, colno=30) - end_location: SourceLocation(pos=2218, lineno=58, colno=68) + location: SourceLocation(pos=3911, lineno=89, colno=30) + end_location: SourceLocation(pos=3949, lineno=89, colno=68) elements: - location: SourceLocation(pos=2181, lineno=58, colno=31) - end_location: SourceLocation(pos=2217, lineno=58, colno=67) + location: SourceLocation(pos=3912, lineno=89, colno=31) + end_location: SourceLocation(pos=3948, lineno=89, colno=67) entries: - location: SourceLocation(pos=2182, lineno=58, colno=32) - end_location: SourceLocation(pos=2207, lineno=58, colno=57) + location: SourceLocation(pos=3913, lineno=89, colno=32) + end_location: SourceLocation(pos=3938, lineno=89, colno=57) key: - location: SourceLocation(pos=2182, lineno=58, colno=32) - end_location: SourceLocation(pos=2184, lineno=58, colno=34) + location: SourceLocation(pos=3913, lineno=89, colno=32) + end_location: SourceLocation(pos=3915, lineno=89, colno=34) value: 'id' value: - location: SourceLocation(pos=2186, lineno=58, colno=36) - end_location: SourceLocation(pos=2207, lineno=58, colno=57) + location: SourceLocation(pos=3917, lineno=89, colno=36) + end_location: SourceLocation(pos=3938, lineno=89, colno=57) value: String('minecraft:knockback') - location: SourceLocation(pos=2209, lineno=58, colno=59) - end_location: SourceLocation(pos=2216, lineno=58, colno=66) + location: SourceLocation(pos=3940, lineno=89, colno=59) + end_location: SourceLocation(pos=3947, lineno=89, colno=66) key: - location: SourceLocation(pos=2209, lineno=58, colno=59) - end_location: SourceLocation(pos=2212, lineno=58, colno=62) + location: SourceLocation(pos=3940, lineno=89, colno=59) + end_location: SourceLocation(pos=3943, lineno=89, colno=62) value: 'lvl' value: - location: SourceLocation(pos=2214, lineno=58, colno=64) - end_location: SourceLocation(pos=2216, lineno=58, colno=66) + location: SourceLocation(pos=3945, lineno=89, colno=64) + end_location: SourceLocation(pos=3947, lineno=89, colno=66) value: Int(10) - location: SourceLocation(pos=2220, lineno=58, colno=70) - end_location: SourceLocation(pos=2265, lineno=58, colno=115) + location: SourceLocation(pos=3951, lineno=89, colno=70) + end_location: SourceLocation(pos=3996, lineno=89, colno=115) key: - location: SourceLocation(pos=2220, lineno=58, colno=70) - end_location: SourceLocation(pos=2239, lineno=58, colno=89) + location: SourceLocation(pos=3951, lineno=89, colno=70) + end_location: SourceLocation(pos=3970, lineno=89, colno=89) value: 'CustomPotionEffects' value: - location: SourceLocation(pos=2241, lineno=58, colno=91) - end_location: SourceLocation(pos=2265, lineno=58, colno=115) + location: SourceLocation(pos=3972, lineno=89, colno=91) + end_location: SourceLocation(pos=3996, lineno=89, colno=115) elements: - location: SourceLocation(pos=2242, lineno=58, colno=92) - end_location: SourceLocation(pos=2264, lineno=58, colno=114) + location: SourceLocation(pos=3973, lineno=89, colno=92) + end_location: SourceLocation(pos=3995, lineno=89, colno=114) entries: - location: SourceLocation(pos=2243, lineno=58, colno=93) - end_location: SourceLocation(pos=2249, lineno=58, colno=99) + location: SourceLocation(pos=3974, lineno=89, colno=93) + end_location: SourceLocation(pos=3980, lineno=89, colno=99) key: - location: SourceLocation(pos=2243, lineno=58, colno=93) - end_location: SourceLocation(pos=2245, lineno=58, colno=95) + location: SourceLocation(pos=3974, lineno=89, colno=93) + end_location: SourceLocation(pos=3976, lineno=89, colno=95) value: 'Id' value: - location: SourceLocation(pos=2247, lineno=58, colno=97) - end_location: SourceLocation(pos=2249, lineno=58, colno=99) + location: SourceLocation(pos=3978, lineno=89, colno=97) + end_location: SourceLocation(pos=3980, lineno=89, colno=99) value: Int(20) - location: SourceLocation(pos=2251, lineno=58, colno=101) - end_location: SourceLocation(pos=2263, lineno=58, colno=113) + location: SourceLocation(pos=3982, lineno=89, colno=101) + end_location: SourceLocation(pos=3994, lineno=89, colno=113) key: - location: SourceLocation(pos=2251, lineno=58, colno=101) - end_location: SourceLocation(pos=2260, lineno=58, colno=110) + location: SourceLocation(pos=3982, lineno=89, colno=101) + end_location: SourceLocation(pos=3991, lineno=89, colno=110) value: 'Amplifier' value: - location: SourceLocation(pos=2262, lineno=58, colno=112) - end_location: SourceLocation(pos=2263, lineno=58, colno=113) + location: SourceLocation(pos=3993, lineno=89, colno=112) + end_location: SourceLocation(pos=3994, lineno=89, colno=113) value: Int(1) - location: SourceLocation(pos=2267, lineno=58, colno=117) - end_location: SourceLocation(pos=2268, lineno=58, colno=118) + location: SourceLocation(pos=3998, lineno=89, colno=117) + end_location: SourceLocation(pos=3999, lineno=89, colno=118) value: 1 - location: SourceLocation(pos=2276, lineno=60, colno=1) - end_location: SourceLocation(pos=2346, lineno=60, colno=71) + location: SourceLocation(pos=4007, lineno=91, colno=1) + end_location: SourceLocation(pos=4077, lineno=91, colno=71) identifier: 'item:replace:block:pos:slot:with:item:count' arguments: - location: SourceLocation(pos=2295, lineno=60, colno=20) - end_location: SourceLocation(pos=2301, lineno=60, colno=26) + location: SourceLocation(pos=4026, lineno=91, colno=20) + end_location: SourceLocation(pos=4032, lineno=91, colno=26) x: - location: SourceLocation(pos=2295, lineno=60, colno=20) - end_location: SourceLocation(pos=2296, lineno=60, colno=21) + location: SourceLocation(pos=4026, lineno=91, colno=20) + end_location: SourceLocation(pos=4027, lineno=91, colno=21) type: 'relative' value: 0 y: - location: SourceLocation(pos=2297, lineno=60, colno=22) - end_location: SourceLocation(pos=2299, lineno=60, colno=24) + location: SourceLocation(pos=4028, lineno=91, colno=22) + end_location: SourceLocation(pos=4030, lineno=91, colno=24) type: 'relative' value: 2 z: - location: SourceLocation(pos=2300, lineno=60, colno=25) - end_location: SourceLocation(pos=2301, lineno=60, colno=26) + location: SourceLocation(pos=4031, lineno=91, colno=25) + end_location: SourceLocation(pos=4032, lineno=91, colno=26) type: 'relative' value: 0 - location: SourceLocation(pos=2302, lineno=60, colno=27) - end_location: SourceLocation(pos=2314, lineno=60, colno=39) + location: SourceLocation(pos=4033, lineno=91, colno=27) + end_location: SourceLocation(pos=4045, lineno=91, colno=39) value: 'container.26' - location: SourceLocation(pos=2320, lineno=60, colno=45) - end_location: SourceLocation(pos=2344, lineno=60, colno=69) + location: SourceLocation(pos=4051, lineno=91, colno=45) + end_location: SourceLocation(pos=4075, lineno=91, colno=69) identifier: - location: SourceLocation(pos=2320, lineno=60, colno=45) - end_location: SourceLocation(pos=2344, lineno=60, colno=69) + location: SourceLocation(pos=4051, lineno=91, colno=45) + end_location: SourceLocation(pos=4075, lineno=91, colno=69) is_tag: False namespace: - location: SourceLocation(pos=2320, lineno=60, colno=45) - end_location: SourceLocation(pos=2329, lineno=60, colno=54) + location: SourceLocation(pos=4051, lineno=91, colno=45) + end_location: SourceLocation(pos=4060, lineno=91, colno=54) value: 'minecraft' path: - location: SourceLocation(pos=2330, lineno=60, colno=55) - end_location: SourceLocation(pos=2344, lineno=60, colno=69) + location: SourceLocation(pos=4061, lineno=91, colno=55) + end_location: SourceLocation(pos=4075, lineno=91, colno=69) value: 'spruce_sapling' data_tags: None - location: SourceLocation(pos=2345, lineno=60, colno=70) - end_location: SourceLocation(pos=2346, lineno=60, colno=71) + location: SourceLocation(pos=4076, lineno=91, colno=70) + end_location: SourceLocation(pos=4077, lineno=91, colno=71) value: 4 - location: SourceLocation(pos=2347, lineno=61, colno=1) - end_location: SourceLocation(pos=2410, lineno=61, colno=64) + location: SourceLocation(pos=4078, lineno=92, colno=1) + end_location: SourceLocation(pos=4141, lineno=92, colno=64) identifier: 'item:replace:entity:targets:slot:with:item:count' arguments: - location: SourceLocation(pos=2367, lineno=61, colno=21) - end_location: SourceLocation(pos=2369, lineno=61, colno=23) + location: SourceLocation(pos=4098, lineno=92, colno=21) + end_location: SourceLocation(pos=4100, lineno=92, colno=23) variable: 'p' arguments: - location: SourceLocation(pos=2370, lineno=61, colno=24) - end_location: SourceLocation(pos=2378, lineno=61, colno=32) + location: SourceLocation(pos=4101, lineno=92, colno=24) + end_location: SourceLocation(pos=4109, lineno=92, colno=32) value: 'hotbar.8' - location: SourceLocation(pos=2384, lineno=61, colno=38) - end_location: SourceLocation(pos=2408, lineno=61, colno=62) + location: SourceLocation(pos=4115, lineno=92, colno=38) + end_location: SourceLocation(pos=4139, lineno=92, colno=62) identifier: - location: SourceLocation(pos=2384, lineno=61, colno=38) - end_location: SourceLocation(pos=2408, lineno=61, colno=62) + location: SourceLocation(pos=4115, lineno=92, colno=38) + end_location: SourceLocation(pos=4139, lineno=92, colno=62) is_tag: False namespace: - location: SourceLocation(pos=2384, lineno=61, colno=38) - end_location: SourceLocation(pos=2393, lineno=61, colno=47) + location: SourceLocation(pos=4115, lineno=92, colno=38) + end_location: SourceLocation(pos=4124, lineno=92, colno=47) value: 'minecraft' path: - location: SourceLocation(pos=2394, lineno=61, colno=48) - end_location: SourceLocation(pos=2408, lineno=61, colno=62) + location: SourceLocation(pos=4125, lineno=92, colno=48) + end_location: SourceLocation(pos=4139, lineno=92, colno=62) value: 'spruce_sapling' data_tags: None - location: SourceLocation(pos=2409, lineno=61, colno=63) - end_location: SourceLocation(pos=2410, lineno=61, colno=64) + location: SourceLocation(pos=4140, lineno=92, colno=63) + end_location: SourceLocation(pos=4141, lineno=92, colno=64) value: 4 - location: SourceLocation(pos=2411, lineno=62, colno=1) - end_location: SourceLocation(pos=2479, lineno=62, colno=69) + location: SourceLocation(pos=4142, lineno=93, colno=1) + end_location: SourceLocation(pos=4210, lineno=93, colno=69) identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' arguments: - location: SourceLocation(pos=2431, lineno=62, colno=21) - end_location: SourceLocation(pos=2433, lineno=62, colno=23) + location: SourceLocation(pos=4162, lineno=93, colno=21) + end_location: SourceLocation(pos=4164, lineno=93, colno=23) variable: 's' arguments: - location: SourceLocation(pos=2434, lineno=62, colno=24) - end_location: SourceLocation(pos=2448, lineno=62, colno=38) + location: SourceLocation(pos=4165, lineno=93, colno=24) + end_location: SourceLocation(pos=4179, lineno=93, colno=38) value: 'weapon.offhand' - location: SourceLocation(pos=2461, lineno=62, colno=51) - end_location: SourceLocation(pos=2463, lineno=62, colno=53) + location: SourceLocation(pos=4192, lineno=93, colno=51) + end_location: SourceLocation(pos=4194, lineno=93, colno=53) variable: 's' arguments: - location: SourceLocation(pos=2464, lineno=62, colno=54) - end_location: SourceLocation(pos=2479, lineno=62, colno=69) + location: SourceLocation(pos=4195, lineno=93, colno=54) + end_location: SourceLocation(pos=4210, lineno=93, colno=69) value: 'weapon.mainhand' - location: SourceLocation(pos=2487, lineno=64, colno=1) - end_location: SourceLocation(pos=2494, lineno=64, colno=8) + location: SourceLocation(pos=4218, lineno=95, colno=1) + end_location: SourceLocation(pos=4225, lineno=95, colno=8) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2492, lineno=64, colno=6) - end_location: SourceLocation(pos=2494, lineno=64, colno=8) + location: SourceLocation(pos=4223, lineno=95, colno=6) + end_location: SourceLocation(pos=4225, lineno=95, colno=8) variable: 's' arguments: - location: SourceLocation(pos=2495, lineno=65, colno=1) - end_location: SourceLocation(pos=2505, lineno=65, colno=11) + location: SourceLocation(pos=4226, lineno=96, colno=1) + end_location: SourceLocation(pos=4236, lineno=96, colno=11) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2500, lineno=65, colno=6) - end_location: SourceLocation(pos=2505, lineno=65, colno=11) + location: SourceLocation(pos=4231, lineno=96, colno=6) + end_location: SourceLocation(pos=4236, lineno=96, colno=11) value: 'Steve' - location: SourceLocation(pos=2506, lineno=66, colno=1) - end_location: SourceLocation(pos=2524, lineno=66, colno=19) + location: SourceLocation(pos=4237, lineno=97, colno=1) + end_location: SourceLocation(pos=4255, lineno=97, colno=19) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2511, lineno=66, colno=6) - end_location: SourceLocation(pos=2524, lineno=66, colno=19) + location: SourceLocation(pos=4242, lineno=97, colno=6) + end_location: SourceLocation(pos=4255, lineno=97, colno=19) variable: 'e' arguments: - location: SourceLocation(pos=2514, lineno=66, colno=9) - end_location: SourceLocation(pos=2523, lineno=66, colno=18) + location: SourceLocation(pos=4245, lineno=97, colno=9) + end_location: SourceLocation(pos=4254, lineno=97, colno=18) inverted: False key: - location: SourceLocation(pos=2514, lineno=66, colno=9) - end_location: SourceLocation(pos=2518, lineno=66, colno=13) + location: SourceLocation(pos=4245, lineno=97, colno=9) + end_location: SourceLocation(pos=4249, lineno=97, colno=13) value: 'type' value: - location: SourceLocation(pos=2519, lineno=66, colno=14) - end_location: SourceLocation(pos=2523, lineno=66, colno=18) + location: SourceLocation(pos=4250, lineno=97, colno=14) + end_location: SourceLocation(pos=4254, lineno=97, colno=18) is_tag: False namespace: None path: - location: SourceLocation(pos=2519, lineno=66, colno=14) - end_location: SourceLocation(pos=2523, lineno=66, colno=18) + location: SourceLocation(pos=4250, lineno=97, colno=14) + end_location: SourceLocation(pos=4254, lineno=97, colno=18) value: 'item' - location: SourceLocation(pos=2525, lineno=67, colno=1) - end_location: SourceLocation(pos=2547, lineno=67, colno=23) + location: SourceLocation(pos=4256, lineno=98, colno=1) + end_location: SourceLocation(pos=4278, lineno=98, colno=23) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2530, lineno=67, colno=6) - end_location: SourceLocation(pos=2547, lineno=67, colno=23) + location: SourceLocation(pos=4261, lineno=98, colno=6) + end_location: SourceLocation(pos=4278, lineno=98, colno=23) variable: 'e' arguments: - location: SourceLocation(pos=2533, lineno=67, colno=9) - end_location: SourceLocation(pos=2546, lineno=67, colno=22) + location: SourceLocation(pos=4264, lineno=98, colno=9) + end_location: SourceLocation(pos=4277, lineno=98, colno=22) inverted: False key: - location: SourceLocation(pos=2533, lineno=67, colno=9) - end_location: SourceLocation(pos=2541, lineno=67, colno=17) + location: SourceLocation(pos=4264, lineno=98, colno=9) + end_location: SourceLocation(pos=4272, lineno=98, colno=17) value: 'distance' value: - location: SourceLocation(pos=2542, lineno=67, colno=18) - end_location: SourceLocation(pos=2546, lineno=67, colno=22) + location: SourceLocation(pos=4273, lineno=98, colno=18) + end_location: SourceLocation(pos=4277, lineno=98, colno=22) min: None max: 10.0 - location: SourceLocation(pos=2548, lineno=68, colno=1) - end_location: SourceLocation(pos=2569, lineno=68, colno=22) + location: SourceLocation(pos=4279, lineno=99, colno=1) + end_location: SourceLocation(pos=4300, lineno=99, colno=22) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2553, lineno=68, colno=6) - end_location: SourceLocation(pos=2569, lineno=68, colno=22) + location: SourceLocation(pos=4284, lineno=99, colno=6) + end_location: SourceLocation(pos=4300, lineno=99, colno=22) variable: 'e' arguments: - location: SourceLocation(pos=2556, lineno=68, colno=9) - end_location: SourceLocation(pos=2568, lineno=68, colno=21) + location: SourceLocation(pos=4287, lineno=99, colno=9) + end_location: SourceLocation(pos=4299, lineno=99, colno=21) inverted: True key: - location: SourceLocation(pos=2556, lineno=68, colno=9) - end_location: SourceLocation(pos=2560, lineno=68, colno=13) + location: SourceLocation(pos=4287, lineno=99, colno=9) + end_location: SourceLocation(pos=4291, lineno=99, colno=13) value: 'type' value: - location: SourceLocation(pos=2562, lineno=68, colno=15) - end_location: SourceLocation(pos=2568, lineno=68, colno=21) + location: SourceLocation(pos=4293, lineno=99, colno=15) + end_location: SourceLocation(pos=4299, lineno=99, colno=21) is_tag: False namespace: None path: - location: SourceLocation(pos=2562, lineno=68, colno=15) - end_location: SourceLocation(pos=2568, lineno=68, colno=21) + location: SourceLocation(pos=4293, lineno=99, colno=15) + end_location: SourceLocation(pos=4299, lineno=99, colno=21) value: 'player' - location: SourceLocation(pos=2570, lineno=69, colno=1) - end_location: SourceLocation(pos=2605, lineno=69, colno=36) + location: SourceLocation(pos=4301, lineno=100, colno=1) + end_location: SourceLocation(pos=4336, lineno=100, colno=36) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2575, lineno=69, colno=6) - end_location: SourceLocation(pos=2605, lineno=69, colno=36) + location: SourceLocation(pos=4306, lineno=100, colno=6) + end_location: SourceLocation(pos=4336, lineno=100, colno=36) variable: 'e' arguments: - location: SourceLocation(pos=2578, lineno=69, colno=9) - end_location: SourceLocation(pos=2591, lineno=69, colno=22) + location: SourceLocation(pos=4309, lineno=100, colno=9) + end_location: SourceLocation(pos=4322, lineno=100, colno=22) inverted: False key: - location: SourceLocation(pos=2578, lineno=69, colno=9) - end_location: SourceLocation(pos=2586, lineno=69, colno=17) + location: SourceLocation(pos=4309, lineno=100, colno=9) + end_location: SourceLocation(pos=4317, lineno=100, colno=17) value: 'distance' value: - location: SourceLocation(pos=2587, lineno=69, colno=18) - end_location: SourceLocation(pos=2591, lineno=69, colno=22) + location: SourceLocation(pos=4318, lineno=100, colno=18) + end_location: SourceLocation(pos=4322, lineno=100, colno=22) min: None max: 10.0 - location: SourceLocation(pos=2592, lineno=69, colno=23) - end_location: SourceLocation(pos=2604, lineno=69, colno=35) + location: SourceLocation(pos=4323, lineno=100, colno=23) + end_location: SourceLocation(pos=4335, lineno=100, colno=35) inverted: False key: - location: SourceLocation(pos=2592, lineno=69, colno=23) - end_location: SourceLocation(pos=2596, lineno=69, colno=27) + location: SourceLocation(pos=4323, lineno=100, colno=23) + end_location: SourceLocation(pos=4327, lineno=100, colno=27) value: 'type' value: - location: SourceLocation(pos=2597, lineno=69, colno=28) - end_location: SourceLocation(pos=2604, lineno=69, colno=35) + location: SourceLocation(pos=4328, lineno=100, colno=28) + end_location: SourceLocation(pos=4335, lineno=100, colno=35) is_tag: False namespace: None path: - location: SourceLocation(pos=2597, lineno=69, colno=28) - end_location: SourceLocation(pos=2604, lineno=69, colno=35) + location: SourceLocation(pos=4328, lineno=100, colno=28) + end_location: SourceLocation(pos=4335, lineno=100, colno=35) value: 'creeper' - location: SourceLocation(pos=2606, lineno=70, colno=1) - end_location: SourceLocation(pos=2672, lineno=70, colno=67) + location: SourceLocation(pos=4337, lineno=101, colno=1) + end_location: SourceLocation(pos=4403, lineno=101, colno=67) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2611, lineno=70, colno=6) - end_location: SourceLocation(pos=2672, lineno=70, colno=67) + location: SourceLocation(pos=4342, lineno=101, colno=6) + end_location: SourceLocation(pos=4403, lineno=101, colno=67) variable: 'e' arguments: - location: SourceLocation(pos=2614, lineno=70, colno=9) - end_location: SourceLocation(pos=2624, lineno=70, colno=19) + location: SourceLocation(pos=4345, lineno=101, colno=9) + end_location: SourceLocation(pos=4355, lineno=101, colno=19) inverted: False key: - location: SourceLocation(pos=2614, lineno=70, colno=9) - end_location: SourceLocation(pos=2618, lineno=70, colno=13) + location: SourceLocation(pos=4345, lineno=101, colno=9) + end_location: SourceLocation(pos=4349, lineno=101, colno=13) value: 'type' value: - location: SourceLocation(pos=2619, lineno=70, colno=14) - end_location: SourceLocation(pos=2624, lineno=70, colno=19) + location: SourceLocation(pos=4350, lineno=101, colno=14) + end_location: SourceLocation(pos=4355, lineno=101, colno=19) is_tag: False namespace: None path: - location: SourceLocation(pos=2619, lineno=70, colno=14) - end_location: SourceLocation(pos=2624, lineno=70, colno=19) + location: SourceLocation(pos=4350, lineno=101, colno=14) + end_location: SourceLocation(pos=4355, lineno=101, colno=19) value: 'arrow' - location: SourceLocation(pos=2625, lineno=70, colno=20) - end_location: SourceLocation(pos=2671, lineno=70, colno=66) + location: SourceLocation(pos=4356, lineno=101, colno=20) + end_location: SourceLocation(pos=4402, lineno=101, colno=66) inverted: False key: - location: SourceLocation(pos=2625, lineno=70, colno=20) - end_location: SourceLocation(pos=2628, lineno=70, colno=23) + location: SourceLocation(pos=4356, lineno=101, colno=20) + end_location: SourceLocation(pos=4359, lineno=101, colno=23) value: 'nbt' value: - location: SourceLocation(pos=2629, lineno=70, colno=24) - end_location: SourceLocation(pos=2671, lineno=70, colno=66) + location: SourceLocation(pos=4360, lineno=101, colno=24) + end_location: SourceLocation(pos=4402, lineno=101, colno=66) entries: - location: SourceLocation(pos=2630, lineno=70, colno=25) - end_location: SourceLocation(pos=2670, lineno=70, colno=65) + location: SourceLocation(pos=4361, lineno=101, colno=25) + end_location: SourceLocation(pos=4401, lineno=101, colno=65) key: - location: SourceLocation(pos=2630, lineno=70, colno=25) - end_location: SourceLocation(pos=2642, lineno=70, colno=37) + location: SourceLocation(pos=4361, lineno=101, colno=25) + end_location: SourceLocation(pos=4373, lineno=101, colno=37) value: 'inBlockState' value: - location: SourceLocation(pos=2644, lineno=70, colno=39) - end_location: SourceLocation(pos=2670, lineno=70, colno=65) + location: SourceLocation(pos=4375, lineno=101, colno=39) + end_location: SourceLocation(pos=4401, lineno=101, colno=65) entries: - location: SourceLocation(pos=2645, lineno=70, colno=40) - end_location: SourceLocation(pos=2669, lineno=70, colno=64) + location: SourceLocation(pos=4376, lineno=101, colno=40) + end_location: SourceLocation(pos=4400, lineno=101, colno=64) key: - location: SourceLocation(pos=2645, lineno=70, colno=40) - end_location: SourceLocation(pos=2649, lineno=70, colno=44) + location: SourceLocation(pos=4376, lineno=101, colno=40) + end_location: SourceLocation(pos=4380, lineno=101, colno=44) value: 'Name' value: - location: SourceLocation(pos=2651, lineno=70, colno=46) - end_location: SourceLocation(pos=2669, lineno=70, colno=64) + location: SourceLocation(pos=4382, lineno=101, colno=46) + end_location: SourceLocation(pos=4400, lineno=101, colno=64) value: String('minecraft:target') - location: SourceLocation(pos=2682, lineno=72, colno=1) - end_location: SourceLocation(pos=2696, lineno=72, colno=15) + location: SourceLocation(pos=4413, lineno=103, colno=1) + end_location: SourceLocation(pos=4427, lineno=103, colno=15) identifier: 'locate:mansion' arguments: - location: SourceLocation(pos=2703, lineno=74, colno=1) - end_location: SourceLocation(pos=2712, lineno=74, colno=10) + location: SourceLocation(pos=4434, lineno=105, colno=1) + end_location: SourceLocation(pos=4443, lineno=105, colno=10) identifier: 'msg:targets:message' arguments: - location: SourceLocation(pos=2707, lineno=74, colno=5) - end_location: SourceLocation(pos=2709, lineno=74, colno=7) + location: SourceLocation(pos=4438, lineno=105, colno=5) + end_location: SourceLocation(pos=4440, lineno=105, colno=7) variable: 'a' arguments: - location: SourceLocation(pos=2710, lineno=74, colno=8) - end_location: SourceLocation(pos=2712, lineno=74, colno=10) + location: SourceLocation(pos=4441, lineno=105, colno=8) + end_location: SourceLocation(pos=4443, lineno=105, colno=10) words: - location: SourceLocation(pos=2710, lineno=74, colno=8) - end_location: SourceLocation(pos=2712, lineno=74, colno=10) + location: SourceLocation(pos=4441, lineno=105, colno=8) + end_location: SourceLocation(pos=4443, lineno=105, colno=10) value: 'Hi' - location: SourceLocation(pos=2724, lineno=76, colno=1) - end_location: SourceLocation(pos=2757, lineno=76, colno=34) + location: SourceLocation(pos=4455, lineno=107, colno=1) + end_location: SourceLocation(pos=4484, lineno=107, colno=30) + identifier: 'particle:name' + arguments: + + location: SourceLocation(pos=4464, lineno=107, colno=10) + end_location: SourceLocation(pos=4484, lineno=107, colno=30) + name: + + location: SourceLocation(pos=4464, lineno=107, colno=10) + end_location: SourceLocation(pos=4468, lineno=107, colno=14) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4464, lineno=107, colno=10) + end_location: SourceLocation(pos=4468, lineno=107, colno=14) + value: 'dust' + parameters: + + location: SourceLocation(pos=4469, lineno=107, colno=15) + end_location: SourceLocation(pos=4484, lineno=107, colno=30) + red: + + location: SourceLocation(pos=4469, lineno=107, colno=15) + end_location: SourceLocation(pos=4472, lineno=107, colno=18) + value: 1.0 + green: + + location: SourceLocation(pos=4473, lineno=107, colno=19) + end_location: SourceLocation(pos=4476, lineno=107, colno=22) + value: 0.5 + blue: + + location: SourceLocation(pos=4477, lineno=107, colno=23) + end_location: SourceLocation(pos=4480, lineno=107, colno=26) + value: 0.5 + size: + + location: SourceLocation(pos=4481, lineno=107, colno=27) + end_location: SourceLocation(pos=4484, lineno=107, colno=30) + value: 1.0 + + location: SourceLocation(pos=4485, lineno=108, colno=1) + end_location: SourceLocation(pos=4543, lineno=108, colno=59) + identifier: 'particle:name' + arguments: + + location: SourceLocation(pos=4494, lineno=108, colno=10) + end_location: SourceLocation(pos=4543, lineno=108, colno=59) + name: + + location: SourceLocation(pos=4494, lineno=108, colno=10) + end_location: SourceLocation(pos=4515, lineno=108, colno=31) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4494, lineno=108, colno=10) + end_location: SourceLocation(pos=4515, lineno=108, colno=31) + value: 'dust_color_transition' + parameters: + + location: SourceLocation(pos=4516, lineno=108, colno=32) + end_location: SourceLocation(pos=4543, lineno=108, colno=59) + red: + + location: SourceLocation(pos=4516, lineno=108, colno=32) + end_location: SourceLocation(pos=4519, lineno=108, colno=35) + value: 1.0 + green: + + location: SourceLocation(pos=4520, lineno=108, colno=36) + end_location: SourceLocation(pos=4523, lineno=108, colno=39) + value: 0.0 + blue: + + location: SourceLocation(pos=4524, lineno=108, colno=40) + end_location: SourceLocation(pos=4527, lineno=108, colno=43) + value: 0.0 + size: + + location: SourceLocation(pos=4528, lineno=108, colno=44) + end_location: SourceLocation(pos=4531, lineno=108, colno=47) + value: 1.0 + end_red: + + location: SourceLocation(pos=4532, lineno=108, colno=48) + end_location: SourceLocation(pos=4535, lineno=108, colno=51) + value: 0.0 + end_green: + + location: SourceLocation(pos=4536, lineno=108, colno=52) + end_location: SourceLocation(pos=4539, lineno=108, colno=55) + value: 0.0 + end_blue: + + location: SourceLocation(pos=4540, lineno=108, colno=56) + end_location: SourceLocation(pos=4543, lineno=108, colno=59) + value: 1.0 + + location: SourceLocation(pos=4544, lineno=109, colno=1) + end_location: SourceLocation(pos=4592, lineno=109, colno=49) + identifier: 'particle:name' + arguments: + + location: SourceLocation(pos=4553, lineno=109, colno=10) + end_location: SourceLocation(pos=4592, lineno=109, colno=49) + name: + + location: SourceLocation(pos=4553, lineno=109, colno=10) + end_location: SourceLocation(pos=4558, lineno=109, colno=15) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4553, lineno=109, colno=10) + end_location: SourceLocation(pos=4558, lineno=109, colno=15) + value: 'block' + parameters: + + location: SourceLocation(pos=4559, lineno=109, colno=16) + end_location: SourceLocation(pos=4592, lineno=109, colno=49) + block: + + location: SourceLocation(pos=4559, lineno=109, colno=16) + end_location: SourceLocation(pos=4592, lineno=109, colno=49) + identifier: + + location: SourceLocation(pos=4559, lineno=109, colno=16) + end_location: SourceLocation(pos=4580, lineno=109, colno=37) + is_tag: False + namespace: + + location: SourceLocation(pos=4559, lineno=109, colno=16) + end_location: SourceLocation(pos=4568, lineno=109, colno=25) + value: 'minecraft' + path: + + location: SourceLocation(pos=4569, lineno=109, colno=26) + end_location: SourceLocation(pos=4580, lineno=109, colno=37) + value: 'grass_block' + block_states: + + location: SourceLocation(pos=4581, lineno=109, colno=38) + end_location: SourceLocation(pos=4591, lineno=109, colno=48) + key: + + location: SourceLocation(pos=4581, lineno=109, colno=38) + end_location: SourceLocation(pos=4586, lineno=109, colno=43) + value: 'snowy' + value: + + location: SourceLocation(pos=4587, lineno=109, colno=44) + end_location: SourceLocation(pos=4591, lineno=109, colno=48) + value: 'true' + data_tags: None + + location: SourceLocation(pos=4593, lineno=110, colno=1) + end_location: SourceLocation(pos=4648, lineno=110, colno=56) + identifier: 'particle:name' + arguments: + + location: SourceLocation(pos=4602, lineno=110, colno=10) + end_location: SourceLocation(pos=4648, lineno=110, colno=56) + name: + + location: SourceLocation(pos=4602, lineno=110, colno=10) + end_location: SourceLocation(pos=4614, lineno=110, colno=22) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4602, lineno=110, colno=10) + end_location: SourceLocation(pos=4614, lineno=110, colno=22) + value: 'falling_dust' + parameters: + + location: SourceLocation(pos=4615, lineno=110, colno=23) + end_location: SourceLocation(pos=4648, lineno=110, colno=56) + block: + + location: SourceLocation(pos=4615, lineno=110, colno=23) + end_location: SourceLocation(pos=4648, lineno=110, colno=56) + identifier: + + location: SourceLocation(pos=4615, lineno=110, colno=23) + end_location: SourceLocation(pos=4636, lineno=110, colno=44) + is_tag: False + namespace: + + location: SourceLocation(pos=4615, lineno=110, colno=23) + end_location: SourceLocation(pos=4624, lineno=110, colno=32) + value: 'minecraft' + path: + + location: SourceLocation(pos=4625, lineno=110, colno=33) + end_location: SourceLocation(pos=4636, lineno=110, colno=44) + value: 'grass_block' + block_states: + + location: SourceLocation(pos=4637, lineno=110, colno=45) + end_location: SourceLocation(pos=4647, lineno=110, colno=55) + key: + + location: SourceLocation(pos=4637, lineno=110, colno=45) + end_location: SourceLocation(pos=4642, lineno=110, colno=50) + value: 'snowy' + value: + + location: SourceLocation(pos=4643, lineno=110, colno=51) + end_location: SourceLocation(pos=4647, lineno=110, colno=55) + value: 'true' + data_tags: None + + location: SourceLocation(pos=4649, lineno=111, colno=1) + end_location: SourceLocation(pos=4678, lineno=111, colno=30) + identifier: 'particle:name' + arguments: + + location: SourceLocation(pos=4658, lineno=111, colno=10) + end_location: SourceLocation(pos=4678, lineno=111, colno=30) + name: + + location: SourceLocation(pos=4658, lineno=111, colno=10) + end_location: SourceLocation(pos=4662, lineno=111, colno=14) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4658, lineno=111, colno=10) + end_location: SourceLocation(pos=4662, lineno=111, colno=14) + value: 'item' + parameters: + + location: SourceLocation(pos=4663, lineno=111, colno=15) + end_location: SourceLocation(pos=4678, lineno=111, colno=30) + item: + + location: SourceLocation(pos=4663, lineno=111, colno=15) + end_location: SourceLocation(pos=4678, lineno=111, colno=30) + identifier: + + location: SourceLocation(pos=4663, lineno=111, colno=15) + end_location: SourceLocation(pos=4678, lineno=111, colno=30) + is_tag: False + namespace: + + location: SourceLocation(pos=4663, lineno=111, colno=15) + end_location: SourceLocation(pos=4672, lineno=111, colno=24) + value: 'minecraft' + path: + + location: SourceLocation(pos=4673, lineno=111, colno=25) + end_location: SourceLocation(pos=4678, lineno=111, colno=30) + value: 'apple' + data_tags: None + + location: SourceLocation(pos=4679, lineno=112, colno=1) + end_location: SourceLocation(pos=4727, lineno=112, colno=49) + identifier: 'particle:name' + arguments: + + location: SourceLocation(pos=4688, lineno=112, colno=10) + end_location: SourceLocation(pos=4727, lineno=112, colno=49) + name: + + location: SourceLocation(pos=4688, lineno=112, colno=10) + end_location: SourceLocation(pos=4697, lineno=112, colno=19) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4688, lineno=112, colno=10) + end_location: SourceLocation(pos=4697, lineno=112, colno=19) + value: 'vibration' + parameters: + + location: SourceLocation(pos=4698, lineno=112, colno=20) + end_location: SourceLocation(pos=4727, lineno=112, colno=49) + x1: + + location: SourceLocation(pos=4698, lineno=112, colno=20) + end_location: SourceLocation(pos=4701, lineno=112, colno=23) + value: 0.0 + y1: + + location: SourceLocation(pos=4702, lineno=112, colno=24) + end_location: SourceLocation(pos=4706, lineno=112, colno=28) + value: 64.0 + z1: + + location: SourceLocation(pos=4707, lineno=112, colno=29) + end_location: SourceLocation(pos=4710, lineno=112, colno=32) + value: 0.0 + x2: + + location: SourceLocation(pos=4711, lineno=112, colno=33) + end_location: SourceLocation(pos=4714, lineno=112, colno=36) + value: 5.0 + y2: + + location: SourceLocation(pos=4715, lineno=112, colno=37) + end_location: SourceLocation(pos=4719, lineno=112, colno=41) + value: 64.0 + z2: + + location: SourceLocation(pos=4720, lineno=112, colno=42) + end_location: SourceLocation(pos=4723, lineno=112, colno=45) + value: 0.0 + duration: + + location: SourceLocation(pos=4724, lineno=112, colno=46) + end_location: SourceLocation(pos=4727, lineno=112, colno=49) + value: 200 + + location: SourceLocation(pos=4728, lineno=113, colno=1) + end_location: SourceLocation(pos=4783, lineno=113, colno=56) + identifier: 'particle:name:pos' + arguments: + + location: SourceLocation(pos=4737, lineno=113, colno=10) + end_location: SourceLocation(pos=4776, lineno=113, colno=49) + name: + + location: SourceLocation(pos=4737, lineno=113, colno=10) + end_location: SourceLocation(pos=4746, lineno=113, colno=19) + is_tag: False + namespace: None + path: + + location: SourceLocation(pos=4737, lineno=113, colno=10) + end_location: SourceLocation(pos=4746, lineno=113, colno=19) + value: 'vibration' + parameters: + + location: SourceLocation(pos=4747, lineno=113, colno=20) + end_location: SourceLocation(pos=4776, lineno=113, colno=49) + x1: + + location: SourceLocation(pos=4747, lineno=113, colno=20) + end_location: SourceLocation(pos=4750, lineno=113, colno=23) + value: 0.0 + y1: + + location: SourceLocation(pos=4751, lineno=113, colno=24) + end_location: SourceLocation(pos=4755, lineno=113, colno=28) + value: 64.0 + z1: + + location: SourceLocation(pos=4756, lineno=113, colno=29) + end_location: SourceLocation(pos=4759, lineno=113, colno=32) + value: 0.0 + x2: + + location: SourceLocation(pos=4760, lineno=113, colno=33) + end_location: SourceLocation(pos=4763, lineno=113, colno=36) + value: 5.0 + y2: + + location: SourceLocation(pos=4764, lineno=113, colno=37) + end_location: SourceLocation(pos=4768, lineno=113, colno=41) + value: 64.0 + z2: + + location: SourceLocation(pos=4769, lineno=113, colno=42) + end_location: SourceLocation(pos=4772, lineno=113, colno=45) + value: 0.0 + duration: + + location: SourceLocation(pos=4773, lineno=113, colno=46) + end_location: SourceLocation(pos=4776, lineno=113, colno=49) + value: 200 + + location: SourceLocation(pos=4777, lineno=113, colno=50) + end_location: SourceLocation(pos=4783, lineno=113, colno=56) + x: + + location: SourceLocation(pos=4777, lineno=113, colno=50) + end_location: SourceLocation(pos=4778, lineno=113, colno=51) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=4779, lineno=113, colno=52) + end_location: SourceLocation(pos=4780, lineno=113, colno=53) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=4781, lineno=113, colno=54) + end_location: SourceLocation(pos=4783, lineno=113, colno=56) + type: 'local' + value: 3 + + location: SourceLocation(pos=4795, lineno=115, colno=1) + end_location: SourceLocation(pos=4828, lineno=115, colno=34) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=2733, lineno=76, colno=10) - end_location: SourceLocation(pos=2738, lineno=76, colno=15) + location: SourceLocation(pos=4804, lineno=115, colno=10) + end_location: SourceLocation(pos=4809, lineno=115, colno=15) x: - location: SourceLocation(pos=2733, lineno=76, colno=10) - end_location: SourceLocation(pos=2734, lineno=76, colno=11) + location: SourceLocation(pos=4804, lineno=115, colno=10) + end_location: SourceLocation(pos=4805, lineno=115, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=2735, lineno=76, colno=12) - end_location: SourceLocation(pos=2736, lineno=76, colno=13) + location: SourceLocation(pos=4806, lineno=115, colno=12) + end_location: SourceLocation(pos=4807, lineno=115, colno=13) type: 'relative' value: 0 z: - location: SourceLocation(pos=2737, lineno=76, colno=14) - end_location: SourceLocation(pos=2738, lineno=76, colno=15) + location: SourceLocation(pos=4808, lineno=115, colno=14) + end_location: SourceLocation(pos=4809, lineno=115, colno=15) type: 'relative' value: 0 - location: SourceLocation(pos=2739, lineno=76, colno=16) - end_location: SourceLocation(pos=2757, lineno=76, colno=34) + location: SourceLocation(pos=4810, lineno=115, colno=16) + end_location: SourceLocation(pos=4828, lineno=115, colno=34) identifier: - location: SourceLocation(pos=2739, lineno=76, colno=16) - end_location: SourceLocation(pos=2744, lineno=76, colno=21) + location: SourceLocation(pos=4810, lineno=115, colno=16) + end_location: SourceLocation(pos=4815, lineno=115, colno=21) is_tag: False namespace: None path: - location: SourceLocation(pos=2739, lineno=76, colno=16) - end_location: SourceLocation(pos=2744, lineno=76, colno=21) + location: SourceLocation(pos=4810, lineno=115, colno=16) + end_location: SourceLocation(pos=4815, lineno=115, colno=21) value: 'chest' block_states: - location: SourceLocation(pos=2745, lineno=76, colno=22) - end_location: SourceLocation(pos=2756, lineno=76, colno=33) + location: SourceLocation(pos=4816, lineno=115, colno=22) + end_location: SourceLocation(pos=4827, lineno=115, colno=33) key: - location: SourceLocation(pos=2745, lineno=76, colno=22) - end_location: SourceLocation(pos=2751, lineno=76, colno=28) + location: SourceLocation(pos=4816, lineno=115, colno=22) + end_location: SourceLocation(pos=4822, lineno=115, colno=28) value: 'facing' value: - location: SourceLocation(pos=2752, lineno=76, colno=29) - end_location: SourceLocation(pos=2756, lineno=76, colno=33) + location: SourceLocation(pos=4823, lineno=115, colno=29) + end_location: SourceLocation(pos=4827, lineno=115, colno=33) value: 'east' data_tags: None - location: SourceLocation(pos=2758, lineno=77, colno=1) - end_location: SourceLocation(pos=2831, lineno=77, colno=74) + location: SourceLocation(pos=4829, lineno=116, colno=1) + end_location: SourceLocation(pos=4902, lineno=116, colno=74) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=2767, lineno=77, colno=10) - end_location: SourceLocation(pos=2774, lineno=77, colno=17) + location: SourceLocation(pos=4838, lineno=116, colno=10) + end_location: SourceLocation(pos=4845, lineno=116, colno=17) x: - location: SourceLocation(pos=2767, lineno=77, colno=10) - end_location: SourceLocation(pos=2768, lineno=77, colno=11) + location: SourceLocation(pos=4838, lineno=116, colno=10) + end_location: SourceLocation(pos=4839, lineno=116, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=2769, lineno=77, colno=12) - end_location: SourceLocation(pos=2770, lineno=77, colno=13) + location: SourceLocation(pos=4840, lineno=116, colno=12) + end_location: SourceLocation(pos=4841, lineno=116, colno=13) type: 'relative' value: 0 z: - location: SourceLocation(pos=2771, lineno=77, colno=14) - end_location: SourceLocation(pos=2774, lineno=77, colno=17) + location: SourceLocation(pos=4842, lineno=116, colno=14) + end_location: SourceLocation(pos=4845, lineno=116, colno=17) type: 'relative' value: -1 - location: SourceLocation(pos=2775, lineno=77, colno=18) - end_location: SourceLocation(pos=2831, lineno=77, colno=74) + location: SourceLocation(pos=4846, lineno=116, colno=18) + end_location: SourceLocation(pos=4902, lineno=116, colno=74) identifier: - location: SourceLocation(pos=2775, lineno=77, colno=18) - end_location: SourceLocation(pos=2785, lineno=77, colno=28) + location: SourceLocation(pos=4846, lineno=116, colno=18) + end_location: SourceLocation(pos=4856, lineno=116, colno=28) is_tag: False namespace: None path: - location: SourceLocation(pos=2775, lineno=77, colno=18) - end_location: SourceLocation(pos=2785, lineno=77, colno=28) + location: SourceLocation(pos=4846, lineno=116, colno=18) + end_location: SourceLocation(pos=4856, lineno=116, colno=28) value: 'birch_sign' block_states: data_tags: - location: SourceLocation(pos=2785, lineno=77, colno=28) - end_location: SourceLocation(pos=2831, lineno=77, colno=74) + location: SourceLocation(pos=4856, lineno=116, colno=28) + end_location: SourceLocation(pos=4902, lineno=116, colno=74) entries: - location: SourceLocation(pos=2786, lineno=77, colno=29) - end_location: SourceLocation(pos=2805, lineno=77, colno=48) + location: SourceLocation(pos=4857, lineno=116, colno=29) + end_location: SourceLocation(pos=4876, lineno=116, colno=48) key: - location: SourceLocation(pos=2786, lineno=77, colno=29) - end_location: SourceLocation(pos=2791, lineno=77, colno=34) + location: SourceLocation(pos=4857, lineno=116, colno=29) + end_location: SourceLocation(pos=4862, lineno=116, colno=34) value: 'Text1' value: - location: SourceLocation(pos=2793, lineno=77, colno=36) - end_location: SourceLocation(pos=2805, lineno=77, colno=48) + location: SourceLocation(pos=4864, lineno=116, colno=36) + end_location: SourceLocation(pos=4876, lineno=116, colno=48) value: String('"My chest"') - location: SourceLocation(pos=2807, lineno=77, colno=50) - end_location: SourceLocation(pos=2830, lineno=77, colno=73) + location: SourceLocation(pos=4878, lineno=116, colno=50) + end_location: SourceLocation(pos=4901, lineno=116, colno=73) key: - location: SourceLocation(pos=2807, lineno=77, colno=50) - end_location: SourceLocation(pos=2812, lineno=77, colno=55) + location: SourceLocation(pos=4878, lineno=116, colno=50) + end_location: SourceLocation(pos=4883, lineno=116, colno=55) value: 'Text2' value: - location: SourceLocation(pos=2814, lineno=77, colno=57) - end_location: SourceLocation(pos=2830, lineno=77, colno=73) + location: SourceLocation(pos=4885, lineno=116, colno=57) + end_location: SourceLocation(pos=4901, lineno=116, colno=73) value: String('"Do not open!"') - location: SourceLocation(pos=2832, lineno=78, colno=1) - end_location: SourceLocation(pos=2869, lineno=78, colno=38) + location: SourceLocation(pos=4903, lineno=117, colno=1) + end_location: SourceLocation(pos=4940, lineno=117, colno=38) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=2841, lineno=78, colno=10) - end_location: SourceLocation(pos=2847, lineno=78, colno=16) + location: SourceLocation(pos=4912, lineno=117, colno=10) + end_location: SourceLocation(pos=4918, lineno=117, colno=16) x: - location: SourceLocation(pos=2841, lineno=78, colno=10) - end_location: SourceLocation(pos=2842, lineno=78, colno=11) + location: SourceLocation(pos=4912, lineno=117, colno=10) + end_location: SourceLocation(pos=4913, lineno=117, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=2843, lineno=78, colno=12) - end_location: SourceLocation(pos=2845, lineno=78, colno=14) + location: SourceLocation(pos=4914, lineno=117, colno=12) + end_location: SourceLocation(pos=4916, lineno=117, colno=14) type: 'relative' value: 2 z: - location: SourceLocation(pos=2846, lineno=78, colno=15) - end_location: SourceLocation(pos=2847, lineno=78, colno=16) + location: SourceLocation(pos=4917, lineno=117, colno=15) + end_location: SourceLocation(pos=4918, lineno=117, colno=16) type: 'relative' value: 0 - location: SourceLocation(pos=2848, lineno=78, colno=17) - end_location: SourceLocation(pos=2869, lineno=78, colno=38) + location: SourceLocation(pos=4919, lineno=117, colno=17) + end_location: SourceLocation(pos=4940, lineno=117, colno=38) identifier: - location: SourceLocation(pos=2848, lineno=78, colno=17) - end_location: SourceLocation(pos=2859, lineno=78, colno=28) + location: SourceLocation(pos=4919, lineno=117, colno=17) + end_location: SourceLocation(pos=4930, lineno=117, colno=28) is_tag: False namespace: None path: - location: SourceLocation(pos=2848, lineno=78, colno=17) - end_location: SourceLocation(pos=2859, lineno=78, colno=28) + location: SourceLocation(pos=4919, lineno=117, colno=17) + end_location: SourceLocation(pos=4930, lineno=117, colno=28) value: 'quartz_slab' block_states: - location: SourceLocation(pos=2860, lineno=78, colno=29) - end_location: SourceLocation(pos=2868, lineno=78, colno=37) + location: SourceLocation(pos=4931, lineno=117, colno=29) + end_location: SourceLocation(pos=4939, lineno=117, colno=37) key: - location: SourceLocation(pos=2860, lineno=78, colno=29) - end_location: SourceLocation(pos=2864, lineno=78, colno=33) + location: SourceLocation(pos=4931, lineno=117, colno=29) + end_location: SourceLocation(pos=4935, lineno=117, colno=33) value: 'type' value: - location: SourceLocation(pos=2865, lineno=78, colno=34) - end_location: SourceLocation(pos=2868, lineno=78, colno=37) + location: SourceLocation(pos=4936, lineno=117, colno=34) + end_location: SourceLocation(pos=4939, lineno=117, colno=37) value: 'top' data_tags: None - location: SourceLocation(pos=2886, lineno=80, colno=1) - end_location: SourceLocation(pos=2919, lineno=80, colno=34) + location: SourceLocation(pos=4957, lineno=119, colno=1) + end_location: SourceLocation(pos=4990, lineno=119, colno=34) identifier: 'spreadplayers:center:spreadDistance:maxRange:respectTeams:targets' arguments: - location: SourceLocation(pos=2900, lineno=80, colno=15) - end_location: SourceLocation(pos=2903, lineno=80, colno=18) + location: SourceLocation(pos=4971, lineno=119, colno=15) + end_location: SourceLocation(pos=4974, lineno=119, colno=18) x: - location: SourceLocation(pos=2900, lineno=80, colno=15) - end_location: SourceLocation(pos=2901, lineno=80, colno=16) + location: SourceLocation(pos=4971, lineno=119, colno=15) + end_location: SourceLocation(pos=4972, lineno=119, colno=16) type: 'absolute' value: 0 y: - location: SourceLocation(pos=2902, lineno=80, colno=17) - end_location: SourceLocation(pos=2903, lineno=80, colno=18) + location: SourceLocation(pos=4973, lineno=119, colno=17) + end_location: SourceLocation(pos=4974, lineno=119, colno=18) type: 'absolute' value: 0 - location: SourceLocation(pos=2904, lineno=80, colno=19) - end_location: SourceLocation(pos=2907, lineno=80, colno=22) + location: SourceLocation(pos=4975, lineno=119, colno=19) + end_location: SourceLocation(pos=4978, lineno=119, colno=22) value: 200 - location: SourceLocation(pos=2908, lineno=80, colno=23) - end_location: SourceLocation(pos=2911, lineno=80, colno=26) + location: SourceLocation(pos=4979, lineno=119, colno=23) + end_location: SourceLocation(pos=4982, lineno=119, colno=26) value: 500 - location: SourceLocation(pos=2912, lineno=80, colno=27) - end_location: SourceLocation(pos=2916, lineno=80, colno=31) + location: SourceLocation(pos=4983, lineno=119, colno=27) + end_location: SourceLocation(pos=4987, lineno=119, colno=31) value: True - location: SourceLocation(pos=2917, lineno=80, colno=32) - end_location: SourceLocation(pos=2919, lineno=80, colno=34) + location: SourceLocation(pos=4988, lineno=119, colno=32) + end_location: SourceLocation(pos=4990, lineno=119, colno=34) variable: 'a' arguments: - location: SourceLocation(pos=2929, lineno=82, colno=1) - end_location: SourceLocation(pos=2959, lineno=82, colno=31) + location: SourceLocation(pos=5000, lineno=121, colno=1) + end_location: SourceLocation(pos=5030, lineno=121, colno=31) identifier: 'summon:entity:pos' arguments: - location: SourceLocation(pos=2936, lineno=82, colno=8) - end_location: SourceLocation(pos=2950, lineno=82, colno=22) + location: SourceLocation(pos=5007, lineno=121, colno=8) + end_location: SourceLocation(pos=5021, lineno=121, colno=22) is_tag: False namespace: None path: - location: SourceLocation(pos=2936, lineno=82, colno=8) - end_location: SourceLocation(pos=2950, lineno=82, colno=22) + location: SourceLocation(pos=5007, lineno=121, colno=8) + end_location: SourceLocation(pos=5021, lineno=121, colno=22) value: 'lightning_bolt' - location: SourceLocation(pos=2951, lineno=82, colno=23) - end_location: SourceLocation(pos=2959, lineno=82, colno=31) + location: SourceLocation(pos=5022, lineno=121, colno=23) + end_location: SourceLocation(pos=5030, lineno=121, colno=31) x: - location: SourceLocation(pos=2951, lineno=82, colno=23) - end_location: SourceLocation(pos=2955, lineno=82, colno=27) + location: SourceLocation(pos=5022, lineno=121, colno=23) + end_location: SourceLocation(pos=5026, lineno=121, colno=27) type: 'relative' value: -10 y: - location: SourceLocation(pos=2956, lineno=82, colno=28) - end_location: SourceLocation(pos=2957, lineno=82, colno=29) + location: SourceLocation(pos=5027, lineno=121, colno=28) + end_location: SourceLocation(pos=5028, lineno=121, colno=29) type: 'relative' value: 0 z: - location: SourceLocation(pos=2958, lineno=82, colno=30) - end_location: SourceLocation(pos=2959, lineno=82, colno=31) + location: SourceLocation(pos=5029, lineno=121, colno=30) + end_location: SourceLocation(pos=5030, lineno=121, colno=31) type: 'relative' value: 0 - location: SourceLocation(pos=2960, lineno=83, colno=1) - end_location: SourceLocation(pos=3036, lineno=83, colno=77) + location: SourceLocation(pos=5031, lineno=122, colno=1) + end_location: SourceLocation(pos=5107, lineno=122, colno=77) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=2967, lineno=83, colno=8) - end_location: SourceLocation(pos=2974, lineno=83, colno=15) + location: SourceLocation(pos=5038, lineno=122, colno=8) + end_location: SourceLocation(pos=5045, lineno=122, colno=15) is_tag: False namespace: None path: - location: SourceLocation(pos=2967, lineno=83, colno=8) - end_location: SourceLocation(pos=2974, lineno=83, colno=15) + location: SourceLocation(pos=5038, lineno=122, colno=8) + end_location: SourceLocation(pos=5045, lineno=122, colno=15) value: 'creeper' - location: SourceLocation(pos=2975, lineno=83, colno=16) - end_location: SourceLocation(pos=2980, lineno=83, colno=21) + location: SourceLocation(pos=5046, lineno=122, colno=16) + end_location: SourceLocation(pos=5051, lineno=122, colno=21) x: - location: SourceLocation(pos=2975, lineno=83, colno=16) - end_location: SourceLocation(pos=2976, lineno=83, colno=17) + location: SourceLocation(pos=5046, lineno=122, colno=16) + end_location: SourceLocation(pos=5047, lineno=122, colno=17) type: 'relative' value: 0 y: - location: SourceLocation(pos=2977, lineno=83, colno=18) - end_location: SourceLocation(pos=2978, lineno=83, colno=19) + location: SourceLocation(pos=5048, lineno=122, colno=18) + end_location: SourceLocation(pos=5049, lineno=122, colno=19) type: 'relative' value: 0 z: - location: SourceLocation(pos=2979, lineno=83, colno=20) - end_location: SourceLocation(pos=2980, lineno=83, colno=21) + location: SourceLocation(pos=5050, lineno=122, colno=20) + end_location: SourceLocation(pos=5051, lineno=122, colno=21) type: 'relative' value: 0 - location: SourceLocation(pos=2981, lineno=83, colno=22) - end_location: SourceLocation(pos=3036, lineno=83, colno=77) + location: SourceLocation(pos=5052, lineno=122, colno=22) + end_location: SourceLocation(pos=5107, lineno=122, colno=77) entries: - location: SourceLocation(pos=2982, lineno=83, colno=23) - end_location: SourceLocation(pos=2993, lineno=83, colno=34) + location: SourceLocation(pos=5053, lineno=122, colno=23) + end_location: SourceLocation(pos=5064, lineno=122, colno=34) key: - location: SourceLocation(pos=2982, lineno=83, colno=23) - end_location: SourceLocation(pos=2989, lineno=83, colno=30) + location: SourceLocation(pos=5053, lineno=122, colno=23) + end_location: SourceLocation(pos=5060, lineno=122, colno=30) value: 'powered' value: - location: SourceLocation(pos=2991, lineno=83, colno=32) - end_location: SourceLocation(pos=2993, lineno=83, colno=34) + location: SourceLocation(pos=5062, lineno=122, colno=32) + end_location: SourceLocation(pos=5064, lineno=122, colno=34) value: Byte(1) - location: SourceLocation(pos=2995, lineno=83, colno=36) - end_location: SourceLocation(pos=3035, lineno=83, colno=76) + location: SourceLocation(pos=5066, lineno=122, colno=36) + end_location: SourceLocation(pos=5106, lineno=122, colno=76) key: - location: SourceLocation(pos=2995, lineno=83, colno=36) - end_location: SourceLocation(pos=3005, lineno=83, colno=46) + location: SourceLocation(pos=5066, lineno=122, colno=36) + end_location: SourceLocation(pos=5076, lineno=122, colno=46) value: 'CustomName' value: - location: SourceLocation(pos=3007, lineno=83, colno=48) - end_location: SourceLocation(pos=3035, lineno=83, colno=76) + location: SourceLocation(pos=5078, lineno=122, colno=48) + end_location: SourceLocation(pos=5106, lineno=122, colno=76) value: String('{"text":"Powered Creeper"}') - location: SourceLocation(pos=3037, lineno=84, colno=1) - end_location: SourceLocation(pos=3146, lineno=84, colno=110) + location: SourceLocation(pos=5108, lineno=123, colno=1) + end_location: SourceLocation(pos=5217, lineno=123, colno=110) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=3044, lineno=84, colno=8) - end_location: SourceLocation(pos=3050, lineno=84, colno=14) + location: SourceLocation(pos=5115, lineno=123, colno=8) + end_location: SourceLocation(pos=5121, lineno=123, colno=14) is_tag: False namespace: None path: - location: SourceLocation(pos=3044, lineno=84, colno=8) - end_location: SourceLocation(pos=3050, lineno=84, colno=14) + location: SourceLocation(pos=5115, lineno=123, colno=8) + end_location: SourceLocation(pos=5121, lineno=123, colno=14) value: 'spider' - location: SourceLocation(pos=3051, lineno=84, colno=15) - end_location: SourceLocation(pos=3056, lineno=84, colno=20) + location: SourceLocation(pos=5122, lineno=123, colno=15) + end_location: SourceLocation(pos=5127, lineno=123, colno=20) x: - location: SourceLocation(pos=3051, lineno=84, colno=15) - end_location: SourceLocation(pos=3052, lineno=84, colno=16) + location: SourceLocation(pos=5122, lineno=123, colno=15) + end_location: SourceLocation(pos=5123, lineno=123, colno=16) type: 'relative' value: 0 y: - location: SourceLocation(pos=3053, lineno=84, colno=17) - end_location: SourceLocation(pos=3054, lineno=84, colno=18) + location: SourceLocation(pos=5124, lineno=123, colno=17) + end_location: SourceLocation(pos=5125, lineno=123, colno=18) type: 'relative' value: 0 z: - location: SourceLocation(pos=3055, lineno=84, colno=19) - end_location: SourceLocation(pos=3056, lineno=84, colno=20) + location: SourceLocation(pos=5126, lineno=123, colno=19) + end_location: SourceLocation(pos=5127, lineno=123, colno=20) type: 'relative' value: 0 - location: SourceLocation(pos=3057, lineno=84, colno=21) - end_location: SourceLocation(pos=3146, lineno=84, colno=110) + location: SourceLocation(pos=5128, lineno=123, colno=21) + end_location: SourceLocation(pos=5217, lineno=123, colno=110) entries: - location: SourceLocation(pos=3058, lineno=84, colno=22) - end_location: SourceLocation(pos=3145, lineno=84, colno=109) + location: SourceLocation(pos=5129, lineno=123, colno=22) + end_location: SourceLocation(pos=5216, lineno=123, colno=109) key: - location: SourceLocation(pos=3058, lineno=84, colno=22) - end_location: SourceLocation(pos=3068, lineno=84, colno=32) + location: SourceLocation(pos=5129, lineno=123, colno=22) + end_location: SourceLocation(pos=5139, lineno=123, colno=32) value: 'Passengers' value: - location: SourceLocation(pos=3070, lineno=84, colno=34) - end_location: SourceLocation(pos=3145, lineno=84, colno=109) + location: SourceLocation(pos=5141, lineno=123, colno=34) + end_location: SourceLocation(pos=5216, lineno=123, colno=109) elements: - location: SourceLocation(pos=3071, lineno=84, colno=35) - end_location: SourceLocation(pos=3144, lineno=84, colno=108) + location: SourceLocation(pos=5142, lineno=123, colno=35) + end_location: SourceLocation(pos=5215, lineno=123, colno=108) entries: - location: SourceLocation(pos=3072, lineno=84, colno=36) - end_location: SourceLocation(pos=3096, lineno=84, colno=60) + location: SourceLocation(pos=5143, lineno=123, colno=36) + end_location: SourceLocation(pos=5167, lineno=123, colno=60) key: - location: SourceLocation(pos=3072, lineno=84, colno=36) - end_location: SourceLocation(pos=3074, lineno=84, colno=38) + location: SourceLocation(pos=5143, lineno=123, colno=36) + end_location: SourceLocation(pos=5145, lineno=123, colno=38) value: 'id' value: - location: SourceLocation(pos=3076, lineno=84, colno=40) - end_location: SourceLocation(pos=3096, lineno=84, colno=60) + location: SourceLocation(pos=5147, lineno=123, colno=40) + end_location: SourceLocation(pos=5167, lineno=123, colno=60) value: String('minecraft:skeleton') - location: SourceLocation(pos=3098, lineno=84, colno=62) - end_location: SourceLocation(pos=3143, lineno=84, colno=107) + location: SourceLocation(pos=5169, lineno=123, colno=62) + end_location: SourceLocation(pos=5214, lineno=123, colno=107) key: - location: SourceLocation(pos=3098, lineno=84, colno=62) - end_location: SourceLocation(pos=3107, lineno=84, colno=71) + location: SourceLocation(pos=5169, lineno=123, colno=62) + end_location: SourceLocation(pos=5178, lineno=123, colno=71) value: 'HandItems' value: - location: SourceLocation(pos=3109, lineno=84, colno=73) - end_location: SourceLocation(pos=3143, lineno=84, colno=107) + location: SourceLocation(pos=5180, lineno=123, colno=73) + end_location: SourceLocation(pos=5214, lineno=123, colno=107) elements: - location: SourceLocation(pos=3110, lineno=84, colno=74) - end_location: SourceLocation(pos=3142, lineno=84, colno=106) + location: SourceLocation(pos=5181, lineno=123, colno=74) + end_location: SourceLocation(pos=5213, lineno=123, colno=106) entries: - location: SourceLocation(pos=3111, lineno=84, colno=75) - end_location: SourceLocation(pos=3130, lineno=84, colno=94) + location: SourceLocation(pos=5182, lineno=123, colno=75) + end_location: SourceLocation(pos=5201, lineno=123, colno=94) key: - location: SourceLocation(pos=3111, lineno=84, colno=75) - end_location: SourceLocation(pos=3113, lineno=84, colno=77) + location: SourceLocation(pos=5182, lineno=123, colno=75) + end_location: SourceLocation(pos=5184, lineno=123, colno=77) value: 'id' value: - location: SourceLocation(pos=3115, lineno=84, colno=79) - end_location: SourceLocation(pos=3130, lineno=84, colno=94) + location: SourceLocation(pos=5186, lineno=123, colno=79) + end_location: SourceLocation(pos=5201, lineno=123, colno=94) value: String('minecraft:bow') - location: SourceLocation(pos=3132, lineno=84, colno=96) - end_location: SourceLocation(pos=3141, lineno=84, colno=105) + location: SourceLocation(pos=5203, lineno=123, colno=96) + end_location: SourceLocation(pos=5212, lineno=123, colno=105) key: - location: SourceLocation(pos=3132, lineno=84, colno=96) - end_location: SourceLocation(pos=3137, lineno=84, colno=101) + location: SourceLocation(pos=5203, lineno=123, colno=96) + end_location: SourceLocation(pos=5208, lineno=123, colno=101) value: 'Count' value: - location: SourceLocation(pos=3139, lineno=84, colno=103) - end_location: SourceLocation(pos=3141, lineno=84, colno=105) + location: SourceLocation(pos=5210, lineno=123, colno=103) + end_location: SourceLocation(pos=5212, lineno=123, colno=105) value: Byte(1) - location: SourceLocation(pos=3147, lineno=85, colno=1) - end_location: SourceLocation(pos=3272, lineno=85, colno=126) + location: SourceLocation(pos=5218, lineno=124, colno=1) + end_location: SourceLocation(pos=5343, lineno=124, colno=126) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=3154, lineno=85, colno=8) - end_location: SourceLocation(pos=3162, lineno=85, colno=16) + location: SourceLocation(pos=5225, lineno=124, colno=8) + end_location: SourceLocation(pos=5233, lineno=124, colno=16) is_tag: False namespace: None path: - location: SourceLocation(pos=3154, lineno=85, colno=8) - end_location: SourceLocation(pos=3162, lineno=85, colno=16) + location: SourceLocation(pos=5225, lineno=124, colno=8) + end_location: SourceLocation(pos=5233, lineno=124, colno=16) value: 'villager' - location: SourceLocation(pos=3163, lineno=85, colno=17) - end_location: SourceLocation(pos=3168, lineno=85, colno=22) + location: SourceLocation(pos=5234, lineno=124, colno=17) + end_location: SourceLocation(pos=5239, lineno=124, colno=22) x: - location: SourceLocation(pos=3163, lineno=85, colno=17) - end_location: SourceLocation(pos=3164, lineno=85, colno=18) + location: SourceLocation(pos=5234, lineno=124, colno=17) + end_location: SourceLocation(pos=5235, lineno=124, colno=18) type: 'relative' value: 0 y: - location: SourceLocation(pos=3165, lineno=85, colno=19) - end_location: SourceLocation(pos=3166, lineno=85, colno=20) + location: SourceLocation(pos=5236, lineno=124, colno=19) + end_location: SourceLocation(pos=5237, lineno=124, colno=20) type: 'relative' value: 0 z: - location: SourceLocation(pos=3167, lineno=85, colno=21) - end_location: SourceLocation(pos=3168, lineno=85, colno=22) + location: SourceLocation(pos=5238, lineno=124, colno=21) + end_location: SourceLocation(pos=5239, lineno=124, colno=22) type: 'relative' value: 0 - location: SourceLocation(pos=3169, lineno=85, colno=23) - end_location: SourceLocation(pos=3272, lineno=85, colno=126) + location: SourceLocation(pos=5240, lineno=124, colno=23) + end_location: SourceLocation(pos=5343, lineno=124, colno=126) entries: - location: SourceLocation(pos=3170, lineno=85, colno=24) - end_location: SourceLocation(pos=3271, lineno=85, colno=125) + location: SourceLocation(pos=5241, lineno=124, colno=24) + end_location: SourceLocation(pos=5342, lineno=124, colno=125) key: - location: SourceLocation(pos=3170, lineno=85, colno=24) - end_location: SourceLocation(pos=3176, lineno=85, colno=30) + location: SourceLocation(pos=5241, lineno=124, colno=24) + end_location: SourceLocation(pos=5247, lineno=124, colno=30) value: 'Offers' value: - location: SourceLocation(pos=3178, lineno=85, colno=32) - end_location: SourceLocation(pos=3271, lineno=85, colno=125) + location: SourceLocation(pos=5249, lineno=124, colno=32) + end_location: SourceLocation(pos=5342, lineno=124, colno=125) entries: - location: SourceLocation(pos=3179, lineno=85, colno=33) - end_location: SourceLocation(pos=3270, lineno=85, colno=124) + location: SourceLocation(pos=5250, lineno=124, colno=33) + end_location: SourceLocation(pos=5341, lineno=124, colno=124) key: - location: SourceLocation(pos=3179, lineno=85, colno=33) - end_location: SourceLocation(pos=3186, lineno=85, colno=40) + location: SourceLocation(pos=5250, lineno=124, colno=33) + end_location: SourceLocation(pos=5257, lineno=124, colno=40) value: 'Recipes' value: - location: SourceLocation(pos=3188, lineno=85, colno=42) - end_location: SourceLocation(pos=3270, lineno=85, colno=124) + location: SourceLocation(pos=5259, lineno=124, colno=42) + end_location: SourceLocation(pos=5341, lineno=124, colno=124) elements: - location: SourceLocation(pos=3189, lineno=85, colno=43) - end_location: SourceLocation(pos=3269, lineno=85, colno=123) + location: SourceLocation(pos=5260, lineno=124, colno=43) + end_location: SourceLocation(pos=5340, lineno=124, colno=123) entries: - location: SourceLocation(pos=3190, lineno=85, colno=44) - end_location: SourceLocation(pos=3217, lineno=85, colno=71) + location: SourceLocation(pos=5261, lineno=124, colno=44) + end_location: SourceLocation(pos=5288, lineno=124, colno=71) key: - location: SourceLocation(pos=3190, lineno=85, colno=44) - end_location: SourceLocation(pos=3193, lineno=85, colno=47) + location: SourceLocation(pos=5261, lineno=124, colno=44) + end_location: SourceLocation(pos=5264, lineno=124, colno=47) value: 'buy' value: - location: SourceLocation(pos=3195, lineno=85, colno=49) - end_location: SourceLocation(pos=3217, lineno=85, colno=71) + location: SourceLocation(pos=5266, lineno=124, colno=49) + end_location: SourceLocation(pos=5288, lineno=124, colno=71) entries: - location: SourceLocation(pos=3196, lineno=85, colno=50) - end_location: SourceLocation(pos=3206, lineno=85, colno=60) + location: SourceLocation(pos=5267, lineno=124, colno=50) + end_location: SourceLocation(pos=5277, lineno=124, colno=60) key: - location: SourceLocation(pos=3196, lineno=85, colno=50) - end_location: SourceLocation(pos=3198, lineno=85, colno=52) + location: SourceLocation(pos=5267, lineno=124, colno=50) + end_location: SourceLocation(pos=5269, lineno=124, colno=52) value: 'id' value: - location: SourceLocation(pos=3200, lineno=85, colno=54) - end_location: SourceLocation(pos=3206, lineno=85, colno=60) + location: SourceLocation(pos=5271, lineno=124, colno=54) + end_location: SourceLocation(pos=5277, lineno=124, colno=60) value: String('dirt') - location: SourceLocation(pos=3208, lineno=85, colno=62) - end_location: SourceLocation(pos=3216, lineno=85, colno=70) + location: SourceLocation(pos=5279, lineno=124, colno=62) + end_location: SourceLocation(pos=5287, lineno=124, colno=70) key: - location: SourceLocation(pos=3208, lineno=85, colno=62) - end_location: SourceLocation(pos=3213, lineno=85, colno=67) + location: SourceLocation(pos=5279, lineno=124, colno=62) + end_location: SourceLocation(pos=5284, lineno=124, colno=67) value: 'Count' value: - location: SourceLocation(pos=3215, lineno=85, colno=69) - end_location: SourceLocation(pos=3216, lineno=85, colno=70) + location: SourceLocation(pos=5286, lineno=124, colno=69) + end_location: SourceLocation(pos=5287, lineno=124, colno=70) value: Int(1) - location: SourceLocation(pos=3219, lineno=85, colno=73) - end_location: SourceLocation(pos=3250, lineno=85, colno=104) + location: SourceLocation(pos=5290, lineno=124, colno=73) + end_location: SourceLocation(pos=5321, lineno=124, colno=104) key: - location: SourceLocation(pos=3219, lineno=85, colno=73) - end_location: SourceLocation(pos=3223, lineno=85, colno=77) + location: SourceLocation(pos=5290, lineno=124, colno=73) + end_location: SourceLocation(pos=5294, lineno=124, colno=77) value: 'sell' value: - location: SourceLocation(pos=3225, lineno=85, colno=79) - end_location: SourceLocation(pos=3250, lineno=85, colno=104) + location: SourceLocation(pos=5296, lineno=124, colno=79) + end_location: SourceLocation(pos=5321, lineno=124, colno=104) entries: - location: SourceLocation(pos=3226, lineno=85, colno=80) - end_location: SourceLocation(pos=3239, lineno=85, colno=93) + location: SourceLocation(pos=5297, lineno=124, colno=80) + end_location: SourceLocation(pos=5310, lineno=124, colno=93) key: - location: SourceLocation(pos=3226, lineno=85, colno=80) - end_location: SourceLocation(pos=3228, lineno=85, colno=82) + location: SourceLocation(pos=5297, lineno=124, colno=80) + end_location: SourceLocation(pos=5299, lineno=124, colno=82) value: 'id' value: - location: SourceLocation(pos=3230, lineno=85, colno=84) - end_location: SourceLocation(pos=3239, lineno=85, colno=93) + location: SourceLocation(pos=5301, lineno=124, colno=84) + end_location: SourceLocation(pos=5310, lineno=124, colno=93) value: String('diamond') - location: SourceLocation(pos=3241, lineno=85, colno=95) - end_location: SourceLocation(pos=3249, lineno=85, colno=103) + location: SourceLocation(pos=5312, lineno=124, colno=95) + end_location: SourceLocation(pos=5320, lineno=124, colno=103) key: - location: SourceLocation(pos=3241, lineno=85, colno=95) - end_location: SourceLocation(pos=3246, lineno=85, colno=100) + location: SourceLocation(pos=5312, lineno=124, colno=95) + end_location: SourceLocation(pos=5317, lineno=124, colno=100) value: 'Count' value: - location: SourceLocation(pos=3248, lineno=85, colno=102) - end_location: SourceLocation(pos=3249, lineno=85, colno=103) + location: SourceLocation(pos=5319, lineno=124, colno=102) + end_location: SourceLocation(pos=5320, lineno=124, colno=103) value: Int(1) - location: SourceLocation(pos=3252, lineno=85, colno=106) - end_location: SourceLocation(pos=3268, lineno=85, colno=122) + location: SourceLocation(pos=5323, lineno=124, colno=106) + end_location: SourceLocation(pos=5339, lineno=124, colno=122) key: - location: SourceLocation(pos=3252, lineno=85, colno=106) - end_location: SourceLocation(pos=3261, lineno=85, colno=115) + location: SourceLocation(pos=5323, lineno=124, colno=106) + end_location: SourceLocation(pos=5332, lineno=124, colno=115) value: 'rewardExp' value: - location: SourceLocation(pos=3263, lineno=85, colno=117) - end_location: SourceLocation(pos=3268, lineno=85, colno=122) + location: SourceLocation(pos=5334, lineno=124, colno=117) + end_location: SourceLocation(pos=5339, lineno=124, colno=122) value: Byte(0) - location: SourceLocation(pos=3284, lineno=87, colno=1) - end_location: SourceLocation(pos=3298, lineno=87, colno=15) + location: SourceLocation(pos=5355, lineno=126, colno=1) + end_location: SourceLocation(pos=5369, lineno=126, colno=15) identifier: 'teleport:destination' arguments: - location: SourceLocation(pos=3293, lineno=87, colno=10) - end_location: SourceLocation(pos=3298, lineno=87, colno=15) + location: SourceLocation(pos=5364, lineno=126, colno=10) + end_location: SourceLocation(pos=5369, lineno=126, colno=15) value: 'Alice' - location: SourceLocation(pos=3299, lineno=88, colno=1) - end_location: SourceLocation(pos=3313, lineno=88, colno=15) + location: SourceLocation(pos=5370, lineno=127, colno=1) + end_location: SourceLocation(pos=5384, lineno=127, colno=15) identifier: 'teleport:targets:destination' arguments: - location: SourceLocation(pos=3308, lineno=88, colno=10) - end_location: SourceLocation(pos=3310, lineno=88, colno=12) + location: SourceLocation(pos=5379, lineno=127, colno=10) + end_location: SourceLocation(pos=5381, lineno=127, colno=12) variable: 'a' arguments: - location: SourceLocation(pos=3311, lineno=88, colno=13) - end_location: SourceLocation(pos=3313, lineno=88, colno=15) + location: SourceLocation(pos=5382, lineno=127, colno=13) + end_location: SourceLocation(pos=5384, lineno=127, colno=15) variable: 's' arguments: - location: SourceLocation(pos=3314, lineno=89, colno=1) - end_location: SourceLocation(pos=3333, lineno=89, colno=20) + location: SourceLocation(pos=5385, lineno=128, colno=1) + end_location: SourceLocation(pos=5404, lineno=128, colno=20) identifier: 'teleport:location' arguments: - location: SourceLocation(pos=3323, lineno=89, colno=10) - end_location: SourceLocation(pos=3333, lineno=89, colno=20) + location: SourceLocation(pos=5394, lineno=128, colno=10) + end_location: SourceLocation(pos=5404, lineno=128, colno=20) x: - location: SourceLocation(pos=3323, lineno=89, colno=10) - end_location: SourceLocation(pos=3326, lineno=89, colno=13) + location: SourceLocation(pos=5394, lineno=128, colno=10) + end_location: SourceLocation(pos=5397, lineno=128, colno=13) type: 'absolute' value: 100 y: - location: SourceLocation(pos=3327, lineno=89, colno=14) - end_location: SourceLocation(pos=3329, lineno=89, colno=16) + location: SourceLocation(pos=5398, lineno=128, colno=14) + end_location: SourceLocation(pos=5400, lineno=128, colno=16) type: 'relative' value: 3 z: - location: SourceLocation(pos=3330, lineno=89, colno=17) - end_location: SourceLocation(pos=3333, lineno=89, colno=20) + location: SourceLocation(pos=5401, lineno=128, colno=17) + end_location: SourceLocation(pos=5404, lineno=128, colno=20) type: 'absolute' value: 100 - location: SourceLocation(pos=3344, lineno=91, colno=1) - end_location: SourceLocation(pos=3372, lineno=91, colno=29) + location: SourceLocation(pos=5415, lineno=130, colno=1) + end_location: SourceLocation(pos=5443, lineno=130, colno=29) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=3352, lineno=91, colno=9) - end_location: SourceLocation(pos=3354, lineno=91, colno=11) + location: SourceLocation(pos=5423, lineno=130, colno=9) + end_location: SourceLocation(pos=5425, lineno=130, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=3355, lineno=91, colno=12) - end_location: SourceLocation(pos=3372, lineno=91, colno=29) + location: SourceLocation(pos=5426, lineno=130, colno=12) + end_location: SourceLocation(pos=5443, lineno=130, colno=29) value: 'text to display' - location: SourceLocation(pos=3373, lineno=92, colno=1) - end_location: SourceLocation(pos=3419, lineno=92, colno=47) + location: SourceLocation(pos=5444, lineno=131, colno=1) + end_location: SourceLocation(pos=5490, lineno=131, colno=47) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=3381, lineno=92, colno=9) - end_location: SourceLocation(pos=3383, lineno=92, colno=11) + location: SourceLocation(pos=5452, lineno=131, colno=9) + end_location: SourceLocation(pos=5454, lineno=131, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=3384, lineno=92, colno=12) - end_location: SourceLocation(pos=3419, lineno=92, colno=47) + location: SourceLocation(pos=5455, lineno=131, colno=12) + end_location: SourceLocation(pos=5490, lineno=131, colno=47) entries: - location: SourceLocation(pos=3385, lineno=92, colno=13) - end_location: SourceLocation(pos=3403, lineno=92, colno=31) + location: SourceLocation(pos=5456, lineno=131, colno=13) + end_location: SourceLocation(pos=5474, lineno=131, colno=31) key: - location: SourceLocation(pos=3385, lineno=92, colno=13) - end_location: SourceLocation(pos=3391, lineno=92, colno=19) + location: SourceLocation(pos=5456, lineno=131, colno=13) + end_location: SourceLocation(pos=5462, lineno=131, colno=19) value: 'text' value: - location: SourceLocation(pos=3392, lineno=92, colno=20) - end_location: SourceLocation(pos=3403, lineno=92, colno=31) + location: SourceLocation(pos=5463, lineno=131, colno=20) + end_location: SourceLocation(pos=5474, lineno=131, colno=31) value: 'I am blue' - location: SourceLocation(pos=3404, lineno=92, colno=32) - end_location: SourceLocation(pos=3418, lineno=92, colno=46) + location: SourceLocation(pos=5475, lineno=131, colno=32) + end_location: SourceLocation(pos=5489, lineno=131, colno=46) key: - location: SourceLocation(pos=3404, lineno=92, colno=32) - end_location: SourceLocation(pos=3411, lineno=92, colno=39) + location: SourceLocation(pos=5475, lineno=131, colno=32) + end_location: SourceLocation(pos=5482, lineno=131, colno=39) value: 'color' value: - location: SourceLocation(pos=3412, lineno=92, colno=40) - end_location: SourceLocation(pos=3418, lineno=92, colno=46) + location: SourceLocation(pos=5483, lineno=131, colno=40) + end_location: SourceLocation(pos=5489, lineno=131, colno=46) value: 'blue' - location: SourceLocation(pos=3420, lineno=93, colno=1) - end_location: SourceLocation(pos=3469, lineno=93, colno=50) + location: SourceLocation(pos=5491, lineno=132, colno=1) + end_location: SourceLocation(pos=5540, lineno=132, colno=50) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=3428, lineno=93, colno=9) - end_location: SourceLocation(pos=3430, lineno=93, colno=11) + location: SourceLocation(pos=5499, lineno=132, colno=9) + end_location: SourceLocation(pos=5501, lineno=132, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=3431, lineno=93, colno=12) - end_location: SourceLocation(pos=3469, lineno=93, colno=50) + location: SourceLocation(pos=5502, lineno=132, colno=12) + end_location: SourceLocation(pos=5540, lineno=132, colno=50) entries: - location: SourceLocation(pos=3432, lineno=93, colno=13) - end_location: SourceLocation(pos=3450, lineno=93, colno=31) + location: SourceLocation(pos=5503, lineno=132, colno=13) + end_location: SourceLocation(pos=5521, lineno=132, colno=31) key: - location: SourceLocation(pos=3432, lineno=93, colno=13) - end_location: SourceLocation(pos=3438, lineno=93, colno=19) + location: SourceLocation(pos=5503, lineno=132, colno=13) + end_location: SourceLocation(pos=5509, lineno=132, colno=19) value: 'text' value: - location: SourceLocation(pos=3439, lineno=93, colno=20) - end_location: SourceLocation(pos=3450, lineno=93, colno=31) + location: SourceLocation(pos=5510, lineno=132, colno=20) + end_location: SourceLocation(pos=5521, lineno=132, colno=31) value: 'I am blue' - location: SourceLocation(pos=3451, lineno=93, colno=32) - end_location: SourceLocation(pos=3468, lineno=93, colno=49) + location: SourceLocation(pos=5522, lineno=132, colno=32) + end_location: SourceLocation(pos=5539, lineno=132, colno=49) key: - location: SourceLocation(pos=3451, lineno=93, colno=32) - end_location: SourceLocation(pos=3458, lineno=93, colno=39) + location: SourceLocation(pos=5522, lineno=132, colno=32) + end_location: SourceLocation(pos=5529, lineno=132, colno=39) value: 'color' value: - location: SourceLocation(pos=3459, lineno=93, colno=40) - end_location: SourceLocation(pos=3468, lineno=93, colno=49) + location: SourceLocation(pos=5530, lineno=132, colno=40) + end_location: SourceLocation(pos=5539, lineno=132, colno=49) value: '#5555ff' - location: SourceLocation(pos=3470, lineno=94, colno=1) - end_location: SourceLocation(pos=3551, lineno=94, colno=82) + location: SourceLocation(pos=5541, lineno=133, colno=1) + end_location: SourceLocation(pos=5622, lineno=133, colno=82) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=3478, lineno=94, colno=9) - end_location: SourceLocation(pos=3480, lineno=94, colno=11) + location: SourceLocation(pos=5549, lineno=133, colno=9) + end_location: SourceLocation(pos=5551, lineno=133, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=3481, lineno=94, colno=12) - end_location: SourceLocation(pos=3551, lineno=94, colno=82) + location: SourceLocation(pos=5552, lineno=133, colno=12) + end_location: SourceLocation(pos=5622, lineno=133, colno=82) entries: - location: SourceLocation(pos=3482, lineno=94, colno=13) - end_location: SourceLocation(pos=3500, lineno=94, colno=31) + location: SourceLocation(pos=5553, lineno=133, colno=13) + end_location: SourceLocation(pos=5571, lineno=133, colno=31) key: - location: SourceLocation(pos=3482, lineno=94, colno=13) - end_location: SourceLocation(pos=3488, lineno=94, colno=19) + location: SourceLocation(pos=5553, lineno=133, colno=13) + end_location: SourceLocation(pos=5559, lineno=133, colno=19) value: 'text' value: - location: SourceLocation(pos=3489, lineno=94, colno=20) - end_location: SourceLocation(pos=3500, lineno=94, colno=31) + location: SourceLocation(pos=5560, lineno=133, colno=20) + end_location: SourceLocation(pos=5571, lineno=133, colno=31) value: 'Hover me!' - location: SourceLocation(pos=3501, lineno=94, colno=32) - end_location: SourceLocation(pos=3550, lineno=94, colno=81) + location: SourceLocation(pos=5572, lineno=133, colno=32) + end_location: SourceLocation(pos=5621, lineno=133, colno=81) key: - location: SourceLocation(pos=3501, lineno=94, colno=32) - end_location: SourceLocation(pos=3513, lineno=94, colno=44) + location: SourceLocation(pos=5572, lineno=133, colno=32) + end_location: SourceLocation(pos=5584, lineno=133, colno=44) value: 'hoverEvent' value: - location: SourceLocation(pos=3514, lineno=94, colno=45) - end_location: SourceLocation(pos=3550, lineno=94, colno=81) + location: SourceLocation(pos=5585, lineno=133, colno=45) + end_location: SourceLocation(pos=5621, lineno=133, colno=81) entries: - location: SourceLocation(pos=3515, lineno=94, colno=46) - end_location: SourceLocation(pos=3535, lineno=94, colno=66) + location: SourceLocation(pos=5586, lineno=133, colno=46) + end_location: SourceLocation(pos=5606, lineno=133, colno=66) key: - location: SourceLocation(pos=3515, lineno=94, colno=46) - end_location: SourceLocation(pos=3523, lineno=94, colno=54) + location: SourceLocation(pos=5586, lineno=133, colno=46) + end_location: SourceLocation(pos=5594, lineno=133, colno=54) value: 'action' value: - location: SourceLocation(pos=3524, lineno=94, colno=55) - end_location: SourceLocation(pos=3535, lineno=94, colno=66) + location: SourceLocation(pos=5595, lineno=133, colno=55) + end_location: SourceLocation(pos=5606, lineno=133, colno=66) value: 'show_text' - location: SourceLocation(pos=3536, lineno=94, colno=67) - end_location: SourceLocation(pos=3549, lineno=94, colno=80) + location: SourceLocation(pos=5607, lineno=133, colno=67) + end_location: SourceLocation(pos=5620, lineno=133, colno=80) key: - location: SourceLocation(pos=3536, lineno=94, colno=67) - end_location: SourceLocation(pos=3543, lineno=94, colno=74) + location: SourceLocation(pos=5607, lineno=133, colno=67) + end_location: SourceLocation(pos=5614, lineno=133, colno=74) value: 'value' value: - location: SourceLocation(pos=3544, lineno=94, colno=75) - end_location: SourceLocation(pos=3549, lineno=94, colno=80) + location: SourceLocation(pos=5615, lineno=133, colno=75) + end_location: SourceLocation(pos=5620, lineno=133, colno=80) value: 'Hi!' - location: SourceLocation(pos=3552, lineno=95, colno=1) - end_location: SourceLocation(pos=3577, lineno=95, colno=26) + location: SourceLocation(pos=5623, lineno=134, colno=1) + end_location: SourceLocation(pos=5648, lineno=134, colno=26) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=3560, lineno=95, colno=9) - end_location: SourceLocation(pos=3562, lineno=95, colno=11) + location: SourceLocation(pos=5631, lineno=134, colno=9) + end_location: SourceLocation(pos=5633, lineno=134, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=3563, lineno=95, colno=12) - end_location: SourceLocation(pos=3577, lineno=95, colno=26) + location: SourceLocation(pos=5634, lineno=134, colno=12) + end_location: SourceLocation(pos=5648, lineno=134, colno=26) value: 'Text1\nText2' - location: SourceLocation(pos=3585, lineno=97, colno=1) - end_location: SourceLocation(pos=3599, lineno=97, colno=15) + location: SourceLocation(pos=5656, lineno=136, colno=1) + end_location: SourceLocation(pos=5670, lineno=136, colno=15) identifier: 'time:set:time' arguments: - location: SourceLocation(pos=3594, lineno=97, colno=10) - end_location: SourceLocation(pos=3599, lineno=97, colno=15) + location: SourceLocation(pos=5665, lineno=136, colno=10) + end_location: SourceLocation(pos=5670, lineno=136, colno=15) value: 1000.0 suffix: 't' - location: SourceLocation(pos=3600, lineno=98, colno=1) - end_location: SourceLocation(pos=3612, lineno=98, colno=13) + location: SourceLocation(pos=5671, lineno=137, colno=1) + end_location: SourceLocation(pos=5683, lineno=137, colno=13) identifier: 'time:set:day' arguments: - location: SourceLocation(pos=3613, lineno=99, colno=1) - end_location: SourceLocation(pos=3628, lineno=99, colno=16) + location: SourceLocation(pos=5684, lineno=138, colno=1) + end_location: SourceLocation(pos=5699, lineno=138, colno=16) identifier: 'time:add:time' arguments: - location: SourceLocation(pos=3622, lineno=99, colno=10) - end_location: SourceLocation(pos=3628, lineno=99, colno=16) + location: SourceLocation(pos=5693, lineno=138, colno=10) + end_location: SourceLocation(pos=5699, lineno=138, colno=16) value: 24000.0 suffix: 't' - location: SourceLocation(pos=3637, lineno=101, colno=1) - end_location: SourceLocation(pos=3714, lineno=101, colno=78) + location: SourceLocation(pos=5708, lineno=140, colno=1) + end_location: SourceLocation(pos=5785, lineno=140, colno=78) identifier: 'title:targets:subtitle:title' arguments: - location: SourceLocation(pos=3643, lineno=101, colno=7) - end_location: SourceLocation(pos=3645, lineno=101, colno=9) + location: SourceLocation(pos=5714, lineno=140, colno=7) + end_location: SourceLocation(pos=5716, lineno=140, colno=9) variable: 'a' arguments: - location: SourceLocation(pos=3655, lineno=101, colno=19) - end_location: SourceLocation(pos=3714, lineno=101, colno=78) + location: SourceLocation(pos=5726, lineno=140, colno=19) + end_location: SourceLocation(pos=5785, lineno=140, colno=78) entries: - location: SourceLocation(pos=3656, lineno=101, colno=20) - end_location: SourceLocation(pos=3684, lineno=101, colno=48) + location: SourceLocation(pos=5727, lineno=140, colno=20) + end_location: SourceLocation(pos=5755, lineno=140, colno=48) key: - location: SourceLocation(pos=3656, lineno=101, colno=20) - end_location: SourceLocation(pos=3662, lineno=101, colno=26) + location: SourceLocation(pos=5727, lineno=140, colno=20) + end_location: SourceLocation(pos=5733, lineno=140, colno=26) value: 'text' value: - location: SourceLocation(pos=3663, lineno=101, colno=27) - end_location: SourceLocation(pos=3684, lineno=101, colno=48) + location: SourceLocation(pos=5734, lineno=140, colno=27) + end_location: SourceLocation(pos=5755, lineno=140, colno=48) value: 'The story begins...' - location: SourceLocation(pos=3685, lineno=101, colno=49) - end_location: SourceLocation(pos=3699, lineno=101, colno=63) + location: SourceLocation(pos=5756, lineno=140, colno=49) + end_location: SourceLocation(pos=5770, lineno=140, colno=63) key: - location: SourceLocation(pos=3685, lineno=101, colno=49) - end_location: SourceLocation(pos=3692, lineno=101, colno=56) + location: SourceLocation(pos=5756, lineno=140, colno=49) + end_location: SourceLocation(pos=5763, lineno=140, colno=56) value: 'color' value: - location: SourceLocation(pos=3693, lineno=101, colno=57) - end_location: SourceLocation(pos=3699, lineno=101, colno=63) + location: SourceLocation(pos=5764, lineno=140, colno=57) + end_location: SourceLocation(pos=5770, lineno=140, colno=63) value: 'gray' - location: SourceLocation(pos=3700, lineno=101, colno=64) - end_location: SourceLocation(pos=3713, lineno=101, colno=77) + location: SourceLocation(pos=5771, lineno=140, colno=64) + end_location: SourceLocation(pos=5784, lineno=140, colno=77) key: - location: SourceLocation(pos=3700, lineno=101, colno=64) - end_location: SourceLocation(pos=3708, lineno=101, colno=72) + location: SourceLocation(pos=5771, lineno=140, colno=64) + end_location: SourceLocation(pos=5779, lineno=140, colno=72) value: 'italic' value: - location: SourceLocation(pos=3709, lineno=101, colno=73) - end_location: SourceLocation(pos=3713, lineno=101, colno=77) + location: SourceLocation(pos=5780, lineno=140, colno=73) + end_location: SourceLocation(pos=5784, lineno=140, colno=77) value: True - location: SourceLocation(pos=3715, lineno=102, colno=1) - end_location: SourceLocation(pos=3762, lineno=102, colno=48) + location: SourceLocation(pos=5786, lineno=141, colno=1) + end_location: SourceLocation(pos=5833, lineno=141, colno=48) identifier: 'title:targets:title:title' arguments: - location: SourceLocation(pos=3721, lineno=102, colno=7) - end_location: SourceLocation(pos=3723, lineno=102, colno=9) + location: SourceLocation(pos=5792, lineno=141, colno=7) + end_location: SourceLocation(pos=5794, lineno=141, colno=9) variable: 'a' arguments: - location: SourceLocation(pos=3730, lineno=102, colno=16) - end_location: SourceLocation(pos=3762, lineno=102, colno=48) + location: SourceLocation(pos=5801, lineno=141, colno=16) + end_location: SourceLocation(pos=5833, lineno=141, colno=48) entries: - location: SourceLocation(pos=3731, lineno=102, colno=17) - end_location: SourceLocation(pos=3749, lineno=102, colno=35) + location: SourceLocation(pos=5802, lineno=141, colno=17) + end_location: SourceLocation(pos=5820, lineno=141, colno=35) key: - location: SourceLocation(pos=3731, lineno=102, colno=17) - end_location: SourceLocation(pos=3737, lineno=102, colno=23) + location: SourceLocation(pos=5802, lineno=141, colno=17) + end_location: SourceLocation(pos=5808, lineno=141, colno=23) value: 'text' value: - location: SourceLocation(pos=3738, lineno=102, colno=24) - end_location: SourceLocation(pos=3749, lineno=102, colno=35) + location: SourceLocation(pos=5809, lineno=141, colno=24) + end_location: SourceLocation(pos=5820, lineno=141, colno=35) value: 'Chapter I' - location: SourceLocation(pos=3750, lineno=102, colno=36) - end_location: SourceLocation(pos=3761, lineno=102, colno=47) + location: SourceLocation(pos=5821, lineno=141, colno=36) + end_location: SourceLocation(pos=5832, lineno=141, colno=47) key: - location: SourceLocation(pos=3750, lineno=102, colno=36) - end_location: SourceLocation(pos=3756, lineno=102, colno=42) + location: SourceLocation(pos=5821, lineno=141, colno=36) + end_location: SourceLocation(pos=5827, lineno=141, colno=42) value: 'bold' value: - location: SourceLocation(pos=3757, lineno=102, colno=43) - end_location: SourceLocation(pos=3761, lineno=102, colno=47) + location: SourceLocation(pos=5828, lineno=141, colno=43) + end_location: SourceLocation(pos=5832, lineno=141, colno=47) value: True - location: SourceLocation(pos=3773, lineno=104, colno=1) - end_location: SourceLocation(pos=3791, lineno=104, colno=19) + location: SourceLocation(pos=5844, lineno=143, colno=1) + end_location: SourceLocation(pos=5862, lineno=143, colno=19) identifier: 'weather:clear:duration' arguments: - location: SourceLocation(pos=3787, lineno=104, colno=15) - end_location: SourceLocation(pos=3791, lineno=104, colno=19) + location: SourceLocation(pos=5858, lineno=143, colno=15) + end_location: SourceLocation(pos=5862, lineno=143, colno=19) value: 1200 - location: SourceLocation(pos=3792, lineno=105, colno=1) - end_location: SourceLocation(pos=3804, lineno=105, colno=13) + location: SourceLocation(pos=5863, lineno=144, colno=1) + end_location: SourceLocation(pos=5875, lineno=144, colno=13) identifier: 'weather:rain' arguments: \ No newline at end of file From 0f24c874c07876bcd4fca04100a334040e3e4b44 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 15:21:46 +0200 Subject: [PATCH 0296/1554] fix: handle nbt arrays and add more examples --- packages/mecha/mecha/ast.py | 40 ++++++- packages/mecha/mecha/parse.py | 61 ++++++++--- .../mecha/resources/argument_examples.json | 37 ++++++- ...ent_examples_minecraft_nbt_tag_0_10__0.txt | 31 ++++++ ...ent_examples_minecraft_nbt_tag_0_11__0.txt | 102 ++++++++++++++++++ ...ment_examples_minecraft_nbt_tag_0_6__0.txt | 14 +++ ...ment_examples_minecraft_nbt_tag_0_7__0.txt | 14 +++ ...ment_examples_minecraft_nbt_tag_0_8__0.txt | 18 ++++ ...ment_examples_minecraft_nbt_tag_0_9__0.txt | 22 ++++ ...ment_examples_minecraft_nbt_tag_1_0__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_10__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_11__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_12__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_13__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_14__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_15__0.txt | 10 ++ ...ent_examples_minecraft_nbt_tag_1_16__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_1__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_2__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_3__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_4__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_5__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_6__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_7__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_8__0.txt | 10 ++ ...ment_examples_minecraft_nbt_tag_1_9__0.txt | 10 ++ 26 files changed, 493 insertions(+), 16 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index a3c09b17d..8a67ea713 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -17,6 +17,9 @@ "AstNbtList", "AstNbtCompoundEntry", "AstNbtCompound", + "AstNbtByteArray", + "AstNbtIntArray", + "AstNbtLongArray", "AstResourceLocation", "AstBlockState", "AstBlock", @@ -49,8 +52,9 @@ from beet.core.utils import extra_field, required_field # pyright: reportMissingTypeStubs=false -from nbtlib import Compound +from nbtlib import ByteArray, Compound, IntArray from nbtlib import List as ListTag +from nbtlib import LongArray from tokenstream import UNKNOWN_LOCATION, SourceLocation, set_location T = TypeVar("T") @@ -221,7 +225,7 @@ class AstNbtList(AstNbt): elements: AstChildren[AstNbt] = required_field() def evaluate(self) -> Any: - return ListTag([element.evaluate() for element in self.elements]) # type: ignore + return ListTag([element.evaluate() for element in self.elements]) @dataclass(frozen=True) @@ -239,11 +243,41 @@ class AstNbtCompound(AstNbt): entries: AstChildren[AstNbtCompoundEntry] = required_field() def evaluate(self) -> Any: - return Compound( # type: ignore + return Compound( {entry.key.value: entry.value.evaluate() for entry in self.entries}, ) +@dataclass(frozen=True) +class AstNbtByteArray(AstNbt): + """Ast nbt byte array node.""" + + elements: AstChildren[AstNbt] = required_field() + + def evaluate(self) -> Any: + return ByteArray([element.evaluate() for element in self.elements]) + + +@dataclass(frozen=True) +class AstNbtIntArray(AstNbt): + """Ast nbt int array node.""" + + elements: AstChildren[AstNbt] = required_field() + + def evaluate(self) -> Any: + return IntArray([element.evaluate() for element in self.elements]) + + +@dataclass(frozen=True) +class AstNbtLongArray(AstNbt): + """Ast nbt long array node.""" + + elements: AstChildren[AstNbt] = required_field() + + def evaluate(self) -> Any: + return LongArray([element.evaluate() for element in self.elements]) + + @dataclass(frozen=True) class AstResourceLocation(AstNode): """Ast resource location node.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 5541261c0..eef31528a 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -83,9 +83,12 @@ AstJsonValue, AstMessage, AstNbt, + AstNbtByteArray, AstNbtCompound, AstNbtCompoundEntry, + AstNbtIntArray, AstNbtList, + AstNbtLongArray, AstNbtPath, AstNbtPathSubscript, AstNbtValue, @@ -825,7 +828,7 @@ class NbtParser: """Parser for nbt tags.""" number_suffixes: Dict[str, Type[Any]] = field( - default_factory=lambda: { # type: ignore + default_factory=lambda: { "b": Byte, "s": Short, "l": Long, @@ -835,7 +838,7 @@ class NbtParser: ) literal_aliases: Dict[str, Any] = field( - default_factory=lambda: { # type: ignore + default_factory=lambda: { "true": Byte(1), "false": Byte(0), } @@ -851,6 +854,7 @@ class NbtParser: def __call__(self, stream: TokenStream) -> AstNbt: with stream.syntax( + array=r"\[[BIL];", curly=r"\{|\}", bracket=r"\[|\]", quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", @@ -859,9 +863,10 @@ def __call__(self, stream: TokenStream) -> AstNbt: colon=r":", comma=r",", ): - curly, bracket, number, string, quoted_string = stream.expect( + curly, bracket, array, number, string, quoted_string = stream.expect( ("curly", "{"), ("bracket", "["), + "array", "number", "string", "quoted_string", @@ -891,7 +896,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: node = AstNbtCompound(entries=AstChildren(entries)) return set_location(node, curly, close_curly) - elif bracket: + elif bracket or array: elements: List[AstNbt] = [] for _ in stream.peek_until(("bracket", "]")): @@ -901,8 +906,42 @@ def __call__(self, stream: TokenStream) -> AstNbt: stream.expect(("bracket", "]")) break - node = AstNbtList(elements=AstChildren(elements)) - return set_location(node, bracket, stream.current) + if array: + if array.value[1] == "B": + node = AstNbtByteArray(elements=AstChildren(elements)) + element_type = Byte + msg = "Expected all elements to be bytes." + elif array.value[1] == "I": + node = AstNbtIntArray(elements=AstChildren(elements)) + element_type = Int + msg = "Expected all elements to be integers." + else: + node = AstNbtLongArray(elements=AstChildren(elements)) + element_type = Long + msg = "Expected all elements to be long integers." + else: + node = AstNbtList(elements=AstChildren(elements)) + if node.elements: + if isinstance(elements[0], AstNbtValue): + element_type = type(elements[0].value) + else: + element_type = type(elements[0]) + else: + element_type = None + msg = "Expected all elements to have the same type." + + node = set_location(node, bracket or array, stream.current) + + if element_type: + for element in node.elements: + if ( + type(element.value) is not element_type + if isinstance(element, AstNbtValue) + else type(element) is not element_type + ): + raise element.emit_error(InvalidSyntax(msg)) + + return node if number: suffix = number.value[-1].lower() @@ -911,13 +950,13 @@ def __call__(self, stream: TokenStream) -> AstNbt: if suffix in self.number_suffixes: value = self.number_suffixes[suffix](number.value[:-1]) else: - value = ( # type: ignore + value = ( Double(number.value) if "." in number.value else Int(number.value) ) except (OutOfRange, ValueError): - value = String(number.value) # type: ignore + value = String(number.value) elif string: alias = string.value.lower() @@ -925,12 +964,10 @@ def __call__(self, stream: TokenStream) -> AstNbt: if alias in self.literal_aliases: value = self.literal_aliases[alias] else: - value = String(string.value) # type: ignore + value = String(string.value) elif quoted_string: - value = String(self.quote_helper.unquote_string(quoted_string)) # type: ignore - - # TODO: Arrays + value = String(self.quote_helper.unquote_string(quoted_string)) node = AstNbtValue(value=value) # type: ignore return set_location(node, stream.current) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index bd9b51f12..2df24fb4f 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -342,7 +342,42 @@ ], "minecraft:nbt_tag": [ { - "examples": ["0", "0b", "0l", "0.0", "\"foo\"", "{foo:bar}"] + "examples": [ + "0", + "0b", + "0l", + "0.0", + "\"foo\"", + "{foo:bar}", + "[B; 1b]", + "[I;-1]", + "[L;1l,2l]", + "[a, b, c]", + "[[], [1], [foo]]", + "[[],[[[[[[[[[[],[[[[5,1]],[]]]]]]]]]]],[[[[]]]]]]" + ] + }, + { + "invalid": true, + "examples": [ + "\"\\\"", + "\"\\n\"", + "\"\\\\\\\"", + "{\"\\\":1}", + "[a,1]", + "[[],[],1b]", + "[B;5l,4l,3]", + "[I;5l,4l,3]", + "[L;5l,4l,3]", + "{hello,world}", + "{with space: 5}", + "{\\\": no}", + "{foo: [1,2}", + "{error: [test]]}", + "[{,{}]", + "\"\\'\"", + "'\\\"'" + ] } ], "minecraft:objective": [ diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt new file mode 100644 index 000000000..a97c3c528 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt @@ -0,0 +1,31 @@ +minecraft:nbt_tag 0 10 +--- +{} +--- +[[], [1], [foo]] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + elements: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + elements: + + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + elements: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: Int(1) + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + elements: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: String('foo') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt new file mode 100644 index 000000000..f86be8cf5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt @@ -0,0 +1,102 @@ +minecraft:nbt_tag 0 11 +--- +{} +--- +[[],[[[[[[[[[[],[[[[5,1]],[]]]]]]]]]]],[[[[]]]]]] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + elements: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + elements: + + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + elements: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + elements: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + elements: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + elements: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + elements: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + elements: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + elements: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + elements: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + elements: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + elements: + + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + elements: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + elements: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + elements: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + elements: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: Int(5) + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: Int(1) + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + elements: + + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + elements: + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + elements: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + elements: + + location: SourceLocation(pos=42, lineno=1, colno=43) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + elements: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt new file mode 100644 index 000000000..b5d131c6d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt @@ -0,0 +1,14 @@ +minecraft:nbt_tag 0 6 +--- +{} +--- +[B; 1b] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + elements: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: Byte(1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt new file mode 100644 index 000000000..927f21eb1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt @@ -0,0 +1,14 @@ +minecraft:nbt_tag 0 7 +--- +{} +--- +[I;-1] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + elements: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: Int(-1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt new file mode 100644 index 000000000..ae9cf2488 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt @@ -0,0 +1,18 @@ +minecraft:nbt_tag 0 8 +--- +{} +--- +[L;1l,2l] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + elements: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: Long(1) + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: Long(2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt new file mode 100644 index 000000000..de055b43c --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt @@ -0,0 +1,22 @@ +minecraft:nbt_tag 0 9 +--- +{} +--- +[a, b, c] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + elements: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: String('a') + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: String('b') + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: String('c') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt new file mode 100644 index 000000000..971e125c7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 0 +--- +{} +--- +"\" +--- +UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\"' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt new file mode 100644 index 000000000..36e1a42fe --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 10 +--- +{} +--- +{with space: 5} +--- +UnexpectedToken: Expected colon but got string 'space' + +location = SourceLocation(pos=5, lineno=1, colno=6) +end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt new file mode 100644 index 000000000..27a1f5cdb --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 11 +--- +{} +--- +{\": no} +--- +UnexpectedToken: Expected curly '}' but got literal '\\":' + +location = SourceLocation(pos=1, lineno=1, colno=2) +end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt new file mode 100644 index 000000000..b73b72a8e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 12 +--- +{} +--- +{foo: [1,2} +--- +UnexpectedToken: Expected bracket ']' but got curly '}' + +location = SourceLocation(pos=10, lineno=1, colno=11) +end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt new file mode 100644 index 000000000..8683c9878 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 13 +--- +{} +--- +{error: [test]]} +--- +UnexpectedToken: Expected curly '}' but got bracket ']' + +location = SourceLocation(pos=14, lineno=1, colno=15) +end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt new file mode 100644 index 000000000..13b8efda0 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 14 +--- +{} +--- +[{,{}] +--- +UnexpectedToken: Expected curly '}' but got comma ',' + +location = SourceLocation(pos=2, lineno=1, colno=3) +end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt new file mode 100644 index 000000000..3932a7ac8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 15 +--- +{} +--- +"\'" +--- +InvalidSyntax: Invalid escape sequence "\\'". + +location = SourceLocation(pos=1, lineno=1, colno=2) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt new file mode 100644 index 000000000..e0aae6cf3 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 16 +--- +{} +--- +'\"' +--- +InvalidSyntax: Invalid escape sequence '\\"'. + +location = SourceLocation(pos=1, lineno=1, colno=2) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt new file mode 100644 index 000000000..a62a42581 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 1 +--- +{} +--- +"\n" +--- +InvalidSyntax: Invalid escape sequence '\\n'. + +location = SourceLocation(pos=1, lineno=1, colno=2) +end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt new file mode 100644 index 000000000..a2294a3ea --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 2 +--- +{} +--- +"\\\" +--- +UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\\\\\"' + +location = SourceLocation(pos=0, lineno=1, colno=1) +end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt new file mode 100644 index 000000000..7b29be995 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 3 +--- +{} +--- +{"\":1} +--- +UnexpectedToken: Expected curly '}' but got literal '"\\":1}' + +location = SourceLocation(pos=1, lineno=1, colno=2) +end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt new file mode 100644 index 000000000..6fb349fde --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 4 +--- +{} +--- +[a,1] +--- +InvalidSyntax: Expected all elements to have the same type. + +location = SourceLocation(pos=3, lineno=1, colno=4) +end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt new file mode 100644 index 000000000..0f0fa1bc6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 5 +--- +{} +--- +[[],[],1b] +--- +InvalidSyntax: Expected all elements to have the same type. + +location = SourceLocation(pos=7, lineno=1, colno=8) +end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt new file mode 100644 index 000000000..584ec6388 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 6 +--- +{} +--- +[B;5l,4l,3] +--- +InvalidSyntax: Expected all elements to be bytes. + +location = SourceLocation(pos=3, lineno=1, colno=4) +end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt new file mode 100644 index 000000000..b236182ad --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 7 +--- +{} +--- +[I;5l,4l,3] +--- +InvalidSyntax: Expected all elements to be integers. + +location = SourceLocation(pos=3, lineno=1, colno=4) +end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt new file mode 100644 index 000000000..5095c9752 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 8 +--- +{} +--- +[L;5l,4l,3] +--- +InvalidSyntax: Expected all elements to be long integers. + +location = SourceLocation(pos=9, lineno=1, colno=10) +end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt new file mode 100644 index 000000000..874f36a0d --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt @@ -0,0 +1,10 @@ +minecraft:nbt_tag 1 9 +--- +{} +--- +{hello,world} +--- +UnexpectedToken: Expected colon but got comma ',' + +location = SourceLocation(pos=6, lineno=1, colno=7) +end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file From 21a5279f74ef4270ab7a9e23de1049bf2bf329d5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 15:27:29 +0200 Subject: [PATCH 0297/1554] chore: remove scripts --- packages/mecha/package-lock.json | 14 ++-- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 50 +------------ packages/mecha/pyproject.toml | 1 - packages/mecha/scripts.py | 119 ------------------------------- 5 files changed, 9 insertions(+), 177 deletions(-) delete mode 100644 packages/mecha/scripts.py diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 01d7d3403..62c2cf2ff 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.165" + "pyright": "^1.1.167" } }, "node_modules/pyright": { - "version": "1.1.165", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", - "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", + "version": "1.1.167", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.167.tgz", + "integrity": "sha512-2RMw5CrH68hOjGW+LKMR87csS3FN+wo+kKkBwl+QiJnBRxvK4bF7TWdr39frJrMXPqo0s6gdSQZj4W+6Bs4jWA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.165", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.165.tgz", - "integrity": "sha512-yGjak6b/UV/n6GIRRSXtmkUhBT5vz/xn2IgRidf2cBiP9wGfFllj3YxCGfnmXCyelUDf4956GnPTCXzeOImT7w==", + "version": "1.1.167", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.167.tgz", + "integrity": "sha512-2RMw5CrH68hOjGW+LKMR87csS3FN+wo+kKkBwl+QiJnBRxvK4bF7TWdr39frJrMXPqo0s6gdSQZj4W+6Bs4jWA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index ba28f9bb8..46621a00b 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.165" + "pyright": "^1.1.167" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 47b2a643c..4855d2f7e 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -31,21 +31,6 @@ python-versions = ">=3.5" [package.extras] tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)", "coveralls", "pytest-benchmark"] -[[package]] -name = "beautifulsoup4" -version = "4.9.3" -description = "Screen-scraping library" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -soupsieve = {version = ">1.2", markers = "python_version >= \"3.0\""} - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - [[package]] name = "beet" version = "0.41.1" @@ -391,18 +376,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "mcwiki" -version = "0.2.1" -description = "A scraping library for the Minecraft Wiki" -category = "dev" -optional = false -python-versions = ">=3.8,<4.0" - -[package.dependencies] -beautifulsoup4 = ">=4.9.3,<5.0.0" -requests = ">=2.26.0,<3.0.0" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -734,14 +707,6 @@ category = "dev" optional = false python-versions = ">=3.5" -[[package]] -name = "soupsieve" -version = "2.2.1" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" -optional = false -python-versions = ">=3.6" - [[package]] name = "tokenstream" version = "1.0.1" @@ -861,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "2969aeeaaab6bc58c68b8b24d2354bfae59cbe99819ba448a6245b410c42efde" +content-hash = "a7255b8a81eb7c49e4ccbe905e2c88ab71b975bd9a021737d1886f64c473b383" [metadata.files] atomicwrites = [ @@ -876,11 +841,6 @@ base58 = [ {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.9.3-py2-none-any.whl", hash = "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35"}, - {file = "beautifulsoup4-4.9.3-py3-none-any.whl", hash = "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"}, - {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"}, -] beet = [ {file = "beet-0.41.1-py3-none-any.whl", hash = "sha256:38381d525c6a2905b7d8615863648657e81c246dd3660d719979c4083dcd57f7"}, {file = "beet-0.41.1.tar.gz", hash = "sha256:fda29893a304e257f99ff5e632c49dbd932ef8ca3a749a1f70b6287d5eda5f66"}, @@ -1078,10 +1038,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] -mcwiki = [ - {file = "mcwiki-0.2.1-py3-none-any.whl", hash = "sha256:eefe2fbe9afabe89d4d65158cb646bf4ba261c834b82761da7ee0d1c7fe2db57"}, - {file = "mcwiki-0.2.1.tar.gz", hash = "sha256:8546145e5e8d3d9db5b4a03fefe44ab9655d4d7601fe176694199cb967a1063f"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, @@ -1310,10 +1266,6 @@ smmap = [ {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] -soupsieve = [ - {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"}, - {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, -] tokenstream = [ {file = "tokenstream-1.0.1-py3-none-any.whl", hash = "sha256:7464300fb8835986232a93e38579b3b85cf92201b1c24fbea094f624c356f219"}, {file = "tokenstream-1.0.1.tar.gz", hash = "sha256:fefd356436f69c66095800e8fa59431438e53b503c81b6010f47a61b2ee409f6"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8e423eac7..e78a3433e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -32,7 +32,6 @@ isort = "^5.9.3" pytest = "^6.2.5" pytest-insta = "^0.1.10" python-semantic-release = "^7.19.1" -mcwiki = "^0.2.1" lectern = ">=0.15.3" [tool.black] diff --git a/packages/mecha/scripts.py b/packages/mecha/scripts.py deleted file mode 100644 index d6c12c4de..000000000 --- a/packages/mecha/scripts.py +++ /dev/null @@ -1,119 +0,0 @@ -from typing import Optional - -import click -import mcwiki -from beet import Function -from beet.core.utils import dump_json -from bs4 import BeautifulSoup, Tag -from mcwiki.utils import normalize_string - - -class JavaExampleExtractor(mcwiki.TextExtractor): - def scan( # type: ignore - self, - html: BeautifulSoup, - limit: Optional[int] = None, - ) -> mcwiki.ScanResult["JavaExampleExtractor", str]: - result = super().scan(html, limit=limit) - result.elements[:] = [ - element - for element in result.elements - if not ( - isinstance(element, Tag) - and ( - any( - parent.get_text().startswith( - ("Bedrock Edition:", "In Bedrock Edition") - ) - for parent in element.find_parents("li") - ) - or element.parent - and (sup := element.parent.find("sup")) - and (annotation := sup.get_text().lower()) # type: ignore - and ( - "[be only]" in annotation - or "[bedrock edition only]" in annotation - ) - ) - ) - ] - return result - - -@click.group() -def cli(): - """A collection of utilities for the project.""" - - -@cli.command() -def download_command_examples(): - """Download command examples from the wiki.""" - generated_function = Function() - - commands = [ - "advancement", - "attribute", - "clear", - "data", - "defaultgamemode", - "effect", - "enchant", - # "execute", - "experience", - "fill", - "function", - "gamemode", - "gamerule", - "give", - "item", - "kill", - "locate", - "msg", - # "particle", - "setblock", - "spreadplayers", - "summon", - "teleport", - "tellraw", - "time", - "title", - "weather", - ] - - java_example = JavaExampleExtractor("li code") - - for command in commands: - page = mcwiki.load(f"commands/{command}") - examples = page.get("examples") - - if examples is not None: - generated_function.append(f"# {command}") - for code in examples.extract_all(java_example): - if code.startswith("/"): - code = code[1:] - if code.startswith(command): - generated_function.append(code) - - click.echo(generated_function.text, nl=False) - - -@cli.command() -def download_argument_examples(): - """Download argument examples from the wiki.""" - page = mcwiki.load("argument types") - section = page["java edition"] - - argument_examples = { - argument_type: [ - {"examples": examples} - for ul in documentation.html.select(".collapsible-content > ul") # type: ignore - if not (ul.parent and (p := ul.parent.find_previous_sibling("p")) and not p.get_text().startswith("Official examples")) and (examples := [normalize_string(example.string) for example in ul.select("li > code")]) # type: ignore - ] - for argument_type, documentation in section.items() - } - - click.echo(dump_json(argument_examples), nl=False) - - -if __name__ == "__main__": - cli() From dc028294195549c0b1b2984028082490b1dc2906 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 12 Sep 2021 23:34:35 +0200 Subject: [PATCH 0298/1554] fix: pyright thinks nbtlib types are unknown --- packages/mecha/mecha/ast.py | 10 +++++----- packages/mecha/mecha/parse.py | 18 +++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 8a67ea713..959beecaf 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -225,7 +225,7 @@ class AstNbtList(AstNbt): elements: AstChildren[AstNbt] = required_field() def evaluate(self) -> Any: - return ListTag([element.evaluate() for element in self.elements]) + return ListTag([element.evaluate() for element in self.elements]) # type: ignore @dataclass(frozen=True) @@ -243,7 +243,7 @@ class AstNbtCompound(AstNbt): entries: AstChildren[AstNbtCompoundEntry] = required_field() def evaluate(self) -> Any: - return Compound( + return Compound( # type: ignore {entry.key.value: entry.value.evaluate() for entry in self.entries}, ) @@ -255,7 +255,7 @@ class AstNbtByteArray(AstNbt): elements: AstChildren[AstNbt] = required_field() def evaluate(self) -> Any: - return ByteArray([element.evaluate() for element in self.elements]) + return ByteArray([element.evaluate() for element in self.elements]) # type: ignore @dataclass(frozen=True) @@ -265,7 +265,7 @@ class AstNbtIntArray(AstNbt): elements: AstChildren[AstNbt] = required_field() def evaluate(self) -> Any: - return IntArray([element.evaluate() for element in self.elements]) + return IntArray([element.evaluate() for element in self.elements]) # type: ignore @dataclass(frozen=True) @@ -275,7 +275,7 @@ class AstNbtLongArray(AstNbt): elements: AstChildren[AstNbt] = required_field() def evaluate(self) -> Any: - return LongArray([element.evaluate() for element in self.elements]) + return LongArray([element.evaluate() for element in self.elements]) # type: ignore @dataclass(frozen=True) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index eef31528a..eb9035dfa 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -828,7 +828,7 @@ class NbtParser: """Parser for nbt tags.""" number_suffixes: Dict[str, Type[Any]] = field( - default_factory=lambda: { + default_factory=lambda: { # type: ignore "b": Byte, "s": Short, "l": Long, @@ -838,7 +838,7 @@ class NbtParser: ) literal_aliases: Dict[str, Any] = field( - default_factory=lambda: { + default_factory=lambda: { # type: ignore "true": Byte(1), "false": Byte(0), } @@ -909,15 +909,15 @@ def __call__(self, stream: TokenStream) -> AstNbt: if array: if array.value[1] == "B": node = AstNbtByteArray(elements=AstChildren(elements)) - element_type = Byte + element_type = Byte # type: ignore msg = "Expected all elements to be bytes." elif array.value[1] == "I": node = AstNbtIntArray(elements=AstChildren(elements)) - element_type = Int + element_type = Int # type: ignore msg = "Expected all elements to be integers." else: node = AstNbtLongArray(elements=AstChildren(elements)) - element_type = Long + element_type = Long # type: ignore msg = "Expected all elements to be long integers." else: node = AstNbtList(elements=AstChildren(elements)) @@ -950,13 +950,13 @@ def __call__(self, stream: TokenStream) -> AstNbt: if suffix in self.number_suffixes: value = self.number_suffixes[suffix](number.value[:-1]) else: - value = ( + value = ( # type: ignore Double(number.value) if "." in number.value else Int(number.value) ) except (OutOfRange, ValueError): - value = String(number.value) + value = String(number.value) # type: ignore elif string: alias = string.value.lower() @@ -964,10 +964,10 @@ def __call__(self, stream: TokenStream) -> AstNbt: if alias in self.literal_aliases: value = self.literal_aliases[alias] else: - value = String(string.value) + value = String(string.value) # type: ignore elif quoted_string: - value = String(self.quote_helper.unquote_string(quoted_string)) + value = String(self.quote_helper.unquote_string(quoted_string)) # type: ignore node = AstNbtValue(value=value) # type: ignore return set_location(node, stream.current) From 2884ffb2263b24bea1f3d975476970096ad04ca5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 14 Sep 2021 08:14:51 +0200 Subject: [PATCH 0299/1554] chore: update tokenstream --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- .../parse__argument_examples_brigadier_bool_1_0__0.txt | 2 +- .../parse__argument_examples_brigadier_bool_1_1__0.txt | 2 +- .../parse__argument_examples_brigadier_double_1_0__0.txt | 2 +- .../parse__argument_examples_brigadier_float_1_0__0.txt | 2 +- .../parse__argument_examples_brigadier_integer_1_0__0.txt | 2 +- .../parse__argument_examples_minecraft_angle_1_1__0.txt | 2 +- ...arse__argument_examples_minecraft_block_pos_1_0__0.txt | 2 +- ...arse__argument_examples_minecraft_block_pos_1_1__0.txt | 2 +- ...arse__argument_examples_minecraft_block_pos_1_2__0.txt | 2 +- ...arse__argument_examples_minecraft_block_pos_1_3__0.txt | 2 +- ...argument_examples_minecraft_block_predicate_1_0__0.txt | 2 +- ...argument_examples_minecraft_block_predicate_1_1__0.txt | 2 +- ...argument_examples_minecraft_block_predicate_1_2__0.txt | 2 +- ...argument_examples_minecraft_block_predicate_1_3__0.txt | 2 +- ...argument_examples_minecraft_block_predicate_1_4__0.txt | 2 +- ...argument_examples_minecraft_block_predicate_1_5__0.txt | 2 +- ...se__argument_examples_minecraft_block_state_1_0__0.txt | 2 +- ...se__argument_examples_minecraft_block_state_1_2__0.txt | 2 +- ...se__argument_examples_minecraft_block_state_1_3__0.txt | 2 +- ...se__argument_examples_minecraft_block_state_1_4__0.txt | 2 +- ...se__argument_examples_minecraft_block_state_1_5__0.txt | 2 +- ...se__argument_examples_minecraft_block_state_1_6__0.txt | 2 +- ...rse__argument_examples_minecraft_column_pos_1_0__0.txt | 2 +- ...rse__argument_examples_minecraft_column_pos_1_2__0.txt | 2 +- ...arse__argument_examples_minecraft_component_1_0__0.txt | 2 +- ...arse__argument_examples_minecraft_component_1_1__0.txt | 2 +- ...se__argument_examples_minecraft_float_range_1_0__0.txt | 2 +- ...se__argument_examples_minecraft_float_range_1_1__0.txt | 2 +- .../parse__argument_examples_minecraft_message_1_0__0.txt | 2 +- ...parse__argument_examples_minecraft_nbt_path_1_0__0.txt | 2 +- .../parse__argument_examples_minecraft_nbt_tag_1_0__0.txt | 2 +- ...parse__argument_examples_minecraft_nbt_tag_1_10__0.txt | 2 +- ...parse__argument_examples_minecraft_nbt_tag_1_11__0.txt | 2 +- ...parse__argument_examples_minecraft_nbt_tag_1_12__0.txt | 2 +- ...parse__argument_examples_minecraft_nbt_tag_1_13__0.txt | 2 +- ...parse__argument_examples_minecraft_nbt_tag_1_14__0.txt | 2 +- .../parse__argument_examples_minecraft_nbt_tag_1_2__0.txt | 2 +- .../parse__argument_examples_minecraft_nbt_tag_1_3__0.txt | 2 +- .../parse__argument_examples_minecraft_nbt_tag_1_9__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_0__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_1__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_2__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_3__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_4__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_5__0.txt | 2 +- ...parse__argument_examples_minecraft_particle_1_6__0.txt | 2 +- ...e__argument_examples_minecraft_score_holder_2_3__0.txt | 2 +- 49 files changed, 52 insertions(+), 52 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 4855d2f7e..a7ef1f919 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -709,7 +709,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.0.1" +version = "1.0.4" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -826,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "a7255b8a81eb7c49e4ccbe905e2c88ab71b975bd9a021737d1886f64c473b383" +content-hash = "b0fcea0b8451727f2fb4c81ba96ac5f199f68b593ad1f388abddc4ce94d80625" [metadata.files] atomicwrites = [ @@ -1267,8 +1267,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.0.1-py3-none-any.whl", hash = "sha256:7464300fb8835986232a93e38579b3b85cf92201b1c24fbea094f624c356f219"}, - {file = "tokenstream-1.0.1.tar.gz", hash = "sha256:fefd356436f69c66095800e8fa59431438e53b503c81b6010f47a61b2ee409f6"}, + {file = "tokenstream-1.0.4-py3-none-any.whl", hash = "sha256:fa8b4ad629c3c090396e43c3f644ad3385db91f9f83887628c22c11e319562b3"}, + {file = "tokenstream-1.0.4.tar.gz", hash = "sha256:def3850e3972598d0999d0099573163ae4b746fddd805880dcc020d01844ac9a"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e78a3433e..44502b9ec 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.41.1" -tokenstream = "^1.0.1" +tokenstream = ">=1.0.4" [tool.poetry.dev-dependencies] black = "^21.7b0" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt index da2443e84..0d67e5a1d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt @@ -4,7 +4,7 @@ brigadier:bool 1 0 --- blob --- -UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'blob' +UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'blob'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt index 014618954..bedafd18d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt @@ -4,7 +4,7 @@ brigadier:bool 1 1 --- thing --- -UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'thing' +UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'thing'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt index 4e13ae832..facf6c642 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt @@ -4,7 +4,7 @@ brigadier:double 1 0 --- ayy --- -UnexpectedToken: Expected number but got literal 'ayy' +UnexpectedToken: Expected number but got literal 'ayy'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt index b1b355b8b..8062321a3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt @@ -4,7 +4,7 @@ brigadier:float 1 0 --- foo --- -UnexpectedToken: Expected number but got literal 'foo' +UnexpectedToken: Expected number but got literal 'foo'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt index 7f2519b91..d9018eef6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt @@ -4,7 +4,7 @@ brigadier:integer 1 0 --- yolo --- -UnexpectedToken: Expected number but got literal 'yolo' +UnexpectedToken: Expected number but got literal 'yolo'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt index 781e8c3f5..c3642a767 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:angle 1 1 --- wat --- -UnexpectedToken: Expected coordinate but got literal 'wat' +UnexpectedToken: Expected coordinate but got literal 'wat'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt index db14765b4..cd7fd310b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:block_pos 1 0 --- ^-3 --- -UnexpectedEOF: Expected coordinate but reached end of file +UnexpectedEOF: Expected coordinate but reached end of file. location = SourceLocation(pos=3, lineno=1, colno=4) end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt index eefee5567..c71fc355a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:block_pos 1 1 --- wat --- -UnexpectedToken: Expected coordinate but got literal 'wat' +UnexpectedToken: Expected coordinate but got literal 'wat'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt index 7c621dc99..bc2a41046 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:block_pos 1 2 --- 17 --- -UnexpectedEOF: Expected coordinate but reached end of file +UnexpectedEOF: Expected coordinate but reached end of file. location = SourceLocation(pos=2, lineno=1, colno=3) end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt index 1fc79dd82..19dc165d0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:block_pos 1 3 --- {} --- -UnexpectedToken: Expected coordinate but got literal '{}' +UnexpectedToken: Expected coordinate but got literal '{}'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt index ff118f267..b9a84f886 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 0 --- {} --- -UnexpectedToken: Expected resource_location but got literal '{}' +UnexpectedToken: Expected resource_location but got literal '{}'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt index 44385c92e..39e1df5eb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 1 --- #stone[foo=bar, --- -UnexpectedEOF: Expected bracket ']' but reached end of file +UnexpectedEOF: Expected bracket ']' but reached end of file. location = SourceLocation(pos=15, lineno=1, colno=16) end_location = SourceLocation(pos=15, lineno=1, colno=16) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt index ae1192c9c..2de2014bb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 2 --- #stone[ --- -UnexpectedEOF: Expected bracket ']' but reached end of file +UnexpectedEOF: Expected bracket ']' but reached end of file. location = SourceLocation(pos=7, lineno=1, colno=8) end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt index 1c5ba61ee..0a7fd62c2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 3 --- #stone[foo --- -UnexpectedEOF: Expected equal but reached end of file +UnexpectedEOF: Expected equal but reached end of file. location = SourceLocation(pos=10, lineno=1, colno=11) end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt index 4fa8ee3ee..8f797b9c7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 4 --- #stone[thing=hello]{ --- -UnexpectedEOF: Expected curly '}' but reached end of file +UnexpectedEOF: Expected curly '}' but reached end of file. location = SourceLocation(pos=20, lineno=1, colno=21) end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt index 0d16bb18a..55e07bcbe 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 5 --- #stone[thing=hello]{what:is:that} --- -UnexpectedToken: Expected curly '}' but got colon ':' +UnexpectedToken: Expected curly '}' but got colon ':'. location = SourceLocation(pos=27, lineno=1, colno=28) end_location = SourceLocation(pos=27, lineno=1, colno=28) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt index fe07acadb..c27f08f4d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 0 --- {} --- -UnexpectedToken: Expected resource_location but got literal '{}' +UnexpectedToken: Expected resource_location but got literal '{}'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt index 53271c17d..f16145a5f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 2 --- stone[foo=bar, --- -UnexpectedEOF: Expected bracket ']' but reached end of file +UnexpectedEOF: Expected bracket ']' but reached end of file. location = SourceLocation(pos=14, lineno=1, colno=15) end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt index 14dfdf941..1e3100b0a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 3 --- stone[ --- -UnexpectedEOF: Expected bracket ']' but reached end of file +UnexpectedEOF: Expected bracket ']' but reached end of file. location = SourceLocation(pos=6, lineno=1, colno=7) end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt index 6ce0a4d93..60872c4b9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 4 --- stone[foo --- -UnexpectedEOF: Expected equal but reached end of file +UnexpectedEOF: Expected equal but reached end of file. location = SourceLocation(pos=9, lineno=1, colno=10) end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt index a407e2ea1..88d18ad90 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 5 --- stone[thing=hello]{ --- -UnexpectedEOF: Expected curly '}' but reached end of file +UnexpectedEOF: Expected curly '}' but reached end of file. location = SourceLocation(pos=19, lineno=1, colno=20) end_location = SourceLocation(pos=19, lineno=1, colno=20) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt index 2d01d659f..d838e2d33 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 6 --- stone[thing=hello]{what:is:that} --- -UnexpectedToken: Expected curly '}' but got colon ':' +UnexpectedToken: Expected curly '}' but got colon ':'. location = SourceLocation(pos=26, lineno=1, colno=27) end_location = SourceLocation(pos=26, lineno=1, colno=27) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt index 8484b2acf..87c494e7d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:column_pos 1 0 --- 7 --- -UnexpectedEOF: Expected coordinate but reached end of file +UnexpectedEOF: Expected coordinate but reached end of file. location = SourceLocation(pos=1, lineno=1, colno=2) end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt index 64b6d31b2..a7f8e6618 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:column_pos 1 2 --- @ --- -UnexpectedToken: Expected coordinate but got literal '@' +UnexpectedToken: Expected coordinate but got literal '@'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt index 0b817e7b5..ac365fd27 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:component 1 0 --- wat --- -UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got literal 'wat' +UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got literal 'wat'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt index d1ff6b7e6..48492c697 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:component 1 1 --- {"hey": ]} --- -UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']' +UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']'. location = SourceLocation(pos=7, lineno=1, colno=8) end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt index 282386a92..ec37b43f5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:float_range 1 0 --- .. --- -UnexpectedToken: Expected range but got literal '..' +UnexpectedToken: Expected range but got literal '..'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt index 33c9b1c06..ec620df38 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:float_range 1 1 --- wat --- -UnexpectedToken: Expected range but got literal 'wat' +UnexpectedToken: Expected range but got literal 'wat'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt index 6b8ff8a30..836bb9f2a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:message 1 0 --- Hello @p[team=winner :) --- -UnexpectedToken: Expected bracket ']' but got literal ':)' +UnexpectedToken: Expected bracket ']' but got literal ':)'. location = SourceLocation(pos=20, lineno=1, colno=21) end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt index a26e7bc01..1973fcfab 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_path 1 0 --- {foo:bar foo:bar} --- -UnexpectedToken: Expected curly '}' but got string 'foo' +UnexpectedToken: Expected curly '}' but got string 'foo'. location = SourceLocation(pos=8, lineno=1, colno=9) end_location = SourceLocation(pos=8, lineno=1, colno=9) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt index 971e125c7..cc3917a8a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 0 --- "\" --- -UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\"' +UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\"'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt index 36e1a42fe..9ade7cc10 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 10 --- {with space: 5} --- -UnexpectedToken: Expected colon but got string 'space' +UnexpectedToken: Expected colon but got string 'space'. location = SourceLocation(pos=5, lineno=1, colno=6) end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt index 27a1f5cdb..eb7082d5f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 11 --- {\": no} --- -UnexpectedToken: Expected curly '}' but got literal '\\":' +UnexpectedToken: Expected curly '}' but got literal '\\":'. location = SourceLocation(pos=1, lineno=1, colno=2) end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt index b73b72a8e..80cfb9277 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 12 --- {foo: [1,2} --- -UnexpectedToken: Expected bracket ']' but got curly '}' +UnexpectedToken: Expected bracket ']' but got curly '}'. location = SourceLocation(pos=10, lineno=1, colno=11) end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt index 8683c9878..fff8c1856 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 13 --- {error: [test]]} --- -UnexpectedToken: Expected curly '}' but got bracket ']' +UnexpectedToken: Expected curly '}' but got bracket ']'. location = SourceLocation(pos=14, lineno=1, colno=15) end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt index 13b8efda0..dcc9fd78b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 14 --- [{,{}] --- -UnexpectedToken: Expected curly '}' but got comma ',' +UnexpectedToken: Expected curly '}' but got comma ','. location = SourceLocation(pos=2, lineno=1, colno=3) end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt index a2294a3ea..d144286ef 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 2 --- "\\\" --- -UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\\\\\"' +UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\\\\\"'. location = SourceLocation(pos=0, lineno=1, colno=1) end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt index 7b29be995..183eea134 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 3 --- {"\":1} --- -UnexpectedToken: Expected curly '}' but got literal '"\\":1}' +UnexpectedToken: Expected curly '}' but got literal '"\\":1}'. location = SourceLocation(pos=1, lineno=1, colno=2) end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt index 874f36a0d..2d5544123 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_tag 1 9 --- {hello,world} --- -UnexpectedToken: Expected colon but got comma ',' +UnexpectedToken: Expected colon but got comma ','. location = SourceLocation(pos=6, lineno=1, colno=7) end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt index 8f3c4a5f2..2d62ae445 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 0 --- dust 1.0 0.5 0.5 --- -UnexpectedEOF: Expected number but reached end of file +UnexpectedEOF: Expected number but reached end of file. location = SourceLocation(pos=16, lineno=1, colno=17) end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt index ab724d130..d5dfa248c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 1 --- minecraft:dust_color_transition 1.0 0.0 0.0 hello --- -UnexpectedToken: Expected number but got literal 'hello' +UnexpectedToken: Expected number but got literal 'hello'. location = SourceLocation(pos=43, lineno=1, colno=44) end_location = SourceLocation(pos=43, lineno=1, colno=44) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt index 9ab1e32c3..429187f3c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 2 --- block minecraft:grass_block[snowy=] --- -UnexpectedToken: Expected state but got bracket ']' +UnexpectedToken: Expected state but got bracket ']'. location = SourceLocation(pos=34, lineno=1, colno=35) end_location = SourceLocation(pos=34, lineno=1, colno=35) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt index b16a570fb..0e907d507 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 3 --- falling_dust grass_block[snowy=true]{hello: world wat} --- -UnexpectedToken: Expected curly '}' but got string 'wat' +UnexpectedToken: Expected curly '}' but got string 'wat'. location = SourceLocation(pos=49, lineno=1, colno=50) end_location = SourceLocation(pos=49, lineno=1, colno=50) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt index c7f238255..995a910fc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 4 --- item minecraft:apple{ --- -UnexpectedEOF: Expected curly '}' but reached end of file +UnexpectedEOF: Expected curly '}' but reached end of file. location = SourceLocation(pos=21, lineno=1, colno=22) end_location = SourceLocation(pos=21, lineno=1, colno=22) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt index e7499147b..107a56ad3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 5 --- vibration 0.0 64.0 0.0 5.0 thing --- -UnexpectedToken: Expected number but got literal 'thing' +UnexpectedToken: Expected number but got literal 'thing'. location = SourceLocation(pos=26, lineno=1, colno=27) end_location = SourceLocation(pos=26, lineno=1, colno=27) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt index d5bd4064d..e1d39c250 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 6 --- vibration 0.0 64.0 --- -UnexpectedEOF: Expected number but reached end of file +UnexpectedEOF: Expected number but reached end of file. location = SourceLocation(pos=18, lineno=1, colno=19) end_location = SourceLocation(pos=18, lineno=1, colno=19) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt index e598e22a1..abe2a4311 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt @@ -4,7 +4,7 @@ minecraft:score_holder 2 3 --- @a[ = 1 , ] --- -UnexpectedToken: Expected word or quoted_string but got equal '=' +UnexpectedToken: Expected word or quoted_string but got equal '='. location = SourceLocation(pos=3, lineno=1, colno=4) end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file From d4b81dc1afa8e26ba56e203ca14ac4d96f252dd3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 14 Sep 2021 08:26:35 +0200 Subject: [PATCH 0300/1554] fix: detect eof to avoid requiring a final newline --- packages/mecha/mecha/api.py | 31 +++++++------------ packages/mecha/mecha/parse.py | 16 +++++----- .../tests/snapshots/parse__basic2__0.txt | 2 +- .../snapshots/parse__command_examples__0.txt | 2 +- packages/mecha/tests/test_parse.py | 6 ++-- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 279457f0a..a93553168 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -3,8 +3,9 @@ ] +from contextlib import contextmanager from dataclasses import InitVar, dataclass, replace -from typing import Any, List, Optional, Union +from typing import Any, Iterator, List, Optional, Union from beet import Context, Function, TextFileBase from beet.core.utils import extra_field @@ -25,11 +26,11 @@ class Mecha: default_factory=lambda: CommandSpec(parsers=get_default_parsers()) ) - def create_token_stream(self, text: str) -> TokenStream: - """Instantiate a token stream for parsing the given input.""" - stream = TokenStream(text) - stream.data["spec"] = self.spec - return stream + @contextmanager + def prepare_token_stream(self, stream: TokenStream) -> Iterator[TokenStream]: + """Prepare the token stream for parsing.""" + with stream.provide(spec=self.spec), stream.syntax(literal=r"\S+"): + yield stream def parse_function( self, @@ -43,18 +44,10 @@ def parse_function( if not filename and function.source_path: filename = str(function.source_path) - ast = delegate("root", self.create_token_stream(function.text + "\n")) - return replace(ast, filename=filename) + with self.prepare_token_stream(TokenStream(function.text)) as stream: + return replace(delegate("root", stream), filename=filename) - def parse_command(self, command: str) -> AstCommand: + def parse_command(self, text: str) -> AstCommand: """Parse a single command from a string and return the ast.""" - ast = self.parse_function(command) - - if len(ast.commands) != 1: - raise ValueError( - "Expected a single command but more than one command were provided." - if ast.commands - else "Expected a single command but no command were provided.", - ) - - return ast.commands[0] + with self.prepare_token_stream(TokenStream(text)) as stream: + return delegate("command", stream) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index eb9035dfa..fab0eb25d 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -472,7 +472,7 @@ def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: def parse_root(stream: TokenStream) -> AstRoot: """Parse root.""" - with stream.syntax(comment=r"#.+$", literal=r"\S+"), stream.intercept("newline"): + with stream.syntax(comment=r"#.+$"), stream.intercept("newline"): start = stream.peek() if not start: @@ -504,7 +504,7 @@ def parse_command(stream: TokenStream) -> AstCommand: end_location = location while tree and tree.children: - newline = None + should_break = False for (name, child), alternative in stream.choose(*tree.children.items()): with alternative, stream.provide(scope=scope + (name,)): @@ -517,15 +517,17 @@ def parse_command(stream: TokenStream) -> AstCommand: arguments.append(node) end_location = node.end_location - if not child.redirect and not child.children: - newline = stream.expect("newline") - elif child.executable: - newline = stream.get("newline") + with stream.intercept("eof"): + if not child.redirect and not child.children: + stream.expect("newline", "eof") + should_break = True + elif child.executable and stream.get("newline", "eof"): + should_break = True scope = stream.data["scope"] tree = child - if newline: + if should_break: break target = spec.tree.get(tree.redirect) diff --git a/packages/mecha/tests/snapshots/parse__basic2__0.txt b/packages/mecha/tests/snapshots/parse__basic2__0.txt index aff43fd83..0af01f743 100644 --- a/packages/mecha/tests/snapshots/parse__basic2__0.txt +++ b/packages/mecha/tests/snapshots/parse__basic2__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=57, lineno=4, colno=1) + end_location: SourceLocation(pos=56, lineno=3, colno=1) filename: None commands: diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 653824f69..07fd04755 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5877, lineno=146, colno=1) + end_location: SourceLocation(pos=5876, lineno=145, colno=1) filename: None commands: diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 657ff4bfc..2409996b3 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -2,7 +2,7 @@ from beet import Function from beet.core.utils import JsonDict from pytest_insta import SnapshotFixture -from tokenstream import InvalidSyntax +from tokenstream import InvalidSyntax, TokenStream from mecha import Mecha, delegate, get_argument_examples, get_command_examples @@ -52,9 +52,9 @@ def test_argument_examples( if argument_parser not in mc.spec.parsers: pytest.skip() - stream = mc.create_token_stream(value) + stream = TokenStream(value) - with stream.syntax(literal=r"\S+"), stream.provide(properties=properties): + with mc.prepare_token_stream(stream), stream.provide(properties=properties): if invalid: with pytest.raises(InvalidSyntax) as exc_info: delegate(argument_parser, stream) From 82316d01fb1d0b6dc38db58af855f7cf02dc13fb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 11:53:16 +0200 Subject: [PATCH 0301/1554] feat: add serializer --- packages/mecha/mecha/__init__.py | 2 + packages/mecha/mecha/api.py | 23 +- packages/mecha/mecha/ast.py | 17 +- packages/mecha/mecha/dispatch.py | 212 ++++++++++++++ packages/mecha/mecha/parse.py | 147 +++++++--- packages/mecha/mecha/serialize.py | 264 ++++++++++++++++++ packages/mecha/mecha/spec.py | 2 + packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- ...ument_examples_minecraft_entity_0_8__0.txt | 2 +- ...ument_examples_minecraft_entity_0_9__0.txt | 6 +- ..._examples_minecraft_float_range_0_0__0.txt | 2 +- ..._examples_minecraft_float_range_0_1__0.txt | 4 +- ..._examples_minecraft_float_range_0_4__0.txt | 2 +- ...rgument_examples_minecraft_time_0_0__0.txt | 4 +- ...rgument_examples_minecraft_time_0_1__0.txt | 4 +- ...rgument_examples_minecraft_time_0_2__0.txt | 4 +- ...rgument_examples_minecraft_time_0_3__0.txt | 4 +- .../tests/snapshots/parse__basic1__0.txt | 9 - .../tests/snapshots/parse__basic2__0.txt | 23 -- .../snapshots/parse__command_examples__0.txt | 60 +--- packages/mecha/tests/test_parse.py | 15 - 22 files changed, 652 insertions(+), 164 deletions(-) create mode 100644 packages/mecha/mecha/dispatch.py create mode 100644 packages/mecha/mecha/serialize.py delete mode 100644 packages/mecha/tests/snapshots/parse__basic1__0.txt delete mode 100644 packages/mecha/tests/snapshots/parse__basic2__0.txt diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 739733bb0..4c520767e 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -3,8 +3,10 @@ from .api import * from .config import * +from .dispatch import * from .error import * from .parse import * from .prototype import * from .resources import * +from .serialize import * from .spec import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index a93553168..50f3b2d27 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -1,5 +1,6 @@ __all__ = [ "Mecha", + "MechaOptions", ] @@ -9,13 +10,21 @@ from beet import Context, Function, TextFileBase from beet.core.utils import extra_field +from pydantic import BaseModel from tokenstream import TokenStream from .ast import AstCommand, AstRoot from .parse import delegate, get_default_parsers +from .serialize import Serializer from .spec import CommandSpec +class MechaOptions(BaseModel): + """Mecha options.""" + + multiline: bool = False + + @dataclass class Mecha: """Class exposing the command api.""" @@ -26,11 +35,21 @@ class Mecha: default_factory=lambda: CommandSpec(parsers=get_default_parsers()) ) + serialize: Serializer = extra_field(init=False) + + def __post_init__(self, ctx: Optional[Context]): + if ctx: + opts = ctx.validate("mecha", MechaOptions) + self.spec.multiline = opts.multiline + + self.serialize = Serializer(self.spec) + @contextmanager def prepare_token_stream(self, stream: TokenStream) -> Iterator[TokenStream]: """Prepare the token stream for parsing.""" - with stream.provide(spec=self.spec), stream.syntax(literal=r"\S+"): - yield stream + with stream.provide(spec=self.spec), stream.reset_syntax(literal=r"\S+"): + with stream.indent(skip=["comment"]), stream.ignore("indent", "dedent"): + yield stream def parse_function( self, diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 959beecaf..550a417e7 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -69,6 +69,16 @@ class AstNode: end_location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) def __iter__(self) -> Iterator["AstNode"]: + for f in fields(self): + attribute = getattr(self, f.name) + + if isinstance(attribute, AstChildren): + yield from attribute + + if isinstance(attribute, AstNode): + yield attribute + + def walk(self) -> Iterator["AstNode"]: yield self for f in fields(self): @@ -76,10 +86,11 @@ def __iter__(self) -> Iterator["AstNode"]: if isinstance(attribute, AstChildren): for child in attribute: # type: ignore - yield from child + if isinstance(child, AstNode): + yield from child.walk() elif isinstance(attribute, AstNode): - yield from attribute + yield from attribute.walk() def dump(self, prefix: str = "") -> str: """Return a pretty-printed representation of the ast.""" @@ -341,7 +352,7 @@ class AstTime(AstNode): """Ast time node.""" value: Union[int, float] = required_field() - suffix: Literal[None, "d", "s", "t"] = None + unit: Literal["day", "second", "tick"] = "tick" @dataclass(frozen=True) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py new file mode 100644 index 000000000..032b07a62 --- /dev/null +++ b/packages/mecha/mecha/dispatch.py @@ -0,0 +1,212 @@ +__all__ = [ + "Visitor", + "Reducer", + "Dispatcher", + "Rule", + "rule", +] + + +from dataclasses import dataclass, fields, replace +from functools import partial +from typing import ( + Any, + Callable, + Dict, + FrozenSet, + Generator, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + Type, + Union, + overload, +) + +from .ast import AstChildren, AstNode + + +@dataclass +class Rule: + """Rule that can be associated to an ast node by the dispatcher.""" + + callback: Callable[..., Any] + match_types: Tuple[Type[AstNode], ...] = () + match_fields: FrozenSet[Tuple[str, Any]] = frozenset() + + next: Optional["Rule"] = None + + def __post_init__(self): + if isinstance(self.callback, Rule): + self.next = self.callback + self.callback = self.next.callback + + def __call__(self, *args: Any, **kwargs: Any) -> Any: + return self.callback(*args, **kwargs) + + +@overload +def rule(func: Callable[..., Any]) -> Rule: + ... + + +@overload +def rule( + *args: Type[AstNode], + **kwargs: Any, +) -> Callable[[Callable[..., Any]], Rule]: + ... + + +def rule(*args: Any, **kwargs: Any) -> Any: + """Decorator for defining rules.""" + match_types = () + match_fields = frozenset(kwargs.items()) + + if args and isinstance(args[0], type) and issubclass(args[0], AstNode): + match_types = args + + def decorator(func: Callable[..., Any]) -> Callable[..., Any]: + return Rule(func, match_types, match_fields) + + if len(args) == 1 and not match_types: + return decorator(args[0]) + + return decorator + + +class Dispatcher: + """Ast node dispatcher.""" + + rules: Dict[Type[Any], Dict[FrozenSet[Tuple[str, Any]], List[Callable[..., Any]]]] + + def __init__(self, rules: Iterable[Callable[..., Any]] = ()): + self.rules = {} + + for name in dir(self): + if isinstance(rule := getattr(self, name), Rule): + callback = partial(rule.callback, self) + + current = rule + while current: + current.callback = callback + current = current.next + + self.add_rule(rule) + + self.extend(rules) + + def add_rule(self, rule: Callable[..., Any]): + """Add rule.""" + # TODO: Add rule priority that increases as rules are added + if not isinstance(rule, Rule): + rule = Rule(rule) + + for match_type in rule.match_types or [AstNode]: + l = self.rules.setdefault(match_type, {}).setdefault(rule.match_fields, []) + l.append(rule.callback) + + if rule.next: + self.add_rule(rule.next) + + def extend( + self, + *args: Union["Dispatcher", Callable[..., Any], Iterable[Callable[..., Any]]], + ): + """Extend the dispatcher.""" + for arg in args: + if isinstance(arg, Dispatcher): + for key, value in arg.rules.items(): + current = self.rules.setdefault(key, {}) + for match_fields, callbacks in value.items(): + current.setdefault(match_fields, []).extend(callbacks) + elif callable(arg): + self.add_rule(arg) + else: + for rule in arg: + self.add_rule(rule) + + def dispatch(self, node: AstNode) -> Iterator[Callable[..., Any]]: + """Dispatch rules.""" + # TODO: Sort rules by priority + dispatched: Set[Callable[..., Any]] = set() + + for node_type in type(node).mro(): + if value := self.rules.get(node_type): + for match_fields, callbacks in value.items(): + if all( + node == value + if name == "self" + else hasattr(node, name) and getattr(node, name) == value + for name, value in match_fields + ): + for callback in callbacks: + if callback not in dispatched: + dispatched.add(callback) + yield callback + + def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + """Invoke rules on the given ast node.""" + for rule in self.dispatch(node): + rule(node, *args, **kwargs) + return node + + +class Visitor(Dispatcher): + """Ast node visitor.""" + + def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + rules = list(self.dispatch(node)) + + # TODO: If no rules use default implementation that joins all child nodes with space + # TODO: If more than one rule, just use the first one with the highest priority + if not rules: + raise ValueError(f"No matching rule for visiting {type(node)} node.") + if len(rules) > 1: + raise ValueError( + f"Matched {len(rules)} conflicting rules for visiting {type(node)} node." + ) + + if isinstance(result := rules[0](node, *args, **kwargs), Generator): + for child in result: + self.invoke(child, *args, **kwargs) + + # TODO: Find why this doesn't work + # child = next(result) + # while True: + # try: + # child = result.send(self.invoke(child, *args, **kwargs)) + # except StopIteration as exc: + # return exc.value + + return result + + +class Reducer(Dispatcher): + """Ast node reducer.""" + + def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + to_replace: Dict[str, Union[AstNode, AstChildren[AstNode]]] = {} + + for f in fields(node): + attribute = getattr(node, f.name) + if isinstance(attribute, AstChildren): + result = AstChildren(self.invoke(child, *args, **kwargs) for child in attribute) # type: ignore + if any(child is not original for child, original in zip(result, attribute)): # type: ignore + to_replace[f.name] = result + elif isinstance(attribute, AstNode): + result = self.invoke(attribute, *args, **kwargs) + if result is not attribute: + to_replace[f.name] = result + + if to_replace: + print("replacing", list(to_replace)) + node = replace(node, **to_replace) + + for rule in self.dispatch(node): + node = rule(node, *args, **kwargs) + + return node diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index fab0eb25d..e58122af8 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -4,6 +4,7 @@ "get_stream_scope", "get_stream_properties", "delegate", + "string_to_number", "QuoteHelper", "parse_root", "parse_command", @@ -31,6 +32,7 @@ "ValueParser", "ValueConstraint", "RangeParser", + "IntegerRangeConstraint", "LengthConstraint", "parse_swizzle", "TimeParser", @@ -57,7 +59,18 @@ import re from dataclasses import dataclass, field from functools import partial -from typing import Any, Dict, Iterator, List, Literal, Optional, Tuple, Type, overload +from typing import ( + Any, + Dict, + Iterator, + List, + Literal, + Optional, + Tuple, + Type, + Union, + overload, +) from uuid import UUID # pyright: reportMissingTypeStubs=false @@ -143,8 +156,8 @@ def get_default_parsers() -> Dict[str, Parser]: hint=r"\{", ), "nbt_path": NbtPathParser(), - "range": RangeParser(type=float), - "integer_range": RangeParser(type=int), + "range": RangeParser(), + "integer_range": IntegerRangeConstraint(delegate("range")), "resource_location_or_tag": ResourceLocationParser(), "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), "uuid": parse_uuid, @@ -412,6 +425,12 @@ def get_stream_properties(stream: TokenStream) -> Dict[str, Any]: return stream.data.get("properties", {}) +def get_stream_command_indentation(stream: TokenStream) -> int: + """Return the indentation level associated with the current command.""" + # TODO: To support nested functions in the future there should be a way to reset this + return stream.data.get("command_indentation", stream.indentation[-1]) + + @overload def delegate(parser: str) -> Parser: ... @@ -435,6 +454,11 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: return spec.parsers[parser](stream) +def string_to_number(string: str) -> Union[int, float]: + """Helper for converting numbers to string and keeping their original type.""" + return float(string) if "." in string else int(string) + + @dataclass class QuoteHelper: """Helper for removing quotes and interpreting escape sequences.""" @@ -481,11 +505,13 @@ def parse_root(stream: TokenStream) -> AstRoot: commands: List[AstCommand] = [] - for _ in stream.peek_until(): - while stream.get("newline", "comment"): - continue - if stream.peek(): - commands.append(delegate("command", stream)) + # TODO: This causes the parser to not error on inline comments in non-multiline mode + with stream.ignore("comment"): + for _ in stream.peek_until(): + while stream.get("newline"): + continue + if stream.peek(): + commands.append(delegate("command", stream)) node = AstRoot(filename=None, commands=AstChildren(commands)) return set_location(node, start, stream.current) @@ -503,31 +529,57 @@ def parse_command(stream: TokenStream) -> AstCommand: location = stream.expect().location end_location = location - while tree and tree.children: - should_break = False + level = get_stream_command_indentation(stream) + is_complete = False + while tree and tree.children: for (name, child), alternative in stream.choose(*tree.children.items()): with alternative, stream.provide(scope=scope + (name,)): - if child.type == "literal": - token = stream.expect(("literal", name)) - end_location = token.end_location + literal = None + argument = None + if child.type == "literal": + literal = stream.expect(("literal", name)) elif child.type == "argument": - node = delegate("command:argument", stream) - arguments.append(node) - end_location = node.end_location + argument = delegate("command:argument", stream) - with stream.intercept("eof"): - if not child.redirect and not child.children: + if not child.redirect and not child.children: + with stream.intercept("eof"): stream.expect("newline", "eof") - should_break = True - elif child.executable and stream.get("newline", "eof"): - should_break = True + is_complete = True + + if literal: + end_location = literal.end_location + elif argument: + arguments.append(argument) + end_location = argument.end_location scope = stream.data["scope"] tree = child - if should_break: + if is_complete: + break + + # TODO: find a way to extract this in a function to be able to use it in MessageParser + if spec.multiline: + with stream.checkpoint() as commit: + if list(stream.collect("newline")): + with stream.intercept("whitespace", "eof"): + whitespace = stream.get("whitespace") + eof = stream.get("eof") + if ( + whitespace + and level < len(whitespace.value.expandtabs()) + and not eof + ): + commit() + elif tree.executable: + commit() + break + elif tree.executable and stream.get("newline"): + break + + if tree.executable and not stream.peek(): break target = spec.tree.get(tree.redirect) @@ -535,7 +587,7 @@ def parse_command(stream: TokenStream) -> AstCommand: if tree.subcommand or recursive: subcommand_scope = tree.redirect if tree.redirect is not None else scope - with stream.provide(scope=subcommand_scope): + with stream.provide(scope=subcommand_scope, command_indentation=level): node = delegate("command", stream) arguments.append(node) end_location = node.end_location @@ -575,6 +627,7 @@ class NumericParser: pattern: str = NUMBER_PATTERN def __call__(self, stream: TokenStream) -> Any: + # TODO: Doesn't work on the beginning of a line in multiline mode? with stream.syntax(**{self.name: self.pattern}): stream.expect(self.name) return self.create_node(stream) @@ -582,9 +635,7 @@ def __call__(self, stream: TokenStream) -> Any: def create_node(self, stream: TokenStream) -> Any: """Create the ast node.""" token = stream.current - node = AstValue[float]( - value=float(token.value) if "." in token.value else int(token.value), - ) + node = AstValue[float](value=string_to_number(token.value)) return set_location(node, token) @@ -611,9 +662,7 @@ def create_node(self, stream: TokenStream) -> Any: if not value: value = "0" - value = float(value) if "." in value else int(value) - - node = AstCoordinate(type=coordinate_type, value=value) + node = AstCoordinate(type=coordinate_type, value=string_to_number(value)) return set_location(node, token) @@ -1010,7 +1059,10 @@ class ResourceLocationParser: """Parser for resource locations.""" def __call__(self, stream: TokenStream) -> AstResourceLocation: - with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): + with stream.syntax( + resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+", + comment=None, + ): token = stream.expect("resource_location") value = token.value location = token.location @@ -1193,7 +1245,6 @@ def __call__(self, stream: TokenStream) -> Any: class RangeParser: """Parser for ranges.""" - type: Type[Any] pattern: str = fr"\.\.{NUMBER_PATTERN}|{NUMBER_PATTERN}\.\.(?:{NUMBER_PATTERN})?|{NUMBER_PATTERN}" def __call__(self, stream: TokenStream) -> AstRange: @@ -1204,16 +1255,28 @@ def __call__(self, stream: TokenStream) -> AstRange: if not separator: maximum = minimum - if issubclass(self.type, int) and ("." in minimum or "." in maximum): - raise token.emit_error(InvalidSyntax("Expected integer range.")) - node = AstRange( - min=self.type(minimum) if minimum else None, - max=self.type(maximum) if maximum else None, + min=string_to_number(minimum) if minimum else None, + max=string_to_number(maximum) if maximum else None, ) return set_location(node, token) +@dataclass +class IntegerRangeConstraint: + """Constraint that disallows decimal ranges.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstRange = self.parser(stream) + + if isinstance(node.min, float) or isinstance(node.max, float): + raise node.emit_error(InvalidSyntax("Expected integer range.")) + + return node + + @dataclass class LengthConstraint: """Constraint that only allows up to a limited number of characters.""" @@ -1246,7 +1309,6 @@ def parse_swizzle(stream: TokenStream) -> AstValue[str]: class TimeParser(NumericParser): """Parser for time.""" - type: Type[float] = float name: str = "time" pattern: str = NUMBER_PATTERN + r"[dst]?" @@ -1255,12 +1317,17 @@ def create_node(self, stream: TokenStream) -> Any: value = token.value if value.endswith(("d", "s", "t")): - suffix = value[-1] + if value[-1] == "d": + unit = "day" + elif value[-1] == "s": + unit = "second" + else: + unit = "tick" value = value[:-1] else: - suffix = None + unit = "tick" - node = AstTime(value=self.type(value), suffix=suffix) # type: ignore + node = AstTime(value=string_to_number(value), unit=unit) return set_location(node, token) diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py new file mode 100644 index 000000000..933d38272 --- /dev/null +++ b/packages/mecha/mecha/serialize.py @@ -0,0 +1,264 @@ +__all__ = [ + "Serializer", +] + + +import json +from typing import Any, Iterable, Iterator, List + +from .ast import ( + AstBlock, + AstBlockState, + AstChildren, + AstCommand, + AstCoordinate, + AstItem, + AstJson, + AstMessage, + AstNbt, + AstNbtPath, + AstNbtPathSubscript, + AstNode, + AstParticle, + AstParticleParameters, + AstRange, + AstResourceLocation, + AstRoot, + AstSelector, + AstSelectorAdvancementMatch, + AstSelectorAdvancementPredicateMatch, + AstSelectorAdvancements, + AstSelectorArgument, + AstSelectorScoreMatch, + AstSelectorScores, + AstTime, + AstValue, + AstVector2, + AstVector3, +) +from .dispatch import Visitor, rule +from .spec import CommandSpec + + +class Serializer(Visitor): + spec: CommandSpec + + def __init__(self, spec: CommandSpec): + super().__init__() + self.spec = spec + + def __call__(self, node: AstNode) -> str: + result: List[str] = [] + self.invoke(node, result) + return "".join(result) + + def collection( + self, + nodes: Iterable[AstNode], + delimitters: str, + result: List[str], + ) -> Iterator[AstNode]: + """Helper for serializing collections.""" + result.append(delimitters[0]) + sep = "" + for node in nodes: + result.append(sep) + sep = ", " + yield node + result.append(delimitters[-1]) + + def key_value(self, node: Any, sep: str, result: List[str]) -> Iterator[AstNode]: + """Helper for serializing key-value pairs.""" + yield node.key + result.append(sep) + yield node.value + + @rule(AstRoot) + def root(self, node: AstRoot, result: List[str], *args: Any): + for command in node.commands: + yield command + result.append("\n") + + @rule(AstCommand) + def command(self, node: AstCommand, result: List[str]): + prototype = self.spec.prototypes[node.identifier] + argument_index = 0 + + sep = "" + for token in prototype.signature: + result.append(sep) + sep = " " + + if isinstance(token, str): + result.append(token) + else: + yield node.arguments[argument_index] + argument_index += 1 + + @rule(AstValue) + def value(self, node: AstValue[Any], result: List[str]): + value = str(node.value) + if isinstance(node.value, bool): + value = value.lower() + result.append(value) + + @rule(AstCoordinate) + def coordinate(self, node: AstCoordinate, result: List[str]): + if node.type == "relative": + result.append("~") + if node.value == 0: + return + elif node.type == "local": + result.append("^") + if node.value == 0: + return + result.append(str(node.value)) + + @rule(AstVector2) + def vector2(self, node: AstVector2, result: List[str]): + yield node.x + result.append(" ") + yield node.y + + @rule(AstVector3) + def vector3(self, node: AstVector3, result: List[str]): + yield node.x + result.append(" ") + yield node.y + result.append(" ") + yield node.z + + @rule(AstJson) + def json(self, node: AstJson, result: List[str]): + result.append(json.dumps(node.evaluate())) + + @rule(AstNbt) + def nbt(self, node: AstNbt, result: List[str]): + result.append(node.evaluate().snbt()) + + @rule(AstResourceLocation) + def resource_location(self, node: AstResourceLocation, result: List[str]): + if node.is_tag: + result.append("#") + if node.namespace: + yield node.namespace + result.append(":") + yield node.path + + @rule(AstBlockState) + def block_state(self, node: AstBlockState, result: List[str]): + yield from self.key_value(node, "=", result) + + @rule(AstBlock) + def block(self, node: AstBlock, result: List[str]): + yield node.identifier + if node.block_states: + yield from self.collection(node.block_states, "[]", result) + if node.data_tags: + yield node.data_tags + + @rule(AstItem) + def item(self, node: AstItem, result: List[str]): + yield node.identifier + if node.data_tags: + yield node.data_tags + + @rule(AstRange) + def range(self, node: AstRange, result: List[str]): + if node.exact: + result.append(str(node.value)) + else: + if node.min: + result.append(str(node.min)) + result.append("..") + if node.max: + result.append(str(node.max)) + + @rule(AstTime) + def time(self, node: AstTime, result: List[str]): + result.append(str(node.value)) + + if node.unit == "day": + result.append("d") + elif node.unit == "second": + result.append("s") + + @rule(AstSelectorScoreMatch) + @rule(AstSelectorAdvancementPredicateMatch) + def selector_argument_key_value(self, node: AstNode, result: List[str]): + yield from self.key_value(node, "=", result) + + @rule(AstSelectorScores) + def selector_scores(self, node: AstSelectorScores, result: List[str]): + yield from self.collection(node.scores, "{}", result) + + @rule(AstSelectorAdvancementMatch) + def selector_advancement_match( + self, + node: AstSelectorAdvancementMatch, + result: List[str], + ): + yield node.key + result.append("=") + if isinstance(node.value, AstChildren): + yield from self.collection(node.value, "{}", result) + else: + yield node.value + + @rule(AstSelectorAdvancements) + def selector_advancements(self, node: AstSelectorAdvancements, result: List[str]): + yield from self.collection(node.advancements, "{}", result) + + @rule(AstSelectorArgument) + def selector_argument(self, node: AstSelectorArgument, result: List[str]): + yield node.key + result.append("=") + if node.inverted: + result.append("!") + yield node.value + + @rule(AstSelector) + def selector(self, node: AstSelector, result: List[str]): + result.append("@") + result.append(node.variable) + if node.arguments: + yield from self.collection(node.arguments, "[]", result) + + @rule(AstMessage) + def message(self, node: AstMessage, result: List[str]): + sep = "" + for word in node.words: + result.append(sep) + sep = " " + yield word + + @rule(AstNbtPathSubscript) + def nbt_path_subscript(self, node: AstNbtPathSubscript, result: List[str]): + result.append("[") + if node.index: + yield node.index + result.append("]") + + @rule(AstNbtPath) + def nbt_path(self, node: AstNbtPath, result: List[str]): + sep = "" + for component in node.components: + if isinstance(component, AstValue): + result.append(sep) + sep = "." + yield component + + @rule(AstParticleParameters) + def particle_parameters(self, node: AstParticleParameters, result: List[str]): + sep = "" + for param in node: + result.append(sep) + sep = " " + yield param + + @rule(AstParticle) + def particle(self, node: AstParticle, result: List[str]): + yield node.name + if node.parameters: + result.append(" ") + yield node.parameters diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 66ed8a22c..95d05ab89 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -26,6 +26,8 @@ def __call__(self, stream: TokenStream) -> Any: class CommandSpec: """Class responsible for managing the command specification.""" + multiline: bool = False + tree: CommandTree = extra_field( default_factory=lambda: CommandTree.load_from(version="1_17") ) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index a7ef1f919..1f41b7877 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -709,7 +709,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.0.4" +version = "1.0.5" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -826,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b0fcea0b8451727f2fb4c81ba96ac5f199f68b593ad1f388abddc4ce94d80625" +content-hash = "47a8e2b6b6ad8bebaffda3722b90c31c42d70ae1e6f6a1fe9dd20887ceffa37f" [metadata.files] atomicwrites = [ @@ -1267,8 +1267,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.0.4-py3-none-any.whl", hash = "sha256:fa8b4ad629c3c090396e43c3f644ad3385db91f9f83887628c22c11e319562b3"}, - {file = "tokenstream-1.0.4.tar.gz", hash = "sha256:def3850e3972598d0999d0099573163ae4b746fddd805880dcc020d01844ac9a"}, + {file = "tokenstream-1.0.5-py3-none-any.whl", hash = "sha256:2e10bc0e9241ed98e3fd27ec51e39f57d6295212210557437c6bd8e1a1fae60c"}, + {file = "tokenstream-1.0.5.tar.gz", hash = "sha256:fd3d456af5debcdf0211ed19b6b058193574f7b294215f9015f876ef8ddb271a"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 44502b9ec..e56070b83 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.41.1" -tokenstream = ">=1.0.4" +tokenstream = ">=1.0.5" [tool.poetry.dev-dependencies] black = "^21.7b0" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt index a3820e9c6..762433301 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt @@ -23,4 +23,4 @@ minecraft:entity 0 8 location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=18, lineno=1, colno=19) min: None - max: 1.0 \ No newline at end of file + max: 1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt index d65fbcd11..bcfa20fa7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt @@ -23,7 +23,7 @@ minecraft:entity 0 9 location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=19, lineno=1, colno=20) min: None - max: -1.0 + max: -1 location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=37, lineno=1, colno=38) @@ -37,5 +37,5 @@ minecraft:entity 0 9 location: SourceLocation(pos=33, lineno=1, colno=34) end_location: SourceLocation(pos=37, lineno=1, colno=38) - min: 1.0 - max: 0.0 \ No newline at end of file + min: 1 + max: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt index e7e4813be..c5fb5a19b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt @@ -7,5 +7,5 @@ minecraft:float_range 0 0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) - min: 0.0 + min: 0 max: 5.2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt index f38f98a8b..05b2c0a1d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt @@ -7,5 +7,5 @@ minecraft:float_range 0 1 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - min: 0.0 - max: 0.0 \ No newline at end of file + min: 0 + max: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt index 80cda5990..59844df34 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt @@ -8,4 +8,4 @@ minecraft:float_range 0 4 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) min: None - max: 100.0 \ No newline at end of file + max: 100 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt index a469ba840..ed6b7405c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt @@ -7,5 +7,5 @@ minecraft:time 0 0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 0.0 - suffix: 'd' \ No newline at end of file + value: 0 + unit: 'day' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt index 403eac258..1a112ce66 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt @@ -7,5 +7,5 @@ minecraft:time 0 1 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 0.0 - suffix: 's' \ No newline at end of file + value: 0 + unit: 'second' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt index b50b1e453..057928236 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt @@ -7,5 +7,5 @@ minecraft:time 0 2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 0.0 - suffix: 't' \ No newline at end of file + value: 0 + unit: 'tick' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt index 4f2ea80c8..39d6cea39 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt @@ -7,5 +7,5 @@ minecraft:time 0 3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0.0 - suffix: None \ No newline at end of file + value: 0 + unit: 'tick' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__basic1__0.txt b/packages/mecha/tests/snapshots/parse__basic1__0.txt deleted file mode 100644 index a5a8d4764..000000000 --- a/packages/mecha/tests/snapshots/parse__basic1__0.txt +++ /dev/null @@ -1,9 +0,0 @@ - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - identifier: 'gamerule:fallDamage:value' - arguments: - - location: SourceLocation(pos=20, lineno=1, colno=21) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__basic2__0.txt b/packages/mecha/tests/snapshots/parse__basic2__0.txt deleted file mode 100644 index 0af01f743..000000000 --- a/packages/mecha/tests/snapshots/parse__basic2__0.txt +++ /dev/null @@ -1,23 +0,0 @@ - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=56, lineno=3, colno=1) - filename: None - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - identifier: 'gamerule:doMobLoot:value' - arguments: - - location: SourceLocation(pos=19, lineno=1, colno=20) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: False - - location: SourceLocation(pos=25, lineno=2, colno=1) - end_location: SourceLocation(pos=55, lineno=2, colno=31) - identifier: 'gamerule:doDaylightCycle:value' - arguments: - - location: SourceLocation(pos=50, lineno=2, colno=26) - end_location: SourceLocation(pos=55, lineno=2, colno=31) - value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 07fd04755..343e39ecf 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -251,7 +251,7 @@ location: SourceLocation(pos=385, lineno=13, colno=42) end_location: SourceLocation(pos=389, lineno=13, colno=46) min: None - max: 10.0 + max: 10 location: SourceLocation(pos=390, lineno=13, colno=47) end_location: SourceLocation(pos=397, lineno=13, colno=54) @@ -1455,12 +1455,6 @@ end_location: SourceLocation(pos=1599, lineno=40, colno=51) identifier: 'tp:targets:location' arguments: - - location: SourceLocation(pos=1590, lineno=40, colno=42) - end_location: SourceLocation(pos=1592, lineno=40, colno=44) - variable: 's' - arguments: - location: SourceLocation(pos=1590, lineno=40, colno=42) end_location: SourceLocation(pos=1592, lineno=40, colno=44) @@ -1551,12 +1545,6 @@ end_location: SourceLocation(pos=1654, lineno=41, colno=55) identifier: 'tp:targets:location:rotation' arguments: - - location: SourceLocation(pos=1641, lineno=41, colno=42) - end_location: SourceLocation(pos=1643, lineno=41, colno=44) - variable: 's' - arguments: - location: SourceLocation(pos=1641, lineno=41, colno=42) end_location: SourceLocation(pos=1643, lineno=41, colno=44) @@ -1670,12 +1658,6 @@ end_location: SourceLocation(pos=1727, lineno=42, colno=73) identifier: 'tp:targets:location' arguments: - - location: SourceLocation(pos=1718, lineno=42, colno=64) - end_location: SourceLocation(pos=1720, lineno=42, colno=66) - variable: 's' - arguments: - location: SourceLocation(pos=1718, lineno=42, colno=64) end_location: SourceLocation(pos=1720, lineno=42, colno=66) @@ -2019,12 +2001,6 @@ end_location: SourceLocation(pos=2026, lineno=48, colno=63) identifier: 'tp:targets:location' arguments: - - location: SourceLocation(pos=2017, lineno=48, colno=54) - end_location: SourceLocation(pos=2019, lineno=48, colno=56) - variable: 's' - arguments: - location: SourceLocation(pos=2017, lineno=48, colno=54) end_location: SourceLocation(pos=2019, lineno=48, colno=56) @@ -2119,12 +2095,6 @@ end_location: SourceLocation(pos=2100, lineno=49, colno=74) identifier: 'tp:targets:location' arguments: - - location: SourceLocation(pos=2091, lineno=49, colno=65) - end_location: SourceLocation(pos=2093, lineno=49, colno=67) - variable: 's' - arguments: - location: SourceLocation(pos=2091, lineno=49, colno=65) end_location: SourceLocation(pos=2093, lineno=49, colno=67) @@ -2363,12 +2333,6 @@ end_location: SourceLocation(pos=2302, lineno=52, colno=118) identifier: 'tp:targets:location' arguments: - - location: SourceLocation(pos=2293, lineno=52, colno=109) - end_location: SourceLocation(pos=2295, lineno=52, colno=111) - variable: 's' - arguments: - location: SourceLocation(pos=2293, lineno=52, colno=109) end_location: SourceLocation(pos=2295, lineno=52, colno=111) @@ -2571,7 +2535,7 @@ location: SourceLocation(pos=2453, lineno=54, colno=91) end_location: SourceLocation(pos=2456, lineno=54, colno=94) min: None - max: 5.0 + max: 5 location: SourceLocation(pos=2458, lineno=55, colno=1) end_location: SourceLocation(pos=2528, lineno=55, colno=71) @@ -2799,7 +2763,7 @@ location: SourceLocation(pos=2637, lineno=57, colno=39) end_location: SourceLocation(pos=2640, lineno=57, colno=42) min: None - max: 3.0 + max: 3 location: SourceLocation(pos=2642, lineno=57, colno=44) end_location: SourceLocation(pos=2695, lineno=57, colno=97) @@ -2882,12 +2846,6 @@ end_location: SourceLocation(pos=2743, lineno=58, colno=48) identifier: 'teleport:targets:location:rotation' arguments: - - location: SourceLocation(pos=2729, lineno=58, colno=34) - end_location: SourceLocation(pos=2731, lineno=58, colno=36) - variable: 's' - arguments: - location: SourceLocation(pos=2729, lineno=58, colno=34) end_location: SourceLocation(pos=2731, lineno=58, colno=36) @@ -4173,7 +4131,7 @@ location: SourceLocation(pos=4273, lineno=98, colno=18) end_location: SourceLocation(pos=4277, lineno=98, colno=22) min: None - max: 10.0 + max: 10 location: SourceLocation(pos=4279, lineno=99, colno=1) end_location: SourceLocation(pos=4300, lineno=99, colno=22) @@ -4228,7 +4186,7 @@ location: SourceLocation(pos=4318, lineno=100, colno=18) end_location: SourceLocation(pos=4322, lineno=100, colno=22) min: None - max: 10.0 + max: 10 location: SourceLocation(pos=4323, lineno=100, colno=23) end_location: SourceLocation(pos=4335, lineno=100, colno=35) @@ -5575,8 +5533,8 @@ location: SourceLocation(pos=5665, lineno=136, colno=10) end_location: SourceLocation(pos=5670, lineno=136, colno=15) - value: 1000.0 - suffix: 't' + value: 1000 + unit: 'tick' location: SourceLocation(pos=5671, lineno=137, colno=1) end_location: SourceLocation(pos=5683, lineno=137, colno=13) @@ -5591,8 +5549,8 @@ location: SourceLocation(pos=5693, lineno=138, colno=10) end_location: SourceLocation(pos=5699, lineno=138, colno=16) - value: 24000.0 - suffix: 't' + value: 24000 + unit: 'tick' location: SourceLocation(pos=5708, lineno=140, colno=1) end_location: SourceLocation(pos=5785, lineno=140, colno=78) diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 2409996b3..5c45a6e70 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -1,5 +1,4 @@ import pytest -from beet import Function from beet.core.utils import JsonDict from pytest_insta import SnapshotFixture from tokenstream import InvalidSyntax, TokenStream @@ -7,20 +6,6 @@ from mecha import Mecha, delegate, get_argument_examples, get_command_examples -def test_basic1(snapshot: SnapshotFixture, mc: Mecha): - assert snapshot() == mc.parse_command("gamerule fallDamage false").dump() - - -def test_basic2(snapshot: SnapshotFixture, mc: Mecha): - function = Function( - [ - "gamerule doMobLoot false", - "gamerule doDaylightCycle false", - ] - ) - assert snapshot() == mc.parse_function(function).dump() - - def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): assert snapshot() == mc.parse_function(get_command_examples()).dump() From 2b2b6223464e2a4d96d047429824fe15c461d674 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 11:59:32 +0200 Subject: [PATCH 0302/1554] test: test argument serialization in snapshots --- .../parse__argument_examples_brigadier_bool_0_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_bool_0_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_double_0_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_double_0_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_double_0_2__0.txt | 2 ++ .../parse__argument_examples_brigadier_double_0_3__0.txt | 2 ++ .../parse__argument_examples_brigadier_double_0_4__0.txt | 2 ++ .../parse__argument_examples_brigadier_double_0_5__0.txt | 2 ++ .../parse__argument_examples_brigadier_float_0_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_float_0_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_float_0_2__0.txt | 2 ++ .../parse__argument_examples_brigadier_float_0_3__0.txt | 2 ++ .../parse__argument_examples_brigadier_float_0_4__0.txt | 2 ++ .../parse__argument_examples_brigadier_float_0_5__0.txt | 2 ++ .../parse__argument_examples_brigadier_integer_0_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_integer_0_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_integer_0_2__0.txt | 2 ++ .../parse__argument_examples_brigadier_long_0_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_long_0_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_long_0_2__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_0_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_0_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_1_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_1_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_1_2__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_2_0__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_2_1__0.txt | 2 ++ .../parse__argument_examples_brigadier_string_2_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_angle_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_angle_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_angle_0_2__0.txt | 2 ++ ...arse__argument_examples_minecraft_block_pos_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_block_pos_0_1__0.txt | 2 ++ ...arse__argument_examples_minecraft_block_pos_0_2__0.txt | 2 ++ ...arse__argument_examples_minecraft_block_pos_0_3__0.txt | 2 ++ ...arse__argument_examples_minecraft_block_pos_0_4__0.txt | 2 ++ ...argument_examples_minecraft_block_predicate_0_0__0.txt | 2 ++ ...argument_examples_minecraft_block_predicate_0_1__0.txt | 2 ++ ...argument_examples_minecraft_block_predicate_0_2__0.txt | 2 ++ ...argument_examples_minecraft_block_predicate_0_3__0.txt | 2 ++ ...argument_examples_minecraft_block_predicate_0_4__0.txt | 2 ++ ...se__argument_examples_minecraft_block_state_0_0__0.txt | 2 ++ ...se__argument_examples_minecraft_block_state_0_1__0.txt | 2 ++ ...se__argument_examples_minecraft_block_state_0_2__0.txt | 2 ++ ...se__argument_examples_minecraft_block_state_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_color_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_color_0_1__0.txt | 2 ++ ...rse__argument_examples_minecraft_column_pos_0_0__0.txt | 2 ++ ...rse__argument_examples_minecraft_column_pos_0_1__0.txt | 2 ++ ...rse__argument_examples_minecraft_column_pos_0_2__0.txt | 2 ++ ...arse__argument_examples_minecraft_component_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_component_0_1__0.txt | 2 ++ ...arse__argument_examples_minecraft_component_0_2__0.txt | 2 ++ ...arse__argument_examples_minecraft_component_0_3__0.txt | 2 ++ ...arse__argument_examples_minecraft_dimension_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_dimension_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_10__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_11__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_12__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_13__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_14__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_15__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_16__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_17__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_18__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_4__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_5__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_6__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_7__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_8__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_0_9__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_1_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_1_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_3_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_entity_3_1__0.txt | 2 ++ ...__argument_examples_minecraft_entity_anchor_0_0__0.txt | 2 ++ ...__argument_examples_minecraft_entity_anchor_0_1__0.txt | 2 ++ ...__argument_examples_minecraft_entity_summon_0_0__0.txt | 2 ++ ...__argument_examples_minecraft_entity_summon_0_1__0.txt | 2 ++ ...se__argument_examples_minecraft_float_range_0_0__0.txt | 2 ++ ...se__argument_examples_minecraft_float_range_0_1__0.txt | 2 ++ ...se__argument_examples_minecraft_float_range_0_2__0.txt | 2 ++ ...se__argument_examples_minecraft_float_range_0_3__0.txt | 2 ++ ...se__argument_examples_minecraft_float_range_0_4__0.txt | 2 ++ ...parse__argument_examples_minecraft_function_0_0__0.txt | 2 ++ ...parse__argument_examples_minecraft_function_0_1__0.txt | 2 ++ ...parse__argument_examples_minecraft_function_0_2__0.txt | 2 ++ ...e__argument_examples_minecraft_game_profile_0_0__0.txt | 2 ++ ...e__argument_examples_minecraft_game_profile_0_1__0.txt | 2 ++ ...e__argument_examples_minecraft_game_profile_0_2__0.txt | 2 ++ ...e__argument_examples_minecraft_game_profile_0_3__0.txt | 2 ++ ...e__argument_examples_minecraft_game_profile_0_4__0.txt | 2 ++ ...arse__argument_examples_minecraft_int_range_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_int_range_0_1__0.txt | 2 ++ ...arse__argument_examples_minecraft_int_range_0_2__0.txt | 2 ++ ...arse__argument_examples_minecraft_int_range_0_3__0.txt | 2 ++ ...arse__argument_examples_minecraft_int_range_0_4__0.txt | 2 ++ ...rgument_examples_minecraft_item_enchantment_0_0__0.txt | 2 ++ ...rgument_examples_minecraft_item_enchantment_0_1__0.txt | 2 ++ ..._argument_examples_minecraft_item_predicate_0_0__0.txt | 2 ++ ..._argument_examples_minecraft_item_predicate_0_1__0.txt | 2 ++ ..._argument_examples_minecraft_item_predicate_0_2__0.txt | 2 ++ ..._argument_examples_minecraft_item_predicate_0_3__0.txt | 2 ++ ...arse__argument_examples_minecraft_item_slot_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_item_slot_0_1__0.txt | 2 ++ ...arse__argument_examples_minecraft_item_slot_0_2__0.txt | 2 ++ ...rse__argument_examples_minecraft_item_stack_0_0__0.txt | 2 ++ ...rse__argument_examples_minecraft_item_stack_0_1__0.txt | 2 ++ ...rse__argument_examples_minecraft_item_stack_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_message_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_message_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_message_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_message_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_message_0_4__0.txt | 2 ++ ...rse__argument_examples_minecraft_mob_effect_0_0__0.txt | 2 ++ ...rse__argument_examples_minecraft_mob_effect_0_1__0.txt | 2 ++ ...rgument_examples_minecraft_nbt_compound_tag_0_0__0.txt | 2 ++ ...rgument_examples_minecraft_nbt_compound_tag_0_1__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_10__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_11__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_12__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_13__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_14__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_15__0.txt | 2 ++ ...arse__argument_examples_minecraft_nbt_path_0_16__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_1__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_2__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_3__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_4__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_5__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_6__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_7__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_8__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_path_0_9__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_0__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_tag_0_10__0.txt | 2 ++ ...parse__argument_examples_minecraft_nbt_tag_0_11__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_4__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_5__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_6__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_7__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_8__0.txt | 2 ++ .../parse__argument_examples_minecraft_nbt_tag_0_9__0.txt | 2 ++ ...arse__argument_examples_minecraft_objective_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_objective_0_1__0.txt | 2 ++ ...arse__argument_examples_minecraft_objective_0_2__0.txt | 2 ++ ...ument_examples_minecraft_objective_criteria_0_0__0.txt | 2 ++ ...ument_examples_minecraft_objective_criteria_0_1__0.txt | 2 ++ ...ument_examples_minecraft_objective_criteria_0_2__0.txt | 2 ++ ...arse__argument_examples_minecraft_operation_0_0__0.txt | 2 ++ ...arse__argument_examples_minecraft_operation_0_1__0.txt | 2 ++ ...arse__argument_examples_minecraft_operation_0_2__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_0__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_1__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_2__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_3__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_4__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_5__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_6__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_7__0.txt | 2 ++ ...parse__argument_examples_minecraft_particle_0_8__0.txt | 2 ++ ...gument_examples_minecraft_resource_location_0_0__0.txt | 2 ++ ...gument_examples_minecraft_resource_location_0_1__0.txt | 2 ++ ...gument_examples_minecraft_resource_location_0_2__0.txt | 2 ++ ...parse__argument_examples_minecraft_rotation_0_0__0.txt | 2 ++ ...parse__argument_examples_minecraft_rotation_0_1__0.txt | 2 ++ ...parse__argument_examples_minecraft_rotation_0_2__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_0__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_10__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_11__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_12__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_13__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_14__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_15__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_16__0.txt | 2 ++ ...__argument_examples_minecraft_score_holder_0_17__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_1__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_2__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_3__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_4__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_5__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_6__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_7__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_8__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_0_9__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_1_0__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_1_1__0.txt | 2 ++ ...e__argument_examples_minecraft_score_holder_1_2__0.txt | 2 ++ ...argument_examples_minecraft_scoreboard_slot_0_0__0.txt | 2 ++ ...argument_examples_minecraft_scoreboard_slot_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_swizzle_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_swizzle_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_team_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_team_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_time_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_time_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_time_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_time_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_uuid_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec2_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec2_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec2_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec2_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec3_0_0__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec3_0_1__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec3_0_2__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec3_0_3__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec3_0_4__0.txt | 2 ++ .../parse__argument_examples_minecraft_vec3_0_5__0.txt | 2 ++ packages/mecha/tests/test_parse.py | 8 ++------ 218 files changed, 436 insertions(+), 6 deletions(-) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt index 504001381..cffb86398 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt @@ -4,6 +4,8 @@ brigadier:bool 0 0 --- true --- +true +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt index 7e8171d0f..1808d9759 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt @@ -4,6 +4,8 @@ brigadier:bool 0 1 --- false --- +false +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt index edfbf5238..112b1c9bb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt @@ -4,6 +4,8 @@ brigadier:double 0 0 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt index 3099cc702..104f4e759 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt @@ -4,6 +4,8 @@ brigadier:double 0 1 --- 1.2 --- +1.2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt index 6096fe9ea..80fe1b9a8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt @@ -4,6 +4,8 @@ brigadier:double 0 2 --- .5 --- +0.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt index 89bd9f57c..555a25b36 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt @@ -4,6 +4,8 @@ brigadier:double 0 3 --- -1 --- +-1 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt index 5804cc3c8..53da03049 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt @@ -4,6 +4,8 @@ brigadier:double 0 4 --- -.5 --- +-0.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt index e899c3b83..9856e0edb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt @@ -4,6 +4,8 @@ brigadier:double 0 5 --- -1234.56 --- +-1234.56 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt index b44008b14..7c55c52ef 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt @@ -4,6 +4,8 @@ brigadier:float 0 0 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt index a61a3e798..83742b159 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt @@ -4,6 +4,8 @@ brigadier:float 0 1 --- 1.2 --- +1.2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt index 4a8836138..8f0469d4d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt @@ -4,6 +4,8 @@ brigadier:float 0 2 --- .5 --- +0.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt index 11d27d1a4..200b0ef75 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt @@ -4,6 +4,8 @@ brigadier:float 0 3 --- -1 --- +-1 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt index 6638613fd..d95c8a8a7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt @@ -4,6 +4,8 @@ brigadier:float 0 4 --- -.5 --- +-0.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt index 94470b409..f9565b71e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt @@ -4,6 +4,8 @@ brigadier:float 0 5 --- -1234.56 --- +-1234.56 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt index bfd1a4c85..82d9d6540 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt @@ -4,6 +4,8 @@ brigadier:integer 0 0 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt index 539f3e75f..603067985 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt @@ -4,6 +4,8 @@ brigadier:integer 0 1 --- 123 --- +123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt index 0c9e38a24..312939ab2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt @@ -4,6 +4,8 @@ brigadier:integer 0 2 --- -123 --- +-123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt index 3a9ac2ff7..abb9f86b7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt @@ -4,6 +4,8 @@ brigadier:long 0 0 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt index 4112b623e..b4c10b4f7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt @@ -4,6 +4,8 @@ brigadier:long 0 1 --- 123 --- +123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt index 4aa32385c..9e99cfa35 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt @@ -4,6 +4,8 @@ brigadier:long 0 2 --- -123 --- +-123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt index 41a324887..d1da738d8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt @@ -4,6 +4,8 @@ brigadier:string 0 0 --- word --- +word +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt index d3bdec069..9150999fa 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt @@ -4,6 +4,8 @@ brigadier:string 0 1 --- word_with_underscores --- +word_with_underscores +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=1, colno=22) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt index 705c3b809..4308b50db 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt @@ -4,6 +4,8 @@ brigadier:string 1 0 --- "quoted phrase" --- +quoted phrase +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt index 3fbfda573..3c2c4c443 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt @@ -4,6 +4,8 @@ brigadier:string 1 1 --- word --- +word +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt index 202073b56..d32aa5961 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt @@ -3,6 +3,8 @@ brigadier:string 1 2 {'type': 'phrase'} --- "" +--- + --- location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt index 52e18e79b..09e0f36f0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt @@ -4,6 +4,8 @@ brigadier:string 2 0 --- word --- +word +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt index 9956fb675..e08ca798b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt @@ -4,6 +4,8 @@ brigadier:string 2 1 --- words with spaces --- +words with spaces +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=1, colno=18) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt index 46466ce7c..accbd1521 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt @@ -4,6 +4,8 @@ brigadier:string 2 2 --- "and symbols" --- +and symbols +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt index f760f51fc..0c9d8f6fa 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:angle 0 0 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt index 33c3a88b4..83afed4a8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:angle 0 1 --- ~ --- +~ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt index 66b350738..0a33f436e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:angle 0 2 --- ~-0.5 --- +~-0.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt index 142ace70c..6c4d8a752 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:block_pos 0 0 --- 0 0 0 --- +0 0 0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt index 924bd5af4..34f162637 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:block_pos 0 1 --- ~ ~ ~ --- +~ ~ ~ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt index dd7367a59..663ba7839 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:block_pos 0 2 --- ^ ^ ^ --- +^ ^ ^ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt index 60db5a128..19aa340ef 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:block_pos 0 3 --- ^1 ^ ^-5 --- +^1 ^ ^-5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt index c38dfa4a0..4173d3577 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:block_pos 0 4 --- ~0.5 ~1 ~-5 --- +~0.5 ~1 ~-5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt index 446661dfc..a91494892 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:block_predicate 0 0 --- stone --- +stone +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt index f2299d2f7..1fb748ee4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:block_predicate 0 1 --- minecraft:stone --- +minecraft:stone +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt index bd4568891..6a41f5ed9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:block_predicate 0 2 --- stone[foo=bar] --- +stone[foo=bar] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt index c493ba005..a3fe76219 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:block_predicate 0 3 --- #stone --- +#stone +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt index 56cfe8b0b..969d04305 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:block_predicate 0 4 --- #stone[foo=bar]{baz:nbt} --- +#stone[foo=bar]{baz: "nbt"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=1, colno=25) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt index d04868934..c5ebb2b89 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:block_state 0 0 --- stone --- +stone +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt index b1abbaeb1..70d2f4de3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:block_state 0 1 --- minecraft:stone --- +minecraft:stone +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt index c99c4d1fe..ad305af5d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:block_state 0 2 --- stone[foo=bar] --- +stone[foo=bar] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt index 76d7f4b78..fbfdcc410 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:block_state 0 3 --- foo{bar:baz} --- +foo{bar: "baz"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt index 3b88acc03..2da85bd89 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:color 0 0 --- red --- +red +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt index 596c7d485..f4117a960 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:color 0 1 --- green --- +green +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt index f3a4f96f1..c27d044b3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:column_pos 0 0 --- 0 0 --- +0 0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt index a34d80b38..d1b336f34 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:column_pos 0 1 --- ~ ~ --- +~ ~ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt index e80ac9e17..bdb5801d9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:column_pos 0 2 --- ~1 ~-2 --- +~1 ~-2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt index 974ca0a79..18d743b1d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:component 0 0 --- "hello world" --- +"hello world" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt index e759af5e2..c11190251 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:component 0 1 --- "" --- +"" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt index 0ae0f5100..3aea7815c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:component 0 2 --- {"text":"hello world"} --- +{"text": "hello world"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=1, colno=23) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt index 13c7de5fd..3e493e25c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:component 0 3 --- [""] --- +[""] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt index 7284d3277..92658b218 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:dimension 0 0 --- minecraft:overworld --- +minecraft:overworld +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=1, colno=20) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt index 7bdc7cd68..4234988a9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:dimension 0 1 --- minecraft:the_nether --- +minecraft:the_nether +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt index 8ed773f20..3a98121cd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 0 --- Player --- +Player +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt index c0cfb1f48..a2170828c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 10 --- @a[ gamemode = ! creative , gamemode = ! adventure , ] --- +@a[gamemode=!creative, gamemode=!adventure] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=54, lineno=1, colno=55) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt index 49e982971..a99264bb6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 11 --- @a[ limit = 1 , ] --- +@a[limit=1] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=1, colno=18) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt index fd9a322f8..f5037186d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 12 --- @s[ limit = 0 , limit = 0 , ] --- +@s[limit=0, limit=0] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=29, lineno=1, colno=30) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt index 47fddbb39..0351001e3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 13 --- @a[ level = 1.. , ] --- +@a[level=1..] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=1, colno=20) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt index b2a624cb1..725977a88 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 14 --- @a[ level = -1 , level = -1 , ] --- +@a[level=-1, level=-1] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=1, colno=32) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt index ec250f2e1..f07c2f99d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 15 --- @a[ name = ! "SPGoding" , "name" = ! Misode ,] --- +@a[name=!SPGoding, name=!Misode] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=46, lineno=1, colno=47) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt index 66767fcac..aba1cf56a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 16 --- @a[ name = "SPGoding" , "name" = Misode ,] --- +@a[name=SPGoding, name=Misode] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=42, lineno=1, colno=43) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt index 9e2a7c745..662d339b3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 17 --- @a[ nbt = {} , ] --- +@a[nbt={}] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=16, lineno=1, colno=17) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt index 4b842df56..b0c45ec2b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 18 --- @a[ predicate = spgoding:foo , predicate = ! spgoding:bar , ] --- +@a[predicate=spgoding:foo, predicate=!spgoding:bar] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=61, lineno=1, colno=62) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt index effe52b94..7d31431ae 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 1 --- 0123 --- +0123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt index c48ac9a89..f089f8b80 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 2 --- @e --- +@e +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt index dabb888ed..3e5ece14d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 3 --- @e[type=foo] --- +@e[type=foo] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt index f6cabfa41..5d0f9d7de 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 4 --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- +dd12be42-52a9-4a91-a8a1-11c01849e498 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt index ab22ef4da..49178ef57 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_5__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 5 --- @a[ ] --- +@a +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt index ff8353ec7..6a7c92a65 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 6 --- @a[ advancements = { minecraft:foo = true , minecraft:bar = { qux = true , } , } , ] --- +@a[advancements={minecraft:foo=true, minecraft:bar={qux=true}}] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=84, lineno=1, colno=85) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt index 3cb122938..0783713b2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 7 --- @a[ advancements = { } , advancements = { } , ] --- +@a[advancements={}, advancements={}] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=47, lineno=1, colno=48) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt index 762433301..bf64bc712 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 8 --- @a[ distance = ..1 , ] --- +@a[distance=..1] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=1, colno=23) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt index bcfa20fa7..cd1f2a405 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt @@ -4,6 +4,8 @@ minecraft:entity 0 9 --- @a[ distance = ..-1 , distance = 1..0 , ] --- +@a[distance=..-1, distance=1..] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=41, lineno=1, colno=42) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt index cba28295f..4cb2aca17 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt @@ -4,6 +4,8 @@ minecraft:entity 1 0 --- @e[level=10..] --- +@e[level=10..] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt index 4c0923974..3753c5fd5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt @@ -4,6 +4,8 @@ minecraft:entity 1 1 --- @e[type=player] --- +@e[type=player] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt index 6d9bd77cc..744c5aef4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt @@ -4,6 +4,8 @@ minecraft:entity 3 0 --- @e[limit=1] --- +@e[limit=1] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt index 6d2982899..697541ce3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt @@ -4,6 +4,8 @@ minecraft:entity 3 1 --- @s[type=player] --- +@s[type=player] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt index 2e8d695a3..9e8385b46 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:entity_anchor 0 0 --- eyes --- +eyes +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt index 8d0a919c6..498379b10 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:entity_anchor 0 1 --- feet --- +feet +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt index 135aadd63..b2290636f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:entity_summon 0 0 --- minecraft:pig --- +minecraft:pig +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt index f7b6703b6..c736f27e7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:entity_summon 0 1 --- cow --- +cow +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt index c5fb5a19b..b100cf4cb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:float_range 0 0 --- 0..5.2 --- +..5.2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt index 05b2c0a1d..49f5b0e5e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:float_range 0 1 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt index ae95c5e6d..23e267740 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:float_range 0 2 --- -5.4 --- +-5.4 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt index 69183443f..d351661ca 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:float_range 0 3 --- -100.76.. --- +-100.76.. +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt index 59844df34..0d3032648 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:float_range 0 4 --- ..100 --- +..100 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt index 8ba7b1718..bb753982b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:function 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt index 80901df38..d4d49d387 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:function 0 1 --- foo:bar --- +foo:bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt index 6576bb50a..1ee8bb776 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:function 0 2 --- #foo --- +#foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt index 75af6821f..80f7c6c93 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:game_profile 0 0 --- Player --- +Player +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt index a8bc31474..fb43d78da 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:game_profile 0 1 --- 0123 --- +0123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt index 4665ef53e..5277745f8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:game_profile 0 2 --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- +dd12be42-52a9-4a91-a8a1-11c01849e498 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt index 03625ec6c..8538ddcc3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:game_profile 0 3 --- @p --- +@p +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt index 0a6b119b5..984a4cae0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:game_profile 0 4 --- @e[type=minecraft:player] --- +@e[type=minecraft:player] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=25, lineno=1, colno=26) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt index a874d6e3d..a5b0072ea 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:int_range 0 0 --- 0..5 --- +..5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt index becbc66fe..0db996a79 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:int_range 0 1 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt index 45c66bd13..100789121 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:int_range 0 2 --- -5 --- +-5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt index abd6bddab..5a4e12cc2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:int_range 0 3 --- -100.. --- +-100.. +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt index 967bac195..873a6ae40 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:int_range 0 4 --- ..100 --- +..100 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt index 1c8cc07b9..d1231c567 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:item_enchantment 0 0 --- unbreaking --- +unbreaking +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt index 71dd298b7..34cccdf40 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:item_enchantment 0 1 --- silk_touch --- +silk_touch +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt index 52fd09924..ea052d424 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:item_predicate 0 0 --- stick --- +stick +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt index a5b1046a5..389bffbad 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:item_predicate 0 1 --- minecraft:stick --- +minecraft:stick +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt index 0ca7abb38..678ce818d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:item_predicate 0 2 --- #stick --- +#stick +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt index 584fba9ff..c6de283a4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:item_predicate 0 3 --- #stick{foo:bar} --- +#stick{foo: "bar"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt index d4b019640..c2f80a4ed 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:item_slot 0 0 --- container.5 --- +container.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt index 7185d705a..07afa9f22 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:item_slot 0 1 --- 12 --- +12 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt index 0e05ead2f..2dcd4664f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:item_slot 0 2 --- weapon --- +weapon +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt index 102553cf2..de026fd18 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:item_stack 0 0 --- stick --- +stick +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt index 910c3ca42..e7d12de67 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:item_stack 0 1 --- minecraft:stick --- +minecraft:stick +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt index 85c306c31..2e9b38e83 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:item_stack 0 2 --- stick{foo:bar} --- +stick{foo: "bar"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt index 9d586da54..31063b5a3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:message 0 0 --- Hello world! --- +Hello world! +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt index af6d7bb12..03bf24ebc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:message 0 1 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt index 346e3f0f2..38a552209 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:message 0 2 --- @e --- +@e +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt index c11d5a3fb..cc759b423 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:message 0 3 --- Hello @p :) --- +Hello @p :) +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt index b95b29d05..921be5dc4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:message 0 4 --- foo @a[tag=a, tag=b] --- +foo @a[tag=a, tag=b] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt index addbb23f4..4dc2a6b1c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:mob_effect 0 0 --- spooky --- +spooky +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt index 49fb2bf47..61c0fa442 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:mob_effect 0 1 --- effect --- +effect +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt index 1d23b46f0..485d50397 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_compound_tag 0 0 --- {} --- +{} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt index 78c91be8e..e6ff9ac73 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_compound_tag 0 1 --- {foo:bar} --- +{foo: "bar"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt index f35d00db8..5a66aff8d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt index 9d1d5f6dd..5d9ded2e7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 10 --- foo.bar[0]."A [crazy name]!" --- +foo.bar[0].A [crazy name]! +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=28, lineno=1, colno=29) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt index 1ecf10033..8f3fbcf2e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 11 --- foo.bar[0]."A [crazy name]!".baz --- +foo.bar[0].A [crazy name]!.baz +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=1, colno=33) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt index b0f77df10..52f9e243b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 12 --- foo.bar[] --- +foo.bar[] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt index fbe3ef046..e8b29817d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 13 --- foo.bar[].baz --- +foo.bar[].baz +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt index 3cd5bed89..f0d20a3a0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 14 --- foo.bar[{baz:5b}] --- +foo.bar[{baz: 5b}] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=1, colno=18) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt index 8d893eb62..5c2819474 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 15 --- foo{bar:"baz"} --- +foo{bar: "baz"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt index 5dc421e1a..ed9241fbb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 16 --- foo{bar:"baz"}.bar --- +foo{bar: "baz"}.bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=18, lineno=1, colno=19) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt index 78e7d191f..9bcaf286d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 1 --- foo.bar --- +foo.bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt index 0a2e45fcc..4464deecc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 2 --- foo[0] --- +foo[0] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt index 87644b97b..488602dab 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 3 --- [0] --- +[0] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt index a6a3b2790..317354386 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 4 --- [] --- +[] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt index cf7fde771..c6f9ce94c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 5 --- {foo:bar} --- +{foo: "bar"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt index 594dba396..34b607922 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_6__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 6 --- {} --- +{} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt index 4255630df..3388f9c8f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 7 --- {foo:4.0f} --- +{foo: 4.0f} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt index e9674cac9..641dc69c8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 8 --- foo{}.bar --- +foo{}.bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt index e2569cb87..b9678470c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_path 0 9 --- foo.bar[-1] --- +foo.bar[-1] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt index 8fb0f21b7..f59f55b52 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 0 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt index a97c3c528..b698a42f6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_10__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 10 --- [[], [1], [foo]] --- +[[], [1], ["foo"]] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=16, lineno=1, colno=17) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt index f86be8cf5..32f3918bf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_11__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 11 --- [[],[[[[[[[[[[],[[[[5,1]],[]]]]]]]]]]],[[[[]]]]]] --- +[[], [[[[[[[[[[], [[[[5, 1]], []]]]]]]]]]], [[[[]]]]]] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=49, lineno=1, colno=50) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt index 7ecb8aa8d..55b4453d5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 1 --- 0b --- +0b +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt index c72b516ee..f6041bf43 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 2 --- 0l --- +0L +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt index 275874a42..ac80c5c08 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 3 --- 0.0 --- +0.0d +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt index cd1d5422a..cdb3ab9ca 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 4 --- "foo" --- +"foo" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt index 38642fc42..e221d164a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 5 --- {foo:bar} --- +{foo: "bar"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt index b5d131c6d..046942f68 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_6__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 6 --- [B; 1b] --- +[B; 1B] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt index 927f21eb1..166829ab2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_7__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 7 --- [I;-1] --- +[I; -1] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt index ae9cf2488..03330acae 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_8__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 8 --- [L;1l,2l] --- +[L; 1L, 2L] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt index de055b43c..b558dfa8b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_9__0.txt @@ -4,6 +4,8 @@ minecraft:nbt_tag 0 9 --- [a, b, c] --- +["a", "b", "c"] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt index addd2c0e2..22d4a5210 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:objective 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt index 1c417f063..6b792d1bd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:objective 0 1 --- * --- +* +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt index 06cc8ce29..d276a4ed2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:objective 0 2 --- 012 --- +012 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt index 53c7fb639..327fda6de 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:objective_criteria 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt index 73147dcb5..d08e6b028 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:objective_criteria 0 1 --- foo.bar.baz --- +foo.bar.baz +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt index 0b8d85594..311512220 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:objective_criteria 0 2 --- minecraft:foo --- +minecraft:foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt index ddfcc0d32..8c5e6ccf8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:operation 0 0 --- = --- += +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt index 08882f03d..d474faf50 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:operation 0 1 --- > --- +> +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt index 874b93892..5ef9107d0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:operation 0 2 --- < --- +< +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt index b52cf98d6..f96830002 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt index 309ef9a00..453da76b4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 1 --- foo:bar --- +foo:bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt index fe934c7e7..27ca8582d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 2 --- dust 1.0 0.5 0.5 1.0 --- +dust 1.0 0.5 0.5 1.0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt index 5f92f64f1..ee8958af3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 3 --- minecraft:dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 --- +minecraft:dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=59, lineno=1, colno=60) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt index 0d2e5eb72..5d46ef926 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 4 --- block minecraft:grass_block[snowy=true] --- +block minecraft:grass_block[snowy=true] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=1, colno=40) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt index a088db838..4a1247e28 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 5 --- falling_dust minecraft:grass_block[snowy=true]{hello: world} --- +falling_dust minecraft:grass_block[snowy=true]{hello: "world"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=60, lineno=1, colno=61) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt index 863019c25..4e1cf3000 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 6 --- item minecraft:apple --- +item minecraft:apple +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt index 559f6d9c3..cc0254e59 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 7 --- item minecraft:apple{foo: bar} --- +item minecraft:apple{foo: "bar"} +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=30, lineno=1, colno=31) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt index 9ac1df44e..381dd9258 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt @@ -4,6 +4,8 @@ minecraft:particle 0 8 --- vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 --- +vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=1, colno=40) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt index f65429b4b..50c24ca03 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:resource_location 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt index 27dc52319..322a0b3f9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:resource_location 0 1 --- foo:bar --- +foo:bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt index 791a304d5..131b8dcaf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:resource_location 0 2 --- 012 --- +012 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt index e069927a9..22b3b2ed5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:rotation 0 0 --- 0 0 --- +0 0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt index 1d4d90bf5..736c1f16e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:rotation 0 1 --- ~ ~ --- +~ ~ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt index 3efd7e3e5..4636d58db 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:rotation 0 2 --- ~-5 ~5 --- +~-5 ~5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt index 495a8647f..ab505f9f9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 0 --- Player --- +Player +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt index 650033e9c..3db00b947 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 10 --- @e[ type = ! skeleton , type = ! zombie , ] --- +@e[type=!skeleton, type=!zombie] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=43, lineno=1, colno=44) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt index c16c60c30..b0533c18d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 11 --- @e[ type = skeleton , type = zombie , ] --- +@e[type=skeleton, type=zombie] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=1, colno=40) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt index 967fe20f7..acd187bf2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 12 --- @e[ type = player ] --- +@e[type=player] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=1, colno=20) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt index fd673e3d4..88c65adf7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 13 --- @a[ type = zombie ] --- +@a[type=zombie] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=1, colno=20) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt index fa3f66803..caa2a7449 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 14 --- @a[ x = 0.0 , y = 0.0 , z = 0.0 , dx = 0.0 , dy = 0.0 , dz = 0.0 , ] --- +@a[x=0.0, y=0.0, z=0.0, dx=0.0, dy=0.0, dz=0.0] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=68, lineno=1, colno=69) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt index ab306c4ac..955f60587 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 15 --- @a[ x = 0.0 , x = 0.0 , dz = 0.0, dz = 0.0 , ] --- +@a[x=0.0, x=0.0, dz=0.0, dz=0.0] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=46, lineno=1, colno=47) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt index 8b68ab3b5..c675218f5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 16 --- @a[ x_rotation = 179.9..-179.9 , y_rotation = 179.9..-179.9 , ] --- +@a[x_rotation=179.9..-179.9, y_rotation=179.9..-179.9] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=64, lineno=1, colno=65) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt index 9f76db68a..f100f6949 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 17 --- @a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ] --- +@a[x_rotation=179.9..-179.9, x_rotation=179.9..-179.9] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=64, lineno=1, colno=65) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt index 0853058ce..a7a2c6d93 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 1 --- 0123 --- +0123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt index 00caee89a..8a9f25039 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 2 --- * --- +* +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt index e7a6929dc..4d1fb8388 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 3 --- @e --- +@e +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt index efbaeec28..9602a2c9c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 4 --- @a[ scores = { foo = 1.. , } , ] --- +@a[scores={foo=1..}] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=1, colno=33) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt index 35b69d1a8..9510b1fa2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 5 --- @a[ scores = { } , scores = { } , ] --- +@a[scores={}, scores={}] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=35, lineno=1, colno=36) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt index 80e6f04ff..056f202dd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 6 --- @a[ sort = arbitrary , ] --- +@a[sort=arbitrary] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=1, colno=25) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt index fdc081106..791154c47 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 7 --- @a[ tag = foo , tag = ! bar , ] --- +@a[tag=foo, tag=!bar] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=1, colno=32) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt index 1f6b73bc4..08e65b792 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 8 --- @a[ team = ! foo , team = ! bar , ] --- +@a[team=!foo, team=!bar] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=35, lineno=1, colno=36) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt index a17384271..477f45fa4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 0 9 --- @a[ team = foo , team = bar , ] --- +@a[team=foo, team=bar] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=1, colno=32) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt index dcbb9bffb..d80106d65 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_0__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 1 0 --- @s --- +@s +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt index 9e3455469..1d02cf34b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_1__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 1 1 --- @p --- +@p +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt index d164b8aa0..970a4ae31 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt @@ -4,6 +4,8 @@ minecraft:score_holder 1 2 --- @e[tag=foo, limit=1, sort=nearest] --- +@e[tag=foo, limit=1, sort=nearest] +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=34, lineno=1, colno=35) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt index 812b6098a..c181a4b7b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:scoreboard_slot 0 0 --- sidebar --- +sidebar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt index 202106a62..7bd3f3c4a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:scoreboard_slot 0 1 --- foo.bar --- +foo.bar +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt index 27499cdef..405b1007d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:swizzle 0 0 --- xyz --- +xyz +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt index 3b1ec957b..64b57370e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:swizzle 0 1 --- x --- +x +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt index 9c0d5a2d9..1fa1feb2c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:team 0 0 --- foo --- +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt index 7417f7314..be170f724 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:team 0 1 --- 123 --- +123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt index ed6b7405c..243ea8045 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:time 0 0 --- 0d --- +0d +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt index 1a112ce66..7ac536caf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:time 0 1 --- 0s --- +0s +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt index 057928236..0a79becd9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:time 0 2 --- 0t --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt index 39d6cea39..013a9ac60 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_time_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:time 0 3 --- 0 --- +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt index 59fa39bd6..f036eefbc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:uuid 0 0 --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- +dd12be42-52a9-4a91-a8a1-11c01849e498 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt index 0ef2a5f38..16dca5d08 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:vec2 0 0 --- 0 0 --- +0 0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt index 867d0d89c..d94077fee 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:vec2 0 1 --- ~ ~ --- +~ ~ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt index 5b93c929b..64fc8ec94 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:vec2 0 2 --- 0.1 -0.5 --- +0.1 -0.5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt index 133636499..f5d4543f0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec2_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:vec2 0 3 --- ~1 ~-2 --- +~1 ~-2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt index 0e89575a0..a98675224 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_0__0.txt @@ -4,6 +4,8 @@ minecraft:vec3 0 0 --- 0 0 0 --- +0 0 0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt index a71bf4d92..bb510151f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_1__0.txt @@ -4,6 +4,8 @@ minecraft:vec3 0 1 --- ~ ~ ~ --- +~ ~ ~ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt index 31ec33af1..289510ed5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_2__0.txt @@ -4,6 +4,8 @@ minecraft:vec3 0 2 --- ^ ^ ^ --- +^ ^ ^ +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt index 8dbd5686a..8a3576af7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_3__0.txt @@ -4,6 +4,8 @@ minecraft:vec3 0 3 --- ^1 ^ ^-5 --- +^1 ^ ^-5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt index b44b538bd..a659d4bbc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_4__0.txt @@ -4,6 +4,8 @@ minecraft:vec3 0 4 --- 0.1 -0.5 .9 --- +0.1 -0.5 0.9 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt index cc032119e..75c9a29fb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_vec3_0_5__0.txt @@ -4,6 +4,8 @@ minecraft:vec3 0 5 --- ~0.5 ~1 ~-5 --- +~0.5 ~1 ~-5 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 5c45a6e70..aace0243e 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -52,11 +52,7 @@ def test_argument_examples( ] ) else: + ast = delegate(argument_parser, stream) assert snapshot() == "\n---\n".join( - [ - test_name, - str(properties), - value, - delegate(argument_parser, stream).dump(), - ] + [test_name, str(properties), value, mc.serialize(ast), ast.dump()] ) From cec48b8538b59caa3965744585f5bcf51d8e2abd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 13:41:16 +0200 Subject: [PATCH 0303/1554] fix: separate AstValue into different nodes --- packages/mecha/mecha/ast.py | 127 +- packages/mecha/mecha/dispatch.py | 1 + packages/mecha/mecha/parse.py | 217 ++-- packages/mecha/mecha/serialize.py | 55 +- packages/mecha/mecha/utils.py | 70 ++ ...rgument_examples_brigadier_bool_0_0__0.txt | 2 +- ...rgument_examples_brigadier_bool_0_1__0.txt | 2 +- ...ument_examples_brigadier_double_0_0__0.txt | 2 +- ...ument_examples_brigadier_double_0_1__0.txt | 2 +- ...ument_examples_brigadier_double_0_2__0.txt | 2 +- ...ument_examples_brigadier_double_0_3__0.txt | 2 +- ...ument_examples_brigadier_double_0_4__0.txt | 2 +- ...ument_examples_brigadier_double_0_5__0.txt | 2 +- ...gument_examples_brigadier_float_0_0__0.txt | 2 +- ...gument_examples_brigadier_float_0_1__0.txt | 2 +- ...gument_examples_brigadier_float_0_2__0.txt | 2 +- ...gument_examples_brigadier_float_0_3__0.txt | 2 +- ...gument_examples_brigadier_float_0_4__0.txt | 2 +- ...gument_examples_brigadier_float_0_5__0.txt | 2 +- ...ment_examples_brigadier_integer_0_0__0.txt | 2 +- ...ment_examples_brigadier_integer_0_1__0.txt | 2 +- ...ment_examples_brigadier_integer_0_2__0.txt | 2 +- ...rgument_examples_brigadier_long_0_0__0.txt | 2 +- ...rgument_examples_brigadier_long_0_1__0.txt | 2 +- ...rgument_examples_brigadier_long_0_2__0.txt | 2 +- ...ument_examples_brigadier_string_0_0__0.txt | 2 +- ...ument_examples_brigadier_string_0_1__0.txt | 2 +- ...ument_examples_brigadier_string_1_0__0.txt | 2 +- ...ument_examples_brigadier_string_1_1__0.txt | 2 +- ...ument_examples_brigadier_string_1_2__0.txt | 4 +- ...ument_examples_brigadier_string_2_0__0.txt | 2 +- ...ument_examples_brigadier_string_2_1__0.txt | 2 +- ...ument_examples_brigadier_string_2_2__0.txt | 6 +- ...mples_minecraft_block_predicate_0_0__0.txt | 6 +- ...mples_minecraft_block_predicate_0_1__0.txt | 12 +- ...mples_minecraft_block_predicate_0_2__0.txt | 10 +- ...mples_minecraft_block_predicate_0_3__0.txt | 6 +- ...mples_minecraft_block_predicate_0_4__0.txt | 12 +- ..._examples_minecraft_block_state_0_0__0.txt | 6 +- ..._examples_minecraft_block_state_0_1__0.txt | 12 +- ..._examples_minecraft_block_state_0_2__0.txt | 10 +- ..._examples_minecraft_block_state_0_3__0.txt | 8 +- ...gument_examples_minecraft_color_0_0__0.txt | 2 +- ...gument_examples_minecraft_color_0_1__0.txt | 2 +- ...nt_examples_minecraft_component_0_2__0.txt | 2 +- ...nt_examples_minecraft_dimension_0_0__0.txt | 12 +- ...nt_examples_minecraft_dimension_0_1__0.txt | 12 +- ...ument_examples_minecraft_entity_0_0__0.txt | 2 +- ...ment_examples_minecraft_entity_0_10__0.txt | 8 +- ...ment_examples_minecraft_entity_0_11__0.txt | 4 +- ...ment_examples_minecraft_entity_0_12__0.txt | 8 +- ...ment_examples_minecraft_entity_0_13__0.txt | 2 +- ...ment_examples_minecraft_entity_0_14__0.txt | 4 +- ...ment_examples_minecraft_entity_0_15__0.txt | 8 +- ...ment_examples_minecraft_entity_0_16__0.txt | 8 +- ...ment_examples_minecraft_entity_0_17__0.txt | 2 +- ...ment_examples_minecraft_entity_0_18__0.txt | 28 +- ...ument_examples_minecraft_entity_0_1__0.txt | 2 +- ...ument_examples_minecraft_entity_0_3__0.txt | 8 +- ...ument_examples_minecraft_entity_0_4__0.txt | 2 +- ...ument_examples_minecraft_entity_0_6__0.txt | 32 +- ...ument_examples_minecraft_entity_0_7__0.txt | 4 +- ...ument_examples_minecraft_entity_0_8__0.txt | 2 +- ...ument_examples_minecraft_entity_0_9__0.txt | 4 +- ...ument_examples_minecraft_entity_1_0__0.txt | 2 +- ...ument_examples_minecraft_entity_1_1__0.txt | 8 +- ...ument_examples_minecraft_entity_3_0__0.txt | 4 +- ...ument_examples_minecraft_entity_3_1__0.txt | 8 +- ...xamples_minecraft_entity_anchor_0_0__0.txt | 2 +- ...xamples_minecraft_entity_anchor_0_1__0.txt | 2 +- ...xamples_minecraft_entity_summon_0_0__0.txt | 12 +- ...xamples_minecraft_entity_summon_0_1__0.txt | 6 +- ...ent_examples_minecraft_function_0_0__0.txt | 6 +- ...ent_examples_minecraft_function_0_1__0.txt | 12 +- ...ent_examples_minecraft_function_0_2__0.txt | 6 +- ...examples_minecraft_game_profile_0_0__0.txt | 2 +- ...examples_minecraft_game_profile_0_1__0.txt | 2 +- ...examples_minecraft_game_profile_0_2__0.txt | 2 +- ...examples_minecraft_game_profile_0_4__0.txt | 14 +- ...ples_minecraft_item_enchantment_0_0__0.txt | 2 +- ...ples_minecraft_item_enchantment_0_1__0.txt | 2 +- ...amples_minecraft_item_predicate_0_0__0.txt | 6 +- ...amples_minecraft_item_predicate_0_1__0.txt | 12 +- ...amples_minecraft_item_predicate_0_2__0.txt | 6 +- ...amples_minecraft_item_predicate_0_3__0.txt | 8 +- ...nt_examples_minecraft_item_slot_0_0__0.txt | 2 +- ...nt_examples_minecraft_item_slot_0_1__0.txt | 2 +- ...nt_examples_minecraft_item_slot_0_2__0.txt | 2 +- ...t_examples_minecraft_item_stack_0_0__0.txt | 6 +- ...t_examples_minecraft_item_stack_0_1__0.txt | 12 +- ...t_examples_minecraft_item_stack_0_2__0.txt | 8 +- ...ment_examples_minecraft_message_0_0__0.txt | 10 +- ...ment_examples_minecraft_message_0_1__0.txt | 4 +- ...ment_examples_minecraft_message_0_2__0.txt | 2 +- ...ment_examples_minecraft_message_0_3__0.txt | 14 +- ...ment_examples_minecraft_message_0_4__0.txt | 16 +- ...t_examples_minecraft_mob_effect_0_0__0.txt | 6 +- ...t_examples_minecraft_mob_effect_0_1__0.txt | 6 +- ...ples_minecraft_nbt_compound_tag_0_1__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_0_0__0.txt | 2 +- ...nt_examples_minecraft_nbt_path_0_10__0.txt | 8 +- ...nt_examples_minecraft_nbt_path_0_11__0.txt | 10 +- ...nt_examples_minecraft_nbt_path_0_12__0.txt | 4 +- ...nt_examples_minecraft_nbt_path_0_13__0.txt | 6 +- ...nt_examples_minecraft_nbt_path_0_14__0.txt | 6 +- ...nt_examples_minecraft_nbt_path_0_15__0.txt | 4 +- ...nt_examples_minecraft_nbt_path_0_16__0.txt | 6 +- ...ent_examples_minecraft_nbt_path_0_1__0.txt | 4 +- ...ent_examples_minecraft_nbt_path_0_2__0.txt | 4 +- ...ent_examples_minecraft_nbt_path_0_3__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_0_5__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_0_7__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_0_8__0.txt | 4 +- ...ent_examples_minecraft_nbt_path_0_9__0.txt | 6 +- ...ment_examples_minecraft_nbt_tag_0_5__0.txt | 2 +- ...nt_examples_minecraft_objective_0_0__0.txt | 2 +- ...nt_examples_minecraft_objective_0_1__0.txt | 2 +- ...nt_examples_minecraft_objective_0_2__0.txt | 2 +- ...es_minecraft_objective_criteria_0_0__0.txt | 6 +- ...es_minecraft_objective_criteria_0_1__0.txt | 6 +- ...es_minecraft_objective_criteria_0_2__0.txt | 12 +- ...nt_examples_minecraft_operation_0_0__0.txt | 2 +- ...nt_examples_minecraft_operation_0_1__0.txt | 2 +- ...nt_examples_minecraft_operation_0_2__0.txt | 2 +- ...ent_examples_minecraft_particle_0_0__0.txt | 6 +- ...ent_examples_minecraft_particle_0_1__0.txt | 12 +- ...ent_examples_minecraft_particle_0_2__0.txt | 14 +- ...ent_examples_minecraft_particle_0_3__0.txt | 26 +- ...ent_examples_minecraft_particle_0_4__0.txt | 22 +- ...ent_examples_minecraft_particle_0_5__0.txt | 24 +- ...ent_examples_minecraft_particle_0_6__0.txt | 18 +- ...ent_examples_minecraft_particle_0_7__0.txt | 20 +- ...ent_examples_minecraft_particle_0_8__0.txt | 20 +- ...ent_examples_minecraft_particle_1_2__0.txt | 2 +- ...les_minecraft_resource_location_0_0__0.txt | 6 +- ...les_minecraft_resource_location_0_1__0.txt | 12 +- ...les_minecraft_resource_location_0_2__0.txt | 6 +- ...examples_minecraft_score_holder_0_0__0.txt | 2 +- ...xamples_minecraft_score_holder_0_10__0.txt | 16 +- ...xamples_minecraft_score_holder_0_11__0.txt | 16 +- ...xamples_minecraft_score_holder_0_12__0.txt | 8 +- ...xamples_minecraft_score_holder_0_13__0.txt | 8 +- ...xamples_minecraft_score_holder_0_14__0.txt | 24 +- ...xamples_minecraft_score_holder_0_15__0.txt | 16 +- ...xamples_minecraft_score_holder_0_16__0.txt | 4 +- ...xamples_minecraft_score_holder_0_17__0.txt | 4 +- ...examples_minecraft_score_holder_0_1__0.txt | 2 +- ...examples_minecraft_score_holder_0_2__0.txt | 2 +- ...examples_minecraft_score_holder_0_4__0.txt | 4 +- ...examples_minecraft_score_holder_0_5__0.txt | 4 +- ...examples_minecraft_score_holder_0_6__0.txt | 4 +- ...examples_minecraft_score_holder_0_7__0.txt | 8 +- ...examples_minecraft_score_holder_0_8__0.txt | 8 +- ...examples_minecraft_score_holder_0_9__0.txt | 8 +- ...examples_minecraft_score_holder_1_2__0.txt | 12 +- ...mples_minecraft_scoreboard_slot_0_0__0.txt | 2 +- ...mples_minecraft_scoreboard_slot_0_1__0.txt | 2 +- ...ment_examples_minecraft_swizzle_0_0__0.txt | 2 +- ...ment_examples_minecraft_swizzle_0_1__0.txt | 2 +- ...rgument_examples_minecraft_team_0_0__0.txt | 2 +- ...rgument_examples_minecraft_team_0_1__0.txt | 2 +- ...rgument_examples_minecraft_uuid_0_0__0.txt | 2 +- .../snapshots/parse__command_examples__0.txt | 1032 ++++++----------- 163 files changed, 952 insertions(+), 1528 deletions(-) create mode 100644 packages/mecha/mecha/utils.py diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 550a417e7..e5f346f8e 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -3,18 +3,24 @@ "AstChildren", "AstRoot", "AstCommand", - "AstValue", + "AstLiteral", + "AstString", + "AstBool", + "AstNumber", + "AstUUID", "AstCoordinate", "AstVector2", "AstVector3", "AstJson", "AstJsonValue", "AstJsonArray", + "AstJsonObjectKey", "AstJsonObjectEntry", "AstJsonObject", "AstNbt", "AstNbtValue", "AstNbtList", + "AstNbtCompoundKey", "AstNbtCompoundEntry", "AstNbtCompound", "AstNbtByteArray", @@ -47,7 +53,8 @@ from dataclasses import dataclass, fields -from typing import Any, Generic, Iterator, Literal, Optional, Tuple, TypeVar, Union +from typing import Any, Iterator, Literal, Optional, Tuple, TypeVar, Union +from uuid import UUID from beet.core.utils import extra_field, required_field @@ -132,10 +139,38 @@ class AstCommand(AstNode): @dataclass(frozen=True) -class AstValue(AstNode, Generic[T]): - """Value ast node""" +class AstLiteral(AstNode): + """Ast literal node.""" - value: T = required_field() + value: str = required_field() + + +@dataclass(frozen=True) +class AstString(AstNode): + """Ast string node.""" + + value: str = required_field() + + +@dataclass(frozen=True) +class AstBool(AstNode): + """Ast bool node.""" + + value: bool = required_field() + + +@dataclass(frozen=True) +class AstNumber(AstNode): + """Ast number node.""" + + value: Union[int, float] = required_field() + + +@dataclass(frozen=True) +class AstUUID(AstNode): + """Ast uuid node.""" + + value: UUID = required_field() @dataclass(frozen=True) @@ -192,11 +227,18 @@ def evaluate(self) -> Any: return [element.evaluate() for element in self.elements] +@dataclass(frozen=True) +class AstJsonObjectKey(AstNode): + """Ast json object key node.""" + + value: str = required_field() + + @dataclass(frozen=True) class AstJsonObjectEntry(AstNode): """Ast json object entry node.""" - key: AstValue[str] = required_field() + key: AstJsonObjectKey = required_field() value: AstJson = required_field() @@ -239,11 +281,18 @@ def evaluate(self) -> Any: return ListTag([element.evaluate() for element in self.elements]) # type: ignore +@dataclass(frozen=True) +class AstNbtCompoundKey(AstNode): + """Ast nbt compound key node.""" + + value: str = required_field() + + @dataclass(frozen=True) class AstNbtCompoundEntry(AstNode): """Ast nbt compound entry node.""" - key: AstValue[str] = required_field() + key: AstNbtCompoundKey = required_field() value: AstNbt = required_field() @@ -294,22 +343,22 @@ class AstResourceLocation(AstNode): """Ast resource location node.""" is_tag: bool = False - namespace: Optional[AstValue[str]] = None - path: AstValue[str] = required_field() + namespace: Optional[str] = None + path: str = required_field() def get_canonical_value(self) -> str: """Return the canonical value of the resource location as a string.""" prefix = "#" if self.is_tag else "" - namespace = f"{self.namespace.value}:" if self.namespace else "minecraft:" - return prefix + namespace + self.path.value + namespace = f"{self.namespace}:" if self.namespace else "minecraft:" + return prefix + namespace + self.path @dataclass(frozen=True) class AstBlockState(AstNode): """Ast block state node.""" - key: AstValue[str] = required_field() - value: AstValue[str] = required_field() + key: AstString = required_field() + value: AstString = required_field() @dataclass(frozen=True) @@ -359,7 +408,7 @@ class AstTime(AstNode): class AstSelectorScoreMatch(AstNode): """Ast selector score match node.""" - key: AstValue[str] = required_field() + key: AstLiteral = required_field() value: AstRange = required_field() @@ -374,8 +423,8 @@ class AstSelectorScores(AstNode): class AstSelectorAdvancementPredicateMatch(AstNode): """Ast selector advancement predicate match node.""" - key: AstValue[str] = required_field() - value: AstValue[bool] = required_field() + key: AstLiteral = required_field() + value: AstBool = required_field() @dataclass(frozen=True) @@ -384,7 +433,7 @@ class AstSelectorAdvancementMatch(AstNode): key: AstResourceLocation = required_field() value: Union[ - AstValue[bool], AstChildren[AstSelectorAdvancementPredicateMatch] + AstBool, AstChildren[AstSelectorAdvancementPredicateMatch] ] = required_field() @@ -400,7 +449,7 @@ class AstSelectorArgument(AstNode): """Ast selector argument node.""" inverted: bool = False - key: AstValue[str] = required_field() + key: AstString = required_field() value: AstNode = required_field() @@ -416,14 +465,14 @@ class AstSelector(AstNode): class AstMessage(AstNode): """Ast message node.""" - words: AstChildren[Union[AstValue[str], AstSelector]] = required_field() + fragments: AstChildren[Union[AstLiteral, AstSelector]] = required_field() @dataclass(frozen=True) class AstNbtPathSubscript(AstNode): """Ast nbt path subscript node.""" - index: Union[None, AstValue[int], AstNbtCompound] = None + index: Union[None, AstNumber, AstNbtCompound] = None @dataclass(frozen=True) @@ -431,7 +480,7 @@ class AstNbtPath(AstNode): """Ast nbt path node.""" components: AstChildren[ - Union[AstValue[str], AstNbtCompound, AstNbtPathSubscript] + Union[AstString, AstNbtCompound, AstNbtPathSubscript] ] = required_field() @@ -444,23 +493,23 @@ class AstParticleParameters(AstNode): class AstDustParticleParameters(AstParticleParameters): """Ast dust particle parameters node.""" - red: AstValue[Union[int, float]] = required_field() - green: AstValue[Union[int, float]] = required_field() - blue: AstValue[Union[int, float]] = required_field() - size: AstValue[Union[int, float]] = required_field() + red: AstNumber = required_field() + green: AstNumber = required_field() + blue: AstNumber = required_field() + size: AstNumber = required_field() @dataclass(frozen=True) class AstDustColorTransitionParticleParameters(AstParticleParameters): """Ast dust color transition particle parameters node.""" - red: AstValue[Union[int, float]] = required_field() - green: AstValue[Union[int, float]] = required_field() - blue: AstValue[Union[int, float]] = required_field() - size: AstValue[Union[int, float]] = required_field() - end_red: AstValue[Union[int, float]] = required_field() - end_green: AstValue[Union[int, float]] = required_field() - end_blue: AstValue[Union[int, float]] = required_field() + red: AstNumber = required_field() + green: AstNumber = required_field() + blue: AstNumber = required_field() + size: AstNumber = required_field() + end_red: AstNumber = required_field() + end_green: AstNumber = required_field() + end_blue: AstNumber = required_field() @dataclass(frozen=True) @@ -488,13 +537,13 @@ class AstItemParticleParameters(AstParticleParameters): class AstVibrationParticleParameters(AstParticleParameters): """Ast vibration particle parameters node.""" - x1: AstValue[Union[int, float]] = required_field() - y1: AstValue[Union[int, float]] = required_field() - z1: AstValue[Union[int, float]] = required_field() - x2: AstValue[Union[int, float]] = required_field() - y2: AstValue[Union[int, float]] = required_field() - z2: AstValue[Union[int, float]] = required_field() - duration: AstValue[int] = required_field() + x1: AstNumber = required_field() + y1: AstNumber = required_field() + z1: AstNumber = required_field() + x2: AstNumber = required_field() + y2: AstNumber = required_field() + z2: AstNumber = required_field() + duration: AstNumber = required_field() @dataclass(frozen=True) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 032b07a62..9cd5811b5 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -78,6 +78,7 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]: return decorator +# TODO: Use dataclass? class Dispatcher: """Ast node dispatcher.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e58122af8..02cc10767 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -29,8 +29,8 @@ "ItemParser", "NoBlockStatesConstraint", "NoDataTagsConstraint", - "ValueParser", - "ValueConstraint", + "LiteralParser", + "LiteralConstraint", "RangeParser", "IntegerRangeConstraint", "LengthConstraint", @@ -56,31 +56,20 @@ ] -import re from dataclasses import dataclass, field from functools import partial -from typing import ( - Any, - Dict, - Iterator, - List, - Literal, - Optional, - Tuple, - Type, - Union, - overload, -) +from typing import Any, Dict, Iterator, List, Literal, Optional, Tuple, Type, overload from uuid import UUID # pyright: reportMissingTypeStubs=false from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String -from tokenstream import InvalidSyntax, SourceLocation, Token, TokenStream, set_location +from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location from .ast import ( AstBlock, AstBlockParticleParameters, AstBlockState, + AstBool, AstChildren, AstCommand, AstCoordinate, @@ -93,12 +82,15 @@ AstJsonArray, AstJsonObject, AstJsonObjectEntry, + AstJsonObjectKey, AstJsonValue, + AstLiteral, AstMessage, AstNbt, AstNbtByteArray, AstNbtCompound, AstNbtCompoundEntry, + AstNbtCompoundKey, AstNbtIntArray, AstNbtList, AstNbtLongArray, @@ -106,6 +98,7 @@ AstNbtPathSubscript, AstNbtValue, AstNode, + AstNumber, AstParticle, AstRange, AstResourceLocation, @@ -117,14 +110,16 @@ AstSelectorArgument, AstSelectorScoreMatch, AstSelectorScores, + AstString, AstTime, - AstValue, + AstUUID, AstVector2, AstVector3, AstVibrationParticleParameters, ) -from .error import InvalidEscapeSequence, UnrecognizedParser +from .error import UnrecognizedParser from .spec import CommandSpec, Parser +from .utils import QuoteHelper, string_to_number NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" @@ -138,7 +133,7 @@ def get_default_parsers() -> Dict[str, Parser]: ################################################################################ # Primitives ################################################################################ - "literal": ValueParser(name="literal"), + "literal": LiteralParser(name="literal"), "bool": parse_bool, "numeric": NumericParser(), "integer": IntegerConstraint(delegate("numeric")), @@ -162,15 +157,15 @@ def get_default_parsers() -> Dict[str, Parser]: "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), "uuid": parse_uuid, "objective": LengthConstraint( - parser=ValueParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), + parser=LiteralParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), limit=16, ), "player_name": LengthConstraint( - parser=ValueParser("player_name", r"[a-zA-Z0-9_.+-]+"), + parser=LiteralParser("player_name", r"[a-zA-Z0-9_.+-]+"), limit=16, ), "swizzle": parse_swizzle, - "team": ValueParser("team", r"[a-zA-Z0-9_.+-]+"), + "team": LiteralParser("team", r"[a-zA-Z0-9_.+-]+"), ################################################################################ # Particle ################################################################################ @@ -259,7 +254,7 @@ def get_default_parsers() -> Dict[str, Parser]: "selector:argument:tag": delegate("word"), "selector:argument:team": delegate("word"), "selector:argument:limit": delegate("integer"), - "selector:argument:sort": ValueConstraint( + "selector:argument:sort": LiteralConstraint( parser=delegate("word"), values=[ "nearest", @@ -269,7 +264,7 @@ def get_default_parsers() -> Dict[str, Parser]: ], ), "selector:argument:level": delegate("integer_range"), - "selector:argument:gamemode": ValueConstraint( + "selector:argument:gamemode": LiteralConstraint( parser=delegate("word"), values=[ "adventure", @@ -308,7 +303,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:block_state": BlockParser( resource_location_parser=delegate("resource_location"), ), - "command:argument:minecraft:color": ValueConstraint( + "command:argument:minecraft:color": LiteralConstraint( parser=delegate("word"), values=[ "reset", @@ -343,7 +338,7 @@ def get_default_parsers() -> Dict[str, Parser]: SelectorAmountConstraint(delegate("selector")) ), ), - "command:argument:minecraft:entity_anchor": ValueConstraint( + "command:argument:minecraft:entity_anchor": LiteralConstraint( parser=delegate("word"), values=["eyes", "feet"], ), @@ -369,7 +364,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:nbt_tag": delegate("nbt"), "command:argument:minecraft:objective": delegate("objective"), "command:argument:minecraft:objective_criteria": delegate("resource_location"), - "command:argument:minecraft:operation": ValueConstraint( + "command:argument:minecraft:operation": LiteralConstraint( parser=delegate("literal"), values=[ "+=", @@ -454,46 +449,6 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: return spec.parsers[parser](stream) -def string_to_number(string: str) -> Union[int, float]: - """Helper for converting numbers to string and keeping their original type.""" - return float(string) if "." in string else int(string) - - -@dataclass -class QuoteHelper: - """Helper for removing quotes and interpreting escape sequences.""" - - escape_regex: "re.Pattern[str]" = field(default_factory=lambda: re.compile(r"\\.")) - escape_sequences: Dict[str, str] = field(default_factory=dict) - - def unquote_string(self, token: Token) -> str: - """Remove quotes and substitute escaped characters.""" - if not token.value.startswith(('"', "'")): - return token.value - try: - return self.escape_regex.sub( - lambda match: self.handle_substitution(token, match), - token.value[1:-1], - ) - except InvalidEscapeSequence as exc: - location = token.location.with_horizontal_offset(exc.index + 1) - end_location = location.with_horizontal_offset(len(exc.characters)) - exc = InvalidSyntax(f"Invalid escape sequence {exc.characters!r}.") - raise set_location(exc, location, end_location) - - def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: - """Handle escaped character sequence.""" - characters = match[0] - - if characters == "\\" + token.value[0]: - return token.value[0] - - try: - return self.escape_sequences[characters] - except KeyError: - raise InvalidEscapeSequence(characters, match.pos) from None - - def parse_root(stream: TokenStream) -> AstRoot: """Parse root.""" with stream.syntax(comment=r"#.+$"), stream.intercept("newline"): @@ -611,11 +566,11 @@ def parse_argument(stream: TokenStream) -> AstNode: raise ValueError(f"Missing argument parser in command tree {scope}.") -def parse_bool(stream: TokenStream) -> AstValue[bool]: +def parse_bool(stream: TokenStream) -> AstBool: """Parse bool.""" with stream.syntax(literal=r"\w+"): token = stream.expect_any(("literal", "true"), ("literal", "false")) - node = AstValue[bool](value=token.value == "true") + node = AstBool(value=token.value == "true") return set_location(node, token) @@ -635,7 +590,7 @@ def __call__(self, stream: TokenStream) -> Any: def create_node(self, stream: TokenStream) -> Any: """Create the ast node.""" token = stream.current - node = AstValue[float](value=string_to_number(token.value)) + node = AstNumber(value=string_to_number(token.value)) return set_location(node, token) @@ -673,7 +628,7 @@ class IntegerConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstValue[Any] = self.parser(stream) + node: AstNumber = self.parser(stream) if not isinstance(node.value, int): raise node.emit_error(InvalidSyntax("Expected integer value.")) @@ -689,7 +644,7 @@ class MinMaxConstraint: def __call__(self, stream: TokenStream) -> Any: properties = get_stream_properties(stream) - node: AstValue[float] = self.parser(stream) + node: AstNumber = self.parser(stream) if "min" in properties and node.value < properties["min"]: exc = InvalidSyntax(f"Expected value to be at least {properties['min']}.") @@ -725,13 +680,14 @@ class StringParser: type: Literal["word", "phrase", "greedy"] quote_helper: QuoteHelper = field(default_factory=QuoteHelper) - def __call__(self, stream: TokenStream) -> AstValue[str]: + def __call__(self, stream: TokenStream) -> Any: if self.type == "greedy": with stream.intercept("whitespace"): while stream.get("whitespace"): continue with stream.syntax(line=r".+"): token = stream.expect("line") + node = AstLiteral(value=token.value) else: with stream.syntax( word=r"[0-9A-Za-z_\.\+\-]+", @@ -739,14 +695,14 @@ def __call__(self, stream: TokenStream) -> AstValue[str]: ): if self.type == "word": token = stream.expect("word") + node = AstLiteral(value=token.value) else: token = stream.expect_any("word", "quoted_string") - - node = AstValue[str](value=self.quote_helper.unquote_string(token)) + node = AstString(value=self.quote_helper.unquote_string(token)) return set_location(node, token) -def parse_string_argument(stream: TokenStream) -> AstValue[str]: +def parse_string_argument(stream: TokenStream) -> Any: """Parse string argument.""" properties = get_stream_properties(stream) string_type = properties["type"] @@ -826,7 +782,7 @@ def __call__(self, stream: TokenStream) -> AstJson: entries: List[AstJsonObjectEntry] = [] for key in stream.collect("string"): - key_node = AstValue[str]( + key_node = AstJsonObjectKey( value=self.quote_helper.unquote_string(key), ) key_node = set_location(key_node, key) @@ -927,7 +883,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: entries: List[AstNbtCompoundEntry] = [] for key in stream.collect_any("number", "string", "quoted_string"): - key_node = AstValue[str]( + key_node = AstNbtCompoundKey( value=self.quote_helper.unquote_string(key), ) key_node = set_location(key_node, key) @@ -1073,25 +1029,10 @@ def __call__(self, stream: TokenStream) -> AstResourceLocation: namespace, _, path = value.rpartition(":") - if namespace: - namespace_node = AstValue[str](value=namespace) - namespace_node = set_location( - namespace_node, - location, - location.with_horizontal_offset(len(namespace)), - ) - location = namespace_node.end_location.with_horizontal_offset(1) - else: - namespace_node = None + if not namespace: + namespace = None - path_node = AstValue[str](value=path) - path_node = set_location(path_node, location, token) - - node = AstResourceLocation( - is_tag=is_tag, - namespace=namespace_node, - path=path_node, - ) + node = AstResourceLocation(is_tag=is_tag, namespace=namespace, path=path) return set_location(node, token) @@ -1123,7 +1064,6 @@ def __call__(self, stream: TokenStream) -> AstBlock: with stream.syntax( bracket=r"\[|\]", - state=r"[a-z0-9_]+", equal=r"=", comma=r",", ), stream.checkpoint() as commit: @@ -1134,25 +1074,20 @@ def __call__(self, stream: TokenStream) -> AstBlock: commit() - for key in stream.collect("state"): - key_node = AstValue[str](value=key.value) - key_node = set_location(key_node, key) - + for _ in stream.peek_until(("bracket", "]")): + key_node = delegate("phrase", stream) stream.expect("equal") - - value = stream.expect("state") - value_node = AstValue[str](value=value.value) - value_node = set_location(value_node, value) + value_node = delegate("phrase", stream) entry_node = AstBlockState(key=key_node, value=value_node) entry_node = set_location(entry_node, key_node, value_node) block_states.append(entry_node) if not stream.get("comma"): + stream.expect(("bracket", "]")) break - close_bracket = stream.expect(("bracket", "]")) - end_location = close_bracket.end_location + end_location = stream.current.end_location data_tags = delegate("adjacent_nbt_compound", stream) @@ -1212,28 +1147,28 @@ def __call__(self, stream: TokenStream) -> Any: @dataclass -class ValueParser: - """Parser for simple string values.""" +class LiteralParser: + """Parser for simple literal values.""" name: str pattern: str = r"\S+" - def __call__(self, stream: TokenStream) -> AstValue[str]: + def __call__(self, stream: TokenStream) -> AstLiteral: with stream.syntax(**{self.name: self.pattern}): token = stream.expect(self.name) - node = AstValue[str](value=token.value) + node = AstLiteral(value=token.value) return set_location(node, token) @dataclass -class ValueConstraint: +class LiteralConstraint: """Constraint that only allows a set of predefined values.""" parser: Parser values: List[Any] def __call__(self, stream: TokenStream) -> Any: - node: AstValue[str] = self.parser(stream) + node: AstLiteral = self.parser(stream) if node.value not in self.values: raise node.emit_error(InvalidSyntax(f"Unexpected value {node.value!r}.")) @@ -1285,7 +1220,7 @@ class LengthConstraint: limit: int def __call__(self, stream: TokenStream) -> Any: - node: AstValue[str] = self.parser(stream) + node: AstLiteral = self.parser(stream) if len(node.value) > self.limit: exc = InvalidSyntax(f"Expected up to {self.limit} characters.") @@ -1294,7 +1229,7 @@ def __call__(self, stream: TokenStream) -> Any: return node -def parse_swizzle(stream: TokenStream) -> AstValue[str]: +def parse_swizzle(stream: TokenStream) -> AstLiteral: """Parse swizzle.""" node = delegate("literal", stream) @@ -1331,11 +1266,11 @@ def create_node(self, stream: TokenStream) -> Any: return set_location(node, token) -def parse_uuid(stream: TokenStream) -> AstValue[UUID]: +def parse_uuid(stream: TokenStream) -> AstUUID: """Parse uuid.""" with stream.syntax(uuid="-".join([r"[a-fA-F0-9]+"] * 5)): token = stream.expect("uuid") - node = AstValue[UUID](value=UUID(token.value)) + node = AstUUID(value=UUID(token.value)) return set_location(node, token) @@ -1430,7 +1365,7 @@ def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: scores: List[AstSelectorScoreMatch] = [] for key in stream.collect("objective"): - key_node = AstValue[str](value=key.value) + key_node = AstLiteral(value=key.value) key_node = set_location(key_node, key) stream.expect("equal") @@ -1553,7 +1488,7 @@ def __call__(self, stream: TokenStream) -> Any: for arg in node.arguments: if arg.key.value == "limit": - is_single = arg.value == AstValue[int](value=1) + is_single = arg.value == AstNumber(value=1) if not is_single: exc = InvalidSyntax("Expected entity selector targeting a single entity.") @@ -1613,34 +1548,44 @@ class ScoreHolderParser: def __call__(self, stream: TokenStream) -> Any: with stream.syntax(wildcard=r"\*"): if token := stream.get("wildcard"): - node = AstValue[str](value=token.value) + node = AstLiteral(value=token.value) return set_location(node, token) return self.entity_parser(stream) def parse_message(stream: TokenStream) -> AstMessage: """Parse message.""" + # TODO: Find a way to handle multiline with stream.intercept("whitespace"): while stream.get("whitespace"): continue - with stream.syntax(selector=r"@[praes]", literal=r"\S+"): - words: List[Any] = [] + with stream.syntax(selector=r"@[praes]", literal=r"\S+"): + fragments: List[Any] = [] - for selector, literal in stream.collect("selector", "literal"): - if selector: - stream.index -= 1 - words.append(delegate("selector", stream)) - elif literal: - word_node = AstValue[str](value=literal.value) - word_node = set_location(word_node, literal) - words.append(word_node) - - if not words: + for selector, literal, whitespace in stream.collect( + "selector", + "literal", + "whitespace", + ): + if selector: + stream.index -= 1 + with stream.ignore("whitespace"): + fragments.append(delegate("selector", stream)) + elif literal: + literal_node = AstLiteral(value=literal.value) + literal_node = set_location(literal_node, literal) + fragments.append(literal_node) + elif whitespace: + whitespace_node = AstLiteral(value=whitespace.value) + whitespace_node = set_location(whitespace_node, literal) + fragments.append(whitespace_node) + + if not fragments: raise stream.emit_error(InvalidSyntax("Empty message not allowed.")) - node = AstMessage(words=AstChildren(words)) - return set_location(node, words[0], words[-1]) + node = AstMessage(fragments=AstChildren(fragments)) + return set_location(node, fragments[0], fragments[-1]) @dataclass @@ -1669,12 +1614,12 @@ def __call__(self, stream: TokenStream) -> AstNbtPath: quoted_string, string = stream.expect("quoted_string", "string") if quoted_string: - component_node = AstValue[str]( + component_node = AstString( value=self.quote_helper.unquote_string(quoted_string), ) components.append(set_location(component_node, quoted_string)) elif string: - component_node = AstValue[str](value=string.value) + component_node = AstString(value=string.value) components.append(set_location(component_node, string)) components.extend(self.parse_modifiers(stream)) diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 933d38272..37563e343 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -9,16 +9,19 @@ from .ast import ( AstBlock, AstBlockState, + AstBool, AstChildren, AstCommand, AstCoordinate, AstItem, AstJson, + AstLiteral, AstMessage, AstNbt, AstNbtPath, AstNbtPathSubscript, AstNode, + AstNumber, AstParticle, AstParticleParameters, AstRange, @@ -31,21 +34,33 @@ AstSelectorArgument, AstSelectorScoreMatch, AstSelectorScores, + AstString, AstTime, - AstValue, + AstUUID, AstVector2, AstVector3, ) from .dispatch import Visitor, rule from .spec import CommandSpec +from .utils import QuoteHelper class Serializer(Visitor): spec: CommandSpec + quote_helper: QuoteHelper def __init__(self, spec: CommandSpec): super().__init__() self.spec = spec + self.quote_helper = QuoteHelper( + escape_sequences={ + r"\\": "\\", + r"\f": "\f", + r"\n": "\n", + r"\r": "\r", + r"\t": "\t", + } + ) def __call__(self, node: AstNode) -> str: result: List[str] = [] @@ -95,12 +110,25 @@ def command(self, node: AstCommand, result: List[str]): yield node.arguments[argument_index] argument_index += 1 - @rule(AstValue) - def value(self, node: AstValue[Any], result: List[str]): - value = str(node.value) - if isinstance(node.value, bool): - value = value.lower() - result.append(value) + @rule(AstLiteral) + def literal(self, node: AstLiteral, result: List[str]): + result.append(node.value) + + @rule(AstString) + def string(self, node: AstString, result: List[str]): + result.append(self.quote_helper.quote_string(node.value)) + + @rule(AstBool) + def bool(self, node: AstBool, result: List[str]): + result.append(str(node.value).lower()) + + @rule(AstNumber) + def number(self, node: AstNumber, result: List[str]): + result.append(str(node.value)) + + @rule(AstUUID) + def uuid(self, node: AstUUID, result: List[str]): + result.append(str(node.value)) @rule(AstCoordinate) def coordinate(self, node: AstCoordinate, result: List[str]): @@ -141,9 +169,8 @@ def resource_location(self, node: AstResourceLocation, result: List[str]): if node.is_tag: result.append("#") if node.namespace: - yield node.namespace - result.append(":") - yield node.path + result.append(f"{node.namespace}:") + result.append(node.path) @rule(AstBlockState) def block_state(self, node: AstBlockState, result: List[str]): @@ -226,11 +253,7 @@ def selector(self, node: AstSelector, result: List[str]): @rule(AstMessage) def message(self, node: AstMessage, result: List[str]): - sep = "" - for word in node.words: - result.append(sep) - sep = " " - yield word + yield from node.fragments @rule(AstNbtPathSubscript) def nbt_path_subscript(self, node: AstNbtPathSubscript, result: List[str]): @@ -243,7 +266,7 @@ def nbt_path_subscript(self, node: AstNbtPathSubscript, result: List[str]): def nbt_path(self, node: AstNbtPath, result: List[str]): sep = "" for component in node.components: - if isinstance(component, AstValue): + if isinstance(component, AstString): result.append(sep) sep = "." yield component diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py new file mode 100644 index 000000000..f039bde46 --- /dev/null +++ b/packages/mecha/mecha/utils.py @@ -0,0 +1,70 @@ +__all__ = [ + "QuoteHelper", + "string_to_number", +] + + +import re +from dataclasses import dataclass, field +from typing import Dict, Union + +from tokenstream import InvalidSyntax, Token, set_location + +from .error import InvalidEscapeSequence + +ESCAPE_REGEX = re.compile(r"\\.") +AVOID_QUOTES_REGEX = re.compile(r"[0-9A-Za-z_\.\+\-]+") + + +def string_to_number(string: str) -> Union[int, float]: + """Helper for converting numbers to string and keeping their original type.""" + return float(string) if "." in string else int(string) + + +@dataclass +class QuoteHelper: + """Helper for removing quotes and interpreting escape sequences.""" + + escape_regex: "re.Pattern[str]" = ESCAPE_REGEX + avoid_quotes_regex: "re.Pattern[str]" = AVOID_QUOTES_REGEX + + escape_sequences: Dict[str, str] = field(default_factory=dict) + escape_characters: Dict[str, str] = field(init=False) + + def __post_init__(self): + self.escape_characters = {v: k for k, v in self.escape_sequences.items()} + + def unquote_string(self, token: Token) -> str: + """Remove quotes and substitute escaped characters.""" + if not token.value.startswith(('"', "'")): + return token.value + try: + return self.escape_regex.sub( + lambda match: self.handle_substitution(token, match), + token.value[1:-1], + ) + except InvalidEscapeSequence as exc: + location = token.location.with_horizontal_offset(exc.index + 1) + end_location = location.with_horizontal_offset(len(exc.characters)) + exc = InvalidSyntax(f"Invalid escape sequence {exc.characters!r}.") + raise set_location(exc, location, end_location) + + def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: + """Handle escaped character sequence.""" + characters = match[0] + + if characters == "\\" + token.value[0]: + return token.value[0] + + try: + return self.escape_sequences[characters] + except KeyError: + raise InvalidEscapeSequence(characters, match.pos) from None + + def quote_string(self, value: str, quote: str = '"') -> str: + """Wrap the string in quotes if it can't be represented unquoted.""" + if self.avoid_quotes_regex.match(value): + return value + for match, seq in self.escape_characters.items(): + value = value.replace(match, seq) + return quote + value.replace(quote, "\\" + quote) + quote diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt index cffb86398..e59f0e143 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_0__0.txt @@ -6,7 +6,7 @@ true --- true --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: True \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt index 1808d9759..fcaded428 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_0_1__0.txt @@ -6,7 +6,7 @@ false --- false --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt index 112b1c9bb..0614e6e4d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_0__0.txt @@ -6,7 +6,7 @@ brigadier:double 0 0 --- 0 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt index 104f4e759..1abe87e57 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_1__0.txt @@ -6,7 +6,7 @@ brigadier:double 0 1 --- 1.2 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 1.2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt index 80fe1b9a8..ea260991d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_2__0.txt @@ -6,7 +6,7 @@ brigadier:double 0 2 --- 0.5 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: 0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt index 555a25b36..6dee34219 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_3__0.txt @@ -6,7 +6,7 @@ brigadier:double 0 3 --- -1 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt index 53da03049..218521922 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_4__0.txt @@ -6,7 +6,7 @@ brigadier:double 0 4 --- -0.5 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: -0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt index 9856e0edb..dca682323 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_0_5__0.txt @@ -6,7 +6,7 @@ brigadier:double 0 5 --- -1234.56 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: -1234.56 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt index 7c55c52ef..897eb62fb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_0__0.txt @@ -6,7 +6,7 @@ brigadier:float 0 0 --- 0 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt index 83742b159..bb6c37c23 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_1__0.txt @@ -6,7 +6,7 @@ brigadier:float 0 1 --- 1.2 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 1.2 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt index 8f0469d4d..28607b86f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_2__0.txt @@ -6,7 +6,7 @@ brigadier:float 0 2 --- 0.5 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: 0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt index 200b0ef75..d1189cd7d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_3__0.txt @@ -6,7 +6,7 @@ brigadier:float 0 3 --- -1 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt index d95c8a8a7..f3718caf8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_4__0.txt @@ -6,7 +6,7 @@ brigadier:float 0 4 --- -0.5 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: -0.5 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt index f9565b71e..af5a5b7af 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_0_5__0.txt @@ -6,7 +6,7 @@ brigadier:float 0 5 --- -1234.56 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: -1234.56 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt index 82d9d6540..f86f9e775 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_0__0.txt @@ -6,7 +6,7 @@ brigadier:integer 0 0 --- 0 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt index 603067985..6b9a8ef59 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_1__0.txt @@ -6,7 +6,7 @@ brigadier:integer 0 1 --- 123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt index 312939ab2..63c599ce3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_0_2__0.txt @@ -6,7 +6,7 @@ brigadier:integer 0 2 --- -123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: -123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt index abb9f86b7..362ddcf99 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_0__0.txt @@ -6,7 +6,7 @@ brigadier:long 0 0 --- 0 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt index b4c10b4f7..59ec0cdca 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_1__0.txt @@ -6,7 +6,7 @@ brigadier:long 0 1 --- 123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt index 9e99cfa35..e8dd26651 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_0_2__0.txt @@ -6,7 +6,7 @@ brigadier:long 0 2 --- -123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: -123 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt index d1da738d8..c84e5039e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt @@ -6,7 +6,7 @@ word --- word --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt index 9150999fa..4aa78b7ad 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt @@ -6,7 +6,7 @@ word_with_underscores --- word_with_underscores --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'word_with_underscores' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt index 4308b50db..c992b9b1d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt @@ -6,7 +6,7 @@ brigadier:string 1 0 --- quoted phrase --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'quoted phrase' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt index 3c2c4c443..6a041d053 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_1__0.txt @@ -6,7 +6,7 @@ word --- word --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt index d32aa5961..8742a96fe 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_2__0.txt @@ -4,9 +4,9 @@ brigadier:string 1 2 --- "" --- - +"" --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: '' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt index 09e0f36f0..0d1f3682e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt @@ -6,7 +6,7 @@ word --- word --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt index e08ca798b..6d5c0f784 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt @@ -6,7 +6,7 @@ words with spaces --- words with spaces --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=1, colno=18) value: 'words with spaces' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt index accbd1521..843d2316d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt @@ -4,9 +4,9 @@ brigadier:string 2 2 --- "and symbols" --- -and symbols +"and symbols" --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'and symbols' \ No newline at end of file + value: '"and symbols"' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt index a91494892..c8b8bea95 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_0__0.txt @@ -15,11 +15,7 @@ stone end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stone' + path: 'stone' block_states: data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt index 1fb748ee4..1069854a8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_1__0.txt @@ -14,16 +14,8 @@ minecraft:stone location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'stone' + namespace: 'minecraft' + path: 'stone' block_states: data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt index 6a41f5ed9..1085b4d2c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_2__0.txt @@ -15,22 +15,18 @@ stone[foo=bar] end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stone' + path: 'stone' block_states: location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) key: - + location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'foo' value: - + location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'bar' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt index a3fe76219..6ccb98124 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_3__0.txt @@ -15,11 +15,7 @@ minecraft:block_predicate 0 3 end_location: SourceLocation(pos=6, lineno=1, colno=7) is_tag: True namespace: None - path: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'stone' + path: 'stone' block_states: data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt index 969d04305..d04a3089a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_0_4__0.txt @@ -15,22 +15,18 @@ minecraft:block_predicate 0 4 end_location: SourceLocation(pos=6, lineno=1, colno=7) is_tag: True namespace: None - path: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'stone' + path: 'stone' block_states: location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=14, lineno=1, colno=15) key: - + location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'foo' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'bar' @@ -43,7 +39,7 @@ minecraft:block_predicate 0 4 location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=23, lineno=1, colno=24) key: - + location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=19, lineno=1, colno=20) value: 'baz' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt index c5ebb2b89..6694b3b63 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_0__0.txt @@ -15,11 +15,7 @@ stone end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stone' + path: 'stone' block_states: data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt index 70d2f4de3..fd400cf80 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_1__0.txt @@ -14,16 +14,8 @@ minecraft:stone location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'stone' + namespace: 'minecraft' + path: 'stone' block_states: data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt index ad305af5d..c86382cbd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_2__0.txt @@ -15,22 +15,18 @@ stone[foo=bar] end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stone' + path: 'stone' block_states: location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) key: - + location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'foo' value: - + location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'bar' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt index fbfdcc410..3823dc59b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_0_3__0.txt @@ -15,11 +15,7 @@ foo{bar: "baz"} end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' + path: 'foo' block_states: data_tags: @@ -31,7 +27,7 @@ foo{bar: "baz"} location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=11, lineno=1, colno=12) key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt index 2da85bd89..0fc76e09d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt @@ -6,7 +6,7 @@ red --- red --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'red' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt index f4117a960..448c34452 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt @@ -6,7 +6,7 @@ green --- green --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'green' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt index 3aea7815c..5b7661c0d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_2__0.txt @@ -14,7 +14,7 @@ minecraft:component 0 2 location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=21, lineno=1, colno=22) key: - + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'text' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt index 92658b218..dd084f330 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_0__0.txt @@ -10,13 +10,5 @@ minecraft:overworld location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=1, colno=20) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - value: 'overworld' \ No newline at end of file + namespace: 'minecraft' + path: 'overworld' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt index 4234988a9..299a209fc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_0_1__0.txt @@ -10,13 +10,5 @@ minecraft:the_nether location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'the_nether' \ No newline at end of file + namespace: 'minecraft' + path: 'the_nether' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt index 3a98121cd..626d8756c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt @@ -6,7 +6,7 @@ Player --- Player --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt index a2170828c..816e237a7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt @@ -16,12 +16,12 @@ minecraft:entity 0 10 end_location: SourceLocation(pos=25, lineno=1, colno=26) inverted: True key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'gamemode' value: - + location: SourceLocation(pos=17, lineno=1, colno=18) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'creative' @@ -30,12 +30,12 @@ minecraft:entity 0 10 end_location: SourceLocation(pos=50, lineno=1, colno=51) inverted: True key: - + location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: 'gamemode' value: - + location: SourceLocation(pos=41, lineno=1, colno=42) end_location: SourceLocation(pos=50, lineno=1, colno=51) value: 'adventure' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt index a99264bb6..a415b360e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_11__0.txt @@ -16,12 +16,12 @@ minecraft:entity 0 11 end_location: SourceLocation(pos=13, lineno=1, colno=14) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'limit' value: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt index f5037186d..ad32c8007 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_12__0.txt @@ -16,12 +16,12 @@ minecraft:entity 0 12 end_location: SourceLocation(pos=13, lineno=1, colno=14) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'limit' value: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 0 @@ -30,12 +30,12 @@ minecraft:entity 0 12 end_location: SourceLocation(pos=25, lineno=1, colno=26) inverted: False key: - + location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'limit' value: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt index 0351001e3..7810f88b5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_13__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 13 end_location: SourceLocation(pos=15, lineno=1, colno=16) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'level' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt index 725977a88..632aa3dc7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_14__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 14 end_location: SourceLocation(pos=14, lineno=1, colno=15) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'level' @@ -31,7 +31,7 @@ minecraft:entity 0 14 end_location: SourceLocation(pos=27, lineno=1, colno=28) inverted: False key: - + location: SourceLocation(pos=17, lineno=1, colno=18) end_location: SourceLocation(pos=22, lineno=1, colno=23) value: 'level' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt index f07c2f99d..6ccbae37b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_15__0.txt @@ -16,12 +16,12 @@ minecraft:entity 0 15 end_location: SourceLocation(pos=23, lineno=1, colno=24) inverted: True key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'name' value: - + location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 'SPGoding' @@ -30,12 +30,12 @@ minecraft:entity 0 15 end_location: SourceLocation(pos=43, lineno=1, colno=44) inverted: True key: - + location: SourceLocation(pos=26, lineno=1, colno=27) end_location: SourceLocation(pos=32, lineno=1, colno=33) value: 'name' value: - + location: SourceLocation(pos=37, lineno=1, colno=38) end_location: SourceLocation(pos=43, lineno=1, colno=44) value: 'Misode' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt index aba1cf56a..21fafc06c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_16__0.txt @@ -16,12 +16,12 @@ minecraft:entity 0 16 end_location: SourceLocation(pos=21, lineno=1, colno=22) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'name' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'SPGoding' @@ -30,12 +30,12 @@ minecraft:entity 0 16 end_location: SourceLocation(pos=39, lineno=1, colno=40) inverted: False key: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=30, lineno=1, colno=31) value: 'name' value: - + location: SourceLocation(pos=33, lineno=1, colno=34) end_location: SourceLocation(pos=39, lineno=1, colno=40) value: 'Misode' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt index 662d339b3..98ffae2ed 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_17__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 17 end_location: SourceLocation(pos=12, lineno=1, colno=13) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'nbt' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt index b0c45ec2b..bb0212d7c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_18__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 18 end_location: SourceLocation(pos=28, lineno=1, colno=29) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'predicate' @@ -25,22 +25,14 @@ minecraft:entity 0 18 location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=28, lineno=1, colno=29) is_tag: False - namespace: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: 'spgoding' - path: - - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - value: 'foo' + namespace: 'spgoding' + path: 'foo' location: SourceLocation(pos=31, lineno=1, colno=32) end_location: SourceLocation(pos=57, lineno=1, colno=58) inverted: True key: - + location: SourceLocation(pos=31, lineno=1, colno=32) end_location: SourceLocation(pos=40, lineno=1, colno=41) value: 'predicate' @@ -49,13 +41,5 @@ minecraft:entity 0 18 location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=57, lineno=1, colno=58) is_tag: False - namespace: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=53, lineno=1, colno=54) - value: 'spgoding' - path: - - location: SourceLocation(pos=54, lineno=1, colno=55) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - value: 'bar' \ No newline at end of file + namespace: 'spgoding' + path: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt index 7d31431ae..34d6c2a97 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:entity 0 1 --- 0123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt index 3e5ece14d..4039c5007 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_3__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 3 end_location: SourceLocation(pos=11, lineno=1, colno=12) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'type' @@ -26,8 +26,4 @@ minecraft:entity 0 3 end_location: SourceLocation(pos=11, lineno=1, colno=12) is_tag: False namespace: None - path: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 'foo' \ No newline at end of file + path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt index 5d0f9d7de..689436d85 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_4__0.txt @@ -6,7 +6,7 @@ dd12be42-52a9-4a91-a8a1-11c01849e498 --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: UUID('dd12be42-52a9-4a91-a8a1-11c01849e498') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt index 6a7c92a65..388561f6a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 6 end_location: SourceLocation(pos=80, lineno=1, colno=81) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'advancements' @@ -33,18 +33,10 @@ minecraft:entity 0 6 location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=34, lineno=1, colno=35) is_tag: False - namespace: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=30, lineno=1, colno=31) - value: 'minecraft' - path: - - location: SourceLocation(pos=31, lineno=1, colno=32) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - value: 'foo' + namespace: 'minecraft' + path: 'foo' value: - + location: SourceLocation(pos=37, lineno=1, colno=38) end_location: SourceLocation(pos=41, lineno=1, colno=42) value: True @@ -56,27 +48,19 @@ minecraft:entity 0 6 location: SourceLocation(pos=44, lineno=1, colno=45) end_location: SourceLocation(pos=57, lineno=1, colno=58) is_tag: False - namespace: - - location: SourceLocation(pos=44, lineno=1, colno=45) - end_location: SourceLocation(pos=53, lineno=1, colno=54) - value: 'minecraft' - path: - - location: SourceLocation(pos=54, lineno=1, colno=55) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - value: 'bar' + namespace: 'minecraft' + path: 'bar' value: location: SourceLocation(pos=62, lineno=1, colno=63) end_location: SourceLocation(pos=72, lineno=1, colno=73) key: - + location: SourceLocation(pos=62, lineno=1, colno=63) end_location: SourceLocation(pos=65, lineno=1, colno=66) value: 'qux' value: - + location: SourceLocation(pos=68, lineno=1, colno=69) end_location: SourceLocation(pos=72, lineno=1, colno=73) value: True \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt index 0783713b2..9203eb1dd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_7__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 7 end_location: SourceLocation(pos=22, lineno=1, colno=23) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'advancements' @@ -31,7 +31,7 @@ minecraft:entity 0 7 end_location: SourceLocation(pos=43, lineno=1, colno=44) inverted: False key: - + location: SourceLocation(pos=25, lineno=1, colno=26) end_location: SourceLocation(pos=37, lineno=1, colno=38) value: 'advancements' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt index bf64bc712..ef5117f30 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_8__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 8 end_location: SourceLocation(pos=18, lineno=1, colno=19) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'distance' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt index cd1f2a405..9a764c489 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt @@ -16,7 +16,7 @@ minecraft:entity 0 9 end_location: SourceLocation(pos=19, lineno=1, colno=20) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'distance' @@ -31,7 +31,7 @@ minecraft:entity 0 9 end_location: SourceLocation(pos=37, lineno=1, colno=38) inverted: False key: - + location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=30, lineno=1, colno=31) value: 'distance' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt index 4cb2aca17..f68514a6e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_0__0.txt @@ -16,7 +16,7 @@ minecraft:entity 1 0 end_location: SourceLocation(pos=13, lineno=1, colno=14) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'level' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt index 3753c5fd5..72b19a1fe 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_1_1__0.txt @@ -16,7 +16,7 @@ minecraft:entity 1 1 end_location: SourceLocation(pos=14, lineno=1, colno=15) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'type' @@ -26,8 +26,4 @@ minecraft:entity 1 1 end_location: SourceLocation(pos=14, lineno=1, colno=15) is_tag: False namespace: None - path: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'player' \ No newline at end of file + path: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt index 744c5aef4..e242a7dca 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_0__0.txt @@ -16,12 +16,12 @@ minecraft:entity 3 0 end_location: SourceLocation(pos=10, lineno=1, colno=11) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'limit' value: - + location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt index 697541ce3..607a66cc2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_3_1__0.txt @@ -16,7 +16,7 @@ minecraft:entity 3 1 end_location: SourceLocation(pos=14, lineno=1, colno=15) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'type' @@ -26,8 +26,4 @@ minecraft:entity 3 1 end_location: SourceLocation(pos=14, lineno=1, colno=15) is_tag: False namespace: None - path: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'player' \ No newline at end of file + path: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt index 9e8385b46..55b5be45a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt @@ -6,7 +6,7 @@ eyes --- eyes --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'eyes' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt index 498379b10..794eba481 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt @@ -6,7 +6,7 @@ feet --- feet --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'feet' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt index b2290636f..3eff3fba5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_0__0.txt @@ -10,13 +10,5 @@ minecraft:pig location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'pig' \ No newline at end of file + namespace: 'minecraft' + path: 'pig' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt index c736f27e7..161fb1896 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_0_1__0.txt @@ -11,8 +11,4 @@ cow end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'cow' \ No newline at end of file + path: 'cow' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt index bb753982b..e364ad122 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_0__0.txt @@ -11,8 +11,4 @@ foo end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt index d4d49d387..eef434e7f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_1__0.txt @@ -10,13 +10,5 @@ foo:bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - path: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'bar' \ No newline at end of file + namespace: 'foo' + path: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt index 1ee8bb776..22e779c93 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_function_0_2__0.txt @@ -11,8 +11,4 @@ minecraft:function 0 2 end_location: SourceLocation(pos=4, lineno=1, colno=5) is_tag: True namespace: None - path: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'foo' \ No newline at end of file + path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt index 80f7c6c93..ead477181 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt @@ -6,7 +6,7 @@ Player --- Player --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt index fb43d78da..e19aab19c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:game_profile 0 1 --- 0123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt index 5277745f8..9d4d647bd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_2__0.txt @@ -6,7 +6,7 @@ dd12be42-52a9-4a91-a8a1-11c01849e498 --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: UUID('dd12be42-52a9-4a91-a8a1-11c01849e498') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt index 984a4cae0..edfefd82b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_4__0.txt @@ -16,7 +16,7 @@ minecraft:game_profile 0 4 end_location: SourceLocation(pos=24, lineno=1, colno=25) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'type' @@ -25,13 +25,5 @@ minecraft:game_profile 0 4 location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=24, lineno=1, colno=25) is_tag: False - namespace: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - value: 'minecraft' - path: - - location: SourceLocation(pos=18, lineno=1, colno=19) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: 'player' \ No newline at end of file + namespace: 'minecraft' + path: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt index d1231c567..dc2c06dec 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt @@ -6,7 +6,7 @@ unbreaking --- unbreaking --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'unbreaking' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt index 34cccdf40..b9ec9efe3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt @@ -6,7 +6,7 @@ silk_touch --- silk_touch --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'silk_touch' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt index ea052d424..ed50ebcb6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_0__0.txt @@ -15,9 +15,5 @@ stick end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stick' + path: 'stick' data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt index 389bffbad..21eef7445 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_1__0.txt @@ -14,14 +14,6 @@ minecraft:stick location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'stick' + namespace: 'minecraft' + path: 'stick' data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt index 678ce818d..c6155bd12 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_2__0.txt @@ -15,9 +15,5 @@ minecraft:item_predicate 0 2 end_location: SourceLocation(pos=6, lineno=1, colno=7) is_tag: True namespace: None - path: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'stick' + path: 'stick' data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt index c6de283a4..1ae2931cf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_predicate_0_3__0.txt @@ -15,11 +15,7 @@ minecraft:item_predicate 0 3 end_location: SourceLocation(pos=6, lineno=1, colno=7) is_tag: True namespace: None - path: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'stick' + path: 'stick' data_tags: location: SourceLocation(pos=6, lineno=1, colno=7) @@ -29,7 +25,7 @@ minecraft:item_predicate 0 3 location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=14, lineno=1, colno=15) key: - + location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt index c2f80a4ed..7bb7bf8dc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt @@ -6,7 +6,7 @@ container.5 --- container.5 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 'container.5' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt index 07afa9f22..02c9d78c1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:item_slot 0 1 --- 12 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: '12' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt index 2dcd4664f..859534796 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt @@ -6,7 +6,7 @@ weapon --- weapon --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'weapon' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt index de026fd18..2a070a40f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_0__0.txt @@ -15,9 +15,5 @@ stick end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stick' + path: 'stick' data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt index e7d12de67..81f809764 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_1__0.txt @@ -14,14 +14,6 @@ minecraft:stick location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'stick' + namespace: 'minecraft' + path: 'stick' data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt index 2e9b38e83..abf6ca088 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_0_2__0.txt @@ -15,11 +15,7 @@ stick{foo: "bar"} end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'stick' + path: 'stick' data_tags: location: SourceLocation(pos=5, lineno=1, colno=6) @@ -29,7 +25,7 @@ stick{foo: "bar"} location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) key: - + location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt index 31063b5a3..125ecafad 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt @@ -9,12 +9,16 @@ Hello world! location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) - words: - + fragments: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'Hello' - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'world!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt index 03bf24ebc..6d5c1168c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt @@ -9,8 +9,8 @@ foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) - words: - + fragments: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt index 38a552209..6abe736cc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_2__0.txt @@ -9,7 +9,7 @@ minecraft:message 0 2 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - words: + fragments: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt index cc759b423..3b826ea77 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt @@ -9,18 +9,26 @@ Hello @p :) location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) - words: - + fragments: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'Hello' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=8, lineno=1, colno=9) variable: 'p' arguments: - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: ':)' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt index 921be5dc4..7286d1c32 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt @@ -9,11 +9,15 @@ foo @a[tag=a, tag=b] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) - words: - + fragments: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=20, lineno=1, colno=21) @@ -24,12 +28,12 @@ foo @a[tag=a, tag=b] end_location: SourceLocation(pos=12, lineno=1, colno=13) inverted: False key: - + location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'tag' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'a' @@ -38,12 +42,12 @@ foo @a[tag=a, tag=b] end_location: SourceLocation(pos=19, lineno=1, colno=20) inverted: False key: - + location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=17, lineno=1, colno=18) value: 'tag' value: - + location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=19, lineno=1, colno=20) value: 'b' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt index 4dc2a6b1c..220b4b522 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_0__0.txt @@ -11,8 +11,4 @@ spooky end_location: SourceLocation(pos=6, lineno=1, colno=7) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'spooky' \ No newline at end of file + path: 'spooky' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt index 61c0fa442..aa6ec9e36 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_mob_effect_0_1__0.txt @@ -11,8 +11,4 @@ effect end_location: SourceLocation(pos=6, lineno=1, colno=7) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'effect' \ No newline at end of file + path: 'effect' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt index e6ff9ac73..1b451f183 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_0_1__0.txt @@ -14,7 +14,7 @@ minecraft:nbt_compound_tag 0 1 location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=8, lineno=1, colno=9) key: - + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt index 5a66aff8d..e37152f57 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_0__0.txt @@ -10,7 +10,7 @@ foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt index 5d9ded2e7..6ba9846ce 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt @@ -10,11 +10,11 @@ foo.bar[0].A [crazy name]! location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=28, lineno=1, colno=29) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' @@ -22,11 +22,11 @@ foo.bar[0].A [crazy name]! location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) index: - + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 0 - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=28, lineno=1, colno=29) value: 'A [crazy name]!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt index 8f3fbcf2e..d826e2911 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt @@ -10,11 +10,11 @@ foo.bar[0].A [crazy name]!.baz location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=1, colno=33) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' @@ -22,15 +22,15 @@ foo.bar[0].A [crazy name]!.baz location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) index: - + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 0 - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=28, lineno=1, colno=29) value: 'A [crazy name]!' - + location: SourceLocation(pos=29, lineno=1, colno=30) end_location: SourceLocation(pos=32, lineno=1, colno=33) value: 'baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt index 52f9e243b..3e4105419 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_12__0.txt @@ -10,11 +10,11 @@ foo.bar[] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt index e8b29817d..639ac15d8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_13__0.txt @@ -10,11 +10,11 @@ foo.bar[].baz location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' @@ -22,7 +22,7 @@ foo.bar[].baz location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=9, lineno=1, colno=10) index: None - + location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt index f0d20a3a0..fca63acdf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_14__0.txt @@ -10,11 +10,11 @@ foo.bar[{baz: 5b}] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=1, colno=18) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' @@ -30,7 +30,7 @@ foo.bar[{baz: 5b}] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=15, lineno=1, colno=16) key: - + location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'baz' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt index 5c2819474..477e1b93c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_15__0.txt @@ -10,7 +10,7 @@ foo{bar: "baz"} location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' @@ -22,7 +22,7 @@ foo{bar: "baz"} location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=13, lineno=1, colno=14) key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt index ed9241fbb..c27caa319 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_16__0.txt @@ -10,7 +10,7 @@ foo{bar: "baz"}.bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=18, lineno=1, colno=19) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' @@ -22,7 +22,7 @@ foo{bar: "baz"}.bar location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=13, lineno=1, colno=14) key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' @@ -31,7 +31,7 @@ foo{bar: "baz"}.bar location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: String('baz') - + location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=18, lineno=1, colno=19) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt index 9bcaf286d..6ca48c29e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_1__0.txt @@ -10,11 +10,11 @@ foo.bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt index 4464deecc..e69b62b08 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_2__0.txt @@ -10,7 +10,7 @@ foo[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' @@ -18,7 +18,7 @@ foo[0] location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=6, lineno=1, colno=7) index: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt index 488602dab..1dd66411d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_3__0.txt @@ -14,7 +14,7 @@ minecraft:nbt_path 0 3 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) index: - + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt index c6f9ce94c..9f164b6bb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_5__0.txt @@ -18,7 +18,7 @@ minecraft:nbt_path 0 5 location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=8, lineno=1, colno=9) key: - + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt index 3388f9c8f..0099ff071 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_7__0.txt @@ -18,7 +18,7 @@ minecraft:nbt_path 0 7 location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=9, lineno=1, colno=10) key: - + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt index 641dc69c8..42569466e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_8__0.txt @@ -10,7 +10,7 @@ foo{}.bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' @@ -19,7 +19,7 @@ foo{}.bar end_location: SourceLocation(pos=5, lineno=1, colno=6) entries: - + location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt index b9678470c..569f4b142 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_9__0.txt @@ -10,11 +10,11 @@ foo.bar[-1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) components: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'bar' @@ -22,7 +22,7 @@ foo.bar[-1] location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=11, lineno=1, colno=12) index: - + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: -1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt index e221d164a..ca46f41ca 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_0_5__0.txt @@ -14,7 +14,7 @@ minecraft:nbt_tag 0 5 location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=8, lineno=1, colno=9) key: - + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt index 22d4a5210..47671b78a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt @@ -6,7 +6,7 @@ foo --- foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt index 6b792d1bd..f5d0ad879 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:objective 0 1 --- * --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt index d276a4ed2..5c6ab875f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt @@ -6,7 +6,7 @@ minecraft:objective 0 2 --- 012 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: '012' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt index 327fda6de..c7148df3f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt @@ -11,8 +11,4 @@ foo end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt index d08e6b028..eb3457bad 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt @@ -11,8 +11,4 @@ foo.bar.baz end_location: SourceLocation(pos=11, lineno=1, colno=12) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 'foo.bar.baz' \ No newline at end of file + path: 'foo.bar.baz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt index 311512220..4d736a6af 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt @@ -10,13 +10,5 @@ minecraft:foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'foo' \ No newline at end of file + namespace: 'minecraft' + path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt index 8c5e6ccf8..73bea2915 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt @@ -6,7 +6,7 @@ minecraft:operation 0 0 --- = --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '=' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt index d474faf50..f63ef3e02 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:operation 0 1 --- > --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '>' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt index 5ef9107d0..44ce57407 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt @@ -6,7 +6,7 @@ minecraft:operation 0 2 --- < --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '<' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt index f96830002..7d278827a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_0__0.txt @@ -15,9 +15,5 @@ foo end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' + path: 'foo' parameters: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt index 453da76b4..94811f024 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_1__0.txt @@ -14,14 +14,6 @@ foo:bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - path: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'bar' + namespace: 'foo' + path: 'bar' parameters: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt index 27ca8582d..1f5a26a25 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_2__0.txt @@ -15,32 +15,28 @@ dust 1.0 0.5 0.5 1.0 end_location: SourceLocation(pos=4, lineno=1, colno=5) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'dust' + path: 'dust' parameters: location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=20, lineno=1, colno=21) red: - + location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 1.0 green: - + location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 0.5 blue: - + location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 0.5 size: - + location: SourceLocation(pos=17, lineno=1, colno=18) end_location: SourceLocation(pos=20, lineno=1, colno=21) value: 1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt index ee8958af3..02010c215 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_3__0.txt @@ -14,52 +14,44 @@ minecraft:dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=1, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'minecraft' - path: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=31, lineno=1, colno=32) - value: 'dust_color_transition' + namespace: 'minecraft' + path: 'dust_color_transition' parameters: location: SourceLocation(pos=32, lineno=1, colno=33) end_location: SourceLocation(pos=59, lineno=1, colno=60) red: - + location: SourceLocation(pos=32, lineno=1, colno=33) end_location: SourceLocation(pos=35, lineno=1, colno=36) value: 1.0 green: - + location: SourceLocation(pos=36, lineno=1, colno=37) end_location: SourceLocation(pos=39, lineno=1, colno=40) value: 0.0 blue: - + location: SourceLocation(pos=40, lineno=1, colno=41) end_location: SourceLocation(pos=43, lineno=1, colno=44) value: 0.0 size: - + location: SourceLocation(pos=44, lineno=1, colno=45) end_location: SourceLocation(pos=47, lineno=1, colno=48) value: 1.0 end_red: - + location: SourceLocation(pos=48, lineno=1, colno=49) end_location: SourceLocation(pos=51, lineno=1, colno=52) value: 0.0 end_green: - + location: SourceLocation(pos=52, lineno=1, colno=53) end_location: SourceLocation(pos=55, lineno=1, colno=56) value: 0.0 end_blue: - + location: SourceLocation(pos=56, lineno=1, colno=57) end_location: SourceLocation(pos=59, lineno=1, colno=60) value: 1.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt index 5d46ef926..ec8e730b5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_4__0.txt @@ -15,11 +15,7 @@ block minecraft:grass_block[snowy=true] end_location: SourceLocation(pos=5, lineno=1, colno=6) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'block' + path: 'block' parameters: location: SourceLocation(pos=6, lineno=1, colno=7) @@ -33,27 +29,19 @@ block minecraft:grass_block[snowy=true] location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=27, lineno=1, colno=28) is_tag: False - namespace: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'minecraft' - path: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - value: 'grass_block' + namespace: 'minecraft' + path: 'grass_block' block_states: location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=38, lineno=1, colno=39) key: - + location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=33, lineno=1, colno=34) value: 'snowy' value: - + location: SourceLocation(pos=34, lineno=1, colno=35) end_location: SourceLocation(pos=38, lineno=1, colno=39) value: 'true' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt index 4a1247e28..e3c11e8a1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_5__0.txt @@ -15,11 +15,7 @@ falling_dust minecraft:grass_block[snowy=true]{hello: "world"} end_location: SourceLocation(pos=12, lineno=1, colno=13) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'falling_dust' + path: 'falling_dust' parameters: location: SourceLocation(pos=13, lineno=1, colno=14) @@ -33,27 +29,19 @@ falling_dust minecraft:grass_block[snowy=true]{hello: "world"} location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=34, lineno=1, colno=35) is_tag: False - namespace: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - value: 'minecraft' - path: - - location: SourceLocation(pos=23, lineno=1, colno=24) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - value: 'grass_block' + namespace: 'minecraft' + path: 'grass_block' block_states: location: SourceLocation(pos=35, lineno=1, colno=36) end_location: SourceLocation(pos=45, lineno=1, colno=46) key: - + location: SourceLocation(pos=35, lineno=1, colno=36) end_location: SourceLocation(pos=40, lineno=1, colno=41) value: 'snowy' value: - + location: SourceLocation(pos=41, lineno=1, colno=42) end_location: SourceLocation(pos=45, lineno=1, colno=46) value: 'true' @@ -66,7 +54,7 @@ falling_dust minecraft:grass_block[snowy=true]{hello: "world"} location: SourceLocation(pos=47, lineno=1, colno=48) end_location: SourceLocation(pos=59, lineno=1, colno=60) key: - + location: SourceLocation(pos=47, lineno=1, colno=48) end_location: SourceLocation(pos=52, lineno=1, colno=53) value: 'hello' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt index 4e1cf3000..a1e359a3e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_6__0.txt @@ -15,11 +15,7 @@ item minecraft:apple end_location: SourceLocation(pos=4, lineno=1, colno=5) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'item' + path: 'item' parameters: location: SourceLocation(pos=5, lineno=1, colno=6) @@ -33,14 +29,6 @@ item minecraft:apple location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=20, lineno=1, colno=21) is_tag: False - namespace: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'minecraft' - path: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'apple' + namespace: 'minecraft' + path: 'apple' data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt index cc0254e59..ec818bc7b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_7__0.txt @@ -15,11 +15,7 @@ item minecraft:apple{foo: "bar"} end_location: SourceLocation(pos=4, lineno=1, colno=5) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'item' + path: 'item' parameters: location: SourceLocation(pos=5, lineno=1, colno=6) @@ -33,16 +29,8 @@ item minecraft:apple{foo: "bar"} location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=20, lineno=1, colno=21) is_tag: False - namespace: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'minecraft' - path: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'apple' + namespace: 'minecraft' + path: 'apple' data_tags: location: SourceLocation(pos=20, lineno=1, colno=21) @@ -52,7 +40,7 @@ item minecraft:apple{foo: "bar"} location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=29, lineno=1, colno=30) key: - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=24, lineno=1, colno=25) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt index 381dd9258..b16261b9d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_0_8__0.txt @@ -15,47 +15,43 @@ vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 end_location: SourceLocation(pos=9, lineno=1, colno=10) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'vibration' + path: 'vibration' parameters: location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=39, lineno=1, colno=40) x1: - + location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 0.0 y1: - + location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=18, lineno=1, colno=19) value: 64.0 z1: - + location: SourceLocation(pos=19, lineno=1, colno=20) end_location: SourceLocation(pos=22, lineno=1, colno=23) value: 0.0 x2: - + location: SourceLocation(pos=23, lineno=1, colno=24) end_location: SourceLocation(pos=26, lineno=1, colno=27) value: 5.0 y2: - + location: SourceLocation(pos=27, lineno=1, colno=28) end_location: SourceLocation(pos=31, lineno=1, colno=32) value: 64.0 z2: - + location: SourceLocation(pos=32, lineno=1, colno=33) end_location: SourceLocation(pos=35, lineno=1, colno=36) value: 0.0 duration: - + location: SourceLocation(pos=36, lineno=1, colno=37) end_location: SourceLocation(pos=39, lineno=1, colno=40) value: 200 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt index 429187f3c..3c4f01be8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 2 --- block minecraft:grass_block[snowy=] --- -UnexpectedToken: Expected state but got bracket ']'. +UnexpectedToken: Expected word or quoted_string but got bracket ']'. location = SourceLocation(pos=34, lineno=1, colno=35) end_location = SourceLocation(pos=34, lineno=1, colno=35) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt index 50c24ca03..06b91f4d7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_0__0.txt @@ -11,8 +11,4 @@ foo end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' \ No newline at end of file + path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt index 322a0b3f9..ad609de24 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_1__0.txt @@ -10,13 +10,5 @@ foo:bar location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) is_tag: False - namespace: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - path: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'bar' \ No newline at end of file + namespace: 'foo' + path: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt index 131b8dcaf..b9262442d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_0_2__0.txt @@ -11,8 +11,4 @@ minecraft:resource_location 0 2 end_location: SourceLocation(pos=3, lineno=1, colno=4) is_tag: False namespace: None - path: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: '012' \ No newline at end of file + path: '012' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt index ab505f9f9..0860f514b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt @@ -6,7 +6,7 @@ Player --- Player --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt index 3db00b947..90c8c0780 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_10__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 10 end_location: SourceLocation(pos=21, lineno=1, colno=22) inverted: True key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'type' @@ -26,17 +26,13 @@ minecraft:score_holder 0 10 end_location: SourceLocation(pos=21, lineno=1, colno=22) is_tag: False namespace: None - path: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: 'skeleton' + path: 'skeleton' location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=39, lineno=1, colno=40) inverted: True key: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=28, lineno=1, colno=29) value: 'type' @@ -46,8 +42,4 @@ minecraft:score_holder 0 10 end_location: SourceLocation(pos=39, lineno=1, colno=40) is_tag: False namespace: None - path: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - value: 'zombie' \ No newline at end of file + path: 'zombie' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt index b0533c18d..45b93b42f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_11__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 11 end_location: SourceLocation(pos=19, lineno=1, colno=20) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'type' @@ -26,17 +26,13 @@ minecraft:score_holder 0 11 end_location: SourceLocation(pos=19, lineno=1, colno=20) is_tag: False namespace: None - path: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - value: 'skeleton' + path: 'skeleton' location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=35, lineno=1, colno=36) inverted: False key: - + location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=26, lineno=1, colno=27) value: 'type' @@ -46,8 +42,4 @@ minecraft:score_holder 0 11 end_location: SourceLocation(pos=35, lineno=1, colno=36) is_tag: False namespace: None - path: - - location: SourceLocation(pos=29, lineno=1, colno=30) - end_location: SourceLocation(pos=35, lineno=1, colno=36) - value: 'zombie' \ No newline at end of file + path: 'zombie' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt index acd187bf2..2639fc0b8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_12__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 12 end_location: SourceLocation(pos=17, lineno=1, colno=18) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'type' @@ -26,8 +26,4 @@ minecraft:score_holder 0 12 end_location: SourceLocation(pos=17, lineno=1, colno=18) is_tag: False namespace: None - path: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - value: 'player' \ No newline at end of file + path: 'player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt index 88c65adf7..0ac09c968 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_13__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 13 end_location: SourceLocation(pos=17, lineno=1, colno=18) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'type' @@ -26,8 +26,4 @@ minecraft:score_holder 0 13 end_location: SourceLocation(pos=17, lineno=1, colno=18) is_tag: False namespace: None - path: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - value: 'zombie' \ No newline at end of file + path: 'zombie' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt index caa2a7449..fd6ecdf1c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_14__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 0 14 end_location: SourceLocation(pos=11, lineno=1, colno=12) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'x' value: - + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 0.0 @@ -30,12 +30,12 @@ minecraft:score_holder 0 14 end_location: SourceLocation(pos=21, lineno=1, colno=22) inverted: False key: - + location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'y' value: - + location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 0.0 @@ -44,12 +44,12 @@ minecraft:score_holder 0 14 end_location: SourceLocation(pos=31, lineno=1, colno=32) inverted: False key: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'z' value: - + location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=31, lineno=1, colno=32) value: 0.0 @@ -58,12 +58,12 @@ minecraft:score_holder 0 14 end_location: SourceLocation(pos=42, lineno=1, colno=43) inverted: False key: - + location: SourceLocation(pos=34, lineno=1, colno=35) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: 'dx' value: - + location: SourceLocation(pos=39, lineno=1, colno=40) end_location: SourceLocation(pos=42, lineno=1, colno=43) value: 0.0 @@ -72,12 +72,12 @@ minecraft:score_holder 0 14 end_location: SourceLocation(pos=53, lineno=1, colno=54) inverted: False key: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=47, lineno=1, colno=48) value: 'dy' value: - + location: SourceLocation(pos=50, lineno=1, colno=51) end_location: SourceLocation(pos=53, lineno=1, colno=54) value: 0.0 @@ -86,12 +86,12 @@ minecraft:score_holder 0 14 end_location: SourceLocation(pos=64, lineno=1, colno=65) inverted: False key: - + location: SourceLocation(pos=56, lineno=1, colno=57) end_location: SourceLocation(pos=58, lineno=1, colno=59) value: 'dz' value: - + location: SourceLocation(pos=61, lineno=1, colno=62) end_location: SourceLocation(pos=64, lineno=1, colno=65) value: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt index 955f60587..a21fdaa2b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_15__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 0 15 end_location: SourceLocation(pos=11, lineno=1, colno=12) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'x' value: - + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 0.0 @@ -30,12 +30,12 @@ minecraft:score_holder 0 15 end_location: SourceLocation(pos=21, lineno=1, colno=22) inverted: False key: - + location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'x' value: - + location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 0.0 @@ -44,12 +44,12 @@ minecraft:score_holder 0 15 end_location: SourceLocation(pos=32, lineno=1, colno=33) inverted: False key: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=26, lineno=1, colno=27) value: 'dz' value: - + location: SourceLocation(pos=29, lineno=1, colno=30) end_location: SourceLocation(pos=32, lineno=1, colno=33) value: 0.0 @@ -58,12 +58,12 @@ minecraft:score_holder 0 15 end_location: SourceLocation(pos=42, lineno=1, colno=43) inverted: False key: - + location: SourceLocation(pos=34, lineno=1, colno=35) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: 'dz' value: - + location: SourceLocation(pos=39, lineno=1, colno=40) end_location: SourceLocation(pos=42, lineno=1, colno=43) value: 0.0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt index c675218f5..67aa54d8d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_16__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 16 end_location: SourceLocation(pos=30, lineno=1, colno=31) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'x_rotation' @@ -31,7 +31,7 @@ minecraft:score_holder 0 16 end_location: SourceLocation(pos=60, lineno=1, colno=61) inverted: False key: - + location: SourceLocation(pos=34, lineno=1, colno=35) end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'y_rotation' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt index f100f6949..7a006c6ea 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_17__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 17 end_location: SourceLocation(pos=30, lineno=1, colno=31) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'x_rotation' @@ -31,7 +31,7 @@ minecraft:score_holder 0 17 end_location: SourceLocation(pos=60, lineno=1, colno=61) inverted: False key: - + location: SourceLocation(pos=34, lineno=1, colno=35) end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'x_rotation' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt index a7a2c6d93..0f6cd2ecf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:score_holder 0 1 --- 0123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt index 8a9f25039..1039aab36 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt @@ -6,7 +6,7 @@ minecraft:score_holder 0 2 --- * --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt index 9602a2c9c..425039daf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 4 end_location: SourceLocation(pos=28, lineno=1, colno=29) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'scores' @@ -29,7 +29,7 @@ minecraft:score_holder 0 4 location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=24, lineno=1, colno=25) key: - + location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=18, lineno=1, colno=19) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt index 9510b1fa2..782c0ec78 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_5__0.txt @@ -16,7 +16,7 @@ minecraft:score_holder 0 5 end_location: SourceLocation(pos=16, lineno=1, colno=17) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'scores' @@ -31,7 +31,7 @@ minecraft:score_holder 0 5 end_location: SourceLocation(pos=31, lineno=1, colno=32) inverted: False key: - + location: SourceLocation(pos=19, lineno=1, colno=20) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'scores' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt index 056f202dd..e54e9994b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 0 6 end_location: SourceLocation(pos=20, lineno=1, colno=21) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'sort' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=20, lineno=1, colno=21) value: 'arbitrary' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt index 791154c47..79b0d6584 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 0 7 end_location: SourceLocation(pos=13, lineno=1, colno=14) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'tag' value: - + location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'foo' @@ -30,12 +30,12 @@ minecraft:score_holder 0 7 end_location: SourceLocation(pos=27, lineno=1, colno=28) inverted: True key: - + location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=19, lineno=1, colno=20) value: 'tag' value: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=27, lineno=1, colno=28) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt index 08e65b792..ccc14a8eb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 0 8 end_location: SourceLocation(pos=16, lineno=1, colno=17) inverted: True key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'team' value: - + location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'foo' @@ -30,12 +30,12 @@ minecraft:score_holder 0 8 end_location: SourceLocation(pos=31, lineno=1, colno=32) inverted: True key: - + location: SourceLocation(pos=19, lineno=1, colno=20) end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 'team' value: - + location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=31, lineno=1, colno=32) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt index 477f45fa4..2f839c2df 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 0 9 end_location: SourceLocation(pos=14, lineno=1, colno=15) inverted: False key: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'team' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'foo' @@ -30,12 +30,12 @@ minecraft:score_holder 0 9 end_location: SourceLocation(pos=27, lineno=1, colno=28) inverted: False key: - + location: SourceLocation(pos=17, lineno=1, colno=18) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'team' value: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=27, lineno=1, colno=28) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt index 970a4ae31..895c2dad5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt @@ -16,12 +16,12 @@ minecraft:score_holder 1 2 end_location: SourceLocation(pos=10, lineno=1, colno=11) inverted: False key: - + location: SourceLocation(pos=3, lineno=1, colno=4) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'tag' value: - + location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'foo' @@ -30,12 +30,12 @@ minecraft:score_holder 1 2 end_location: SourceLocation(pos=19, lineno=1, colno=20) inverted: False key: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=17, lineno=1, colno=18) value: 'limit' value: - + location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=19, lineno=1, colno=20) value: 1 @@ -44,12 +44,12 @@ minecraft:score_holder 1 2 end_location: SourceLocation(pos=33, lineno=1, colno=34) inverted: False key: - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'sort' value: - + location: SourceLocation(pos=26, lineno=1, colno=27) end_location: SourceLocation(pos=33, lineno=1, colno=34) value: 'nearest' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt index c181a4b7b..09e9f5d84 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt @@ -6,7 +6,7 @@ sidebar --- sidebar --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'sidebar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt index 7bd3f3c4a..698cb2979 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt @@ -6,7 +6,7 @@ foo.bar --- foo.bar --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'foo.bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt index 405b1007d..60d43818d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt @@ -6,7 +6,7 @@ xyz --- xyz --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'xyz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt index 64b57370e..237a8357a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt @@ -6,7 +6,7 @@ x --- x --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 'x' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt index 1fa1feb2c..3a1fb4ee3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt @@ -6,7 +6,7 @@ foo --- foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt index be170f724..dbb4f95ec 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:team 0 1 --- 123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: '123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt index f036eefbc..7b043bf83 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_0__0.txt @@ -6,7 +6,7 @@ dd12be42-52a9-4a91-a8a1-11c01849e498 --- dd12be42-52a9-4a91-a8a1-11c01849e498 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: UUID('dd12be42-52a9-4a91-a8a1-11c01849e498') \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 343e39ecf..70b381475 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -18,16 +18,8 @@ location: SourceLocation(pos=40, lineno=2, colno=27) end_location: SourceLocation(pos=66, lineno=2, colno=53) is_tag: False - namespace: - - location: SourceLocation(pos=40, lineno=2, colno=27) - end_location: SourceLocation(pos=49, lineno=2, colno=36) - value: 'minecraft' - path: - - location: SourceLocation(pos=50, lineno=2, colno=37) - end_location: SourceLocation(pos=66, lineno=2, colno=53) - value: 'story/shiny_gear' + namespace: 'minecraft' + path: 'story/shiny_gear' location: SourceLocation(pos=67, lineno=3, colno=1) end_location: SourceLocation(pos=98, lineno=3, colno=32) @@ -54,17 +46,9 @@ location: SourceLocation(pos=124, lineno=5, colno=14) end_location: SourceLocation(pos=147, lineno=5, colno=37) is_tag: False - namespace: - - location: SourceLocation(pos=124, lineno=5, colno=14) - end_location: SourceLocation(pos=133, lineno=5, colno=23) - value: 'minecraft' - path: - - location: SourceLocation(pos=134, lineno=5, colno=24) - end_location: SourceLocation(pos=147, lineno=5, colno=37) - value: 'generic.armor' - + namespace: 'minecraft' + path: 'generic.armor' + location: SourceLocation(pos=157, lineno=5, colno=47) end_location: SourceLocation(pos=158, lineno=5, colno=48) value: 5 @@ -79,7 +63,7 @@ end_location: SourceLocation(pos=184, lineno=8, colno=12) identifier: 'clear:targets' arguments: - + location: SourceLocation(pos=179, lineno=8, colno=7) end_location: SourceLocation(pos=184, lineno=8, colno=12) value: 'Alice' @@ -88,7 +72,7 @@ end_location: SourceLocation(pos=211, lineno=9, colno=27) identifier: 'clear:targets:item' arguments: - + location: SourceLocation(pos=191, lineno=9, colno=7) end_location: SourceLocation(pos=196, lineno=9, colno=12) value: 'Alice' @@ -100,16 +84,8 @@ location: SourceLocation(pos=197, lineno=9, colno=13) end_location: SourceLocation(pos=211, lineno=9, colno=27) is_tag: False - namespace: - - location: SourceLocation(pos=197, lineno=9, colno=13) - end_location: SourceLocation(pos=206, lineno=9, colno=22) - value: 'minecraft' - path: - - location: SourceLocation(pos=207, lineno=9, colno=23) - end_location: SourceLocation(pos=211, lineno=9, colno=27) - value: 'wool' + namespace: 'minecraft' + path: 'wool' data_tags: None location: SourceLocation(pos=212, lineno=10, colno=1) @@ -130,16 +106,8 @@ location: SourceLocation(pos=221, lineno=10, colno=10) end_location: SourceLocation(pos=243, lineno=10, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=221, lineno=10, colno=10) - end_location: SourceLocation(pos=230, lineno=10, colno=19) - value: 'minecraft' - path: - - location: SourceLocation(pos=231, lineno=10, colno=20) - end_location: SourceLocation(pos=243, lineno=10, colno=32) - value: 'golden_sword' + namespace: 'minecraft' + path: 'golden_sword' data_tags: location: SourceLocation(pos=243, lineno=10, colno=32) @@ -149,7 +117,7 @@ location: SourceLocation(pos=244, lineno=10, colno=33) end_location: SourceLocation(pos=296, lineno=10, colno=85) key: - + location: SourceLocation(pos=244, lineno=10, colno=33) end_location: SourceLocation(pos=256, lineno=10, colno=45) value: 'Enchantments' @@ -166,7 +134,7 @@ location: SourceLocation(pos=260, lineno=10, colno=49) end_location: SourceLocation(pos=285, lineno=10, colno=74) key: - + location: SourceLocation(pos=260, lineno=10, colno=49) end_location: SourceLocation(pos=262, lineno=10, colno=51) value: 'id' @@ -179,7 +147,7 @@ location: SourceLocation(pos=287, lineno=10, colno=76) end_location: SourceLocation(pos=294, lineno=10, colno=83) key: - + location: SourceLocation(pos=287, lineno=10, colno=76) end_location: SourceLocation(pos=290, lineno=10, colno=79) value: 'lvl' @@ -203,7 +171,7 @@ location: SourceLocation(pos=324, lineno=12, colno=20) end_location: SourceLocation(pos=343, lineno=12, colno=39) components: - + location: SourceLocation(pos=324, lineno=12, colno=20) end_location: SourceLocation(pos=343, lineno=12, colno=39) value: 'foodSaturationLevel' @@ -222,7 +190,7 @@ end_location: SourceLocation(pos=375, lineno=13, colno=32) inverted: False key: - + location: SourceLocation(pos=366, lineno=13, colno=23) end_location: SourceLocation(pos=370, lineno=13, colno=27) value: 'type' @@ -232,17 +200,13 @@ end_location: SourceLocation(pos=375, lineno=13, colno=32) is_tag: False namespace: None - path: - - location: SourceLocation(pos=371, lineno=13, colno=28) - end_location: SourceLocation(pos=375, lineno=13, colno=32) - value: 'item' + path: 'item' location: SourceLocation(pos=376, lineno=13, colno=33) end_location: SourceLocation(pos=389, lineno=13, colno=46) inverted: False key: - + location: SourceLocation(pos=376, lineno=13, colno=33) end_location: SourceLocation(pos=384, lineno=13, colno=41) value: 'distance' @@ -257,12 +221,12 @@ end_location: SourceLocation(pos=397, lineno=13, colno=54) inverted: False key: - + location: SourceLocation(pos=390, lineno=13, colno=47) end_location: SourceLocation(pos=395, lineno=13, colno=52) value: 'limit' value: - + location: SourceLocation(pos=396, lineno=13, colno=53) end_location: SourceLocation(pos=397, lineno=13, colno=54) value: 1 @@ -271,12 +235,12 @@ end_location: SourceLocation(pos=410, lineno=13, colno=67) inverted: False key: - + location: SourceLocation(pos=398, lineno=13, colno=55) end_location: SourceLocation(pos=402, lineno=13, colno=59) value: 'sort' value: - + location: SourceLocation(pos=403, lineno=13, colno=60) end_location: SourceLocation(pos=410, lineno=13, colno=67) value: 'nearest' @@ -284,7 +248,7 @@ location: SourceLocation(pos=412, lineno=13, colno=69) end_location: SourceLocation(pos=423, lineno=13, colno=80) components: - + location: SourceLocation(pos=412, lineno=13, colno=69) end_location: SourceLocation(pos=423, lineno=13, colno=80) value: 'PickupDelay' @@ -307,7 +271,7 @@ end_location: SourceLocation(pos=465, lineno=14, colno=29) inverted: False key: - + location: SourceLocation(pos=456, lineno=14, colno=20) end_location: SourceLocation(pos=460, lineno=14, colno=24) value: 'type' @@ -317,22 +281,18 @@ end_location: SourceLocation(pos=465, lineno=14, colno=29) is_tag: False namespace: None - path: - - location: SourceLocation(pos=461, lineno=14, colno=25) - end_location: SourceLocation(pos=465, lineno=14, colno=29) - value: 'item' + path: 'item' location: SourceLocation(pos=466, lineno=14, colno=30) end_location: SourceLocation(pos=473, lineno=14, colno=37) inverted: False key: - + location: SourceLocation(pos=466, lineno=14, colno=30) end_location: SourceLocation(pos=471, lineno=14, colno=35) value: 'limit' value: - + location: SourceLocation(pos=472, lineno=14, colno=36) end_location: SourceLocation(pos=473, lineno=14, colno=37) value: 1 @@ -341,12 +301,12 @@ end_location: SourceLocation(pos=485, lineno=14, colno=49) inverted: False key: - + location: SourceLocation(pos=474, lineno=14, colno=38) end_location: SourceLocation(pos=478, lineno=14, colno=42) value: 'sort' value: - + location: SourceLocation(pos=479, lineno=14, colno=43) end_location: SourceLocation(pos=485, lineno=14, colno=49) value: 'random' @@ -354,7 +314,7 @@ location: SourceLocation(pos=487, lineno=14, colno=51) end_location: SourceLocation(pos=493, lineno=14, colno=57) components: - + location: SourceLocation(pos=487, lineno=14, colno=51) end_location: SourceLocation(pos=490, lineno=14, colno=54) value: 'Pos' @@ -362,7 +322,7 @@ location: SourceLocation(pos=490, lineno=14, colno=54) end_location: SourceLocation(pos=493, lineno=14, colno=57) index: - + location: SourceLocation(pos=491, lineno=14, colno=55) end_location: SourceLocation(pos=492, lineno=14, colno=56) value: 1 @@ -381,7 +341,7 @@ location: SourceLocation(pos=513, lineno=15, colno=20) end_location: SourceLocation(pos=537, lineno=15, colno=44) components: - + location: SourceLocation(pos=513, lineno=15, colno=20) end_location: SourceLocation(pos=522, lineno=15, colno=29) value: 'Inventory' @@ -397,7 +357,7 @@ location: SourceLocation(pos=524, lineno=15, colno=31) end_location: SourceLocation(pos=532, lineno=15, colno=39) key: - + location: SourceLocation(pos=524, lineno=15, colno=31) end_location: SourceLocation(pos=528, lineno=15, colno=35) value: 'Slot' @@ -406,7 +366,7 @@ location: SourceLocation(pos=530, lineno=15, colno=37) end_location: SourceLocation(pos=532, lineno=15, colno=39) value: Byte(0) - + location: SourceLocation(pos=535, lineno=15, colno=42) end_location: SourceLocation(pos=537, lineno=15, colno=44) value: 'id' @@ -425,12 +385,12 @@ end_location: SourceLocation(pos=563, lineno=16, colno=26) inverted: False key: - + location: SourceLocation(pos=560, lineno=16, colno=23) end_location: SourceLocation(pos=561, lineno=16, colno=24) value: 'x' value: - + location: SourceLocation(pos=562, lineno=16, colno=25) end_location: SourceLocation(pos=563, lineno=16, colno=26) value: 0 @@ -439,12 +399,12 @@ end_location: SourceLocation(pos=568, lineno=16, colno=31) inverted: False key: - + location: SourceLocation(pos=564, lineno=16, colno=27) end_location: SourceLocation(pos=565, lineno=16, colno=28) value: 'y' value: - + location: SourceLocation(pos=566, lineno=16, colno=29) end_location: SourceLocation(pos=568, lineno=16, colno=31) value: 64 @@ -453,12 +413,12 @@ end_location: SourceLocation(pos=572, lineno=16, colno=35) inverted: False key: - + location: SourceLocation(pos=569, lineno=16, colno=32) end_location: SourceLocation(pos=570, lineno=16, colno=33) value: 'z' value: - + location: SourceLocation(pos=571, lineno=16, colno=34) end_location: SourceLocation(pos=572, lineno=16, colno=35) value: 0 @@ -467,7 +427,7 @@ end_location: SourceLocation(pos=585, lineno=16, colno=48) inverted: False key: - + location: SourceLocation(pos=573, lineno=16, colno=36) end_location: SourceLocation(pos=577, lineno=16, colno=40) value: 'type' @@ -477,22 +437,18 @@ end_location: SourceLocation(pos=585, lineno=16, colno=48) is_tag: False namespace: None - path: - - location: SourceLocation(pos=578, lineno=16, colno=41) - end_location: SourceLocation(pos=585, lineno=16, colno=48) - value: 'dolphin' + path: 'dolphin' location: SourceLocation(pos=586, lineno=16, colno=49) end_location: SourceLocation(pos=593, lineno=16, colno=56) inverted: False key: - + location: SourceLocation(pos=586, lineno=16, colno=49) end_location: SourceLocation(pos=591, lineno=16, colno=54) value: 'limit' value: - + location: SourceLocation(pos=592, lineno=16, colno=55) end_location: SourceLocation(pos=593, lineno=16, colno=56) value: 1 @@ -500,7 +456,7 @@ location: SourceLocation(pos=595, lineno=16, colno=58) end_location: SourceLocation(pos=635, lineno=16, colno=98) components: - + location: SourceLocation(pos=595, lineno=16, colno=58) end_location: SourceLocation(pos=605, lineno=16, colno=68) value: 'Attributes' @@ -516,7 +472,7 @@ location: SourceLocation(pos=607, lineno=16, colno=70) end_location: SourceLocation(pos=628, lineno=16, colno=91) key: - + location: SourceLocation(pos=607, lineno=16, colno=70) end_location: SourceLocation(pos=611, lineno=16, colno=74) value: 'Name' @@ -525,7 +481,7 @@ location: SourceLocation(pos=613, lineno=16, colno=76) end_location: SourceLocation(pos=628, lineno=16, colno=91) value: String('generic.armor') - + location: SourceLocation(pos=631, lineno=16, colno=94) end_location: SourceLocation(pos=635, lineno=16, colno=98) value: 'Base' @@ -563,7 +519,7 @@ location: SourceLocation(pos=674, lineno=17, colno=26) end_location: SourceLocation(pos=685, lineno=17, colno=37) components: - + location: SourceLocation(pos=674, lineno=17, colno=26) end_location: SourceLocation(pos=679, lineno=17, colno=31) value: 'Items' @@ -571,11 +527,11 @@ location: SourceLocation(pos=679, lineno=17, colno=31) end_location: SourceLocation(pos=682, lineno=17, colno=34) index: - + location: SourceLocation(pos=680, lineno=17, colno=32) end_location: SourceLocation(pos=681, lineno=17, colno=33) value: 0 - + location: SourceLocation(pos=683, lineno=17, colno=35) end_location: SourceLocation(pos=685, lineno=17, colno=37) value: 'id' @@ -598,7 +554,7 @@ end_location: SourceLocation(pos=754, lineno=18, colno=33) inverted: False key: - + location: SourceLocation(pos=743, lineno=18, colno=22) end_location: SourceLocation(pos=747, lineno=18, colno=26) value: 'type' @@ -608,22 +564,18 @@ end_location: SourceLocation(pos=754, lineno=18, colno=33) is_tag: False namespace: None - path: - - location: SourceLocation(pos=748, lineno=18, colno=27) - end_location: SourceLocation(pos=754, lineno=18, colno=33) - value: 'zombie' + path: 'zombie' location: SourceLocation(pos=755, lineno=18, colno=34) end_location: SourceLocation(pos=762, lineno=18, colno=41) inverted: False key: - + location: SourceLocation(pos=755, lineno=18, colno=34) end_location: SourceLocation(pos=760, lineno=18, colno=39) value: 'limit' value: - + location: SourceLocation(pos=761, lineno=18, colno=40) end_location: SourceLocation(pos=762, lineno=18, colno=41) value: 1 @@ -632,12 +584,12 @@ end_location: SourceLocation(pos=775, lineno=18, colno=54) inverted: False key: - + location: SourceLocation(pos=763, lineno=18, colno=42) end_location: SourceLocation(pos=767, lineno=18, colno=46) value: 'sort' value: - + location: SourceLocation(pos=768, lineno=18, colno=47) end_location: SourceLocation(pos=775, lineno=18, colno=54) value: 'nearest' @@ -649,7 +601,7 @@ location: SourceLocation(pos=778, lineno=18, colno=57) end_location: SourceLocation(pos=805, lineno=18, colno=84) key: - + location: SourceLocation(pos=778, lineno=18, colno=57) end_location: SourceLocation(pos=793, lineno=18, colno=72) value: 'HandDropChances' @@ -681,7 +633,7 @@ end_location: SourceLocation(pos=840, lineno=19, colno=34) inverted: False key: - + location: SourceLocation(pos=829, lineno=19, colno=23) end_location: SourceLocation(pos=833, lineno=19, colno=27) value: 'type' @@ -691,22 +643,18 @@ end_location: SourceLocation(pos=840, lineno=19, colno=34) is_tag: False namespace: None - path: - - location: SourceLocation(pos=834, lineno=19, colno=28) - end_location: SourceLocation(pos=840, lineno=19, colno=34) - value: 'zombie' + path: 'zombie' location: SourceLocation(pos=841, lineno=19, colno=35) end_location: SourceLocation(pos=848, lineno=19, colno=42) inverted: False key: - + location: SourceLocation(pos=841, lineno=19, colno=35) end_location: SourceLocation(pos=846, lineno=19, colno=40) value: 'limit' value: - + location: SourceLocation(pos=847, lineno=19, colno=41) end_location: SourceLocation(pos=848, lineno=19, colno=42) value: 1 @@ -715,12 +663,12 @@ end_location: SourceLocation(pos=861, lineno=19, colno=55) inverted: False key: - + location: SourceLocation(pos=849, lineno=19, colno=43) end_location: SourceLocation(pos=853, lineno=19, colno=47) value: 'sort' value: - + location: SourceLocation(pos=854, lineno=19, colno=48) end_location: SourceLocation(pos=861, lineno=19, colno=55) value: 'nearest' @@ -728,7 +676,7 @@ location: SourceLocation(pos=863, lineno=19, colno=57) end_location: SourceLocation(pos=881, lineno=19, colno=75) components: - + location: SourceLocation(pos=863, lineno=19, colno=57) end_location: SourceLocation(pos=878, lineno=19, colno=72) value: 'HandDropChances' @@ -736,7 +684,7 @@ location: SourceLocation(pos=878, lineno=19, colno=72) end_location: SourceLocation(pos=881, lineno=19, colno=75) index: - + location: SourceLocation(pos=879, lineno=19, colno=73) end_location: SourceLocation(pos=880, lineno=19, colno=74) value: 1 @@ -765,25 +713,17 @@ location: SourceLocation(pos=964, lineno=23, colno=16) end_location: SourceLocation(pos=984, lineno=23, colno=36) is_tag: False - namespace: - - location: SourceLocation(pos=964, lineno=23, colno=16) - end_location: SourceLocation(pos=973, lineno=23, colno=25) - value: 'minecraft' - path: - - location: SourceLocation(pos=974, lineno=23, colno=26) - end_location: SourceLocation(pos=984, lineno=23, colno=36) - value: 'resistance' - + namespace: 'minecraft' + path: 'resistance' + location: SourceLocation(pos=985, lineno=23, colno=37) end_location: SourceLocation(pos=992, lineno=23, colno=44) value: 1000000 - + location: SourceLocation(pos=993, lineno=23, colno=45) end_location: SourceLocation(pos=994, lineno=23, colno=46) value: 4 - + location: SourceLocation(pos=995, lineno=23, colno=47) end_location: SourceLocation(pos=999, lineno=23, colno=51) value: True @@ -802,21 +742,13 @@ location: SourceLocation(pos=1015, lineno=24, colno=16) end_location: SourceLocation(pos=1030, lineno=24, colno=31) is_tag: False - namespace: - - location: SourceLocation(pos=1015, lineno=24, colno=16) - end_location: SourceLocation(pos=1024, lineno=24, colno=25) - value: 'minecraft' - path: - - location: SourceLocation(pos=1025, lineno=24, colno=26) - end_location: SourceLocation(pos=1030, lineno=24, colno=31) - value: 'speed' - + namespace: 'minecraft' + path: 'speed' + location: SourceLocation(pos=1031, lineno=24, colno=32) end_location: SourceLocation(pos=1033, lineno=24, colno=34) value: 60 - + location: SourceLocation(pos=1034, lineno=24, colno=35) end_location: SourceLocation(pos=1035, lineno=24, colno=36) value: 1 @@ -835,21 +767,13 @@ location: SourceLocation(pos=1051, lineno=25, colno=16) end_location: SourceLocation(pos=1066, lineno=25, colno=31) is_tag: False - namespace: - - location: SourceLocation(pos=1051, lineno=25, colno=16) - end_location: SourceLocation(pos=1060, lineno=25, colno=25) - value: 'minecraft' - path: - - location: SourceLocation(pos=1061, lineno=25, colno=26) - end_location: SourceLocation(pos=1066, lineno=25, colno=31) - value: 'speed' - + namespace: 'minecraft' + path: 'speed' + location: SourceLocation(pos=1067, lineno=25, colno=32) end_location: SourceLocation(pos=1069, lineno=25, colno=34) value: 60 - + location: SourceLocation(pos=1070, lineno=25, colno=35) end_location: SourceLocation(pos=1071, lineno=25, colno=36) value: 2 @@ -868,16 +792,8 @@ location: SourceLocation(pos=1088, lineno=26, colno=17) end_location: SourceLocation(pos=1103, lineno=26, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=1088, lineno=26, colno=17) - end_location: SourceLocation(pos=1097, lineno=26, colno=26) - value: 'minecraft' - path: - - location: SourceLocation(pos=1098, lineno=26, colno=27) - end_location: SourceLocation(pos=1103, lineno=26, colno=32) - value: 'haste' + namespace: 'minecraft' + path: 'haste' location: SourceLocation(pos=1104, lineno=27, colno=1) end_location: SourceLocation(pos=1132, lineno=27, colno=29) @@ -893,7 +809,7 @@ end_location: SourceLocation(pos=1131, lineno=27, colno=28) inverted: False key: - + location: SourceLocation(pos=1120, lineno=27, colno=17) end_location: SourceLocation(pos=1124, lineno=27, colno=21) value: 'type' @@ -903,11 +819,7 @@ end_location: SourceLocation(pos=1131, lineno=27, colno=28) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1125, lineno=27, colno=22) - end_location: SourceLocation(pos=1131, lineno=27, colno=28) - value: 'zombie' + path: 'zombie' location: SourceLocation(pos=1143, lineno=29, colno=1) end_location: SourceLocation(pos=1162, lineno=29, colno=20) @@ -919,7 +831,7 @@ variable: 'a' arguments: - + location: SourceLocation(pos=1154, lineno=29, colno=12) end_location: SourceLocation(pos=1162, lineno=29, colno=20) value: 'infinity' @@ -934,11 +846,11 @@ variable: 'p' arguments: - + location: SourceLocation(pos=1174, lineno=30, colno=12) end_location: SourceLocation(pos=1183, lineno=30, colno=21) value: 'sharpness' - + location: SourceLocation(pos=1184, lineno=30, colno=22) end_location: SourceLocation(pos=1185, lineno=30, colno=23) value: 5 @@ -952,7 +864,7 @@ end_location: SourceLocation(pos=1237, lineno=32, colno=42) identifier: 'execute:align:axes:subcommand' arguments: - + location: SourceLocation(pos=1210, lineno=32, colno=15) end_location: SourceLocation(pos=1213, lineno=32, colno=18) value: 'yxz' @@ -1003,7 +915,7 @@ end_location: SourceLocation(pos=1272, lineno=33, colno=35) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=1255, lineno=33, colno=18) end_location: SourceLocation(pos=1259, lineno=33, colno=22) value: 'eyes' @@ -1048,7 +960,7 @@ end_location: SourceLocation(pos=1308, lineno=34, colno=36) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=1290, lineno=34, colno=18) end_location: SourceLocation(pos=1294, lineno=34, colno=22) value: 'eyes' @@ -1103,7 +1015,7 @@ end_location: SourceLocation(pos=1333, lineno=35, colno=25) inverted: False key: - + location: SourceLocation(pos=1323, lineno=35, colno=15) end_location: SourceLocation(pos=1327, lineno=35, colno=19) value: 'type' @@ -1113,11 +1025,7 @@ end_location: SourceLocation(pos=1333, lineno=35, colno=25) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1328, lineno=35, colno=20) - end_location: SourceLocation(pos=1333, lineno=35, colno=25) - value: 'sheep' + path: 'sheep' location: SourceLocation(pos=1335, lineno=35, colno=27) end_location: SourceLocation(pos=1357, lineno=35, colno=49) @@ -1154,7 +1062,7 @@ end_location: SourceLocation(pos=1385, lineno=36, colno=28) inverted: False key: - + location: SourceLocation(pos=1372, lineno=36, colno=15) end_location: SourceLocation(pos=1376, lineno=36, colno=19) value: 'type' @@ -1164,11 +1072,7 @@ end_location: SourceLocation(pos=1385, lineno=36, colno=28) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1377, lineno=36, colno=20) - end_location: SourceLocation(pos=1385, lineno=36, colno=28) - value: 'villager' + path: 'villager' location: SourceLocation(pos=1387, lineno=36, colno=30) end_location: SourceLocation(pos=1429, lineno=36, colno=72) @@ -1193,7 +1097,7 @@ location: SourceLocation(pos=1413, lineno=36, colno=56) end_location: SourceLocation(pos=1428, lineno=36, colno=71) key: - + location: SourceLocation(pos=1413, lineno=36, colno=56) end_location: SourceLocation(pos=1425, lineno=36, colno=68) value: 'Invulnerable' @@ -1222,7 +1126,7 @@ end_location: SourceLocation(pos=1454, lineno=37, colno=25) inverted: False key: - + location: SourceLocation(pos=1444, lineno=37, colno=15) end_location: SourceLocation(pos=1448, lineno=37, colno=19) value: 'type' @@ -1232,11 +1136,7 @@ end_location: SourceLocation(pos=1454, lineno=37, colno=25) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1449, lineno=37, colno=20) - end_location: SourceLocation(pos=1454, lineno=37, colno=25) - value: 'sheep' + path: 'sheep' location: SourceLocation(pos=1456, lineno=37, colno=27) end_location: SourceLocation(pos=1475, lineno=37, colno=46) @@ -1299,7 +1199,7 @@ end_location: SourceLocation(pos=1500, lineno=38, colno=25) inverted: False key: - + location: SourceLocation(pos=1490, lineno=38, colno=15) end_location: SourceLocation(pos=1494, lineno=38, colno=19) value: 'type' @@ -1309,11 +1209,7 @@ end_location: SourceLocation(pos=1500, lineno=38, colno=25) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1495, lineno=38, colno=20) - end_location: SourceLocation(pos=1500, lineno=38, colno=25) - value: 'sheep' + path: 'sheep' location: SourceLocation(pos=1502, lineno=38, colno=27) end_location: SourceLocation(pos=1513, lineno=38, colno=38) @@ -1607,7 +1503,7 @@ end_location: SourceLocation(pos=1681, lineno=42, colno=27) inverted: True key: - + location: SourceLocation(pos=1669, lineno=42, colno=15) end_location: SourceLocation(pos=1673, lineno=42, colno=19) value: 'type' @@ -1617,11 +1513,7 @@ end_location: SourceLocation(pos=1681, lineno=42, colno=27) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1675, lineno=42, colno=21) - end_location: SourceLocation(pos=1681, lineno=42, colno=27) - value: 'player' + path: 'player' location: SourceLocation(pos=1683, lineno=42, colno=29) end_location: SourceLocation(pos=1727, lineno=42, colno=73) @@ -1644,7 +1536,7 @@ variable: 'p' arguments: - + location: SourceLocation(pos=1706, lineno=42, colno=52) end_location: SourceLocation(pos=1710, lineno=42, colno=56) value: 'feet' @@ -1700,11 +1592,7 @@ end_location: SourceLocation(pos=1746, lineno=43, colno=19) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1739, lineno=43, colno=12) - end_location: SourceLocation(pos=1746, lineno=43, colno=19) - value: 'the_end' + path: 'the_end' location: SourceLocation(pos=1747, lineno=43, colno=20) end_location: SourceLocation(pos=1765, lineno=43, colno=38) @@ -1730,16 +1618,8 @@ location: SourceLocation(pos=1777, lineno=44, colno=12) end_location: SourceLocation(pos=1797, lineno=44, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=1777, lineno=44, colno=12) - end_location: SourceLocation(pos=1786, lineno=44, colno=21) - value: 'minecraft' - path: - - location: SourceLocation(pos=1787, lineno=44, colno=22) - end_location: SourceLocation(pos=1797, lineno=44, colno=32) - value: 'the_nether' + namespace: 'minecraft' + path: 'the_nether' location: SourceLocation(pos=1798, lineno=44, colno=33) end_location: SourceLocation(pos=1827, lineno=44, colno=62) @@ -1796,16 +1676,8 @@ location: SourceLocation(pos=1839, lineno=45, colno=12) end_location: SourceLocation(pos=1859, lineno=45, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=1839, lineno=45, colno=12) - end_location: SourceLocation(pos=1848, lineno=45, colno=21) - value: 'minecraft' - path: - - location: SourceLocation(pos=1849, lineno=45, colno=22) - end_location: SourceLocation(pos=1859, lineno=45, colno=32) - value: 'the_nether' + namespace: 'minecraft' + path: 'the_nether' location: SourceLocation(pos=1860, lineno=45, colno=33) end_location: SourceLocation(pos=1872, lineno=45, colno=45) @@ -1851,16 +1723,8 @@ location: SourceLocation(pos=1884, lineno=46, colno=12) end_location: SourceLocation(pos=1904, lineno=46, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=1884, lineno=46, colno=12) - end_location: SourceLocation(pos=1893, lineno=46, colno=21) - value: 'minecraft' - path: - - location: SourceLocation(pos=1894, lineno=46, colno=22) - end_location: SourceLocation(pos=1904, lineno=46, colno=32) - value: 'the_nether' + namespace: 'minecraft' + path: 'the_nether' location: SourceLocation(pos=1905, lineno=46, colno=33) end_location: SourceLocation(pos=1918, lineno=46, colno=46) @@ -1954,7 +1818,7 @@ end_location: SourceLocation(pos=1988, lineno=48, colno=25) inverted: False key: - + location: SourceLocation(pos=1978, lineno=48, colno=15) end_location: SourceLocation(pos=1982, lineno=48, colno=19) value: 'type' @@ -1964,11 +1828,7 @@ end_location: SourceLocation(pos=1988, lineno=48, colno=25) is_tag: False namespace: None - path: - - location: SourceLocation(pos=1983, lineno=48, colno=20) - end_location: SourceLocation(pos=1988, lineno=48, colno=25) - value: 'sheep' + path: 'sheep' location: SourceLocation(pos=1990, lineno=48, colno=27) end_location: SourceLocation(pos=2026, lineno=48, colno=63) @@ -2048,7 +1908,7 @@ end_location: SourceLocation(pos=2051, lineno=49, colno=25) inverted: False key: - + location: SourceLocation(pos=2041, lineno=49, colno=15) end_location: SourceLocation(pos=2045, lineno=49, colno=19) value: 'type' @@ -2058,11 +1918,7 @@ end_location: SourceLocation(pos=2051, lineno=49, colno=25) is_tag: False namespace: None - path: - - location: SourceLocation(pos=2046, lineno=49, colno=20) - end_location: SourceLocation(pos=2051, lineno=49, colno=25) - value: 'sheep' + path: 'sheep' location: SourceLocation(pos=2053, lineno=49, colno=27) end_location: SourceLocation(pos=2100, lineno=49, colno=74) @@ -2184,11 +2040,7 @@ end_location: SourceLocation(pos=2143, lineno=50, colno=43) is_tag: True namespace: None - path: - - location: SourceLocation(pos=2139, lineno=50, colno=39) - end_location: SourceLocation(pos=2143, lineno=50, colno=43) - value: 'wool' + path: 'wool' block_states: data_tags: None @@ -2224,7 +2076,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2176, lineno=51, colno=21) end_location: SourceLocation(pos=2177, lineno=51, colno=22) value: 'A' @@ -2234,7 +2086,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2183, lineno=51, colno=28) end_location: SourceLocation(pos=2184, lineno=51, colno=29) value: 'B' @@ -2269,7 +2121,7 @@ location: SourceLocation(pos=2217, lineno=52, colno=33) end_location: SourceLocation(pos=2285, lineno=52, colno=101) components: - + location: SourceLocation(pos=2217, lineno=52, colno=33) end_location: SourceLocation(pos=2226, lineno=52, colno=42) value: 'Inventory' @@ -2285,7 +2137,7 @@ location: SourceLocation(pos=2228, lineno=52, colno=44) end_location: SourceLocation(pos=2236, lineno=52, colno=52) key: - + location: SourceLocation(pos=2228, lineno=52, colno=44) end_location: SourceLocation(pos=2232, lineno=52, colno=48) value: 'Slot' @@ -2294,11 +2146,11 @@ location: SourceLocation(pos=2234, lineno=52, colno=50) end_location: SourceLocation(pos=2236, lineno=52, colno=52) value: Byte(0) - + location: SourceLocation(pos=2239, lineno=52, colno=55) end_location: SourceLocation(pos=2242, lineno=52, colno=58) value: 'tag' - + location: SourceLocation(pos=2243, lineno=52, colno=59) end_location: SourceLocation(pos=2255, lineno=52, colno=71) value: 'Enchantments' @@ -2314,7 +2166,7 @@ location: SourceLocation(pos=2257, lineno=52, colno=73) end_location: SourceLocation(pos=2283, lineno=52, colno=99) key: - + location: SourceLocation(pos=2257, lineno=52, colno=73) end_location: SourceLocation(pos=2259, lineno=52, colno=75) value: 'id' @@ -2392,7 +2244,7 @@ end_location: SourceLocation(pos=2362, lineno=53, colno=60) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=2332, lineno=53, colno=30) end_location: SourceLocation(pos=2336, lineno=53, colno=34) value: 'eyes' @@ -2415,11 +2267,7 @@ end_location: SourceLocation(pos=2355, lineno=53, colno=53) is_tag: False namespace: None - path: - - location: SourceLocation(pos=2350, lineno=53, colno=48) - end_location: SourceLocation(pos=2355, lineno=53, colno=53) - value: 'smoke' + path: 'smoke' parameters: None location: SourceLocation(pos=2356, lineno=53, colno=54) @@ -2462,7 +2310,7 @@ end_location: SourceLocation(pos=2385, lineno=54, colno=23) inverted: False key: - + location: SourceLocation(pos=2377, lineno=54, colno=15) end_location: SourceLocation(pos=2381, lineno=54, colno=19) value: 'type' @@ -2472,11 +2320,7 @@ end_location: SourceLocation(pos=2385, lineno=54, colno=23) is_tag: False namespace: None - path: - - location: SourceLocation(pos=2382, lineno=54, colno=20) - end_location: SourceLocation(pos=2385, lineno=54, colno=23) - value: 'pig' + path: 'pig' location: SourceLocation(pos=2387, lineno=54, colno=25) end_location: SourceLocation(pos=2457, lineno=54, colno=95) @@ -2503,11 +2347,11 @@ location: SourceLocation(pos=2417, lineno=54, colno=55) end_location: SourceLocation(pos=2423, lineno=54, colno=61) components: - + location: SourceLocation(pos=2417, lineno=54, colno=55) end_location: SourceLocation(pos=2423, lineno=54, colno=61) value: 'Saddle' - + location: SourceLocation(pos=2429, lineno=54, colno=67) end_location: SourceLocation(pos=2430, lineno=54, colno=68) value: 1 @@ -2526,7 +2370,7 @@ end_location: SourceLocation(pos=2456, lineno=54, colno=94) inverted: False key: - + location: SourceLocation(pos=2444, lineno=54, colno=82) end_location: SourceLocation(pos=2452, lineno=54, colno=90) value: 'distance' @@ -2598,11 +2442,7 @@ end_location: SourceLocation(pos=2498, lineno=55, colno=41) is_tag: False namespace: None - path: - - location: SourceLocation(pos=2493, lineno=55, colno=36) - end_location: SourceLocation(pos=2498, lineno=55, colno=41) - value: 'water' + path: 'water' block_states: data_tags: None @@ -2619,20 +2459,32 @@ location: SourceLocation(pos=2507, lineno=55, colno=50) end_location: SourceLocation(pos=2528, lineno=55, colno=71) - words: - + fragments: + location: SourceLocation(pos=2507, lineno=55, colno=50) end_location: SourceLocation(pos=2510, lineno=55, colno=53) value: '"My' - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=2511, lineno=55, colno=54) end_location: SourceLocation(pos=2515, lineno=55, colno=58) value: 'feet' - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=2516, lineno=55, colno=59) end_location: SourceLocation(pos=2519, lineno=55, colno=62) value: 'are' - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=2520, lineno=55, colno=63) end_location: SourceLocation(pos=2528, lineno=55, colno=71) value: 'soaked!"' @@ -2663,7 +2515,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2559, lineno=56, colno=31) end_location: SourceLocation(pos=2563, lineno=56, colno=35) value: 'test' @@ -2673,7 +2525,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2569, lineno=56, colno=41) end_location: SourceLocation(pos=2573, lineno=56, colno=45) value: 'test' @@ -2690,16 +2542,24 @@ location: SourceLocation(pos=2582, lineno=56, colno=54) end_location: SourceLocation(pos=2598, lineno=56, colno=70) - words: - + fragments: + location: SourceLocation(pos=2582, lineno=56, colno=54) end_location: SourceLocation(pos=2588, lineno=56, colno=60) value: '"Score' - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=2589, lineno=56, colno=61) end_location: SourceLocation(pos=2591, lineno=56, colno=63) value: 'is' - + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + location: SourceLocation(pos=2592, lineno=56, colno=64) end_location: SourceLocation(pos=2598, lineno=56, colno=70) value: 'reset"' @@ -2734,7 +2594,7 @@ end_location: SourceLocation(pos=2627, lineno=57, colno=29) inverted: False key: - + location: SourceLocation(pos=2619, lineno=57, colno=21) end_location: SourceLocation(pos=2623, lineno=57, colno=25) value: 'type' @@ -2744,17 +2604,13 @@ end_location: SourceLocation(pos=2627, lineno=57, colno=29) is_tag: False namespace: None - path: - - location: SourceLocation(pos=2624, lineno=57, colno=26) - end_location: SourceLocation(pos=2627, lineno=57, colno=29) - value: 'pig' + path: 'pig' location: SourceLocation(pos=2628, lineno=57, colno=30) end_location: SourceLocation(pos=2640, lineno=57, colno=42) inverted: False key: - + location: SourceLocation(pos=2628, lineno=57, colno=30) end_location: SourceLocation(pos=2636, lineno=57, colno=38) value: 'distance' @@ -2788,7 +2644,7 @@ location: SourceLocation(pos=2668, lineno=57, colno=70) end_location: SourceLocation(pos=2694, lineno=57, colno=96) key: - + location: SourceLocation(pos=2668, lineno=57, colno=70) end_location: SourceLocation(pos=2674, lineno=57, colno=76) value: 'Motion' @@ -2902,16 +2758,8 @@ location: SourceLocation(pos=2755, lineno=59, colno=12) end_location: SourceLocation(pos=2775, lineno=59, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=2755, lineno=59, colno=12) - end_location: SourceLocation(pos=2764, lineno=59, colno=21) - value: 'minecraft' - path: - - location: SourceLocation(pos=2765, lineno=59, colno=22) - end_location: SourceLocation(pos=2775, lineno=59, colno=32) - value: 'the_nether' + namespace: 'minecraft' + path: 'the_nether' location: SourceLocation(pos=2776, lineno=59, colno=33) end_location: SourceLocation(pos=2794, lineno=59, colno=51) @@ -2968,16 +2816,8 @@ location: SourceLocation(pos=2812, lineno=60, colno=18) end_location: SourceLocation(pos=2829, lineno=60, colno=35) is_tag: False - namespace: - - location: SourceLocation(pos=2812, lineno=60, colno=18) - end_location: SourceLocation(pos=2821, lineno=60, colno=27) - value: 'minecraft' - path: - - location: SourceLocation(pos=2822, lineno=60, colno=28) - end_location: SourceLocation(pos=2829, lineno=60, colno=35) - value: 'the_end' + namespace: 'minecraft' + path: 'the_end' location: SourceLocation(pos=2830, lineno=60, colno=36) end_location: SourceLocation(pos=2851, lineno=60, colno=57) @@ -3019,7 +2859,7 @@ end_location: SourceLocation(pos=2916, lineno=61, colno=65) identifier: 'execute:as:targets:subcommand' arguments: - + location: SourceLocation(pos=2863, lineno=61, colno=12) end_location: SourceLocation(pos=2868, lineno=61, colno=17) value: 'Alice' @@ -3032,16 +2872,8 @@ location: SourceLocation(pos=2872, lineno=61, colno=21) end_location: SourceLocation(pos=2891, lineno=61, colno=40) is_tag: False - namespace: - - location: SourceLocation(pos=2872, lineno=61, colno=21) - end_location: SourceLocation(pos=2881, lineno=61, colno=30) - value: 'minecraft' - path: - - location: SourceLocation(pos=2882, lineno=61, colno=31) - end_location: SourceLocation(pos=2891, lineno=61, colno=40) - value: 'overworld' + namespace: 'minecraft' + path: 'overworld' location: SourceLocation(pos=2892, lineno=61, colno=41) end_location: SourceLocation(pos=2916, lineno=61, colno=65) @@ -3078,7 +2910,7 @@ end_location: SourceLocation(pos=2959, lineno=63, colno=30) identifier: 'experience:query:targets:levels' arguments: - + location: SourceLocation(pos=2947, lineno=63, colno=18) end_location: SourceLocation(pos=2952, lineno=63, colno=23) value: 'Steve' @@ -3137,16 +2969,8 @@ location: SourceLocation(pos=2996, lineno=65, colno=30) end_location: SourceLocation(pos=3016, lineno=65, colno=50) is_tag: False - namespace: - - location: SourceLocation(pos=2996, lineno=65, colno=30) - end_location: SourceLocation(pos=3005, lineno=65, colno=39) - value: 'minecraft' - path: - - location: SourceLocation(pos=3006, lineno=65, colno=40) - end_location: SourceLocation(pos=3016, lineno=65, colno=50) - value: 'gold_block' + namespace: 'minecraft' + path: 'gold_block' block_states: data_tags: None @@ -3158,16 +2982,8 @@ location: SourceLocation(pos=3025, lineno=65, colno=59) end_location: SourceLocation(pos=3059, lineno=65, colno=93) is_tag: False - namespace: - - location: SourceLocation(pos=3025, lineno=65, colno=59) - end_location: SourceLocation(pos=3034, lineno=65, colno=68) - value: 'minecraft' - path: - - location: SourceLocation(pos=3035, lineno=65, colno=69) - end_location: SourceLocation(pos=3059, lineno=65, colno=93) - value: 'orange_glazed_terracotta' + namespace: 'minecraft' + path: 'orange_glazed_terracotta' block_states: data_tags: None @@ -3227,11 +3043,7 @@ end_location: SourceLocation(pos=3092, lineno=66, colno=33) is_tag: False namespace: None - path: - - location: SourceLocation(pos=3087, lineno=66, colno=28) - end_location: SourceLocation(pos=3092, lineno=66, colno=33) - value: 'water' + path: 'water' block_states: data_tags: None @@ -3290,16 +3102,8 @@ location: SourceLocation(pos=3117, lineno=67, colno=25) end_location: SourceLocation(pos=3132, lineno=67, colno=40) is_tag: False - namespace: - - location: SourceLocation(pos=3117, lineno=67, colno=25) - end_location: SourceLocation(pos=3126, lineno=67, colno=34) - value: 'minecraft' - path: - - location: SourceLocation(pos=3127, lineno=67, colno=35) - end_location: SourceLocation(pos=3132, lineno=67, colno=40) - value: 'stone' + namespace: 'minecraft' + path: 'stone' block_states: data_tags: None @@ -3359,11 +3163,7 @@ end_location: SourceLocation(pos=3177, lineno=68, colno=38) is_tag: False namespace: None - path: - - location: SourceLocation(pos=3172, lineno=68, colno=33) - end_location: SourceLocation(pos=3177, lineno=68, colno=38) - value: 'stone' + path: 'stone' block_states: data_tags: None @@ -3422,27 +3222,19 @@ location: SourceLocation(pos=3198, lineno=69, colno=21) end_location: SourceLocation(pos=3231, lineno=69, colno=54) is_tag: False - namespace: - - location: SourceLocation(pos=3198, lineno=69, colno=21) - end_location: SourceLocation(pos=3207, lineno=69, colno=30) - value: 'minecraft' - path: - - location: SourceLocation(pos=3208, lineno=69, colno=31) - end_location: SourceLocation(pos=3231, lineno=69, colno=54) - value: 'prismarine_brick_stairs' + namespace: 'minecraft' + path: 'prismarine_brick_stairs' block_states: location: SourceLocation(pos=3232, lineno=69, colno=55) end_location: SourceLocation(pos=3244, lineno=69, colno=67) key: - + location: SourceLocation(pos=3232, lineno=69, colno=55) end_location: SourceLocation(pos=3238, lineno=69, colno=61) value: 'facing' value: - + location: SourceLocation(pos=3239, lineno=69, colno=62) end_location: SourceLocation(pos=3244, lineno=69, colno=67) value: 'south' @@ -3450,12 +3242,12 @@ location: SourceLocation(pos=3245, lineno=69, colno=68) end_location: SourceLocation(pos=3261, lineno=69, colno=84) key: - + location: SourceLocation(pos=3245, lineno=69, colno=68) end_location: SourceLocation(pos=3256, lineno=69, colno=79) value: 'waterlogged' value: - + location: SourceLocation(pos=3257, lineno=69, colno=80) end_location: SourceLocation(pos=3261, lineno=69, colno=84) value: 'true' @@ -3469,16 +3261,8 @@ location: SourceLocation(pos=3283, lineno=71, colno=10) end_location: SourceLocation(pos=3302, lineno=71, colno=29) is_tag: False - namespace: - - location: SourceLocation(pos=3283, lineno=71, colno=10) - end_location: SourceLocation(pos=3289, lineno=71, colno=16) - value: 'custom' - path: - - location: SourceLocation(pos=3290, lineno=71, colno=17) - end_location: SourceLocation(pos=3302, lineno=71, colno=29) - value: 'example/test' + namespace: 'custom' + path: 'example/test' location: SourceLocation(pos=3303, lineno=72, colno=1) end_location: SourceLocation(pos=3332, lineno=72, colno=30) @@ -3488,16 +3272,8 @@ location: SourceLocation(pos=3312, lineno=72, colno=10) end_location: SourceLocation(pos=3332, lineno=72, colno=30) is_tag: True - namespace: - - location: SourceLocation(pos=3313, lineno=72, colno=11) - end_location: SourceLocation(pos=3319, lineno=72, colno=17) - value: 'custom' - path: - - location: SourceLocation(pos=3320, lineno=72, colno=18) - end_location: SourceLocation(pos=3332, lineno=72, colno=30) - value: 'example/test' + namespace: 'custom' + path: 'example/test' location: SourceLocation(pos=3344, lineno=74, colno=1) end_location: SourceLocation(pos=3361, lineno=74, colno=18) @@ -3520,7 +3296,7 @@ end_location: SourceLocation(pos=3424, lineno=77, colno=31) identifier: 'gamerule:doDaylightCycle:value' arguments: - + location: SourceLocation(pos=3419, lineno=77, colno=26) end_location: SourceLocation(pos=3424, lineno=77, colno=31) value: False @@ -3529,7 +3305,7 @@ end_location: SourceLocation(pos=3459, lineno=78, colno=35) identifier: 'gamerule:naturalRegeneration:value' arguments: - + location: SourceLocation(pos=3454, lineno=78, colno=30) end_location: SourceLocation(pos=3459, lineno=78, colno=35) value: False @@ -3538,7 +3314,7 @@ end_location: SourceLocation(pos=3486, lineno=79, colno=27) identifier: 'gamerule:mobGriefing:value' arguments: - + location: SourceLocation(pos=3481, lineno=79, colno=22) end_location: SourceLocation(pos=3486, lineno=79, colno=27) value: False @@ -3547,7 +3323,7 @@ end_location: SourceLocation(pos=3516, lineno=80, colno=30) identifier: 'gamerule:doWeatherCycle:value' arguments: - + location: SourceLocation(pos=3511, lineno=80, colno=25) end_location: SourceLocation(pos=3516, lineno=80, colno=30) value: False @@ -3556,7 +3332,7 @@ end_location: SourceLocation(pos=3544, lineno=81, colno=28) identifier: 'gamerule:keepInventory:value' arguments: - + location: SourceLocation(pos=3540, lineno=81, colno=24) end_location: SourceLocation(pos=3544, lineno=81, colno=28) value: True @@ -3565,7 +3341,7 @@ end_location: SourceLocation(pos=3578, lineno=82, colno=34) identifier: 'gamerule:commandBlockOutput:value' arguments: - + location: SourceLocation(pos=3573, lineno=82, colno=29) end_location: SourceLocation(pos=3578, lineno=82, colno=34) value: False @@ -3574,7 +3350,7 @@ end_location: SourceLocation(pos=3604, lineno=83, colno=26) identifier: 'gamerule:doInsomnia:value' arguments: - + location: SourceLocation(pos=3599, lineno=83, colno=21) end_location: SourceLocation(pos=3604, lineno=83, colno=26) value: False @@ -3597,16 +3373,8 @@ location: SourceLocation(pos=3620, lineno=85, colno=9) end_location: SourceLocation(pos=3643, lineno=85, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=3620, lineno=85, colno=9) - end_location: SourceLocation(pos=3629, lineno=85, colno=18) - value: 'minecraft' - path: - - location: SourceLocation(pos=3630, lineno=85, colno=19) - end_location: SourceLocation(pos=3643, lineno=85, colno=32) - value: 'diamond_sword' + namespace: 'minecraft' + path: 'diamond_sword' data_tags: location: SourceLocation(pos=3643, lineno=85, colno=32) @@ -3616,7 +3384,7 @@ location: SourceLocation(pos=3644, lineno=85, colno=33) end_location: SourceLocation(pos=3685, lineno=85, colno=74) key: - + location: SourceLocation(pos=3644, lineno=85, colno=33) end_location: SourceLocation(pos=3651, lineno=85, colno=40) value: 'display' @@ -3629,7 +3397,7 @@ location: SourceLocation(pos=3654, lineno=85, colno=43) end_location: SourceLocation(pos=3684, lineno=85, colno=73) key: - + location: SourceLocation(pos=3654, lineno=85, colno=43) end_location: SourceLocation(pos=3658, lineno=85, colno=47) value: 'Lore' @@ -3642,7 +3410,7 @@ location: SourceLocation(pos=3661, lineno=85, colno=50) end_location: SourceLocation(pos=3683, lineno=85, colno=72) value: String('"A legendary weapon"') - + location: SourceLocation(pos=3687, lineno=85, colno=76) end_location: SourceLocation(pos=3688, lineno=85, colno=77) value: 1 @@ -3666,11 +3434,7 @@ end_location: SourceLocation(pos=3703, lineno=86, colno=15) is_tag: False namespace: None - path: - - location: SourceLocation(pos=3697, lineno=86, colno=9) - end_location: SourceLocation(pos=3703, lineno=86, colno=15) - value: 'potion' + path: 'potion' data_tags: location: SourceLocation(pos=3703, lineno=86, colno=15) @@ -3680,7 +3444,7 @@ location: SourceLocation(pos=3704, lineno=86, colno=16) end_location: SourceLocation(pos=3736, lineno=86, colno=48) key: - + location: SourceLocation(pos=3704, lineno=86, colno=16) end_location: SourceLocation(pos=3710, lineno=86, colno=22) value: 'Potion' @@ -3689,7 +3453,7 @@ location: SourceLocation(pos=3712, lineno=86, colno=24) end_location: SourceLocation(pos=3736, lineno=86, colno=48) value: String('minecraft:night_vision') - + location: SourceLocation(pos=3738, lineno=86, colno=50) end_location: SourceLocation(pos=3739, lineno=86, colno=51) value: 1 @@ -3713,11 +3477,7 @@ end_location: SourceLocation(pos=3761, lineno=87, colno=22) is_tag: False namespace: None - path: - - location: SourceLocation(pos=3748, lineno=87, colno=9) - end_location: SourceLocation(pos=3761, lineno=87, colno=22) - value: 'diamond_sword' + path: 'diamond_sword' data_tags: location: SourceLocation(pos=3761, lineno=87, colno=22) @@ -3727,7 +3487,7 @@ location: SourceLocation(pos=3762, lineno=87, colno=23) end_location: SourceLocation(pos=3814, lineno=87, colno=75) key: - + location: SourceLocation(pos=3762, lineno=87, colno=23) end_location: SourceLocation(pos=3774, lineno=87, colno=35) value: 'Enchantments' @@ -3744,7 +3504,7 @@ location: SourceLocation(pos=3778, lineno=87, colno=39) end_location: SourceLocation(pos=3803, lineno=87, colno=64) key: - + location: SourceLocation(pos=3778, lineno=87, colno=39) end_location: SourceLocation(pos=3780, lineno=87, colno=41) value: 'id' @@ -3757,7 +3517,7 @@ location: SourceLocation(pos=3805, lineno=87, colno=66) end_location: SourceLocation(pos=3812, lineno=87, colno=73) key: - + location: SourceLocation(pos=3805, lineno=87, colno=66) end_location: SourceLocation(pos=3808, lineno=87, colno=69) value: 'lvl' @@ -3766,7 +3526,7 @@ location: SourceLocation(pos=3810, lineno=87, colno=71) end_location: SourceLocation(pos=3812, lineno=87, colno=73) value: Int(10) - + location: SourceLocation(pos=3816, lineno=87, colno=77) end_location: SourceLocation(pos=3817, lineno=87, colno=78) value: 1 @@ -3789,16 +3549,8 @@ location: SourceLocation(pos=3826, lineno=88, colno=9) end_location: SourceLocation(pos=3849, lineno=88, colno=32) is_tag: False - namespace: - - location: SourceLocation(pos=3826, lineno=88, colno=9) - end_location: SourceLocation(pos=3835, lineno=88, colno=18) - value: 'minecraft' - path: - - location: SourceLocation(pos=3836, lineno=88, colno=19) - end_location: SourceLocation(pos=3849, lineno=88, colno=32) - value: 'diamond_block' + namespace: 'minecraft' + path: 'diamond_block' data_tags: location: SourceLocation(pos=3849, lineno=88, colno=32) @@ -3808,7 +3560,7 @@ location: SourceLocation(pos=3850, lineno=88, colno=33) end_location: SourceLocation(pos=3880, lineno=88, colno=63) key: - + location: SourceLocation(pos=3850, lineno=88, colno=33) end_location: SourceLocation(pos=3860, lineno=88, colno=43) value: 'CanPlaceOn' @@ -3841,11 +3593,7 @@ end_location: SourceLocation(pos=3896, lineno=89, colno=15) is_tag: False namespace: None - path: - - location: SourceLocation(pos=3890, lineno=89, colno=9) - end_location: SourceLocation(pos=3896, lineno=89, colno=15) - value: 'potion' + path: 'potion' data_tags: location: SourceLocation(pos=3896, lineno=89, colno=15) @@ -3855,7 +3603,7 @@ location: SourceLocation(pos=3897, lineno=89, colno=16) end_location: SourceLocation(pos=3949, lineno=89, colno=68) key: - + location: SourceLocation(pos=3897, lineno=89, colno=16) end_location: SourceLocation(pos=3909, lineno=89, colno=28) value: 'Enchantments' @@ -3872,7 +3620,7 @@ location: SourceLocation(pos=3913, lineno=89, colno=32) end_location: SourceLocation(pos=3938, lineno=89, colno=57) key: - + location: SourceLocation(pos=3913, lineno=89, colno=32) end_location: SourceLocation(pos=3915, lineno=89, colno=34) value: 'id' @@ -3885,7 +3633,7 @@ location: SourceLocation(pos=3940, lineno=89, colno=59) end_location: SourceLocation(pos=3947, lineno=89, colno=66) key: - + location: SourceLocation(pos=3940, lineno=89, colno=59) end_location: SourceLocation(pos=3943, lineno=89, colno=62) value: 'lvl' @@ -3898,7 +3646,7 @@ location: SourceLocation(pos=3951, lineno=89, colno=70) end_location: SourceLocation(pos=3996, lineno=89, colno=115) key: - + location: SourceLocation(pos=3951, lineno=89, colno=70) end_location: SourceLocation(pos=3970, lineno=89, colno=89) value: 'CustomPotionEffects' @@ -3915,7 +3663,7 @@ location: SourceLocation(pos=3974, lineno=89, colno=93) end_location: SourceLocation(pos=3980, lineno=89, colno=99) key: - + location: SourceLocation(pos=3974, lineno=89, colno=93) end_location: SourceLocation(pos=3976, lineno=89, colno=95) value: 'Id' @@ -3928,7 +3676,7 @@ location: SourceLocation(pos=3982, lineno=89, colno=101) end_location: SourceLocation(pos=3994, lineno=89, colno=113) key: - + location: SourceLocation(pos=3982, lineno=89, colno=101) end_location: SourceLocation(pos=3991, lineno=89, colno=110) value: 'Amplifier' @@ -3937,7 +3685,7 @@ location: SourceLocation(pos=3993, lineno=89, colno=112) end_location: SourceLocation(pos=3994, lineno=89, colno=113) value: Int(1) - + location: SourceLocation(pos=3998, lineno=89, colno=117) end_location: SourceLocation(pos=3999, lineno=89, colno=118) value: 1 @@ -3967,7 +3715,7 @@ end_location: SourceLocation(pos=4032, lineno=91, colno=26) type: 'relative' value: 0 - + location: SourceLocation(pos=4033, lineno=91, colno=27) end_location: SourceLocation(pos=4045, lineno=91, colno=39) value: 'container.26' @@ -3979,18 +3727,10 @@ location: SourceLocation(pos=4051, lineno=91, colno=45) end_location: SourceLocation(pos=4075, lineno=91, colno=69) is_tag: False - namespace: - - location: SourceLocation(pos=4051, lineno=91, colno=45) - end_location: SourceLocation(pos=4060, lineno=91, colno=54) - value: 'minecraft' - path: - - location: SourceLocation(pos=4061, lineno=91, colno=55) - end_location: SourceLocation(pos=4075, lineno=91, colno=69) - value: 'spruce_sapling' + namespace: 'minecraft' + path: 'spruce_sapling' data_tags: None - + location: SourceLocation(pos=4076, lineno=91, colno=70) end_location: SourceLocation(pos=4077, lineno=91, colno=71) value: 4 @@ -4005,7 +3745,7 @@ variable: 'p' arguments: - + location: SourceLocation(pos=4101, lineno=92, colno=24) end_location: SourceLocation(pos=4109, lineno=92, colno=32) value: 'hotbar.8' @@ -4017,18 +3757,10 @@ location: SourceLocation(pos=4115, lineno=92, colno=38) end_location: SourceLocation(pos=4139, lineno=92, colno=62) is_tag: False - namespace: - - location: SourceLocation(pos=4115, lineno=92, colno=38) - end_location: SourceLocation(pos=4124, lineno=92, colno=47) - value: 'minecraft' - path: - - location: SourceLocation(pos=4125, lineno=92, colno=48) - end_location: SourceLocation(pos=4139, lineno=92, colno=62) - value: 'spruce_sapling' + namespace: 'minecraft' + path: 'spruce_sapling' data_tags: None - + location: SourceLocation(pos=4140, lineno=92, colno=63) end_location: SourceLocation(pos=4141, lineno=92, colno=64) value: 4 @@ -4043,7 +3775,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=4165, lineno=93, colno=24) end_location: SourceLocation(pos=4179, lineno=93, colno=38) value: 'weapon.offhand' @@ -4053,7 +3785,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=4195, lineno=93, colno=54) end_location: SourceLocation(pos=4210, lineno=93, colno=69) value: 'weapon.mainhand' @@ -4073,7 +3805,7 @@ end_location: SourceLocation(pos=4236, lineno=96, colno=11) identifier: 'kill:targets' arguments: - + location: SourceLocation(pos=4231, lineno=96, colno=6) end_location: SourceLocation(pos=4236, lineno=96, colno=11) value: 'Steve' @@ -4092,7 +3824,7 @@ end_location: SourceLocation(pos=4254, lineno=97, colno=18) inverted: False key: - + location: SourceLocation(pos=4245, lineno=97, colno=9) end_location: SourceLocation(pos=4249, lineno=97, colno=13) value: 'type' @@ -4102,11 +3834,7 @@ end_location: SourceLocation(pos=4254, lineno=97, colno=18) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4250, lineno=97, colno=14) - end_location: SourceLocation(pos=4254, lineno=97, colno=18) - value: 'item' + path: 'item' location: SourceLocation(pos=4256, lineno=98, colno=1) end_location: SourceLocation(pos=4278, lineno=98, colno=23) @@ -4122,7 +3850,7 @@ end_location: SourceLocation(pos=4277, lineno=98, colno=22) inverted: False key: - + location: SourceLocation(pos=4264, lineno=98, colno=9) end_location: SourceLocation(pos=4272, lineno=98, colno=17) value: 'distance' @@ -4147,7 +3875,7 @@ end_location: SourceLocation(pos=4299, lineno=99, colno=21) inverted: True key: - + location: SourceLocation(pos=4287, lineno=99, colno=9) end_location: SourceLocation(pos=4291, lineno=99, colno=13) value: 'type' @@ -4157,11 +3885,7 @@ end_location: SourceLocation(pos=4299, lineno=99, colno=21) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4293, lineno=99, colno=15) - end_location: SourceLocation(pos=4299, lineno=99, colno=21) - value: 'player' + path: 'player' location: SourceLocation(pos=4301, lineno=100, colno=1) end_location: SourceLocation(pos=4336, lineno=100, colno=36) @@ -4177,7 +3901,7 @@ end_location: SourceLocation(pos=4322, lineno=100, colno=22) inverted: False key: - + location: SourceLocation(pos=4309, lineno=100, colno=9) end_location: SourceLocation(pos=4317, lineno=100, colno=17) value: 'distance' @@ -4192,7 +3916,7 @@ end_location: SourceLocation(pos=4335, lineno=100, colno=35) inverted: False key: - + location: SourceLocation(pos=4323, lineno=100, colno=23) end_location: SourceLocation(pos=4327, lineno=100, colno=27) value: 'type' @@ -4202,11 +3926,7 @@ end_location: SourceLocation(pos=4335, lineno=100, colno=35) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4328, lineno=100, colno=28) - end_location: SourceLocation(pos=4335, lineno=100, colno=35) - value: 'creeper' + path: 'creeper' location: SourceLocation(pos=4337, lineno=101, colno=1) end_location: SourceLocation(pos=4403, lineno=101, colno=67) @@ -4222,7 +3942,7 @@ end_location: SourceLocation(pos=4355, lineno=101, colno=19) inverted: False key: - + location: SourceLocation(pos=4345, lineno=101, colno=9) end_location: SourceLocation(pos=4349, lineno=101, colno=13) value: 'type' @@ -4232,17 +3952,13 @@ end_location: SourceLocation(pos=4355, lineno=101, colno=19) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4350, lineno=101, colno=14) - end_location: SourceLocation(pos=4355, lineno=101, colno=19) - value: 'arrow' + path: 'arrow' location: SourceLocation(pos=4356, lineno=101, colno=20) end_location: SourceLocation(pos=4402, lineno=101, colno=66) inverted: False key: - + location: SourceLocation(pos=4356, lineno=101, colno=20) end_location: SourceLocation(pos=4359, lineno=101, colno=23) value: 'nbt' @@ -4255,7 +3971,7 @@ location: SourceLocation(pos=4361, lineno=101, colno=25) end_location: SourceLocation(pos=4401, lineno=101, colno=65) key: - + location: SourceLocation(pos=4361, lineno=101, colno=25) end_location: SourceLocation(pos=4373, lineno=101, colno=37) value: 'inBlockState' @@ -4268,7 +3984,7 @@ location: SourceLocation(pos=4376, lineno=101, colno=40) end_location: SourceLocation(pos=4400, lineno=101, colno=64) key: - + location: SourceLocation(pos=4376, lineno=101, colno=40) end_location: SourceLocation(pos=4380, lineno=101, colno=44) value: 'Name' @@ -4297,8 +4013,8 @@ location: SourceLocation(pos=4441, lineno=105, colno=8) end_location: SourceLocation(pos=4443, lineno=105, colno=10) - words: - + fragments: + location: SourceLocation(pos=4441, lineno=105, colno=8) end_location: SourceLocation(pos=4443, lineno=105, colno=10) value: 'Hi' @@ -4316,32 +4032,28 @@ end_location: SourceLocation(pos=4468, lineno=107, colno=14) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4464, lineno=107, colno=10) - end_location: SourceLocation(pos=4468, lineno=107, colno=14) - value: 'dust' + path: 'dust' parameters: location: SourceLocation(pos=4469, lineno=107, colno=15) end_location: SourceLocation(pos=4484, lineno=107, colno=30) red: - + location: SourceLocation(pos=4469, lineno=107, colno=15) end_location: SourceLocation(pos=4472, lineno=107, colno=18) value: 1.0 green: - + location: SourceLocation(pos=4473, lineno=107, colno=19) end_location: SourceLocation(pos=4476, lineno=107, colno=22) value: 0.5 blue: - + location: SourceLocation(pos=4477, lineno=107, colno=23) end_location: SourceLocation(pos=4480, lineno=107, colno=26) value: 0.5 size: - + location: SourceLocation(pos=4481, lineno=107, colno=27) end_location: SourceLocation(pos=4484, lineno=107, colno=30) value: 1.0 @@ -4359,47 +4071,43 @@ end_location: SourceLocation(pos=4515, lineno=108, colno=31) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4494, lineno=108, colno=10) - end_location: SourceLocation(pos=4515, lineno=108, colno=31) - value: 'dust_color_transition' + path: 'dust_color_transition' parameters: location: SourceLocation(pos=4516, lineno=108, colno=32) end_location: SourceLocation(pos=4543, lineno=108, colno=59) red: - + location: SourceLocation(pos=4516, lineno=108, colno=32) end_location: SourceLocation(pos=4519, lineno=108, colno=35) value: 1.0 green: - + location: SourceLocation(pos=4520, lineno=108, colno=36) end_location: SourceLocation(pos=4523, lineno=108, colno=39) value: 0.0 blue: - + location: SourceLocation(pos=4524, lineno=108, colno=40) end_location: SourceLocation(pos=4527, lineno=108, colno=43) value: 0.0 size: - + location: SourceLocation(pos=4528, lineno=108, colno=44) end_location: SourceLocation(pos=4531, lineno=108, colno=47) value: 1.0 end_red: - + location: SourceLocation(pos=4532, lineno=108, colno=48) end_location: SourceLocation(pos=4535, lineno=108, colno=51) value: 0.0 end_green: - + location: SourceLocation(pos=4536, lineno=108, colno=52) end_location: SourceLocation(pos=4539, lineno=108, colno=55) value: 0.0 end_blue: - + location: SourceLocation(pos=4540, lineno=108, colno=56) end_location: SourceLocation(pos=4543, lineno=108, colno=59) value: 1.0 @@ -4417,11 +4125,7 @@ end_location: SourceLocation(pos=4558, lineno=109, colno=15) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4553, lineno=109, colno=10) - end_location: SourceLocation(pos=4558, lineno=109, colno=15) - value: 'block' + path: 'block' parameters: location: SourceLocation(pos=4559, lineno=109, colno=16) @@ -4435,27 +4139,19 @@ location: SourceLocation(pos=4559, lineno=109, colno=16) end_location: SourceLocation(pos=4580, lineno=109, colno=37) is_tag: False - namespace: - - location: SourceLocation(pos=4559, lineno=109, colno=16) - end_location: SourceLocation(pos=4568, lineno=109, colno=25) - value: 'minecraft' - path: - - location: SourceLocation(pos=4569, lineno=109, colno=26) - end_location: SourceLocation(pos=4580, lineno=109, colno=37) - value: 'grass_block' + namespace: 'minecraft' + path: 'grass_block' block_states: location: SourceLocation(pos=4581, lineno=109, colno=38) end_location: SourceLocation(pos=4591, lineno=109, colno=48) key: - + location: SourceLocation(pos=4581, lineno=109, colno=38) end_location: SourceLocation(pos=4586, lineno=109, colno=43) value: 'snowy' value: - + location: SourceLocation(pos=4587, lineno=109, colno=44) end_location: SourceLocation(pos=4591, lineno=109, colno=48) value: 'true' @@ -4474,11 +4170,7 @@ end_location: SourceLocation(pos=4614, lineno=110, colno=22) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4602, lineno=110, colno=10) - end_location: SourceLocation(pos=4614, lineno=110, colno=22) - value: 'falling_dust' + path: 'falling_dust' parameters: location: SourceLocation(pos=4615, lineno=110, colno=23) @@ -4492,27 +4184,19 @@ location: SourceLocation(pos=4615, lineno=110, colno=23) end_location: SourceLocation(pos=4636, lineno=110, colno=44) is_tag: False - namespace: - - location: SourceLocation(pos=4615, lineno=110, colno=23) - end_location: SourceLocation(pos=4624, lineno=110, colno=32) - value: 'minecraft' - path: - - location: SourceLocation(pos=4625, lineno=110, colno=33) - end_location: SourceLocation(pos=4636, lineno=110, colno=44) - value: 'grass_block' + namespace: 'minecraft' + path: 'grass_block' block_states: location: SourceLocation(pos=4637, lineno=110, colno=45) end_location: SourceLocation(pos=4647, lineno=110, colno=55) key: - + location: SourceLocation(pos=4637, lineno=110, colno=45) end_location: SourceLocation(pos=4642, lineno=110, colno=50) value: 'snowy' value: - + location: SourceLocation(pos=4643, lineno=110, colno=51) end_location: SourceLocation(pos=4647, lineno=110, colno=55) value: 'true' @@ -4531,11 +4215,7 @@ end_location: SourceLocation(pos=4662, lineno=111, colno=14) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4658, lineno=111, colno=10) - end_location: SourceLocation(pos=4662, lineno=111, colno=14) - value: 'item' + path: 'item' parameters: location: SourceLocation(pos=4663, lineno=111, colno=15) @@ -4549,16 +4229,8 @@ location: SourceLocation(pos=4663, lineno=111, colno=15) end_location: SourceLocation(pos=4678, lineno=111, colno=30) is_tag: False - namespace: - - location: SourceLocation(pos=4663, lineno=111, colno=15) - end_location: SourceLocation(pos=4672, lineno=111, colno=24) - value: 'minecraft' - path: - - location: SourceLocation(pos=4673, lineno=111, colno=25) - end_location: SourceLocation(pos=4678, lineno=111, colno=30) - value: 'apple' + namespace: 'minecraft' + path: 'apple' data_tags: None location: SourceLocation(pos=4679, lineno=112, colno=1) @@ -4574,47 +4246,43 @@ end_location: SourceLocation(pos=4697, lineno=112, colno=19) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4688, lineno=112, colno=10) - end_location: SourceLocation(pos=4697, lineno=112, colno=19) - value: 'vibration' + path: 'vibration' parameters: location: SourceLocation(pos=4698, lineno=112, colno=20) end_location: SourceLocation(pos=4727, lineno=112, colno=49) x1: - + location: SourceLocation(pos=4698, lineno=112, colno=20) end_location: SourceLocation(pos=4701, lineno=112, colno=23) value: 0.0 y1: - + location: SourceLocation(pos=4702, lineno=112, colno=24) end_location: SourceLocation(pos=4706, lineno=112, colno=28) value: 64.0 z1: - + location: SourceLocation(pos=4707, lineno=112, colno=29) end_location: SourceLocation(pos=4710, lineno=112, colno=32) value: 0.0 x2: - + location: SourceLocation(pos=4711, lineno=112, colno=33) end_location: SourceLocation(pos=4714, lineno=112, colno=36) value: 5.0 y2: - + location: SourceLocation(pos=4715, lineno=112, colno=37) end_location: SourceLocation(pos=4719, lineno=112, colno=41) value: 64.0 z2: - + location: SourceLocation(pos=4720, lineno=112, colno=42) end_location: SourceLocation(pos=4723, lineno=112, colno=45) value: 0.0 duration: - + location: SourceLocation(pos=4724, lineno=112, colno=46) end_location: SourceLocation(pos=4727, lineno=112, colno=49) value: 200 @@ -4632,47 +4300,43 @@ end_location: SourceLocation(pos=4746, lineno=113, colno=19) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4737, lineno=113, colno=10) - end_location: SourceLocation(pos=4746, lineno=113, colno=19) - value: 'vibration' + path: 'vibration' parameters: location: SourceLocation(pos=4747, lineno=113, colno=20) end_location: SourceLocation(pos=4776, lineno=113, colno=49) x1: - + location: SourceLocation(pos=4747, lineno=113, colno=20) end_location: SourceLocation(pos=4750, lineno=113, colno=23) value: 0.0 y1: - + location: SourceLocation(pos=4751, lineno=113, colno=24) end_location: SourceLocation(pos=4755, lineno=113, colno=28) value: 64.0 z1: - + location: SourceLocation(pos=4756, lineno=113, colno=29) end_location: SourceLocation(pos=4759, lineno=113, colno=32) value: 0.0 x2: - + location: SourceLocation(pos=4760, lineno=113, colno=33) end_location: SourceLocation(pos=4763, lineno=113, colno=36) value: 5.0 y2: - + location: SourceLocation(pos=4764, lineno=113, colno=37) end_location: SourceLocation(pos=4768, lineno=113, colno=41) value: 64.0 z2: - + location: SourceLocation(pos=4769, lineno=113, colno=42) end_location: SourceLocation(pos=4772, lineno=113, colno=45) value: 0.0 duration: - + location: SourceLocation(pos=4773, lineno=113, colno=46) end_location: SourceLocation(pos=4776, lineno=113, colno=49) value: 200 @@ -4732,22 +4396,18 @@ end_location: SourceLocation(pos=4815, lineno=115, colno=21) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4810, lineno=115, colno=16) - end_location: SourceLocation(pos=4815, lineno=115, colno=21) - value: 'chest' + path: 'chest' block_states: location: SourceLocation(pos=4816, lineno=115, colno=22) end_location: SourceLocation(pos=4827, lineno=115, colno=33) key: - + location: SourceLocation(pos=4816, lineno=115, colno=22) end_location: SourceLocation(pos=4822, lineno=115, colno=28) value: 'facing' value: - + location: SourceLocation(pos=4823, lineno=115, colno=29) end_location: SourceLocation(pos=4827, lineno=115, colno=33) value: 'east' @@ -4787,11 +4447,7 @@ end_location: SourceLocation(pos=4856, lineno=116, colno=28) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4846, lineno=116, colno=18) - end_location: SourceLocation(pos=4856, lineno=116, colno=28) - value: 'birch_sign' + path: 'birch_sign' block_states: data_tags: @@ -4803,7 +4459,7 @@ location: SourceLocation(pos=4857, lineno=116, colno=29) end_location: SourceLocation(pos=4876, lineno=116, colno=48) key: - + location: SourceLocation(pos=4857, lineno=116, colno=29) end_location: SourceLocation(pos=4862, lineno=116, colno=34) value: 'Text1' @@ -4816,7 +4472,7 @@ location: SourceLocation(pos=4878, lineno=116, colno=50) end_location: SourceLocation(pos=4901, lineno=116, colno=73) key: - + location: SourceLocation(pos=4878, lineno=116, colno=50) end_location: SourceLocation(pos=4883, lineno=116, colno=55) value: 'Text2' @@ -4860,22 +4516,18 @@ end_location: SourceLocation(pos=4930, lineno=117, colno=28) is_tag: False namespace: None - path: - - location: SourceLocation(pos=4919, lineno=117, colno=17) - end_location: SourceLocation(pos=4930, lineno=117, colno=28) - value: 'quartz_slab' + path: 'quartz_slab' block_states: location: SourceLocation(pos=4931, lineno=117, colno=29) end_location: SourceLocation(pos=4939, lineno=117, colno=37) key: - + location: SourceLocation(pos=4931, lineno=117, colno=29) end_location: SourceLocation(pos=4935, lineno=117, colno=33) value: 'type' value: - + location: SourceLocation(pos=4936, lineno=117, colno=34) end_location: SourceLocation(pos=4939, lineno=117, colno=37) value: 'top' @@ -4900,15 +4552,15 @@ end_location: SourceLocation(pos=4974, lineno=119, colno=18) type: 'absolute' value: 0 - + location: SourceLocation(pos=4975, lineno=119, colno=19) end_location: SourceLocation(pos=4978, lineno=119, colno=22) value: 200 - + location: SourceLocation(pos=4979, lineno=119, colno=23) end_location: SourceLocation(pos=4982, lineno=119, colno=26) value: 500 - + location: SourceLocation(pos=4983, lineno=119, colno=27) end_location: SourceLocation(pos=4987, lineno=119, colno=31) value: True @@ -4928,11 +4580,7 @@ end_location: SourceLocation(pos=5021, lineno=121, colno=22) is_tag: False namespace: None - path: - - location: SourceLocation(pos=5007, lineno=121, colno=8) - end_location: SourceLocation(pos=5021, lineno=121, colno=22) - value: 'lightning_bolt' + path: 'lightning_bolt' location: SourceLocation(pos=5022, lineno=121, colno=23) end_location: SourceLocation(pos=5030, lineno=121, colno=31) @@ -4964,11 +4612,7 @@ end_location: SourceLocation(pos=5045, lineno=122, colno=15) is_tag: False namespace: None - path: - - location: SourceLocation(pos=5038, lineno=122, colno=8) - end_location: SourceLocation(pos=5045, lineno=122, colno=15) - value: 'creeper' + path: 'creeper' location: SourceLocation(pos=5046, lineno=122, colno=16) end_location: SourceLocation(pos=5051, lineno=122, colno=21) @@ -4998,7 +4642,7 @@ location: SourceLocation(pos=5053, lineno=122, colno=23) end_location: SourceLocation(pos=5064, lineno=122, colno=34) key: - + location: SourceLocation(pos=5053, lineno=122, colno=23) end_location: SourceLocation(pos=5060, lineno=122, colno=30) value: 'powered' @@ -5011,7 +4655,7 @@ location: SourceLocation(pos=5066, lineno=122, colno=36) end_location: SourceLocation(pos=5106, lineno=122, colno=76) key: - + location: SourceLocation(pos=5066, lineno=122, colno=36) end_location: SourceLocation(pos=5076, lineno=122, colno=46) value: 'CustomName' @@ -5030,11 +4674,7 @@ end_location: SourceLocation(pos=5121, lineno=123, colno=14) is_tag: False namespace: None - path: - - location: SourceLocation(pos=5115, lineno=123, colno=8) - end_location: SourceLocation(pos=5121, lineno=123, colno=14) - value: 'spider' + path: 'spider' location: SourceLocation(pos=5122, lineno=123, colno=15) end_location: SourceLocation(pos=5127, lineno=123, colno=20) @@ -5064,7 +4704,7 @@ location: SourceLocation(pos=5129, lineno=123, colno=22) end_location: SourceLocation(pos=5216, lineno=123, colno=109) key: - + location: SourceLocation(pos=5129, lineno=123, colno=22) end_location: SourceLocation(pos=5139, lineno=123, colno=32) value: 'Passengers' @@ -5081,7 +4721,7 @@ location: SourceLocation(pos=5143, lineno=123, colno=36) end_location: SourceLocation(pos=5167, lineno=123, colno=60) key: - + location: SourceLocation(pos=5143, lineno=123, colno=36) end_location: SourceLocation(pos=5145, lineno=123, colno=38) value: 'id' @@ -5094,7 +4734,7 @@ location: SourceLocation(pos=5169, lineno=123, colno=62) end_location: SourceLocation(pos=5214, lineno=123, colno=107) key: - + location: SourceLocation(pos=5169, lineno=123, colno=62) end_location: SourceLocation(pos=5178, lineno=123, colno=71) value: 'HandItems' @@ -5111,7 +4751,7 @@ location: SourceLocation(pos=5182, lineno=123, colno=75) end_location: SourceLocation(pos=5201, lineno=123, colno=94) key: - + location: SourceLocation(pos=5182, lineno=123, colno=75) end_location: SourceLocation(pos=5184, lineno=123, colno=77) value: 'id' @@ -5124,7 +4764,7 @@ location: SourceLocation(pos=5203, lineno=123, colno=96) end_location: SourceLocation(pos=5212, lineno=123, colno=105) key: - + location: SourceLocation(pos=5203, lineno=123, colno=96) end_location: SourceLocation(pos=5208, lineno=123, colno=101) value: 'Count' @@ -5143,11 +4783,7 @@ end_location: SourceLocation(pos=5233, lineno=124, colno=16) is_tag: False namespace: None - path: - - location: SourceLocation(pos=5225, lineno=124, colno=8) - end_location: SourceLocation(pos=5233, lineno=124, colno=16) - value: 'villager' + path: 'villager' location: SourceLocation(pos=5234, lineno=124, colno=17) end_location: SourceLocation(pos=5239, lineno=124, colno=22) @@ -5177,7 +4813,7 @@ location: SourceLocation(pos=5241, lineno=124, colno=24) end_location: SourceLocation(pos=5342, lineno=124, colno=125) key: - + location: SourceLocation(pos=5241, lineno=124, colno=24) end_location: SourceLocation(pos=5247, lineno=124, colno=30) value: 'Offers' @@ -5190,7 +4826,7 @@ location: SourceLocation(pos=5250, lineno=124, colno=33) end_location: SourceLocation(pos=5341, lineno=124, colno=124) key: - + location: SourceLocation(pos=5250, lineno=124, colno=33) end_location: SourceLocation(pos=5257, lineno=124, colno=40) value: 'Recipes' @@ -5207,7 +4843,7 @@ location: SourceLocation(pos=5261, lineno=124, colno=44) end_location: SourceLocation(pos=5288, lineno=124, colno=71) key: - + location: SourceLocation(pos=5261, lineno=124, colno=44) end_location: SourceLocation(pos=5264, lineno=124, colno=47) value: 'buy' @@ -5220,7 +4856,7 @@ location: SourceLocation(pos=5267, lineno=124, colno=50) end_location: SourceLocation(pos=5277, lineno=124, colno=60) key: - + location: SourceLocation(pos=5267, lineno=124, colno=50) end_location: SourceLocation(pos=5269, lineno=124, colno=52) value: 'id' @@ -5233,7 +4869,7 @@ location: SourceLocation(pos=5279, lineno=124, colno=62) end_location: SourceLocation(pos=5287, lineno=124, colno=70) key: - + location: SourceLocation(pos=5279, lineno=124, colno=62) end_location: SourceLocation(pos=5284, lineno=124, colno=67) value: 'Count' @@ -5246,7 +4882,7 @@ location: SourceLocation(pos=5290, lineno=124, colno=73) end_location: SourceLocation(pos=5321, lineno=124, colno=104) key: - + location: SourceLocation(pos=5290, lineno=124, colno=73) end_location: SourceLocation(pos=5294, lineno=124, colno=77) value: 'sell' @@ -5259,7 +4895,7 @@ location: SourceLocation(pos=5297, lineno=124, colno=80) end_location: SourceLocation(pos=5310, lineno=124, colno=93) key: - + location: SourceLocation(pos=5297, lineno=124, colno=80) end_location: SourceLocation(pos=5299, lineno=124, colno=82) value: 'id' @@ -5272,7 +4908,7 @@ location: SourceLocation(pos=5312, lineno=124, colno=95) end_location: SourceLocation(pos=5320, lineno=124, colno=103) key: - + location: SourceLocation(pos=5312, lineno=124, colno=95) end_location: SourceLocation(pos=5317, lineno=124, colno=100) value: 'Count' @@ -5285,7 +4921,7 @@ location: SourceLocation(pos=5323, lineno=124, colno=106) end_location: SourceLocation(pos=5339, lineno=124, colno=122) key: - + location: SourceLocation(pos=5323, lineno=124, colno=106) end_location: SourceLocation(pos=5332, lineno=124, colno=115) value: 'rewardExp' @@ -5299,7 +4935,7 @@ end_location: SourceLocation(pos=5369, lineno=126, colno=15) identifier: 'teleport:destination' arguments: - + location: SourceLocation(pos=5364, lineno=126, colno=10) end_location: SourceLocation(pos=5369, lineno=126, colno=15) value: 'Alice' @@ -5380,7 +5016,7 @@ location: SourceLocation(pos=5456, lineno=131, colno=13) end_location: SourceLocation(pos=5474, lineno=131, colno=31) key: - + location: SourceLocation(pos=5456, lineno=131, colno=13) end_location: SourceLocation(pos=5462, lineno=131, colno=19) value: 'text' @@ -5393,7 +5029,7 @@ location: SourceLocation(pos=5475, lineno=131, colno=32) end_location: SourceLocation(pos=5489, lineno=131, colno=46) key: - + location: SourceLocation(pos=5475, lineno=131, colno=32) end_location: SourceLocation(pos=5482, lineno=131, colno=39) value: 'color' @@ -5421,7 +5057,7 @@ location: SourceLocation(pos=5503, lineno=132, colno=13) end_location: SourceLocation(pos=5521, lineno=132, colno=31) key: - + location: SourceLocation(pos=5503, lineno=132, colno=13) end_location: SourceLocation(pos=5509, lineno=132, colno=19) value: 'text' @@ -5434,7 +5070,7 @@ location: SourceLocation(pos=5522, lineno=132, colno=32) end_location: SourceLocation(pos=5539, lineno=132, colno=49) key: - + location: SourceLocation(pos=5522, lineno=132, colno=32) end_location: SourceLocation(pos=5529, lineno=132, colno=39) value: 'color' @@ -5462,7 +5098,7 @@ location: SourceLocation(pos=5553, lineno=133, colno=13) end_location: SourceLocation(pos=5571, lineno=133, colno=31) key: - + location: SourceLocation(pos=5553, lineno=133, colno=13) end_location: SourceLocation(pos=5559, lineno=133, colno=19) value: 'text' @@ -5475,7 +5111,7 @@ location: SourceLocation(pos=5572, lineno=133, colno=32) end_location: SourceLocation(pos=5621, lineno=133, colno=81) key: - + location: SourceLocation(pos=5572, lineno=133, colno=32) end_location: SourceLocation(pos=5584, lineno=133, colno=44) value: 'hoverEvent' @@ -5488,7 +5124,7 @@ location: SourceLocation(pos=5586, lineno=133, colno=46) end_location: SourceLocation(pos=5606, lineno=133, colno=66) key: - + location: SourceLocation(pos=5586, lineno=133, colno=46) end_location: SourceLocation(pos=5594, lineno=133, colno=54) value: 'action' @@ -5501,7 +5137,7 @@ location: SourceLocation(pos=5607, lineno=133, colno=67) end_location: SourceLocation(pos=5620, lineno=133, colno=80) key: - + location: SourceLocation(pos=5607, lineno=133, colno=67) end_location: SourceLocation(pos=5614, lineno=133, colno=74) value: 'value' @@ -5570,7 +5206,7 @@ location: SourceLocation(pos=5727, lineno=140, colno=20) end_location: SourceLocation(pos=5755, lineno=140, colno=48) key: - + location: SourceLocation(pos=5727, lineno=140, colno=20) end_location: SourceLocation(pos=5733, lineno=140, colno=26) value: 'text' @@ -5583,7 +5219,7 @@ location: SourceLocation(pos=5756, lineno=140, colno=49) end_location: SourceLocation(pos=5770, lineno=140, colno=63) key: - + location: SourceLocation(pos=5756, lineno=140, colno=49) end_location: SourceLocation(pos=5763, lineno=140, colno=56) value: 'color' @@ -5596,7 +5232,7 @@ location: SourceLocation(pos=5771, lineno=140, colno=64) end_location: SourceLocation(pos=5784, lineno=140, colno=77) key: - + location: SourceLocation(pos=5771, lineno=140, colno=64) end_location: SourceLocation(pos=5779, lineno=140, colno=72) value: 'italic' @@ -5624,7 +5260,7 @@ location: SourceLocation(pos=5802, lineno=141, colno=17) end_location: SourceLocation(pos=5820, lineno=141, colno=35) key: - + location: SourceLocation(pos=5802, lineno=141, colno=17) end_location: SourceLocation(pos=5808, lineno=141, colno=23) value: 'text' @@ -5637,7 +5273,7 @@ location: SourceLocation(pos=5821, lineno=141, colno=36) end_location: SourceLocation(pos=5832, lineno=141, colno=47) key: - + location: SourceLocation(pos=5821, lineno=141, colno=36) end_location: SourceLocation(pos=5827, lineno=141, colno=42) value: 'bold' @@ -5651,7 +5287,7 @@ end_location: SourceLocation(pos=5862, lineno=143, colno=19) identifier: 'weather:clear:duration' arguments: - + location: SourceLocation(pos=5858, lineno=143, colno=15) end_location: SourceLocation(pos=5862, lineno=143, colno=19) value: 1200 From 01faeb59d9fd5bdf34a16170a464e4802ee0ead2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 13:59:41 +0200 Subject: [PATCH 0304/1554] fix: only avoid quotes when the regex matches the entire string --- packages/mecha/mecha/__init__.py | 2 ++ packages/mecha/mecha/utils.py | 2 +- .../parse__argument_examples_brigadier_string_1_0__0.txt | 2 +- .../parse__argument_examples_minecraft_nbt_path_0_10__0.txt | 2 +- .../parse__argument_examples_minecraft_nbt_path_0_11__0.txt | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 4c520767e..dfefdfc1b 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -2,6 +2,7 @@ from .api import * +from .ast import * from .config import * from .dispatch import * from .error import * @@ -10,3 +11,4 @@ from .resources import * from .serialize import * from .spec import * +from .utils import * diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index f039bde46..696452581 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -13,7 +13,7 @@ from .error import InvalidEscapeSequence ESCAPE_REGEX = re.compile(r"\\.") -AVOID_QUOTES_REGEX = re.compile(r"[0-9A-Za-z_\.\+\-]+") +AVOID_QUOTES_REGEX = re.compile(r"^[0-9A-Za-z_\.\+\-]+$") def string_to_number(string: str) -> Union[int, float]: diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt index c992b9b1d..852b15c4e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_1_0__0.txt @@ -4,7 +4,7 @@ brigadier:string 1 0 --- "quoted phrase" --- -quoted phrase +"quoted phrase" --- location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt index 6ba9846ce..dcae22a03 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_10__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_path 0 10 --- foo.bar[0]."A [crazy name]!" --- -foo.bar[0].A [crazy name]! +foo.bar[0]."A [crazy name]!" --- location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt index d826e2911..36cd5b90c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_0_11__0.txt @@ -4,7 +4,7 @@ minecraft:nbt_path 0 11 --- foo.bar[0]."A [crazy name]!".baz --- -foo.bar[0].A [crazy name]!.baz +foo.bar[0]."A [crazy name]!".baz --- location: SourceLocation(pos=0, lineno=1, colno=1) From bbb8b3b0ffa92ceda69e3c890f8e9f0bfe92c038 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 15:00:02 +0200 Subject: [PATCH 0305/1554] feat: add dispatch rule priority --- packages/mecha/mecha/dispatch.py | 57 ++++++--- .../snapshots/parse__command_examples__1.txt | 117 ++++++++++++++++++ packages/mecha/tests/test_dispatch.py | 64 ++++++++++ packages/mecha/tests/test_parse.py | 4 +- 4 files changed, 221 insertions(+), 21 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__command_examples__1.txt create mode 100644 packages/mecha/tests/test_dispatch.py diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 9cd5811b5..a9f97b8ea 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -9,6 +9,7 @@ from dataclasses import dataclass, fields, replace from functools import partial +from heapq import heappop, heappush from typing import ( Any, Callable, @@ -82,10 +83,19 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]: class Dispatcher: """Ast node dispatcher.""" - rules: Dict[Type[Any], Dict[FrozenSet[Tuple[str, Any]], List[Callable[..., Any]]]] + rules: Dict[ + Type[Any], + Dict[ + FrozenSet[Tuple[str, Any]], + List[Tuple[int, Callable[..., Any]]], + ], + ] + + count: int def __init__(self, rules: Iterable[Callable[..., Any]] = ()): self.rules = {} + self.count = 0 for name in dir(self): if isinstance(rule := getattr(self, name), Rule): @@ -102,13 +112,13 @@ def __init__(self, rules: Iterable[Callable[..., Any]] = ()): def add_rule(self, rule: Callable[..., Any]): """Add rule.""" - # TODO: Add rule priority that increases as rules are added if not isinstance(rule, Rule): rule = Rule(rule) for match_type in rule.match_types or [AstNode]: l = self.rules.setdefault(match_type, {}).setdefault(rule.match_fields, []) - l.append(rule.callback) + l.append((self.count, rule.callback)) + self.count += 1 if rule.next: self.add_rule(rule.next) @@ -120,10 +130,15 @@ def extend( """Extend the dispatcher.""" for arg in args: if isinstance(arg, Dispatcher): + offset = self.count for key, value in arg.rules.items(): current = self.rules.setdefault(key, {}) for match_fields, callbacks in value.items(): - current.setdefault(match_fields, []).extend(callbacks) + l = current.setdefault(match_fields, []) + for priority, callback in callbacks: + priority += offset + l.append((priority, callback)) + self.count = max(self.count, priority) + 1 elif callable(arg): self.add_rule(arg) else: @@ -132,10 +147,9 @@ def extend( def dispatch(self, node: AstNode) -> Iterator[Callable[..., Any]]: """Dispatch rules.""" - # TODO: Sort rules by priority - dispatched: Set[Callable[..., Any]] = set() + priority_queue: List[Tuple[int, int, Callable[..., Any]]] = [] - for node_type in type(node).mro(): + for i, node_type in enumerate(type(node).mro()): if value := self.rules.get(node_type): for match_fields, callbacks in value.items(): if all( @@ -144,10 +158,17 @@ def dispatch(self, node: AstNode) -> Iterator[Callable[..., Any]]: else hasattr(node, name) and getattr(node, name) == value for name, value in match_fields ): - for callback in callbacks: - if callback not in dispatched: - dispatched.add(callback) - yield callback + for priority, callback in callbacks: + heappush(priority_queue, (i, -priority, callback)) + + dispatched: Set[Callable[..., Any]] = set() + + while priority_queue: + _, _, callback = heappop(priority_queue) + + if callback not in dispatched: + dispatched.add(callback) + yield callback def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: """Invoke rules on the given ast node.""" @@ -162,16 +183,12 @@ class Visitor(Dispatcher): def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: rules = list(self.dispatch(node)) - # TODO: If no rules use default implementation that joins all child nodes with space - # TODO: If more than one rule, just use the first one with the highest priority - if not rules: - raise ValueError(f"No matching rule for visiting {type(node)} node.") - if len(rules) > 1: - raise ValueError( - f"Matched {len(rules)} conflicting rules for visiting {type(node)} node." - ) + if rules: + result = rules[0](node, *args, **kwargs) + else: + result = (child for child in node) - if isinstance(result := rules[0](node, *args, **kwargs), Generator): + if isinstance(result, Generator): for child in result: self.invoke(child, *args, **kwargs) diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt new file mode 100644 index 000000000..ad0527ab2 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -0,0 +1,117 @@ +advancement grant @s only minecraft:story/shiny_gear +advancement grant @a everything +attribute @s minecraft:generic.armor base set 5 +clear +clear Alice +clear Alice minecraft:wool +clear @p minecraft:golden_sword{Enchantments: [{id: "minecraft:sharpness", lvl: 1s}]} +data get entity @s foodSaturationLevel +data modify entity @e[type=item, distance=..10, limit=1, sort=nearest] PickupDelay set value -1 +data get entity @e[type=item, limit=1, sort=random] Pos[1] +data get entity @p Inventory[{Slot: 0b}].id +data modify entity @e[x=0, y=64, z=0, type=dolphin, limit=1] Attributes[{Name: "generic.armor"}].Base set value 20 +data modify block 1 64 1 Items[0].id set value "minecraft:diamond_block" +data merge entity @e[type=zombie, limit=1, sort=nearest] {HandDropChances: [0.0f, 0.8f]} +data modify entity @e[type=zombie, limit=1, sort=nearest] HandDropChances[1] set value 0.8f +defaultgamemode survival +effect give @s minecraft:resistance 1000000 4 true +effect give @p minecraft:speed 60 1 +effect give @p minecraft:speed 60 2 +effect clear @a minecraft:haste +effect clear @e[type=zombie] +enchant @a infinity +enchant @p sharpness 5 +execute align yxz run spawnpoint @p ~ ~ ~ +execute anchored eyes run tp ^ ^ ^ +execute anchored eyes run tp ^5 ^ ^ +execute as @e[type=sheep] run data get entity @s +execute as @e[type=villager] run data merge entity @s {Invulnerable: 1} +execute as @e[type=sheep] at @s run tp ~ ~1 ~ +execute at @e[type=sheep] run kill @s +execute facing ^1 ^ ^ run tp ~ ~ ~ +execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 +execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 ~ ~ +execute as @e[type=!player] at @s facing entity @p feet run tp @s ^ ^ ^1 +execute in the_end run locate endcity +execute in minecraft:the_nether positioned as @s run tp ~ ~ ~ +execute in minecraft:the_nether run tp ~ ~ ~ +execute in minecraft:the_nether run tp ~ ~ ~5 +execute positioned 0 64 0 run locate village +execute as @e[type=sheep] at @s rotated as @p run tp @s ^ ^ ^1 +execute as @e[type=sheep] positioned as @s rotated as @p run tp @s ^ ^ ^1 +execute as @a at @s if block ~ ~-1 ~ #wool run kill @s +execute if score @s A = @s B +execute as @a if data entity @s Inventory[{Slot: 0b}].tag.Enchantments[{id: "minecraft:efficiency"}] run tp @s 0 64 0 +execute as @a at @s anchored eyes run particle smoke ^ ^ ^3 +execute as @e[type=pig] at @s store success entity @s Saddle byte 1 if entity @p[distance=..5] +execute as @a at @s if block ~ ~ ~ water run say "My feet are soaked!" +execute as @a unless score @s test = @s test run say "Score is reset" +execute at @p as @e[type=pig, distance=..3] run data merge entity @s {Motion: [0.0d, 2.0d, 0.0d]} +execute as @p at @s run teleport @s ~ ~ ~ ~10 ~ +execute in minecraft:the_nether run teleport ~ ~ ~ +execute as @a in minecraft:the_end run teleport 84 57 79 +execute as Alice in minecraft:overworld run teleport 251 64 -160 +experience query Steve levels +fill 52 63 -1516 33 73 -1536 minecraft:gold_block replace minecraft:orange_glazed_terracotta +fill ~-3 ~-3 ~-3 ~3 ~-1 ~3 water +fill ~-3 ~ ~-4 ~3 ~4 ~4 minecraft:stone hollow +fill ~-15 ~-15 ~-15 ~15 ~15 ~15 stone +fill ~-1 ~ ~ ~1 ~ ~ minecraft:prismarine_brick_stairs[facing=south, waterlogged=true] +function custom:example/test +function #custom:example/test +gamemode creative +gamemode survival @a +gamerule doDaylightCycle false +gamerule naturalRegeneration false +gamerule mobGriefing false +gamerule doWeatherCycle false +gamerule keepInventory true +gamerule commandBlockOutput false +gamerule doInsomnia false +give @p minecraft:diamond_sword{display: {Lore: ['"A legendary weapon"']}} 1 +give @a potion{Potion: "minecraft:night_vision"} 1 +give @r diamond_sword{Enchantments: [{id: "minecraft:sharpness", lvl: 10}]} 1 +give @s minecraft:diamond_block{CanPlaceOn: ["minecraft:dirt"]} +give @a potion{Enchantments: [{id: "minecraft:knockback", lvl: 10}], CustomPotionEffects: [{Id: 20, Amplifier: 1}]} 1 +item replace block ~ ~2 ~ container.26 with minecraft:spruce_sapling 4 +item replace entity @p hotbar.8 with minecraft:spruce_sapling 4 +item replace entity @s weapon.offhand from entity @s weapon.mainhand +kill @s +kill Steve +kill @e[type=item] +kill @e[distance=..10] +kill @e[type=!player] +kill @e[distance=..10, type=creeper] +kill @e[type=arrow, nbt={inBlockState: {Name: "minecraft:target"}}] +locate mansion +msg @a Hi +particle dust 1.0 0.5 0.5 1.0 +particle dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 +particle block minecraft:grass_block[snowy=true] +particle falling_dust minecraft:grass_block[snowy=true] +particle item minecraft:apple +particle vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 +particle vibration 0.0 64.0 0.0 5.0 64.0 0.0 200 ^ ^ ^3 +setblock ~ ~ ~ chest[facing=east] +setblock ~ ~ ~-1 birch_sign{Text1: '"My chest"', Text2: '"Do not open!"'} +setblock ~ ~2 ~ quartz_slab[type=top] +spreadplayers 0 0 200 500 true @a +summon lightning_bolt ~-10 ~ ~ +summon creeper ~ ~ ~ {powered: 1b, CustomName: '{"text":"Powered Creeper"}'} +summon spider ~ ~ ~ {Passengers: [{id: "minecraft:skeleton", HandItems: [{id: "minecraft:bow", Count: 1b}]}]} +summon villager ~ ~ ~ {Offers: {Recipes: [{buy: {id: "dirt", Count: 1}, sell: {id: "diamond", Count: 1}, rewardExp: 0b}]}} +teleport Alice +teleport @a @s +teleport 100 ~3 100 +tellraw @a "text to display" +tellraw @a {"text": "I am blue", "color": "blue"} +tellraw @a {"text": "I am blue", "color": "#5555ff"} +tellraw @a {"text": "Hover me!", "hoverEvent": {"action": "show_text", "value": "Hi!"}} +tellraw @a "Text1\nText2" +time set 1000 +time set day +time add 24000 +title @a subtitle {"text": "The story begins...", "color": "gray", "italic": true} +title @a title {"text": "Chapter I", "bold": true} +weather clear 1200 +weather rain diff --git a/packages/mecha/tests/test_dispatch.py b/packages/mecha/tests/test_dispatch.py new file mode 100644 index 000000000..afffc36e6 --- /dev/null +++ b/packages/mecha/tests/test_dispatch.py @@ -0,0 +1,64 @@ +from typing import List, Type + +from mecha import AstNumber, Mecha, Visitor, rule +from mecha.ast import ( + AstCommand, + AstCoordinate, + AstDustParticleParameters, + AstNode, + AstParticle, + AstResourceLocation, + AstVector3, +) + + +def test_visitor(mc: Mecha): + ast = mc.parse_function("particle dust 1.0 0.5 0.5 1.0 7 7 7") + + numbers: List[AstNode] = [] + Visitor([rule(AstNumber)(numbers.append)]).invoke(ast) + + assert numbers == [ + AstNumber(value=1), + AstNumber(value=0.5), + AstNumber(value=0.5), + AstNumber(value=1), + ] + + +def test_visitor_extend(mc: Mecha): + ast = mc.parse_command("particle dust 1.0 0.5 7 1.0 7 7 7") + + nodes: List[Type[AstNode]] = [] + numbers: List[AstNumber] = [] + sevens: List[AstNumber] = [] + + class Foo(Visitor): + @rule + def default(self, node: AstNode): + nodes.append(type(node)) + yield from node + + @rule(AstNumber, value=7) + def seven(self, node: AstNumber): + sevens.append(node) + + visitor = Visitor() + visitor.extend(rule(AstNumber)(numbers.append), Foo()) + visitor.invoke(ast) + + print(visitor.rules) + + assert nodes == [ + AstCommand, + AstParticle, + AstResourceLocation, + AstDustParticleParameters, + AstVector3, + AstCoordinate, + AstCoordinate, + AstCoordinate, + ] + + assert numbers == [AstNumber(value=1), AstNumber(value=0.5), AstNumber(value=1)] + assert sevens == [AstNumber(value=7)] diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index aace0243e..850fc4190 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -7,7 +7,9 @@ def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): - assert snapshot() == mc.parse_function(get_command_examples()).dump() + ast = mc.parse_function(get_command_examples()) + assert snapshot() == ast.dump() + assert snapshot() == mc.serialize(ast) @pytest.mark.parametrize( From e7f89dd6a4acbb9b7923c61cd77103e84317d3f3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 15:10:50 +0200 Subject: [PATCH 0306/1554] refactor: turn dispatcher into dataclass --- packages/mecha/mecha/dispatch.py | 15 ++++++--------- packages/mecha/tests/test_dispatch.py | 5 ++++- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index a9f97b8ea..345ccc5a8 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -27,6 +27,8 @@ overload, ) +from beet.core.utils import extra_field + from .ast import AstChildren, AstNode @@ -79,7 +81,7 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]: return decorator -# TODO: Use dataclass? +@dataclass class Dispatcher: """Ast node dispatcher.""" @@ -89,14 +91,11 @@ class Dispatcher: FrozenSet[Tuple[str, Any]], List[Tuple[int, Callable[..., Any]]], ], - ] - - count: int + ] = extra_field(init=False, default_factory=dict) - def __init__(self, rules: Iterable[Callable[..., Any]] = ()): - self.rules = {} - self.count = 0 + count: int = extra_field(init=False, default=0) + def __post_init__(self): for name in dir(self): if isinstance(rule := getattr(self, name), Rule): callback = partial(rule.callback, self) @@ -108,8 +107,6 @@ def __init__(self, rules: Iterable[Callable[..., Any]] = ()): self.add_rule(rule) - self.extend(rules) - def add_rule(self, rule: Callable[..., Any]): """Add rule.""" if not isinstance(rule, Rule): diff --git a/packages/mecha/tests/test_dispatch.py b/packages/mecha/tests/test_dispatch.py index afffc36e6..02e72858f 100644 --- a/packages/mecha/tests/test_dispatch.py +++ b/packages/mecha/tests/test_dispatch.py @@ -16,7 +16,10 @@ def test_visitor(mc: Mecha): ast = mc.parse_function("particle dust 1.0 0.5 0.5 1.0 7 7 7") numbers: List[AstNode] = [] - Visitor([rule(AstNumber)(numbers.append)]).invoke(ast) + + visitor = Visitor() + visitor.add_rule(rule(AstNumber)(numbers.append)) + visitor.invoke(ast) assert numbers == [ AstNumber(value=1), From eebc1251d1294360de678ad086e72485ca149b96 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 15:30:01 +0200 Subject: [PATCH 0307/1554] fix: communicate rule return value to the parent --- packages/mecha/mecha/dispatch.py | 21 +++++++------- packages/mecha/tests/test_dispatch.py | 42 +++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 345ccc5a8..f35c41204 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -186,16 +186,17 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: result = (child for child in node) if isinstance(result, Generator): - for child in result: - self.invoke(child, *args, **kwargs) - - # TODO: Find why this doesn't work - # child = next(result) - # while True: - # try: - # child = result.send(self.invoke(child, *args, **kwargs)) - # except StopIteration as exc: - # return exc.value + try: + child = next(result) + except StopIteration as exc: + return exc.value + + while True: + feedback = self.invoke(child, *args, **kwargs) + try: + child = result.send(feedback) + except StopIteration as exc: + return exc.value return result diff --git a/packages/mecha/tests/test_dispatch.py b/packages/mecha/tests/test_dispatch.py index 02e72858f..2806b2603 100644 --- a/packages/mecha/tests/test_dispatch.py +++ b/packages/mecha/tests/test_dispatch.py @@ -1,13 +1,16 @@ -from typing import List, Type +from typing import Generator, List, Type from mecha import AstNumber, Mecha, Visitor, rule from mecha.ast import ( AstCommand, AstCoordinate, AstDustParticleParameters, + AstLiteral, + AstMessage, AstNode, AstParticle, AstResourceLocation, + AstRoot, AstVector3, ) @@ -50,8 +53,6 @@ def seven(self, node: AstNumber): visitor.extend(rule(AstNumber)(numbers.append), Foo()) visitor.invoke(ast) - print(visitor.rules) - assert nodes == [ AstCommand, AstParticle, @@ -65,3 +66,38 @@ def seven(self, node: AstNumber): assert numbers == [AstNumber(value=1), AstNumber(value=0.5), AstNumber(value=1)] assert sevens == [AstNumber(value=7)] + + +def test_visitor_result(mc: Mecha): + ast = mc.parse_function("say hello\nsay world\n") + + class Foo(Visitor): + @rule(AstRoot) + def root(self, node: AstRoot) -> Generator[AstNode, str, List[str]]: + commands: List[str] = [] + + for command in node.commands: + value = yield command + commands.append(value) + + return commands + + @rule(AstCommand) + def command(self, node: AstCommand) -> Generator[AstNode, str, str]: + arguments: List[str] = [] + + for argument in node.arguments: + value = yield argument + arguments.append(repr(value)) + + return f"{node.identifier}(" + ", ".join(arguments) + ")" + + @rule(AstMessage) + def message(self, node: AstMessage) -> str: + return "".join( + fragment.value + for fragment in node.fragments + if isinstance(fragment, AstLiteral) + ) + + assert Foo().invoke(ast) == ["say:message('hello')", "say:message('world')"] From d21c5be7c6488b9488c56bc0d923c3f860cf3b79 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 16:15:27 +0200 Subject: [PATCH 0308/1554] fix: handle the case where eof has already been consumed --- packages/mecha/mecha/parse.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 02cc10767..052372790 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -63,7 +63,13 @@ # pyright: reportMissingTypeStubs=false from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String -from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location +from tokenstream import ( + InvalidSyntax, + SourceLocation, + TokenStream, + UnexpectedEOF, + set_location, +) from .ast import ( AstBlock, @@ -499,9 +505,11 @@ def parse_command(stream: TokenStream) -> AstCommand: argument = delegate("command:argument", stream) if not child.redirect and not child.children: - with stream.intercept("eof"): - stream.expect("newline", "eof") - is_complete = True + try: + stream.expect("newline") + is_complete = True + except UnexpectedEOF: + is_complete = True if literal: end_location = literal.end_location From effcd72ab6077850c088b07c44c938559b7338a0 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 16:41:25 +0200 Subject: [PATCH 0309/1554] fix: make it possible to provide the multiline option upon instantiation --- packages/mecha/mecha/api.py | 10 ++++++++-- packages/mecha/mecha/parse.py | 7 ++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 50f3b2d27..9e32d2148 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -30,6 +30,7 @@ class Mecha: """Class exposing the command api.""" ctx: InitVar[Optional[Context]] = None + multiline: InitVar[bool] = False spec: CommandSpec = extra_field( default_factory=lambda: CommandSpec(parsers=get_default_parsers()) @@ -37,17 +38,22 @@ class Mecha: serialize: Serializer = extra_field(init=False) - def __post_init__(self, ctx: Optional[Context]): + def __post_init__(self, ctx: Optional[Context], multiline: bool): if ctx: opts = ctx.validate("mecha", MechaOptions) self.spec.multiline = opts.multiline + else: + self.spec.multiline = multiline self.serialize = Serializer(self.spec) @contextmanager def prepare_token_stream(self, stream: TokenStream) -> Iterator[TokenStream]: """Prepare the token stream for parsing.""" - with stream.provide(spec=self.spec), stream.reset_syntax(literal=r"\S+"): + with stream.provide(spec=self.spec), stream.reset_syntax( + comment=r"#.+$", + literal=r"\S+", + ): with stream.indent(skip=["comment"]), stream.ignore("indent", "dedent"): yield stream diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 052372790..21c5bb41b 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -457,7 +457,7 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: def parse_root(stream: TokenStream) -> AstRoot: """Parse root.""" - with stream.syntax(comment=r"#.+$"), stream.intercept("newline"): + with stream.intercept("newline"): start = stream.peek() if not start: @@ -1023,10 +1023,7 @@ class ResourceLocationParser: """Parser for resource locations.""" def __call__(self, stream: TokenStream) -> AstResourceLocation: - with stream.syntax( - resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+", - comment=None, - ): + with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): token = stream.expect("resource_location") value = token.value location = token.location From 222c0b6872371c250bce4832870a781fc2c6e178 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 16:42:50 +0200 Subject: [PATCH 0310/1554] test: add multiline test --- packages/mecha/tests/conftest.py | 8 + .../tests/snapshots/parse__multiline__0.txt | 206 ++++++++++++++++++ .../tests/snapshots/parse__multiline__1.txt | 1 + packages/mecha/tests/test_parse.py | 24 ++ 4 files changed, 239 insertions(+) create mode 100644 packages/mecha/tests/snapshots/parse__multiline__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__multiline__1.txt diff --git a/packages/mecha/tests/conftest.py b/packages/mecha/tests/conftest.py index 56d584cf6..f5830f115 100644 --- a/packages/mecha/tests/conftest.py +++ b/packages/mecha/tests/conftest.py @@ -6,3 +6,11 @@ @pytest.fixture(scope="session") def mc(): return Mecha() + + +@pytest.fixture +def mc_multiline(mc: Mecha): + previous_multiline = mc.spec.multiline + mc.spec.multiline = True + yield mc + mc.spec.multiline = previous_multiline diff --git a/packages/mecha/tests/snapshots/parse__multiline__0.txt b/packages/mecha/tests/snapshots/parse__multiline__0.txt new file mode 100644 index 000000000..2e48121ca --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__multiline__0.txt @@ -0,0 +1,206 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=814, lineno=16, colno=1) + filename: None + commands: + + location: SourceLocation(pos=9, lineno=2, colno=9) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=29, lineno=3, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=32, lineno=3, colno=16) + end_location: SourceLocation(pos=34, lineno=3, colno=18) + variable: 'a' + arguments: + + + location: SourceLocation(pos=91, lineno=4, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=94, lineno=4, colno=16) + end_location: SourceLocation(pos=96, lineno=4, colno=18) + variable: 's' + arguments: + + + location: SourceLocation(pos=155, lineno=5, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=164, lineno=5, colno=22) + end_location: SourceLocation(pos=168, lineno=5, colno=26) + value: 'eyes' + + location: SourceLocation(pos=226, lineno=6, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:facing:pos:subcommand' + arguments: + + location: SourceLocation(pos=233, lineno=6, colno=20) + end_location: SourceLocation(pos=238, lineno=6, colno=25) + x: + + location: SourceLocation(pos=233, lineno=6, colno=20) + end_location: SourceLocation(pos=234, lineno=6, colno=21) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=235, lineno=6, colno=22) + end_location: SourceLocation(pos=236, lineno=6, colno=23) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=237, lineno=6, colno=24) + end_location: SourceLocation(pos=238, lineno=6, colno=25) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=298, lineno=7, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=307, lineno=7, colno=22) + end_location: SourceLocation(pos=311, lineno=7, colno=26) + value: 'feet' + + location: SourceLocation(pos=363, lineno=8, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=374, lineno=8, colno=24) + end_location: SourceLocation(pos=380, lineno=8, colno=30) + x: + + location: SourceLocation(pos=374, lineno=8, colno=24) + end_location: SourceLocation(pos=375, lineno=8, colno=25) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=376, lineno=8, colno=26) + end_location: SourceLocation(pos=377, lineno=8, colno=27) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=378, lineno=8, colno=28) + end_location: SourceLocation(pos=380, lineno=8, colno=30) + type: 'local' + value: 1 + + location: SourceLocation(pos=434, lineno=9, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:rotated:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=445, lineno=9, colno=24) + end_location: SourceLocation(pos=447, lineno=9, colno=26) + variable: 's' + arguments: + + + location: SourceLocation(pos=570, lineno=11, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=581, lineno=11, colno=24) + end_location: SourceLocation(pos=588, lineno=11, colno=31) + x: + + location: SourceLocation(pos=581, lineno=11, colno=24) + end_location: SourceLocation(pos=582, lineno=11, colno=25) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=583, lineno=11, colno=26) + end_location: SourceLocation(pos=584, lineno=11, colno=27) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=585, lineno=11, colno=28) + end_location: SourceLocation(pos=588, lineno=11, colno=31) + type: 'local' + value: -1 + + location: SourceLocation(pos=638, lineno=12, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=648, lineno=12, colno=23) + end_location: SourceLocation(pos=666, lineno=12, colno=41) + variable: 's' + arguments: + + location: SourceLocation(pos=651, lineno=12, colno=26) + end_location: SourceLocation(pos=665, lineno=12, colno=40) + inverted: False + key: + + location: SourceLocation(pos=651, lineno=12, colno=26) + end_location: SourceLocation(pos=659, lineno=12, colno=34) + value: 'distance' + value: + + location: SourceLocation(pos=660, lineno=12, colno=35) + end_location: SourceLocation(pos=665, lineno=12, colno=40) + min: None + max: 0.6 + + location: SourceLocation(pos=767, lineno=14, colno=13) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=787, lineno=15, colno=17) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=791, lineno=15, colno=21) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + fragments: + + location: SourceLocation(pos=791, lineno=15, colno=21) + end_location: SourceLocation(pos=794, lineno=15, colno=24) + value: "I'm" + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + + location: SourceLocation(pos=795, lineno=15, colno=25) + end_location: SourceLocation(pos=801, lineno=15, colno=31) + value: 'facing' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + + location: SourceLocation(pos=802, lineno=15, colno=32) + end_location: SourceLocation(pos=805, lineno=15, colno=35) + value: 'the' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: ' ' + + location: SourceLocation(pos=806, lineno=15, colno=36) + end_location: SourceLocation(pos=813, lineno=15, colno=43) + value: 'target!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline__1.txt b/packages/mecha/tests/snapshots/parse__multiline__1.txt new file mode 100644 index 000000000..9357e7f29 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__multiline__1.txt @@ -0,0 +1 @@ +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 850fc4190..7e72fbb03 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -58,3 +58,27 @@ def test_argument_examples( assert snapshot() == "\n---\n".join( [test_name, str(properties), value, mc.serialize(ast), ast.dump()] ) + + +def test_multiline(snapshot: SnapshotFixture, mc_multiline: Mecha): + function = """ + execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] # Check if we're close to the + # player's feet. + run + say I'm facing the target! + """ + + ast = mc_multiline.parse_function(function) + + assert snapshot() == ast.dump() + assert snapshot() == mc_multiline.serialize(ast) From 75f3ecbc9e397a1f917875315cbf8b3b94f7382a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 17:14:23 +0200 Subject: [PATCH 0311/1554] chore: update readme --- packages/mecha/README.md | 50 +++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index 36af07508..6e7ac01b7 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -9,33 +9,45 @@ > A powerful Minecraft command library. -## Introduction - -This package provides a versatile API for generating Minecraft commands in Python. It uses the [`beet`](https://github.com/vberlier/beet) library to generate functions and integrates natively with the `beet` pipeline. - ```python -from beet import Context from mecha import Mecha -def my_plugin(ctx: Context): - mc = ctx.inject(Mecha) - - with mc.function("foo"): - mc.say("hello") +mc = Mecha(multiline=True) + +function = """ + execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] # Check if we're close to the + # player's feet. + run + say I'm facing the target! +""" + +ast = mc.parse_function(function) +print(mc.serialize(ast)) # execute as @a at @s anchored eyes facing ... ``` -You can directly create handles from data pack instances. The library can be used on its own without being part of a `beet` pipeline. +## Introduction -```python -from beet import DataPack -from mecha import Mecha +This package provides everything you need for working with Minecraft commands in Python, whether you're looking to process commands or build abstractions on top. -with DataPack(path="demo") as data: - mc = Mecha(data) +### Features - with mc.function("foo"): - mc.say("hello") -``` +- Extensible, version-agnostic `mcfunction` parser +- Clean abstract syntax tree with source location +- Command config resolver that flattens all the valid prototypes +- Powerful rule dispatcher for processing specific ast nodes +- Composable visitors and reducers +- _(soon)_ Integrate compiler passes into your [`beet`](https://github.com/vberlier/beet) pipeline +- _(soon)_ Expressive command API for writing commands in Python ## Installation From a1a0c3207d8282f60554c26149962cf1f72971ef Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Sep 2021 17:19:47 +0200 Subject: [PATCH 0312/1554] chore: update dependencies --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 32 ++++++++++++++++---------------- packages/mecha/pyproject.toml | 7 ++++--- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 62c2cf2ff..3bed430e0 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.167" + "pyright": "^1.1.168" } }, "node_modules/pyright": { - "version": "1.1.167", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.167.tgz", - "integrity": "sha512-2RMw5CrH68hOjGW+LKMR87csS3FN+wo+kKkBwl+QiJnBRxvK4bF7TWdr39frJrMXPqo0s6gdSQZj4W+6Bs4jWA==", + "version": "1.1.168", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.168.tgz", + "integrity": "sha512-dypPjQI7WSS60drwLJsh2N15gZirnmQuFgDADVWVLYb9CRjV/BtPmiG7hPZnjNKk40tUHlTHycazIidQbi/s5Q==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.167", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.167.tgz", - "integrity": "sha512-2RMw5CrH68hOjGW+LKMR87csS3FN+wo+kKkBwl+QiJnBRxvK4bF7TWdr39frJrMXPqo0s6gdSQZj4W+6Bs4jWA==", + "version": "1.1.168", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.168.tgz", + "integrity": "sha512-dypPjQI7WSS60drwLJsh2N15gZirnmQuFgDADVWVLYb9CRjV/BtPmiG7hPZnjNKk40tUHlTHycazIidQbi/s5Q==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 46621a00b..fd6df0c38 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.167" + "pyright": "^1.1.168" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1f41b7877..0ec6a9b6f 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -10,7 +10,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "attrs" version = "21.2.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.1" +version = "0.41.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.8b0" +version = "21.9b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -338,9 +338,9 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "lectern" -version = "0.15.3" +version = "0.16.0" description = "Literate Minecraft data packs and resource packs." -category = "dev" +category = "main" optional = false python-versions = ">=3.8,<4.0" @@ -353,7 +353,7 @@ markdown-it-py = ">=1.1.0,<2.0.0" name = "markdown-it-py" version = "1.1.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" +category = "main" optional = false python-versions = "~=3.6" @@ -555,7 +555,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.19.1" +version = "7.19.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -826,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "47a8e2b6b6ad8bebaffda3722b90c31c42d70ae1e6f6a1fe9dd20887ceffa37f" +content-hash = "3762bd1cd83e5e79bdad1ca9b2033c453194c1e7406cb3402cece4dbd9c6458e" [metadata.files] atomicwrites = [ @@ -842,12 +842,12 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.1-py3-none-any.whl", hash = "sha256:38381d525c6a2905b7d8615863648657e81c246dd3660d719979c4083dcd57f7"}, - {file = "beet-0.41.1.tar.gz", hash = "sha256:fda29893a304e257f99ff5e632c49dbd932ef8ca3a749a1f70b6287d5eda5f66"}, + {file = "beet-0.41.2-py3-none-any.whl", hash = "sha256:4e14f2bf8c4c14d3d75ec66e67bb228ac84213c87d33de2f8866cb3eb0f6c700"}, + {file = "beet-0.41.2.tar.gz", hash = "sha256:dfa6875613dc904e84b25621ddb573fd21f80db621341a8fb8a0ddc10f2c93e4"}, ] black = [ - {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, - {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, + {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, + {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -995,8 +995,8 @@ keyring = [ {file = "keyring-23.1.0.tar.gz", hash = "sha256:b7e0156667f5dcc73c1f63a518005cd18a4eb23fe77321194fefcc03748b21a4"}, ] lectern = [ - {file = "lectern-0.15.3-py3-none-any.whl", hash = "sha256:b2e2718b5f58eb39a973f62b3b1ce49ccfdb8fd262a8bd7390f255285b16b022"}, - {file = "lectern-0.15.3.tar.gz", hash = "sha256:5933d7038eeba730016ec1ab42ada1e0a27b6ead59c80a0dc22c397893be99ba"}, + {file = "lectern-0.16.0-py3-none-any.whl", hash = "sha256:b63ba29cbce4446c4cef5412542417ab45dab512a4fe36c46858c3e15dced2ba"}, + {file = "lectern-0.16.0.tar.gz", hash = "sha256:1b7ce215ec5fbc9a82a9c15508df07e8038c715e3e04e8b191f96418cca7571a"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, @@ -1149,8 +1149,8 @@ python-gitlab = [ {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.19.1.tar.gz", hash = "sha256:43f52f9a97677c029009063807f1fec9ffaabf049bd02f3fd898f0edf1ce5155"}, - {file = "python_semantic_release-7.19.1-py3-none-any.whl", hash = "sha256:8f5bfe18e78d44dc296966376f2bae2177ea881b628473d685b46f09a75ea92b"}, + {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, + {file = "python_semantic_release-7.19.2-py3-none-any.whl", hash = "sha256:b2c8bb16a643fee0831be4d06138bc1440ebd4f252c3397d41abde179ea56852"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e56070b83..8cd4c4049 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,15 +23,16 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.41.1" +beet = ">=0.41.2" tokenstream = ">=1.0.5" +lectern = ">=0.16.0" [tool.poetry.dev-dependencies] -black = "^21.7b0" +black = "^21.9b0" isort = "^5.9.3" pytest = "^6.2.5" pytest-insta = "^0.1.10" -python-semantic-release = "^7.19.1" +python-semantic-release = "^7.19.2" lectern = ">=0.15.3" [tool.black] From 048a0b52da7a3127bfb1848e8ebbf53122113747 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Sep 2021 04:43:15 +0200 Subject: [PATCH 0313/1554] refactor: improve public api and remove root filename --- packages/mecha/mecha/api.py | 86 +++++-- packages/mecha/mecha/ast.py | 55 ++++- packages/mecha/mecha/parse.py | 223 ++++++++++-------- packages/mecha/poetry.lock | 28 ++- packages/mecha/pyproject.toml | 2 +- ...nt_examples_minecraft_block_pos_1_0__0.txt | 2 +- ...nt_examples_minecraft_block_pos_1_2__0.txt | 2 +- ...mples_minecraft_block_predicate_1_1__0.txt | 2 +- ...mples_minecraft_block_predicate_1_2__0.txt | 2 +- ...mples_minecraft_block_predicate_1_3__0.txt | 2 +- ...mples_minecraft_block_predicate_1_4__0.txt | 2 +- ..._examples_minecraft_block_state_1_2__0.txt | 2 +- ..._examples_minecraft_block_state_1_3__0.txt | 2 +- ..._examples_minecraft_block_state_1_4__0.txt | 2 +- ..._examples_minecraft_block_state_1_5__0.txt | 2 +- ...t_examples_minecraft_column_pos_1_0__0.txt | 2 +- ...ent_examples_minecraft_particle_1_0__0.txt | 2 +- ...ent_examples_minecraft_particle_1_4__0.txt | 2 +- ...ent_examples_minecraft_particle_1_6__0.txt | 2 +- .../snapshots/parse__command_examples__0.txt | 1 - .../tests/snapshots/parse__multiline__0.txt | 3 +- packages/mecha/tests/test_dispatch.py | 6 +- packages/mecha/tests/test_parse.py | 4 +- 23 files changed, 283 insertions(+), 153 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 9e32d2148..5c990d6d8 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -5,19 +5,22 @@ from contextlib import contextmanager -from dataclasses import InitVar, dataclass, replace -from typing import Any, Iterator, List, Optional, Union +from dataclasses import InitVar, dataclass +from typing import Any, Iterator, Optional, Type, TypeVar, Union, overload -from beet import Context, Function, TextFileBase +from beet import Context, TextFileBase +from beet.core.file import TextFile from beet.core.utils import extra_field from pydantic import BaseModel from tokenstream import TokenStream -from .ast import AstCommand, AstRoot +from .ast import AstNode, AstRoot from .parse import delegate, get_default_parsers from .serialize import Serializer from .spec import CommandSpec +AstNodeType = TypeVar("AstNodeType", bound=AstNode) + class MechaOptions(BaseModel): """Mecha options.""" @@ -48,31 +51,68 @@ def __post_init__(self, ctx: Optional[Context], multiline: bool): self.serialize = Serializer(self.spec) @contextmanager - def prepare_token_stream(self, stream: TokenStream) -> Iterator[TokenStream]: + def prepare_token_stream( + self, + stream: TokenStream, + multiline: Optional[bool] = None, + ) -> Iterator[TokenStream]: """Prepare the token stream for parsing.""" - with stream.provide(spec=self.spec), stream.reset_syntax( - comment=r"#.+$", - literal=r"\S+", + with stream.reset(*stream.data), stream.provide( + spec=self.spec, + multiline=self.spec.multiline if multiline is None else multiline, ): - with stream.indent(skip=["comment"]), stream.ignore("indent", "dedent"): - yield stream + with stream.reset_syntax(comment=r"#.+$", literal=r"\S+"): + with stream.indent(skip=["comment"]), stream.ignore("indent", "dedent"): + with stream.intercept("newline", "eof"): + yield stream - def parse_function( + @overload + def parse( self, - function: Union[TextFileBase[Any], str, List[str]], + source: Union[TextFileBase[Any], str], + *, filename: Optional[str] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, ) -> AstRoot: - """Parse a function and return the ast.""" - if isinstance(function, (str, list)): - function = Function(function) + ... + + @overload + def parse( + self, + source: Union[TextFileBase[Any], str], + *, + type: Type[AstNodeType], + filename: Optional[str] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, + ) -> AstNodeType: + ... + + def parse( + self, + source: Union[TextFileBase[Any], str], + *, + type: Optional[Type[AstNode]] = None, + filename: Optional[str] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, + ) -> Any: + """Parse the given source into an AST.""" + if not type: + type = AstRoot + + if not type.parser: + raise TypeError(f"No parser directly associated with {type}.") + + if isinstance(source, str): + source = TextFile(source) - if not filename and function.source_path: - filename = str(function.source_path) + if not filename and source.source_path: + filename = str(source.source_path) - with self.prepare_token_stream(TokenStream(function.text)) as stream: - return replace(delegate("root", stream), filename=filename) + # TODO: Wrap errors in a clean FormattedPipelineException - def parse_command(self, text: str) -> AstCommand: - """Parse a single command from a string and return the ast.""" - with self.prepare_token_stream(TokenStream(text)) as stream: - return delegate("command", stream) + stream = TokenStream(source.text) + with self.prepare_token_stream(stream, multiline=multiline): + return delegate(type.parser, stream) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index e5f346f8e..da9a68e20 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -53,7 +53,7 @@ from dataclasses import dataclass, fields -from typing import Any, Iterator, Literal, Optional, Tuple, TypeVar, Union +from typing import Any, ClassVar, Iterator, Literal, Optional, Tuple, TypeVar, Union from uuid import UUID from beet.core.utils import extra_field, required_field @@ -75,6 +75,8 @@ class AstNode: location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) end_location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) + parser: ClassVar[Optional[str]] = None + def __iter__(self) -> Iterator["AstNode"]: for f in fields(self): attribute = getattr(self, f.name) @@ -126,9 +128,10 @@ class AstChildren(Tuple[AstNodeType, ...]): class AstRoot(AstNode): """Root ast node""" - filename: Optional[str] = None commands: AstChildren["AstCommand"] = required_field() + parser = "root" + @dataclass(frozen=True) class AstCommand(AstNode): @@ -137,6 +140,8 @@ class AstCommand(AstNode): identifier: str = required_field() arguments: AstChildren[AstNode] = required_field() + parser = "command" + @dataclass(frozen=True) class AstLiteral(AstNode): @@ -144,6 +149,8 @@ class AstLiteral(AstNode): value: str = required_field() + parser = "literal" + @dataclass(frozen=True) class AstString(AstNode): @@ -151,6 +158,8 @@ class AstString(AstNode): value: str = required_field() + parser = "phrase" + @dataclass(frozen=True) class AstBool(AstNode): @@ -158,6 +167,8 @@ class AstBool(AstNode): value: bool = required_field() + parser = "bool" + @dataclass(frozen=True) class AstNumber(AstNode): @@ -165,6 +176,8 @@ class AstNumber(AstNode): value: Union[int, float] = required_field() + parser = "numeric" + @dataclass(frozen=True) class AstUUID(AstNode): @@ -172,6 +185,8 @@ class AstUUID(AstNode): value: UUID = required_field() + parser = "uuid" + @dataclass(frozen=True) class AstCoordinate(AstNode): @@ -180,6 +195,8 @@ class AstCoordinate(AstNode): type: Literal["absolute", "relative", "local"] = "absolute" value: Union[int, float] = required_field() + parser = "coordinate" + @dataclass(frozen=True) class AstVector2(AstNode): @@ -202,6 +219,8 @@ class AstVector3(AstNode): class AstJson(AstNode): """Base ast node for json.""" + parser = "json" + def evaluate(self) -> Any: """Return the json value.""" raise NotImplementedError() @@ -213,6 +232,8 @@ class AstJsonValue(AstJson): value: Any = required_field() + parser = None + def evaluate(self) -> Any: return self.value @@ -223,6 +244,8 @@ class AstJsonArray(AstJson): elements: AstChildren[AstJson] = required_field() + parser = None + def evaluate(self) -> Any: return [element.evaluate() for element in self.elements] @@ -248,6 +271,8 @@ class AstJsonObject(AstJson): entries: AstChildren[AstJsonObjectEntry] = required_field() + parser = "json" + def evaluate(self) -> Any: return {entry.key.value: entry.value.evaluate() for entry in self.entries} @@ -256,6 +281,8 @@ def evaluate(self) -> Any: class AstNbt(AstNode): """Base ast node for nbt.""" + parser = "nbt" + def evaluate(self) -> Any: """Return the nbt value.""" raise NotImplementedError() @@ -267,6 +294,8 @@ class AstNbtValue(AstNbt): value: Any = required_field() + parser = None + def evaluate(self) -> Any: return self.value @@ -277,6 +306,8 @@ class AstNbtList(AstNbt): elements: AstChildren[AstNbt] = required_field() + parser = None + def evaluate(self) -> Any: return ListTag([element.evaluate() for element in self.elements]) # type: ignore @@ -302,6 +333,8 @@ class AstNbtCompound(AstNbt): entries: AstChildren[AstNbtCompoundEntry] = required_field() + parser = "nbt_compound" + def evaluate(self) -> Any: return Compound( # type: ignore {entry.key.value: entry.value.evaluate() for entry in self.entries}, @@ -314,6 +347,8 @@ class AstNbtByteArray(AstNbt): elements: AstChildren[AstNbt] = required_field() + parser = None + def evaluate(self) -> Any: return ByteArray([element.evaluate() for element in self.elements]) # type: ignore @@ -324,6 +359,8 @@ class AstNbtIntArray(AstNbt): elements: AstChildren[AstNbt] = required_field() + parser = None + def evaluate(self) -> Any: return IntArray([element.evaluate() for element in self.elements]) # type: ignore @@ -334,6 +371,8 @@ class AstNbtLongArray(AstNbt): elements: AstChildren[AstNbt] = required_field() + parser = None + def evaluate(self) -> Any: return LongArray([element.evaluate() for element in self.elements]) # type: ignore @@ -346,6 +385,8 @@ class AstResourceLocation(AstNode): namespace: Optional[str] = None path: str = required_field() + parser = "resource_location_or_tag" + def get_canonical_value(self) -> str: """Return the canonical value of the resource location as a string.""" prefix = "#" if self.is_tag else "" @@ -395,6 +436,8 @@ def value(self) -> Union[int, float]: """Return the exact value.""" return self.min # type: ignore + parser = "range" + @dataclass(frozen=True) class AstTime(AstNode): @@ -403,6 +446,8 @@ class AstTime(AstNode): value: Union[int, float] = required_field() unit: Literal["day", "second", "tick"] = "tick" + parser = "time" + @dataclass(frozen=True) class AstSelectorScoreMatch(AstNode): @@ -460,6 +505,8 @@ class AstSelector(AstNode): variable: Literal["p", "r", "a", "e", "s"] = required_field() arguments: AstChildren[AstSelectorArgument] = AstChildren() + parser = "selector" + @dataclass(frozen=True) class AstMessage(AstNode): @@ -483,6 +530,8 @@ class AstNbtPath(AstNode): Union[AstString, AstNbtCompound, AstNbtPathSubscript] ] = required_field() + parser = "nbt_path" + @dataclass(frozen=True) class AstParticleParameters(AstNode): @@ -552,3 +601,5 @@ class AstParticle(AstNode): name: AstResourceLocation = required_field() parameters: Optional[AstParticleParameters] = None + + parser = "particle" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 21c5bb41b..52e2657ab 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -3,11 +3,13 @@ "get_stream_spec", "get_stream_scope", "get_stream_properties", + "get_stream_multiline", + "get_stream_command_indentation", "delegate", "string_to_number", "QuoteHelper", "parse_root", - "parse_command", + "CommandParser", "parse_argument", "parse_bool", "NumericParser", @@ -20,6 +22,7 @@ "Vector2Parser", "Vector3Parser", "JsonParser", + "JsonObjectConstraint", "NbtParser", "NbtCompoundConstraint", "AdjacentConstraint", @@ -63,13 +66,7 @@ # pyright: reportMissingTypeStubs=false from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String -from tokenstream import ( - InvalidSyntax, - SourceLocation, - TokenStream, - UnexpectedEOF, - set_location, -) +from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location from .ast import ( AstBlock, @@ -130,9 +127,6 @@ NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" -# TODO: Handle the extended syntax by default and validate vanilla compatibility in a separate pass - - def get_default_parsers() -> Dict[str, Parser]: """Return the default parsers.""" return { @@ -150,6 +144,7 @@ def get_default_parsers() -> Dict[str, Parser]: "phrase": StringParser(type="phrase"), "greedy": StringParser(type="greedy"), "json": JsonParser(), + "json_object": JsonObjectConstraint(delegate('json')), "nbt": NbtParser(), "nbt_compound": NbtCompoundConstraint(delegate("nbt")), "adjacent_nbt_compound": AdjacentConstraint( @@ -290,7 +285,7 @@ def get_default_parsers() -> Dict[str, Parser]: # Command ################################################################################ "root": parse_root, - "command": parse_command, + "command": CommandParser(), "command:argument": parse_argument, "command:argument:brigadier:bool": delegate("bool"), "command:argument:brigadier:double": MinMaxConstraint(delegate("numeric")), @@ -426,9 +421,13 @@ def get_stream_properties(stream: TokenStream) -> Dict[str, Any]: return stream.data.get("properties", {}) +def get_stream_multiline(stream: TokenStream) -> bool: + """Return whether the token stream is currently parsing in multiline mode.""" + return stream.data.get("multiline", False) + + def get_stream_command_indentation(stream: TokenStream) -> int: """Return the indentation level associated with the current command.""" - # TODO: To support nested functions in the future there should be a way to reset this return stream.data.get("command_indentation", stream.indentation[-1]) @@ -457,108 +456,115 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: def parse_root(stream: TokenStream) -> AstRoot: """Parse root.""" - with stream.intercept("newline"): - start = stream.peek() + start = stream.peek() - if not start: - node = AstRoot(filename=None, commands=AstChildren()) - return set_location(node, SourceLocation(0, 1, 1)) + if not start: + node = AstRoot(commands=AstChildren()) + return set_location(node, SourceLocation(0, 1, 1)) - commands: List[AstCommand] = [] + commands: List[AstCommand] = [] - # TODO: This causes the parser to not error on inline comments in non-multiline mode - with stream.ignore("comment"): - for _ in stream.peek_until(): - while stream.get("newline"): - continue - if stream.peek(): - commands.append(delegate("command", stream)) + with stream.ignore("comment"): + for _ in stream.peek_until(): + if stream.get("newline"): + continue + if stream.get("eof"): + break + commands.append(delegate("command", stream)) - node = AstRoot(filename=None, commands=AstChildren(commands)) - return set_location(node, start, stream.current) + node = AstRoot(commands=AstChildren(commands)) + return set_location(node, start, stream.current) -def parse_command(stream: TokenStream) -> AstCommand: - """Parse command.""" - spec = get_stream_spec(stream) - scope = get_stream_scope(stream) - tree = spec.tree.get(scope) +@dataclass +class CommandParser: + """Parser for commands.""" + + def __call__(self, stream: TokenStream) -> AstCommand: + """Parse command.""" + spec = get_stream_spec(stream) + scope = get_stream_scope(stream) + multiline = get_stream_multiline(stream) + + tree = spec.tree.get(scope) + arguments: List[AstNode] = [] + + with stream.checkpoint(): + location = stream.expect().location + end_location = location + + level = get_stream_command_indentation(stream) + is_complete = False + + while tree and tree.children: + # if ( + # (literal := stream.get("literal")) + # and (child := tree.children.get(literal.value)) + # and child.type == "literal" + # ): + # pass + for (name, child), alternative in stream.choose(*tree.children.items()): + with alternative, stream.provide(scope=scope + (name,)): + literal = None + argument = None + + if child.type == "literal": + literal = stream.expect(("literal", name)) + elif child.type == "argument": + argument = delegate("command:argument", stream) + + if not child.redirect and not child.children: + stream.expect("newline", "eof") + is_complete = True - arguments: List[AstNode] = [] + if literal: + end_location = literal.end_location + elif argument: + arguments.append(argument) + end_location = argument.end_location - with stream.checkpoint(): - location = stream.expect().location - end_location = location + scope = stream.data["scope"] + tree = child - level = get_stream_command_indentation(stream) - is_complete = False + if is_complete: + break - while tree and tree.children: - for (name, child), alternative in stream.choose(*tree.children.items()): - with alternative, stream.provide(scope=scope + (name,)): - literal = None - argument = None + # TODO: find a way to extract this in a function to be able to use it in MessageParser + if multiline: + with stream.checkpoint() as commit: + if list(stream.collect("newline")): + with stream.intercept("whitespace"): + whitespace = stream.get("whitespace") + eof = stream.get("eof") + if ( + whitespace + and level < len(whitespace.value.expandtabs()) + and not eof + ): + commit() + elif tree.executable: + commit() + break + elif tree.executable and stream.get("newline", "eof"): + break - if child.type == "literal": - literal = stream.expect(("literal", name)) - elif child.type == "argument": - argument = delegate("command:argument", stream) + if tree.executable and not stream.peek(): + break - if not child.redirect and not child.children: - try: - stream.expect("newline") - is_complete = True - except UnexpectedEOF: - is_complete = True + target = spec.tree.get(tree.redirect) + recursive = target and target.subcommand - if literal: - end_location = literal.end_location - elif argument: - arguments.append(argument) - end_location = argument.end_location - - scope = stream.data["scope"] - tree = child - - if is_complete: - break - - # TODO: find a way to extract this in a function to be able to use it in MessageParser - if spec.multiline: - with stream.checkpoint() as commit: - if list(stream.collect("newline")): - with stream.intercept("whitespace", "eof"): - whitespace = stream.get("whitespace") - eof = stream.get("eof") - if ( - whitespace - and level < len(whitespace.value.expandtabs()) - and not eof - ): - commit() - elif tree.executable: - commit() - break - elif tree.executable and stream.get("newline"): - break - - if tree.executable and not stream.peek(): - break - - target = spec.tree.get(tree.redirect) - recursive = target and target.subcommand - - if tree.subcommand or recursive: - subcommand_scope = tree.redirect if tree.redirect is not None else scope - with stream.provide(scope=subcommand_scope, command_indentation=level): - node = delegate("command", stream) - arguments.append(node) - end_location = node.end_location - scope += ("subcommand",) - break + if tree.subcommand or recursive: + subcommand_scope = tree.redirect if tree.redirect is not None else scope + with stream.provide(scope=subcommand_scope, command_indentation=level): + node = delegate("command", stream) + arguments.append(node) + end_location = node.end_location + scope += ("subcommand",) + break - node = AstCommand(identifier=":".join(scope), arguments=AstChildren(arguments)) - return set_location(node, location, end_location) + node = AstCommand(identifier=":".join(scope), arguments=AstChildren(arguments)) + return set_location(node, location, end_location) def parse_argument(stream: TokenStream) -> AstNode: @@ -838,6 +844,21 @@ def __call__(self, stream: TokenStream) -> AstJson: return set_location(node, stream.current) +@dataclass +class JsonObjectConstraint: + """Constraint that only allows json objects.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + + if not isinstance(node, AstJsonObject): + raise node.emit_error(InvalidSyntax("Expected json object.")) + + return node + + @dataclass class NbtParser: """Parser for nbt tags.""" diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 0ec6a9b6f..e444f1489 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -709,7 +709,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.0.5" +version = "1.1.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -826,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "3762bd1cd83e5e79bdad1ca9b2033c453194c1e7406cb3402cece4dbd9c6458e" +content-hash = "1bb348292b4cd53bf513d441ed0df47acc2e98d336ccc99e7e77dda901d56950" [metadata.files] atomicwrites = [ @@ -1003,12 +1003,22 @@ markdown-it-py = [ {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1017,14 +1027,21 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1034,6 +1051,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, @@ -1267,8 +1287,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.0.5-py3-none-any.whl", hash = "sha256:2e10bc0e9241ed98e3fd27ec51e39f57d6295212210557437c6bd8e1a1fae60c"}, - {file = "tokenstream-1.0.5.tar.gz", hash = "sha256:fd3d456af5debcdf0211ed19b6b058193574f7b294215f9015f876ef8ddb271a"}, + {file = "tokenstream-1.1.0-py3-none-any.whl", hash = "sha256:4c2e22847f5ed170097367967caaf13b92bcd5354ab36ce0f32e3f4f8e03875d"}, + {file = "tokenstream-1.1.0.tar.gz", hash = "sha256:28ecb9e23666c91ef1ee8a31386c79df9f88daeee369fcafaa30d82a57558972"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8cd4c4049..dddb3880d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.41.2" -tokenstream = ">=1.0.5" +tokenstream = "^1.1.0" lectern = ">=0.16.0" [tool.poetry.dev-dependencies] diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt index cd7fd310b..74345ebfd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:block_pos 1 0 --- ^-3 --- -UnexpectedEOF: Expected coordinate but reached end of file. +UnexpectedToken: Expected coordinate but got eof. location = SourceLocation(pos=3, lineno=1, colno=4) end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt index bc2a41046..4d658151a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:block_pos 1 2 --- 17 --- -UnexpectedEOF: Expected coordinate but reached end of file. +UnexpectedToken: Expected coordinate but got eof. location = SourceLocation(pos=2, lineno=1, colno=3) end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt index 39e1df5eb..d0f7ba3e3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 1 --- #stone[foo=bar, --- -UnexpectedEOF: Expected bracket ']' but reached end of file. +UnexpectedEOF: Expected word or quoted_string but reached end of file. location = SourceLocation(pos=15, lineno=1, colno=16) end_location = SourceLocation(pos=15, lineno=1, colno=16) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt index 2de2014bb..a3ea789d2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 2 --- #stone[ --- -UnexpectedEOF: Expected bracket ']' but reached end of file. +UnexpectedEOF: Expected word or quoted_string but reached end of file. location = SourceLocation(pos=7, lineno=1, colno=8) end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt index 0a7fd62c2..40f3917b2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 3 --- #stone[foo --- -UnexpectedEOF: Expected equal but reached end of file. +UnexpectedToken: Expected equal but got eof. location = SourceLocation(pos=10, lineno=1, colno=11) end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt index 8f797b9c7..f06a30b5e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt @@ -4,7 +4,7 @@ minecraft:block_predicate 1 4 --- #stone[thing=hello]{ --- -UnexpectedEOF: Expected curly '}' but reached end of file. +UnexpectedToken: Expected curly '}' but got eof. location = SourceLocation(pos=20, lineno=1, colno=21) end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt index f16145a5f..e74f03840 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 2 --- stone[foo=bar, --- -UnexpectedEOF: Expected bracket ']' but reached end of file. +UnexpectedEOF: Expected word or quoted_string but reached end of file. location = SourceLocation(pos=14, lineno=1, colno=15) end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt index 1e3100b0a..937030ed3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 3 --- stone[ --- -UnexpectedEOF: Expected bracket ']' but reached end of file. +UnexpectedEOF: Expected word or quoted_string but reached end of file. location = SourceLocation(pos=6, lineno=1, colno=7) end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt index 60872c4b9..4fa6fd64f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 4 --- stone[foo --- -UnexpectedEOF: Expected equal but reached end of file. +UnexpectedToken: Expected equal but got eof. location = SourceLocation(pos=9, lineno=1, colno=10) end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt index 88d18ad90..eb5493b5d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt @@ -4,7 +4,7 @@ minecraft:block_state 1 5 --- stone[thing=hello]{ --- -UnexpectedEOF: Expected curly '}' but reached end of file. +UnexpectedToken: Expected curly '}' but got eof. location = SourceLocation(pos=19, lineno=1, colno=20) end_location = SourceLocation(pos=19, lineno=1, colno=20) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt index 87c494e7d..5d004ff95 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:column_pos 1 0 --- 7 --- -UnexpectedEOF: Expected coordinate but reached end of file. +UnexpectedToken: Expected coordinate but got eof. location = SourceLocation(pos=1, lineno=1, colno=2) end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt index 2d62ae445..e5efca0a9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 0 --- dust 1.0 0.5 0.5 --- -UnexpectedEOF: Expected number but reached end of file. +UnexpectedToken: Expected number but got eof. location = SourceLocation(pos=16, lineno=1, colno=17) end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt index 995a910fc..45b8675ab 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 4 --- item minecraft:apple{ --- -UnexpectedEOF: Expected curly '}' but reached end of file. +UnexpectedToken: Expected curly '}' but got eof. location = SourceLocation(pos=21, lineno=1, colno=22) end_location = SourceLocation(pos=21, lineno=1, colno=22) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt index e1d39c250..ff7146b84 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt @@ -4,7 +4,7 @@ minecraft:particle 1 6 --- vibration 0.0 64.0 --- -UnexpectedEOF: Expected number but reached end of file. +UnexpectedToken: Expected number but got eof. location = SourceLocation(pos=18, lineno=1, colno=19) end_location = SourceLocation(pos=18, lineno=1, colno=19) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 70b381475..ccd68476f 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,7 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5876, lineno=145, colno=1) - filename: None commands: location: SourceLocation(pos=14, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__multiline__0.txt b/packages/mecha/tests/snapshots/parse__multiline__0.txt index 2e48121ca..e12e05c63 100644 --- a/packages/mecha/tests/snapshots/parse__multiline__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline__0.txt @@ -1,7 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=814, lineno=16, colno=1) - filename: None + end_location: SourceLocation(pos=818, lineno=16, colno=5) commands: location: SourceLocation(pos=9, lineno=2, colno=9) diff --git a/packages/mecha/tests/test_dispatch.py b/packages/mecha/tests/test_dispatch.py index 2806b2603..88950d5c4 100644 --- a/packages/mecha/tests/test_dispatch.py +++ b/packages/mecha/tests/test_dispatch.py @@ -16,7 +16,7 @@ def test_visitor(mc: Mecha): - ast = mc.parse_function("particle dust 1.0 0.5 0.5 1.0 7 7 7") + ast = mc.parse("particle dust 1.0 0.5 0.5 1.0 7 7 7") numbers: List[AstNode] = [] @@ -33,7 +33,7 @@ def test_visitor(mc: Mecha): def test_visitor_extend(mc: Mecha): - ast = mc.parse_command("particle dust 1.0 0.5 7 1.0 7 7 7") + ast = mc.parse("particle dust 1.0 0.5 7 1.0 7 7 7", type=AstCommand) nodes: List[Type[AstNode]] = [] numbers: List[AstNumber] = [] @@ -69,7 +69,7 @@ def seven(self, node: AstNumber): def test_visitor_result(mc: Mecha): - ast = mc.parse_function("say hello\nsay world\n") + ast = mc.parse("say hello\nsay world\n") class Foo(Visitor): @rule(AstRoot) diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 7e72fbb03..ef2e54caf 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -7,7 +7,7 @@ def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): - ast = mc.parse_function(get_command_examples()) + ast = mc.parse(get_command_examples()) assert snapshot() == ast.dump() assert snapshot() == mc.serialize(ast) @@ -78,7 +78,7 @@ def test_multiline(snapshot: SnapshotFixture, mc_multiline: Mecha): say I'm facing the target! """ - ast = mc_multiline.parse_function(function) + ast = mc_multiline.parse(function) assert snapshot() == ast.dump() assert snapshot() == mc_multiline.serialize(ast) From 1cf7c40b52d7630993035f8ab73e792d77feb195 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Sep 2021 04:47:48 +0200 Subject: [PATCH 0314/1554] refactor: use generic TypeConstraint to restrict json and nbt --- packages/mecha/mecha/parse.py | 53 +++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 52e2657ab..f23ed1796 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -22,9 +22,8 @@ "Vector2Parser", "Vector3Parser", "JsonParser", - "JsonObjectConstraint", + "TypeConstraint", "NbtParser", - "NbtCompoundConstraint", "AdjacentConstraint", "ResourceLocationParser", "NoTagConstraint", @@ -61,7 +60,18 @@ from dataclasses import dataclass, field from functools import partial -from typing import Any, Dict, Iterator, List, Literal, Optional, Tuple, Type, overload +from typing import ( + Any, + Dict, + Iterator, + List, + Literal, + Optional, + Tuple, + Type, + Union, + overload, +) from uuid import UUID # pyright: reportMissingTypeStubs=false @@ -144,9 +154,17 @@ def get_default_parsers() -> Dict[str, Parser]: "phrase": StringParser(type="phrase"), "greedy": StringParser(type="greedy"), "json": JsonParser(), - "json_object": JsonObjectConstraint(delegate('json')), + "json_object": TypeConstraint( + parser=delegate("json"), + type=AstJsonObject, + message="Expected json object.", + ), "nbt": NbtParser(), - "nbt_compound": NbtCompoundConstraint(delegate("nbt")), + "nbt_compound": TypeConstraint( + parser=delegate("nbt"), + type=AstNbtCompound, + message="Expected nbt compound.", + ), "adjacent_nbt_compound": AdjacentConstraint( parser=delegate("nbt_compound"), hint=r"\{", @@ -845,16 +863,18 @@ def __call__(self, stream: TokenStream) -> AstJson: @dataclass -class JsonObjectConstraint: - """Constraint that only allows json objects.""" +class TypeConstraint: + """Constraint that only allows specific instances.""" parser: Parser + type: Union[Type[Any], Tuple[Type[Any], ...]] + message: str def __call__(self, stream: TokenStream) -> Any: node = self.parser(stream) - if not isinstance(node, AstJsonObject): - raise node.emit_error(InvalidSyntax("Expected json object.")) + if not isinstance(node, self.type): + raise node.emit_error(InvalidSyntax(self.message)) return node @@ -1009,21 +1029,6 @@ def __call__(self, stream: TokenStream) -> AstNbt: return set_location(node, stream.current) -@dataclass -class NbtCompoundConstraint: - """Constraint that only allows nbt compound tags.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - node = self.parser(stream) - - if not isinstance(node, AstNbtCompound): - raise node.emit_error(InvalidSyntax("Expected nbt compound.")) - - return node - - @dataclass class AdjacentConstraint: """Constraint that ensures that there are no whitespace separators.""" From 0cef374933d09784b965a87a96b1021765867c0e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Sep 2021 04:54:22 +0200 Subject: [PATCH 0315/1554] refactor: import public api by adding another overload --- packages/mecha/mecha/api.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 5c990d6d8..5de401917 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -89,21 +89,37 @@ def parse( ) -> AstNodeType: ... + @overload + def parse( + self, + source: Union[TextFileBase[Any], str], + *, + using: str, + filename: Optional[str] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, + ) -> Any: + ... + def parse( self, source: Union[TextFileBase[Any], str], *, type: Optional[Type[AstNode]] = None, + using: Optional[str] = None, filename: Optional[str] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, ) -> Any: """Parse the given source into an AST.""" - if not type: - type = AstRoot - - if not type.parser: - raise TypeError(f"No parser directly associated with {type}.") + if using: + parser = using + else: + if not type: + type = AstRoot + if not type.parser: + raise TypeError(f"No parser directly associated with {type}.") + parser = type.parser if isinstance(source, str): source = TextFile(source) @@ -115,4 +131,4 @@ def parse( stream = TokenStream(source.text) with self.prepare_token_stream(stream, multiline=multiline): - return delegate(type.parser, stream) + return delegate(parser, stream) From 686e2e3415199b9a809bd9487fdaa30c9b7f9179 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Sep 2021 05:00:34 +0200 Subject: [PATCH 0316/1554] chore: update README --- packages/mecha/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index 6e7ac01b7..f9b7a973c 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -12,7 +12,7 @@ ```python from mecha import Mecha -mc = Mecha(multiline=True) +mc = Mecha() function = """ execute @@ -31,7 +31,7 @@ function = """ say I'm facing the target! """ -ast = mc.parse_function(function) +ast = mc.parse(function, multiline=True) print(mc.serialize(ast)) # execute as @a at @s anchored eyes facing ... ``` @@ -41,12 +41,12 @@ This package provides everything you need for working with Minecraft commands in ### Features -- Extensible, version-agnostic `mcfunction` parser +- Extensible and version-agnostic `mcfunction` parser - Clean abstract syntax tree with source location - Command config resolver that flattens all the valid prototypes - Powerful rule dispatcher for processing specific ast nodes - Composable visitors and reducers -- _(soon)_ Integrate compiler passes into your [`beet`](https://github.com/vberlier/beet) pipeline +- _(soon)_ Execute arbitrary compilation passes in your [`beet`](https://github.com/vberlier/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python ## Installation From 28770f4a0fd0ae49463087e66154dc225a8ccb0f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Sep 2021 05:12:21 +0200 Subject: [PATCH 0317/1554] refactor: improve api by making it possible to provide stream data --- packages/mecha/mecha/api.py | 8 ++- packages/mecha/mecha/resources/__init__.py | 7 +++ .../multiline_command_examples.mcfunction | 0 packages/mecha/tests/conftest.py | 8 --- .../parse__multiline_command_examples__0.txt | 5 ++ .../parse__multiline_command_examples__1.txt | 0 packages/mecha/tests/test_parse.py | 56 +++++++++++-------- 7 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 packages/mecha/mecha/resources/multiline_command_examples.mcfunction create mode 100644 packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 5de401917..10e2c311f 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -10,7 +10,7 @@ from beet import Context, TextFileBase from beet.core.file import TextFile -from beet.core.utils import extra_field +from beet.core.utils import JsonDict, extra_field from pydantic import BaseModel from tokenstream import TokenStream @@ -74,6 +74,7 @@ def parse( filename: Optional[str] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + provide: Optional[JsonDict] = None, ) -> AstRoot: ... @@ -98,6 +99,7 @@ def parse( filename: Optional[str] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + provide: Optional[JsonDict] = None, ) -> Any: ... @@ -110,6 +112,7 @@ def parse( filename: Optional[str] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + provide: Optional[JsonDict] = None, ) -> Any: """Parse the given source into an AST.""" if using: @@ -131,4 +134,5 @@ def parse( stream = TokenStream(source.text) with self.prepare_token_stream(stream, multiline=multiline): - return delegate(parser, stream) + with stream.provide(**provide or {}): + return delegate(parser, stream) diff --git a/packages/mecha/mecha/resources/__init__.py b/packages/mecha/mecha/resources/__init__.py index 4b64dc98d..2cf8d0d00 100644 --- a/packages/mecha/mecha/resources/__init__.py +++ b/packages/mecha/mecha/resources/__init__.py @@ -1,6 +1,7 @@ __all__ = [ "get_argument_examples", "get_command_examples", + "get_multiline_command_examples", ] @@ -17,3 +18,9 @@ def get_argument_examples() -> JsonDict: def get_command_examples() -> Function: return Function(read_text("mecha.resources", "command_examples.mcfunction")) + + +def get_multiline_command_examples() -> Function: + return Function( + read_text("mecha.resources", "multiline_command_examples.mcfunction") + ) diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/tests/conftest.py b/packages/mecha/tests/conftest.py index f5830f115..56d584cf6 100644 --- a/packages/mecha/tests/conftest.py +++ b/packages/mecha/tests/conftest.py @@ -6,11 +6,3 @@ @pytest.fixture(scope="session") def mc(): return Mecha() - - -@pytest.fixture -def mc_multiline(mc: Mecha): - previous_multiline = mc.spec.multiline - mc.spec.multiline = True - yield mc - mc.spec.multiline = previous_multiline diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt new file mode 100644 index 000000000..cda16c390 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -0,0 +1,5 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=0, lineno=1, colno=1) + commands: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index ef2e54caf..683b151c7 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -1,9 +1,14 @@ import pytest from beet.core.utils import JsonDict from pytest_insta import SnapshotFixture -from tokenstream import InvalidSyntax, TokenStream +from tokenstream import InvalidSyntax -from mecha import Mecha, delegate, get_argument_examples, get_command_examples +from mecha import ( + Mecha, + get_argument_examples, + get_command_examples, + get_multiline_command_examples, +) def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): @@ -12,6 +17,12 @@ def test_command_examples(snapshot: SnapshotFixture, mc: Mecha): assert snapshot() == mc.serialize(ast) +def test_multiline_command_examples(snapshot: SnapshotFixture, mc: Mecha): + ast = mc.parse(get_multiline_command_examples(), multiline=True) + assert snapshot() == ast.dump() + assert snapshot() == mc.serialize(ast) + + @pytest.mark.parametrize( "test_name, properties, invalid, value", params := [ @@ -39,28 +50,25 @@ def test_argument_examples( if argument_parser not in mc.spec.parsers: pytest.skip() - stream = TokenStream(value) - - with mc.prepare_token_stream(stream), stream.provide(properties=properties): - if invalid: - with pytest.raises(InvalidSyntax) as exc_info: - delegate(argument_parser, stream) - assert snapshot() == "\n---\n".join( - [ - test_name, - str(properties), - value, - f"{exc_info.type.__name__}: {exc_info.value}\n\nlocation = {exc_info.value.location}\nend_location = {exc_info.value.end_location}", - ] - ) - else: - ast = delegate(argument_parser, stream) - assert snapshot() == "\n---\n".join( - [test_name, str(properties), value, mc.serialize(ast), ast.dump()] - ) + if invalid: + with pytest.raises(InvalidSyntax) as exc_info: + mc.parse(value, using=argument_parser, provide={"properties": properties}) + assert snapshot() == "\n---\n".join( + [ + test_name, + str(properties), + value, + f"{exc_info.type.__name__}: {exc_info.value}\n\nlocation = {exc_info.value.location}\nend_location = {exc_info.value.end_location}", + ] + ) + else: + ast = mc.parse(value, using=argument_parser, provide={"properties": properties}) + assert snapshot() == "\n---\n".join( + [test_name, str(properties), value, mc.serialize(ast), ast.dump()] + ) -def test_multiline(snapshot: SnapshotFixture, mc_multiline: Mecha): +def test_multiline(snapshot: SnapshotFixture, mc: Mecha): function = """ execute as @a # For each "player", @@ -78,7 +86,7 @@ def test_multiline(snapshot: SnapshotFixture, mc_multiline: Mecha): say I'm facing the target! """ - ast = mc_multiline.parse(function) + ast = mc.parse(function, multiline=True) assert snapshot() == ast.dump() - assert snapshot() == mc_multiline.serialize(ast) + assert snapshot() == mc.serialize(ast) From 32d2894b415a23871d5b1e44fd5cb0c93cd41514 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Sep 2021 05:48:45 +0200 Subject: [PATCH 0318/1554] fix: allow empty comments --- packages/mecha/mecha/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 10e2c311f..a301a802d 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -61,7 +61,7 @@ def prepare_token_stream( spec=self.spec, multiline=self.spec.multiline if multiline is None else multiline, ): - with stream.reset_syntax(comment=r"#.+$", literal=r"\S+"): + with stream.reset_syntax(comment=r"#.*$", literal=r"\S+"): with stream.indent(skip=["comment"]), stream.ignore("indent", "dedent"): with stream.intercept("newline", "eof"): yield stream From 723044535cfb4201bdb624e065d5d9d833dcaabb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 11:57:25 +0200 Subject: [PATCH 0319/1554] fix: workaround for distinguishing comments from tags --- packages/mecha/mecha/api.py | 3 +- packages/mecha/mecha/parse.py | 24 ++- .../multiline_command_examples.mcfunction | 16 ++ .../parse__multiline_command_examples__0.txt | 178 +++++++++++++++++- .../parse__multiline_command_examples__1.txt | 1 + 5 files changed, 216 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index a301a802d..403e35b5a 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -8,8 +8,7 @@ from dataclasses import InitVar, dataclass from typing import Any, Iterator, Optional, Type, TypeVar, Union, overload -from beet import Context, TextFileBase -from beet.core.file import TextFile +from beet import Context, TextFile, TextFileBase from beet.core.utils import JsonDict, extra_field from pydantic import BaseModel from tokenstream import TokenStream diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index f23ed1796..1638234c5 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -592,7 +592,10 @@ def parse_argument(stream: TokenStream) -> AstNode: tree = spec.tree.get(scope) if tree and tree.parser: - with stream.provide(properties=tree.properties or {}): + with stream.provide(properties=tree.properties or {}), stream.ignore( + "newline", + "comment", + ): return delegate(f"command:argument:{tree.parser}", stream) raise ValueError(f"Missing argument parser in command tree {scope}.") @@ -1049,6 +1052,23 @@ class ResourceLocationParser: """Parser for resource locations.""" def __call__(self, stream: TokenStream) -> AstResourceLocation: + multiline = get_stream_multiline(stream) + + if multiline and stream.index: + with stream.checkpoint() as commit: + last_comment = None + + while stream.index >= 0 and stream.current.match( + "whitespace", "newline", "comment", "indent", "dedent" + ): + if stream.current.match("comment"): + last_comment = stream.current + stream.index -= 1 + + if last_comment: + print("found", last_comment) + commit() + with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): token = stream.expect("resource_location") value = token.value @@ -1587,7 +1607,7 @@ def __call__(self, stream: TokenStream) -> Any: def parse_message(stream: TokenStream) -> AstMessage: """Parse message.""" # TODO: Find a way to handle multiline - with stream.intercept("whitespace"): + with stream.intercept("whitespace", "newline"): while stream.get("whitespace"): continue diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index e69de29bb..1b0a539e0 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -0,0 +1,16 @@ +execute + as @a + at @s + align xyz + if block ~ ~ ~ #wool[ + foo = bar + ] + run + summon armor_stand ~ ~ ~ { + Tags: [ + "position_history", + "new" + ], + Invisible: 1b, + Marker: 1b + } diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index cda16c390..6be6f3679 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,5 +1,179 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=288, lineno=17, colno=1) commands: - \ No newline at end of file + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=8) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + variable: 'a' + arguments: + + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=25, lineno=3, colno=8) + end_location: SourceLocation(pos=27, lineno=3, colno=10) + variable: 's' + arguments: + + + location: SourceLocation(pos=32, lineno=4, colno=5) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'execute:align:axes:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=4, colno=11) + end_location: SourceLocation(pos=41, lineno=4, colno=14) + value: 'xyz' + + location: SourceLocation(pos=46, lineno=5, colno=5) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=55, lineno=5, colno=14) + end_location: SourceLocation(pos=60, lineno=5, colno=19) + x: + + location: SourceLocation(pos=55, lineno=5, colno=14) + end_location: SourceLocation(pos=56, lineno=5, colno=15) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=57, lineno=5, colno=16) + end_location: SourceLocation(pos=58, lineno=5, colno=17) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=59, lineno=5, colno=18) + end_location: SourceLocation(pos=60, lineno=5, colno=19) + type: 'relative' + value: 0 + + location: SourceLocation(pos=61, lineno=5, colno=20) + end_location: SourceLocation(pos=91, lineno=7, colno=6) + identifier: + + location: SourceLocation(pos=61, lineno=5, colno=20) + end_location: SourceLocation(pos=66, lineno=5, colno=25) + is_tag: True + namespace: None + path: 'wool' + block_states: + + location: SourceLocation(pos=76, lineno=6, colno=9) + end_location: SourceLocation(pos=85, lineno=6, colno=18) + key: + + location: SourceLocation(pos=76, lineno=6, colno=9) + end_location: SourceLocation(pos=79, lineno=6, colno=12) + value: 'foo' + value: + + location: SourceLocation(pos=82, lineno=6, colno=15) + end_location: SourceLocation(pos=85, lineno=6, colno=18) + value: 'bar' + data_tags: None + + location: SourceLocation(pos=96, lineno=8, colno=5) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=108, lineno=9, colno=9) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + identifier: 'summon:entity:pos:nbt' + arguments: + + location: SourceLocation(pos=115, lineno=9, colno=16) + end_location: SourceLocation(pos=126, lineno=9, colno=27) + is_tag: False + namespace: None + path: 'armor_stand' + + location: SourceLocation(pos=127, lineno=9, colno=28) + end_location: SourceLocation(pos=132, lineno=9, colno=33) + x: + + location: SourceLocation(pos=127, lineno=9, colno=28) + end_location: SourceLocation(pos=128, lineno=9, colno=29) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=129, lineno=9, colno=30) + end_location: SourceLocation(pos=130, lineno=9, colno=31) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=131, lineno=9, colno=32) + end_location: SourceLocation(pos=132, lineno=9, colno=33) + type: 'relative' + value: 0 + + location: SourceLocation(pos=133, lineno=9, colno=34) + end_location: SourceLocation(pos=287, lineno=16, colno=10) + entries: + + location: SourceLocation(pos=147, lineno=10, colno=13) + end_location: SourceLocation(pos=226, lineno=13, colno=14) + key: + + location: SourceLocation(pos=147, lineno=10, colno=13) + end_location: SourceLocation(pos=151, lineno=10, colno=17) + value: 'Tags' + value: + + location: SourceLocation(pos=153, lineno=10, colno=19) + end_location: SourceLocation(pos=226, lineno=13, colno=14) + elements: + + location: SourceLocation(pos=171, lineno=11, colno=17) + end_location: SourceLocation(pos=189, lineno=11, colno=35) + value: String('position_history') + + location: SourceLocation(pos=207, lineno=12, colno=17) + end_location: SourceLocation(pos=212, lineno=12, colno=22) + value: String('new') + + location: SourceLocation(pos=240, lineno=14, colno=13) + end_location: SourceLocation(pos=253, lineno=14, colno=26) + key: + + location: SourceLocation(pos=240, lineno=14, colno=13) + end_location: SourceLocation(pos=249, lineno=14, colno=22) + value: 'Invisible' + value: + + location: SourceLocation(pos=251, lineno=14, colno=24) + end_location: SourceLocation(pos=253, lineno=14, colno=26) + value: Byte(1) + + location: SourceLocation(pos=267, lineno=15, colno=13) + end_location: SourceLocation(pos=277, lineno=15, colno=23) + key: + + location: SourceLocation(pos=267, lineno=15, colno=13) + end_location: SourceLocation(pos=273, lineno=15, colno=19) + value: 'Marker' + value: + + location: SourceLocation(pos=275, lineno=15, colno=21) + end_location: SourceLocation(pos=277, lineno=15, colno=23) + value: Byte(1) \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index e69de29bb..81f1a23b5 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -0,0 +1 @@ +execute as @a at @s align xyz if block ~ ~ ~ #wool[foo=bar] run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} From 1dd76f219fbef7fe3c4d561fbdf5e54da846d80f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 14:07:00 +0200 Subject: [PATCH 0320/1554] refactor: extract line continuation handling --- packages/mecha/mecha/config.py | 32 ++++++- packages/mecha/mecha/parse.py | 154 +++++++++++++++++---------------- packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- 4 files changed, 116 insertions(+), 80 deletions(-) diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index ae7814000..e056833f5 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -5,7 +5,7 @@ from importlib.resources import read_text from pathlib import Path -from typing import Dict, List, Literal, Optional, Tuple, Union +from typing import Dict, Iterator, List, Literal, Optional, Tuple, Union from beet.core.utils import FileSystemPath, JsonDict from pydantic import BaseModel @@ -56,6 +56,36 @@ def get(self, *scope: Union[str, Tuple[str, ...], None]) -> Optional["CommandTre return None return node + def get_literal(self, name: str) -> Optional["CommandTree"]: + """Retrieve a literal child by name.""" + if self.children: + if child := self.children.get(name): + if child.type == "literal": + return child + return None + + def get_argument(self, name: str) -> Optional["CommandTree"]: + """Retrieve an argument child by name.""" + if self.children: + if child := self.children.get(name): + if child.type == "argument": + return child + return None + + def get_all_literals(self) -> Iterator[Tuple[str, "CommandTree"]]: + """Retrieve all the literal children.""" + if self.children: + for name, child in self.children.items(): + if child.type == "literal": + yield name, child + + def get_all_arguments(self) -> Iterator[Tuple[str, "CommandTree"]]: + """Retrieve all the argument children.""" + if self.children: + for name, child in self.children.items(): + if child.type == "argument": + yield name, child + def extend(self, other: "CommandTree") -> "CommandTree": """Merge nodes from another command tree.""" self.type = other.type diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 1638234c5..981c3e643 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -4,12 +4,11 @@ "get_stream_scope", "get_stream_properties", "get_stream_multiline", - "get_stream_command_indentation", + "get_stream_line_indentation", "delegate", - "string_to_number", - "QuoteHelper", + "consume_line_continuation", "parse_root", - "CommandParser", + "parse_command", "parse_argument", "parse_bool", "NumericParser", @@ -58,6 +57,7 @@ ] +from contextlib import nullcontext from dataclasses import dataclass, field from functools import partial from typing import ( @@ -303,7 +303,7 @@ def get_default_parsers() -> Dict[str, Parser]: # Command ################################################################################ "root": parse_root, - "command": CommandParser(), + "command": parse_command, "command:argument": parse_argument, "command:argument:brigadier:bool": delegate("bool"), "command:argument:brigadier:double": MinMaxConstraint(delegate("numeric")), @@ -444,9 +444,9 @@ def get_stream_multiline(stream: TokenStream) -> bool: return stream.data.get("multiline", False) -def get_stream_command_indentation(stream: TokenStream) -> int: - """Return the indentation level associated with the current command.""" - return stream.data.get("command_indentation", stream.indentation[-1]) +def get_stream_line_indentation(stream: TokenStream) -> int: + """Return the indentation level associated with the current line.""" + return stream.data.get("line_indentation", stream.indentation[-1]) @overload @@ -472,6 +472,28 @@ def delegate(parser: str, stream: Optional[TokenStream] = None) -> Any: return spec.parsers[parser](stream) +def consume_line_continuation(stream: TokenStream) -> bool: + """Consume newlines and leading whitespace if there's a line continuation.""" + level = get_stream_line_indentation(stream) + multiline = get_stream_multiline(stream) + + if not multiline: + return False + + with stream.checkpoint() as commit: + if list(stream.collect("newline")): + with stream.intercept("whitespace"): + if ( + (whitespace := stream.get("whitespace")) + and not stream.get("eof") + and level < len(whitespace.value.expandtabs()) + ): + commit() + return True + + return False + + def parse_root(stream: TokenStream) -> AstRoot: """Parse root.""" start = stream.peek() @@ -494,33 +516,37 @@ def parse_root(stream: TokenStream) -> AstRoot: return set_location(node, start, stream.current) -@dataclass -class CommandParser: - """Parser for commands.""" +def parse_command(stream: TokenStream) -> AstCommand: + """Parse command.""" + spec = get_stream_spec(stream) + scope = get_stream_scope(stream) + level = get_stream_line_indentation(stream) - def __call__(self, stream: TokenStream) -> AstCommand: - """Parse command.""" - spec = get_stream_spec(stream) - scope = get_stream_scope(stream) - multiline = get_stream_multiline(stream) + tree = spec.tree.get(scope) + + arguments: List[AstNode] = [] + reached_terminal = False - tree = spec.tree.get(scope) - arguments: List[AstNode] = [] + with stream.checkpoint(): + location = stream.expect().location + end_location = location - with stream.checkpoint(): - location = stream.expect().location - end_location = location + while tree and tree.children: + with stream.checkpoint() as commit: + literal = stream.expect("literal") - level = get_stream_command_indentation(stream) - is_complete = False + if child := tree.get_literal(literal.value): + if not child.children: + stream.expect("newline", "eof") + reached_terminal = True - while tree and tree.children: - # if ( - # (literal := stream.get("literal")) - # and (child := tree.children.get(literal.value)) - # and child.type == "literal" - # ): - # pass + end_location = literal.end_location + scope = scope + (literal.value,) + tree = child + + commit() + + if commit.rollback: for (name, child), alternative in stream.choose(*tree.children.items()): with alternative, stream.provide(scope=scope + (name,)): literal = None @@ -531,9 +557,9 @@ def __call__(self, stream: TokenStream) -> AstCommand: elif child.type == "argument": argument = delegate("command:argument", stream) - if not child.redirect and not child.children: + if not child.children: stream.expect("newline", "eof") - is_complete = True + reached_terminal = True if literal: end_location = literal.end_location @@ -544,59 +570,41 @@ def __call__(self, stream: TokenStream) -> AstCommand: scope = stream.data["scope"] tree = child - if is_complete: - break - - # TODO: find a way to extract this in a function to be able to use it in MessageParser - if multiline: - with stream.checkpoint() as commit: - if list(stream.collect("newline")): - with stream.intercept("whitespace"): - whitespace = stream.get("whitespace") - eof = stream.get("eof") - if ( - whitespace - and level < len(whitespace.value.expandtabs()) - and not eof - ): - commit() - elif tree.executable: - commit() - break - elif tree.executable and stream.get("newline", "eof"): - break + if reached_terminal: + break - if tree.executable and not stream.peek(): + if not consume_line_continuation(stream): + if tree.executable and stream.get("newline", "eof"): break - target = spec.tree.get(tree.redirect) - recursive = target and target.subcommand + target = spec.tree.get(tree.redirect) + recursive = target and target.subcommand - if tree.subcommand or recursive: - subcommand_scope = tree.redirect if tree.redirect is not None else scope - with stream.provide(scope=subcommand_scope, command_indentation=level): - node = delegate("command", stream) - arguments.append(node) - end_location = node.end_location - scope += ("subcommand",) - break + if tree.subcommand or recursive: + subcommand_scope = tree.redirect if tree.redirect is not None else scope + with stream.provide(scope=subcommand_scope, line_indentation=level): + node = delegate("command", stream) + arguments.append(node) + end_location = node.end_location + scope += ("subcommand",) + break - node = AstCommand(identifier=":".join(scope), arguments=AstChildren(arguments)) - return set_location(node, location, end_location) + node = AstCommand(identifier=":".join(scope), arguments=AstChildren(arguments)) + return set_location(node, location, end_location) def parse_argument(stream: TokenStream) -> AstNode: """Parse argument.""" spec = get_stream_spec(stream) scope = get_stream_scope(stream) + multiline = get_stream_multiline(stream) + tree = spec.tree.get(scope) if tree and tree.parser: - with stream.provide(properties=tree.properties or {}), stream.ignore( - "newline", - "comment", - ): - return delegate(f"command:argument:{tree.parser}", stream) + with stream.provide(properties=tree.properties or {}): + with stream.ignore("newline") if multiline else nullcontext(): + return delegate(f"command:argument:{tree.parser}", stream) raise ValueError(f"Missing argument parser in command tree {scope}.") @@ -1678,9 +1686,7 @@ def __call__(self, stream: TokenStream) -> AstNbtPath: if not components: raise stream.emit_error(InvalidSyntax("Empty nbt path not allowed.")) - node = AstNbtPath( - components=AstChildren(components), - ) + node = AstNbtPath(components=AstChildren(components)) return set_location(node, components[0], components[-1]) def parse_modifiers(self, stream: TokenStream) -> Iterator[Any]: diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e444f1489..10579012a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -709,7 +709,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.1.0" +version = "1.2.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -826,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "1bb348292b4cd53bf513d441ed0df47acc2e98d336ccc99e7e77dda901d56950" +content-hash = "e8362fe266ce31e4f1d51da5dccb21c23992d9884a19b5a8e4970e1e4ceb9908" [metadata.files] atomicwrites = [ @@ -1287,8 +1287,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.1.0-py3-none-any.whl", hash = "sha256:4c2e22847f5ed170097367967caaf13b92bcd5354ab36ce0f32e3f4f8e03875d"}, - {file = "tokenstream-1.1.0.tar.gz", hash = "sha256:28ecb9e23666c91ef1ee8a31386c79df9f88daeee369fcafaa30d82a57558972"}, + {file = "tokenstream-1.2.0-py3-none-any.whl", hash = "sha256:2f324be5a8499c469a02cb51507fbf2fa0b59e0c16795740a471e6b84bac7c5d"}, + {file = "tokenstream-1.2.0.tar.gz", hash = "sha256:499bc7d0d8a4577eeecfe9a25673abe0f4fe1dd5f92c20669b9879a16464d55e"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index dddb3880d..b2b3fde3a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.41.2" -tokenstream = "^1.1.0" +tokenstream = "^1.2.0" lectern = ">=0.16.0" [tool.poetry.dev-dependencies] From 7d7d3a64823902f710777e6902cd1942e31e414b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 14:56:51 +0200 Subject: [PATCH 0321/1554] fix: properly handle multiline for say command --- packages/mecha/mecha/parse.py | 70 +++++++++++-------- ...ment_examples_minecraft_message_0_0__0.txt | 10 +-- ...ment_examples_minecraft_message_0_3__0.txt | 16 ++--- ...ment_examples_minecraft_message_0_4__0.txt | 8 +-- .../snapshots/parse__command_examples__0.txt | 44 +----------- .../tests/snapshots/parse__multiline__0.txt | 28 +------- .../mecha/tests/snapshots/parse__say__0.txt | 40 +++++++++++ .../mecha/tests/snapshots/parse__say__1.txt | 35 ++++++++++ .../mecha/tests/snapshots/parse__say__2.txt | 2 + .../mecha/tests/snapshots/parse__say__3.txt | 1 + packages/mecha/tests/test_parse.py | 16 +++++ 11 files changed, 145 insertions(+), 125 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__say__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__say__1.txt create mode 100644 packages/mecha/tests/snapshots/parse__say__2.txt create mode 100644 packages/mecha/tests/snapshots/parse__say__3.txt diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 981c3e643..26729e6ff 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -537,7 +537,8 @@ def parse_command(stream: TokenStream) -> AstCommand: if child := tree.get_literal(literal.value): if not child.children: - stream.expect("newline", "eof") + if stream.peek(): + stream.expect("newline", "eof") reached_terminal = True end_location = literal.end_location @@ -558,7 +559,8 @@ def parse_command(stream: TokenStream) -> AstCommand: argument = delegate("command:argument", stream) if not child.children: - stream.expect("newline", "eof") + if stream.peek(): + stream.expect("newline", "eof") reached_terminal = True if literal: @@ -574,7 +576,7 @@ def parse_command(stream: TokenStream) -> AstCommand: break if not consume_line_continuation(stream): - if tree.executable and stream.get("newline", "eof"): + if tree.executable and (not stream.peek() or stream.get("newline", "eof")): break target = spec.tree.get(tree.redirect) @@ -1074,7 +1076,6 @@ def __call__(self, stream: TokenStream) -> AstResourceLocation: stream.index -= 1 if last_comment: - print("found", last_comment) commit() with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): @@ -1614,34 +1615,43 @@ def __call__(self, stream: TokenStream) -> Any: def parse_message(stream: TokenStream) -> AstMessage: """Parse message.""" - # TODO: Find a way to handle multiline - with stream.intercept("whitespace", "newline"): - while stream.get("whitespace"): - continue - - with stream.syntax(selector=r"@[praes]", literal=r"\S+"): - fragments: List[Any] = [] - - for selector, literal, whitespace in stream.collect( - "selector", - "literal", - "whitespace", - ): - if selector: - stream.index -= 1 - with stream.ignore("whitespace"): + multiline = get_stream_multiline(stream) + + with stream.intercept("whitespace"): + stream.get("whitespace") + + with stream.intercept("newline"), stream.syntax( + selector=r"@[praes]", + text=r"[^\n@]+", + ): + fragments: List[Any] = [] + + while True: + selector, text = stream.expect("selector", "text") + + if selector: + stream.index -= 1 + with stream.ignore("newline") if multiline else nullcontext(): + with stream.syntax(text=None): fragments.append(delegate("selector", stream)) - elif literal: - literal_node = AstLiteral(value=literal.value) - literal_node = set_location(literal_node, literal) - fragments.append(literal_node) - elif whitespace: - whitespace_node = AstLiteral(value=whitespace.value) - whitespace_node = set_location(whitespace_node, literal) + elif text: + text_node = AstLiteral(value=text.value) + text_node = set_location(text_node, text) + fragments.append(text_node) + + with stream.syntax(text=None): + if consume_line_continuation(stream): + whitespace_node = AstLiteral(value=" ") + whitespace_node = set_location( + whitespace_node, + stream.current.end_location.with_horizontal_offset(-1), + stream.current.end_location, + ) fragments.append(whitespace_node) - - if not fragments: - raise stream.emit_error(InvalidSyntax("Empty message not allowed.")) + else: + with stream.checkpoint(): + if stream.get("newline", "eof"): + break node = AstMessage(fragments=AstChildren(fragments)) return set_location(node, fragments[0], fragments[-1]) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt index 125ecafad..9a14ae13f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt @@ -12,13 +12,5 @@ Hello world! fragments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'Hello' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'world!' \ No newline at end of file + value: 'Hello world!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt index 3b826ea77..55a9f7942 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt @@ -12,12 +12,8 @@ Hello @p :) fragments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'Hello' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'Hello ' location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=8, lineno=1, colno=9) @@ -25,10 +21,6 @@ Hello @p :) arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=9, lineno=1, colno=10) + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: ':)' \ No newline at end of file + value: ' :)' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt index 7286d1c32..bd482a8ac 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt @@ -12,12 +12,8 @@ foo @a[tag=a, tag=b] fragments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'foo ' location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=20, lineno=1, colno=21) diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index ccd68476f..b6da6a8f9 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -2461,32 +2461,8 @@ fragments: location: SourceLocation(pos=2507, lineno=55, colno=50) - end_location: SourceLocation(pos=2510, lineno=55, colno=53) - value: '"My' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=2511, lineno=55, colno=54) - end_location: SourceLocation(pos=2515, lineno=55, colno=58) - value: 'feet' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=2516, lineno=55, colno=59) - end_location: SourceLocation(pos=2519, lineno=55, colno=62) - value: 'are' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=2520, lineno=55, colno=63) end_location: SourceLocation(pos=2528, lineno=55, colno=71) - value: 'soaked!"' + value: '"My feet are soaked!"' location: SourceLocation(pos=2529, lineno=56, colno=1) end_location: SourceLocation(pos=2598, lineno=56, colno=70) @@ -2544,24 +2520,8 @@ fragments: location: SourceLocation(pos=2582, lineno=56, colno=54) - end_location: SourceLocation(pos=2588, lineno=56, colno=60) - value: '"Score' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=2589, lineno=56, colno=61) - end_location: SourceLocation(pos=2591, lineno=56, colno=63) - value: 'is' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=2592, lineno=56, colno=64) end_location: SourceLocation(pos=2598, lineno=56, colno=70) - value: 'reset"' + value: '"Score is reset"' location: SourceLocation(pos=2599, lineno=57, colno=1) end_location: SourceLocation(pos=2695, lineno=57, colno=97) diff --git a/packages/mecha/tests/snapshots/parse__multiline__0.txt b/packages/mecha/tests/snapshots/parse__multiline__0.txt index e12e05c63..34f18e03c 100644 --- a/packages/mecha/tests/snapshots/parse__multiline__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=818, lineno=16, colno=5) + end_location: SourceLocation(pos=813, lineno=15, colno=43) commands: location: SourceLocation(pos=9, lineno=2, colno=9) @@ -177,29 +177,5 @@ fragments: location: SourceLocation(pos=791, lineno=15, colno=21) - end_location: SourceLocation(pos=794, lineno=15, colno=24) - value: "I'm" - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=795, lineno=15, colno=25) - end_location: SourceLocation(pos=801, lineno=15, colno=31) - value: 'facing' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=802, lineno=15, colno=32) - end_location: SourceLocation(pos=805, lineno=15, colno=35) - value: 'the' - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: ' ' - - location: SourceLocation(pos=806, lineno=15, colno=36) end_location: SourceLocation(pos=813, lineno=15, colno=43) - value: 'target!' \ No newline at end of file + value: "I'm facing the target!" \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__say__0.txt b/packages/mecha/tests/snapshots/parse__say__0.txt new file mode 100644 index 000000000..ee53f43e8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__say__0.txt @@ -0,0 +1,40 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=4, colno=5) + commands: + + location: SourceLocation(pos=9, lineno=2, colno=9) + end_location: SourceLocation(pos=27, lineno=2, colno=27) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=13) + end_location: SourceLocation(pos=27, lineno=2, colno=27) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=13) + end_location: SourceLocation(pos=19, lineno=2, colno=19) + value: 'hello ' + + location: SourceLocation(pos=19, lineno=2, colno=19) + end_location: SourceLocation(pos=21, lineno=2, colno=21) + variable: 's' + arguments: + + + location: SourceLocation(pos=21, lineno=2, colno=21) + end_location: SourceLocation(pos=27, lineno=2, colno=27) + value: ' world' + + location: SourceLocation(pos=40, lineno=3, colno=13) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=3, colno=17) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + fragments: + + location: SourceLocation(pos=44, lineno=3, colno=17) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + value: 'thing' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__say__1.txt b/packages/mecha/tests/snapshots/parse__say__1.txt new file mode 100644 index 000000000..056a1c5f5 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__say__1.txt @@ -0,0 +1,35 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + commands: + + location: SourceLocation(pos=9, lineno=2, colno=9) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=13) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=13) + end_location: SourceLocation(pos=19, lineno=2, colno=19) + value: 'hello ' + + location: SourceLocation(pos=19, lineno=2, colno=19) + end_location: SourceLocation(pos=21, lineno=2, colno=21) + variable: 's' + arguments: + + + location: SourceLocation(pos=21, lineno=2, colno=21) + end_location: SourceLocation(pos=27, lineno=2, colno=27) + value: ' world' + + location: SourceLocation(pos=39, lineno=3, colno=12) + end_location: SourceLocation(pos=40, lineno=3, colno=13) + value: ' ' + + location: SourceLocation(pos=40, lineno=3, colno=13) + end_location: SourceLocation(pos=49, lineno=3, colno=22) + value: 'say thing' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__say__2.txt b/packages/mecha/tests/snapshots/parse__say__2.txt new file mode 100644 index 000000000..3d0d5055a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__say__2.txt @@ -0,0 +1,2 @@ +say hello @s world +say thing diff --git a/packages/mecha/tests/snapshots/parse__say__3.txt b/packages/mecha/tests/snapshots/parse__say__3.txt new file mode 100644 index 000000000..e98fc7f5a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__say__3.txt @@ -0,0 +1 @@ +say hello @s world say thing diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 683b151c7..91673b87d 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -90,3 +90,19 @@ def test_multiline(snapshot: SnapshotFixture, mc: Mecha): assert snapshot() == ast.dump() assert snapshot() == mc.serialize(ast) + + +def test_say(snapshot: SnapshotFixture, mc: Mecha): + function = """ + say hello @s world + say thing + """ + + ast = mc.parse(function) + ast_multiline = mc.parse(function, multiline=True) + + assert snapshot() == ast.dump() + assert snapshot() == ast_multiline.dump() + + assert snapshot() == mc.serialize(ast) + assert snapshot() == mc.serialize(ast_multiline) From 052af6bb16f3778442f16f49c6a4721797183049 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 15:43:34 +0200 Subject: [PATCH 0322/1554] fix: differentiate tags from comments in multiline mode --- packages/mecha/mecha/parse.py | 12 +- .../multiline_command_examples.mcfunction | 7 + .../parse__multiline_command_examples__0.txt | 180 +++++++++++++++++- .../parse__multiline_command_examples__1.txt | 4 + 4 files changed, 199 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 26729e6ff..8ab2ddddb 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1064,12 +1064,18 @@ class ResourceLocationParser: def __call__(self, stream: TokenStream) -> AstResourceLocation: multiline = get_stream_multiline(stream) - if multiline and stream.index: + # This is kind of a hack. There's no way to easily differentiate + # tags from inline comments since they both begin with "#". + if multiline: with stream.checkpoint() as commit: last_comment = None while stream.index >= 0 and stream.current.match( - "whitespace", "newline", "comment", "indent", "dedent" + "whitespace", + "newline", + "comment", + "indent", + "dedent", ): if stream.current.match("comment"): last_comment = stream.current @@ -1078,6 +1084,8 @@ def __call__(self, stream: TokenStream) -> AstResourceLocation: if last_comment: commit() + stream.generator = stream.generate_tokens() + with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): token = stream.expect("resource_location") value = token.value diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index 1b0a539e0..545be2cc3 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -14,3 +14,10 @@ execute Invisible: 1b, Marker: 1b } + +execute if block 0 0 0 + #wool #this is a comment +execute if block 0 0 0 #wool #this is a comment +execute if block 0 0 0 + wool #this is a comment +execute if block 0 0 0 wool #this is a comment diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 6be6f3679..b9588bec2 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=288, lineno=17, colno=1) + end_location: SourceLocation(pos=487, lineno=24, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -176,4 +176,180 @@ location: SourceLocation(pos=275, lineno=15, colno=21) end_location: SourceLocation(pos=277, lineno=15, colno=23) - value: Byte(1) \ No newline at end of file + value: Byte(1) + + location: SourceLocation(pos=289, lineno=18, colno=1) + end_location: SourceLocation(pos=321, lineno=19, colno=10) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=297, lineno=18, colno=9) + end_location: SourceLocation(pos=321, lineno=19, colno=10) + identifier: 'execute:if:block:pos:block' + arguments: + + location: SourceLocation(pos=306, lineno=18, colno=18) + end_location: SourceLocation(pos=311, lineno=18, colno=23) + x: + + location: SourceLocation(pos=306, lineno=18, colno=18) + end_location: SourceLocation(pos=307, lineno=18, colno=19) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=308, lineno=18, colno=20) + end_location: SourceLocation(pos=309, lineno=18, colno=21) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=310, lineno=18, colno=22) + end_location: SourceLocation(pos=311, lineno=18, colno=23) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=316, lineno=19, colno=5) + end_location: SourceLocation(pos=321, lineno=19, colno=10) + identifier: + + location: SourceLocation(pos=316, lineno=19, colno=5) + end_location: SourceLocation(pos=321, lineno=19, colno=10) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=341, lineno=20, colno=1) + end_location: SourceLocation(pos=369, lineno=20, colno=29) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=349, lineno=20, colno=9) + end_location: SourceLocation(pos=369, lineno=20, colno=29) + identifier: 'execute:if:block:pos:block' + arguments: + + location: SourceLocation(pos=358, lineno=20, colno=18) + end_location: SourceLocation(pos=363, lineno=20, colno=23) + x: + + location: SourceLocation(pos=358, lineno=20, colno=18) + end_location: SourceLocation(pos=359, lineno=20, colno=19) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=360, lineno=20, colno=20) + end_location: SourceLocation(pos=361, lineno=20, colno=21) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=362, lineno=20, colno=22) + end_location: SourceLocation(pos=363, lineno=20, colno=23) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=364, lineno=20, colno=24) + end_location: SourceLocation(pos=369, lineno=20, colno=29) + identifier: + + location: SourceLocation(pos=364, lineno=20, colno=24) + end_location: SourceLocation(pos=369, lineno=20, colno=29) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=389, lineno=21, colno=1) + end_location: SourceLocation(pos=420, lineno=22, colno=9) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=397, lineno=21, colno=9) + end_location: SourceLocation(pos=420, lineno=22, colno=9) + identifier: 'execute:if:block:pos:block' + arguments: + + location: SourceLocation(pos=406, lineno=21, colno=18) + end_location: SourceLocation(pos=411, lineno=21, colno=23) + x: + + location: SourceLocation(pos=406, lineno=21, colno=18) + end_location: SourceLocation(pos=407, lineno=21, colno=19) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=408, lineno=21, colno=20) + end_location: SourceLocation(pos=409, lineno=21, colno=21) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=410, lineno=21, colno=22) + end_location: SourceLocation(pos=411, lineno=21, colno=23) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=416, lineno=22, colno=5) + end_location: SourceLocation(pos=420, lineno=22, colno=9) + identifier: + + location: SourceLocation(pos=416, lineno=22, colno=5) + end_location: SourceLocation(pos=420, lineno=22, colno=9) + is_tag: False + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=440, lineno=23, colno=1) + end_location: SourceLocation(pos=467, lineno=23, colno=28) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=448, lineno=23, colno=9) + end_location: SourceLocation(pos=467, lineno=23, colno=28) + identifier: 'execute:if:block:pos:block' + arguments: + + location: SourceLocation(pos=457, lineno=23, colno=18) + end_location: SourceLocation(pos=462, lineno=23, colno=23) + x: + + location: SourceLocation(pos=457, lineno=23, colno=18) + end_location: SourceLocation(pos=458, lineno=23, colno=19) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=459, lineno=23, colno=20) + end_location: SourceLocation(pos=460, lineno=23, colno=21) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=461, lineno=23, colno=22) + end_location: SourceLocation(pos=462, lineno=23, colno=23) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=463, lineno=23, colno=24) + end_location: SourceLocation(pos=467, lineno=23, colno=28) + identifier: + + location: SourceLocation(pos=463, lineno=23, colno=24) + end_location: SourceLocation(pos=467, lineno=23, colno=28) + is_tag: False + namespace: None + path: 'wool' + block_states: + + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 81f1a23b5..58ddbe9a9 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -1 +1,5 @@ execute as @a at @s align xyz if block ~ ~ ~ #wool[foo=bar] run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} +execute if block 0 0 0 #wool +execute if block 0 0 0 #wool +execute if block 0 0 0 wool +execute if block 0 0 0 wool From 5ecfe2df26b41dca404de69e11ff809b040ef1c2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 15:48:29 +0200 Subject: [PATCH 0323/1554] test: make sure coordinates are parsed at the beginning of a line in multiline mode --- packages/mecha/mecha/parse.py | 1 - .../multiline_command_examples.mcfunction | 6 +++ .../parse__multiline_command_examples__0.txt | 46 ++++++++++++++++++- .../parse__multiline_command_examples__1.txt | 1 + 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 8ab2ddddb..9dc4ffeeb 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -627,7 +627,6 @@ class NumericParser: pattern: str = NUMBER_PATTERN def __call__(self, stream: TokenStream) -> Any: - # TODO: Doesn't work on the beginning of a line in multiline mode? with stream.syntax(**{self.name: self.pattern}): stream.expect(self.name) return self.create_node(stream) diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index 545be2cc3..e5ae87781 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -21,3 +21,9 @@ execute if block 0 0 0 #wool #this is a comment execute if block 0 0 0 wool #this is a comment execute if block 0 0 0 wool #this is a comment + +execute if block + ~ + ^ + -0 + #wool diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index b9588bec2..13d0bde75 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=487, lineno=24, colno=1) + end_location: SourceLocation(pos=549, lineno=29, colno=14) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -352,4 +352,48 @@ path: 'wool' block_states: + data_tags: None + + location: SourceLocation(pos=488, lineno=25, colno=1) + end_location: SourceLocation(pos=549, lineno=29, colno=14) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=496, lineno=25, colno=9) + end_location: SourceLocation(pos=549, lineno=29, colno=14) + identifier: 'execute:if:block:pos:block' + arguments: + + location: SourceLocation(pos=509, lineno=26, colno=5) + end_location: SourceLocation(pos=535, lineno=28, colno=15) + x: + + location: SourceLocation(pos=509, lineno=26, colno=5) + end_location: SourceLocation(pos=510, lineno=26, colno=6) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=519, lineno=27, colno=9) + end_location: SourceLocation(pos=520, lineno=27, colno=10) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=533, lineno=28, colno=13) + end_location: SourceLocation(pos=535, lineno=28, colno=15) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=544, lineno=29, colno=9) + end_location: SourceLocation(pos=549, lineno=29, colno=14) + identifier: + + location: SourceLocation(pos=544, lineno=29, colno=9) + end_location: SourceLocation(pos=549, lineno=29, colno=14) + is_tag: True + namespace: None + path: 'wool' + block_states: + data_tags: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 58ddbe9a9..8e89fe64f 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -3,3 +3,4 @@ execute if block 0 0 0 #wool execute if block 0 0 0 #wool execute if block 0 0 0 wool execute if block 0 0 0 wool +execute if block ~ ^ 0 #wool From f4b6170c4da9e159068e7f9fa8f5c7cb18ec4c5f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 16:04:38 +0200 Subject: [PATCH 0324/1554] test: add more multiline tests --- .../multiline_command_examples.mcfunction | 39 ++ .../parse__multiline_command_examples__0.txt | 354 +++++++++++++++++- .../parse__multiline_command_examples__1.txt | 6 + 3 files changed, 397 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index e5ae87781..24d678f4c 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -27,3 +27,42 @@ execute if block ^ -0 #wool + +tellraw @s { + "text": "Hover me!", + "hoverEvent": { + "action": "show_text", + "value": "Hi!" + } +} + +execute + # When the player is on wool + as @a + at @s + if block ~ ~-1 ~ #wool + + # Give a special stone block + run give @s stone{ + display: { + Name: '[{"text": "Hello", "bold": true}]', + Lore: [ + '[{ "text": "Something else here" }]', + ] + } + } + +execute + if block ~ ~ ~ #namespace:tag # But what if # we # put # hash # symbols + if entity @s[tag=foo] # everywhere # + +tellraw @a { + "text": "Hello # there" +} + +tellraw @a # here + { + "text": "Hello\" # \"there" + } + +tellraw @s ["foo"] # thing diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 13d0bde75..20fb92c41 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=549, lineno=29, colno=14) + end_location: SourceLocation(pos=1264, lineno=69, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -396,4 +396,354 @@ path: 'wool' block_states: - data_tags: None \ No newline at end of file + data_tags: None + + location: SourceLocation(pos=551, lineno=31, colno=1) + end_location: SourceLocation(pos=670, lineno=37, colno=2) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=559, lineno=31, colno=9) + end_location: SourceLocation(pos=561, lineno=31, colno=11) + variable: 's' + arguments: + + + location: SourceLocation(pos=562, lineno=31, colno=12) + end_location: SourceLocation(pos=670, lineno=37, colno=2) + entries: + + location: SourceLocation(pos=568, lineno=32, colno=5) + end_location: SourceLocation(pos=587, lineno=32, colno=24) + key: + + location: SourceLocation(pos=568, lineno=32, colno=5) + end_location: SourceLocation(pos=574, lineno=32, colno=11) + value: 'text' + value: + + location: SourceLocation(pos=576, lineno=32, colno=13) + end_location: SourceLocation(pos=587, lineno=32, colno=24) + value: 'Hover me!' + + location: SourceLocation(pos=593, lineno=33, colno=5) + end_location: SourceLocation(pos=668, lineno=36, colno=6) + key: + + location: SourceLocation(pos=593, lineno=33, colno=5) + end_location: SourceLocation(pos=605, lineno=33, colno=17) + value: 'hoverEvent' + value: + + location: SourceLocation(pos=607, lineno=33, colno=19) + end_location: SourceLocation(pos=668, lineno=36, colno=6) + entries: + + location: SourceLocation(pos=617, lineno=34, colno=9) + end_location: SourceLocation(pos=638, lineno=34, colno=30) + key: + + location: SourceLocation(pos=617, lineno=34, colno=9) + end_location: SourceLocation(pos=625, lineno=34, colno=17) + value: 'action' + value: + + location: SourceLocation(pos=627, lineno=34, colno=19) + end_location: SourceLocation(pos=638, lineno=34, colno=30) + value: 'show_text' + + location: SourceLocation(pos=648, lineno=35, colno=9) + end_location: SourceLocation(pos=662, lineno=35, colno=23) + key: + + location: SourceLocation(pos=648, lineno=35, colno=9) + end_location: SourceLocation(pos=655, lineno=35, colno=16) + value: 'value' + value: + + location: SourceLocation(pos=657, lineno=35, colno=18) + end_location: SourceLocation(pos=662, lineno=35, colno=23) + value: 'Hi!' + + location: SourceLocation(pos=672, lineno=39, colno=1) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=717, lineno=41, colno=5) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=720, lineno=41, colno=8) + end_location: SourceLocation(pos=722, lineno=41, colno=10) + variable: 'a' + arguments: + + + location: SourceLocation(pos=727, lineno=42, colno=5) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=730, lineno=42, colno=8) + end_location: SourceLocation(pos=732, lineno=42, colno=10) + variable: 's' + arguments: + + + location: SourceLocation(pos=737, lineno=43, colno=5) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=746, lineno=43, colno=14) + end_location: SourceLocation(pos=753, lineno=43, colno=21) + x: + + location: SourceLocation(pos=746, lineno=43, colno=14) + end_location: SourceLocation(pos=747, lineno=43, colno=15) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=748, lineno=43, colno=16) + end_location: SourceLocation(pos=751, lineno=43, colno=19) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=752, lineno=43, colno=20) + end_location: SourceLocation(pos=753, lineno=43, colno=21) + type: 'relative' + value: 0 + + location: SourceLocation(pos=754, lineno=43, colno=22) + end_location: SourceLocation(pos=759, lineno=43, colno=27) + identifier: + + location: SourceLocation(pos=754, lineno=43, colno=22) + end_location: SourceLocation(pos=759, lineno=43, colno=27) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=798, lineno=46, colno=5) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=802, lineno=46, colno=9) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=807, lineno=46, colno=14) + end_location: SourceLocation(pos=809, lineno=46, colno=16) + variable: 's' + arguments: + + + location: SourceLocation(pos=810, lineno=46, colno=17) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + identifier: + + location: SourceLocation(pos=810, lineno=46, colno=17) + end_location: SourceLocation(pos=815, lineno=46, colno=22) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=815, lineno=46, colno=22) + end_location: SourceLocation(pos=995, lineno=53, colno=6) + entries: + + location: SourceLocation(pos=825, lineno=47, colno=9) + end_location: SourceLocation(pos=989, lineno=52, colno=10) + key: + + location: SourceLocation(pos=825, lineno=47, colno=9) + end_location: SourceLocation(pos=832, lineno=47, colno=16) + value: 'display' + value: + + location: SourceLocation(pos=834, lineno=47, colno=18) + end_location: SourceLocation(pos=989, lineno=52, colno=10) + entries: + + location: SourceLocation(pos=848, lineno=48, colno=13) + end_location: SourceLocation(pos=889, lineno=48, colno=54) + key: + + location: SourceLocation(pos=848, lineno=48, colno=13) + end_location: SourceLocation(pos=852, lineno=48, colno=17) + value: 'Name' + value: + + location: SourceLocation(pos=854, lineno=48, colno=19) + end_location: SourceLocation(pos=889, lineno=48, colno=54) + value: String('[{"text": "Hello", "bold": true}]') + + location: SourceLocation(pos=903, lineno=49, colno=13) + end_location: SourceLocation(pos=979, lineno=51, colno=14) + key: + + location: SourceLocation(pos=903, lineno=49, colno=13) + end_location: SourceLocation(pos=907, lineno=49, colno=17) + value: 'Lore' + value: + + location: SourceLocation(pos=909, lineno=49, colno=19) + end_location: SourceLocation(pos=979, lineno=51, colno=14) + elements: + + location: SourceLocation(pos=927, lineno=50, colno=17) + end_location: SourceLocation(pos=964, lineno=50, colno=54) + value: String('[{ "text": "Something else here" }]') + + location: SourceLocation(pos=997, lineno=55, colno=1) + end_location: SourceLocation(pos=1107, lineno=57, colno=26) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1009, lineno=56, colno=5) + end_location: SourceLocation(pos=1107, lineno=57, colno=26) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=1018, lineno=56, colno=14) + end_location: SourceLocation(pos=1023, lineno=56, colno=19) + x: + + location: SourceLocation(pos=1018, lineno=56, colno=14) + end_location: SourceLocation(pos=1019, lineno=56, colno=15) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=1020, lineno=56, colno=16) + end_location: SourceLocation(pos=1021, lineno=56, colno=17) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=1022, lineno=56, colno=18) + end_location: SourceLocation(pos=1023, lineno=56, colno=19) + type: 'relative' + value: 0 + + location: SourceLocation(pos=1024, lineno=56, colno=20) + end_location: SourceLocation(pos=1038, lineno=56, colno=34) + identifier: + + location: SourceLocation(pos=1024, lineno=56, colno=20) + end_location: SourceLocation(pos=1038, lineno=56, colno=34) + is_tag: True + namespace: 'namespace' + path: 'tag' + block_states: + + data_tags: None + + location: SourceLocation(pos=1086, lineno=57, colno=5) + end_location: SourceLocation(pos=1107, lineno=57, colno=26) + identifier: 'execute:if:entity:entities' + arguments: + + location: SourceLocation(pos=1096, lineno=57, colno=15) + end_location: SourceLocation(pos=1107, lineno=57, colno=26) + variable: 's' + arguments: + + location: SourceLocation(pos=1099, lineno=57, colno=18) + end_location: SourceLocation(pos=1106, lineno=57, colno=25) + inverted: False + key: + + location: SourceLocation(pos=1099, lineno=57, colno=18) + end_location: SourceLocation(pos=1102, lineno=57, colno=21) + value: 'tag' + value: + + location: SourceLocation(pos=1103, lineno=57, colno=22) + end_location: SourceLocation(pos=1106, lineno=57, colno=25) + value: 'foo' + + location: SourceLocation(pos=1124, lineno=59, colno=1) + end_location: SourceLocation(pos=1166, lineno=61, colno=2) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=1132, lineno=59, colno=9) + end_location: SourceLocation(pos=1134, lineno=59, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=1135, lineno=59, colno=12) + end_location: SourceLocation(pos=1166, lineno=61, colno=2) + entries: + + location: SourceLocation(pos=1141, lineno=60, colno=5) + end_location: SourceLocation(pos=1164, lineno=60, colno=28) + key: + + location: SourceLocation(pos=1141, lineno=60, colno=5) + end_location: SourceLocation(pos=1147, lineno=60, colno=11) + value: 'text' + value: + + location: SourceLocation(pos=1149, lineno=60, colno=13) + end_location: SourceLocation(pos=1164, lineno=60, colno=28) + value: 'Hello # there' + + location: SourceLocation(pos=1168, lineno=63, colno=1) + end_location: SourceLocation(pos=1234, lineno=66, colno=6) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=1176, lineno=63, colno=9) + end_location: SourceLocation(pos=1178, lineno=63, colno=11) + variable: 'a' + arguments: + + + location: SourceLocation(pos=1191, lineno=64, colno=5) + end_location: SourceLocation(pos=1234, lineno=66, colno=6) + entries: + + location: SourceLocation(pos=1201, lineno=65, colno=9) + end_location: SourceLocation(pos=1228, lineno=65, colno=36) + key: + + location: SourceLocation(pos=1201, lineno=65, colno=9) + end_location: SourceLocation(pos=1207, lineno=65, colno=15) + value: 'text' + value: + + location: SourceLocation(pos=1209, lineno=65, colno=17) + end_location: SourceLocation(pos=1228, lineno=65, colno=36) + value: 'Hello" # "there' + + location: SourceLocation(pos=1236, lineno=68, colno=1) + end_location: SourceLocation(pos=1254, lineno=68, colno=19) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=1244, lineno=68, colno=9) + end_location: SourceLocation(pos=1246, lineno=68, colno=11) + variable: 's' + arguments: + + + location: SourceLocation(pos=1247, lineno=68, colno=12) + end_location: SourceLocation(pos=1254, lineno=68, colno=19) + elements: + + location: SourceLocation(pos=1248, lineno=68, colno=13) + end_location: SourceLocation(pos=1253, lineno=68, colno=18) + value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 8e89fe64f..6cb9c9a3a 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -4,3 +4,9 @@ execute if block 0 0 0 #wool execute if block 0 0 0 wool execute if block 0 0 0 wool execute if block ~ ^ 0 #wool +tellraw @s {"text": "Hover me!", "hoverEvent": {"action": "show_text", "value": "Hi!"}} +execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '[{"text": "Hello", "bold": true}]', Lore: ['[{ "text": "Something else here" }]']}} +execute if block ~ ~ ~ #namespace:tag if entity @s[tag=foo] +tellraw @a {"text": "Hello # there"} +tellraw @a {"text": "Hello\" # \"there"} +tellraw @s ["foo"] From ab62335b4ddfbbbbfa224d8b3933b55a161ed86d Mon Sep 17 00:00:00 2001 From: semantic-release Date: Sun, 19 Sep 2021 16:07:11 +0200 Subject: [PATCH 0325/1554] 0.3.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 37 ++++++++++++++++++++++++++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 899414949..83612815b 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,43 @@ +## v0.3.0 (2021-09-19) +### Feature +* Add dispatch rule priority ([`d2e18d3`](https://github.com/vberlier/mecha/commit/d2e18d3a32c3d0eeb5acaebe4a5423aaa1812424)) +* Add serializer ([`914be79`](https://github.com/vberlier/mecha/commit/914be79967dc3cc478ac36aa4cdbb8a87b112e10)) +* Tweak parser ([`3c3e81d`](https://github.com/vberlier/mecha/commit/3c3e81d3bc1c510c15333f7de4615d723b81df45)) +* Parse subcommands ([`9797adf`](https://github.com/vberlier/mecha/commit/9797adf3bc26cde6da86f60d71e69e411dc76e9b)) +* Add nbt path parser ([`a2e0a42`](https://github.com/vberlier/mecha/commit/a2e0a4221c73ef7d6fc9054785a6d5db1ed1c4d6)) +* Handle selectors ([`47a83f0`](https://github.com/vberlier/mecha/commit/47a83f096c06eeab488baf55b96daaa8fe97a5b3)) +* Add even more parsers ([`27bc814`](https://github.com/vberlier/mecha/commit/27bc814cc3d0d6d8934b4b380ddb4f52f4875843)) +* Implement more parsers ([`506f5bd`](https://github.com/vberlier/mecha/commit/506f5bdd43f8262dfb75bec4834d1531da078f61)) +* Add item parser ([`4419381`](https://github.com/vberlier/mecha/commit/44193813977169b4929320b17ab46d48240261bf)) +* Parse nbt ([`5689dbc`](https://github.com/vberlier/mecha/commit/5689dbc254e878625911f9329a9448149026ba6f)) +* Parse block and resource location ([`4a12917`](https://github.com/vberlier/mecha/commit/4a12917e2329ac974468ee4a6dc5825093ea02dd)) +* Show empty children in ast dump ([`8eede2e`](https://github.com/vberlier/mecha/commit/8eede2ee5026289e8a5e94700dd5ca3a78c73419)) +* Add json parsing ([`2aaea5c`](https://github.com/vberlier/mecha/commit/2aaea5c1a51a5c55391a66dbac3cad98bab17ccc)) +* Add a bunch of parsers ([`31f512c`](https://github.com/vberlier/mecha/commit/31f512cb8058193981e3ba24e3732a2bd87ccd6d)) + +### Fix +* Differentiate tags from comments in multiline mode ([`222bc64`](https://github.com/vberlier/mecha/commit/222bc642b87afb3296ce2bf243dc022411dd8cb1)) +* Properly handle multiline for say command ([`8d9e7bb`](https://github.com/vberlier/mecha/commit/8d9e7bb1e333b43e12a44097d157ac23c3b74a76)) +* Workaround for distinguishing comments from tags ([`f684e8c`](https://github.com/vberlier/mecha/commit/f684e8c3b75cb0a03669afaf0e8da8b0adc5a8fb)) +* Allow empty comments ([`02ddce6`](https://github.com/vberlier/mecha/commit/02ddce627754769b362f3d38724eaa1bb5edf95f)) +* Make it possible to provide the multiline option upon instantiation ([`65d4d5d`](https://github.com/vberlier/mecha/commit/65d4d5d06d994b1ef4945355624fe5723e199085)) +* Handle the case where eof has already been consumed ([`41e2175`](https://github.com/vberlier/mecha/commit/41e2175292e0e7c7c8cb3b4237e50a2f88bc931f)) +* Communicate rule return value to the parent ([`cd18591`](https://github.com/vberlier/mecha/commit/cd18591f6ce4805321198bcf5fca47449287f50b)) +* Only avoid quotes when the regex matches the entire string ([`8adbd18`](https://github.com/vberlier/mecha/commit/8adbd18be3646db2eba0df9a9cf9a6e612cb33c3)) +* Separate AstValue into different nodes ([`35f1719`](https://github.com/vberlier/mecha/commit/35f1719c8a0d3c6d4cf85272c110eaf01d977385)) +* Detect eof to avoid requiring a final newline ([`1a0fb3c`](https://github.com/vberlier/mecha/commit/1a0fb3c514dfe36cce45588b2e29bca7b427b186)) +* Pyright thinks nbtlib types are unknown ([`f93bf51`](https://github.com/vberlier/mecha/commit/f93bf51336bf75f7fda4ad5e965c0b2578ca9d39)) +* Handle nbt arrays and add more examples ([`be0eb3a`](https://github.com/vberlier/mecha/commit/be0eb3a62e4db031ba0a8fafe11992f06ab67cf6)) +* Handle particle and add more examples ([`19e267d`](https://github.com/vberlier/mecha/commit/19e267d15798ef037184344f3cede3e99b8e9d8c)) +* Handle a few selector edge cases and add more tests ([`66dad49`](https://github.com/vberlier/mecha/commit/66dad49f01cfdd34a0bd3f866036eb416b7532e6)) +* Tweak selector constraints and add more tests ([`0c938af`](https://github.com/vberlier/mecha/commit/0c938afad40665266fe1212a2284da3d6f894c42)) +* Properly validate swizzle ([`e7b8165`](https://github.com/vberlier/mecha/commit/e7b81656af4b095366ddd640f796e7bb4533b41f)) +* Automatically redirect when leaf isn't executable ([`b4ba807`](https://github.com/vberlier/mecha/commit/b4ba80780ea624bd4a6456483e65ea5af2299b29)) +* Parse uuids into UUID objects ([`08d7f80`](https://github.com/vberlier/mecha/commit/08d7f803b7dfd32c76fa2a86afd6ba0a3916bfcf)) + ## v0.2.0 (2021-07-24) ### Feature * Add initial parser implementation ([`117d76d`](https://github.com/vberlier/mecha/commit/117d76d807b5a27e8b83a9cebd63c0d8ec70d8d4)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index dfefdfc1b..665398d92 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.2.0" +__version__ = "0.3.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b2b3fde3a..c39b0190b 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.2.0" +version = "0.3.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 32542da589e3c777892ecc70638ba8697aa50f4f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Sep 2021 16:09:56 +0200 Subject: [PATCH 0326/1554] fix: discard changelog for version 0.3.0 --- packages/mecha/CHANGELOG.md | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 83612815b..ae2cf8b14 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -3,41 +3,6 @@ ## v0.3.0 (2021-09-19) -### Feature -* Add dispatch rule priority ([`d2e18d3`](https://github.com/vberlier/mecha/commit/d2e18d3a32c3d0eeb5acaebe4a5423aaa1812424)) -* Add serializer ([`914be79`](https://github.com/vberlier/mecha/commit/914be79967dc3cc478ac36aa4cdbb8a87b112e10)) -* Tweak parser ([`3c3e81d`](https://github.com/vberlier/mecha/commit/3c3e81d3bc1c510c15333f7de4615d723b81df45)) -* Parse subcommands ([`9797adf`](https://github.com/vberlier/mecha/commit/9797adf3bc26cde6da86f60d71e69e411dc76e9b)) -* Add nbt path parser ([`a2e0a42`](https://github.com/vberlier/mecha/commit/a2e0a4221c73ef7d6fc9054785a6d5db1ed1c4d6)) -* Handle selectors ([`47a83f0`](https://github.com/vberlier/mecha/commit/47a83f096c06eeab488baf55b96daaa8fe97a5b3)) -* Add even more parsers ([`27bc814`](https://github.com/vberlier/mecha/commit/27bc814cc3d0d6d8934b4b380ddb4f52f4875843)) -* Implement more parsers ([`506f5bd`](https://github.com/vberlier/mecha/commit/506f5bdd43f8262dfb75bec4834d1531da078f61)) -* Add item parser ([`4419381`](https://github.com/vberlier/mecha/commit/44193813977169b4929320b17ab46d48240261bf)) -* Parse nbt ([`5689dbc`](https://github.com/vberlier/mecha/commit/5689dbc254e878625911f9329a9448149026ba6f)) -* Parse block and resource location ([`4a12917`](https://github.com/vberlier/mecha/commit/4a12917e2329ac974468ee4a6dc5825093ea02dd)) -* Show empty children in ast dump ([`8eede2e`](https://github.com/vberlier/mecha/commit/8eede2ee5026289e8a5e94700dd5ca3a78c73419)) -* Add json parsing ([`2aaea5c`](https://github.com/vberlier/mecha/commit/2aaea5c1a51a5c55391a66dbac3cad98bab17ccc)) -* Add a bunch of parsers ([`31f512c`](https://github.com/vberlier/mecha/commit/31f512cb8058193981e3ba24e3732a2bd87ccd6d)) - -### Fix -* Differentiate tags from comments in multiline mode ([`222bc64`](https://github.com/vberlier/mecha/commit/222bc642b87afb3296ce2bf243dc022411dd8cb1)) -* Properly handle multiline for say command ([`8d9e7bb`](https://github.com/vberlier/mecha/commit/8d9e7bb1e333b43e12a44097d157ac23c3b74a76)) -* Workaround for distinguishing comments from tags ([`f684e8c`](https://github.com/vberlier/mecha/commit/f684e8c3b75cb0a03669afaf0e8da8b0adc5a8fb)) -* Allow empty comments ([`02ddce6`](https://github.com/vberlier/mecha/commit/02ddce627754769b362f3d38724eaa1bb5edf95f)) -* Make it possible to provide the multiline option upon instantiation ([`65d4d5d`](https://github.com/vberlier/mecha/commit/65d4d5d06d994b1ef4945355624fe5723e199085)) -* Handle the case where eof has already been consumed ([`41e2175`](https://github.com/vberlier/mecha/commit/41e2175292e0e7c7c8cb3b4237e50a2f88bc931f)) -* Communicate rule return value to the parent ([`cd18591`](https://github.com/vberlier/mecha/commit/cd18591f6ce4805321198bcf5fca47449287f50b)) -* Only avoid quotes when the regex matches the entire string ([`8adbd18`](https://github.com/vberlier/mecha/commit/8adbd18be3646db2eba0df9a9cf9a6e612cb33c3)) -* Separate AstValue into different nodes ([`35f1719`](https://github.com/vberlier/mecha/commit/35f1719c8a0d3c6d4cf85272c110eaf01d977385)) -* Detect eof to avoid requiring a final newline ([`1a0fb3c`](https://github.com/vberlier/mecha/commit/1a0fb3c514dfe36cce45588b2e29bca7b427b186)) -* Pyright thinks nbtlib types are unknown ([`f93bf51`](https://github.com/vberlier/mecha/commit/f93bf51336bf75f7fda4ad5e965c0b2578ca9d39)) -* Handle nbt arrays and add more examples ([`be0eb3a`](https://github.com/vberlier/mecha/commit/be0eb3a62e4db031ba0a8fafe11992f06ab67cf6)) -* Handle particle and add more examples ([`19e267d`](https://github.com/vberlier/mecha/commit/19e267d15798ef037184344f3cede3e99b8e9d8c)) -* Handle a few selector edge cases and add more tests ([`66dad49`](https://github.com/vberlier/mecha/commit/66dad49f01cfdd34a0bd3f866036eb416b7532e6)) -* Tweak selector constraints and add more tests ([`0c938af`](https://github.com/vberlier/mecha/commit/0c938afad40665266fe1212a2284da3d6f894c42)) -* Properly validate swizzle ([`e7b8165`](https://github.com/vberlier/mecha/commit/e7b81656af4b095366ddd640f796e7bb4533b41f)) -* Automatically redirect when leaf isn't executable ([`b4ba807`](https://github.com/vberlier/mecha/commit/b4ba80780ea624bd4a6456483e65ea5af2299b29)) -* Parse uuids into UUID objects ([`08d7f80`](https://github.com/vberlier/mecha/commit/08d7f803b7dfd32c76fa2a86afd6ba0a3916bfcf)) ## v0.2.0 (2021-07-24) ### Feature From 57c2e91b7ad3e30d9d3b0f60a6f69f1ced6291a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Sep 2021 01:22:17 +0000 Subject: [PATCH 0327/1554] chore(deps-dev): bump rope from 0.19.0 to 0.20.1 Bumps [rope](https://github.com/python-rope/rope) from 0.19.0 to 0.20.1. - [Release notes](https://github.com/python-rope/rope/releases) - [Changelog](https://github.com/python-rope/rope/blob/master/CHANGELOG.md) - [Commits](https://github.com/python-rope/rope/commits) --- updated-dependencies: - dependency-name: rope dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 6be116a0e..b5eb44633 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -643,14 +643,14 @@ idna2008 = ["idna"] [[package]] name = "rope" -version = "0.19.0" +version = "0.20.1" description = "a python refactoring library..." category = "dev" optional = false python-versions = "*" [package.extras] -dev = ["pytest"] +dev = ["pytest", "pytest-timeout"] [[package]] name = "secretstorage" @@ -807,7 +807,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "6a4b126fe2ccc3bb4f19d647fec6c121cc3b913cbd156e215df458ec816adfff" +content-hash = "891a90667ca62e67c6619796efdef4ecb58d7750155b1cb128b0dea4681c9ec3" [metadata.files] atomicwrites = [ @@ -1241,7 +1241,7 @@ rfc3986 = [ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] rope = [ - {file = "rope-0.19.0.tar.gz", hash = "sha256:64e6d747532e1f5c8009ec5aae3e5523a5bcedf516f39a750d57d8ed749d90da"}, + {file = "rope-0.20.1.tar.gz", hash = "sha256:505a2f6b4ac7b18e0429be179f4d8712243a194da5c866b0731f9d91ce7590bb"}, ] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 75ee90533..94b83f1ff 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -31,7 +31,7 @@ click = "^8.0.1" [tool.poetry.dev-dependencies] black = "^21.8b0" -rope = "^0.19.0" +rope = "^0.20.1" pytest = "^6.2.5" isort = "^5.9.3" python-semantic-release = "^7.19.2" From 3bb1bde5df4df7246cfcaaa770bf91b204d289bd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:14:36 +0200 Subject: [PATCH 0328/1554] fix: remember current line indentation for the following terms --- packages/mecha/mecha/parse.py | 14 +- .../multiline_command_examples.mcfunction | 37 ++++ .../parse__multiline_command_examples__0.txt | 204 +++++++++++++++++- .../parse__multiline_command_examples__1.txt | 9 + 4 files changed, 258 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 9dc4ffeeb..49ae45f77 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -549,7 +549,10 @@ def parse_command(stream: TokenStream) -> AstCommand: if commit.rollback: for (name, child), alternative in stream.choose(*tree.children.items()): - with alternative, stream.provide(scope=scope + (name,)): + with alternative, stream.provide( + scope=scope + (name,), + line_indentation=level, + ): literal = None argument = None @@ -575,9 +578,12 @@ def parse_command(stream: TokenStream) -> AstCommand: if reached_terminal: break - if not consume_line_continuation(stream): - if tree.executable and (not stream.peek() or stream.get("newline", "eof")): - break + with stream.provide(line_indentation=level): + if not consume_line_continuation(stream): + if tree.executable and ( + not stream.peek() or stream.get("newline", "eof") + ): + break target = spec.tree.get(tree.redirect) recursive = target and target.subcommand diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index 24d678f4c..42c75f995 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -66,3 +66,40 @@ tellraw @a # here } tellraw @s ["foo"] # thing + +say + foo + bar + hello + wat + welp + +say + this + is a + # some comment + continuation + +gamerule + doDaylightCycle + false + +gamerule + doMobLoot + false + gamerule + doDaylightCycle + false + execute as foo run + gamemode + survival + + @s[tag=bar] + + say hello + execute in + the_end + run + say foo + gamerule doDaylightCycle + false diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 20fb92c41..f2a7eda00 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1264, lineno=69, colno=1) + end_location: SourceLocation(pos=1790, lineno=106, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -746,4 +746,204 @@ location: SourceLocation(pos=1248, lineno=68, colno=13) end_location: SourceLocation(pos=1253, lineno=68, colno=18) - value: 'foo' \ No newline at end of file + value: 'foo' + + location: SourceLocation(pos=1265, lineno=70, colno=1) + end_location: SourceLocation(pos=1308, lineno=75, colno=9) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=1273, lineno=71, colno=5) + end_location: SourceLocation(pos=1308, lineno=75, colno=9) + fragments: + + location: SourceLocation(pos=1273, lineno=71, colno=5) + end_location: SourceLocation(pos=1276, lineno=71, colno=8) + value: 'foo' + + location: SourceLocation(pos=1280, lineno=72, colno=4) + end_location: SourceLocation(pos=1281, lineno=72, colno=5) + value: ' ' + + location: SourceLocation(pos=1281, lineno=72, colno=5) + end_location: SourceLocation(pos=1284, lineno=72, colno=8) + value: 'bar' + + location: SourceLocation(pos=1288, lineno=73, colno=4) + end_location: SourceLocation(pos=1289, lineno=73, colno=5) + value: ' ' + + location: SourceLocation(pos=1289, lineno=73, colno=5) + end_location: SourceLocation(pos=1294, lineno=73, colno=10) + value: 'hello' + + location: SourceLocation(pos=1295, lineno=74, colno=1) + end_location: SourceLocation(pos=1296, lineno=74, colno=2) + value: ' ' + + location: SourceLocation(pos=1296, lineno=74, colno=2) + end_location: SourceLocation(pos=1299, lineno=74, colno=5) + value: 'wat' + + location: SourceLocation(pos=1303, lineno=75, colno=4) + end_location: SourceLocation(pos=1304, lineno=75, colno=5) + value: ' ' + + location: SourceLocation(pos=1304, lineno=75, colno=5) + end_location: SourceLocation(pos=1308, lineno=75, colno=9) + value: 'welp' + + location: SourceLocation(pos=1310, lineno=77, colno=1) + end_location: SourceLocation(pos=1367, lineno=81, colno=17) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=1318, lineno=78, colno=5) + end_location: SourceLocation(pos=1367, lineno=81, colno=17) + fragments: + + location: SourceLocation(pos=1318, lineno=78, colno=5) + end_location: SourceLocation(pos=1322, lineno=78, colno=9) + value: 'this' + + location: SourceLocation(pos=1326, lineno=79, colno=4) + end_location: SourceLocation(pos=1327, lineno=79, colno=5) + value: ' ' + + location: SourceLocation(pos=1327, lineno=79, colno=5) + end_location: SourceLocation(pos=1331, lineno=79, colno=9) + value: 'is a' + + location: SourceLocation(pos=1354, lineno=81, colno=4) + end_location: SourceLocation(pos=1355, lineno=81, colno=5) + value: ' ' + + location: SourceLocation(pos=1355, lineno=81, colno=5) + end_location: SourceLocation(pos=1367, lineno=81, colno=17) + value: 'continuation' + + location: SourceLocation(pos=1369, lineno=83, colno=1) + end_location: SourceLocation(pos=1404, lineno=85, colno=7) + identifier: 'gamerule:doDaylightCycle:value' + arguments: + + location: SourceLocation(pos=1399, lineno=85, colno=2) + end_location: SourceLocation(pos=1404, lineno=85, colno=7) + value: False + + location: SourceLocation(pos=1406, lineno=87, colno=1) + end_location: SourceLocation(pos=1454, lineno=89, colno=18) + identifier: 'gamerule:doMobLoot:value' + arguments: + + location: SourceLocation(pos=1449, lineno=89, colno=13) + end_location: SourceLocation(pos=1454, lineno=89, colno=18) + value: False + + location: SourceLocation(pos=1471, lineno=90, colno=17) + end_location: SourceLocation(pos=1545, lineno=92, colno=26) + identifier: 'gamerule:doDaylightCycle:value' + arguments: + + location: SourceLocation(pos=1540, lineno=92, colno=21) + end_location: SourceLocation(pos=1545, lineno=92, colno=26) + value: False + + location: SourceLocation(pos=1550, lineno=93, colno=5) + end_location: SourceLocation(pos=1631, lineno=97, colno=24) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1558, lineno=93, colno=13) + end_location: SourceLocation(pos=1631, lineno=97, colno=24) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=1561, lineno=93, colno=16) + end_location: SourceLocation(pos=1564, lineno=93, colno=19) + value: 'foo' + + location: SourceLocation(pos=1565, lineno=93, colno=20) + end_location: SourceLocation(pos=1631, lineno=97, colno=24) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1577, lineno=94, colno=9) + end_location: SourceLocation(pos=1631, lineno=97, colno=24) + identifier: 'gamemode:survival:target' + arguments: + + location: SourceLocation(pos=1620, lineno=97, colno=13) + end_location: SourceLocation(pos=1631, lineno=97, colno=24) + variable: 's' + arguments: + + location: SourceLocation(pos=1623, lineno=97, colno=16) + end_location: SourceLocation(pos=1630, lineno=97, colno=23) + inverted: False + key: + + location: SourceLocation(pos=1623, lineno=97, colno=16) + end_location: SourceLocation(pos=1626, lineno=97, colno=19) + value: 'tag' + value: + + location: SourceLocation(pos=1627, lineno=97, colno=20) + end_location: SourceLocation(pos=1630, lineno=97, colno=23) + value: 'bar' + + location: SourceLocation(pos=1645, lineno=99, colno=13) + end_location: SourceLocation(pos=1654, lineno=99, colno=22) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=1649, lineno=99, colno=17) + end_location: SourceLocation(pos=1654, lineno=99, colno=22) + fragments: + + location: SourceLocation(pos=1649, lineno=99, colno=17) + end_location: SourceLocation(pos=1654, lineno=99, colno=22) + value: 'hello' + + location: SourceLocation(pos=1663, lineno=100, colno=9) + end_location: SourceLocation(pos=1729, lineno=103, colno=20) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1671, lineno=100, colno=17) + end_location: SourceLocation(pos=1729, lineno=103, colno=20) + identifier: 'execute:in:dimension:subcommand' + arguments: + + location: SourceLocation(pos=1686, lineno=101, colno=13) + end_location: SourceLocation(pos=1693, lineno=101, colno=20) + is_tag: False + namespace: None + path: 'the_end' + + location: SourceLocation(pos=1706, lineno=102, colno=13) + end_location: SourceLocation(pos=1729, lineno=103, colno=20) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1722, lineno=103, colno=13) + end_location: SourceLocation(pos=1729, lineno=103, colno=20) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=1726, lineno=103, colno=17) + end_location: SourceLocation(pos=1729, lineno=103, colno=20) + fragments: + + location: SourceLocation(pos=1726, lineno=103, colno=17) + end_location: SourceLocation(pos=1729, lineno=103, colno=20) + value: 'foo' + + location: SourceLocation(pos=1734, lineno=104, colno=5) + end_location: SourceLocation(pos=1789, lineno=105, colno=31) + identifier: 'gamerule:doDaylightCycle:value' + arguments: + + location: SourceLocation(pos=1784, lineno=105, colno=26) + end_location: SourceLocation(pos=1789, lineno=105, colno=31) + value: False \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 6cb9c9a3a..935f6ae78 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -10,3 +10,12 @@ execute if block ~ ~ ~ #namespace:tag if entity @s[tag=foo] tellraw @a {"text": "Hello # there"} tellraw @a {"text": "Hello\" # \"there"} tellraw @s ["foo"] +say foo bar hello wat welp +say this is a continuation +gamerule doDaylightCycle false +gamerule doMobLoot false +gamerule doDaylightCycle false +execute as foo run gamemode survival @s[tag=bar] +say hello +execute in the_end run say foo +gamerule doDaylightCycle false From 3a9e625e2909511b17d20031e2e216ecbac5cd43 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:22:26 +0200 Subject: [PATCH 0329/1554] chore: reset changelog --- packages/mecha/CHANGELOG.md | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 packages/mecha/CHANGELOG.md diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md deleted file mode 100644 index ae2cf8b14..000000000 --- a/packages/mecha/CHANGELOG.md +++ /dev/null @@ -1,17 +0,0 @@ -# Changelog - - - -## v0.3.0 (2021-09-19) - -## v0.2.0 (2021-07-24) -### Feature -* Add initial parser implementation ([`117d76d`](https://github.com/vberlier/mecha/commit/117d76d807b5a27e8b83a9cebd63c0d8ec70d8d4)) - -## v0.1.0 (2021-06-12) -### Feature -* Start working on a parser ([`739335c`](https://github.com/vberlier/mecha/commit/739335c4d2f1d09136291e03c2324491eb69279b)) - -## v0.0.1 (2021-01-27) -### Fix -* Trigger automatic release ([`bd9e578`](https://github.com/vberlier/mecha/commit/bd9e578e353faa958514625761bb28e43ca6694c)) From 4ae635ae4447a11bb47dbc4711ce6134acc01e40 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:28:01 +0200 Subject: [PATCH 0330/1554] chore: rename repository --- packages/mecha/.github/workflows/main.yml | 2 +- packages/mecha/README.md | 8 ++++---- packages/mecha/pyproject.toml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/.github/workflows/main.yml b/packages/mecha/.github/workflows/main.yml index d4222526e..77d3c7f9e 100644 --- a/packages/mecha/.github/workflows/main.yml +++ b/packages/mecha/.github/workflows/main.yml @@ -42,7 +42,7 @@ jobs: run: poetry run black --check mecha tests - name: Release if: | - github.repository == 'vberlier/mecha' + github.repository == 'mcbeet/mecha' && github.event_name == 'push' && github.ref == 'refs/heads/main' env: diff --git a/packages/mecha/README.md b/packages/mecha/README.md index f9b7a973c..a84f69393 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -1,8 +1,8 @@ -logo +logo # Mecha -[![GitHub Actions](https://github.com/vberlier/mecha/workflows/CI/badge.svg)](https://github.com/vberlier/mecha/actions) +[![GitHub Actions](https://github.com/mcbeet/mecha/workflows/CI/badge.svg)](https://github.com/mcbeet/mecha/actions) [![PyPI](https://img.shields.io/pypi/v/mecha.svg)](https://pypi.org/project/mecha/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mecha.svg)](https://pypi.org/project/mecha/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) @@ -46,7 +46,7 @@ This package provides everything you need for working with Minecraft commands in - Command config resolver that flattens all the valid prototypes - Powerful rule dispatcher for processing specific ast nodes - Composable visitors and reducers -- _(soon)_ Execute arbitrary compilation passes in your [`beet`](https://github.com/vberlier/beet) pipeline +- _(soon)_ Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python ## Installation @@ -88,4 +88,4 @@ $ poetry run black --check mecha tests --- -License - [MIT](https://github.com/vberlier/mecha/blob/main/LICENSE) +License - [MIT](https://github.com/mcbeet/mecha/blob/main/LICENSE) diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c39b0190b..151dc49cc 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -5,9 +5,9 @@ description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" -homepage = "https://github.com/vberlier/mecha" -repository = "https://github.com/vberlier/mecha" -documentation = "https://github.com/vberlier/mecha" +homepage = "https://github.com/mcbeet/mecha" +repository = "https://github.com/mcbeet/mecha" +documentation = "https://github.com/mcbeet/mecha" readme = "README.md" From 084d1e01fc4a08aeb9ec28039fa8b24f716bd07c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:29:02 +0200 Subject: [PATCH 0331/1554] chore: add changelog --- packages/mecha/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/mecha/CHANGELOG.md diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md new file mode 100644 index 000000000..8a054ea94 --- /dev/null +++ b/packages/mecha/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + + + +## v0.3.0 (2021-09-19) \ No newline at end of file From bfb001197c3dc7443afd2620c4b3d29a863f231a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:36:55 +0200 Subject: [PATCH 0332/1554] chore: roll back to a previous version of python-semantic-release --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 10579012a..ff7f9e3f1 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -555,7 +555,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.19.2" +version = "7.19.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -826,7 +826,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e8362fe266ce31e4f1d51da5dccb21c23992d9884a19b5a8e4970e1e4ceb9908" +content-hash = "bcfd2b48592cc8131d094ce5b3ce649dcfeb333995e00bd051cdfe1a98f8d4de" [metadata.files] atomicwrites = [ @@ -1169,8 +1169,8 @@ python-gitlab = [ {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, - {file = "python_semantic_release-7.19.2-py3-none-any.whl", hash = "sha256:b2c8bb16a643fee0831be4d06138bc1440ebd4f252c3397d41abde179ea56852"}, + {file = "python-semantic-release-7.19.1.tar.gz", hash = "sha256:43f52f9a97677c029009063807f1fec9ffaabf049bd02f3fd898f0edf1ce5155"}, + {file = "python_semantic_release-7.19.1-py3-none-any.whl", hash = "sha256:8f5bfe18e78d44dc296966376f2bae2177ea881b628473d685b46f09a75ea92b"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 151dc49cc..88757e63e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -32,7 +32,7 @@ black = "^21.9b0" isort = "^5.9.3" pytest = "^6.2.5" pytest-insta = "^0.1.10" -python-semantic-release = "^7.19.2" +python-semantic-release = "7.19.1" lectern = ">=0.15.3" [tool.black] From 206e56673a123a5906aaa7a739698ce1a255e8c1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:40:02 +0200 Subject: [PATCH 0333/1554] chore: update deps --- packages/mecha/package-lock.json | 14 +++++----- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 44 ++------------------------------ packages/mecha/pyproject.toml | 2 -- 4 files changed, 10 insertions(+), 52 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 3bed430e0..c864806b1 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.168" + "pyright": "^1.1.169" } }, "node_modules/pyright": { - "version": "1.1.168", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.168.tgz", - "integrity": "sha512-dypPjQI7WSS60drwLJsh2N15gZirnmQuFgDADVWVLYb9CRjV/BtPmiG7hPZnjNKk40tUHlTHycazIidQbi/s5Q==", + "version": "1.1.169", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.169.tgz", + "integrity": "sha512-Vss62wzFixeK4TjmiXEyFbqFekFlL4XZEHyTqy7NCRmwrOn3f1VhGqAzq82JLMJ8wXpDiAiiErGrvnVjJZ3lXw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.168", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.168.tgz", - "integrity": "sha512-dypPjQI7WSS60drwLJsh2N15gZirnmQuFgDADVWVLYb9CRjV/BtPmiG7hPZnjNKk40tUHlTHycazIidQbi/s5Q==", + "version": "1.1.169", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.169.tgz", + "integrity": "sha512-Vss62wzFixeK4TjmiXEyFbqFekFlL4XZEHyTqy7NCRmwrOn3f1VhGqAzq82JLMJ8wXpDiAiiErGrvnVjJZ3lXw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index fd6df0c38..a6f61bad8 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.168" + "pyright": "^1.1.169" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index ff7f9e3f1..305bc4877 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -10,7 +10,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "attrs" version = "21.2.0" description = "Classes Without Boilerplate" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -336,38 +336,6 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] -[[package]] -name = "lectern" -version = "0.16.0" -description = "Literate Minecraft data packs and resource packs." -category = "main" -optional = false -python-versions = ">=3.8,<4.0" - -[package.dependencies] -beet = ">=0.40.1" -click = ">=8.0.1,<9.0.0" -markdown-it-py = ">=1.1.0,<2.0.0" - -[[package]] -name = "markdown-it-py" -version = "1.1.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -attrs = ">=19,<22" - -[package.extras] -code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -plugins = ["mdit-py-plugins"] -rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] -testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] - [[package]] name = "markupsafe" version = "2.0.1" @@ -826,7 +794,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "bcfd2b48592cc8131d094ce5b3ce649dcfeb333995e00bd051cdfe1a98f8d4de" +content-hash = "65e31140737f0476eca41f47cd0752491a528d1652e07a5cf24d598651e3e073" [metadata.files] atomicwrites = [ @@ -994,14 +962,6 @@ keyring = [ {file = "keyring-23.1.0-py3-none-any.whl", hash = "sha256:b32397fd7e7063f8dd74a26db910c9862fc2109285fa16e3b5208bcb42a3e579"}, {file = "keyring-23.1.0.tar.gz", hash = "sha256:b7e0156667f5dcc73c1f63a518005cd18a4eb23fe77321194fefcc03748b21a4"}, ] -lectern = [ - {file = "lectern-0.16.0-py3-none-any.whl", hash = "sha256:b63ba29cbce4446c4cef5412542417ab45dab512a4fe36c46858c3e15dced2ba"}, - {file = "lectern-0.16.0.tar.gz", hash = "sha256:1b7ce215ec5fbc9a82a9c15508df07e8038c715e3e04e8b191f96418cca7571a"}, -] -markdown-it-py = [ - {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, - {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, -] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 88757e63e..3cb4576ee 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -25,7 +25,6 @@ include = ["mecha/py.typed"] python = "^3.8" beet = ">=0.41.2" tokenstream = "^1.2.0" -lectern = ">=0.16.0" [tool.poetry.dev-dependencies] black = "^21.9b0" @@ -33,7 +32,6 @@ isort = "^5.9.3" pytest = "^6.2.5" pytest-insta = "^0.1.10" python-semantic-release = "7.19.1" -lectern = ">=0.15.3" [tool.black] target-version = ["py38"] From f07b5e498c9bb1ec7bd256ea8cad9a499757cbdd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 04:54:15 +0200 Subject: [PATCH 0334/1554] chore: try to fix python-semantic-release --- packages/mecha/poetry.lock | 470 +++++++++++++++++----------------- packages/mecha/pyproject.toml | 7 +- 2 files changed, 240 insertions(+), 237 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 305bc4877..07ade8ef5 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.9b0" +version = "21.8b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -84,11 +84,11 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "4.1.0" +version = "3.3.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] packaging = "*" @@ -97,7 +97,7 @@ webencodings = "*" [[package]] name = "certifi" -version = "2021.5.30" +version = "2020.12.5" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -105,7 +105,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.6" +version = "1.14.5" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -115,15 +115,12 @@ python-versions = "*" pycparser = "*" [[package]] -name = "charset-normalizer" -version = "2.0.4" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" category = "dev" optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "click" @@ -171,7 +168,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.4.8" +version = "3.4.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -228,27 +225,27 @@ smmap = ">=3.0.1,<5" [[package]] name = "gitpython" -version = "3.1.20" +version = "3.1.15" description = "Python Git Library" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} +typing-extensions = ">=3.7.4.0" [[package]] name = "idna" -version = "3.2" +version = "2.10" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.8.1" +version = "4.0.1" description = "Read metadata from Python packages" category = "dev" optional = false @@ -259,8 +256,7 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -272,7 +268,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.6.0" +version = "1.5.0" description = "Pythonic task execution" category = "dev" optional = false @@ -294,15 +290,14 @@ plugins = ["setuptools"] [[package]] name = "jeepney" -version = "0.7.1" +version = "0.6.0" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false python-versions = ">=3.6" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] name = "jinja2" @@ -320,7 +315,7 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.1.0" +version = "23.0.1" description = "Store and access your passwords safely." category = "dev" optional = false @@ -365,7 +360,7 @@ numpy = "*" [[package]] name = "numpy" -version = "1.21.1" +version = "1.20.1" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -373,11 +368,11 @@ python-versions = ">=3.7" [[package]] name = "packaging" -version = "21.0" +version = "20.9" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] pyparsing = ">=2.0.2" @@ -392,7 +387,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pkginfo" -version = "1.7.1" +version = "1.7.0" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false @@ -415,15 +410,14 @@ test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock [[package]] name = "pluggy" -version = "1.0.0" +version = "0.13.1" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -458,7 +452,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.10.0" +version = "2.9.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -507,14 +501,14 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "2.10.1" +version = "2.7.1" description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.6.0" [package.dependencies] -requests = ">=2.25.0" +requests = ">=2.22.0" requests-toolbelt = ">=0.9.1" [package.extras] @@ -523,7 +517,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.19.1" +version = "7.19.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -582,7 +576,7 @@ md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" -version = "2021.8.28" +version = "2021.4.4" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -590,21 +584,21 @@ python-versions = "*" [[package]] name = "requests" -version = "2.26.0" +version = "2.25.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +chardet = ">=3.0.2,<5" +idna = ">=2.5,<3" urllib3 = ">=1.21.1,<1.27" [package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-toolbelt" @@ -628,6 +622,17 @@ python-versions = "*" [package.extras] idna2008 = ["idna"] +[[package]] +name = "rope" +version = "0.19.0" +description = "a python refactoring library..." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +dev = ["pytest"] + [[package]] name = "secretstorage" version = "3.3.1" @@ -650,14 +655,14 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "6.2.0" +version = "6.0.1" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false python-versions = ">=3.6" -[package.dependencies] -tomli = ">=1.0" +[package.extras] +toml = ["toml"] [[package]] name = "six" @@ -709,15 +714,12 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.62.2" +version = "4.60.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] @@ -725,7 +727,7 @@ telegram = ["requests"] [[package]] name = "twine" -version = "3.4.2" +version = "3.4.1" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -752,16 +754,16 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.6" +version = "1.26.4" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "webencodings" @@ -781,7 +783,7 @@ python-versions = "*" [[package]] name = "zipp" -version = "3.5.0" +version = "3.4.1" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false @@ -789,12 +791,12 @@ python-versions = ">=3.6" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "65e31140737f0476eca41f47cd0752491a528d1652e07a5cf24d598651e3e073" +content-hash = "f44c8594622ec900b99881ee13622f5760ec618a3b7af3854d0c2e79c9d3f0e5" [metadata.files] atomicwrites = [ @@ -814,67 +816,71 @@ beet = [ {file = "beet-0.41.2.tar.gz", hash = "sha256:dfa6875613dc904e84b25621ddb573fd21f80db621341a8fb8a0ddc10f2c93e4"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, + {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, ] bleach = [ - {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, - {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, + {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, + {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, ] certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, ] cffi = [ - {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, - {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, - {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, - {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, - {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, - {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, - {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, - {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, - {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, - {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, - {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, - {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, - {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, - {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, - {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, - {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, - {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, - {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"}, - {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"}, + {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, + {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, + {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, + {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, + {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, + {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, + {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, + {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, + {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, + {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, + {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, + {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, + {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, + {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, + {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, + {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, + {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, + {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, + {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] click = [ {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, @@ -893,23 +899,20 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"}, - {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"}, - {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"}, - {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"}, - {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, + {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, + {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"}, + {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, @@ -926,41 +929,41 @@ gitdb = [ {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, ] gitpython = [ - {file = "GitPython-3.1.20-py3-none-any.whl", hash = "sha256:b1e1c269deab1b08ce65403cf14e10d2ef1f6c89e33ea7c5e5bb0222ea593b8a"}, - {file = "GitPython-3.1.20.tar.gz", hash = "sha256:df0e072a200703a65387b0cfdf0466e3bab729c0458cf6b7349d0e9877636519"}, + {file = "GitPython-3.1.15-py3-none-any.whl", hash = "sha256:a77824e516d3298b04fb36ec7845e92747df8fcfee9cacc32dd6239f9652f867"}, + {file = "GitPython-3.1.15.tar.gz", hash = "sha256:05af150f47a5cca3f4b0af289b73aef8cf3c4fe2385015b06220cbcdee48bb6e"}, ] idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, - {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, + {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"}, + {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.6.0-py2-none-any.whl", hash = "sha256:e6c9917a1e3e73e7ea91fdf82d5f151ccfe85bf30cc65cdb892444c02dbb5f74"}, - {file = "invoke-1.6.0-py3-none-any.whl", hash = "sha256:769e90caeb1bd07d484821732f931f1ad8916a38e3f3e618644687fc09cb6317"}, - {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"}, + {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, + {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, + {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, ] jeepney = [ - {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, - {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, + {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, + {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] keyring = [ - {file = "keyring-23.1.0-py3-none-any.whl", hash = "sha256:b32397fd7e7063f8dd74a26db910c9862fc2109285fa16e3b5208bcb42a3e579"}, - {file = "keyring-23.1.0.tar.gz", hash = "sha256:b7e0156667f5dcc73c1f63a518005cd18a4eb23fe77321194fefcc03748b21a4"}, + {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, + {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, @@ -1027,54 +1030,50 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, - {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, - {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, - {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, - {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, - {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, - {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, - {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, - {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, + {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, + {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, + {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, + {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, + {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, + {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, + {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, + {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, + {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, + {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, + {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, + {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, + {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, + {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, ] packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pkginfo = [ - {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, - {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, + {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, + {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, ] platformdirs = [ {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, ] pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] py = [ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, @@ -1109,8 +1108,8 @@ pydantic = [ {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pygments = [ - {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, - {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, + {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, + {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1125,12 +1124,12 @@ pytest-insta = [ {file = "pytest_insta-0.1.10-py3-none-any.whl", hash = "sha256:3043c4a668224f473df3de1d60fb356e356687b6931338c42c487abd0c9a19d8"}, ] python-gitlab = [ - {file = "python-gitlab-2.10.1.tar.gz", hash = "sha256:7afa7d7c062fa62c173190452265a30feefb844428efc58ea5244f3b9fc0d40f"}, - {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, + {file = "python-gitlab-2.7.1.tar.gz", hash = "sha256:e1f9234a3ee7fbcf9ab1a5cb8b935ae58fdab29af9832ae060bf74d88bac8a7c"}, + {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.19.1.tar.gz", hash = "sha256:43f52f9a97677c029009063807f1fec9ffaabf049bd02f3fd898f0edf1ce5155"}, - {file = "python_semantic_release-7.19.1-py3-none-any.whl", hash = "sha256:8f5bfe18e78d44dc296966376f2bae2177ea881b628473d685b46f09a75ea92b"}, + {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, + {file = "python_semantic_release-7.19.2-py3-none-any.whl", hash = "sha256:b2c8bb16a643fee0831be4d06138bc1440ebd4f252c3397d41abde179ea56852"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1172,51 +1171,51 @@ readme-renderer = [ {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2021.8.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308"}, - {file = "regex-2021.8.28-cp310-cp310-win32.whl", hash = "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed"}, - {file = "regex-2021.8.28-cp310-cp310-win_amd64.whl", hash = "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8"}, - {file = "regex-2021.8.28-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f"}, - {file = "regex-2021.8.28-cp36-cp36m-win32.whl", hash = "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354"}, - {file = "regex-2021.8.28-cp36-cp36m-win_amd64.whl", hash = "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645"}, - {file = "regex-2021.8.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906"}, - {file = "regex-2021.8.28-cp37-cp37m-win32.whl", hash = "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a"}, - {file = "regex-2021.8.28-cp37-cp37m-win_amd64.whl", hash = "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc"}, - {file = "regex-2021.8.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e"}, - {file = "regex-2021.8.28-cp38-cp38-win32.whl", hash = "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d"}, - {file = "regex-2021.8.28-cp38-cp38-win_amd64.whl", hash = "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2"}, - {file = "regex-2021.8.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed"}, - {file = "regex-2021.8.28-cp39-cp39-win32.whl", hash = "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374"}, - {file = "regex-2021.8.28-cp39-cp39-win_amd64.whl", hash = "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73"}, - {file = "regex-2021.8.28.tar.gz", hash = "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1"}, + {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, + {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, + {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, + {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, + {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, + {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, + {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, + {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, + {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, + {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, + {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, + {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, + {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, ] requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, @@ -1226,6 +1225,9 @@ rfc3986 = [ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] +rope = [ + {file = "rope-0.19.0.tar.gz", hash = "sha256:64e6d747532e1f5c8009ec5aae3e5523a5bcedf516f39a750d57d8ed749d90da"}, +] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, @@ -1235,8 +1237,8 @@ semver = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-6.2.0-py3-none-any.whl", hash = "sha256:3ff3c48a44fcd16b4354a1f82db64daff7434240fe913c51537dca016af466a7"}, - {file = "setuptools_scm-6.2.0.tar.gz", hash = "sha256:19e2cc7768b8cd7d0efd69e264ffcb8e7191cf9b5c69a0e60139c45f1980ca64"}, + {file = "setuptools_scm-6.0.1-py3-none-any.whl", hash = "sha256:c3bd5f701c8def44a5c0bfe8d407bef3f80342217ef3492b951f3777bd2d915c"}, + {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, @@ -1263,12 +1265,12 @@ tomlkit = [ {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.62.2-py2.py3-none-any.whl", hash = "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588"}, - {file = "tqdm-4.62.2.tar.gz", hash = "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5"}, + {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, + {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, ] twine = [ - {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, - {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, + {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, + {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] typing-extensions = [ {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, @@ -1276,8 +1278,8 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, + {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, + {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, @@ -1287,6 +1289,6 @@ wrapt = [ {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, ] zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, + {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, + {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, ] diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3cb4576ee..4f02a5e66 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,11 +27,12 @@ beet = ">=0.41.2" tokenstream = "^1.2.0" [tool.poetry.dev-dependencies] -black = "^21.9b0" -isort = "^5.9.3" +black = "^21.8b0" +rope = "^0.19.0" pytest = "^6.2.5" +isort = "^5.9.3" +python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" -python-semantic-release = "7.19.1" [tool.black] target-version = ["py38"] From 71b165404f883f052f59441351f6d632b34f75d4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Sep 2021 02:55:27 +0000 Subject: [PATCH 0335/1554] 0.3.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 8a054ea94..18519ac9e 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,4 +2,8 @@ +## v0.3.1 (2021-09-21) +### Fix +* Remember current line indentation for the following terms ([`9691684`](https://github.com/mcbeet/mecha/commit/9691684532a30aba2b71fb3b4ec824c26889de96)) + ## v0.3.0 (2021-09-19) \ No newline at end of file diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 665398d92..07004f0c4 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.0" +__version__ = "0.3.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4f02a5e66..9e0e8c5a5 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.0" +version = "0.3.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 88a956efbb1ede36e98521d4411395ac00a1e69b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 05:47:20 +0200 Subject: [PATCH 0336/1554] chore: udpate readme --- packages/mecha/README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index a84f69393..6910f5292 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -42,13 +42,20 @@ This package provides everything you need for working with Minecraft commands in ### Features - Extensible and version-agnostic `mcfunction` parser -- Clean abstract syntax tree with source location -- Command config resolver that flattens all the valid prototypes +- Clean, immutable and hashable abstract syntax tree with source location +- Command config resolver that flattens and enumerates all the valid command prototypes - Powerful rule dispatcher for processing specific ast nodes -- Composable visitors and reducers +- Composable ast visitors and reducers - _(soon)_ Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python +## Credits + +- [A few test cases are adapted from `SPYGlass` (github)](https://github.com/SPYGlassMC/SPYGlass) +- [Multiline example by `AjaxGb` (MCC discord)](https://discord.com/channels/154777837382008833/157097006500806656/539318174466703361) +- [Multiline syntax derived from the `hangman` plugin](https://github.com/mcbeet/beet/blob/main/beet/contrib/hangman.py) +- [Partially inspired by `Trident`](https://energyxxer.com/trident/) + ## Installation The package can be installed with `pip`. From 1f1711cb068c5d18483295badacac2f452161add Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 05:48:34 +0200 Subject: [PATCH 0337/1554] fix: separate reducer and mutating reducer --- packages/mecha/mecha/api.py | 9 ++++++- packages/mecha/mecha/dispatch.py | 41 +++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 403e35b5a..9b6f33631 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -14,6 +14,7 @@ from tokenstream import TokenStream from .ast import AstNode, AstRoot +from .dispatch import Dispatcher, MutatingReducer, Reducer from .parse import delegate, get_default_parsers from .serialize import Serializer from .spec import CommandSpec @@ -38,7 +39,10 @@ class Mecha: default_factory=lambda: CommandSpec(parsers=get_default_parsers()) ) - serialize: Serializer = extra_field(init=False) + normalize: Dispatcher[AstNode] = extra_field(init=False) + transform: Dispatcher[AstNode] = extra_field(init=False) + check: Dispatcher[AstNode] = extra_field(init=False) + serialize: Dispatcher[str] = extra_field(init=False) def __post_init__(self, ctx: Optional[Context], multiline: bool): if ctx: @@ -47,6 +51,9 @@ def __post_init__(self, ctx: Optional[Context], multiline: bool): else: self.spec.multiline = multiline + self.normalize = MutatingReducer() + self.transform = MutatingReducer() + self.check = Reducer() self.serialize = Serializer(self.spec) @contextmanager diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index f35c41204..abd98b6cf 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -1,7 +1,8 @@ __all__ = [ + "Dispatcher", "Visitor", "Reducer", - "Dispatcher", + "MutatingReducer", "Rule", "rule", ] @@ -16,6 +17,7 @@ Dict, FrozenSet, Generator, + Generic, Iterable, Iterator, List, @@ -23,6 +25,7 @@ Set, Tuple, Type, + TypeVar, Union, overload, ) @@ -31,6 +34,8 @@ from .ast import AstChildren, AstNode +T = TypeVar("T") + @dataclass class Rule: @@ -82,8 +87,8 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]: @dataclass -class Dispatcher: - """Ast node dispatcher.""" +class Dispatcher(Generic[T]): + """Ast dispatcher.""" rules: Dict[ Type[Any], @@ -122,7 +127,11 @@ def add_rule(self, rule: Callable[..., Any]): def extend( self, - *args: Union["Dispatcher", Callable[..., Any], Iterable[Callable[..., Any]]], + *args: Union[ + "Dispatcher[Any]", + Callable[..., Any], + Iterable[Callable[..., Any]], + ], ): """Extend the dispatcher.""" for arg in args: @@ -173,9 +182,12 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: rule(node, *args, **kwargs) return node + def __call__(self, node: AstNode) -> T: + return self.invoke(node) -class Visitor(Dispatcher): - """Ast node visitor.""" + +class Visitor(Dispatcher[Any]): + """Ast visitor.""" def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: rules = list(self.dispatch(node)) @@ -201,8 +213,21 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: return result -class Reducer(Dispatcher): - """Ast node reducer.""" +class Reducer(Dispatcher[Any]): + """Ast reducer.""" + + def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + for child in node: + self.invoke(child, *args, **kwargs) + + for rule in self.dispatch(node): + rule(node, *args, **kwargs) + + return node + + +class MutatingReducer(Dispatcher[Any]): + """Mutating ast reducer.""" def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: to_replace: Dict[str, Union[AstNode, AstChildren[AstNode]]] = {} From f7d0e1debc55be6eb61226a41c90905866d41100 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 05:52:32 +0200 Subject: [PATCH 0338/1554] refactor: add fallback rule for serializer --- packages/mecha/mecha/serialize.py | 41 ++++++------------------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 37563e343..97f4a4106 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -22,8 +22,6 @@ AstNbtPathSubscript, AstNode, AstNumber, - AstParticle, - AstParticleParameters, AstRange, AstResourceLocation, AstRoot, @@ -37,8 +35,6 @@ AstString, AstTime, AstUUID, - AstVector2, - AstVector3, ) from .dispatch import Visitor, rule from .spec import CommandSpec @@ -88,6 +84,14 @@ def key_value(self, node: Any, sep: str, result: List[str]) -> Iterator[AstNode] result.append(sep) yield node.value + @rule(AstNode) + def fallback(self, node: AstNode, result: List[str]): + sep = "" + for child in node: + result.append(sep) + sep = " " + yield child + @rule(AstRoot) def root(self, node: AstRoot, result: List[str], *args: Any): for command in node.commands: @@ -142,20 +146,6 @@ def coordinate(self, node: AstCoordinate, result: List[str]): return result.append(str(node.value)) - @rule(AstVector2) - def vector2(self, node: AstVector2, result: List[str]): - yield node.x - result.append(" ") - yield node.y - - @rule(AstVector3) - def vector3(self, node: AstVector3, result: List[str]): - yield node.x - result.append(" ") - yield node.y - result.append(" ") - yield node.z - @rule(AstJson) def json(self, node: AstJson, result: List[str]): result.append(json.dumps(node.evaluate())) @@ -270,18 +260,3 @@ def nbt_path(self, node: AstNbtPath, result: List[str]): result.append(sep) sep = "." yield component - - @rule(AstParticleParameters) - def particle_parameters(self, node: AstParticleParameters, result: List[str]): - sep = "" - for param in node: - result.append(sep) - sep = " " - yield param - - @rule(AstParticle) - def particle(self, node: AstParticle, result: List[str]): - yield node.name - if node.parameters: - result.append(" ") - yield node.parameters From 7bdb28b267421f5024942309ecaa517de4f7201c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 05:53:33 +0200 Subject: [PATCH 0339/1554] chore: update README --- packages/mecha/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index 6910f5292..b978629a3 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -51,7 +51,7 @@ This package provides everything you need for working with Minecraft commands in ## Credits -- [A few test cases are adapted from `SPYGlass` (github)](https://github.com/SPYGlassMC/SPYGlass) +- [A few test cases are adapted from `SPYGlass`](https://github.com/SPYGlassMC/SPYGlass) - [Multiline example by `AjaxGb` (MCC discord)](https://discord.com/channels/154777837382008833/157097006500806656/539318174466703361) - [Multiline syntax derived from the `hangman` plugin](https://github.com/mcbeet/beet/blob/main/beet/contrib/hangman.py) - [Partially inspired by `Trident`](https://energyxxer.com/trident/) From 912b3a79103e9b00fcdaeadf46ac22a5d7959d59 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Sep 2021 03:54:18 +0000 Subject: [PATCH 0340/1554] 0.3.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 18519ac9e..7b9c95175 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.2 (2021-09-21) +### Fix +* Separate reducer and mutating reducer ([`730792c`](https://github.com/mcbeet/mecha/commit/730792c3297ad5e574ea5ff75a8463563f51b770)) + ## v0.3.1 (2021-09-21) ### Fix * Remember current line indentation for the following terms ([`9691684`](https://github.com/mcbeet/mecha/commit/9691684532a30aba2b71fb3b4ec824c26889de96)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 07004f0c4..f694589f1 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.1" +__version__ = "0.3.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9e0e8c5a5..e6f6cf620 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.1" +version = "0.3.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From c0bf52dcb66ad2a26a59246904eed52666b4a3db Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 06:20:50 +0200 Subject: [PATCH 0341/1554] refactor: clean up imports --- packages/mecha/mecha/spec.py | 3 +-- packages/mecha/tests/test_dispatch.py | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 95d05ab89..d31f5cbab 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -10,8 +10,7 @@ from beet.core.utils import extra_field from tokenstream import TokenStream -from mecha.config import CommandTree - +from .config import CommandTree from .prototype import CommandArgument, CommandPrototype, CommandSignature diff --git a/packages/mecha/tests/test_dispatch.py b/packages/mecha/tests/test_dispatch.py index 88950d5c4..5c69bf433 100644 --- a/packages/mecha/tests/test_dispatch.py +++ b/packages/mecha/tests/test_dispatch.py @@ -1,17 +1,20 @@ from typing import Generator, List, Type -from mecha import AstNumber, Mecha, Visitor, rule -from mecha.ast import ( +from mecha import ( AstCommand, AstCoordinate, AstDustParticleParameters, AstLiteral, AstMessage, AstNode, + AstNumber, AstParticle, AstResourceLocation, AstRoot, AstVector3, + Mecha, + Visitor, + rule, ) From 89c92798609cf5ae4e9d97dff23c88e54aa3ad30 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 06:26:07 +0200 Subject: [PATCH 0342/1554] fix: allow specifying version with dots --- packages/mecha/mecha/config.py | 3 ++- packages/mecha/mecha/spec.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index e056833f5..0b1feef6a 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -7,7 +7,7 @@ from pathlib import Path from typing import Dict, Iterator, List, Literal, Optional, Tuple, Union -from beet.core.utils import FileSystemPath, JsonDict +from beet.core.utils import FileSystemPath, JsonDict, normalize_string from pydantic import BaseModel @@ -34,6 +34,7 @@ def load_from( if filename: sources.append(Path(filename).read_text()) if version: + version = normalize_string(version) sources.append(read_text("mecha.resources", f"{version}.json")) tree = cls.parse_raw(sources[0]) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index d31f5cbab..e43bb9bfb 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -28,7 +28,7 @@ class CommandSpec: multiline: bool = False tree: CommandTree = extra_field( - default_factory=lambda: CommandTree.load_from(version="1_17") + default_factory=lambda: CommandTree.load_from(version="1.17") ) prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) From 9c6cb2cb0235ecc7638897a2beb1b7dc15ddfdbe Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Sep 2021 04:32:59 +0000 Subject: [PATCH 0343/1554] 0.3.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 7b9c95175..0052d3a59 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.3 (2021-09-21) +### Fix +* Allow specifying version with dots ([`e4c9ba6`](https://github.com/mcbeet/mecha/commit/e4c9ba6256bc3ad803984a6a7bc68844b57c391a)) + ## v0.3.2 (2021-09-21) ### Fix * Separate reducer and mutating reducer ([`730792c`](https://github.com/mcbeet/mecha/commit/730792c3297ad5e574ea5ff75a8463563f51b770)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index f694589f1..e7381875f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.2" +__version__ = "0.3.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e6f6cf620..963cb3b7e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.2" +version = "0.3.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 0e930f016e92ee66a7b18c399a986a42199cac2b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 07:06:39 +0200 Subject: [PATCH 0344/1554] fix: make it possible to provide a dict to add_commands --- packages/mecha/examples/.gitkeep | 0 packages/mecha/examples/greet_command.py | 74 ++++++++++++++++++++++++ packages/mecha/mecha/spec.py | 8 ++- 3 files changed, 79 insertions(+), 3 deletions(-) delete mode 100644 packages/mecha/examples/.gitkeep create mode 100644 packages/mecha/examples/greet_command.py diff --git a/packages/mecha/examples/.gitkeep b/packages/mecha/examples/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/mecha/examples/greet_command.py b/packages/mecha/examples/greet_command.py new file mode 100644 index 000000000..b1b6e1989 --- /dev/null +++ b/packages/mecha/examples/greet_command.py @@ -0,0 +1,74 @@ +from dataclasses import replace +from typing import cast + +from mecha import ( + AstChildren, + AstCommand, + AstLiteral, + AstMessage, + AstSelector, + Mecha, + MutatingReducer, + rule, +) + +mc = Mecha() + +mc.spec.add_commands( + { + "type": "root", + "children": { + "greet": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:entity", + "properties": {"amount": "multiple", "type": "players"}, + "executable": True, + } + }, + } + }, + } +) + +function = """ + greet @a[ + tag = !registered + ] +""" + +ast = mc.parse(function, multiline=True) +print(ast.dump()) +print(mc.serialize(ast)) + + +@rule(AstCommand, identifier="greet:entity") +def rewrite_greet_command(node: AstCommand) -> AstCommand: + return replace( + node, + identifier="say:message", + arguments=AstChildren( + [ + AstMessage( + fragments=AstChildren( + [ + AstLiteral(value="Hello "), + cast(AstSelector, node.arguments[0]), + ] + ) + ) + ] + ), + ) + + +transform = MutatingReducer() +transform.extend(rewrite_greet_command) + +ast = transform(ast) +print(ast.dump()) +print(mc.serialize(ast)) + +print(ast == mc.parse("say Hello @a[tag=!registered]")) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index e43bb9bfb..2e917c9bd 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -5,9 +5,9 @@ from dataclasses import dataclass -from typing import Any, Dict, Protocol, Tuple +from typing import Any, Dict, Protocol, Tuple, Union -from beet.core.utils import extra_field +from beet.core.utils import JsonDict, extra_field from tokenstream import TokenStream from .config import CommandTree @@ -37,8 +37,10 @@ class CommandSpec: def __post_init__(self): self.update() - def add_commands(self, tree: CommandTree): + def add_commands(self, tree: Union[CommandTree, JsonDict]): """Extend the command tree and regenerate prototypes.""" + if not isinstance(tree, CommandTree): + tree = CommandTree(**tree) self.tree.extend(tree) self.update() From 6e86fa7a913460c70c76196834a7c6f6d909bb94 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Sep 2021 05:09:59 +0000 Subject: [PATCH 0345/1554] 0.3.4 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 0052d3a59..bb2e24653 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.4 (2021-09-21) +### Fix +* Make it possible to provide a dict to add_commands ([`29b94f5`](https://github.com/mcbeet/mecha/commit/29b94f5712da74c0d346553c237a513ebe0910c2)) + ## v0.3.3 (2021-09-21) ### Fix * Allow specifying version with dots ([`e4c9ba6`](https://github.com/mcbeet/mecha/commit/e4c9ba6256bc3ad803984a6a7bc68844b57c391a)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e7381875f..195a10ccc 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.3" +__version__ = "0.3.4" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 963cb3b7e..c5a9492ee 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.3" +version = "0.3.4" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 30b91bbe7c24809bd437de4a89acb5206c7a5d20 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 19:34:51 +0200 Subject: [PATCH 0346/1554] fix: allow # and $ at the beginning of fake player names --- packages/mecha/mecha/parse.py | 63 +++++++++++-------- .../multiline_command_examples.mcfunction | 3 + .../parse__multiline_command_examples__0.txt | 38 ++++++++++- .../parse__multiline_command_examples__1.txt | 2 + 4 files changed, 78 insertions(+), 28 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 49ae45f77..3bfb91de4 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -35,6 +35,7 @@ "RangeParser", "IntegerRangeConstraint", "LengthConstraint", + "CommentDisambiguation", "parse_swizzle", "TimeParser", "parse_uuid", @@ -172,7 +173,7 @@ def get_default_parsers() -> Dict[str, Parser]: "nbt_path": NbtPathParser(), "range": RangeParser(), "integer_range": IntegerRangeConstraint(delegate("range")), - "resource_location_or_tag": ResourceLocationParser(), + "resource_location_or_tag": CommentDisambiguation(ResourceLocationParser()), "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), "uuid": parse_uuid, "objective": LengthConstraint( @@ -180,7 +181,9 @@ def get_default_parsers() -> Dict[str, Parser]: limit=16, ), "player_name": LengthConstraint( - parser=LiteralParser("player_name", r"[a-zA-Z0-9_.+-]+"), + parser=CommentDisambiguation( + LiteralParser("player_name", r"[#\$a-zA-Z0-9_.+-][a-zA-Z0-9_.+-]*"), + ), limit=16, ), "swizzle": parse_swizzle, @@ -1067,30 +1070,6 @@ class ResourceLocationParser: """Parser for resource locations.""" def __call__(self, stream: TokenStream) -> AstResourceLocation: - multiline = get_stream_multiline(stream) - - # This is kind of a hack. There's no way to easily differentiate - # tags from inline comments since they both begin with "#". - if multiline: - with stream.checkpoint() as commit: - last_comment = None - - while stream.index >= 0 and stream.current.match( - "whitespace", - "newline", - "comment", - "indent", - "dedent", - ): - if stream.current.match("comment"): - last_comment = stream.current - stream.index -= 1 - - if last_comment: - commit() - - stream.generator = stream.generate_tokens() - with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): token = stream.expect("resource_location") value = token.value @@ -1124,6 +1103,38 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class CommentDisambiguation: + """Reset the stream to the last non-comment token.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + multiline = get_stream_multiline(stream) + + if multiline: + with stream.checkpoint() as commit: + last_comment = None + + while stream.index >= 0 and stream.current.match( + "whitespace", + "newline", + "comment", + "indent", + "dedent", + ): + if stream.current.match("comment"): + last_comment = stream.current + stream.index -= 1 + + if last_comment: + commit() + + stream.generator = stream.generate_tokens() + + return self.parser(stream) + + @dataclass class BlockParser: """Parser for minecraft blocks.""" diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index 42c75f995..330e4cc6a 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -103,3 +103,6 @@ gamerule say foo gamerule doDaylightCycle false + +scoreboard players set #index global 3 +scoreboard players set $index global 3 diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index f2a7eda00..1b03f2e99 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1790, lineno=106, colno=1) + end_location: SourceLocation(pos=1869, lineno=109, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -946,4 +946,38 @@ location: SourceLocation(pos=1784, lineno=105, colno=26) end_location: SourceLocation(pos=1789, lineno=105, colno=31) - value: False \ No newline at end of file + value: False + + location: SourceLocation(pos=1791, lineno=107, colno=1) + end_location: SourceLocation(pos=1829, lineno=107, colno=39) + identifier: 'scoreboard:players:set:targets:objective:score' + arguments: + + location: SourceLocation(pos=1814, lineno=107, colno=24) + end_location: SourceLocation(pos=1820, lineno=107, colno=30) + value: '#index' + + location: SourceLocation(pos=1821, lineno=107, colno=31) + end_location: SourceLocation(pos=1827, lineno=107, colno=37) + value: 'global' + + location: SourceLocation(pos=1828, lineno=107, colno=38) + end_location: SourceLocation(pos=1829, lineno=107, colno=39) + value: 3 + + location: SourceLocation(pos=1830, lineno=108, colno=1) + end_location: SourceLocation(pos=1868, lineno=108, colno=39) + identifier: 'scoreboard:players:set:targets:objective:score' + arguments: + + location: SourceLocation(pos=1853, lineno=108, colno=24) + end_location: SourceLocation(pos=1859, lineno=108, colno=30) + value: '$index' + + location: SourceLocation(pos=1860, lineno=108, colno=31) + end_location: SourceLocation(pos=1866, lineno=108, colno=37) + value: 'global' + + location: SourceLocation(pos=1867, lineno=108, colno=38) + end_location: SourceLocation(pos=1868, lineno=108, colno=39) + value: 3 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 935f6ae78..6118ae4bf 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -19,3 +19,5 @@ execute as foo run gamemode survival @s[tag=bar] say hello execute in the_end run say foo gamerule doDaylightCycle false +scoreboard players set #index global 3 +scoreboard players set $index global 3 From df0b9be8f964e27c627dd8ec72f6483a75a7de30 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Sep 2021 17:35:27 +0000 Subject: [PATCH 0347/1554] 0.3.5 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index bb2e24653..9fb093b61 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.5 (2021-09-21) +### Fix +* Allow # and $ at the beginning of fake player names ([`4b7fc56`](https://github.com/mcbeet/mecha/commit/4b7fc56b5e6d7462aee2acda5de9754d0b821f47)) + ## v0.3.4 (2021-09-21) ### Fix * Make it possible to provide a dict to add_commands ([`29b94f5`](https://github.com/mcbeet/mecha/commit/29b94f5712da74c0d346553c237a513ebe0910c2)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 195a10ccc..af9ab7f53 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.4" +__version__ = "0.3.5" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c5a9492ee..b0dc7e32d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.4" +version = "0.3.5" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 030b1663a04a2bcb1578619fe3dd29f165e30ecb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 19:53:34 +0200 Subject: [PATCH 0348/1554] fix: also disambiguate when not in multiline mode --- packages/mecha/mecha/parse.py | 35 +- .../resources/command_examples.mcfunction | 1 + .../snapshots/parse__command_examples__0.txt | 2012 +++++++++-------- .../snapshots/parse__command_examples__1.txt | 1 + 4 files changed, 1045 insertions(+), 1004 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 3bfb91de4..326fc89cc 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1110,27 +1110,24 @@ class CommentDisambiguation: parser: Parser def __call__(self, stream: TokenStream) -> Any: - multiline = get_stream_multiline(stream) - - if multiline: - with stream.checkpoint() as commit: - last_comment = None - - while stream.index >= 0 and stream.current.match( - "whitespace", - "newline", - "comment", - "indent", - "dedent", - ): - if stream.current.match("comment"): - last_comment = stream.current - stream.index -= 1 + with stream.checkpoint() as commit: + last_comment = None + + while stream.index >= 0 and stream.current.match( + "whitespace", + "newline", + "comment", + "indent", + "dedent", + ): + if stream.current.match("comment"): + last_comment = stream.current + stream.index -= 1 - if last_comment: - commit() + if last_comment: + commit() - stream.generator = stream.generate_tokens() + stream.generator = stream.generate_tokens() return self.parser(stream) diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index d4f7f6535..2c8117051 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -59,6 +59,7 @@ execute as @p at @s run teleport @s ~ ~ ~ ~10 ~ execute in minecraft:the_nether run teleport ~ ~ ~ execute as @a in minecraft:the_end run teleport 84 57 79 execute as Alice in minecraft:overworld run teleport 251 64 -160 +execute store result score #temp global run data get storage global foo # experience experience query Steve levels # fill diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index b6da6a8f9..d388edc17 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5876, lineno=145, colno=1) + end_location: SourceLocation(pos=5948, lineno=146, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -2865,68 +2865,110 @@ type: 'absolute' value: -160 - location: SourceLocation(pos=2930, lineno=63, colno=1) - end_location: SourceLocation(pos=2959, lineno=63, colno=30) + location: SourceLocation(pos=2917, lineno=62, colno=1) + end_location: SourceLocation(pos=2988, lineno=62, colno=72) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=2925, lineno=62, colno=9) + end_location: SourceLocation(pos=2988, lineno=62, colno=72) + identifier: 'execute:store:result:score:targets:objective:subcommand' + arguments: + + location: SourceLocation(pos=2944, lineno=62, colno=28) + end_location: SourceLocation(pos=2949, lineno=62, colno=33) + value: '#temp' + + location: SourceLocation(pos=2950, lineno=62, colno=34) + end_location: SourceLocation(pos=2956, lineno=62, colno=40) + value: 'global' + + location: SourceLocation(pos=2957, lineno=62, colno=41) + end_location: SourceLocation(pos=2988, lineno=62, colno=72) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=2961, lineno=62, colno=45) + end_location: SourceLocation(pos=2988, lineno=62, colno=72) + identifier: 'data:get:storage:target:path' + arguments: + + location: SourceLocation(pos=2978, lineno=62, colno=62) + end_location: SourceLocation(pos=2984, lineno=62, colno=68) + is_tag: False + namespace: None + path: 'global' + + location: SourceLocation(pos=2985, lineno=62, colno=69) + end_location: SourceLocation(pos=2988, lineno=62, colno=72) + components: + + location: SourceLocation(pos=2985, lineno=62, colno=69) + end_location: SourceLocation(pos=2988, lineno=62, colno=72) + value: 'foo' + + location: SourceLocation(pos=3002, lineno=64, colno=1) + end_location: SourceLocation(pos=3031, lineno=64, colno=30) identifier: 'experience:query:targets:levels' arguments: - location: SourceLocation(pos=2947, lineno=63, colno=18) - end_location: SourceLocation(pos=2952, lineno=63, colno=23) + location: SourceLocation(pos=3019, lineno=64, colno=18) + end_location: SourceLocation(pos=3024, lineno=64, colno=23) value: 'Steve' - location: SourceLocation(pos=2967, lineno=65, colno=1) - end_location: SourceLocation(pos=3059, lineno=65, colno=93) + location: SourceLocation(pos=3039, lineno=66, colno=1) + end_location: SourceLocation(pos=3131, lineno=66, colno=93) identifier: 'fill:from:to:block:replace:filter' arguments: - location: SourceLocation(pos=2972, lineno=65, colno=6) - end_location: SourceLocation(pos=2983, lineno=65, colno=17) + location: SourceLocation(pos=3044, lineno=66, colno=6) + end_location: SourceLocation(pos=3055, lineno=66, colno=17) x: - location: SourceLocation(pos=2972, lineno=65, colno=6) - end_location: SourceLocation(pos=2974, lineno=65, colno=8) + location: SourceLocation(pos=3044, lineno=66, colno=6) + end_location: SourceLocation(pos=3046, lineno=66, colno=8) type: 'absolute' value: 52 y: - location: SourceLocation(pos=2975, lineno=65, colno=9) - end_location: SourceLocation(pos=2977, lineno=65, colno=11) + location: SourceLocation(pos=3047, lineno=66, colno=9) + end_location: SourceLocation(pos=3049, lineno=66, colno=11) type: 'absolute' value: 63 z: - location: SourceLocation(pos=2978, lineno=65, colno=12) - end_location: SourceLocation(pos=2983, lineno=65, colno=17) + location: SourceLocation(pos=3050, lineno=66, colno=12) + end_location: SourceLocation(pos=3055, lineno=66, colno=17) type: 'absolute' value: -1516 - location: SourceLocation(pos=2984, lineno=65, colno=18) - end_location: SourceLocation(pos=2995, lineno=65, colno=29) + location: SourceLocation(pos=3056, lineno=66, colno=18) + end_location: SourceLocation(pos=3067, lineno=66, colno=29) x: - location: SourceLocation(pos=2984, lineno=65, colno=18) - end_location: SourceLocation(pos=2986, lineno=65, colno=20) + location: SourceLocation(pos=3056, lineno=66, colno=18) + end_location: SourceLocation(pos=3058, lineno=66, colno=20) type: 'absolute' value: 33 y: - location: SourceLocation(pos=2987, lineno=65, colno=21) - end_location: SourceLocation(pos=2989, lineno=65, colno=23) + location: SourceLocation(pos=3059, lineno=66, colno=21) + end_location: SourceLocation(pos=3061, lineno=66, colno=23) type: 'absolute' value: 73 z: - location: SourceLocation(pos=2990, lineno=65, colno=24) - end_location: SourceLocation(pos=2995, lineno=65, colno=29) + location: SourceLocation(pos=3062, lineno=66, colno=24) + end_location: SourceLocation(pos=3067, lineno=66, colno=29) type: 'absolute' value: -1536 - location: SourceLocation(pos=2996, lineno=65, colno=30) - end_location: SourceLocation(pos=3016, lineno=65, colno=50) + location: SourceLocation(pos=3068, lineno=66, colno=30) + end_location: SourceLocation(pos=3088, lineno=66, colno=50) identifier: - location: SourceLocation(pos=2996, lineno=65, colno=30) - end_location: SourceLocation(pos=3016, lineno=65, colno=50) + location: SourceLocation(pos=3068, lineno=66, colno=30) + end_location: SourceLocation(pos=3088, lineno=66, colno=50) is_tag: False namespace: 'minecraft' path: 'gold_block' @@ -2934,12 +2976,12 @@ data_tags: None - location: SourceLocation(pos=3025, lineno=65, colno=59) - end_location: SourceLocation(pos=3059, lineno=65, colno=93) + location: SourceLocation(pos=3097, lineno=66, colno=59) + end_location: SourceLocation(pos=3131, lineno=66, colno=93) identifier: - location: SourceLocation(pos=3025, lineno=65, colno=59) - end_location: SourceLocation(pos=3059, lineno=65, colno=93) + location: SourceLocation(pos=3097, lineno=66, colno=59) + end_location: SourceLocation(pos=3131, lineno=66, colno=93) is_tag: False namespace: 'minecraft' path: 'orange_glazed_terracotta' @@ -2947,59 +2989,59 @@ data_tags: None - location: SourceLocation(pos=3060, lineno=66, colno=1) - end_location: SourceLocation(pos=3092, lineno=66, colno=33) + location: SourceLocation(pos=3132, lineno=67, colno=1) + end_location: SourceLocation(pos=3164, lineno=67, colno=33) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=3065, lineno=66, colno=6) - end_location: SourceLocation(pos=3076, lineno=66, colno=17) + location: SourceLocation(pos=3137, lineno=67, colno=6) + end_location: SourceLocation(pos=3148, lineno=67, colno=17) x: - location: SourceLocation(pos=3065, lineno=66, colno=6) - end_location: SourceLocation(pos=3068, lineno=66, colno=9) + location: SourceLocation(pos=3137, lineno=67, colno=6) + end_location: SourceLocation(pos=3140, lineno=67, colno=9) type: 'relative' value: -3 y: - location: SourceLocation(pos=3069, lineno=66, colno=10) - end_location: SourceLocation(pos=3072, lineno=66, colno=13) + location: SourceLocation(pos=3141, lineno=67, colno=10) + end_location: SourceLocation(pos=3144, lineno=67, colno=13) type: 'relative' value: -3 z: - location: SourceLocation(pos=3073, lineno=66, colno=14) - end_location: SourceLocation(pos=3076, lineno=66, colno=17) + location: SourceLocation(pos=3145, lineno=67, colno=14) + end_location: SourceLocation(pos=3148, lineno=67, colno=17) type: 'relative' value: -3 - location: SourceLocation(pos=3077, lineno=66, colno=18) - end_location: SourceLocation(pos=3086, lineno=66, colno=27) + location: SourceLocation(pos=3149, lineno=67, colno=18) + end_location: SourceLocation(pos=3158, lineno=67, colno=27) x: - location: SourceLocation(pos=3077, lineno=66, colno=18) - end_location: SourceLocation(pos=3079, lineno=66, colno=20) + location: SourceLocation(pos=3149, lineno=67, colno=18) + end_location: SourceLocation(pos=3151, lineno=67, colno=20) type: 'relative' value: 3 y: - location: SourceLocation(pos=3080, lineno=66, colno=21) - end_location: SourceLocation(pos=3083, lineno=66, colno=24) + location: SourceLocation(pos=3152, lineno=67, colno=21) + end_location: SourceLocation(pos=3155, lineno=67, colno=24) type: 'relative' value: -1 z: - location: SourceLocation(pos=3084, lineno=66, colno=25) - end_location: SourceLocation(pos=3086, lineno=66, colno=27) + location: SourceLocation(pos=3156, lineno=67, colno=25) + end_location: SourceLocation(pos=3158, lineno=67, colno=27) type: 'relative' value: 3 - location: SourceLocation(pos=3087, lineno=66, colno=28) - end_location: SourceLocation(pos=3092, lineno=66, colno=33) + location: SourceLocation(pos=3159, lineno=67, colno=28) + end_location: SourceLocation(pos=3164, lineno=67, colno=33) identifier: - location: SourceLocation(pos=3087, lineno=66, colno=28) - end_location: SourceLocation(pos=3092, lineno=66, colno=33) + location: SourceLocation(pos=3159, lineno=67, colno=28) + end_location: SourceLocation(pos=3164, lineno=67, colno=33) is_tag: False namespace: None path: 'water' @@ -3007,59 +3049,59 @@ data_tags: None - location: SourceLocation(pos=3093, lineno=67, colno=1) - end_location: SourceLocation(pos=3139, lineno=67, colno=47) + location: SourceLocation(pos=3165, lineno=68, colno=1) + end_location: SourceLocation(pos=3211, lineno=68, colno=47) identifier: 'fill:from:to:block:hollow' arguments: - location: SourceLocation(pos=3098, lineno=67, colno=6) - end_location: SourceLocation(pos=3107, lineno=67, colno=15) + location: SourceLocation(pos=3170, lineno=68, colno=6) + end_location: SourceLocation(pos=3179, lineno=68, colno=15) x: - location: SourceLocation(pos=3098, lineno=67, colno=6) - end_location: SourceLocation(pos=3101, lineno=67, colno=9) + location: SourceLocation(pos=3170, lineno=68, colno=6) + end_location: SourceLocation(pos=3173, lineno=68, colno=9) type: 'relative' value: -3 y: - location: SourceLocation(pos=3102, lineno=67, colno=10) - end_location: SourceLocation(pos=3103, lineno=67, colno=11) + location: SourceLocation(pos=3174, lineno=68, colno=10) + end_location: SourceLocation(pos=3175, lineno=68, colno=11) type: 'relative' value: 0 z: - location: SourceLocation(pos=3104, lineno=67, colno=12) - end_location: SourceLocation(pos=3107, lineno=67, colno=15) + location: SourceLocation(pos=3176, lineno=68, colno=12) + end_location: SourceLocation(pos=3179, lineno=68, colno=15) type: 'relative' value: -4 - location: SourceLocation(pos=3108, lineno=67, colno=16) - end_location: SourceLocation(pos=3116, lineno=67, colno=24) + location: SourceLocation(pos=3180, lineno=68, colno=16) + end_location: SourceLocation(pos=3188, lineno=68, colno=24) x: - location: SourceLocation(pos=3108, lineno=67, colno=16) - end_location: SourceLocation(pos=3110, lineno=67, colno=18) + location: SourceLocation(pos=3180, lineno=68, colno=16) + end_location: SourceLocation(pos=3182, lineno=68, colno=18) type: 'relative' value: 3 y: - location: SourceLocation(pos=3111, lineno=67, colno=19) - end_location: SourceLocation(pos=3113, lineno=67, colno=21) + location: SourceLocation(pos=3183, lineno=68, colno=19) + end_location: SourceLocation(pos=3185, lineno=68, colno=21) type: 'relative' value: 4 z: - location: SourceLocation(pos=3114, lineno=67, colno=22) - end_location: SourceLocation(pos=3116, lineno=67, colno=24) + location: SourceLocation(pos=3186, lineno=68, colno=22) + end_location: SourceLocation(pos=3188, lineno=68, colno=24) type: 'relative' value: 4 - location: SourceLocation(pos=3117, lineno=67, colno=25) - end_location: SourceLocation(pos=3132, lineno=67, colno=40) + location: SourceLocation(pos=3189, lineno=68, colno=25) + end_location: SourceLocation(pos=3204, lineno=68, colno=40) identifier: - location: SourceLocation(pos=3117, lineno=67, colno=25) - end_location: SourceLocation(pos=3132, lineno=67, colno=40) + location: SourceLocation(pos=3189, lineno=68, colno=25) + end_location: SourceLocation(pos=3204, lineno=68, colno=40) is_tag: False namespace: 'minecraft' path: 'stone' @@ -3067,59 +3109,59 @@ data_tags: None - location: SourceLocation(pos=3140, lineno=68, colno=1) - end_location: SourceLocation(pos=3177, lineno=68, colno=38) + location: SourceLocation(pos=3212, lineno=69, colno=1) + end_location: SourceLocation(pos=3249, lineno=69, colno=38) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=3145, lineno=68, colno=6) - end_location: SourceLocation(pos=3159, lineno=68, colno=20) + location: SourceLocation(pos=3217, lineno=69, colno=6) + end_location: SourceLocation(pos=3231, lineno=69, colno=20) x: - location: SourceLocation(pos=3145, lineno=68, colno=6) - end_location: SourceLocation(pos=3149, lineno=68, colno=10) + location: SourceLocation(pos=3217, lineno=69, colno=6) + end_location: SourceLocation(pos=3221, lineno=69, colno=10) type: 'relative' value: -15 y: - location: SourceLocation(pos=3150, lineno=68, colno=11) - end_location: SourceLocation(pos=3154, lineno=68, colno=15) + location: SourceLocation(pos=3222, lineno=69, colno=11) + end_location: SourceLocation(pos=3226, lineno=69, colno=15) type: 'relative' value: -15 z: - location: SourceLocation(pos=3155, lineno=68, colno=16) - end_location: SourceLocation(pos=3159, lineno=68, colno=20) + location: SourceLocation(pos=3227, lineno=69, colno=16) + end_location: SourceLocation(pos=3231, lineno=69, colno=20) type: 'relative' value: -15 - location: SourceLocation(pos=3160, lineno=68, colno=21) - end_location: SourceLocation(pos=3171, lineno=68, colno=32) + location: SourceLocation(pos=3232, lineno=69, colno=21) + end_location: SourceLocation(pos=3243, lineno=69, colno=32) x: - location: SourceLocation(pos=3160, lineno=68, colno=21) - end_location: SourceLocation(pos=3163, lineno=68, colno=24) + location: SourceLocation(pos=3232, lineno=69, colno=21) + end_location: SourceLocation(pos=3235, lineno=69, colno=24) type: 'relative' value: 15 y: - location: SourceLocation(pos=3164, lineno=68, colno=25) - end_location: SourceLocation(pos=3167, lineno=68, colno=28) + location: SourceLocation(pos=3236, lineno=69, colno=25) + end_location: SourceLocation(pos=3239, lineno=69, colno=28) type: 'relative' value: 15 z: - location: SourceLocation(pos=3168, lineno=68, colno=29) - end_location: SourceLocation(pos=3171, lineno=68, colno=32) + location: SourceLocation(pos=3240, lineno=69, colno=29) + end_location: SourceLocation(pos=3243, lineno=69, colno=32) type: 'relative' value: 15 - location: SourceLocation(pos=3172, lineno=68, colno=33) - end_location: SourceLocation(pos=3177, lineno=68, colno=38) + location: SourceLocation(pos=3244, lineno=69, colno=33) + end_location: SourceLocation(pos=3249, lineno=69, colno=38) identifier: - location: SourceLocation(pos=3172, lineno=68, colno=33) - end_location: SourceLocation(pos=3177, lineno=68, colno=38) + location: SourceLocation(pos=3244, lineno=69, colno=33) + end_location: SourceLocation(pos=3249, lineno=69, colno=38) is_tag: False namespace: None path: 'stone' @@ -3127,1283 +3169,1283 @@ data_tags: None - location: SourceLocation(pos=3178, lineno=69, colno=1) - end_location: SourceLocation(pos=3262, lineno=69, colno=85) + location: SourceLocation(pos=3250, lineno=70, colno=1) + end_location: SourceLocation(pos=3334, lineno=70, colno=85) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=3183, lineno=69, colno=6) - end_location: SourceLocation(pos=3190, lineno=69, colno=13) + location: SourceLocation(pos=3255, lineno=70, colno=6) + end_location: SourceLocation(pos=3262, lineno=70, colno=13) x: - location: SourceLocation(pos=3183, lineno=69, colno=6) - end_location: SourceLocation(pos=3186, lineno=69, colno=9) + location: SourceLocation(pos=3255, lineno=70, colno=6) + end_location: SourceLocation(pos=3258, lineno=70, colno=9) type: 'relative' value: -1 y: - location: SourceLocation(pos=3187, lineno=69, colno=10) - end_location: SourceLocation(pos=3188, lineno=69, colno=11) + location: SourceLocation(pos=3259, lineno=70, colno=10) + end_location: SourceLocation(pos=3260, lineno=70, colno=11) type: 'relative' value: 0 z: - location: SourceLocation(pos=3189, lineno=69, colno=12) - end_location: SourceLocation(pos=3190, lineno=69, colno=13) + location: SourceLocation(pos=3261, lineno=70, colno=12) + end_location: SourceLocation(pos=3262, lineno=70, colno=13) type: 'relative' value: 0 - location: SourceLocation(pos=3191, lineno=69, colno=14) - end_location: SourceLocation(pos=3197, lineno=69, colno=20) + location: SourceLocation(pos=3263, lineno=70, colno=14) + end_location: SourceLocation(pos=3269, lineno=70, colno=20) x: - location: SourceLocation(pos=3191, lineno=69, colno=14) - end_location: SourceLocation(pos=3193, lineno=69, colno=16) + location: SourceLocation(pos=3263, lineno=70, colno=14) + end_location: SourceLocation(pos=3265, lineno=70, colno=16) type: 'relative' value: 1 y: - location: SourceLocation(pos=3194, lineno=69, colno=17) - end_location: SourceLocation(pos=3195, lineno=69, colno=18) + location: SourceLocation(pos=3266, lineno=70, colno=17) + end_location: SourceLocation(pos=3267, lineno=70, colno=18) type: 'relative' value: 0 z: - location: SourceLocation(pos=3196, lineno=69, colno=19) - end_location: SourceLocation(pos=3197, lineno=69, colno=20) + location: SourceLocation(pos=3268, lineno=70, colno=19) + end_location: SourceLocation(pos=3269, lineno=70, colno=20) type: 'relative' value: 0 - location: SourceLocation(pos=3198, lineno=69, colno=21) - end_location: SourceLocation(pos=3262, lineno=69, colno=85) + location: SourceLocation(pos=3270, lineno=70, colno=21) + end_location: SourceLocation(pos=3334, lineno=70, colno=85) identifier: - location: SourceLocation(pos=3198, lineno=69, colno=21) - end_location: SourceLocation(pos=3231, lineno=69, colno=54) + location: SourceLocation(pos=3270, lineno=70, colno=21) + end_location: SourceLocation(pos=3303, lineno=70, colno=54) is_tag: False namespace: 'minecraft' path: 'prismarine_brick_stairs' block_states: - location: SourceLocation(pos=3232, lineno=69, colno=55) - end_location: SourceLocation(pos=3244, lineno=69, colno=67) + location: SourceLocation(pos=3304, lineno=70, colno=55) + end_location: SourceLocation(pos=3316, lineno=70, colno=67) key: - location: SourceLocation(pos=3232, lineno=69, colno=55) - end_location: SourceLocation(pos=3238, lineno=69, colno=61) + location: SourceLocation(pos=3304, lineno=70, colno=55) + end_location: SourceLocation(pos=3310, lineno=70, colno=61) value: 'facing' value: - location: SourceLocation(pos=3239, lineno=69, colno=62) - end_location: SourceLocation(pos=3244, lineno=69, colno=67) + location: SourceLocation(pos=3311, lineno=70, colno=62) + end_location: SourceLocation(pos=3316, lineno=70, colno=67) value: 'south' - location: SourceLocation(pos=3245, lineno=69, colno=68) - end_location: SourceLocation(pos=3261, lineno=69, colno=84) + location: SourceLocation(pos=3317, lineno=70, colno=68) + end_location: SourceLocation(pos=3333, lineno=70, colno=84) key: - location: SourceLocation(pos=3245, lineno=69, colno=68) - end_location: SourceLocation(pos=3256, lineno=69, colno=79) + location: SourceLocation(pos=3317, lineno=70, colno=68) + end_location: SourceLocation(pos=3328, lineno=70, colno=79) value: 'waterlogged' value: - location: SourceLocation(pos=3257, lineno=69, colno=80) - end_location: SourceLocation(pos=3261, lineno=69, colno=84) + location: SourceLocation(pos=3329, lineno=70, colno=80) + end_location: SourceLocation(pos=3333, lineno=70, colno=84) value: 'true' data_tags: None - location: SourceLocation(pos=3274, lineno=71, colno=1) - end_location: SourceLocation(pos=3302, lineno=71, colno=29) + location: SourceLocation(pos=3346, lineno=72, colno=1) + end_location: SourceLocation(pos=3374, lineno=72, colno=29) identifier: 'function:name' arguments: - location: SourceLocation(pos=3283, lineno=71, colno=10) - end_location: SourceLocation(pos=3302, lineno=71, colno=29) + location: SourceLocation(pos=3355, lineno=72, colno=10) + end_location: SourceLocation(pos=3374, lineno=72, colno=29) is_tag: False namespace: 'custom' path: 'example/test' - location: SourceLocation(pos=3303, lineno=72, colno=1) - end_location: SourceLocation(pos=3332, lineno=72, colno=30) + location: SourceLocation(pos=3375, lineno=73, colno=1) + end_location: SourceLocation(pos=3404, lineno=73, colno=30) identifier: 'function:name' arguments: - location: SourceLocation(pos=3312, lineno=72, colno=10) - end_location: SourceLocation(pos=3332, lineno=72, colno=30) + location: SourceLocation(pos=3384, lineno=73, colno=10) + end_location: SourceLocation(pos=3404, lineno=73, colno=30) is_tag: True namespace: 'custom' path: 'example/test' - location: SourceLocation(pos=3344, lineno=74, colno=1) - end_location: SourceLocation(pos=3361, lineno=74, colno=18) + location: SourceLocation(pos=3416, lineno=75, colno=1) + end_location: SourceLocation(pos=3433, lineno=75, colno=18) identifier: 'gamemode:creative' arguments: - location: SourceLocation(pos=3362, lineno=75, colno=1) - end_location: SourceLocation(pos=3382, lineno=75, colno=21) + location: SourceLocation(pos=3434, lineno=76, colno=1) + end_location: SourceLocation(pos=3454, lineno=76, colno=21) identifier: 'gamemode:survival:target' arguments: - location: SourceLocation(pos=3380, lineno=75, colno=19) - end_location: SourceLocation(pos=3382, lineno=75, colno=21) + location: SourceLocation(pos=3452, lineno=76, colno=19) + end_location: SourceLocation(pos=3454, lineno=76, colno=21) variable: 'a' arguments: - location: SourceLocation(pos=3394, lineno=77, colno=1) - end_location: SourceLocation(pos=3424, lineno=77, colno=31) + location: SourceLocation(pos=3466, lineno=78, colno=1) + end_location: SourceLocation(pos=3496, lineno=78, colno=31) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=3419, lineno=77, colno=26) - end_location: SourceLocation(pos=3424, lineno=77, colno=31) + location: SourceLocation(pos=3491, lineno=78, colno=26) + end_location: SourceLocation(pos=3496, lineno=78, colno=31) value: False - location: SourceLocation(pos=3425, lineno=78, colno=1) - end_location: SourceLocation(pos=3459, lineno=78, colno=35) + location: SourceLocation(pos=3497, lineno=79, colno=1) + end_location: SourceLocation(pos=3531, lineno=79, colno=35) identifier: 'gamerule:naturalRegeneration:value' arguments: - location: SourceLocation(pos=3454, lineno=78, colno=30) - end_location: SourceLocation(pos=3459, lineno=78, colno=35) + location: SourceLocation(pos=3526, lineno=79, colno=30) + end_location: SourceLocation(pos=3531, lineno=79, colno=35) value: False - location: SourceLocation(pos=3460, lineno=79, colno=1) - end_location: SourceLocation(pos=3486, lineno=79, colno=27) + location: SourceLocation(pos=3532, lineno=80, colno=1) + end_location: SourceLocation(pos=3558, lineno=80, colno=27) identifier: 'gamerule:mobGriefing:value' arguments: - location: SourceLocation(pos=3481, lineno=79, colno=22) - end_location: SourceLocation(pos=3486, lineno=79, colno=27) + location: SourceLocation(pos=3553, lineno=80, colno=22) + end_location: SourceLocation(pos=3558, lineno=80, colno=27) value: False - location: SourceLocation(pos=3487, lineno=80, colno=1) - end_location: SourceLocation(pos=3516, lineno=80, colno=30) + location: SourceLocation(pos=3559, lineno=81, colno=1) + end_location: SourceLocation(pos=3588, lineno=81, colno=30) identifier: 'gamerule:doWeatherCycle:value' arguments: - location: SourceLocation(pos=3511, lineno=80, colno=25) - end_location: SourceLocation(pos=3516, lineno=80, colno=30) + location: SourceLocation(pos=3583, lineno=81, colno=25) + end_location: SourceLocation(pos=3588, lineno=81, colno=30) value: False - location: SourceLocation(pos=3517, lineno=81, colno=1) - end_location: SourceLocation(pos=3544, lineno=81, colno=28) + location: SourceLocation(pos=3589, lineno=82, colno=1) + end_location: SourceLocation(pos=3616, lineno=82, colno=28) identifier: 'gamerule:keepInventory:value' arguments: - location: SourceLocation(pos=3540, lineno=81, colno=24) - end_location: SourceLocation(pos=3544, lineno=81, colno=28) + location: SourceLocation(pos=3612, lineno=82, colno=24) + end_location: SourceLocation(pos=3616, lineno=82, colno=28) value: True - location: SourceLocation(pos=3545, lineno=82, colno=1) - end_location: SourceLocation(pos=3578, lineno=82, colno=34) + location: SourceLocation(pos=3617, lineno=83, colno=1) + end_location: SourceLocation(pos=3650, lineno=83, colno=34) identifier: 'gamerule:commandBlockOutput:value' arguments: - location: SourceLocation(pos=3573, lineno=82, colno=29) - end_location: SourceLocation(pos=3578, lineno=82, colno=34) + location: SourceLocation(pos=3645, lineno=83, colno=29) + end_location: SourceLocation(pos=3650, lineno=83, colno=34) value: False - location: SourceLocation(pos=3579, lineno=83, colno=1) - end_location: SourceLocation(pos=3604, lineno=83, colno=26) + location: SourceLocation(pos=3651, lineno=84, colno=1) + end_location: SourceLocation(pos=3676, lineno=84, colno=26) identifier: 'gamerule:doInsomnia:value' arguments: - location: SourceLocation(pos=3599, lineno=83, colno=21) - end_location: SourceLocation(pos=3604, lineno=83, colno=26) + location: SourceLocation(pos=3671, lineno=84, colno=21) + end_location: SourceLocation(pos=3676, lineno=84, colno=26) value: False - location: SourceLocation(pos=3612, lineno=85, colno=1) - end_location: SourceLocation(pos=3688, lineno=85, colno=77) + location: SourceLocation(pos=3684, lineno=86, colno=1) + end_location: SourceLocation(pos=3760, lineno=86, colno=77) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3617, lineno=85, colno=6) - end_location: SourceLocation(pos=3619, lineno=85, colno=8) + location: SourceLocation(pos=3689, lineno=86, colno=6) + end_location: SourceLocation(pos=3691, lineno=86, colno=8) variable: 'p' arguments: - location: SourceLocation(pos=3620, lineno=85, colno=9) - end_location: SourceLocation(pos=3686, lineno=85, colno=75) + location: SourceLocation(pos=3692, lineno=86, colno=9) + end_location: SourceLocation(pos=3758, lineno=86, colno=75) identifier: - location: SourceLocation(pos=3620, lineno=85, colno=9) - end_location: SourceLocation(pos=3643, lineno=85, colno=32) + location: SourceLocation(pos=3692, lineno=86, colno=9) + end_location: SourceLocation(pos=3715, lineno=86, colno=32) is_tag: False namespace: 'minecraft' path: 'diamond_sword' data_tags: - location: SourceLocation(pos=3643, lineno=85, colno=32) - end_location: SourceLocation(pos=3686, lineno=85, colno=75) + location: SourceLocation(pos=3715, lineno=86, colno=32) + end_location: SourceLocation(pos=3758, lineno=86, colno=75) entries: - location: SourceLocation(pos=3644, lineno=85, colno=33) - end_location: SourceLocation(pos=3685, lineno=85, colno=74) + location: SourceLocation(pos=3716, lineno=86, colno=33) + end_location: SourceLocation(pos=3757, lineno=86, colno=74) key: - location: SourceLocation(pos=3644, lineno=85, colno=33) - end_location: SourceLocation(pos=3651, lineno=85, colno=40) + location: SourceLocation(pos=3716, lineno=86, colno=33) + end_location: SourceLocation(pos=3723, lineno=86, colno=40) value: 'display' value: - location: SourceLocation(pos=3653, lineno=85, colno=42) - end_location: SourceLocation(pos=3685, lineno=85, colno=74) + location: SourceLocation(pos=3725, lineno=86, colno=42) + end_location: SourceLocation(pos=3757, lineno=86, colno=74) entries: - location: SourceLocation(pos=3654, lineno=85, colno=43) - end_location: SourceLocation(pos=3684, lineno=85, colno=73) + location: SourceLocation(pos=3726, lineno=86, colno=43) + end_location: SourceLocation(pos=3756, lineno=86, colno=73) key: - location: SourceLocation(pos=3654, lineno=85, colno=43) - end_location: SourceLocation(pos=3658, lineno=85, colno=47) + location: SourceLocation(pos=3726, lineno=86, colno=43) + end_location: SourceLocation(pos=3730, lineno=86, colno=47) value: 'Lore' value: - location: SourceLocation(pos=3660, lineno=85, colno=49) - end_location: SourceLocation(pos=3684, lineno=85, colno=73) + location: SourceLocation(pos=3732, lineno=86, colno=49) + end_location: SourceLocation(pos=3756, lineno=86, colno=73) elements: - location: SourceLocation(pos=3661, lineno=85, colno=50) - end_location: SourceLocation(pos=3683, lineno=85, colno=72) + location: SourceLocation(pos=3733, lineno=86, colno=50) + end_location: SourceLocation(pos=3755, lineno=86, colno=72) value: String('"A legendary weapon"') - location: SourceLocation(pos=3687, lineno=85, colno=76) - end_location: SourceLocation(pos=3688, lineno=85, colno=77) + location: SourceLocation(pos=3759, lineno=86, colno=76) + end_location: SourceLocation(pos=3760, lineno=86, colno=77) value: 1 - location: SourceLocation(pos=3689, lineno=86, colno=1) - end_location: SourceLocation(pos=3739, lineno=86, colno=51) + location: SourceLocation(pos=3761, lineno=87, colno=1) + end_location: SourceLocation(pos=3811, lineno=87, colno=51) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3694, lineno=86, colno=6) - end_location: SourceLocation(pos=3696, lineno=86, colno=8) + location: SourceLocation(pos=3766, lineno=87, colno=6) + end_location: SourceLocation(pos=3768, lineno=87, colno=8) variable: 'a' arguments: - location: SourceLocation(pos=3697, lineno=86, colno=9) - end_location: SourceLocation(pos=3737, lineno=86, colno=49) + location: SourceLocation(pos=3769, lineno=87, colno=9) + end_location: SourceLocation(pos=3809, lineno=87, colno=49) identifier: - location: SourceLocation(pos=3697, lineno=86, colno=9) - end_location: SourceLocation(pos=3703, lineno=86, colno=15) + location: SourceLocation(pos=3769, lineno=87, colno=9) + end_location: SourceLocation(pos=3775, lineno=87, colno=15) is_tag: False namespace: None path: 'potion' data_tags: - location: SourceLocation(pos=3703, lineno=86, colno=15) - end_location: SourceLocation(pos=3737, lineno=86, colno=49) + location: SourceLocation(pos=3775, lineno=87, colno=15) + end_location: SourceLocation(pos=3809, lineno=87, colno=49) entries: - location: SourceLocation(pos=3704, lineno=86, colno=16) - end_location: SourceLocation(pos=3736, lineno=86, colno=48) + location: SourceLocation(pos=3776, lineno=87, colno=16) + end_location: SourceLocation(pos=3808, lineno=87, colno=48) key: - location: SourceLocation(pos=3704, lineno=86, colno=16) - end_location: SourceLocation(pos=3710, lineno=86, colno=22) + location: SourceLocation(pos=3776, lineno=87, colno=16) + end_location: SourceLocation(pos=3782, lineno=87, colno=22) value: 'Potion' value: - location: SourceLocation(pos=3712, lineno=86, colno=24) - end_location: SourceLocation(pos=3736, lineno=86, colno=48) + location: SourceLocation(pos=3784, lineno=87, colno=24) + end_location: SourceLocation(pos=3808, lineno=87, colno=48) value: String('minecraft:night_vision') - location: SourceLocation(pos=3738, lineno=86, colno=50) - end_location: SourceLocation(pos=3739, lineno=86, colno=51) + location: SourceLocation(pos=3810, lineno=87, colno=50) + end_location: SourceLocation(pos=3811, lineno=87, colno=51) value: 1 - location: SourceLocation(pos=3740, lineno=87, colno=1) - end_location: SourceLocation(pos=3817, lineno=87, colno=78) + location: SourceLocation(pos=3812, lineno=88, colno=1) + end_location: SourceLocation(pos=3889, lineno=88, colno=78) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3745, lineno=87, colno=6) - end_location: SourceLocation(pos=3747, lineno=87, colno=8) + location: SourceLocation(pos=3817, lineno=88, colno=6) + end_location: SourceLocation(pos=3819, lineno=88, colno=8) variable: 'r' arguments: - location: SourceLocation(pos=3748, lineno=87, colno=9) - end_location: SourceLocation(pos=3815, lineno=87, colno=76) + location: SourceLocation(pos=3820, lineno=88, colno=9) + end_location: SourceLocation(pos=3887, lineno=88, colno=76) identifier: - location: SourceLocation(pos=3748, lineno=87, colno=9) - end_location: SourceLocation(pos=3761, lineno=87, colno=22) + location: SourceLocation(pos=3820, lineno=88, colno=9) + end_location: SourceLocation(pos=3833, lineno=88, colno=22) is_tag: False namespace: None path: 'diamond_sword' data_tags: - location: SourceLocation(pos=3761, lineno=87, colno=22) - end_location: SourceLocation(pos=3815, lineno=87, colno=76) + location: SourceLocation(pos=3833, lineno=88, colno=22) + end_location: SourceLocation(pos=3887, lineno=88, colno=76) entries: - location: SourceLocation(pos=3762, lineno=87, colno=23) - end_location: SourceLocation(pos=3814, lineno=87, colno=75) + location: SourceLocation(pos=3834, lineno=88, colno=23) + end_location: SourceLocation(pos=3886, lineno=88, colno=75) key: - location: SourceLocation(pos=3762, lineno=87, colno=23) - end_location: SourceLocation(pos=3774, lineno=87, colno=35) + location: SourceLocation(pos=3834, lineno=88, colno=23) + end_location: SourceLocation(pos=3846, lineno=88, colno=35) value: 'Enchantments' value: - location: SourceLocation(pos=3776, lineno=87, colno=37) - end_location: SourceLocation(pos=3814, lineno=87, colno=75) + location: SourceLocation(pos=3848, lineno=88, colno=37) + end_location: SourceLocation(pos=3886, lineno=88, colno=75) elements: - location: SourceLocation(pos=3777, lineno=87, colno=38) - end_location: SourceLocation(pos=3813, lineno=87, colno=74) + location: SourceLocation(pos=3849, lineno=88, colno=38) + end_location: SourceLocation(pos=3885, lineno=88, colno=74) entries: - location: SourceLocation(pos=3778, lineno=87, colno=39) - end_location: SourceLocation(pos=3803, lineno=87, colno=64) + location: SourceLocation(pos=3850, lineno=88, colno=39) + end_location: SourceLocation(pos=3875, lineno=88, colno=64) key: - location: SourceLocation(pos=3778, lineno=87, colno=39) - end_location: SourceLocation(pos=3780, lineno=87, colno=41) + location: SourceLocation(pos=3850, lineno=88, colno=39) + end_location: SourceLocation(pos=3852, lineno=88, colno=41) value: 'id' value: - location: SourceLocation(pos=3782, lineno=87, colno=43) - end_location: SourceLocation(pos=3803, lineno=87, colno=64) + location: SourceLocation(pos=3854, lineno=88, colno=43) + end_location: SourceLocation(pos=3875, lineno=88, colno=64) value: String('minecraft:sharpness') - location: SourceLocation(pos=3805, lineno=87, colno=66) - end_location: SourceLocation(pos=3812, lineno=87, colno=73) + location: SourceLocation(pos=3877, lineno=88, colno=66) + end_location: SourceLocation(pos=3884, lineno=88, colno=73) key: - location: SourceLocation(pos=3805, lineno=87, colno=66) - end_location: SourceLocation(pos=3808, lineno=87, colno=69) + location: SourceLocation(pos=3877, lineno=88, colno=66) + end_location: SourceLocation(pos=3880, lineno=88, colno=69) value: 'lvl' value: - location: SourceLocation(pos=3810, lineno=87, colno=71) - end_location: SourceLocation(pos=3812, lineno=87, colno=73) + location: SourceLocation(pos=3882, lineno=88, colno=71) + end_location: SourceLocation(pos=3884, lineno=88, colno=73) value: Int(10) - location: SourceLocation(pos=3816, lineno=87, colno=77) - end_location: SourceLocation(pos=3817, lineno=87, colno=78) + location: SourceLocation(pos=3888, lineno=88, colno=77) + end_location: SourceLocation(pos=3889, lineno=88, colno=78) value: 1 - location: SourceLocation(pos=3818, lineno=88, colno=1) - end_location: SourceLocation(pos=3881, lineno=88, colno=64) + location: SourceLocation(pos=3890, lineno=89, colno=1) + end_location: SourceLocation(pos=3953, lineno=89, colno=64) identifier: 'give:targets:item' arguments: - location: SourceLocation(pos=3823, lineno=88, colno=6) - end_location: SourceLocation(pos=3825, lineno=88, colno=8) + location: SourceLocation(pos=3895, lineno=89, colno=6) + end_location: SourceLocation(pos=3897, lineno=89, colno=8) variable: 's' arguments: - location: SourceLocation(pos=3826, lineno=88, colno=9) - end_location: SourceLocation(pos=3881, lineno=88, colno=64) + location: SourceLocation(pos=3898, lineno=89, colno=9) + end_location: SourceLocation(pos=3953, lineno=89, colno=64) identifier: - location: SourceLocation(pos=3826, lineno=88, colno=9) - end_location: SourceLocation(pos=3849, lineno=88, colno=32) + location: SourceLocation(pos=3898, lineno=89, colno=9) + end_location: SourceLocation(pos=3921, lineno=89, colno=32) is_tag: False namespace: 'minecraft' path: 'diamond_block' data_tags: - location: SourceLocation(pos=3849, lineno=88, colno=32) - end_location: SourceLocation(pos=3881, lineno=88, colno=64) + location: SourceLocation(pos=3921, lineno=89, colno=32) + end_location: SourceLocation(pos=3953, lineno=89, colno=64) entries: - location: SourceLocation(pos=3850, lineno=88, colno=33) - end_location: SourceLocation(pos=3880, lineno=88, colno=63) + location: SourceLocation(pos=3922, lineno=89, colno=33) + end_location: SourceLocation(pos=3952, lineno=89, colno=63) key: - location: SourceLocation(pos=3850, lineno=88, colno=33) - end_location: SourceLocation(pos=3860, lineno=88, colno=43) + location: SourceLocation(pos=3922, lineno=89, colno=33) + end_location: SourceLocation(pos=3932, lineno=89, colno=43) value: 'CanPlaceOn' value: - location: SourceLocation(pos=3862, lineno=88, colno=45) - end_location: SourceLocation(pos=3880, lineno=88, colno=63) + location: SourceLocation(pos=3934, lineno=89, colno=45) + end_location: SourceLocation(pos=3952, lineno=89, colno=63) elements: - location: SourceLocation(pos=3863, lineno=88, colno=46) - end_location: SourceLocation(pos=3879, lineno=88, colno=62) + location: SourceLocation(pos=3935, lineno=89, colno=46) + end_location: SourceLocation(pos=3951, lineno=89, colno=62) value: String('minecraft:dirt') - location: SourceLocation(pos=3882, lineno=89, colno=1) - end_location: SourceLocation(pos=3999, lineno=89, colno=118) + location: SourceLocation(pos=3954, lineno=90, colno=1) + end_location: SourceLocation(pos=4071, lineno=90, colno=118) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3887, lineno=89, colno=6) - end_location: SourceLocation(pos=3889, lineno=89, colno=8) + location: SourceLocation(pos=3959, lineno=90, colno=6) + end_location: SourceLocation(pos=3961, lineno=90, colno=8) variable: 'a' arguments: - location: SourceLocation(pos=3890, lineno=89, colno=9) - end_location: SourceLocation(pos=3997, lineno=89, colno=116) + location: SourceLocation(pos=3962, lineno=90, colno=9) + end_location: SourceLocation(pos=4069, lineno=90, colno=116) identifier: - location: SourceLocation(pos=3890, lineno=89, colno=9) - end_location: SourceLocation(pos=3896, lineno=89, colno=15) + location: SourceLocation(pos=3962, lineno=90, colno=9) + end_location: SourceLocation(pos=3968, lineno=90, colno=15) is_tag: False namespace: None path: 'potion' data_tags: - location: SourceLocation(pos=3896, lineno=89, colno=15) - end_location: SourceLocation(pos=3997, lineno=89, colno=116) + location: SourceLocation(pos=3968, lineno=90, colno=15) + end_location: SourceLocation(pos=4069, lineno=90, colno=116) entries: - location: SourceLocation(pos=3897, lineno=89, colno=16) - end_location: SourceLocation(pos=3949, lineno=89, colno=68) + location: SourceLocation(pos=3969, lineno=90, colno=16) + end_location: SourceLocation(pos=4021, lineno=90, colno=68) key: - location: SourceLocation(pos=3897, lineno=89, colno=16) - end_location: SourceLocation(pos=3909, lineno=89, colno=28) + location: SourceLocation(pos=3969, lineno=90, colno=16) + end_location: SourceLocation(pos=3981, lineno=90, colno=28) value: 'Enchantments' value: - location: SourceLocation(pos=3911, lineno=89, colno=30) - end_location: SourceLocation(pos=3949, lineno=89, colno=68) + location: SourceLocation(pos=3983, lineno=90, colno=30) + end_location: SourceLocation(pos=4021, lineno=90, colno=68) elements: - location: SourceLocation(pos=3912, lineno=89, colno=31) - end_location: SourceLocation(pos=3948, lineno=89, colno=67) + location: SourceLocation(pos=3984, lineno=90, colno=31) + end_location: SourceLocation(pos=4020, lineno=90, colno=67) entries: - location: SourceLocation(pos=3913, lineno=89, colno=32) - end_location: SourceLocation(pos=3938, lineno=89, colno=57) + location: SourceLocation(pos=3985, lineno=90, colno=32) + end_location: SourceLocation(pos=4010, lineno=90, colno=57) key: - location: SourceLocation(pos=3913, lineno=89, colno=32) - end_location: SourceLocation(pos=3915, lineno=89, colno=34) + location: SourceLocation(pos=3985, lineno=90, colno=32) + end_location: SourceLocation(pos=3987, lineno=90, colno=34) value: 'id' value: - location: SourceLocation(pos=3917, lineno=89, colno=36) - end_location: SourceLocation(pos=3938, lineno=89, colno=57) + location: SourceLocation(pos=3989, lineno=90, colno=36) + end_location: SourceLocation(pos=4010, lineno=90, colno=57) value: String('minecraft:knockback') - location: SourceLocation(pos=3940, lineno=89, colno=59) - end_location: SourceLocation(pos=3947, lineno=89, colno=66) + location: SourceLocation(pos=4012, lineno=90, colno=59) + end_location: SourceLocation(pos=4019, lineno=90, colno=66) key: - location: SourceLocation(pos=3940, lineno=89, colno=59) - end_location: SourceLocation(pos=3943, lineno=89, colno=62) + location: SourceLocation(pos=4012, lineno=90, colno=59) + end_location: SourceLocation(pos=4015, lineno=90, colno=62) value: 'lvl' value: - location: SourceLocation(pos=3945, lineno=89, colno=64) - end_location: SourceLocation(pos=3947, lineno=89, colno=66) + location: SourceLocation(pos=4017, lineno=90, colno=64) + end_location: SourceLocation(pos=4019, lineno=90, colno=66) value: Int(10) - location: SourceLocation(pos=3951, lineno=89, colno=70) - end_location: SourceLocation(pos=3996, lineno=89, colno=115) + location: SourceLocation(pos=4023, lineno=90, colno=70) + end_location: SourceLocation(pos=4068, lineno=90, colno=115) key: - location: SourceLocation(pos=3951, lineno=89, colno=70) - end_location: SourceLocation(pos=3970, lineno=89, colno=89) + location: SourceLocation(pos=4023, lineno=90, colno=70) + end_location: SourceLocation(pos=4042, lineno=90, colno=89) value: 'CustomPotionEffects' value: - location: SourceLocation(pos=3972, lineno=89, colno=91) - end_location: SourceLocation(pos=3996, lineno=89, colno=115) + location: SourceLocation(pos=4044, lineno=90, colno=91) + end_location: SourceLocation(pos=4068, lineno=90, colno=115) elements: - location: SourceLocation(pos=3973, lineno=89, colno=92) - end_location: SourceLocation(pos=3995, lineno=89, colno=114) + location: SourceLocation(pos=4045, lineno=90, colno=92) + end_location: SourceLocation(pos=4067, lineno=90, colno=114) entries: - location: SourceLocation(pos=3974, lineno=89, colno=93) - end_location: SourceLocation(pos=3980, lineno=89, colno=99) + location: SourceLocation(pos=4046, lineno=90, colno=93) + end_location: SourceLocation(pos=4052, lineno=90, colno=99) key: - location: SourceLocation(pos=3974, lineno=89, colno=93) - end_location: SourceLocation(pos=3976, lineno=89, colno=95) + location: SourceLocation(pos=4046, lineno=90, colno=93) + end_location: SourceLocation(pos=4048, lineno=90, colno=95) value: 'Id' value: - location: SourceLocation(pos=3978, lineno=89, colno=97) - end_location: SourceLocation(pos=3980, lineno=89, colno=99) + location: SourceLocation(pos=4050, lineno=90, colno=97) + end_location: SourceLocation(pos=4052, lineno=90, colno=99) value: Int(20) - location: SourceLocation(pos=3982, lineno=89, colno=101) - end_location: SourceLocation(pos=3994, lineno=89, colno=113) + location: SourceLocation(pos=4054, lineno=90, colno=101) + end_location: SourceLocation(pos=4066, lineno=90, colno=113) key: - location: SourceLocation(pos=3982, lineno=89, colno=101) - end_location: SourceLocation(pos=3991, lineno=89, colno=110) + location: SourceLocation(pos=4054, lineno=90, colno=101) + end_location: SourceLocation(pos=4063, lineno=90, colno=110) value: 'Amplifier' value: - location: SourceLocation(pos=3993, lineno=89, colno=112) - end_location: SourceLocation(pos=3994, lineno=89, colno=113) + location: SourceLocation(pos=4065, lineno=90, colno=112) + end_location: SourceLocation(pos=4066, lineno=90, colno=113) value: Int(1) - location: SourceLocation(pos=3998, lineno=89, colno=117) - end_location: SourceLocation(pos=3999, lineno=89, colno=118) + location: SourceLocation(pos=4070, lineno=90, colno=117) + end_location: SourceLocation(pos=4071, lineno=90, colno=118) value: 1 - location: SourceLocation(pos=4007, lineno=91, colno=1) - end_location: SourceLocation(pos=4077, lineno=91, colno=71) + location: SourceLocation(pos=4079, lineno=92, colno=1) + end_location: SourceLocation(pos=4149, lineno=92, colno=71) identifier: 'item:replace:block:pos:slot:with:item:count' arguments: - location: SourceLocation(pos=4026, lineno=91, colno=20) - end_location: SourceLocation(pos=4032, lineno=91, colno=26) + location: SourceLocation(pos=4098, lineno=92, colno=20) + end_location: SourceLocation(pos=4104, lineno=92, colno=26) x: - location: SourceLocation(pos=4026, lineno=91, colno=20) - end_location: SourceLocation(pos=4027, lineno=91, colno=21) + location: SourceLocation(pos=4098, lineno=92, colno=20) + end_location: SourceLocation(pos=4099, lineno=92, colno=21) type: 'relative' value: 0 y: - location: SourceLocation(pos=4028, lineno=91, colno=22) - end_location: SourceLocation(pos=4030, lineno=91, colno=24) + location: SourceLocation(pos=4100, lineno=92, colno=22) + end_location: SourceLocation(pos=4102, lineno=92, colno=24) type: 'relative' value: 2 z: - location: SourceLocation(pos=4031, lineno=91, colno=25) - end_location: SourceLocation(pos=4032, lineno=91, colno=26) + location: SourceLocation(pos=4103, lineno=92, colno=25) + end_location: SourceLocation(pos=4104, lineno=92, colno=26) type: 'relative' value: 0 - location: SourceLocation(pos=4033, lineno=91, colno=27) - end_location: SourceLocation(pos=4045, lineno=91, colno=39) + location: SourceLocation(pos=4105, lineno=92, colno=27) + end_location: SourceLocation(pos=4117, lineno=92, colno=39) value: 'container.26' - location: SourceLocation(pos=4051, lineno=91, colno=45) - end_location: SourceLocation(pos=4075, lineno=91, colno=69) + location: SourceLocation(pos=4123, lineno=92, colno=45) + end_location: SourceLocation(pos=4147, lineno=92, colno=69) identifier: - location: SourceLocation(pos=4051, lineno=91, colno=45) - end_location: SourceLocation(pos=4075, lineno=91, colno=69) + location: SourceLocation(pos=4123, lineno=92, colno=45) + end_location: SourceLocation(pos=4147, lineno=92, colno=69) is_tag: False namespace: 'minecraft' path: 'spruce_sapling' data_tags: None - location: SourceLocation(pos=4076, lineno=91, colno=70) - end_location: SourceLocation(pos=4077, lineno=91, colno=71) + location: SourceLocation(pos=4148, lineno=92, colno=70) + end_location: SourceLocation(pos=4149, lineno=92, colno=71) value: 4 - location: SourceLocation(pos=4078, lineno=92, colno=1) - end_location: SourceLocation(pos=4141, lineno=92, colno=64) + location: SourceLocation(pos=4150, lineno=93, colno=1) + end_location: SourceLocation(pos=4213, lineno=93, colno=64) identifier: 'item:replace:entity:targets:slot:with:item:count' arguments: - location: SourceLocation(pos=4098, lineno=92, colno=21) - end_location: SourceLocation(pos=4100, lineno=92, colno=23) + location: SourceLocation(pos=4170, lineno=93, colno=21) + end_location: SourceLocation(pos=4172, lineno=93, colno=23) variable: 'p' arguments: - location: SourceLocation(pos=4101, lineno=92, colno=24) - end_location: SourceLocation(pos=4109, lineno=92, colno=32) + location: SourceLocation(pos=4173, lineno=93, colno=24) + end_location: SourceLocation(pos=4181, lineno=93, colno=32) value: 'hotbar.8' - location: SourceLocation(pos=4115, lineno=92, colno=38) - end_location: SourceLocation(pos=4139, lineno=92, colno=62) + location: SourceLocation(pos=4187, lineno=93, colno=38) + end_location: SourceLocation(pos=4211, lineno=93, colno=62) identifier: - location: SourceLocation(pos=4115, lineno=92, colno=38) - end_location: SourceLocation(pos=4139, lineno=92, colno=62) + location: SourceLocation(pos=4187, lineno=93, colno=38) + end_location: SourceLocation(pos=4211, lineno=93, colno=62) is_tag: False namespace: 'minecraft' path: 'spruce_sapling' data_tags: None - location: SourceLocation(pos=4140, lineno=92, colno=63) - end_location: SourceLocation(pos=4141, lineno=92, colno=64) + location: SourceLocation(pos=4212, lineno=93, colno=63) + end_location: SourceLocation(pos=4213, lineno=93, colno=64) value: 4 - location: SourceLocation(pos=4142, lineno=93, colno=1) - end_location: SourceLocation(pos=4210, lineno=93, colno=69) + location: SourceLocation(pos=4214, lineno=94, colno=1) + end_location: SourceLocation(pos=4282, lineno=94, colno=69) identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' arguments: - location: SourceLocation(pos=4162, lineno=93, colno=21) - end_location: SourceLocation(pos=4164, lineno=93, colno=23) + location: SourceLocation(pos=4234, lineno=94, colno=21) + end_location: SourceLocation(pos=4236, lineno=94, colno=23) variable: 's' arguments: - location: SourceLocation(pos=4165, lineno=93, colno=24) - end_location: SourceLocation(pos=4179, lineno=93, colno=38) + location: SourceLocation(pos=4237, lineno=94, colno=24) + end_location: SourceLocation(pos=4251, lineno=94, colno=38) value: 'weapon.offhand' - location: SourceLocation(pos=4192, lineno=93, colno=51) - end_location: SourceLocation(pos=4194, lineno=93, colno=53) + location: SourceLocation(pos=4264, lineno=94, colno=51) + end_location: SourceLocation(pos=4266, lineno=94, colno=53) variable: 's' arguments: - location: SourceLocation(pos=4195, lineno=93, colno=54) - end_location: SourceLocation(pos=4210, lineno=93, colno=69) + location: SourceLocation(pos=4267, lineno=94, colno=54) + end_location: SourceLocation(pos=4282, lineno=94, colno=69) value: 'weapon.mainhand' - location: SourceLocation(pos=4218, lineno=95, colno=1) - end_location: SourceLocation(pos=4225, lineno=95, colno=8) + location: SourceLocation(pos=4290, lineno=96, colno=1) + end_location: SourceLocation(pos=4297, lineno=96, colno=8) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4223, lineno=95, colno=6) - end_location: SourceLocation(pos=4225, lineno=95, colno=8) + location: SourceLocation(pos=4295, lineno=96, colno=6) + end_location: SourceLocation(pos=4297, lineno=96, colno=8) variable: 's' arguments: - location: SourceLocation(pos=4226, lineno=96, colno=1) - end_location: SourceLocation(pos=4236, lineno=96, colno=11) + location: SourceLocation(pos=4298, lineno=97, colno=1) + end_location: SourceLocation(pos=4308, lineno=97, colno=11) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4231, lineno=96, colno=6) - end_location: SourceLocation(pos=4236, lineno=96, colno=11) + location: SourceLocation(pos=4303, lineno=97, colno=6) + end_location: SourceLocation(pos=4308, lineno=97, colno=11) value: 'Steve' - location: SourceLocation(pos=4237, lineno=97, colno=1) - end_location: SourceLocation(pos=4255, lineno=97, colno=19) + location: SourceLocation(pos=4309, lineno=98, colno=1) + end_location: SourceLocation(pos=4327, lineno=98, colno=19) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4242, lineno=97, colno=6) - end_location: SourceLocation(pos=4255, lineno=97, colno=19) + location: SourceLocation(pos=4314, lineno=98, colno=6) + end_location: SourceLocation(pos=4327, lineno=98, colno=19) variable: 'e' arguments: - location: SourceLocation(pos=4245, lineno=97, colno=9) - end_location: SourceLocation(pos=4254, lineno=97, colno=18) + location: SourceLocation(pos=4317, lineno=98, colno=9) + end_location: SourceLocation(pos=4326, lineno=98, colno=18) inverted: False key: - location: SourceLocation(pos=4245, lineno=97, colno=9) - end_location: SourceLocation(pos=4249, lineno=97, colno=13) + location: SourceLocation(pos=4317, lineno=98, colno=9) + end_location: SourceLocation(pos=4321, lineno=98, colno=13) value: 'type' value: - location: SourceLocation(pos=4250, lineno=97, colno=14) - end_location: SourceLocation(pos=4254, lineno=97, colno=18) + location: SourceLocation(pos=4322, lineno=98, colno=14) + end_location: SourceLocation(pos=4326, lineno=98, colno=18) is_tag: False namespace: None path: 'item' - location: SourceLocation(pos=4256, lineno=98, colno=1) - end_location: SourceLocation(pos=4278, lineno=98, colno=23) + location: SourceLocation(pos=4328, lineno=99, colno=1) + end_location: SourceLocation(pos=4350, lineno=99, colno=23) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4261, lineno=98, colno=6) - end_location: SourceLocation(pos=4278, lineno=98, colno=23) + location: SourceLocation(pos=4333, lineno=99, colno=6) + end_location: SourceLocation(pos=4350, lineno=99, colno=23) variable: 'e' arguments: - location: SourceLocation(pos=4264, lineno=98, colno=9) - end_location: SourceLocation(pos=4277, lineno=98, colno=22) + location: SourceLocation(pos=4336, lineno=99, colno=9) + end_location: SourceLocation(pos=4349, lineno=99, colno=22) inverted: False key: - location: SourceLocation(pos=4264, lineno=98, colno=9) - end_location: SourceLocation(pos=4272, lineno=98, colno=17) + location: SourceLocation(pos=4336, lineno=99, colno=9) + end_location: SourceLocation(pos=4344, lineno=99, colno=17) value: 'distance' value: - location: SourceLocation(pos=4273, lineno=98, colno=18) - end_location: SourceLocation(pos=4277, lineno=98, colno=22) + location: SourceLocation(pos=4345, lineno=99, colno=18) + end_location: SourceLocation(pos=4349, lineno=99, colno=22) min: None max: 10 - location: SourceLocation(pos=4279, lineno=99, colno=1) - end_location: SourceLocation(pos=4300, lineno=99, colno=22) + location: SourceLocation(pos=4351, lineno=100, colno=1) + end_location: SourceLocation(pos=4372, lineno=100, colno=22) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4284, lineno=99, colno=6) - end_location: SourceLocation(pos=4300, lineno=99, colno=22) + location: SourceLocation(pos=4356, lineno=100, colno=6) + end_location: SourceLocation(pos=4372, lineno=100, colno=22) variable: 'e' arguments: - location: SourceLocation(pos=4287, lineno=99, colno=9) - end_location: SourceLocation(pos=4299, lineno=99, colno=21) + location: SourceLocation(pos=4359, lineno=100, colno=9) + end_location: SourceLocation(pos=4371, lineno=100, colno=21) inverted: True key: - location: SourceLocation(pos=4287, lineno=99, colno=9) - end_location: SourceLocation(pos=4291, lineno=99, colno=13) + location: SourceLocation(pos=4359, lineno=100, colno=9) + end_location: SourceLocation(pos=4363, lineno=100, colno=13) value: 'type' value: - location: SourceLocation(pos=4293, lineno=99, colno=15) - end_location: SourceLocation(pos=4299, lineno=99, colno=21) + location: SourceLocation(pos=4365, lineno=100, colno=15) + end_location: SourceLocation(pos=4371, lineno=100, colno=21) is_tag: False namespace: None path: 'player' - location: SourceLocation(pos=4301, lineno=100, colno=1) - end_location: SourceLocation(pos=4336, lineno=100, colno=36) + location: SourceLocation(pos=4373, lineno=101, colno=1) + end_location: SourceLocation(pos=4408, lineno=101, colno=36) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4306, lineno=100, colno=6) - end_location: SourceLocation(pos=4336, lineno=100, colno=36) + location: SourceLocation(pos=4378, lineno=101, colno=6) + end_location: SourceLocation(pos=4408, lineno=101, colno=36) variable: 'e' arguments: - location: SourceLocation(pos=4309, lineno=100, colno=9) - end_location: SourceLocation(pos=4322, lineno=100, colno=22) + location: SourceLocation(pos=4381, lineno=101, colno=9) + end_location: SourceLocation(pos=4394, lineno=101, colno=22) inverted: False key: - location: SourceLocation(pos=4309, lineno=100, colno=9) - end_location: SourceLocation(pos=4317, lineno=100, colno=17) + location: SourceLocation(pos=4381, lineno=101, colno=9) + end_location: SourceLocation(pos=4389, lineno=101, colno=17) value: 'distance' value: - location: SourceLocation(pos=4318, lineno=100, colno=18) - end_location: SourceLocation(pos=4322, lineno=100, colno=22) + location: SourceLocation(pos=4390, lineno=101, colno=18) + end_location: SourceLocation(pos=4394, lineno=101, colno=22) min: None max: 10 - location: SourceLocation(pos=4323, lineno=100, colno=23) - end_location: SourceLocation(pos=4335, lineno=100, colno=35) + location: SourceLocation(pos=4395, lineno=101, colno=23) + end_location: SourceLocation(pos=4407, lineno=101, colno=35) inverted: False key: - location: SourceLocation(pos=4323, lineno=100, colno=23) - end_location: SourceLocation(pos=4327, lineno=100, colno=27) + location: SourceLocation(pos=4395, lineno=101, colno=23) + end_location: SourceLocation(pos=4399, lineno=101, colno=27) value: 'type' value: - location: SourceLocation(pos=4328, lineno=100, colno=28) - end_location: SourceLocation(pos=4335, lineno=100, colno=35) + location: SourceLocation(pos=4400, lineno=101, colno=28) + end_location: SourceLocation(pos=4407, lineno=101, colno=35) is_tag: False namespace: None path: 'creeper' - location: SourceLocation(pos=4337, lineno=101, colno=1) - end_location: SourceLocation(pos=4403, lineno=101, colno=67) + location: SourceLocation(pos=4409, lineno=102, colno=1) + end_location: SourceLocation(pos=4475, lineno=102, colno=67) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4342, lineno=101, colno=6) - end_location: SourceLocation(pos=4403, lineno=101, colno=67) + location: SourceLocation(pos=4414, lineno=102, colno=6) + end_location: SourceLocation(pos=4475, lineno=102, colno=67) variable: 'e' arguments: - location: SourceLocation(pos=4345, lineno=101, colno=9) - end_location: SourceLocation(pos=4355, lineno=101, colno=19) + location: SourceLocation(pos=4417, lineno=102, colno=9) + end_location: SourceLocation(pos=4427, lineno=102, colno=19) inverted: False key: - location: SourceLocation(pos=4345, lineno=101, colno=9) - end_location: SourceLocation(pos=4349, lineno=101, colno=13) + location: SourceLocation(pos=4417, lineno=102, colno=9) + end_location: SourceLocation(pos=4421, lineno=102, colno=13) value: 'type' value: - location: SourceLocation(pos=4350, lineno=101, colno=14) - end_location: SourceLocation(pos=4355, lineno=101, colno=19) + location: SourceLocation(pos=4422, lineno=102, colno=14) + end_location: SourceLocation(pos=4427, lineno=102, colno=19) is_tag: False namespace: None path: 'arrow' - location: SourceLocation(pos=4356, lineno=101, colno=20) - end_location: SourceLocation(pos=4402, lineno=101, colno=66) + location: SourceLocation(pos=4428, lineno=102, colno=20) + end_location: SourceLocation(pos=4474, lineno=102, colno=66) inverted: False key: - location: SourceLocation(pos=4356, lineno=101, colno=20) - end_location: SourceLocation(pos=4359, lineno=101, colno=23) + location: SourceLocation(pos=4428, lineno=102, colno=20) + end_location: SourceLocation(pos=4431, lineno=102, colno=23) value: 'nbt' value: - location: SourceLocation(pos=4360, lineno=101, colno=24) - end_location: SourceLocation(pos=4402, lineno=101, colno=66) + location: SourceLocation(pos=4432, lineno=102, colno=24) + end_location: SourceLocation(pos=4474, lineno=102, colno=66) entries: - location: SourceLocation(pos=4361, lineno=101, colno=25) - end_location: SourceLocation(pos=4401, lineno=101, colno=65) + location: SourceLocation(pos=4433, lineno=102, colno=25) + end_location: SourceLocation(pos=4473, lineno=102, colno=65) key: - location: SourceLocation(pos=4361, lineno=101, colno=25) - end_location: SourceLocation(pos=4373, lineno=101, colno=37) + location: SourceLocation(pos=4433, lineno=102, colno=25) + end_location: SourceLocation(pos=4445, lineno=102, colno=37) value: 'inBlockState' value: - location: SourceLocation(pos=4375, lineno=101, colno=39) - end_location: SourceLocation(pos=4401, lineno=101, colno=65) + location: SourceLocation(pos=4447, lineno=102, colno=39) + end_location: SourceLocation(pos=4473, lineno=102, colno=65) entries: - location: SourceLocation(pos=4376, lineno=101, colno=40) - end_location: SourceLocation(pos=4400, lineno=101, colno=64) + location: SourceLocation(pos=4448, lineno=102, colno=40) + end_location: SourceLocation(pos=4472, lineno=102, colno=64) key: - location: SourceLocation(pos=4376, lineno=101, colno=40) - end_location: SourceLocation(pos=4380, lineno=101, colno=44) + location: SourceLocation(pos=4448, lineno=102, colno=40) + end_location: SourceLocation(pos=4452, lineno=102, colno=44) value: 'Name' value: - location: SourceLocation(pos=4382, lineno=101, colno=46) - end_location: SourceLocation(pos=4400, lineno=101, colno=64) + location: SourceLocation(pos=4454, lineno=102, colno=46) + end_location: SourceLocation(pos=4472, lineno=102, colno=64) value: String('minecraft:target') - location: SourceLocation(pos=4413, lineno=103, colno=1) - end_location: SourceLocation(pos=4427, lineno=103, colno=15) + location: SourceLocation(pos=4485, lineno=104, colno=1) + end_location: SourceLocation(pos=4499, lineno=104, colno=15) identifier: 'locate:mansion' arguments: - location: SourceLocation(pos=4434, lineno=105, colno=1) - end_location: SourceLocation(pos=4443, lineno=105, colno=10) + location: SourceLocation(pos=4506, lineno=106, colno=1) + end_location: SourceLocation(pos=4515, lineno=106, colno=10) identifier: 'msg:targets:message' arguments: - location: SourceLocation(pos=4438, lineno=105, colno=5) - end_location: SourceLocation(pos=4440, lineno=105, colno=7) + location: SourceLocation(pos=4510, lineno=106, colno=5) + end_location: SourceLocation(pos=4512, lineno=106, colno=7) variable: 'a' arguments: - location: SourceLocation(pos=4441, lineno=105, colno=8) - end_location: SourceLocation(pos=4443, lineno=105, colno=10) + location: SourceLocation(pos=4513, lineno=106, colno=8) + end_location: SourceLocation(pos=4515, lineno=106, colno=10) fragments: - location: SourceLocation(pos=4441, lineno=105, colno=8) - end_location: SourceLocation(pos=4443, lineno=105, colno=10) + location: SourceLocation(pos=4513, lineno=106, colno=8) + end_location: SourceLocation(pos=4515, lineno=106, colno=10) value: 'Hi' - location: SourceLocation(pos=4455, lineno=107, colno=1) - end_location: SourceLocation(pos=4484, lineno=107, colno=30) + location: SourceLocation(pos=4527, lineno=108, colno=1) + end_location: SourceLocation(pos=4556, lineno=108, colno=30) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4464, lineno=107, colno=10) - end_location: SourceLocation(pos=4484, lineno=107, colno=30) + location: SourceLocation(pos=4536, lineno=108, colno=10) + end_location: SourceLocation(pos=4556, lineno=108, colno=30) name: - location: SourceLocation(pos=4464, lineno=107, colno=10) - end_location: SourceLocation(pos=4468, lineno=107, colno=14) + location: SourceLocation(pos=4536, lineno=108, colno=10) + end_location: SourceLocation(pos=4540, lineno=108, colno=14) is_tag: False namespace: None path: 'dust' parameters: - location: SourceLocation(pos=4469, lineno=107, colno=15) - end_location: SourceLocation(pos=4484, lineno=107, colno=30) + location: SourceLocation(pos=4541, lineno=108, colno=15) + end_location: SourceLocation(pos=4556, lineno=108, colno=30) red: - location: SourceLocation(pos=4469, lineno=107, colno=15) - end_location: SourceLocation(pos=4472, lineno=107, colno=18) + location: SourceLocation(pos=4541, lineno=108, colno=15) + end_location: SourceLocation(pos=4544, lineno=108, colno=18) value: 1.0 green: - location: SourceLocation(pos=4473, lineno=107, colno=19) - end_location: SourceLocation(pos=4476, lineno=107, colno=22) + location: SourceLocation(pos=4545, lineno=108, colno=19) + end_location: SourceLocation(pos=4548, lineno=108, colno=22) value: 0.5 blue: - location: SourceLocation(pos=4477, lineno=107, colno=23) - end_location: SourceLocation(pos=4480, lineno=107, colno=26) + location: SourceLocation(pos=4549, lineno=108, colno=23) + end_location: SourceLocation(pos=4552, lineno=108, colno=26) value: 0.5 size: - location: SourceLocation(pos=4481, lineno=107, colno=27) - end_location: SourceLocation(pos=4484, lineno=107, colno=30) + location: SourceLocation(pos=4553, lineno=108, colno=27) + end_location: SourceLocation(pos=4556, lineno=108, colno=30) value: 1.0 - location: SourceLocation(pos=4485, lineno=108, colno=1) - end_location: SourceLocation(pos=4543, lineno=108, colno=59) + location: SourceLocation(pos=4557, lineno=109, colno=1) + end_location: SourceLocation(pos=4615, lineno=109, colno=59) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4494, lineno=108, colno=10) - end_location: SourceLocation(pos=4543, lineno=108, colno=59) + location: SourceLocation(pos=4566, lineno=109, colno=10) + end_location: SourceLocation(pos=4615, lineno=109, colno=59) name: - location: SourceLocation(pos=4494, lineno=108, colno=10) - end_location: SourceLocation(pos=4515, lineno=108, colno=31) + location: SourceLocation(pos=4566, lineno=109, colno=10) + end_location: SourceLocation(pos=4587, lineno=109, colno=31) is_tag: False namespace: None path: 'dust_color_transition' parameters: - location: SourceLocation(pos=4516, lineno=108, colno=32) - end_location: SourceLocation(pos=4543, lineno=108, colno=59) + location: SourceLocation(pos=4588, lineno=109, colno=32) + end_location: SourceLocation(pos=4615, lineno=109, colno=59) red: - location: SourceLocation(pos=4516, lineno=108, colno=32) - end_location: SourceLocation(pos=4519, lineno=108, colno=35) + location: SourceLocation(pos=4588, lineno=109, colno=32) + end_location: SourceLocation(pos=4591, lineno=109, colno=35) value: 1.0 green: - location: SourceLocation(pos=4520, lineno=108, colno=36) - end_location: SourceLocation(pos=4523, lineno=108, colno=39) + location: SourceLocation(pos=4592, lineno=109, colno=36) + end_location: SourceLocation(pos=4595, lineno=109, colno=39) value: 0.0 blue: - location: SourceLocation(pos=4524, lineno=108, colno=40) - end_location: SourceLocation(pos=4527, lineno=108, colno=43) + location: SourceLocation(pos=4596, lineno=109, colno=40) + end_location: SourceLocation(pos=4599, lineno=109, colno=43) value: 0.0 size: - location: SourceLocation(pos=4528, lineno=108, colno=44) - end_location: SourceLocation(pos=4531, lineno=108, colno=47) + location: SourceLocation(pos=4600, lineno=109, colno=44) + end_location: SourceLocation(pos=4603, lineno=109, colno=47) value: 1.0 end_red: - location: SourceLocation(pos=4532, lineno=108, colno=48) - end_location: SourceLocation(pos=4535, lineno=108, colno=51) + location: SourceLocation(pos=4604, lineno=109, colno=48) + end_location: SourceLocation(pos=4607, lineno=109, colno=51) value: 0.0 end_green: - location: SourceLocation(pos=4536, lineno=108, colno=52) - end_location: SourceLocation(pos=4539, lineno=108, colno=55) + location: SourceLocation(pos=4608, lineno=109, colno=52) + end_location: SourceLocation(pos=4611, lineno=109, colno=55) value: 0.0 end_blue: - location: SourceLocation(pos=4540, lineno=108, colno=56) - end_location: SourceLocation(pos=4543, lineno=108, colno=59) + location: SourceLocation(pos=4612, lineno=109, colno=56) + end_location: SourceLocation(pos=4615, lineno=109, colno=59) value: 1.0 - location: SourceLocation(pos=4544, lineno=109, colno=1) - end_location: SourceLocation(pos=4592, lineno=109, colno=49) + location: SourceLocation(pos=4616, lineno=110, colno=1) + end_location: SourceLocation(pos=4664, lineno=110, colno=49) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4553, lineno=109, colno=10) - end_location: SourceLocation(pos=4592, lineno=109, colno=49) + location: SourceLocation(pos=4625, lineno=110, colno=10) + end_location: SourceLocation(pos=4664, lineno=110, colno=49) name: - location: SourceLocation(pos=4553, lineno=109, colno=10) - end_location: SourceLocation(pos=4558, lineno=109, colno=15) + location: SourceLocation(pos=4625, lineno=110, colno=10) + end_location: SourceLocation(pos=4630, lineno=110, colno=15) is_tag: False namespace: None path: 'block' parameters: - location: SourceLocation(pos=4559, lineno=109, colno=16) - end_location: SourceLocation(pos=4592, lineno=109, colno=49) + location: SourceLocation(pos=4631, lineno=110, colno=16) + end_location: SourceLocation(pos=4664, lineno=110, colno=49) block: - location: SourceLocation(pos=4559, lineno=109, colno=16) - end_location: SourceLocation(pos=4592, lineno=109, colno=49) + location: SourceLocation(pos=4631, lineno=110, colno=16) + end_location: SourceLocation(pos=4664, lineno=110, colno=49) identifier: - location: SourceLocation(pos=4559, lineno=109, colno=16) - end_location: SourceLocation(pos=4580, lineno=109, colno=37) + location: SourceLocation(pos=4631, lineno=110, colno=16) + end_location: SourceLocation(pos=4652, lineno=110, colno=37) is_tag: False namespace: 'minecraft' path: 'grass_block' block_states: - location: SourceLocation(pos=4581, lineno=109, colno=38) - end_location: SourceLocation(pos=4591, lineno=109, colno=48) + location: SourceLocation(pos=4653, lineno=110, colno=38) + end_location: SourceLocation(pos=4663, lineno=110, colno=48) key: - location: SourceLocation(pos=4581, lineno=109, colno=38) - end_location: SourceLocation(pos=4586, lineno=109, colno=43) + location: SourceLocation(pos=4653, lineno=110, colno=38) + end_location: SourceLocation(pos=4658, lineno=110, colno=43) value: 'snowy' value: - location: SourceLocation(pos=4587, lineno=109, colno=44) - end_location: SourceLocation(pos=4591, lineno=109, colno=48) + location: SourceLocation(pos=4659, lineno=110, colno=44) + end_location: SourceLocation(pos=4663, lineno=110, colno=48) value: 'true' data_tags: None - location: SourceLocation(pos=4593, lineno=110, colno=1) - end_location: SourceLocation(pos=4648, lineno=110, colno=56) + location: SourceLocation(pos=4665, lineno=111, colno=1) + end_location: SourceLocation(pos=4720, lineno=111, colno=56) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4602, lineno=110, colno=10) - end_location: SourceLocation(pos=4648, lineno=110, colno=56) + location: SourceLocation(pos=4674, lineno=111, colno=10) + end_location: SourceLocation(pos=4720, lineno=111, colno=56) name: - location: SourceLocation(pos=4602, lineno=110, colno=10) - end_location: SourceLocation(pos=4614, lineno=110, colno=22) + location: SourceLocation(pos=4674, lineno=111, colno=10) + end_location: SourceLocation(pos=4686, lineno=111, colno=22) is_tag: False namespace: None path: 'falling_dust' parameters: - location: SourceLocation(pos=4615, lineno=110, colno=23) - end_location: SourceLocation(pos=4648, lineno=110, colno=56) + location: SourceLocation(pos=4687, lineno=111, colno=23) + end_location: SourceLocation(pos=4720, lineno=111, colno=56) block: - location: SourceLocation(pos=4615, lineno=110, colno=23) - end_location: SourceLocation(pos=4648, lineno=110, colno=56) + location: SourceLocation(pos=4687, lineno=111, colno=23) + end_location: SourceLocation(pos=4720, lineno=111, colno=56) identifier: - location: SourceLocation(pos=4615, lineno=110, colno=23) - end_location: SourceLocation(pos=4636, lineno=110, colno=44) + location: SourceLocation(pos=4687, lineno=111, colno=23) + end_location: SourceLocation(pos=4708, lineno=111, colno=44) is_tag: False namespace: 'minecraft' path: 'grass_block' block_states: - location: SourceLocation(pos=4637, lineno=110, colno=45) - end_location: SourceLocation(pos=4647, lineno=110, colno=55) + location: SourceLocation(pos=4709, lineno=111, colno=45) + end_location: SourceLocation(pos=4719, lineno=111, colno=55) key: - location: SourceLocation(pos=4637, lineno=110, colno=45) - end_location: SourceLocation(pos=4642, lineno=110, colno=50) + location: SourceLocation(pos=4709, lineno=111, colno=45) + end_location: SourceLocation(pos=4714, lineno=111, colno=50) value: 'snowy' value: - location: SourceLocation(pos=4643, lineno=110, colno=51) - end_location: SourceLocation(pos=4647, lineno=110, colno=55) + location: SourceLocation(pos=4715, lineno=111, colno=51) + end_location: SourceLocation(pos=4719, lineno=111, colno=55) value: 'true' data_tags: None - location: SourceLocation(pos=4649, lineno=111, colno=1) - end_location: SourceLocation(pos=4678, lineno=111, colno=30) + location: SourceLocation(pos=4721, lineno=112, colno=1) + end_location: SourceLocation(pos=4750, lineno=112, colno=30) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4658, lineno=111, colno=10) - end_location: SourceLocation(pos=4678, lineno=111, colno=30) + location: SourceLocation(pos=4730, lineno=112, colno=10) + end_location: SourceLocation(pos=4750, lineno=112, colno=30) name: - location: SourceLocation(pos=4658, lineno=111, colno=10) - end_location: SourceLocation(pos=4662, lineno=111, colno=14) + location: SourceLocation(pos=4730, lineno=112, colno=10) + end_location: SourceLocation(pos=4734, lineno=112, colno=14) is_tag: False namespace: None path: 'item' parameters: - location: SourceLocation(pos=4663, lineno=111, colno=15) - end_location: SourceLocation(pos=4678, lineno=111, colno=30) + location: SourceLocation(pos=4735, lineno=112, colno=15) + end_location: SourceLocation(pos=4750, lineno=112, colno=30) item: - location: SourceLocation(pos=4663, lineno=111, colno=15) - end_location: SourceLocation(pos=4678, lineno=111, colno=30) + location: SourceLocation(pos=4735, lineno=112, colno=15) + end_location: SourceLocation(pos=4750, lineno=112, colno=30) identifier: - location: SourceLocation(pos=4663, lineno=111, colno=15) - end_location: SourceLocation(pos=4678, lineno=111, colno=30) + location: SourceLocation(pos=4735, lineno=112, colno=15) + end_location: SourceLocation(pos=4750, lineno=112, colno=30) is_tag: False namespace: 'minecraft' path: 'apple' data_tags: None - location: SourceLocation(pos=4679, lineno=112, colno=1) - end_location: SourceLocation(pos=4727, lineno=112, colno=49) + location: SourceLocation(pos=4751, lineno=113, colno=1) + end_location: SourceLocation(pos=4799, lineno=113, colno=49) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4688, lineno=112, colno=10) - end_location: SourceLocation(pos=4727, lineno=112, colno=49) + location: SourceLocation(pos=4760, lineno=113, colno=10) + end_location: SourceLocation(pos=4799, lineno=113, colno=49) name: - location: SourceLocation(pos=4688, lineno=112, colno=10) - end_location: SourceLocation(pos=4697, lineno=112, colno=19) + location: SourceLocation(pos=4760, lineno=113, colno=10) + end_location: SourceLocation(pos=4769, lineno=113, colno=19) is_tag: False namespace: None path: 'vibration' parameters: - location: SourceLocation(pos=4698, lineno=112, colno=20) - end_location: SourceLocation(pos=4727, lineno=112, colno=49) + location: SourceLocation(pos=4770, lineno=113, colno=20) + end_location: SourceLocation(pos=4799, lineno=113, colno=49) x1: - location: SourceLocation(pos=4698, lineno=112, colno=20) - end_location: SourceLocation(pos=4701, lineno=112, colno=23) + location: SourceLocation(pos=4770, lineno=113, colno=20) + end_location: SourceLocation(pos=4773, lineno=113, colno=23) value: 0.0 y1: - location: SourceLocation(pos=4702, lineno=112, colno=24) - end_location: SourceLocation(pos=4706, lineno=112, colno=28) + location: SourceLocation(pos=4774, lineno=113, colno=24) + end_location: SourceLocation(pos=4778, lineno=113, colno=28) value: 64.0 z1: - location: SourceLocation(pos=4707, lineno=112, colno=29) - end_location: SourceLocation(pos=4710, lineno=112, colno=32) + location: SourceLocation(pos=4779, lineno=113, colno=29) + end_location: SourceLocation(pos=4782, lineno=113, colno=32) value: 0.0 x2: - location: SourceLocation(pos=4711, lineno=112, colno=33) - end_location: SourceLocation(pos=4714, lineno=112, colno=36) + location: SourceLocation(pos=4783, lineno=113, colno=33) + end_location: SourceLocation(pos=4786, lineno=113, colno=36) value: 5.0 y2: - location: SourceLocation(pos=4715, lineno=112, colno=37) - end_location: SourceLocation(pos=4719, lineno=112, colno=41) + location: SourceLocation(pos=4787, lineno=113, colno=37) + end_location: SourceLocation(pos=4791, lineno=113, colno=41) value: 64.0 z2: - location: SourceLocation(pos=4720, lineno=112, colno=42) - end_location: SourceLocation(pos=4723, lineno=112, colno=45) + location: SourceLocation(pos=4792, lineno=113, colno=42) + end_location: SourceLocation(pos=4795, lineno=113, colno=45) value: 0.0 duration: - location: SourceLocation(pos=4724, lineno=112, colno=46) - end_location: SourceLocation(pos=4727, lineno=112, colno=49) + location: SourceLocation(pos=4796, lineno=113, colno=46) + end_location: SourceLocation(pos=4799, lineno=113, colno=49) value: 200 - location: SourceLocation(pos=4728, lineno=113, colno=1) - end_location: SourceLocation(pos=4783, lineno=113, colno=56) + location: SourceLocation(pos=4800, lineno=114, colno=1) + end_location: SourceLocation(pos=4855, lineno=114, colno=56) identifier: 'particle:name:pos' arguments: - location: SourceLocation(pos=4737, lineno=113, colno=10) - end_location: SourceLocation(pos=4776, lineno=113, colno=49) + location: SourceLocation(pos=4809, lineno=114, colno=10) + end_location: SourceLocation(pos=4848, lineno=114, colno=49) name: - location: SourceLocation(pos=4737, lineno=113, colno=10) - end_location: SourceLocation(pos=4746, lineno=113, colno=19) + location: SourceLocation(pos=4809, lineno=114, colno=10) + end_location: SourceLocation(pos=4818, lineno=114, colno=19) is_tag: False namespace: None path: 'vibration' parameters: - location: SourceLocation(pos=4747, lineno=113, colno=20) - end_location: SourceLocation(pos=4776, lineno=113, colno=49) + location: SourceLocation(pos=4819, lineno=114, colno=20) + end_location: SourceLocation(pos=4848, lineno=114, colno=49) x1: - location: SourceLocation(pos=4747, lineno=113, colno=20) - end_location: SourceLocation(pos=4750, lineno=113, colno=23) + location: SourceLocation(pos=4819, lineno=114, colno=20) + end_location: SourceLocation(pos=4822, lineno=114, colno=23) value: 0.0 y1: - location: SourceLocation(pos=4751, lineno=113, colno=24) - end_location: SourceLocation(pos=4755, lineno=113, colno=28) + location: SourceLocation(pos=4823, lineno=114, colno=24) + end_location: SourceLocation(pos=4827, lineno=114, colno=28) value: 64.0 z1: - location: SourceLocation(pos=4756, lineno=113, colno=29) - end_location: SourceLocation(pos=4759, lineno=113, colno=32) + location: SourceLocation(pos=4828, lineno=114, colno=29) + end_location: SourceLocation(pos=4831, lineno=114, colno=32) value: 0.0 x2: - location: SourceLocation(pos=4760, lineno=113, colno=33) - end_location: SourceLocation(pos=4763, lineno=113, colno=36) + location: SourceLocation(pos=4832, lineno=114, colno=33) + end_location: SourceLocation(pos=4835, lineno=114, colno=36) value: 5.0 y2: - location: SourceLocation(pos=4764, lineno=113, colno=37) - end_location: SourceLocation(pos=4768, lineno=113, colno=41) + location: SourceLocation(pos=4836, lineno=114, colno=37) + end_location: SourceLocation(pos=4840, lineno=114, colno=41) value: 64.0 z2: - location: SourceLocation(pos=4769, lineno=113, colno=42) - end_location: SourceLocation(pos=4772, lineno=113, colno=45) + location: SourceLocation(pos=4841, lineno=114, colno=42) + end_location: SourceLocation(pos=4844, lineno=114, colno=45) value: 0.0 duration: - location: SourceLocation(pos=4773, lineno=113, colno=46) - end_location: SourceLocation(pos=4776, lineno=113, colno=49) + location: SourceLocation(pos=4845, lineno=114, colno=46) + end_location: SourceLocation(pos=4848, lineno=114, colno=49) value: 200 - location: SourceLocation(pos=4777, lineno=113, colno=50) - end_location: SourceLocation(pos=4783, lineno=113, colno=56) + location: SourceLocation(pos=4849, lineno=114, colno=50) + end_location: SourceLocation(pos=4855, lineno=114, colno=56) x: - location: SourceLocation(pos=4777, lineno=113, colno=50) - end_location: SourceLocation(pos=4778, lineno=113, colno=51) + location: SourceLocation(pos=4849, lineno=114, colno=50) + end_location: SourceLocation(pos=4850, lineno=114, colno=51) type: 'local' value: 0 y: - location: SourceLocation(pos=4779, lineno=113, colno=52) - end_location: SourceLocation(pos=4780, lineno=113, colno=53) + location: SourceLocation(pos=4851, lineno=114, colno=52) + end_location: SourceLocation(pos=4852, lineno=114, colno=53) type: 'local' value: 0 z: - location: SourceLocation(pos=4781, lineno=113, colno=54) - end_location: SourceLocation(pos=4783, lineno=113, colno=56) + location: SourceLocation(pos=4853, lineno=114, colno=54) + end_location: SourceLocation(pos=4855, lineno=114, colno=56) type: 'local' value: 3 - location: SourceLocation(pos=4795, lineno=115, colno=1) - end_location: SourceLocation(pos=4828, lineno=115, colno=34) + location: SourceLocation(pos=4867, lineno=116, colno=1) + end_location: SourceLocation(pos=4900, lineno=116, colno=34) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=4804, lineno=115, colno=10) - end_location: SourceLocation(pos=4809, lineno=115, colno=15) + location: SourceLocation(pos=4876, lineno=116, colno=10) + end_location: SourceLocation(pos=4881, lineno=116, colno=15) x: - location: SourceLocation(pos=4804, lineno=115, colno=10) - end_location: SourceLocation(pos=4805, lineno=115, colno=11) + location: SourceLocation(pos=4876, lineno=116, colno=10) + end_location: SourceLocation(pos=4877, lineno=116, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=4806, lineno=115, colno=12) - end_location: SourceLocation(pos=4807, lineno=115, colno=13) + location: SourceLocation(pos=4878, lineno=116, colno=12) + end_location: SourceLocation(pos=4879, lineno=116, colno=13) type: 'relative' value: 0 z: - location: SourceLocation(pos=4808, lineno=115, colno=14) - end_location: SourceLocation(pos=4809, lineno=115, colno=15) + location: SourceLocation(pos=4880, lineno=116, colno=14) + end_location: SourceLocation(pos=4881, lineno=116, colno=15) type: 'relative' value: 0 - location: SourceLocation(pos=4810, lineno=115, colno=16) - end_location: SourceLocation(pos=4828, lineno=115, colno=34) + location: SourceLocation(pos=4882, lineno=116, colno=16) + end_location: SourceLocation(pos=4900, lineno=116, colno=34) identifier: - location: SourceLocation(pos=4810, lineno=115, colno=16) - end_location: SourceLocation(pos=4815, lineno=115, colno=21) + location: SourceLocation(pos=4882, lineno=116, colno=16) + end_location: SourceLocation(pos=4887, lineno=116, colno=21) is_tag: False namespace: None path: 'chest' block_states: - location: SourceLocation(pos=4816, lineno=115, colno=22) - end_location: SourceLocation(pos=4827, lineno=115, colno=33) + location: SourceLocation(pos=4888, lineno=116, colno=22) + end_location: SourceLocation(pos=4899, lineno=116, colno=33) key: - location: SourceLocation(pos=4816, lineno=115, colno=22) - end_location: SourceLocation(pos=4822, lineno=115, colno=28) + location: SourceLocation(pos=4888, lineno=116, colno=22) + end_location: SourceLocation(pos=4894, lineno=116, colno=28) value: 'facing' value: - location: SourceLocation(pos=4823, lineno=115, colno=29) - end_location: SourceLocation(pos=4827, lineno=115, colno=33) + location: SourceLocation(pos=4895, lineno=116, colno=29) + end_location: SourceLocation(pos=4899, lineno=116, colno=33) value: 'east' data_tags: None - location: SourceLocation(pos=4829, lineno=116, colno=1) - end_location: SourceLocation(pos=4902, lineno=116, colno=74) + location: SourceLocation(pos=4901, lineno=117, colno=1) + end_location: SourceLocation(pos=4974, lineno=117, colno=74) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=4838, lineno=116, colno=10) - end_location: SourceLocation(pos=4845, lineno=116, colno=17) + location: SourceLocation(pos=4910, lineno=117, colno=10) + end_location: SourceLocation(pos=4917, lineno=117, colno=17) x: - location: SourceLocation(pos=4838, lineno=116, colno=10) - end_location: SourceLocation(pos=4839, lineno=116, colno=11) + location: SourceLocation(pos=4910, lineno=117, colno=10) + end_location: SourceLocation(pos=4911, lineno=117, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=4840, lineno=116, colno=12) - end_location: SourceLocation(pos=4841, lineno=116, colno=13) + location: SourceLocation(pos=4912, lineno=117, colno=12) + end_location: SourceLocation(pos=4913, lineno=117, colno=13) type: 'relative' value: 0 z: - location: SourceLocation(pos=4842, lineno=116, colno=14) - end_location: SourceLocation(pos=4845, lineno=116, colno=17) + location: SourceLocation(pos=4914, lineno=117, colno=14) + end_location: SourceLocation(pos=4917, lineno=117, colno=17) type: 'relative' value: -1 - location: SourceLocation(pos=4846, lineno=116, colno=18) - end_location: SourceLocation(pos=4902, lineno=116, colno=74) + location: SourceLocation(pos=4918, lineno=117, colno=18) + end_location: SourceLocation(pos=4974, lineno=117, colno=74) identifier: - location: SourceLocation(pos=4846, lineno=116, colno=18) - end_location: SourceLocation(pos=4856, lineno=116, colno=28) + location: SourceLocation(pos=4918, lineno=117, colno=18) + end_location: SourceLocation(pos=4928, lineno=117, colno=28) is_tag: False namespace: None path: 'birch_sign' @@ -4411,848 +4453,848 @@ data_tags: - location: SourceLocation(pos=4856, lineno=116, colno=28) - end_location: SourceLocation(pos=4902, lineno=116, colno=74) + location: SourceLocation(pos=4928, lineno=117, colno=28) + end_location: SourceLocation(pos=4974, lineno=117, colno=74) entries: - location: SourceLocation(pos=4857, lineno=116, colno=29) - end_location: SourceLocation(pos=4876, lineno=116, colno=48) + location: SourceLocation(pos=4929, lineno=117, colno=29) + end_location: SourceLocation(pos=4948, lineno=117, colno=48) key: - location: SourceLocation(pos=4857, lineno=116, colno=29) - end_location: SourceLocation(pos=4862, lineno=116, colno=34) + location: SourceLocation(pos=4929, lineno=117, colno=29) + end_location: SourceLocation(pos=4934, lineno=117, colno=34) value: 'Text1' value: - location: SourceLocation(pos=4864, lineno=116, colno=36) - end_location: SourceLocation(pos=4876, lineno=116, colno=48) + location: SourceLocation(pos=4936, lineno=117, colno=36) + end_location: SourceLocation(pos=4948, lineno=117, colno=48) value: String('"My chest"') - location: SourceLocation(pos=4878, lineno=116, colno=50) - end_location: SourceLocation(pos=4901, lineno=116, colno=73) + location: SourceLocation(pos=4950, lineno=117, colno=50) + end_location: SourceLocation(pos=4973, lineno=117, colno=73) key: - location: SourceLocation(pos=4878, lineno=116, colno=50) - end_location: SourceLocation(pos=4883, lineno=116, colno=55) + location: SourceLocation(pos=4950, lineno=117, colno=50) + end_location: SourceLocation(pos=4955, lineno=117, colno=55) value: 'Text2' value: - location: SourceLocation(pos=4885, lineno=116, colno=57) - end_location: SourceLocation(pos=4901, lineno=116, colno=73) + location: SourceLocation(pos=4957, lineno=117, colno=57) + end_location: SourceLocation(pos=4973, lineno=117, colno=73) value: String('"Do not open!"') - location: SourceLocation(pos=4903, lineno=117, colno=1) - end_location: SourceLocation(pos=4940, lineno=117, colno=38) + location: SourceLocation(pos=4975, lineno=118, colno=1) + end_location: SourceLocation(pos=5012, lineno=118, colno=38) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=4912, lineno=117, colno=10) - end_location: SourceLocation(pos=4918, lineno=117, colno=16) + location: SourceLocation(pos=4984, lineno=118, colno=10) + end_location: SourceLocation(pos=4990, lineno=118, colno=16) x: - location: SourceLocation(pos=4912, lineno=117, colno=10) - end_location: SourceLocation(pos=4913, lineno=117, colno=11) + location: SourceLocation(pos=4984, lineno=118, colno=10) + end_location: SourceLocation(pos=4985, lineno=118, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=4914, lineno=117, colno=12) - end_location: SourceLocation(pos=4916, lineno=117, colno=14) + location: SourceLocation(pos=4986, lineno=118, colno=12) + end_location: SourceLocation(pos=4988, lineno=118, colno=14) type: 'relative' value: 2 z: - location: SourceLocation(pos=4917, lineno=117, colno=15) - end_location: SourceLocation(pos=4918, lineno=117, colno=16) + location: SourceLocation(pos=4989, lineno=118, colno=15) + end_location: SourceLocation(pos=4990, lineno=118, colno=16) type: 'relative' value: 0 - location: SourceLocation(pos=4919, lineno=117, colno=17) - end_location: SourceLocation(pos=4940, lineno=117, colno=38) + location: SourceLocation(pos=4991, lineno=118, colno=17) + end_location: SourceLocation(pos=5012, lineno=118, colno=38) identifier: - location: SourceLocation(pos=4919, lineno=117, colno=17) - end_location: SourceLocation(pos=4930, lineno=117, colno=28) + location: SourceLocation(pos=4991, lineno=118, colno=17) + end_location: SourceLocation(pos=5002, lineno=118, colno=28) is_tag: False namespace: None path: 'quartz_slab' block_states: - location: SourceLocation(pos=4931, lineno=117, colno=29) - end_location: SourceLocation(pos=4939, lineno=117, colno=37) + location: SourceLocation(pos=5003, lineno=118, colno=29) + end_location: SourceLocation(pos=5011, lineno=118, colno=37) key: - location: SourceLocation(pos=4931, lineno=117, colno=29) - end_location: SourceLocation(pos=4935, lineno=117, colno=33) + location: SourceLocation(pos=5003, lineno=118, colno=29) + end_location: SourceLocation(pos=5007, lineno=118, colno=33) value: 'type' value: - location: SourceLocation(pos=4936, lineno=117, colno=34) - end_location: SourceLocation(pos=4939, lineno=117, colno=37) + location: SourceLocation(pos=5008, lineno=118, colno=34) + end_location: SourceLocation(pos=5011, lineno=118, colno=37) value: 'top' data_tags: None - location: SourceLocation(pos=4957, lineno=119, colno=1) - end_location: SourceLocation(pos=4990, lineno=119, colno=34) + location: SourceLocation(pos=5029, lineno=120, colno=1) + end_location: SourceLocation(pos=5062, lineno=120, colno=34) identifier: 'spreadplayers:center:spreadDistance:maxRange:respectTeams:targets' arguments: - location: SourceLocation(pos=4971, lineno=119, colno=15) - end_location: SourceLocation(pos=4974, lineno=119, colno=18) + location: SourceLocation(pos=5043, lineno=120, colno=15) + end_location: SourceLocation(pos=5046, lineno=120, colno=18) x: - location: SourceLocation(pos=4971, lineno=119, colno=15) - end_location: SourceLocation(pos=4972, lineno=119, colno=16) + location: SourceLocation(pos=5043, lineno=120, colno=15) + end_location: SourceLocation(pos=5044, lineno=120, colno=16) type: 'absolute' value: 0 y: - location: SourceLocation(pos=4973, lineno=119, colno=17) - end_location: SourceLocation(pos=4974, lineno=119, colno=18) + location: SourceLocation(pos=5045, lineno=120, colno=17) + end_location: SourceLocation(pos=5046, lineno=120, colno=18) type: 'absolute' value: 0 - location: SourceLocation(pos=4975, lineno=119, colno=19) - end_location: SourceLocation(pos=4978, lineno=119, colno=22) + location: SourceLocation(pos=5047, lineno=120, colno=19) + end_location: SourceLocation(pos=5050, lineno=120, colno=22) value: 200 - location: SourceLocation(pos=4979, lineno=119, colno=23) - end_location: SourceLocation(pos=4982, lineno=119, colno=26) + location: SourceLocation(pos=5051, lineno=120, colno=23) + end_location: SourceLocation(pos=5054, lineno=120, colno=26) value: 500 - location: SourceLocation(pos=4983, lineno=119, colno=27) - end_location: SourceLocation(pos=4987, lineno=119, colno=31) + location: SourceLocation(pos=5055, lineno=120, colno=27) + end_location: SourceLocation(pos=5059, lineno=120, colno=31) value: True - location: SourceLocation(pos=4988, lineno=119, colno=32) - end_location: SourceLocation(pos=4990, lineno=119, colno=34) + location: SourceLocation(pos=5060, lineno=120, colno=32) + end_location: SourceLocation(pos=5062, lineno=120, colno=34) variable: 'a' arguments: - location: SourceLocation(pos=5000, lineno=121, colno=1) - end_location: SourceLocation(pos=5030, lineno=121, colno=31) + location: SourceLocation(pos=5072, lineno=122, colno=1) + end_location: SourceLocation(pos=5102, lineno=122, colno=31) identifier: 'summon:entity:pos' arguments: - location: SourceLocation(pos=5007, lineno=121, colno=8) - end_location: SourceLocation(pos=5021, lineno=121, colno=22) + location: SourceLocation(pos=5079, lineno=122, colno=8) + end_location: SourceLocation(pos=5093, lineno=122, colno=22) is_tag: False namespace: None path: 'lightning_bolt' - location: SourceLocation(pos=5022, lineno=121, colno=23) - end_location: SourceLocation(pos=5030, lineno=121, colno=31) + location: SourceLocation(pos=5094, lineno=122, colno=23) + end_location: SourceLocation(pos=5102, lineno=122, colno=31) x: - location: SourceLocation(pos=5022, lineno=121, colno=23) - end_location: SourceLocation(pos=5026, lineno=121, colno=27) + location: SourceLocation(pos=5094, lineno=122, colno=23) + end_location: SourceLocation(pos=5098, lineno=122, colno=27) type: 'relative' value: -10 y: - location: SourceLocation(pos=5027, lineno=121, colno=28) - end_location: SourceLocation(pos=5028, lineno=121, colno=29) + location: SourceLocation(pos=5099, lineno=122, colno=28) + end_location: SourceLocation(pos=5100, lineno=122, colno=29) type: 'relative' value: 0 z: - location: SourceLocation(pos=5029, lineno=121, colno=30) - end_location: SourceLocation(pos=5030, lineno=121, colno=31) + location: SourceLocation(pos=5101, lineno=122, colno=30) + end_location: SourceLocation(pos=5102, lineno=122, colno=31) type: 'relative' value: 0 - location: SourceLocation(pos=5031, lineno=122, colno=1) - end_location: SourceLocation(pos=5107, lineno=122, colno=77) + location: SourceLocation(pos=5103, lineno=123, colno=1) + end_location: SourceLocation(pos=5179, lineno=123, colno=77) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=5038, lineno=122, colno=8) - end_location: SourceLocation(pos=5045, lineno=122, colno=15) + location: SourceLocation(pos=5110, lineno=123, colno=8) + end_location: SourceLocation(pos=5117, lineno=123, colno=15) is_tag: False namespace: None path: 'creeper' - location: SourceLocation(pos=5046, lineno=122, colno=16) - end_location: SourceLocation(pos=5051, lineno=122, colno=21) + location: SourceLocation(pos=5118, lineno=123, colno=16) + end_location: SourceLocation(pos=5123, lineno=123, colno=21) x: - location: SourceLocation(pos=5046, lineno=122, colno=16) - end_location: SourceLocation(pos=5047, lineno=122, colno=17) + location: SourceLocation(pos=5118, lineno=123, colno=16) + end_location: SourceLocation(pos=5119, lineno=123, colno=17) type: 'relative' value: 0 y: - location: SourceLocation(pos=5048, lineno=122, colno=18) - end_location: SourceLocation(pos=5049, lineno=122, colno=19) + location: SourceLocation(pos=5120, lineno=123, colno=18) + end_location: SourceLocation(pos=5121, lineno=123, colno=19) type: 'relative' value: 0 z: - location: SourceLocation(pos=5050, lineno=122, colno=20) - end_location: SourceLocation(pos=5051, lineno=122, colno=21) + location: SourceLocation(pos=5122, lineno=123, colno=20) + end_location: SourceLocation(pos=5123, lineno=123, colno=21) type: 'relative' value: 0 - location: SourceLocation(pos=5052, lineno=122, colno=22) - end_location: SourceLocation(pos=5107, lineno=122, colno=77) + location: SourceLocation(pos=5124, lineno=123, colno=22) + end_location: SourceLocation(pos=5179, lineno=123, colno=77) entries: - location: SourceLocation(pos=5053, lineno=122, colno=23) - end_location: SourceLocation(pos=5064, lineno=122, colno=34) + location: SourceLocation(pos=5125, lineno=123, colno=23) + end_location: SourceLocation(pos=5136, lineno=123, colno=34) key: - location: SourceLocation(pos=5053, lineno=122, colno=23) - end_location: SourceLocation(pos=5060, lineno=122, colno=30) + location: SourceLocation(pos=5125, lineno=123, colno=23) + end_location: SourceLocation(pos=5132, lineno=123, colno=30) value: 'powered' value: - location: SourceLocation(pos=5062, lineno=122, colno=32) - end_location: SourceLocation(pos=5064, lineno=122, colno=34) + location: SourceLocation(pos=5134, lineno=123, colno=32) + end_location: SourceLocation(pos=5136, lineno=123, colno=34) value: Byte(1) - location: SourceLocation(pos=5066, lineno=122, colno=36) - end_location: SourceLocation(pos=5106, lineno=122, colno=76) + location: SourceLocation(pos=5138, lineno=123, colno=36) + end_location: SourceLocation(pos=5178, lineno=123, colno=76) key: - location: SourceLocation(pos=5066, lineno=122, colno=36) - end_location: SourceLocation(pos=5076, lineno=122, colno=46) + location: SourceLocation(pos=5138, lineno=123, colno=36) + end_location: SourceLocation(pos=5148, lineno=123, colno=46) value: 'CustomName' value: - location: SourceLocation(pos=5078, lineno=122, colno=48) - end_location: SourceLocation(pos=5106, lineno=122, colno=76) + location: SourceLocation(pos=5150, lineno=123, colno=48) + end_location: SourceLocation(pos=5178, lineno=123, colno=76) value: String('{"text":"Powered Creeper"}') - location: SourceLocation(pos=5108, lineno=123, colno=1) - end_location: SourceLocation(pos=5217, lineno=123, colno=110) + location: SourceLocation(pos=5180, lineno=124, colno=1) + end_location: SourceLocation(pos=5289, lineno=124, colno=110) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=5115, lineno=123, colno=8) - end_location: SourceLocation(pos=5121, lineno=123, colno=14) + location: SourceLocation(pos=5187, lineno=124, colno=8) + end_location: SourceLocation(pos=5193, lineno=124, colno=14) is_tag: False namespace: None path: 'spider' - location: SourceLocation(pos=5122, lineno=123, colno=15) - end_location: SourceLocation(pos=5127, lineno=123, colno=20) + location: SourceLocation(pos=5194, lineno=124, colno=15) + end_location: SourceLocation(pos=5199, lineno=124, colno=20) x: - location: SourceLocation(pos=5122, lineno=123, colno=15) - end_location: SourceLocation(pos=5123, lineno=123, colno=16) + location: SourceLocation(pos=5194, lineno=124, colno=15) + end_location: SourceLocation(pos=5195, lineno=124, colno=16) type: 'relative' value: 0 y: - location: SourceLocation(pos=5124, lineno=123, colno=17) - end_location: SourceLocation(pos=5125, lineno=123, colno=18) + location: SourceLocation(pos=5196, lineno=124, colno=17) + end_location: SourceLocation(pos=5197, lineno=124, colno=18) type: 'relative' value: 0 z: - location: SourceLocation(pos=5126, lineno=123, colno=19) - end_location: SourceLocation(pos=5127, lineno=123, colno=20) + location: SourceLocation(pos=5198, lineno=124, colno=19) + end_location: SourceLocation(pos=5199, lineno=124, colno=20) type: 'relative' value: 0 - location: SourceLocation(pos=5128, lineno=123, colno=21) - end_location: SourceLocation(pos=5217, lineno=123, colno=110) + location: SourceLocation(pos=5200, lineno=124, colno=21) + end_location: SourceLocation(pos=5289, lineno=124, colno=110) entries: - location: SourceLocation(pos=5129, lineno=123, colno=22) - end_location: SourceLocation(pos=5216, lineno=123, colno=109) + location: SourceLocation(pos=5201, lineno=124, colno=22) + end_location: SourceLocation(pos=5288, lineno=124, colno=109) key: - location: SourceLocation(pos=5129, lineno=123, colno=22) - end_location: SourceLocation(pos=5139, lineno=123, colno=32) + location: SourceLocation(pos=5201, lineno=124, colno=22) + end_location: SourceLocation(pos=5211, lineno=124, colno=32) value: 'Passengers' value: - location: SourceLocation(pos=5141, lineno=123, colno=34) - end_location: SourceLocation(pos=5216, lineno=123, colno=109) + location: SourceLocation(pos=5213, lineno=124, colno=34) + end_location: SourceLocation(pos=5288, lineno=124, colno=109) elements: - location: SourceLocation(pos=5142, lineno=123, colno=35) - end_location: SourceLocation(pos=5215, lineno=123, colno=108) + location: SourceLocation(pos=5214, lineno=124, colno=35) + end_location: SourceLocation(pos=5287, lineno=124, colno=108) entries: - location: SourceLocation(pos=5143, lineno=123, colno=36) - end_location: SourceLocation(pos=5167, lineno=123, colno=60) + location: SourceLocation(pos=5215, lineno=124, colno=36) + end_location: SourceLocation(pos=5239, lineno=124, colno=60) key: - location: SourceLocation(pos=5143, lineno=123, colno=36) - end_location: SourceLocation(pos=5145, lineno=123, colno=38) + location: SourceLocation(pos=5215, lineno=124, colno=36) + end_location: SourceLocation(pos=5217, lineno=124, colno=38) value: 'id' value: - location: SourceLocation(pos=5147, lineno=123, colno=40) - end_location: SourceLocation(pos=5167, lineno=123, colno=60) + location: SourceLocation(pos=5219, lineno=124, colno=40) + end_location: SourceLocation(pos=5239, lineno=124, colno=60) value: String('minecraft:skeleton') - location: SourceLocation(pos=5169, lineno=123, colno=62) - end_location: SourceLocation(pos=5214, lineno=123, colno=107) + location: SourceLocation(pos=5241, lineno=124, colno=62) + end_location: SourceLocation(pos=5286, lineno=124, colno=107) key: - location: SourceLocation(pos=5169, lineno=123, colno=62) - end_location: SourceLocation(pos=5178, lineno=123, colno=71) + location: SourceLocation(pos=5241, lineno=124, colno=62) + end_location: SourceLocation(pos=5250, lineno=124, colno=71) value: 'HandItems' value: - location: SourceLocation(pos=5180, lineno=123, colno=73) - end_location: SourceLocation(pos=5214, lineno=123, colno=107) + location: SourceLocation(pos=5252, lineno=124, colno=73) + end_location: SourceLocation(pos=5286, lineno=124, colno=107) elements: - location: SourceLocation(pos=5181, lineno=123, colno=74) - end_location: SourceLocation(pos=5213, lineno=123, colno=106) + location: SourceLocation(pos=5253, lineno=124, colno=74) + end_location: SourceLocation(pos=5285, lineno=124, colno=106) entries: - location: SourceLocation(pos=5182, lineno=123, colno=75) - end_location: SourceLocation(pos=5201, lineno=123, colno=94) + location: SourceLocation(pos=5254, lineno=124, colno=75) + end_location: SourceLocation(pos=5273, lineno=124, colno=94) key: - location: SourceLocation(pos=5182, lineno=123, colno=75) - end_location: SourceLocation(pos=5184, lineno=123, colno=77) + location: SourceLocation(pos=5254, lineno=124, colno=75) + end_location: SourceLocation(pos=5256, lineno=124, colno=77) value: 'id' value: - location: SourceLocation(pos=5186, lineno=123, colno=79) - end_location: SourceLocation(pos=5201, lineno=123, colno=94) + location: SourceLocation(pos=5258, lineno=124, colno=79) + end_location: SourceLocation(pos=5273, lineno=124, colno=94) value: String('minecraft:bow') - location: SourceLocation(pos=5203, lineno=123, colno=96) - end_location: SourceLocation(pos=5212, lineno=123, colno=105) + location: SourceLocation(pos=5275, lineno=124, colno=96) + end_location: SourceLocation(pos=5284, lineno=124, colno=105) key: - location: SourceLocation(pos=5203, lineno=123, colno=96) - end_location: SourceLocation(pos=5208, lineno=123, colno=101) + location: SourceLocation(pos=5275, lineno=124, colno=96) + end_location: SourceLocation(pos=5280, lineno=124, colno=101) value: 'Count' value: - location: SourceLocation(pos=5210, lineno=123, colno=103) - end_location: SourceLocation(pos=5212, lineno=123, colno=105) + location: SourceLocation(pos=5282, lineno=124, colno=103) + end_location: SourceLocation(pos=5284, lineno=124, colno=105) value: Byte(1) - location: SourceLocation(pos=5218, lineno=124, colno=1) - end_location: SourceLocation(pos=5343, lineno=124, colno=126) + location: SourceLocation(pos=5290, lineno=125, colno=1) + end_location: SourceLocation(pos=5415, lineno=125, colno=126) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=5225, lineno=124, colno=8) - end_location: SourceLocation(pos=5233, lineno=124, colno=16) + location: SourceLocation(pos=5297, lineno=125, colno=8) + end_location: SourceLocation(pos=5305, lineno=125, colno=16) is_tag: False namespace: None path: 'villager' - location: SourceLocation(pos=5234, lineno=124, colno=17) - end_location: SourceLocation(pos=5239, lineno=124, colno=22) + location: SourceLocation(pos=5306, lineno=125, colno=17) + end_location: SourceLocation(pos=5311, lineno=125, colno=22) x: - location: SourceLocation(pos=5234, lineno=124, colno=17) - end_location: SourceLocation(pos=5235, lineno=124, colno=18) + location: SourceLocation(pos=5306, lineno=125, colno=17) + end_location: SourceLocation(pos=5307, lineno=125, colno=18) type: 'relative' value: 0 y: - location: SourceLocation(pos=5236, lineno=124, colno=19) - end_location: SourceLocation(pos=5237, lineno=124, colno=20) + location: SourceLocation(pos=5308, lineno=125, colno=19) + end_location: SourceLocation(pos=5309, lineno=125, colno=20) type: 'relative' value: 0 z: - location: SourceLocation(pos=5238, lineno=124, colno=21) - end_location: SourceLocation(pos=5239, lineno=124, colno=22) + location: SourceLocation(pos=5310, lineno=125, colno=21) + end_location: SourceLocation(pos=5311, lineno=125, colno=22) type: 'relative' value: 0 - location: SourceLocation(pos=5240, lineno=124, colno=23) - end_location: SourceLocation(pos=5343, lineno=124, colno=126) + location: SourceLocation(pos=5312, lineno=125, colno=23) + end_location: SourceLocation(pos=5415, lineno=125, colno=126) entries: - location: SourceLocation(pos=5241, lineno=124, colno=24) - end_location: SourceLocation(pos=5342, lineno=124, colno=125) + location: SourceLocation(pos=5313, lineno=125, colno=24) + end_location: SourceLocation(pos=5414, lineno=125, colno=125) key: - location: SourceLocation(pos=5241, lineno=124, colno=24) - end_location: SourceLocation(pos=5247, lineno=124, colno=30) + location: SourceLocation(pos=5313, lineno=125, colno=24) + end_location: SourceLocation(pos=5319, lineno=125, colno=30) value: 'Offers' value: - location: SourceLocation(pos=5249, lineno=124, colno=32) - end_location: SourceLocation(pos=5342, lineno=124, colno=125) + location: SourceLocation(pos=5321, lineno=125, colno=32) + end_location: SourceLocation(pos=5414, lineno=125, colno=125) entries: - location: SourceLocation(pos=5250, lineno=124, colno=33) - end_location: SourceLocation(pos=5341, lineno=124, colno=124) + location: SourceLocation(pos=5322, lineno=125, colno=33) + end_location: SourceLocation(pos=5413, lineno=125, colno=124) key: - location: SourceLocation(pos=5250, lineno=124, colno=33) - end_location: SourceLocation(pos=5257, lineno=124, colno=40) + location: SourceLocation(pos=5322, lineno=125, colno=33) + end_location: SourceLocation(pos=5329, lineno=125, colno=40) value: 'Recipes' value: - location: SourceLocation(pos=5259, lineno=124, colno=42) - end_location: SourceLocation(pos=5341, lineno=124, colno=124) + location: SourceLocation(pos=5331, lineno=125, colno=42) + end_location: SourceLocation(pos=5413, lineno=125, colno=124) elements: - location: SourceLocation(pos=5260, lineno=124, colno=43) - end_location: SourceLocation(pos=5340, lineno=124, colno=123) + location: SourceLocation(pos=5332, lineno=125, colno=43) + end_location: SourceLocation(pos=5412, lineno=125, colno=123) entries: - location: SourceLocation(pos=5261, lineno=124, colno=44) - end_location: SourceLocation(pos=5288, lineno=124, colno=71) + location: SourceLocation(pos=5333, lineno=125, colno=44) + end_location: SourceLocation(pos=5360, lineno=125, colno=71) key: - location: SourceLocation(pos=5261, lineno=124, colno=44) - end_location: SourceLocation(pos=5264, lineno=124, colno=47) + location: SourceLocation(pos=5333, lineno=125, colno=44) + end_location: SourceLocation(pos=5336, lineno=125, colno=47) value: 'buy' value: - location: SourceLocation(pos=5266, lineno=124, colno=49) - end_location: SourceLocation(pos=5288, lineno=124, colno=71) + location: SourceLocation(pos=5338, lineno=125, colno=49) + end_location: SourceLocation(pos=5360, lineno=125, colno=71) entries: - location: SourceLocation(pos=5267, lineno=124, colno=50) - end_location: SourceLocation(pos=5277, lineno=124, colno=60) + location: SourceLocation(pos=5339, lineno=125, colno=50) + end_location: SourceLocation(pos=5349, lineno=125, colno=60) key: - location: SourceLocation(pos=5267, lineno=124, colno=50) - end_location: SourceLocation(pos=5269, lineno=124, colno=52) + location: SourceLocation(pos=5339, lineno=125, colno=50) + end_location: SourceLocation(pos=5341, lineno=125, colno=52) value: 'id' value: - location: SourceLocation(pos=5271, lineno=124, colno=54) - end_location: SourceLocation(pos=5277, lineno=124, colno=60) + location: SourceLocation(pos=5343, lineno=125, colno=54) + end_location: SourceLocation(pos=5349, lineno=125, colno=60) value: String('dirt') - location: SourceLocation(pos=5279, lineno=124, colno=62) - end_location: SourceLocation(pos=5287, lineno=124, colno=70) + location: SourceLocation(pos=5351, lineno=125, colno=62) + end_location: SourceLocation(pos=5359, lineno=125, colno=70) key: - location: SourceLocation(pos=5279, lineno=124, colno=62) - end_location: SourceLocation(pos=5284, lineno=124, colno=67) + location: SourceLocation(pos=5351, lineno=125, colno=62) + end_location: SourceLocation(pos=5356, lineno=125, colno=67) value: 'Count' value: - location: SourceLocation(pos=5286, lineno=124, colno=69) - end_location: SourceLocation(pos=5287, lineno=124, colno=70) + location: SourceLocation(pos=5358, lineno=125, colno=69) + end_location: SourceLocation(pos=5359, lineno=125, colno=70) value: Int(1) - location: SourceLocation(pos=5290, lineno=124, colno=73) - end_location: SourceLocation(pos=5321, lineno=124, colno=104) + location: SourceLocation(pos=5362, lineno=125, colno=73) + end_location: SourceLocation(pos=5393, lineno=125, colno=104) key: - location: SourceLocation(pos=5290, lineno=124, colno=73) - end_location: SourceLocation(pos=5294, lineno=124, colno=77) + location: SourceLocation(pos=5362, lineno=125, colno=73) + end_location: SourceLocation(pos=5366, lineno=125, colno=77) value: 'sell' value: - location: SourceLocation(pos=5296, lineno=124, colno=79) - end_location: SourceLocation(pos=5321, lineno=124, colno=104) + location: SourceLocation(pos=5368, lineno=125, colno=79) + end_location: SourceLocation(pos=5393, lineno=125, colno=104) entries: - location: SourceLocation(pos=5297, lineno=124, colno=80) - end_location: SourceLocation(pos=5310, lineno=124, colno=93) + location: SourceLocation(pos=5369, lineno=125, colno=80) + end_location: SourceLocation(pos=5382, lineno=125, colno=93) key: - location: SourceLocation(pos=5297, lineno=124, colno=80) - end_location: SourceLocation(pos=5299, lineno=124, colno=82) + location: SourceLocation(pos=5369, lineno=125, colno=80) + end_location: SourceLocation(pos=5371, lineno=125, colno=82) value: 'id' value: - location: SourceLocation(pos=5301, lineno=124, colno=84) - end_location: SourceLocation(pos=5310, lineno=124, colno=93) + location: SourceLocation(pos=5373, lineno=125, colno=84) + end_location: SourceLocation(pos=5382, lineno=125, colno=93) value: String('diamond') - location: SourceLocation(pos=5312, lineno=124, colno=95) - end_location: SourceLocation(pos=5320, lineno=124, colno=103) + location: SourceLocation(pos=5384, lineno=125, colno=95) + end_location: SourceLocation(pos=5392, lineno=125, colno=103) key: - location: SourceLocation(pos=5312, lineno=124, colno=95) - end_location: SourceLocation(pos=5317, lineno=124, colno=100) + location: SourceLocation(pos=5384, lineno=125, colno=95) + end_location: SourceLocation(pos=5389, lineno=125, colno=100) value: 'Count' value: - location: SourceLocation(pos=5319, lineno=124, colno=102) - end_location: SourceLocation(pos=5320, lineno=124, colno=103) + location: SourceLocation(pos=5391, lineno=125, colno=102) + end_location: SourceLocation(pos=5392, lineno=125, colno=103) value: Int(1) - location: SourceLocation(pos=5323, lineno=124, colno=106) - end_location: SourceLocation(pos=5339, lineno=124, colno=122) + location: SourceLocation(pos=5395, lineno=125, colno=106) + end_location: SourceLocation(pos=5411, lineno=125, colno=122) key: - location: SourceLocation(pos=5323, lineno=124, colno=106) - end_location: SourceLocation(pos=5332, lineno=124, colno=115) + location: SourceLocation(pos=5395, lineno=125, colno=106) + end_location: SourceLocation(pos=5404, lineno=125, colno=115) value: 'rewardExp' value: - location: SourceLocation(pos=5334, lineno=124, colno=117) - end_location: SourceLocation(pos=5339, lineno=124, colno=122) + location: SourceLocation(pos=5406, lineno=125, colno=117) + end_location: SourceLocation(pos=5411, lineno=125, colno=122) value: Byte(0) - location: SourceLocation(pos=5355, lineno=126, colno=1) - end_location: SourceLocation(pos=5369, lineno=126, colno=15) + location: SourceLocation(pos=5427, lineno=127, colno=1) + end_location: SourceLocation(pos=5441, lineno=127, colno=15) identifier: 'teleport:destination' arguments: - location: SourceLocation(pos=5364, lineno=126, colno=10) - end_location: SourceLocation(pos=5369, lineno=126, colno=15) + location: SourceLocation(pos=5436, lineno=127, colno=10) + end_location: SourceLocation(pos=5441, lineno=127, colno=15) value: 'Alice' - location: SourceLocation(pos=5370, lineno=127, colno=1) - end_location: SourceLocation(pos=5384, lineno=127, colno=15) + location: SourceLocation(pos=5442, lineno=128, colno=1) + end_location: SourceLocation(pos=5456, lineno=128, colno=15) identifier: 'teleport:targets:destination' arguments: - location: SourceLocation(pos=5379, lineno=127, colno=10) - end_location: SourceLocation(pos=5381, lineno=127, colno=12) + location: SourceLocation(pos=5451, lineno=128, colno=10) + end_location: SourceLocation(pos=5453, lineno=128, colno=12) variable: 'a' arguments: - location: SourceLocation(pos=5382, lineno=127, colno=13) - end_location: SourceLocation(pos=5384, lineno=127, colno=15) + location: SourceLocation(pos=5454, lineno=128, colno=13) + end_location: SourceLocation(pos=5456, lineno=128, colno=15) variable: 's' arguments: - location: SourceLocation(pos=5385, lineno=128, colno=1) - end_location: SourceLocation(pos=5404, lineno=128, colno=20) + location: SourceLocation(pos=5457, lineno=129, colno=1) + end_location: SourceLocation(pos=5476, lineno=129, colno=20) identifier: 'teleport:location' arguments: - location: SourceLocation(pos=5394, lineno=128, colno=10) - end_location: SourceLocation(pos=5404, lineno=128, colno=20) + location: SourceLocation(pos=5466, lineno=129, colno=10) + end_location: SourceLocation(pos=5476, lineno=129, colno=20) x: - location: SourceLocation(pos=5394, lineno=128, colno=10) - end_location: SourceLocation(pos=5397, lineno=128, colno=13) + location: SourceLocation(pos=5466, lineno=129, colno=10) + end_location: SourceLocation(pos=5469, lineno=129, colno=13) type: 'absolute' value: 100 y: - location: SourceLocation(pos=5398, lineno=128, colno=14) - end_location: SourceLocation(pos=5400, lineno=128, colno=16) + location: SourceLocation(pos=5470, lineno=129, colno=14) + end_location: SourceLocation(pos=5472, lineno=129, colno=16) type: 'relative' value: 3 z: - location: SourceLocation(pos=5401, lineno=128, colno=17) - end_location: SourceLocation(pos=5404, lineno=128, colno=20) + location: SourceLocation(pos=5473, lineno=129, colno=17) + end_location: SourceLocation(pos=5476, lineno=129, colno=20) type: 'absolute' value: 100 - location: SourceLocation(pos=5415, lineno=130, colno=1) - end_location: SourceLocation(pos=5443, lineno=130, colno=29) + location: SourceLocation(pos=5487, lineno=131, colno=1) + end_location: SourceLocation(pos=5515, lineno=131, colno=29) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5423, lineno=130, colno=9) - end_location: SourceLocation(pos=5425, lineno=130, colno=11) + location: SourceLocation(pos=5495, lineno=131, colno=9) + end_location: SourceLocation(pos=5497, lineno=131, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5426, lineno=130, colno=12) - end_location: SourceLocation(pos=5443, lineno=130, colno=29) + location: SourceLocation(pos=5498, lineno=131, colno=12) + end_location: SourceLocation(pos=5515, lineno=131, colno=29) value: 'text to display' - location: SourceLocation(pos=5444, lineno=131, colno=1) - end_location: SourceLocation(pos=5490, lineno=131, colno=47) + location: SourceLocation(pos=5516, lineno=132, colno=1) + end_location: SourceLocation(pos=5562, lineno=132, colno=47) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5452, lineno=131, colno=9) - end_location: SourceLocation(pos=5454, lineno=131, colno=11) + location: SourceLocation(pos=5524, lineno=132, colno=9) + end_location: SourceLocation(pos=5526, lineno=132, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5455, lineno=131, colno=12) - end_location: SourceLocation(pos=5490, lineno=131, colno=47) + location: SourceLocation(pos=5527, lineno=132, colno=12) + end_location: SourceLocation(pos=5562, lineno=132, colno=47) entries: - location: SourceLocation(pos=5456, lineno=131, colno=13) - end_location: SourceLocation(pos=5474, lineno=131, colno=31) + location: SourceLocation(pos=5528, lineno=132, colno=13) + end_location: SourceLocation(pos=5546, lineno=132, colno=31) key: - location: SourceLocation(pos=5456, lineno=131, colno=13) - end_location: SourceLocation(pos=5462, lineno=131, colno=19) + location: SourceLocation(pos=5528, lineno=132, colno=13) + end_location: SourceLocation(pos=5534, lineno=132, colno=19) value: 'text' value: - location: SourceLocation(pos=5463, lineno=131, colno=20) - end_location: SourceLocation(pos=5474, lineno=131, colno=31) + location: SourceLocation(pos=5535, lineno=132, colno=20) + end_location: SourceLocation(pos=5546, lineno=132, colno=31) value: 'I am blue' - location: SourceLocation(pos=5475, lineno=131, colno=32) - end_location: SourceLocation(pos=5489, lineno=131, colno=46) + location: SourceLocation(pos=5547, lineno=132, colno=32) + end_location: SourceLocation(pos=5561, lineno=132, colno=46) key: - location: SourceLocation(pos=5475, lineno=131, colno=32) - end_location: SourceLocation(pos=5482, lineno=131, colno=39) + location: SourceLocation(pos=5547, lineno=132, colno=32) + end_location: SourceLocation(pos=5554, lineno=132, colno=39) value: 'color' value: - location: SourceLocation(pos=5483, lineno=131, colno=40) - end_location: SourceLocation(pos=5489, lineno=131, colno=46) + location: SourceLocation(pos=5555, lineno=132, colno=40) + end_location: SourceLocation(pos=5561, lineno=132, colno=46) value: 'blue' - location: SourceLocation(pos=5491, lineno=132, colno=1) - end_location: SourceLocation(pos=5540, lineno=132, colno=50) + location: SourceLocation(pos=5563, lineno=133, colno=1) + end_location: SourceLocation(pos=5612, lineno=133, colno=50) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5499, lineno=132, colno=9) - end_location: SourceLocation(pos=5501, lineno=132, colno=11) + location: SourceLocation(pos=5571, lineno=133, colno=9) + end_location: SourceLocation(pos=5573, lineno=133, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5502, lineno=132, colno=12) - end_location: SourceLocation(pos=5540, lineno=132, colno=50) + location: SourceLocation(pos=5574, lineno=133, colno=12) + end_location: SourceLocation(pos=5612, lineno=133, colno=50) entries: - location: SourceLocation(pos=5503, lineno=132, colno=13) - end_location: SourceLocation(pos=5521, lineno=132, colno=31) + location: SourceLocation(pos=5575, lineno=133, colno=13) + end_location: SourceLocation(pos=5593, lineno=133, colno=31) key: - location: SourceLocation(pos=5503, lineno=132, colno=13) - end_location: SourceLocation(pos=5509, lineno=132, colno=19) + location: SourceLocation(pos=5575, lineno=133, colno=13) + end_location: SourceLocation(pos=5581, lineno=133, colno=19) value: 'text' value: - location: SourceLocation(pos=5510, lineno=132, colno=20) - end_location: SourceLocation(pos=5521, lineno=132, colno=31) + location: SourceLocation(pos=5582, lineno=133, colno=20) + end_location: SourceLocation(pos=5593, lineno=133, colno=31) value: 'I am blue' - location: SourceLocation(pos=5522, lineno=132, colno=32) - end_location: SourceLocation(pos=5539, lineno=132, colno=49) + location: SourceLocation(pos=5594, lineno=133, colno=32) + end_location: SourceLocation(pos=5611, lineno=133, colno=49) key: - location: SourceLocation(pos=5522, lineno=132, colno=32) - end_location: SourceLocation(pos=5529, lineno=132, colno=39) + location: SourceLocation(pos=5594, lineno=133, colno=32) + end_location: SourceLocation(pos=5601, lineno=133, colno=39) value: 'color' value: - location: SourceLocation(pos=5530, lineno=132, colno=40) - end_location: SourceLocation(pos=5539, lineno=132, colno=49) + location: SourceLocation(pos=5602, lineno=133, colno=40) + end_location: SourceLocation(pos=5611, lineno=133, colno=49) value: '#5555ff' - location: SourceLocation(pos=5541, lineno=133, colno=1) - end_location: SourceLocation(pos=5622, lineno=133, colno=82) + location: SourceLocation(pos=5613, lineno=134, colno=1) + end_location: SourceLocation(pos=5694, lineno=134, colno=82) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5549, lineno=133, colno=9) - end_location: SourceLocation(pos=5551, lineno=133, colno=11) + location: SourceLocation(pos=5621, lineno=134, colno=9) + end_location: SourceLocation(pos=5623, lineno=134, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5552, lineno=133, colno=12) - end_location: SourceLocation(pos=5622, lineno=133, colno=82) + location: SourceLocation(pos=5624, lineno=134, colno=12) + end_location: SourceLocation(pos=5694, lineno=134, colno=82) entries: - location: SourceLocation(pos=5553, lineno=133, colno=13) - end_location: SourceLocation(pos=5571, lineno=133, colno=31) + location: SourceLocation(pos=5625, lineno=134, colno=13) + end_location: SourceLocation(pos=5643, lineno=134, colno=31) key: - location: SourceLocation(pos=5553, lineno=133, colno=13) - end_location: SourceLocation(pos=5559, lineno=133, colno=19) + location: SourceLocation(pos=5625, lineno=134, colno=13) + end_location: SourceLocation(pos=5631, lineno=134, colno=19) value: 'text' value: - location: SourceLocation(pos=5560, lineno=133, colno=20) - end_location: SourceLocation(pos=5571, lineno=133, colno=31) + location: SourceLocation(pos=5632, lineno=134, colno=20) + end_location: SourceLocation(pos=5643, lineno=134, colno=31) value: 'Hover me!' - location: SourceLocation(pos=5572, lineno=133, colno=32) - end_location: SourceLocation(pos=5621, lineno=133, colno=81) + location: SourceLocation(pos=5644, lineno=134, colno=32) + end_location: SourceLocation(pos=5693, lineno=134, colno=81) key: - location: SourceLocation(pos=5572, lineno=133, colno=32) - end_location: SourceLocation(pos=5584, lineno=133, colno=44) + location: SourceLocation(pos=5644, lineno=134, colno=32) + end_location: SourceLocation(pos=5656, lineno=134, colno=44) value: 'hoverEvent' value: - location: SourceLocation(pos=5585, lineno=133, colno=45) - end_location: SourceLocation(pos=5621, lineno=133, colno=81) + location: SourceLocation(pos=5657, lineno=134, colno=45) + end_location: SourceLocation(pos=5693, lineno=134, colno=81) entries: - location: SourceLocation(pos=5586, lineno=133, colno=46) - end_location: SourceLocation(pos=5606, lineno=133, colno=66) + location: SourceLocation(pos=5658, lineno=134, colno=46) + end_location: SourceLocation(pos=5678, lineno=134, colno=66) key: - location: SourceLocation(pos=5586, lineno=133, colno=46) - end_location: SourceLocation(pos=5594, lineno=133, colno=54) + location: SourceLocation(pos=5658, lineno=134, colno=46) + end_location: SourceLocation(pos=5666, lineno=134, colno=54) value: 'action' value: - location: SourceLocation(pos=5595, lineno=133, colno=55) - end_location: SourceLocation(pos=5606, lineno=133, colno=66) + location: SourceLocation(pos=5667, lineno=134, colno=55) + end_location: SourceLocation(pos=5678, lineno=134, colno=66) value: 'show_text' - location: SourceLocation(pos=5607, lineno=133, colno=67) - end_location: SourceLocation(pos=5620, lineno=133, colno=80) + location: SourceLocation(pos=5679, lineno=134, colno=67) + end_location: SourceLocation(pos=5692, lineno=134, colno=80) key: - location: SourceLocation(pos=5607, lineno=133, colno=67) - end_location: SourceLocation(pos=5614, lineno=133, colno=74) + location: SourceLocation(pos=5679, lineno=134, colno=67) + end_location: SourceLocation(pos=5686, lineno=134, colno=74) value: 'value' value: - location: SourceLocation(pos=5615, lineno=133, colno=75) - end_location: SourceLocation(pos=5620, lineno=133, colno=80) + location: SourceLocation(pos=5687, lineno=134, colno=75) + end_location: SourceLocation(pos=5692, lineno=134, colno=80) value: 'Hi!' - location: SourceLocation(pos=5623, lineno=134, colno=1) - end_location: SourceLocation(pos=5648, lineno=134, colno=26) + location: SourceLocation(pos=5695, lineno=135, colno=1) + end_location: SourceLocation(pos=5720, lineno=135, colno=26) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5631, lineno=134, colno=9) - end_location: SourceLocation(pos=5633, lineno=134, colno=11) + location: SourceLocation(pos=5703, lineno=135, colno=9) + end_location: SourceLocation(pos=5705, lineno=135, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5634, lineno=134, colno=12) - end_location: SourceLocation(pos=5648, lineno=134, colno=26) + location: SourceLocation(pos=5706, lineno=135, colno=12) + end_location: SourceLocation(pos=5720, lineno=135, colno=26) value: 'Text1\nText2' - location: SourceLocation(pos=5656, lineno=136, colno=1) - end_location: SourceLocation(pos=5670, lineno=136, colno=15) + location: SourceLocation(pos=5728, lineno=137, colno=1) + end_location: SourceLocation(pos=5742, lineno=137, colno=15) identifier: 'time:set:time' arguments: - location: SourceLocation(pos=5665, lineno=136, colno=10) - end_location: SourceLocation(pos=5670, lineno=136, colno=15) + location: SourceLocation(pos=5737, lineno=137, colno=10) + end_location: SourceLocation(pos=5742, lineno=137, colno=15) value: 1000 unit: 'tick' - location: SourceLocation(pos=5671, lineno=137, colno=1) - end_location: SourceLocation(pos=5683, lineno=137, colno=13) + location: SourceLocation(pos=5743, lineno=138, colno=1) + end_location: SourceLocation(pos=5755, lineno=138, colno=13) identifier: 'time:set:day' arguments: - location: SourceLocation(pos=5684, lineno=138, colno=1) - end_location: SourceLocation(pos=5699, lineno=138, colno=16) + location: SourceLocation(pos=5756, lineno=139, colno=1) + end_location: SourceLocation(pos=5771, lineno=139, colno=16) identifier: 'time:add:time' arguments: - location: SourceLocation(pos=5693, lineno=138, colno=10) - end_location: SourceLocation(pos=5699, lineno=138, colno=16) + location: SourceLocation(pos=5765, lineno=139, colno=10) + end_location: SourceLocation(pos=5771, lineno=139, colno=16) value: 24000 unit: 'tick' - location: SourceLocation(pos=5708, lineno=140, colno=1) - end_location: SourceLocation(pos=5785, lineno=140, colno=78) + location: SourceLocation(pos=5780, lineno=141, colno=1) + end_location: SourceLocation(pos=5857, lineno=141, colno=78) identifier: 'title:targets:subtitle:title' arguments: - location: SourceLocation(pos=5714, lineno=140, colno=7) - end_location: SourceLocation(pos=5716, lineno=140, colno=9) + location: SourceLocation(pos=5786, lineno=141, colno=7) + end_location: SourceLocation(pos=5788, lineno=141, colno=9) variable: 'a' arguments: - location: SourceLocation(pos=5726, lineno=140, colno=19) - end_location: SourceLocation(pos=5785, lineno=140, colno=78) + location: SourceLocation(pos=5798, lineno=141, colno=19) + end_location: SourceLocation(pos=5857, lineno=141, colno=78) entries: - location: SourceLocation(pos=5727, lineno=140, colno=20) - end_location: SourceLocation(pos=5755, lineno=140, colno=48) + location: SourceLocation(pos=5799, lineno=141, colno=20) + end_location: SourceLocation(pos=5827, lineno=141, colno=48) key: - location: SourceLocation(pos=5727, lineno=140, colno=20) - end_location: SourceLocation(pos=5733, lineno=140, colno=26) + location: SourceLocation(pos=5799, lineno=141, colno=20) + end_location: SourceLocation(pos=5805, lineno=141, colno=26) value: 'text' value: - location: SourceLocation(pos=5734, lineno=140, colno=27) - end_location: SourceLocation(pos=5755, lineno=140, colno=48) + location: SourceLocation(pos=5806, lineno=141, colno=27) + end_location: SourceLocation(pos=5827, lineno=141, colno=48) value: 'The story begins...' - location: SourceLocation(pos=5756, lineno=140, colno=49) - end_location: SourceLocation(pos=5770, lineno=140, colno=63) + location: SourceLocation(pos=5828, lineno=141, colno=49) + end_location: SourceLocation(pos=5842, lineno=141, colno=63) key: - location: SourceLocation(pos=5756, lineno=140, colno=49) - end_location: SourceLocation(pos=5763, lineno=140, colno=56) + location: SourceLocation(pos=5828, lineno=141, colno=49) + end_location: SourceLocation(pos=5835, lineno=141, colno=56) value: 'color' value: - location: SourceLocation(pos=5764, lineno=140, colno=57) - end_location: SourceLocation(pos=5770, lineno=140, colno=63) + location: SourceLocation(pos=5836, lineno=141, colno=57) + end_location: SourceLocation(pos=5842, lineno=141, colno=63) value: 'gray' - location: SourceLocation(pos=5771, lineno=140, colno=64) - end_location: SourceLocation(pos=5784, lineno=140, colno=77) + location: SourceLocation(pos=5843, lineno=141, colno=64) + end_location: SourceLocation(pos=5856, lineno=141, colno=77) key: - location: SourceLocation(pos=5771, lineno=140, colno=64) - end_location: SourceLocation(pos=5779, lineno=140, colno=72) + location: SourceLocation(pos=5843, lineno=141, colno=64) + end_location: SourceLocation(pos=5851, lineno=141, colno=72) value: 'italic' value: - location: SourceLocation(pos=5780, lineno=140, colno=73) - end_location: SourceLocation(pos=5784, lineno=140, colno=77) + location: SourceLocation(pos=5852, lineno=141, colno=73) + end_location: SourceLocation(pos=5856, lineno=141, colno=77) value: True - location: SourceLocation(pos=5786, lineno=141, colno=1) - end_location: SourceLocation(pos=5833, lineno=141, colno=48) + location: SourceLocation(pos=5858, lineno=142, colno=1) + end_location: SourceLocation(pos=5905, lineno=142, colno=48) identifier: 'title:targets:title:title' arguments: - location: SourceLocation(pos=5792, lineno=141, colno=7) - end_location: SourceLocation(pos=5794, lineno=141, colno=9) + location: SourceLocation(pos=5864, lineno=142, colno=7) + end_location: SourceLocation(pos=5866, lineno=142, colno=9) variable: 'a' arguments: - location: SourceLocation(pos=5801, lineno=141, colno=16) - end_location: SourceLocation(pos=5833, lineno=141, colno=48) + location: SourceLocation(pos=5873, lineno=142, colno=16) + end_location: SourceLocation(pos=5905, lineno=142, colno=48) entries: - location: SourceLocation(pos=5802, lineno=141, colno=17) - end_location: SourceLocation(pos=5820, lineno=141, colno=35) + location: SourceLocation(pos=5874, lineno=142, colno=17) + end_location: SourceLocation(pos=5892, lineno=142, colno=35) key: - location: SourceLocation(pos=5802, lineno=141, colno=17) - end_location: SourceLocation(pos=5808, lineno=141, colno=23) + location: SourceLocation(pos=5874, lineno=142, colno=17) + end_location: SourceLocation(pos=5880, lineno=142, colno=23) value: 'text' value: - location: SourceLocation(pos=5809, lineno=141, colno=24) - end_location: SourceLocation(pos=5820, lineno=141, colno=35) + location: SourceLocation(pos=5881, lineno=142, colno=24) + end_location: SourceLocation(pos=5892, lineno=142, colno=35) value: 'Chapter I' - location: SourceLocation(pos=5821, lineno=141, colno=36) - end_location: SourceLocation(pos=5832, lineno=141, colno=47) + location: SourceLocation(pos=5893, lineno=142, colno=36) + end_location: SourceLocation(pos=5904, lineno=142, colno=47) key: - location: SourceLocation(pos=5821, lineno=141, colno=36) - end_location: SourceLocation(pos=5827, lineno=141, colno=42) + location: SourceLocation(pos=5893, lineno=142, colno=36) + end_location: SourceLocation(pos=5899, lineno=142, colno=42) value: 'bold' value: - location: SourceLocation(pos=5828, lineno=141, colno=43) - end_location: SourceLocation(pos=5832, lineno=141, colno=47) + location: SourceLocation(pos=5900, lineno=142, colno=43) + end_location: SourceLocation(pos=5904, lineno=142, colno=47) value: True - location: SourceLocation(pos=5844, lineno=143, colno=1) - end_location: SourceLocation(pos=5862, lineno=143, colno=19) + location: SourceLocation(pos=5916, lineno=144, colno=1) + end_location: SourceLocation(pos=5934, lineno=144, colno=19) identifier: 'weather:clear:duration' arguments: - location: SourceLocation(pos=5858, lineno=143, colno=15) - end_location: SourceLocation(pos=5862, lineno=143, colno=19) + location: SourceLocation(pos=5930, lineno=144, colno=15) + end_location: SourceLocation(pos=5934, lineno=144, colno=19) value: 1200 - location: SourceLocation(pos=5863, lineno=144, colno=1) - end_location: SourceLocation(pos=5875, lineno=144, colno=13) + location: SourceLocation(pos=5935, lineno=145, colno=1) + end_location: SourceLocation(pos=5947, lineno=145, colno=13) identifier: 'weather:rain' arguments: \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index ad0527ab2..0efb571a3 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -51,6 +51,7 @@ execute as @p at @s run teleport @s ~ ~ ~ ~10 ~ execute in minecraft:the_nether run teleport ~ ~ ~ execute as @a in minecraft:the_end run teleport 84 57 79 execute as Alice in minecraft:overworld run teleport 251 64 -160 +execute store result score #temp global run data get storage global foo experience query Steve levels fill 52 63 -1516 33 73 -1536 minecraft:gold_block replace minecraft:orange_glazed_terracotta fill ~-3 ~-3 ~-3 ~3 ~-1 ~3 water From 343545bfa043ac43d0232bf5f49d01942a6dc043 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 20:35:33 +0200 Subject: [PATCH 0349/1554] fix: proper rule baking --- packages/mecha/mecha/dispatch.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index abd98b6cf..dbd44de8c 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -55,6 +55,14 @@ def __post_init__(self): def __call__(self, *args: Any, **kwargs: Any) -> Any: return self.callback(*args, **kwargs) + def bake(self, *args: Any, **kwargs: Any) -> "Rule": + """Bake arguments.""" + return replace( + self, + callback=partial(self.callback, *args, **kwargs), + next=self.next.bake(*args, **kwargs) if self.next else None, + ) + @overload def rule(func: Callable[..., Any]) -> Rule: @@ -103,14 +111,7 @@ class Dispatcher(Generic[T]): def __post_init__(self): for name in dir(self): if isinstance(rule := getattr(self, name), Rule): - callback = partial(rule.callback, self) - - current = rule - while current: - current.callback = callback - current = current.next - - self.add_rule(rule) + self.add_rule(rule.bake(self)) def add_rule(self, rule: Callable[..., Any]): """Add rule.""" From bd4e21832936945067839e767c17cc8de2c7d057 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Sep 2021 20:36:18 +0200 Subject: [PATCH 0350/1554] test: run examples --- packages/mecha/examples/greet_command.py | 3 +- .../examples__output_greet_command__0.txt | 129 ++++++++++++++++++ packages/mecha/tests/test_examples.py | 21 +++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 packages/mecha/tests/snapshots/examples__output_greet_command__0.txt create mode 100644 packages/mecha/tests/test_examples.py diff --git a/packages/mecha/examples/greet_command.py b/packages/mecha/examples/greet_command.py index b1b6e1989..6247499ed 100644 --- a/packages/mecha/examples/greet_command.py +++ b/packages/mecha/examples/greet_command.py @@ -71,4 +71,5 @@ def rewrite_greet_command(node: AstCommand) -> AstCommand: print(ast.dump()) print(mc.serialize(ast)) -print(ast == mc.parse("say Hello @a[tag=!registered]")) +print(ast == mc.parse("say Hello @a[tag=!registered]")) # True +print(mc.parse("execute if score #init temp = #wat temp run greet @a[tag=hi]").dump()) diff --git a/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt b/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt new file mode 100644 index 000000000..cc5b25432 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt @@ -0,0 +1,129 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=5, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=6) + identifier: 'greet:entity' + arguments: + + location: SourceLocation(pos=11, lineno=2, colno=11) + end_location: SourceLocation(pos=46, lineno=4, colno=6) + variable: 'a' + arguments: + + location: SourceLocation(pos=23, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=26) + inverted: True + key: + + location: SourceLocation(pos=23, lineno=3, colno=9) + end_location: SourceLocation(pos=26, lineno=3, colno=12) + value: 'tag' + value: + + location: SourceLocation(pos=30, lineno=3, colno=16) + end_location: SourceLocation(pos=40, lineno=3, colno=26) + value: 'registered' +greet @a[tag=!registered] + +replacing ['commands'] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=5, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=6) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + fragments: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'Hello ' + + location: SourceLocation(pos=11, lineno=2, colno=11) + end_location: SourceLocation(pos=46, lineno=4, colno=6) + variable: 'a' + arguments: + + location: SourceLocation(pos=23, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=26) + inverted: True + key: + + location: SourceLocation(pos=23, lineno=3, colno=9) + end_location: SourceLocation(pos=26, lineno=3, colno=12) + value: 'tag' + value: + + location: SourceLocation(pos=30, lineno=3, colno=16) + end_location: SourceLocation(pos=40, lineno=3, colno=26) + value: 'registered' +say Hello @a[tag=!registered] + +True + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + identifier: 'execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand' + arguments: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: '#init' + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'temp' + + location: SourceLocation(pos=30, lineno=1, colno=31) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + value: '#wat' + + location: SourceLocation(pos=35, lineno=1, colno=36) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 'temp' + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + identifier: 'greet:entity' + arguments: + + location: SourceLocation(pos=50, lineno=1, colno=51) + end_location: SourceLocation(pos=60, lineno=1, colno=61) + variable: 'a' + arguments: + + location: SourceLocation(pos=53, lineno=1, colno=54) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + inverted: False + key: + + location: SourceLocation(pos=53, lineno=1, colno=54) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + value: 'tag' + value: + + location: SourceLocation(pos=57, lineno=1, colno=58) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + value: 'hi' diff --git a/packages/mecha/tests/test_examples.py b/packages/mecha/tests/test_examples.py new file mode 100644 index 000000000..9e6572dc6 --- /dev/null +++ b/packages/mecha/tests/test_examples.py @@ -0,0 +1,21 @@ +import sys +from importlib import import_module +from pathlib import Path + +import pytest +from pytest_insta import SnapshotFixture + +EXAMPLES_DIRECTORY = Path(__file__).parent.parent / "examples" +sys.path.append(str(EXAMPLES_DIRECTORY)) + + +@pytest.mark.parametrize( + "module_name", [p.stem for p in EXAMPLES_DIRECTORY.glob("*.py")] +) +def test_output( + snapshot: SnapshotFixture, + capsys: pytest.CaptureFixture[str], + module_name: str, +): + import_module(module_name) + assert snapshot() == capsys.readouterr().out From 1d9d12217b32426a94503ef3f2f3a1d7e0f1c4c4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Sep 2021 18:37:11 +0000 Subject: [PATCH 0351/1554] 0.3.6 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 9fb093b61..8531538eb 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.3.6 (2021-09-21) +### Fix +* Proper rule baking ([`38e03fb`](https://github.com/mcbeet/mecha/commit/38e03fbd963237293671b2f5d0d47aed4ef1cf48)) +* Also disambiguate when not in multiline mode ([`ee8e747`](https://github.com/mcbeet/mecha/commit/ee8e747ccd1c0724607b180259635c1b9c639453)) + ## v0.3.5 (2021-09-21) ### Fix * Allow # and $ at the beginning of fake player names ([`4b7fc56`](https://github.com/mcbeet/mecha/commit/4b7fc56b5e6d7462aee2acda5de9754d0b821f47)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index af9ab7f53..46ee1ae8c 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.5" +__version__ = "0.3.6" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b0dc7e32d..9f376e1e8 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.5" +version = "0.3.6" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 2ca8df2c9ab253c27292efe0ff786c98241c208e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 22 Sep 2021 11:19:37 +0200 Subject: [PATCH 0352/1554] fix: make it possible to configure the version --- packages/mecha/mecha/api.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 9b6f33631..e8859db8a 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -14,6 +14,7 @@ from tokenstream import TokenStream from .ast import AstNode, AstRoot +from .config import CommandTree from .dispatch import Dispatcher, MutatingReducer, Reducer from .parse import delegate, get_default_parsers from .serialize import Serializer @@ -25,6 +26,7 @@ class MechaOptions(BaseModel): """Mecha options.""" + version: str = "1.17" multiline: bool = False @@ -33,23 +35,28 @@ class Mecha: """Class exposing the command api.""" ctx: InitVar[Optional[Context]] = None + version: InitVar[str] = "1.17" multiline: InitVar[bool] = False - spec: CommandSpec = extra_field( - default_factory=lambda: CommandSpec(parsers=get_default_parsers()) - ) + spec: CommandSpec = extra_field(default=None) normalize: Dispatcher[AstNode] = extra_field(init=False) transform: Dispatcher[AstNode] = extra_field(init=False) check: Dispatcher[AstNode] = extra_field(init=False) serialize: Dispatcher[str] = extra_field(init=False) - def __post_init__(self, ctx: Optional[Context], multiline: bool): + def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): if ctx: opts = ctx.validate("mecha", MechaOptions) - self.spec.multiline = opts.multiline - else: - self.spec.multiline = multiline + version = opts.version + multiline = opts.multiline + + if not self.spec: + self.spec = CommandSpec( + multiline=multiline, + tree=CommandTree.load_from(version=version), + parsers=get_default_parsers(), + ) self.normalize = MutatingReducer() self.transform = MutatingReducer() From b7a0255a80dc902d39da928df9b26d157aed6c79 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 26 Sep 2021 20:10:40 +0200 Subject: [PATCH 0353/1554] feat: add diagnostics, beet plugin, and basic linter --- packages/mecha/mecha/__init__.py | 3 +- packages/mecha/mecha/api.py | 202 ++++++++++++++++-- packages/mecha/mecha/contrib/__init__.py | 0 packages/mecha/mecha/contrib/lint_basic.py | 90 ++++++++ packages/mecha/mecha/diagnostic.py | 156 ++++++++++++++ packages/mecha/mecha/dispatch.py | 140 ++++++++---- packages/mecha/mecha/plugin.py | 35 +++ packages/mecha/poetry.lock | 14 +- packages/mecha/pyproject.toml | 4 +- .../examples__output_greet_command__0.txt | 1 - ...rgument_examples_brigadier_bool_1_0__0.txt | 5 +- ...rgument_examples_brigadier_bool_1_1__0.txt | 5 +- ...ument_examples_brigadier_double_1_0__0.txt | 5 +- ...ument_examples_brigadier_double_1_1__0.txt | 5 +- ...ument_examples_brigadier_double_1_2__0.txt | 5 +- ...ument_examples_brigadier_double_1_3__0.txt | 5 +- ...gument_examples_brigadier_float_1_0__0.txt | 5 +- ...gument_examples_brigadier_float_1_1__0.txt | 5 +- ...gument_examples_brigadier_float_1_2__0.txt | 5 +- ...gument_examples_brigadier_float_1_3__0.txt | 5 +- ...ment_examples_brigadier_integer_1_0__0.txt | 5 +- ...ment_examples_brigadier_integer_1_1__0.txt | 5 +- ...ment_examples_brigadier_integer_1_2__0.txt | 5 +- ...ment_examples_brigadier_integer_1_3__0.txt | 5 +- ...ment_examples_brigadier_integer_1_4__0.txt | 5 +- ...rgument_examples_brigadier_long_1_0__0.txt | 5 +- ...rgument_examples_brigadier_long_1_1__0.txt | 5 +- ...rgument_examples_brigadier_long_1_2__0.txt | 5 +- ...rgument_examples_brigadier_long_1_3__0.txt | 5 +- ...gument_examples_minecraft_angle_1_0__0.txt | 5 +- ...gument_examples_minecraft_angle_1_1__0.txt | 5 +- ...nt_examples_minecraft_block_pos_1_0__0.txt | 5 +- ...nt_examples_minecraft_block_pos_1_1__0.txt | 5 +- ...nt_examples_minecraft_block_pos_1_2__0.txt | 5 +- ...nt_examples_minecraft_block_pos_1_3__0.txt | 5 +- ...mples_minecraft_block_predicate_1_0__0.txt | 5 +- ...mples_minecraft_block_predicate_1_1__0.txt | 5 +- ...mples_minecraft_block_predicate_1_2__0.txt | 5 +- ...mples_minecraft_block_predicate_1_3__0.txt | 5 +- ...mples_minecraft_block_predicate_1_4__0.txt | 5 +- ...mples_minecraft_block_predicate_1_5__0.txt | 5 +- ..._examples_minecraft_block_state_1_0__0.txt | 5 +- ..._examples_minecraft_block_state_1_1__0.txt | 5 +- ..._examples_minecraft_block_state_1_2__0.txt | 5 +- ..._examples_minecraft_block_state_1_3__0.txt | 5 +- ..._examples_minecraft_block_state_1_4__0.txt | 5 +- ..._examples_minecraft_block_state_1_5__0.txt | 5 +- ..._examples_minecraft_block_state_1_6__0.txt | 5 +- ...gument_examples_minecraft_color_1_0__0.txt | 5 +- ...t_examples_minecraft_column_pos_1_0__0.txt | 5 +- ...t_examples_minecraft_column_pos_1_1__0.txt | 5 +- ...t_examples_minecraft_column_pos_1_2__0.txt | 5 +- ...nt_examples_minecraft_component_1_0__0.txt | 5 +- ...nt_examples_minecraft_component_1_1__0.txt | 5 +- ...nt_examples_minecraft_dimension_1_0__0.txt | 5 +- ...ument_examples_minecraft_entity_2_0__0.txt | 5 +- ...ument_examples_minecraft_entity_2_1__0.txt | 5 +- ...ument_examples_minecraft_entity_2_2__0.txt | 5 +- ...ument_examples_minecraft_entity_4_0__0.txt | 5 +- ...ument_examples_minecraft_entity_4_1__0.txt | 5 +- ...xamples_minecraft_entity_summon_1_0__0.txt | 5 +- ...xamples_minecraft_entity_summon_1_1__0.txt | 5 +- ..._examples_minecraft_float_range_1_0__0.txt | 5 +- ..._examples_minecraft_float_range_1_1__0.txt | 5 +- ...examples_minecraft_game_profile_1_0__0.txt | 5 +- ...examples_minecraft_game_profile_1_1__0.txt | 5 +- ...examples_minecraft_game_profile_1_2__0.txt | 5 +- ...nt_examples_minecraft_int_range_1_0__0.txt | 5 +- ...nt_examples_minecraft_int_range_1_1__0.txt | 5 +- ...nt_examples_minecraft_int_range_1_2__0.txt | 5 +- ...nt_examples_minecraft_int_range_1_3__0.txt | 5 +- ...nt_examples_minecraft_int_range_1_4__0.txt | 5 +- ...t_examples_minecraft_item_stack_1_0__0.txt | 5 +- ...ment_examples_minecraft_message_1_0__0.txt | 5 +- ...ples_minecraft_nbt_compound_tag_1_0__0.txt | 5 +- ...ent_examples_minecraft_nbt_path_1_0__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_0__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_10__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_11__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_12__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_13__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_14__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_15__0.txt | 5 +- ...ent_examples_minecraft_nbt_tag_1_16__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_1__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_2__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_3__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_4__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_5__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_6__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_7__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_8__0.txt | 5 +- ...ment_examples_minecraft_nbt_tag_1_9__0.txt | 5 +- ...nt_examples_minecraft_operation_1_0__0.txt | 5 +- ...ent_examples_minecraft_particle_1_0__0.txt | 5 +- ...ent_examples_minecraft_particle_1_1__0.txt | 5 +- ...ent_examples_minecraft_particle_1_2__0.txt | 5 +- ...ent_examples_minecraft_particle_1_3__0.txt | 5 +- ...ent_examples_minecraft_particle_1_4__0.txt | 5 +- ...ent_examples_minecraft_particle_1_5__0.txt | 5 +- ...ent_examples_minecraft_particle_1_6__0.txt | 5 +- ...les_minecraft_resource_location_1_0__0.txt | 5 +- ...ent_examples_minecraft_rotation_1_0__0.txt | 5 +- ...examples_minecraft_score_holder_2_0__0.txt | 5 +- ...examples_minecraft_score_holder_2_1__0.txt | 5 +- ...examples_minecraft_score_holder_2_2__0.txt | 5 +- ...examples_minecraft_score_holder_2_3__0.txt | 5 +- ...examples_minecraft_score_holder_2_4__0.txt | 5 +- ...examples_minecraft_score_holder_2_5__0.txt | 5 +- ...ment_examples_minecraft_swizzle_1_0__0.txt | 5 +- ...ment_examples_minecraft_swizzle_1_1__0.txt | 5 +- ...ment_examples_minecraft_swizzle_1_2__0.txt | 5 +- ...ment_examples_minecraft_swizzle_1_3__0.txt | 5 +- packages/mecha/tests/test_parse.py | 6 +- 114 files changed, 782 insertions(+), 384 deletions(-) create mode 100644 packages/mecha/mecha/contrib/__init__.py create mode 100644 packages/mecha/mecha/contrib/lint_basic.py create mode 100644 packages/mecha/mecha/diagnostic.py create mode 100644 packages/mecha/mecha/plugin.py diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 46ee1ae8c..1ae177088 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -4,11 +4,12 @@ from .api import * from .ast import * from .config import * +from .diagnostic import * from .dispatch import * from .error import * from .parse import * +from .plugin import * from .prototype import * from .resources import * from .serialize import * from .spec import * -from .utils import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index e8859db8a..e5a71ab0b 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -4,23 +4,39 @@ ] +import os from contextlib import contextmanager from dataclasses import InitVar, dataclass -from typing import Any, Iterator, Optional, Type, TypeVar, Union, overload +from pathlib import Path +from typing import ( + Any, + Dict, + Iterator, + List, + Literal, + Optional, + Type, + TypeVar, + Union, + overload, +) -from beet import Context, TextFile, TextFileBase -from beet.core.utils import JsonDict, extra_field +from beet import Context, DataPack, Function, TextFileBase +from beet.core.utils import FileSystemPath, JsonDict, extra_field from pydantic import BaseModel -from tokenstream import TokenStream +from tokenstream import InvalidSyntax, TokenStream +from tokenstream.location import set_location from .ast import AstNode, AstRoot from .config import CommandTree +from .diagnostic import Diagnostic, DiagnosticCollection, DiagnosticError from .dispatch import Dispatcher, MutatingReducer, Reducer from .parse import delegate, get_default_parsers from .serialize import Serializer from .spec import CommandSpec AstNodeType = TypeVar("AstNodeType", bound=AstNode) +TextFileType = TypeVar("TextFileType", bound=TextFileBase[Any]) class MechaOptions(BaseModel): @@ -28,6 +44,7 @@ class MechaOptions(BaseModel): version: str = "1.17" multiline: bool = False + rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} @dataclass @@ -38,12 +55,20 @@ class Mecha: version: InitVar[str] = "1.17" multiline: InitVar[bool] = False + directory: Path = extra_field(init=False) + spec: CommandSpec = extra_field(default=None) + lint: Dispatcher[AstNode] = extra_field(init=False) normalize: Dispatcher[AstNode] = extra_field(init=False) transform: Dispatcher[AstNode] = extra_field(init=False) + optimize: Dispatcher[AstNode] = extra_field(init=False) check: Dispatcher[AstNode] = extra_field(init=False) + + steps: List[Dispatcher[AstNode]] = extra_field(default_factory=list) + serialize: Dispatcher[str] = extra_field(init=False) + diagnostics: DiagnosticCollection = extra_field(init=False) def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): if ctx: @@ -51,6 +76,29 @@ def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): version = opts.version multiline = opts.multiline + self.directory = ctx.directory + + self.lint = Reducer(levels=opts.rules) + self.normalize = MutatingReducer(levels=opts.rules) + self.transform = MutatingReducer(levels=opts.rules) + self.optimize = MutatingReducer(levels=opts.rules) + self.check = Reducer(levels=opts.rules) + + else: + self.directory = Path.cwd() + + self.lint = Reducer() + self.normalize = MutatingReducer() + self.transform = MutatingReducer() + self.optimize = MutatingReducer() + self.check = Reducer() + + self.steps.append(self.lint) + self.steps.append(self.normalize) + self.steps.append(self.transform) + self.steps.append(self.optimize) + self.steps.append(self.check) + if not self.spec: self.spec = CommandSpec( multiline=multiline, @@ -58,10 +106,8 @@ def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): parsers=get_default_parsers(), ) - self.normalize = MutatingReducer() - self.transform = MutatingReducer() - self.check = Reducer() self.serialize = Serializer(self.spec) + self.diagnostics = DiagnosticCollection() @contextmanager def prepare_token_stream( @@ -82,9 +128,9 @@ def prepare_token_stream( @overload def parse( self, - source: Union[TextFileBase[Any], str], + source: Union[TextFileBase[Any], List[str], str], *, - filename: Optional[str] = None, + filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, provide: Optional[JsonDict] = None, @@ -94,22 +140,23 @@ def parse( @overload def parse( self, - source: Union[TextFileBase[Any], str], + source: Union[TextFileBase[Any], List[str], str], *, type: Type[AstNodeType], - filename: Optional[str] = None, + filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + provide: Optional[JsonDict] = None, ) -> AstNodeType: ... @overload def parse( self, - source: Union[TextFileBase[Any], str], + source: Union[TextFileBase[Any], List[str], str], *, using: str, - filename: Optional[str] = None, + filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, provide: Optional[JsonDict] = None, @@ -118,11 +165,11 @@ def parse( def parse( self, - source: Union[TextFileBase[Any], str], + source: Union[TextFileBase[Any], List[str], str], *, type: Optional[Type[AstNode]] = None, using: Optional[str] = None, - filename: Optional[str] = None, + filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, provide: Optional[JsonDict] = None, @@ -137,15 +184,124 @@ def parse( raise TypeError(f"No parser directly associated with {type}.") parser = type.parser - if isinstance(source, str): - source = TextFile(source) + if isinstance(source, (list, str)): + source = Function(source) if not filename and source.source_path: - filename = str(source.source_path) - - # TODO: Wrap errors in a clean FormattedPipelineException + filename = os.path.relpath(source.source_path, self.directory) stream = TokenStream(source.text) - with self.prepare_token_stream(stream, multiline=multiline): - with stream.provide(**provide or {}): - return delegate(parser, stream) + + try: + with self.prepare_token_stream(stream, multiline=multiline): + with stream.provide(**provide or {}): + return delegate(parser, stream) + except InvalidSyntax as exc: + d = Diagnostic( + level="error", + message=str(exc), + hint=resource_location, + filename=str(filename) if filename else None, + ) + raise DiagnosticError(DiagnosticCollection([set_location(d, exc)])) from exc + + @overload + def compile( + self, + source: DataPack, + *, + multiline: Optional[bool] = None, + report: Optional[DiagnosticCollection] = None, + ) -> DataPack: + ... + + @overload + def compile( + self, + source: TextFileType, + *, + filename: Optional[FileSystemPath] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, + report: Optional[DiagnosticCollection] = None, + ) -> TextFileType: + ... + + @overload + def compile( + self, + source: Union[List[str], str, AstNode], + *, + filename: Optional[FileSystemPath] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, + report: Optional[DiagnosticCollection] = None, + ) -> Function: + ... + + def compile( + self, + source: Union[DataPack, TextFileBase[Any], List[str], str, AstNode], + *, + filename: Optional[FileSystemPath] = None, + resource_location: Optional[str] = None, + multiline: Optional[bool] = None, + report: Optional[DiagnosticCollection] = None, + ) -> Union[DataPack, TextFileBase[Any]]: + if not filename and isinstance(source, TextFileBase) and source.source_path: + filename = os.path.relpath(source.source_path, self.directory) + + diagnostics = DiagnosticCollection( + hint=resource_location, + filename=str(filename) if filename else None, + ) + + if isinstance(source, DataPack): + result = source + + for path, function in list(source.functions.items()): + self.compile( + function, + resource_location=path, + multiline=multiline, + report=diagnostics, + ) + + else: + if isinstance(source, (list, str)): + source = Function(source) + if isinstance(source, TextFileBase): + result = source + else: + result = Function() + + ast = None + + if isinstance(source, AstNode): + ast = source + else: + try: + ast = self.parse( + source, + filename=filename, + resource_location=resource_location, + multiline=multiline, + ) + except DiagnosticError as exc: + diagnostics.extend(exc.diagnostics) + + if ast: + for compiler_pass in self.steps: + with compiler_pass.use_diagnostics(diagnostics): + ast = compiler_pass(ast) + + with self.serialize.use_diagnostics(diagnostics): + result.text = self.serialize(ast) + + if report: + report.extend(diagnostics) + else: + if errors := list(diagnostics.get_all_errors()): + raise DiagnosticError(DiagnosticCollection(errors)) + + return result diff --git a/packages/mecha/mecha/contrib/__init__.py b/packages/mecha/mecha/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/mecha/contrib/lint_basic.py b/packages/mecha/mecha/contrib/lint_basic.py new file mode 100644 index 000000000..658690ce4 --- /dev/null +++ b/packages/mecha/mecha/contrib/lint_basic.py @@ -0,0 +1,90 @@ +__all__ = [ + "BasicLinter", +] + + +from beet import Context +from tokenstream.location import set_location + +from mecha import ( + AstCommand, + AstSelector, + Diagnostic, + DiagnosticCollection, + Mecha, + Reducer, + rule, +) + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + mc.lint.extend(BasicLinter()) + + +class BasicLinter(Reducer): + """Linter with basic rules.""" + + @rule(AstCommand, identifier="execute:subcommand") + def execute_run(self, node: AstCommand): + if isinstance(clause := node.arguments[0], AstCommand): + if clause.identifier == "execute:run:subcommand": + d = Diagnostic("warn", "Redundant `execute run` clause.") + raise set_location(d, node, clause.arguments[0].location) + + @rule(AstCommand, identifier="execute:run:subcommand") + def run_execute(self, node: AstCommand): + if isinstance(clause := node.arguments[0], AstCommand): + if clause.identifier == "execute:subcommand": + d = Diagnostic("warn", "Redundant `run execute` clause.") + raise set_location(d, node, clause.arguments[0].location) + + @rule(AstSelector) + def selector_argument_order(self, node: AstSelector): + order = [ + "type", + "gamemode", + "inverted gamemode", + "team", + "inverted team", + "inverted type", + "tag", + "inverted tag", + "name", + "inverted name", + "scores", + "predicate", + "inverted predicate", + "advancements", + "nbt", + ] + conflict = [-1] * len(order) + + with DiagnosticCollection() as diagnostics: + for i, arg in enumerate(node.arguments): + name = "inverted " * arg.inverted + arg.key.value + + try: + index = order.index(name) + except ValueError: + continue + + j = conflict[index] + + if j >= 0: + bad_arg = node.arguments[j] + bad_arg_name = "inverted " * bad_arg.inverted + bad_arg.key.value + + d = Diagnostic( + level="warn", + message=f"{name.capitalize()} argument should go before {bad_arg_name}.", + ) + + bad_arg_message = f"Specifying the {bad_arg_name} argument before {name} leads to unnecessary processing." + d.labels[bad_arg] = bad_arg_message + + diagnostics.add(set_location(d, arg)) + + for conflict_index in range(index): + if conflict[conflict_index] < 0: + conflict[conflict_index] = i diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py new file mode 100644 index 000000000..8c318c1b3 --- /dev/null +++ b/packages/mecha/mecha/diagnostic.py @@ -0,0 +1,156 @@ +__all__ = [ + "Diagnostic", + "DiagnosticCollection", + "DiagnosticLabelContainer", + "DiagnosticError", +] + + +from dataclasses import dataclass, field, replace +from types import TracebackType +from typing import Any, Iterator, List, Literal, Optional, Type + +from beet import Container, FormattedPipelineException +from tokenstream import UNKNOWN_LOCATION, SourceLocation + + +class DiagnosticLabelContainer(Container[Any, str]): + """Container for diagnostic labels.""" + + def normalize_key(self, key: Any) -> Any: + if isinstance(key, SourceLocation): + return key, key + + location = getattr(key, "location", None) + end_location = getattr(key, "end_location", None) + + if location and end_location: + return location, end_location + + return key + + +@dataclass +class Diagnostic(Exception): + """Exception that can be raised to report messages.""" + + level: Literal["info", "warn", "error"] + message: str + + rule: Optional[str] = None + hint: Optional[str] = None + filename: Optional[str] = None + location: SourceLocation = UNKNOWN_LOCATION + end_location: SourceLocation = UNKNOWN_LOCATION + labels: DiagnosticLabelContainer = field(default_factory=DiagnosticLabelContainer) + + def __str__(self) -> str: + return self.format_message() + + def format_message(self) -> str: + """Return the formatted message.""" + message = self.message + if self.rule: + message += f" ({self.rule})" + return message + + def format_location(self) -> str: + """Return the formatted location of the reported message.""" + if self.filename: + location = self.filename + if not self.location.unknown: + location += f":{self.location.lineno}:{self.location.colno}" + elif not self.location.unknown: + location = f"line {self.location.lineno}, column {self.location.colno}" + if self.hint: + location = f'File "{self.hint}", {location}' + elif self.hint: + location = self.hint + else: + location = "" + + return location + + def with_defaults( + self, + rule: Optional[str] = None, + hint: Optional[str] = None, + filename: Optional[str] = None, + ) -> "Diagnostic": + """Set default values for unspecified attributes.""" + return replace( + self, + rule=self.rule or rule, + hint=self.hint or hint, + filename=self.filename or filename, + ) + + +@dataclass +class DiagnosticCollection(Exception): + """Exception that can be raised to group multiple diagnostics.""" + + exceptions: List[Diagnostic] = field(default_factory=list) + + rule: Optional[str] = None + hint: Optional[str] = None + filename: Optional[str] = None + + def add(self, exc: Diagnostic) -> Diagnostic: + """Add diagnostic.""" + exc = exc.with_defaults(rule=self.rule, hint=self.hint, filename=self.filename) + self.exceptions.append(exc) + return exc + + def extend(self, other: "DiagnosticCollection"): + """Combine diagnostics from another collection.""" + self.exceptions.extend(other.exceptions) + + def get_all_errors(self) -> Iterator[Diagnostic]: + """Yield all the diagnostics with a severity level of "error".""" + for exc in self.exceptions: + if exc.level == "error": + yield exc + + def __enter__(self) -> "DiagnosticCollection": + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ): + if not exc_type: + if self.exceptions: + raise self + + def __str__(self) -> str: + term = ( + "error" + if all(exc.level == "error" for exc in self.exceptions) + else "diagnostic" + ) + term += "s" * (len(self.exceptions) > 1) + return f"Reported {len(self.exceptions)} {term}." + + +class DiagnosticError(FormattedPipelineException): + """Wrap a collection of error diagnostics to abort the build.""" + + diagnostics: DiagnosticCollection + + def __init__(self, diagnostics: DiagnosticCollection, show_details: bool = True): + super().__init__(diagnostics) + self.diagnostics = diagnostics + + if show_details: + details = "\n".join( + f"{diagnostic.format_location()}: {diagnostic.format_message()}" + for diagnostic in diagnostics.exceptions + ) + self.message = f"{diagnostics}\n\n{details}" + else: + self.message = str(diagnostics) + + self.format_cause = True diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index dbd44de8c..19fc37936 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -8,6 +8,7 @@ ] +from contextlib import contextmanager from dataclasses import dataclass, fields, replace from functools import partial from heapq import heappop, heappush @@ -21,6 +22,7 @@ Iterable, Iterator, List, + Literal, Optional, Set, Tuple, @@ -33,6 +35,7 @@ from beet.core.utils import extra_field from .ast import AstChildren, AstNode +from .diagnostic import Diagnostic, DiagnosticCollection T = TypeVar("T") @@ -45,24 +48,35 @@ class Rule: match_types: Tuple[Type[AstNode], ...] = () match_fields: FrozenSet[Tuple[str, Any]] = frozenset() + name: Optional[str] = None next: Optional["Rule"] = None def __post_init__(self): if isinstance(self.callback, Rule): self.next = self.callback self.callback = self.next.callback + if not self.name: + self.name = ( + self.next.name + if self.next + else getattr(self.callback, "__name__", None) + ) def __call__(self, *args: Any, **kwargs: Any) -> Any: return self.callback(*args, **kwargs) - def bake(self, *args: Any, **kwargs: Any) -> "Rule": - """Bake arguments.""" + def with_callback(self, callback: Callable[..., Any]) -> "Rule": + """Recursively update callback.""" return replace( self, - callback=partial(self.callback, *args, **kwargs), - next=self.next.bake(*args, **kwargs) if self.next else None, + callback=callback, + next=self.next.with_callback(callback) if self.next else None, ) + def bake(self, *args: Any, **kwargs: Any) -> "Rule": + """Bake arguments.""" + return self.with_callback(partial(self.callback, *args, **kwargs)) + @overload def rule(func: Callable[..., Any]) -> Rule: @@ -70,10 +84,7 @@ def rule(func: Callable[..., Any]) -> Rule: @overload -def rule( - *args: Type[AstNode], - **kwargs: Any, -) -> Callable[[Callable[..., Any]], Rule]: +def rule(*args: Type[AstNode], **kwargs: Any) -> Callable[[Callable[..., Any]], Rule]: ... @@ -98,15 +109,22 @@ def decorator(func: Callable[..., Any]) -> Callable[..., Any]: class Dispatcher(Generic[T]): """Ast dispatcher.""" + levels: Dict[str, Literal["ignore", "info", "warn", "error"]] = extra_field( + default_factory=dict + ) + rules: Dict[ Type[Any], Dict[ FrozenSet[Tuple[str, Any]], - List[Tuple[int, Callable[..., Any]]], + List[Tuple[int, Optional[str], Callable[..., Any]]], ], ] = extra_field(init=False, default_factory=dict) count: int = extra_field(init=False, default=0) + diagnostics: DiagnosticCollection = extra_field( + default_factory=DiagnosticCollection + ) def __post_init__(self): for name in dir(self): @@ -118,9 +136,12 @@ def add_rule(self, rule: Callable[..., Any]): if not isinstance(rule, Rule): rule = Rule(rule) + if rule.name and self.levels.get(rule.name) == "ignore": + return + for match_type in rule.match_types or [AstNode]: l = self.rules.setdefault(match_type, {}).setdefault(rule.match_fields, []) - l.append((self.count, rule.callback)) + l.append((self.count, rule.name, rule.callback)) self.count += 1 if rule.next: @@ -138,23 +159,33 @@ def extend( for arg in args: if isinstance(arg, Dispatcher): offset = self.count + for key, value in arg.rules.items(): current = self.rules.setdefault(key, {}) + for match_fields, callbacks in value.items(): l = current.setdefault(match_fields, []) - for priority, callback in callbacks: + + for priority, name, callback in callbacks: + if name and self.levels.get(name) == "ignore": + continue priority += offset - l.append((priority, callback)) + l.append((priority, name, callback)) self.count = max(self.count, priority) + 1 + elif callable(arg): self.add_rule(arg) + else: for rule in arg: self.add_rule(rule) - def dispatch(self, node: AstNode) -> Iterator[Callable[..., Any]]: + def dispatch( + self, + node: AstNode, + ) -> Iterator[Tuple[Optional[str], Callable[..., Any]]]: """Dispatch rules.""" - priority_queue: List[Tuple[int, int, Callable[..., Any]]] = [] + priority_queue: List[Tuple[int, int, Optional[str], Callable[..., Any]]] = [] for i, node_type in enumerate(type(node).mro()): if value := self.rules.get(node_type): @@ -165,24 +196,55 @@ def dispatch(self, node: AstNode) -> Iterator[Callable[..., Any]]: else hasattr(node, name) and getattr(node, name) == value for name, value in match_fields ): - for priority, callback in callbacks: - heappush(priority_queue, (i, -priority, callback)) + for priority, name, callback in callbacks: + heappush(priority_queue, (i, -priority, name, callback)) dispatched: Set[Callable[..., Any]] = set() while priority_queue: - _, _, callback = heappop(priority_queue) + _, _, name, callback = heappop(priority_queue) if callback not in dispatched: dispatched.add(callback) - yield callback + yield name, callback def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: """Invoke rules on the given ast node.""" - for rule in self.dispatch(node): - rule(node, *args, **kwargs) + for name, rule in self.dispatch(node): + with self.use_rule(name): + rule(node, *args, **kwargs) return node + @contextmanager + def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: + """Temporarily gather diagnostics in the specified diagnostic collection.""" + previous_diagnostics = self.diagnostics + self.diagnostics = diagnostics + + try: + yield + finally: + self.diagnostics = previous_diagnostics + + @contextmanager + def use_rule(self, name: Optional[str] = None) -> Iterator[None]: + """Handle rule diagnostics.""" + override_level = self.levels.get(name or "") + if override_level == "ignore": + override_level = None + + try: + yield + except Diagnostic as diagnostic: + if override_level: + diagnostic.level = override_level + self.diagnostics.add(diagnostic.with_defaults(rule=name)) + except DiagnosticCollection as diagnostic: + for diagnostic in diagnostic.exceptions: + if override_level: + diagnostic.level = override_level + self.diagnostics.add(diagnostic.with_defaults(rule=name)) + def __call__(self, node: AstNode) -> T: return self.invoke(node) @@ -194,23 +256,29 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: rules = list(self.dispatch(node)) if rules: - result = rules[0](node, *args, **kwargs) + name, rule = rules[0] else: - result = (child for child in node) + name, rule = None, None + + result = None - if isinstance(result, Generator): - try: - child = next(result) - except StopIteration as exc: - return exc.value + with self.use_rule(name): + result = rule(node, *args, **kwargs) if rule else (child for child in node) - while True: - feedback = self.invoke(child, *args, **kwargs) + if isinstance(result, Generator): try: - child = result.send(feedback) + with self.use_rule(name): + child = next(result) except StopIteration as exc: return exc.value + while True: + feedback = self.invoke(child, *args, **kwargs) + try: + child = result.send(feedback) + except StopIteration as exc: + return exc.value + return result @@ -220,11 +288,7 @@ class Reducer(Dispatcher[Any]): def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: for child in node: self.invoke(child, *args, **kwargs) - - for rule in self.dispatch(node): - rule(node, *args, **kwargs) - - return node + return super().invoke(node, *args, **kwargs) class MutatingReducer(Dispatcher[Any]): @@ -245,10 +309,10 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: to_replace[f.name] = result if to_replace: - print("replacing", list(to_replace)) node = replace(node, **to_replace) - for rule in self.dispatch(node): - node = rule(node, *args, **kwargs) + for name, rule in self.dispatch(node): + with self.use_rule(name): + node = rule(node, *args, **kwargs) return node diff --git a/packages/mecha/mecha/plugin.py b/packages/mecha/mecha/plugin.py new file mode 100644 index 000000000..f0ddd4f7d --- /dev/null +++ b/packages/mecha/mecha/plugin.py @@ -0,0 +1,35 @@ +__all__ = [ + "beet_default", +] + + +import logging + +from beet import Context + +from .api import Mecha +from .diagnostic import DiagnosticCollection, DiagnosticError + +logger = logging.getLogger("mecha") + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + + mc.compile(ctx.data, report=mc.diagnostics) + + yield + + for diagnostic in mc.diagnostics.exceptions: + message = diagnostic.format_message() + args = {"annotate": diagnostic.format_location()} + + if diagnostic.level == "error": + logger.error(message, args) + elif diagnostic.level == "warn": + logger.warn(message, args) + elif diagnostic.level == "info": + logger.info(message, args) + + if errors := list(mc.diagnostics.get_all_errors()): + raise DiagnosticError(DiagnosticCollection(errors), show_details=False) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 07ade8ef5..d0617a13a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.2" +version = "0.41.6" description = "The Minecraft pack development kit" category = "main" optional = false @@ -682,7 +682,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.2.0" +version = "1.2.1" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f44c8594622ec900b99881ee13622f5760ec618a3b7af3854d0c2e79c9d3f0e5" +content-hash = "03708e6b78c994662da52d620cebf77e671e9e93f9c2b94a5fc9fea9f62b6178" [metadata.files] atomicwrites = [ @@ -812,8 +812,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.2-py3-none-any.whl", hash = "sha256:4e14f2bf8c4c14d3d75ec66e67bb228ac84213c87d33de2f8866cb3eb0f6c700"}, - {file = "beet-0.41.2.tar.gz", hash = "sha256:dfa6875613dc904e84b25621ddb573fd21f80db621341a8fb8a0ddc10f2c93e4"}, + {file = "beet-0.41.6-py3-none-any.whl", hash = "sha256:b32fa4bff9af6ce3fa2f3838b8ea105c7b681a2aefb9c8df18b69bb082984396"}, + {file = "beet-0.41.6.tar.gz", hash = "sha256:3d54a8ce699c60e8487cae7502165b60e905052f7d75409f585317b79668d798"}, ] black = [ {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, @@ -1249,8 +1249,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.2.0-py3-none-any.whl", hash = "sha256:2f324be5a8499c469a02cb51507fbf2fa0b59e0c16795740a471e6b84bac7c5d"}, - {file = "tokenstream-1.2.0.tar.gz", hash = "sha256:499bc7d0d8a4577eeecfe9a25673abe0f4fe1dd5f92c20669b9879a16464d55e"}, + {file = "tokenstream-1.2.1-py3-none-any.whl", hash = "sha256:890ec7774c7f3cc1c604a2845788176c93f5910b4161f376f1bf8be9fe634c55"}, + {file = "tokenstream-1.2.1.tar.gz", hash = "sha256:f4fe2f58b25e598f069f32bc13034485f1f69840a480cfb2a8188c2a2a1572c2"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9f376e1e8..c7a6358cf 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,8 +23,8 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.41.2" -tokenstream = "^1.2.0" +beet = ">=0.41.6" +tokenstream = "^1.2.1" [tool.poetry.dev-dependencies] black = "^21.8b0" diff --git a/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt b/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt index cc5b25432..35dd26f69 100644 --- a/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt +++ b/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt @@ -28,7 +28,6 @@ value: 'registered' greet @a[tag=!registered] -replacing ['commands'] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=47, lineno=5, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt index 0d67e5a1d..9a2367a6a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt @@ -4,7 +4,6 @@ brigadier:bool 1 0 --- blob --- -UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'blob'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected literal 'true' or literal 'false' but got literal 'blob'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt index bedafd18d..2f73a60f8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt @@ -4,7 +4,6 @@ brigadier:bool 1 1 --- thing --- -UnexpectedToken: Expected literal 'true' or literal 'false' but got literal 'thing'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected literal 'true' or literal 'false' but got literal 'thing'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt index facf6c642..384927fff 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_0__0.txt @@ -4,7 +4,6 @@ brigadier:double 1 0 --- ayy --- -UnexpectedToken: Expected number but got literal 'ayy'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected number but got literal 'ayy'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt index a26c97299..ec266dd0b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_1__0.txt @@ -4,7 +4,6 @@ brigadier:double 1 1 --- -3 --- -InvalidSyntax: Expected value to be at least 7. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected value to be at least 7. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt index 001e6f29c..1a6e9c124 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_2__0.txt @@ -4,7 +4,6 @@ brigadier:double 1 2 --- 0.5 --- -InvalidSyntax: Expected value to be at least 7. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected value to be at least 7. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt index b19daeb9d..7443d74d6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_double_1_3__0.txt @@ -4,7 +4,6 @@ brigadier:double 1 3 --- 100 --- -InvalidSyntax: Expected value to be at most 15. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected value to be at most 15. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt index 8062321a3..ec1dcc32f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_0__0.txt @@ -4,7 +4,6 @@ brigadier:float 1 0 --- foo --- -UnexpectedToken: Expected number but got literal 'foo'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected number but got literal 'foo'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt index 82569d8f0..46c8335e8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_1__0.txt @@ -4,7 +4,6 @@ brigadier:float 1 1 --- -3 --- -InvalidSyntax: Expected value to be at least 7. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected value to be at least 7. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt index cdccbe1c6..379dbcc73 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_2__0.txt @@ -4,7 +4,6 @@ brigadier:float 1 2 --- 0.5 --- -InvalidSyntax: Expected value to be at least 7. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected value to be at least 7. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt index 7bcfadd52..46eb315d0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_float_1_3__0.txt @@ -4,7 +4,6 @@ brigadier:float 1 3 --- 100 --- -InvalidSyntax: Expected value to be at most 15. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected value to be at most 15. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt index d9018eef6..d54c0f21c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_0__0.txt @@ -4,7 +4,6 @@ brigadier:integer 1 0 --- yolo --- -UnexpectedToken: Expected number but got literal 'yolo'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected number but got literal 'yolo'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt index 17088837e..14030c005 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_1__0.txt @@ -4,7 +4,6 @@ brigadier:integer 1 1 --- -3 --- -InvalidSyntax: Expected value to be at least 7. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected value to be at least 7. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt index e11665e26..4e9e85b7e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_2__0.txt @@ -4,7 +4,6 @@ brigadier:integer 1 2 --- 0.5 --- -InvalidSyntax: Expected integer value. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected integer value. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt index 25066f289..71a646d79 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_3__0.txt @@ -4,7 +4,6 @@ brigadier:integer 1 3 --- 100 --- -InvalidSyntax: Expected value to be at most 15. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected value to be at most 15. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt index b18ff9146..9bfb4fe0b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_integer_1_4__0.txt @@ -4,7 +4,6 @@ brigadier:integer 1 4 --- 11.1 --- -InvalidSyntax: Expected integer value. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file +line 1, column 1: Expected integer value. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt index 107aac49b..2f1c8d518 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_0__0.txt @@ -4,7 +4,6 @@ brigadier:long 1 0 --- -3 --- -InvalidSyntax: Expected value to be at least 7. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected value to be at least 7. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt index 9d4a27ea9..459b23452 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_1__0.txt @@ -4,7 +4,6 @@ brigadier:long 1 1 --- 0.5 --- -InvalidSyntax: Expected integer value. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected integer value. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt index 415b2acc5..2fff39500 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_2__0.txt @@ -4,7 +4,6 @@ brigadier:long 1 2 --- 100 --- -InvalidSyntax: Expected value to be at most 15. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected value to be at most 15. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt index 4f0646803..eb2b222fd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_long_1_3__0.txt @@ -4,7 +4,6 @@ brigadier:long 1 3 --- 11.1 --- -InvalidSyntax: Expected integer value. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file +line 1, column 1: Expected integer value. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt index 71303d6d2..b29810050 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:angle 1 0 --- ^-3 --- -InvalidSyntax: Specifying local coordinates not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Specifying local coordinates not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt index c3642a767..4c28ab548 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_angle_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:angle 1 1 --- wat --- -UnexpectedToken: Expected coordinate but got literal 'wat'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected coordinate but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt index 74345ebfd..a4432e119 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:block_pos 1 0 --- ^-3 --- -UnexpectedToken: Expected coordinate but got eof. +Reported 1 error. -location = SourceLocation(pos=3, lineno=1, colno=4) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 4: Expected coordinate but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt index c71fc355a..1a58206cf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:block_pos 1 1 --- wat --- -UnexpectedToken: Expected coordinate but got literal 'wat'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected coordinate but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt index 4d658151a..90b25e2f4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:block_pos 1 2 --- 17 --- -UnexpectedToken: Expected coordinate but got eof. +Reported 1 error. -location = SourceLocation(pos=2, lineno=1, colno=3) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 3: Expected coordinate but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt index 19dc165d0..c744ac9ac 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_pos_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:block_pos 1 3 --- {} --- -UnexpectedToken: Expected coordinate but got literal '{}'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected coordinate but got literal '{}'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt index b9a84f886..1a872531b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:block_predicate 1 0 --- {} --- -UnexpectedToken: Expected resource_location but got literal '{}'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected resource_location but got literal '{}'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt index d0f7ba3e3..2261c3703 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:block_predicate 1 1 --- #stone[foo=bar, --- -UnexpectedEOF: Expected word or quoted_string but reached end of file. +Reported 1 error. -location = SourceLocation(pos=15, lineno=1, colno=16) -end_location = SourceLocation(pos=15, lineno=1, colno=16) \ No newline at end of file +line 1, column 16: Expected word or quoted_string but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt index a3ea789d2..f8066a579 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:block_predicate 1 2 --- #stone[ --- -UnexpectedEOF: Expected word or quoted_string but reached end of file. +Reported 1 error. -location = SourceLocation(pos=7, lineno=1, colno=8) -end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file +line 1, column 8: Expected word or quoted_string but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt index 40f3917b2..4c88bb350 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:block_predicate 1 3 --- #stone[foo --- -UnexpectedToken: Expected equal but got eof. +Reported 1 error. -location = SourceLocation(pos=10, lineno=1, colno=11) -end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file +line 1, column 11: Expected equal but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt index f06a30b5e..a9b998c39 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt @@ -4,7 +4,6 @@ minecraft:block_predicate 1 4 --- #stone[thing=hello]{ --- -UnexpectedToken: Expected curly '}' but got eof. +Reported 1 error. -location = SourceLocation(pos=20, lineno=1, colno=21) -end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file +line 1, column 21: Expected curly '}' but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt index 55e07bcbe..50b588243 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_5__0.txt @@ -4,7 +4,6 @@ minecraft:block_predicate 1 5 --- #stone[thing=hello]{what:is:that} --- -UnexpectedToken: Expected curly '}' but got colon ':'. +Reported 1 error. -location = SourceLocation(pos=27, lineno=1, colno=28) -end_location = SourceLocation(pos=27, lineno=1, colno=28) \ No newline at end of file +line 1, column 28: Expected curly '}' but got colon ':'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt index c27f08f4d..45868be89 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 0 --- {} --- -UnexpectedToken: Expected resource_location but got literal '{}'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected resource_location but got literal '{}'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt index 211af7bd4..be47a4549 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 1 --- #stone[foo=bar, --- -InvalidSyntax: Specifying a tag is not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt index e74f03840..46c9ebb89 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 2 --- stone[foo=bar, --- -UnexpectedEOF: Expected word or quoted_string but reached end of file. +Reported 1 error. -location = SourceLocation(pos=14, lineno=1, colno=15) -end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file +line 1, column 15: Expected word or quoted_string but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt index 937030ed3..b0570ea5e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 3 --- stone[ --- -UnexpectedEOF: Expected word or quoted_string but reached end of file. +Reported 1 error. -location = SourceLocation(pos=6, lineno=1, colno=7) -end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file +line 1, column 7: Expected word or quoted_string but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt index 4fa6fd64f..808f6b5b7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_4__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 4 --- stone[foo --- -UnexpectedToken: Expected equal but got eof. +Reported 1 error. -location = SourceLocation(pos=9, lineno=1, colno=10) -end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file +line 1, column 10: Expected equal but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt index eb5493b5d..bc77b0c3e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 5 --- stone[thing=hello]{ --- -UnexpectedToken: Expected curly '}' but got eof. +Reported 1 error. -location = SourceLocation(pos=19, lineno=1, colno=20) -end_location = SourceLocation(pos=19, lineno=1, colno=20) \ No newline at end of file +line 1, column 20: Expected curly '}' but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt index d838e2d33..c81509721 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_6__0.txt @@ -4,7 +4,6 @@ minecraft:block_state 1 6 --- stone[thing=hello]{what:is:that} --- -UnexpectedToken: Expected curly '}' but got colon ':'. +Reported 1 error. -location = SourceLocation(pos=26, lineno=1, colno=27) -end_location = SourceLocation(pos=26, lineno=1, colno=27) \ No newline at end of file +line 1, column 27: Expected curly '}' but got colon ':'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt index 320577d93..0f1ca28f2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:color 1 0 --- creeper --- -InvalidSyntax: Unexpected value 'creeper'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file +line 1, column 1: Unexpected value 'creeper'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt index 5d004ff95..2b5345feb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:column_pos 1 0 --- 7 --- -UnexpectedToken: Expected coordinate but got eof. +Reported 1 error. -location = SourceLocation(pos=1, lineno=1, colno=2) -end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file +line 1, column 2: Expected coordinate but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt index 3b227ec31..fbab13364 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:column_pos 1 1 --- ^7 --- -InvalidSyntax: Specifying local coordinates not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Specifying local coordinates not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt index a7f8e6618..662db9398 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_column_pos_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:column_pos 1 2 --- @ --- -UnexpectedToken: Expected coordinate but got literal '@'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected coordinate but got literal '@'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt index ac365fd27..96cac8e58 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:component 1 0 --- wat --- -UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got literal 'wat'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt index 48492c697..189d8c7b5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:component 1 1 --- {"hey": ]} --- -UnexpectedToken: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']'. +Reported 1 error. -location = SourceLocation(pos=7, lineno=1, colno=8) -end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file +line 1, column 8: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt index 2ff4acb80..a4ecdcbf4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:dimension 1 0 --- #minecraft:overworld --- -InvalidSyntax: Specifying a tag is not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt index 2aef2931d..744e63070 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_0__0.txt @@ -4,7 +4,6 @@ minecraft:entity 2 0 --- @e --- -InvalidSyntax: Expected player-type entity selector. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected player-type entity selector. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt index a60ce9803..d38a31353 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_1__0.txt @@ -4,7 +4,6 @@ minecraft:entity 2 1 --- @e[type=foo] --- -InvalidSyntax: Expected player-type entity selector. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=12, lineno=1, colno=13) \ No newline at end of file +line 1, column 1: Expected player-type entity selector. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt index 3e34097e9..24892a10a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt @@ -4,7 +4,6 @@ minecraft:entity 2 2 --- @a[ gamemode = creative , gamemode = unknown , ] --- -InvalidSyntax: Unexpected value 'unknown'. +Reported 1 error. -location = SourceLocation(pos=37, lineno=1, colno=38) -end_location = SourceLocation(pos=44, lineno=1, colno=45) \ No newline at end of file +line 1, column 38: Unexpected value 'unknown'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt index ccb800fce..86a2eadbc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_0__0.txt @@ -4,7 +4,6 @@ minecraft:entity 4 0 --- @r[limit=7] --- -InvalidSyntax: Expected entity selector targeting a single entity. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=11, lineno=1, colno=12) \ No newline at end of file +line 1, column 1: Expected entity selector targeting a single entity. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt index 915bcf246..706d868f9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_4_1__0.txt @@ -4,7 +4,6 @@ minecraft:entity 4 1 --- @a[tag=!foo] --- -InvalidSyntax: Expected entity selector targeting a single entity. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=12, lineno=1, colno=13) \ No newline at end of file +line 1, column 1: Expected entity selector targeting a single entity. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt index 4e4e2629e..12cab0466 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:entity_summon 1 0 --- #minecraft:pig --- -InvalidSyntax: Specifying a tag is not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt index 4fa4700b2..3be55cf99 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:entity_summon 1 1 --- #cow --- -InvalidSyntax: Specifying a tag is not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt index ec37b43f5..d13158922 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:float_range 1 0 --- .. --- -UnexpectedToken: Expected range but got literal '..'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected range but got literal '..'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt index ec620df38..7884effa6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:float_range 1 1 --- wat --- -UnexpectedToken: Expected range but got literal 'wat'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected range but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt index 8505c2c39..9908b89da 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:game_profile 1 0 --- @e --- -InvalidSyntax: Expected player-type entity selector. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected player-type entity selector. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt index fe819443b..72922e836 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:game_profile 1 1 --- @s[type=cow] --- -InvalidSyntax: Expected player-type entity selector. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=12, lineno=1, colno=13) \ No newline at end of file +line 1, column 1: Expected player-type entity selector. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt index 6822c68be..d6038ac4b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:game_profile 1 2 --- @e[type=!player] --- -InvalidSyntax: Expected player-type entity selector. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file +line 1, column 1: Expected player-type entity selector. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt index 069d094e5..283a199f6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:int_range 1 0 --- 0..5.2 --- -InvalidSyntax: Expected integer range. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file +line 1, column 1: Expected integer range. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt index 8178cb444..7c914f233 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:int_range 1 1 --- 0.7 --- -InvalidSyntax: Expected integer range. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Expected integer range. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt index c91492f36..f262f8421 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:int_range 1 2 --- -5.4 --- -InvalidSyntax: Expected integer range. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file +line 1, column 1: Expected integer range. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt index efb99a517..596054dee 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:int_range 1 3 --- -100.76.. --- -InvalidSyntax: Expected integer range. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file +line 1, column 1: Expected integer range. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt index c30834fc4..53e35d0d5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_1_4__0.txt @@ -4,7 +4,6 @@ minecraft:int_range 1 4 --- ..100.4 --- -InvalidSyntax: Expected integer range. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=7, lineno=1, colno=8) \ No newline at end of file +line 1, column 1: Expected integer range. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt index e9d6828c8..69d100520 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:item_stack 1 0 --- #minecraft:stone --- -InvalidSyntax: Specifying a tag is not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt index 836bb9f2a..ea4664011 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:message 1 0 --- Hello @p[team=winner :) --- -UnexpectedToken: Expected bracket ']' but got literal ':)'. +Reported 1 error. -location = SourceLocation(pos=20, lineno=1, colno=21) -end_location = SourceLocation(pos=20, lineno=1, colno=21) \ No newline at end of file +line 1, column 21: Expected bracket ']' but got literal ':)'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt index 3091cce58..cd9b727c9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_compound_tag_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_compound_tag 1 0 --- [{foo:bar}] --- -InvalidSyntax: Expected nbt compound. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=11, lineno=1, colno=12) \ No newline at end of file +line 1, column 1: Expected nbt compound. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt index 1973fcfab..bc0af67d6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_path 1 0 --- {foo:bar foo:bar} --- -UnexpectedToken: Expected curly '}' but got string 'foo'. +Reported 1 error. -location = SourceLocation(pos=8, lineno=1, colno=9) -end_location = SourceLocation(pos=8, lineno=1, colno=9) \ No newline at end of file +line 1, column 9: Expected curly '}' but got string 'foo'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt index cc3917a8a..3b251b78e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 0 --- "\" --- -UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\"'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt index 9ade7cc10..a9a6afc86 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 10 --- {with space: 5} --- -UnexpectedToken: Expected colon but got string 'space'. +Reported 1 error. -location = SourceLocation(pos=5, lineno=1, colno=6) -end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file +line 1, column 6: Expected colon but got string 'space'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt index eb7082d5f..66e8d7561 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 11 --- {\": no} --- -UnexpectedToken: Expected curly '}' but got literal '\\":'. +Reported 1 error. -location = SourceLocation(pos=1, lineno=1, colno=2) -end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file +line 1, column 2: Expected curly '}' but got literal '\\":'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt index 80cfb9277..c6b81fb82 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_12__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 12 --- {foo: [1,2} --- -UnexpectedToken: Expected bracket ']' but got curly '}'. +Reported 1 error. -location = SourceLocation(pos=10, lineno=1, colno=11) -end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file +line 1, column 11: Expected bracket ']' but got curly '}'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt index fff8c1856..cf86a0a93 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_13__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 13 --- {error: [test]]} --- -UnexpectedToken: Expected curly '}' but got bracket ']'. +Reported 1 error. -location = SourceLocation(pos=14, lineno=1, colno=15) -end_location = SourceLocation(pos=14, lineno=1, colno=15) \ No newline at end of file +line 1, column 15: Expected curly '}' but got bracket ']'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt index dcc9fd78b..6efd62d27 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 14 --- [{,{}] --- -UnexpectedToken: Expected curly '}' but got comma ','. +Reported 1 error. -location = SourceLocation(pos=2, lineno=1, colno=3) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 3: Expected curly '}' but got comma ','. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt index 3932a7ac8..f078fba56 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 15 --- "\'" --- -InvalidSyntax: Invalid escape sequence "\\'". +Reported 1 error. -location = SourceLocation(pos=1, lineno=1, colno=2) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 2: Invalid escape sequence "\\'". \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt index e0aae6cf3..ea0a4cdb3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 16 --- '\"' --- -InvalidSyntax: Invalid escape sequence '\\"'. +Reported 1 error. -location = SourceLocation(pos=1, lineno=1, colno=2) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 2: Invalid escape sequence '\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt index a62a42581..887b17b6c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 1 --- "\n" --- -InvalidSyntax: Invalid escape sequence '\\n'. +Reported 1 error. -location = SourceLocation(pos=1, lineno=1, colno=2) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 2: Invalid escape sequence '\\n'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt index d144286ef..0ed6ce4a9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 2 --- "\\\" --- -UnexpectedToken: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\\\\\"'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=0, lineno=1, colno=1) \ No newline at end of file +line 1, column 1: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\\\\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt index 183eea134..31239cd10 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 3 --- {"\":1} --- -UnexpectedToken: Expected curly '}' but got literal '"\\":1}'. +Reported 1 error. -location = SourceLocation(pos=1, lineno=1, colno=2) -end_location = SourceLocation(pos=1, lineno=1, colno=2) \ No newline at end of file +line 1, column 2: Expected curly '}' but got literal '"\\":1}'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt index 6fb349fde..40f016767 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_4__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 4 --- [a,1] --- -InvalidSyntax: Expected all elements to have the same type. +Reported 1 error. -location = SourceLocation(pos=3, lineno=1, colno=4) -end_location = SourceLocation(pos=4, lineno=1, colno=5) \ No newline at end of file +line 1, column 4: Expected all elements to have the same type. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt index 0f0fa1bc6..3b58a5828 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_5__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 5 --- [[],[],1b] --- -InvalidSyntax: Expected all elements to have the same type. +Reported 1 error. -location = SourceLocation(pos=7, lineno=1, colno=8) -end_location = SourceLocation(pos=9, lineno=1, colno=10) \ No newline at end of file +line 1, column 8: Expected all elements to have the same type. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt index 584ec6388..524136c5a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_6__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 6 --- [B;5l,4l,3] --- -InvalidSyntax: Expected all elements to be bytes. +Reported 1 error. -location = SourceLocation(pos=3, lineno=1, colno=4) -end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file +line 1, column 4: Expected all elements to be bytes. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt index b236182ad..d38c65d0f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_7__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 7 --- [I;5l,4l,3] --- -InvalidSyntax: Expected all elements to be integers. +Reported 1 error. -location = SourceLocation(pos=3, lineno=1, colno=4) -end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file +line 1, column 4: Expected all elements to be integers. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt index 5095c9752..e0061e9c4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_8__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 8 --- [L;5l,4l,3] --- -InvalidSyntax: Expected all elements to be long integers. +Reported 1 error. -location = SourceLocation(pos=9, lineno=1, colno=10) -end_location = SourceLocation(pos=10, lineno=1, colno=11) \ No newline at end of file +line 1, column 10: Expected all elements to be long integers. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt index 2d5544123..c534dc723 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_9__0.txt @@ -4,7 +4,6 @@ minecraft:nbt_tag 1 9 --- {hello,world} --- -UnexpectedToken: Expected colon but got comma ','. +Reported 1 error. -location = SourceLocation(pos=6, lineno=1, colno=7) -end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file +line 1, column 7: Expected colon but got comma ','. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt index 36d4485bf..8e93928cb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:operation 1 0 --- wat --- -InvalidSyntax: Unexpected value 'wat'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Unexpected value 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt index e5efca0a9..8baab510d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 0 --- dust 1.0 0.5 0.5 --- -UnexpectedToken: Expected number but got eof. +Reported 1 error. -location = SourceLocation(pos=16, lineno=1, colno=17) -end_location = SourceLocation(pos=16, lineno=1, colno=17) \ No newline at end of file +line 1, column 17: Expected number but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt index d5dfa248c..1f0d30b47 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 1 --- minecraft:dust_color_transition 1.0 0.0 0.0 hello --- -UnexpectedToken: Expected number but got literal 'hello'. +Reported 1 error. -location = SourceLocation(pos=43, lineno=1, colno=44) -end_location = SourceLocation(pos=43, lineno=1, colno=44) \ No newline at end of file +line 1, column 44: Expected number but got literal 'hello'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt index 3c4f01be8..f0f7d4bb9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 2 --- block minecraft:grass_block[snowy=] --- -UnexpectedToken: Expected word or quoted_string but got bracket ']'. +Reported 1 error. -location = SourceLocation(pos=34, lineno=1, colno=35) -end_location = SourceLocation(pos=34, lineno=1, colno=35) \ No newline at end of file +line 1, column 35: Expected word or quoted_string but got bracket ']'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt index 0e907d507..214649809 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 3 --- falling_dust grass_block[snowy=true]{hello: world wat} --- -UnexpectedToken: Expected curly '}' but got string 'wat'. +Reported 1 error. -location = SourceLocation(pos=49, lineno=1, colno=50) -end_location = SourceLocation(pos=49, lineno=1, colno=50) \ No newline at end of file +line 1, column 50: Expected curly '}' but got string 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt index 45b8675ab..6bf0a30b3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 4 --- item minecraft:apple{ --- -UnexpectedToken: Expected curly '}' but got eof. +Reported 1 error. -location = SourceLocation(pos=21, lineno=1, colno=22) -end_location = SourceLocation(pos=21, lineno=1, colno=22) \ No newline at end of file +line 1, column 22: Expected curly '}' but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt index 107a56ad3..957aafc7e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 5 --- vibration 0.0 64.0 0.0 5.0 thing --- -UnexpectedToken: Expected number but got literal 'thing'. +Reported 1 error. -location = SourceLocation(pos=26, lineno=1, colno=27) -end_location = SourceLocation(pos=26, lineno=1, colno=27) \ No newline at end of file +line 1, column 27: Expected number but got literal 'thing'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt index ff7146b84..81e0b9fa7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_6__0.txt @@ -4,7 +4,6 @@ minecraft:particle 1 6 --- vibration 0.0 64.0 --- -UnexpectedToken: Expected number but got eof. +Reported 1 error. -location = SourceLocation(pos=18, lineno=1, colno=19) -end_location = SourceLocation(pos=18, lineno=1, colno=19) \ No newline at end of file +line 1, column 19: Expected number but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt index f038c436d..8d71f8311 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:resource_location 1 0 --- #thing --- -InvalidSyntax: Specifying a tag is not allowed. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=6, lineno=1, colno=7) \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt index c0d402bc3..d42bad45d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_rotation_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:rotation 1 0 --- -5 ^5 --- -InvalidSyntax: Specifying local coordinates not allowed. +Reported 1 error. -location = SourceLocation(pos=3, lineno=1, colno=4) -end_location = SourceLocation(pos=5, lineno=1, colno=6) \ No newline at end of file +line 1, column 4: Specifying local coordinates not allowed. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt index 7b9c2c294..a79419fcb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_0__0.txt @@ -4,7 +4,6 @@ minecraft:score_holder 2 0 --- @a --- -InvalidSyntax: Expected entity selector targeting a single entity. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Expected entity selector targeting a single entity. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt index 6498fa87a..a2fe8f2e4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt @@ -4,7 +4,6 @@ minecraft:score_holder 2 1 --- @e[type=minecraft:marker, sort=wat, limit=1] --- -InvalidSyntax: Unexpected value 'wat'. +Reported 1 error. -location = SourceLocation(pos=31, lineno=1, colno=32) -end_location = SourceLocation(pos=34, lineno=1, colno=35) \ No newline at end of file +line 1, column 32: Unexpected value 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt index 012869fbe..119be5a2b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_2__0.txt @@ -4,7 +4,6 @@ minecraft:score_holder 2 2 --- @e[tag=foo, sort=nearest] --- -InvalidSyntax: Expected entity selector targeting a single entity. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=25, lineno=1, colno=26) \ No newline at end of file +line 1, column 1: Expected entity selector targeting a single entity. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt index abe2a4311..d3ae2e033 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt @@ -4,7 +4,6 @@ minecraft:score_holder 2 3 --- @a[ = 1 , ] --- -UnexpectedToken: Expected word or quoted_string but got equal '='. +Reported 1 error. -location = SourceLocation(pos=3, lineno=1, colno=4) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 4: Expected word or quoted_string but got equal '='. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt index 1ecc533e7..ae78318d4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt @@ -4,7 +4,6 @@ minecraft:score_holder 2 4 --- @s[ sort = arbitrary , sort = unknown , ] --- -InvalidSyntax: Unexpected value 'unknown'. +Reported 1 error. -location = SourceLocation(pos=30, lineno=1, colno=31) -end_location = SourceLocation(pos=37, lineno=1, colno=38) \ No newline at end of file +line 1, column 31: Unexpected value 'unknown'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt index 94a5038e5..cde19781a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_5__0.txt @@ -4,7 +4,6 @@ minecraft:score_holder 2 5 --- @a[ unknown = 1 , ] --- -InvalidSyntax: Invalid selector argument 'unknown'. +Reported 1 error. -location = SourceLocation(pos=4, lineno=1, colno=5) -end_location = SourceLocation(pos=11, lineno=1, colno=12) \ No newline at end of file +line 1, column 5: Invalid selector argument 'unknown'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt index 6842d3cad..70a6163e6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt @@ -4,7 +4,6 @@ minecraft:swizzle 1 0 --- sup --- -InvalidSyntax: Invalid swizzle 'sup'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Invalid swizzle 'sup'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt index 469340f14..fbce1178c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt @@ -4,7 +4,6 @@ minecraft:swizzle 1 1 --- wat --- -InvalidSyntax: Invalid swizzle 'wat'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Invalid swizzle 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt index 9b326bce5..e7765afb2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt @@ -4,7 +4,6 @@ minecraft:swizzle 1 2 --- xx --- -InvalidSyntax: Invalid swizzle 'xx'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=2, lineno=1, colno=3) \ No newline at end of file +line 1, column 1: Invalid swizzle 'xx'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt index 954763b79..dcb833b3c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt @@ -4,7 +4,6 @@ minecraft:swizzle 1 3 --- yzy --- -InvalidSyntax: Invalid swizzle 'yzy'. +Reported 1 error. -location = SourceLocation(pos=0, lineno=1, colno=1) -end_location = SourceLocation(pos=3, lineno=1, colno=4) \ No newline at end of file +line 1, column 1: Invalid swizzle 'yzy'. \ No newline at end of file diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 91673b87d..a8cd55452 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -1,9 +1,9 @@ import pytest from beet.core.utils import JsonDict from pytest_insta import SnapshotFixture -from tokenstream import InvalidSyntax from mecha import ( + DiagnosticError, Mecha, get_argument_examples, get_command_examples, @@ -51,14 +51,14 @@ def test_argument_examples( pytest.skip() if invalid: - with pytest.raises(InvalidSyntax) as exc_info: + with pytest.raises(DiagnosticError) as exc_info: mc.parse(value, using=argument_parser, provide={"properties": properties}) assert snapshot() == "\n---\n".join( [ test_name, str(properties), value, - f"{exc_info.type.__name__}: {exc_info.value}\n\nlocation = {exc_info.value.location}\nend_location = {exc_info.value.end_location}", + exc_info.value.message, ] ) else: From a348c20af7ee8138fa059f1c7159a0547770a9b8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 26 Sep 2021 18:11:58 +0000 Subject: [PATCH 0354/1554] 0.4.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 8531538eb..795e0b9ee 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.4.0 (2021-09-26) +### Feature +* Add diagnostics, beet plugin, and basic linter ([`93fe177`](https://github.com/mcbeet/mecha/commit/93fe177cccc5635876ab388740380f17a42beecf)) + +### Fix +* Make it possible to configure the version ([`67ff495`](https://github.com/mcbeet/mecha/commit/67ff49560e72f4a8d04626c7a9ffca67cf676188)) + ## v0.3.6 (2021-09-21) ### Fix * Proper rule baking ([`38e03fb`](https://github.com/mcbeet/mecha/commit/38e03fbd963237293671b2f5d0d47aed4ef1cf48)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 1ae177088..143f4e7d5 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.6" +__version__ = "0.4.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c7a6358cf..6cc43cbe8 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.3.6" +version = "0.4.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b3637557e8a2fc0c1dfea8893f3c5b7590026884 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 29 Sep 2021 19:46:31 +0200 Subject: [PATCH 0355/1554] refactor: add Dispatcher.reset to make it easier to write tests --- packages/mecha/mecha/dispatch.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 19fc37936..711be0663 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -180,6 +180,11 @@ def extend( for rule in arg: self.add_rule(rule) + def reset(self): + """Remove all rules.""" + self.rules.clear() + self.count = 0 + def dispatch( self, node: AstNode, From 4df5ebea719faf393d6fe592d5ebf40a98aa0ee1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 29 Sep 2021 19:47:01 +0200 Subject: [PATCH 0356/1554] refactor: shorter set_location import --- packages/mecha/mecha/contrib/lint_basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/contrib/lint_basic.py b/packages/mecha/mecha/contrib/lint_basic.py index 658690ce4..a073dadea 100644 --- a/packages/mecha/mecha/contrib/lint_basic.py +++ b/packages/mecha/mecha/contrib/lint_basic.py @@ -4,7 +4,7 @@ from beet import Context -from tokenstream.location import set_location +from tokenstream import set_location from mecha import ( AstCommand, From ca14dbddae2f553fb418797a3cfa4b59ddac8116 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 29 Sep 2021 20:12:54 +0200 Subject: [PATCH 0357/1554] feat: add compilation database and refactor compile method --- packages/mecha/mecha/__init__.py | 1 + packages/mecha/mecha/api.py | 123 +++++++++++------- packages/mecha/mecha/database.py | 58 +++++++++ packages/mecha/tests/test_compile.py | 181 +++++++++++++++++++++++++++ 4 files changed, 317 insertions(+), 46 deletions(-) create mode 100644 packages/mecha/mecha/database.py create mode 100644 packages/mecha/tests/test_compile.py diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 143f4e7d5..0f32c3552 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -4,6 +4,7 @@ from .api import * from .ast import * from .config import * +from .database import * from .diagnostic import * from .dispatch import * from .error import * diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index e5a71ab0b..0351ddcb0 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -29,6 +29,7 @@ from .ast import AstNode, AstRoot from .config import CommandTree +from .database import CompilationDatabase, CompilationUnit from .diagnostic import Diagnostic, DiagnosticCollection, DiagnosticError from .dispatch import Dispatcher, MutatingReducer, Reducer from .parse import delegate, get_default_parsers @@ -59,16 +60,20 @@ class Mecha: spec: CommandSpec = extra_field(default=None) - lint: Dispatcher[AstNode] = extra_field(init=False) - normalize: Dispatcher[AstNode] = extra_field(init=False) - transform: Dispatcher[AstNode] = extra_field(init=False) - optimize: Dispatcher[AstNode] = extra_field(init=False) - check: Dispatcher[AstNode] = extra_field(init=False) + lint: Dispatcher[AstRoot] = extra_field(init=False) + normalize: Dispatcher[AstRoot] = extra_field(init=False) + transform: Dispatcher[AstRoot] = extra_field(init=False) + optimize: Dispatcher[AstRoot] = extra_field(init=False) + check: Dispatcher[AstRoot] = extra_field(init=False) - steps: List[Dispatcher[AstNode]] = extra_field(default_factory=list) + steps: List[Dispatcher[AstRoot]] = extra_field(default_factory=list) serialize: Dispatcher[str] = extra_field(init=False) - diagnostics: DiagnosticCollection = extra_field(init=False) + + database: CompilationDatabase = extra_field(default_factory=CompilationDatabase) + diagnostics: DiagnosticCollection = extra_field( + default_factory=DiagnosticCollection + ) def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): if ctx: @@ -107,7 +112,6 @@ def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): ) self.serialize = Serializer(self.spec) - self.diagnostics = DiagnosticCollection() @contextmanager def prepare_token_stream( @@ -230,7 +234,7 @@ def compile( @overload def compile( self, - source: Union[List[str], str, AstNode], + source: Union[List[str], str, AstRoot], *, filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, @@ -241,62 +245,89 @@ def compile( def compile( self, - source: Union[DataPack, TextFileBase[Any], List[str], str, AstNode], + source: Union[DataPack, TextFileBase[Any], List[str], str, AstRoot], *, filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Union[DataPack, TextFileBase[Any]]: - if not filename and isinstance(source, TextFileBase) and source.source_path: - filename = os.path.relpath(source.source_path, self.directory) - - diagnostics = DiagnosticCollection( - hint=resource_location, - filename=str(filename) if filename else None, - ) + """Apply all compilation steps.""" + functions: List[TextFileBase[Any]] = [] if isinstance(source, DataPack): result = source - - for path, function in list(source.functions.items()): - self.compile( - function, - resource_location=path, - multiline=multiline, - report=diagnostics, + for key, value in source.functions.items(): + functions.append(value) + self.database[value] = CompilationUnit( + resource_location=key, + filename=( + os.path.relpath(value.source_path, self.directory) + if value.source_path + else None + ), ) - else: if isinstance(source, (list, str)): source = Function(source) + if isinstance(source, TextFileBase): result = source + if not filename and source.source_path: + filename = os.path.relpath(source.source_path, self.directory) else: result = Function() - ast = None + functions.append(result) + self.database[result] = CompilationUnit( + ast=source if isinstance(source, AstRoot) else None, + resource_location=resource_location, + filename=str(filename) if filename else None, + ) - if isinstance(source, AstNode): - ast = source - else: - try: - ast = self.parse( - source, - filename=filename, - resource_location=resource_location, - multiline=multiline, - ) - except DiagnosticError as exc: - diagnostics.extend(exc.diagnostics) - - if ast: - for compiler_pass in self.steps: - with compiler_pass.use_diagnostics(diagnostics): - ast = compiler_pass(ast) - - with self.serialize.use_diagnostics(diagnostics): - result.text = self.serialize(ast) + for function in functions: + compilation_unit = self.database[function] + + if compilation_unit.ast: + continue + + try: + compilation_unit.source = function.text + compilation_unit.ast = self.parse( + function, + filename=compilation_unit.filename, + resource_location=compilation_unit.resource_location, + multiline=multiline, + ) + except DiagnosticError as exc: + compilation_unit.diagnostics.extend(exc.diagnostics) + + for compilation_step in self.steps: + for function in functions: + compilation_unit = self.database[function] + + if not compilation_unit.ast: + continue + + with compilation_step.use_diagnostics(compilation_unit.diagnostics): + compilation_unit.ast = compilation_step(compilation_unit.ast) + + for function in functions: + compilation_unit = self.database[function] + + if not compilation_unit.ast: + continue + + with self.serialize.use_diagnostics(compilation_unit.diagnostics): + function.text = self.serialize(compilation_unit.ast) + + diagnostics = DiagnosticCollection( + [ + exc + for function in functions + for exc in self.database[function].diagnostics.exceptions + ] + ) if report: report.extend(diagnostics) diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py new file mode 100644 index 000000000..52be9d504 --- /dev/null +++ b/packages/mecha/mecha/database.py @@ -0,0 +1,58 @@ +__all__ = [ + "CompilationDatabase", + "CompilationUnit", +] + + +from dataclasses import dataclass +from typing import Any, Dict, Optional + +from beet import Container, TextFileBase +from beet.core.utils import extra_field + +from .ast import AstRoot +from .diagnostic import DiagnosticCollection + + +@dataclass +class CompilationUnit: + """Information associated with the compilation of a specific function file.""" + + ast: Optional[AstRoot] = None + source: Optional[str] = None + filename: Optional[str] = None + resource_location: Optional[str] = None + + diagnostics: DiagnosticCollection = extra_field(init=False) + + def __post_init__(self): + self.diagnostics = DiagnosticCollection( + filename=self.filename, + hint=self.resource_location, + ) + + +class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): + """Compilation database.""" + + index: Dict[str, TextFileBase[Any]] + + def __init__(self): + super().__init__() + self.index = {} + + def process( + self, + key: TextFileBase[Any], + value: CompilationUnit, + ) -> CompilationUnit: + for index in [value.filename, value.resource_location]: + if index: + self.index[index] = key + return value + + def __delitem__(self, key: TextFileBase[Any]): + for index in [self[key].filename, self[key].resource_location]: + if index: + del self.index[index] + super().__delitem__(key) diff --git a/packages/mecha/tests/test_compile.py b/packages/mecha/tests/test_compile.py new file mode 100644 index 000000000..5386c076d --- /dev/null +++ b/packages/mecha/tests/test_compile.py @@ -0,0 +1,181 @@ +from dataclasses import replace +from typing import Any + +import pytest +from beet import DataPack, Function, TextFile + +from mecha import ( + AstChildren, + AstCommand, + AstJsonValue, + AstLiteral, + AstMessage, + AstSelector, + Diagnostic, + DiagnosticCollection, + DiagnosticError, + Mecha, + rule, +) + + +@rule(AstCommand, identifier="say:message") +def convert_say_to_tellraw(node: AstCommand): + if isinstance(message := node.arguments[0], AstMessage): + return replace( + node, + identifier="tellraw:targets:message", + arguments=AstChildren( + [ + AstSelector(variable="a"), + AstJsonValue( + value="".join( + f.value + for f in message.fragments + if isinstance(f, AstLiteral) + ) + ), + ], + ), + ) + + +@pytest.fixture +def dummy_transform(mc: Mecha): + mc.transform.extend(convert_say_to_tellraw) + yield + mc.transform.reset() + + +def test_string(mc: Mecha, dummy_transform: Any): + function = mc.compile("say hello world") + assert function.text == 'tellraw @a "hello world"\n' + + compilation_unit = mc.database[function] + + ast = compilation_unit.ast + assert ast == mc.parse(function.text) + assert compilation_unit.source == "say hello world" + assert compilation_unit.filename is None + assert compilation_unit.resource_location is None + assert not compilation_unit.diagnostics.exceptions + + +def test_list(mc: Mecha, dummy_transform: Any): + function = mc.compile(["say hello world"]) + assert function.text == 'tellraw @a "hello world"\n' + + compilation_unit = mc.database[function] + + ast = compilation_unit.ast + assert ast == mc.parse(function.text) + assert compilation_unit.source == "say hello world\n" + assert compilation_unit.filename is None + assert compilation_unit.resource_location is None + assert not compilation_unit.diagnostics.exceptions + + +def test_file(mc: Mecha, dummy_transform: Any): + input_file = TextFile("say hello world") + function = mc.compile(input_file) + assert function is input_file + assert function.text == 'tellraw @a "hello world"\n' + + compilation_unit = mc.database[function] + + ast = compilation_unit.ast + assert ast == mc.parse(function.text) + assert compilation_unit.source == "say hello world" + assert compilation_unit.filename is None + assert compilation_unit.resource_location is None + assert not compilation_unit.diagnostics.exceptions + + +def test_ast(mc: Mecha, dummy_transform: Any): + ast = mc.parse("say hello world") + function = mc.compile(ast) + assert function.text == 'tellraw @a "hello world"\n' + + compilation_unit = mc.database[function] + + ast = compilation_unit.ast + assert ast == mc.parse(function.text) + assert compilation_unit.source is None + assert compilation_unit.filename is None + assert compilation_unit.resource_location is None + assert not compilation_unit.diagnostics.exceptions + + +def test_data_pack(mc: Mecha, dummy_transform: Any): + pack = DataPack() + pack["demo:foo"] = Function("say hello world") + + result = mc.compile(pack) + assert result is pack + + function = pack.functions["demo:foo"] + assert function.text == 'tellraw @a "hello world"\n' + + compilation_unit = mc.database[function] + + ast = compilation_unit.ast + assert ast == mc.parse(function.text) + assert compilation_unit.source == "say hello world" + assert compilation_unit.filename is None + assert compilation_unit.resource_location == "demo:foo" + assert not compilation_unit.diagnostics.exceptions + + assert mc.database.index["demo:foo"] is function + + +@rule(AstCommand, identifier="say:message") +def do_not_use_say(node: AstCommand): + raise Diagnostic("warn", "Do not use the say command.") + + +@pytest.fixture +def dummy_lint(mc: Mecha): + mc.lint.extend(do_not_use_say) + yield + mc.lint.reset() + + +def test_lint_warn(mc: Mecha, dummy_transform: Any, dummy_lint: Any): + function = mc.compile("say hello world") + assert function.text == 'tellraw @a "hello world"\n' + + d = mc.database[function].diagnostics.exceptions[0] + assert d.level == "warn" + assert d.format_message() == "Do not use the say command. (do_not_use_say)" + + +@rule(AstCommand, identifier="say:message") +def really_do_not_use_say(node: AstCommand): + raise Diagnostic("error", "Really don't.") + + +@pytest.fixture +def dummy_lint_error(mc: Mecha): + mc.lint.extend(really_do_not_use_say) + yield + mc.lint.reset() + + +def test_lint_error(mc: Mecha, dummy_transform: Any, dummy_lint_error: Any): + with pytest.raises(DiagnosticError) as exc_info: + mc.compile("say hello world") + + d = exc_info.value.diagnostics.exceptions[0] + assert d.level == "error" + assert d.format_message() == "Really don't. (really_do_not_use_say)" + + +def test_lint_error_report(mc: Mecha, dummy_transform: Any, dummy_lint_error: Any): + diagnostics = DiagnosticCollection() + + function = mc.compile("say hello world", report=diagnostics) + assert function.text == 'tellraw @a "hello world"\n' + + d = mc.database[function].diagnostics.exceptions[0] + assert d.level == "error" + assert d.format_message() == "Really don't. (really_do_not_use_say)" From 012cbbd36cb4d43b80600a656aefdea36bb7cc0d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 29 Sep 2021 18:13:40 +0000 Subject: [PATCH 0358/1554] 0.5.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 795e0b9ee..8acc71356 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.0 (2021-09-29) +### Feature +* Add compilation database and refactor compile method ([`18d7b7f`](https://github.com/mcbeet/mecha/commit/18d7b7f2fc747e73bbb877b2a558abac1939ea0b)) + ## v0.4.0 (2021-09-26) ### Feature * Add diagnostics, beet plugin, and basic linter ([`93fe177`](https://github.com/mcbeet/mecha/commit/93fe177cccc5635876ab388740380f17a42beecf)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 0f32c3552..16a4a1e36 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.4.0" +__version__ = "0.5.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 6cc43cbe8..dc8a3c137 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.4.0" +version = "0.5.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From d9839e9a1e6d6463213b2753e482b7e48dcc0f36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:22 +0000 Subject: [PATCH 0359/1554] chore(deps-dev): bump pyright from 1.1.169 to 1.1.176 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.169 to 1.1.176. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.176/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index c864806b1..5d32fd245 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.169" + "pyright": "^1.1.176" } }, "node_modules/pyright": { - "version": "1.1.169", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.169.tgz", - "integrity": "sha512-Vss62wzFixeK4TjmiXEyFbqFekFlL4XZEHyTqy7NCRmwrOn3f1VhGqAzq82JLMJ8wXpDiAiiErGrvnVjJZ3lXw==", + "version": "1.1.176", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.176.tgz", + "integrity": "sha512-2QoRQOhbSVTh/+CdyoL50u6Yn6zV0BTc7/nj2zp8E7scXWwoZVaMMoenAiHnRmwpkB5rw9lY+8q1Cp7JXXTCmA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.169", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.169.tgz", - "integrity": "sha512-Vss62wzFixeK4TjmiXEyFbqFekFlL4XZEHyTqy7NCRmwrOn3f1VhGqAzq82JLMJ8wXpDiAiiErGrvnVjJZ3lXw==", + "version": "1.1.176", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.176.tgz", + "integrity": "sha512-2QoRQOhbSVTh/+CdyoL50u6Yn6zV0BTc7/nj2zp8E7scXWwoZVaMMoenAiHnRmwpkB5rw9lY+8q1Cp7JXXTCmA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index a6f61bad8..b1be4a8e2 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.169" + "pyright": "^1.1.176" } } From 73d3eab70144429b626e1cc5d984684c5748ed22 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 02:04:37 +0200 Subject: [PATCH 0360/1554] fix: update tokenstream to handle windows line endings --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index d0617a13a..7af8c0322 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -682,7 +682,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.2.1" +version = "1.2.2" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "03708e6b78c994662da52d620cebf77e671e9e93f9c2b94a5fc9fea9f62b6178" +content-hash = "72a5d4ed0d93b46c9679e03e9b1da76b7102861b5805979421683a0e0ddd5923" [metadata.files] atomicwrites = [ @@ -1249,8 +1249,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.2.1-py3-none-any.whl", hash = "sha256:890ec7774c7f3cc1c604a2845788176c93f5910b4161f376f1bf8be9fe634c55"}, - {file = "tokenstream-1.2.1.tar.gz", hash = "sha256:f4fe2f58b25e598f069f32bc13034485f1f69840a480cfb2a8188c2a2a1572c2"}, + {file = "tokenstream-1.2.2-py3-none-any.whl", hash = "sha256:232fe74b730c004c0c0aa7bf7821d5a501219b26ccb3c204c670b79676f8436a"}, + {file = "tokenstream-1.2.2.tar.gz", hash = "sha256:7ecde53eb9ce3bc6df857015333ea2baacf14f90419023c6c2a88a9457e1f78c"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index dc8a3c137..b5da4b294 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.41.6" -tokenstream = "^1.2.1" +tokenstream = "^1.2.2" [tool.poetry.dev-dependencies] black = "^21.8b0" From 294d68de29b8079465a98f332d2798fc806d035c Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 00:05:51 +0000 Subject: [PATCH 0361/1554] 0.5.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 8acc71356..7d3c20a72 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.1 (2021-10-09) +### Fix +* Update tokenstream to handle windows line endings ([`6d780dd`](https://github.com/mcbeet/mecha/commit/6d780dd11deb98b3fd9d44124439a051eba6275c)) + ## v0.5.0 (2021-09-29) ### Feature * Add compilation database and refactor compile method ([`18d7b7f`](https://github.com/mcbeet/mecha/commit/18d7b7f2fc747e73bbb877b2a558abac1939ea0b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 16a4a1e36..848cafd72 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.0" +__version__ = "0.5.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b5da4b294..a13354f98 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.0" +version = "0.5.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 9c0e03b73ed92972995917ea17e8f48c28b17470 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 00:08:23 +0000 Subject: [PATCH 0362/1554] chore(deps-dev): bump black from 21.8b0 to 21.9b0 Bumps [black](https://github.com/psf/black) from 21.8b0 to 21.9b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 7af8c0322..a8a699ef3 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.8b0" +version = "21.9b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "72a5d4ed0d93b46c9679e03e9b1da76b7102861b5805979421683a0e0ddd5923" +content-hash = "f29f9dbff6cafc022ebf3abcf48d2a8a92b0deadc7d422a737c817c773dfb3b4" [metadata.files] atomicwrites = [ @@ -816,8 +816,8 @@ beet = [ {file = "beet-0.41.6.tar.gz", hash = "sha256:3d54a8ce699c60e8487cae7502165b60e905052f7d75409f585317b79668d798"}, ] black = [ - {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, - {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, + {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, + {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a13354f98..e90e554da 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.41.6" tokenstream = "^1.2.2" [tool.poetry.dev-dependencies] -black = "^21.8b0" +black = "^21.9b0" rope = "^0.19.0" pytest = "^6.2.5" isort = "^5.9.3" From 6e0d9fe215110b5fca7e0440e55b2819c8d2a610 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 03:09:35 +0200 Subject: [PATCH 0363/1554] fix: handle percent sign in player names --- packages/mecha/mecha/parse.py | 2 +- .../mecha/mecha/resources/argument_examples.json | 4 ++++ ...se__argument_examples_minecraft_entity_5_0__0.txt | 12 ++++++++++++ ...se__argument_examples_minecraft_entity_5_1__0.txt | 12 ++++++++++++ ...se__argument_examples_minecraft_entity_5_2__0.txt | 12 ++++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 326fc89cc..ecae1b908 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -182,7 +182,7 @@ def get_default_parsers() -> Dict[str, Parser]: ), "player_name": LengthConstraint( parser=CommentDisambiguation( - LiteralParser("player_name", r"[#\$a-zA-Z0-9_.+-][a-zA-Z0-9_.+-]*"), + LiteralParser("player_name", r"[#\$%a-zA-Z0-9_.+-][a-zA-Z0-9_.+-]*"), ), limit=16, ), diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 2df24fb4f..12b35908e 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -206,6 +206,10 @@ "invalid": true, "properties": { "type": "entities", "amount": "single" }, "examples": ["@r[limit=7]", "@a[tag=!foo]"] + }, + { + "properties": { "type": "players", "amount": "single" }, + "examples": ["#foo", "$foo", "%foo"] } ], "minecraft:entity_anchor": [ diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt new file mode 100644 index 000000000..f3e484e62 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt @@ -0,0 +1,12 @@ +minecraft:entity 5 0 +--- +{'type': 'players', 'amount': 'single'} +--- +#foo +--- +#foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '#foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt new file mode 100644 index 000000000..b095a6de7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt @@ -0,0 +1,12 @@ +minecraft:entity 5 1 +--- +{'type': 'players', 'amount': 'single'} +--- +$foo +--- +$foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '$foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt new file mode 100644 index 000000000..84d33c604 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt @@ -0,0 +1,12 @@ +minecraft:entity 5 2 +--- +{'type': 'players', 'amount': 'single'} +--- +%foo +--- +%foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: '%foo' \ No newline at end of file From d7d7b5d5546681dc30de3ea92c118403bff3eacf Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 03:11:48 +0200 Subject: [PATCH 0364/1554] fix: don't log messages directly to avoid wrong percent formatting --- packages/mecha/mecha/plugin.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/plugin.py b/packages/mecha/mecha/plugin.py index f0ddd4f7d..538565222 100644 --- a/packages/mecha/mecha/plugin.py +++ b/packages/mecha/mecha/plugin.py @@ -21,15 +21,17 @@ def beet_default(ctx: Context): yield for diagnostic in mc.diagnostics.exceptions: - message = diagnostic.format_message() - args = {"annotate": diagnostic.format_location()} + args = { + "message": diagnostic.format_message(), + "annotate": diagnostic.format_location(), + } if diagnostic.level == "error": - logger.error(message, args) + logger.error("%(message)s", args) elif diagnostic.level == "warn": - logger.warn(message, args) + logger.warn("%(message)s", args) elif diagnostic.level == "info": - logger.info(message, args) + logger.info("%(message)s", args) if errors := list(mc.diagnostics.get_all_errors()): raise DiagnosticError(DiagnosticCollection(errors), show_details=False) From c0ce77cfa32322691cb72c4220c1a362ca052b85 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 01:12:26 +0000 Subject: [PATCH 0365/1554] 0.5.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 7d3c20a72..79d66dccd 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.5.2 (2021-10-09) +### Fix +* Don't log messages directly to avoid wrong percent formatting ([`abe1f99`](https://github.com/mcbeet/mecha/commit/abe1f99f8fc0765c10dcdee8d35bba29cdfac39d)) +* Handle percent sign in player names ([`276cac5`](https://github.com/mcbeet/mecha/commit/276cac5131542e018a0b19dcd44cbe5b5c15f9fc)) + ## v0.5.1 (2021-10-09) ### Fix * Update tokenstream to handle windows line endings ([`6d780dd`](https://github.com/mcbeet/mecha/commit/6d780dd11deb98b3fd9d44124439a051eba6275c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 848cafd72..644e0c034 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.1" +__version__ = "0.5.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a13354f98..2d4aafc7c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.1" +version = "0.5.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 75a1e52ec816f1ed8eb197de8f73005cc0ba2014 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 10:29:42 +0200 Subject: [PATCH 0366/1554] fix: handle shortened UUID --- packages/mecha/mecha/parse.py | 3 ++- .../mecha/mecha/resources/argument_examples.json | 2 +- ...arse__argument_examples_minecraft_uuid_0_1__0.txt | 12 ++++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_1__0.txt diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index ecae1b908..3b0e49650 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1351,7 +1351,8 @@ def parse_uuid(stream: TokenStream) -> AstUUID: """Parse uuid.""" with stream.syntax(uuid="-".join([r"[a-fA-F0-9]+"] * 5)): token = stream.expect("uuid") - node = AstUUID(value=UUID(token.value)) + a, b, c, d, e = token.value.split("-") + node = AstUUID(value=UUID(f"{a:>08}-{b:>04}-{c:>04}-{d:>04}-{e:>012}")) return set_location(node, token) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 12b35908e..f4e0834ef 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -515,7 +515,7 @@ ], "minecraft:uuid": [ { - "examples": ["dd12be42-52a9-4a91-a8a1-11c01849e498"] + "examples": ["dd12be42-52a9-4a91-a8a1-11c01849e498", "af-0-0-0-1"] } ], "minecraft:vec2": [ diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_1__0.txt new file mode 100644 index 000000000..e6be5d45b --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_uuid_0_1__0.txt @@ -0,0 +1,12 @@ +minecraft:uuid 0 1 +--- +{} +--- +af-0-0-0-1 +--- +000000af-0000-0000-0000-000000000001 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: UUID('000000af-0000-0000-0000-000000000001') \ No newline at end of file From f0e1dc9ae3762c3c8c51c3df217efb159b74f4b0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 08:30:36 +0000 Subject: [PATCH 0367/1554] 0.5.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 79d66dccd..1e48c96fc 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.3 (2021-10-09) +### Fix +* Handle shortened UUID ([`8c2659b`](https://github.com/mcbeet/mecha/commit/8c2659b53f510b37f2fcb6274c87cf22c2e80af1)) + ## v0.5.2 (2021-10-09) ### Fix * Don't log messages directly to avoid wrong percent formatting ([`abe1f99`](https://github.com/mcbeet/mecha/commit/abe1f99f8fc0765c10dcdee8d35bba29cdfac39d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 644e0c034..d82553244 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.2" +__version__ = "0.5.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2d4aafc7c..5fd2330a2 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.2" +version = "0.5.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5c9826ee9413a289d47addd13db771d137da8337 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 11:08:32 +0200 Subject: [PATCH 0368/1554] fix: add 1.18 command tree and handle player names and objectives with no length restriction --- packages/mecha/mecha/api.py | 4 +- packages/mecha/mecha/parse.py | 30 +- packages/mecha/mecha/resources/1_18.json | 7609 ++++++++++++++++++++++ packages/mecha/mecha/utils.py | 13 +- packages/mecha/tests/conftest.py | 15 +- packages/mecha/tests/test_parse.py | 20 + 6 files changed, 7677 insertions(+), 14 deletions(-) create mode 100644 packages/mecha/mecha/resources/1_18.json diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 0351ddcb0..3705422d1 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -32,7 +32,7 @@ from .database import CompilationDatabase, CompilationUnit from .diagnostic import Diagnostic, DiagnosticCollection, DiagnosticError from .dispatch import Dispatcher, MutatingReducer, Reducer -from .parse import delegate, get_default_parsers +from .parse import delegate, get_parsers from .serialize import Serializer from .spec import CommandSpec @@ -108,7 +108,7 @@ def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): self.spec = CommandSpec( multiline=multiline, tree=CommandTree.load_from(version=version), - parsers=get_default_parsers(), + parsers=get_parsers(version), ) self.serialize = Serializer(self.spec) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 3b0e49650..d0cc4165f 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1,5 +1,6 @@ __all__ = [ "get_default_parsers", + "get_parsers", "get_stream_spec", "get_stream_scope", "get_stream_properties", @@ -133,7 +134,7 @@ ) from .error import UnrecognizedParser from .spec import CommandSpec, Parser -from .utils import QuoteHelper, string_to_number +from .utils import QuoteHelper, split_version, string_to_number NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" @@ -176,15 +177,9 @@ def get_default_parsers() -> Dict[str, Parser]: "resource_location_or_tag": CommentDisambiguation(ResourceLocationParser()), "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), "uuid": parse_uuid, - "objective": LengthConstraint( - parser=LiteralParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), - limit=16, - ), - "player_name": LengthConstraint( - parser=CommentDisambiguation( - LiteralParser("player_name", r"[#\$%a-zA-Z0-9_.+-][a-zA-Z0-9_.+-]*"), - ), - limit=16, + "objective": LiteralParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), + "player_name": CommentDisambiguation( + LiteralParser("player_name", r"[#\$%a-zA-Z0-9_.+-][a-zA-Z0-9_.+-]*"), ), "swizzle": parse_swizzle, "team": LiteralParser("team", r"[a-zA-Z0-9_.+-]+"), @@ -427,6 +422,21 @@ def get_default_parsers() -> Dict[str, Parser]: } +def get_parsers( + version: Union[str, Tuple[Union[str, int], ...]] = "1.17", +) -> Dict[str, Parser]: + """Return parsers for a specific version.""" + version = split_version(version) + + parsers = get_default_parsers() + + if version < (1, 18): + parsers["objective"] = LengthConstraint(parsers["objective"], 16) + parsers["player_name"] = LengthConstraint(parsers["player_name"], 16) + + return parsers + + def get_stream_spec(stream: TokenStream) -> CommandSpec: """Return the command specification associated with the token stream.""" return stream.data["spec"] diff --git a/packages/mecha/mecha/resources/1_18.json b/packages/mecha/mecha/resources/1_18.json new file mode 100644 index 000000000..d42965173 --- /dev/null +++ b/packages/mecha/mecha/resources/1_18.json @@ -0,0 +1,7609 @@ +{ + "type": "root", + "children": { + "advancement": { + "type": "literal", + "children": { + "grant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "criterion": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "everything": { + "type": "literal", + "executable": true + } + } + } + } + }, + "revoke": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "criterion": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "everything": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "attribute": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "attribute": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + }, + "base": { + "type": "literal", + "children": { + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + } + }, + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + } + }, + "modifier": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "children": { + "value": { + "type": "argument", + "parser": "brigadier:double", + "children": { + "add": { + "type": "literal", + "executable": true + }, + "multiply": { + "type": "literal", + "executable": true + }, + "multiply_base": { + "type": "literal", + "executable": true + } + } + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "parser": "minecraft:uuid", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "execute": { + "type": "literal", + "children": { + "run": { + "type": "literal" + }, + "if": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "parser": "minecraft:int_range", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true, + "redirect": ["execute"] + } + } + }, + "data": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "unless": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "parser": "minecraft:int_range", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true, + "redirect": ["execute"] + } + } + }, + "data": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true, + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "at": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + }, + "store": { + "type": "literal", + "children": { + "result": { + "type": "literal", + "children": { + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "value": { + "type": "literal", + "redirect": ["execute"] + }, + "max": { + "type": "literal", + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + }, + "success": { + "type": "literal", + "children": { + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "value": { + "type": "literal", + "redirect": ["execute"] + }, + "max": { + "type": "literal", + "redirect": ["execute"] + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + } + } + } + } + } + } + } + } + } + }, + "positioned": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + } + } + }, + "rotated": { + "type": "literal", + "children": { + "rot": { + "type": "argument", + "parser": "minecraft:rotation", + "redirect": ["execute"] + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "redirect": ["execute"] + } + } + } + } + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "align": { + "type": "literal", + "children": { + "axes": { + "type": "argument", + "parser": "minecraft:swizzle", + "redirect": ["execute"] + } + } + }, + "anchored": { + "type": "literal", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + }, + "in": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "set": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "name": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "pink": { + "type": "literal", + "executable": true + }, + "blue": { + "type": "literal", + "executable": true + }, + "red": { + "type": "literal", + "executable": true + }, + "green": { + "type": "literal", + "executable": true + }, + "yellow": { + "type": "literal", + "executable": true + }, + "purple": { + "type": "literal", + "executable": true + }, + "white": { + "type": "literal", + "executable": true + } + } + }, + "style": { + "type": "literal", + "children": { + "progress": { + "type": "literal", + "executable": true + }, + "notched_6": { + "type": "literal", + "executable": true + }, + "notched_10": { + "type": "literal", + "executable": true + }, + "notched_12": { + "type": "literal", + "executable": true + }, + "notched_20": { + "type": "literal", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "max": { + "type": "literal", + "children": { + "max": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1 + }, + "executable": true + } + } + }, + "visible": { + "type": "literal", + "children": { + "visible": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "players": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "value": { + "type": "literal", + "executable": true + }, + "max": { + "type": "literal", + "executable": true + }, + "visible": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_predicate", + "children": { + "maxCount": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "clone": { + "type": "literal", + "children": { + "begin": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "end": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "destination": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "parser": "minecraft:block_predicate", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + }, + "executable": true + } + } + } + } + } + } + }, + "data": { + "type": "literal", + "children": { + "merge": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + } + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "path": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + } + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "targetPath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "children": { + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "sourcePath": { + "type": "argument", + "parser": "minecraft:nbt_path", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:nbt_tag", + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "datapack": { + "type": "literal", + "children": { + "enable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "children": { + "after": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "before": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "last": { + "type": "literal", + "executable": true + }, + "first": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "disable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "phrase" + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "children": { + "available": { + "type": "literal", + "executable": true + }, + "enabled": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "debug": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:function", + "executable": true + } + } + } + } + }, + "defaultgamemode": { + "type": "literal", + "children": { + "survival": { + "type": "literal", + "executable": true + }, + "creative": { + "type": "literal", + "executable": true + }, + "adventure": { + "type": "literal", + "executable": true + }, + "spectator": { + "type": "literal", + "executable": true + } + } + }, + "difficulty": { + "type": "literal", + "children": { + "peaceful": { + "type": "literal", + "executable": true + }, + "easy": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + }, + "hard": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "effect": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "effect": { + "type": "argument", + "parser": "minecraft:mob_effect", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "effect": { + "type": "argument", + "parser": "minecraft:mob_effect", + "children": { + "seconds": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 1000000 + }, + "children": { + "amplifier": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 255 + }, + "children": { + "hideParticles": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "me": { + "type": "literal", + "children": { + "action": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + }, + "enchant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "enchantment": { + "type": "argument", + "parser": "minecraft:item_enchantment", + "children": { + "level": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "experience": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "amount": { + "type": "argument", + "parser": "brigadier:integer", + "children": { + "points": { + "type": "literal", + "executable": true + }, + "levels": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "amount": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "points": { + "type": "literal", + "executable": true + }, + "levels": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "query": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "players" + }, + "children": { + "points": { + "type": "literal", + "executable": true + }, + "levels": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "xp": { + "type": "literal", + "redirect": ["experience"] + }, + "fill": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_state", + "children": { + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "parser": "minecraft:block_predicate", + "executable": true + } + }, + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "outline": { + "type": "literal", + "executable": true + }, + "hollow": { + "type": "literal", + "executable": true + }, + "destroy": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "forceload": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:column_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "parser": "minecraft:column_pos", + "children": { + "to": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + }, + "all": { + "type": "literal", + "executable": true + } + } + }, + "query": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:column_pos", + "executable": true + } + }, + "executable": true + } + } + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:function", + "executable": true + } + } + }, + "gamemode": { + "type": "literal", + "children": { + "survival": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "creative": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "adventure": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "spectator": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "gamerule": { + "type": "literal", + "children": { + "announceAdvancements": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "commandBlockOutput": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "disableElytraMovementCheck": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "disableRaids": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doDaylightCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doEntityDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doFireTick": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doImmediateRespawn": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doInsomnia": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doLimitedCrafting": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doMobLoot": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doMobSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doPatrolSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doTileDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doTraderSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "doWeatherCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "drowningDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "fallDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "fireDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "forgiveDeadPlayers": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "freezeDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "keepInventory": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "logAdminCommands": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "maxCommandChainLength": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "maxEntityCramming": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "mobGriefing": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "naturalRegeneration": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "playersSleepingPercentage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "randomTickSpeed": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "reducedDebugInfo": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "sendCommandFeedback": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "showDeathMessages": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "spawnRadius": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + }, + "executable": true + }, + "spectatorsGenerateChunks": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + }, + "universalAnger": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + }, + "executable": true + } + } + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1 + }, + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "help": { + "type": "literal", + "children": { + "command": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + }, + "executable": true + }, + "item": { + "type": "literal", + "children": { + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 64 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "parser": "minecraft:item_stack", + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 1, + "max": 64 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "sourceSlot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "modifier": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "kick": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + }, + "executable": true + }, + "list": { + "type": "literal", + "children": { + "uuids": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "locate": { + "type": "literal", + "children": { + "pillager_outpost": { + "type": "literal", + "executable": true + }, + "mineshaft": { + "type": "literal", + "executable": true + }, + "mansion": { + "type": "literal", + "executable": true + }, + "jungle_pyramid": { + "type": "literal", + "executable": true + }, + "desert_pyramid": { + "type": "literal", + "executable": true + }, + "igloo": { + "type": "literal", + "executable": true + }, + "ruined_portal": { + "type": "literal", + "executable": true + }, + "shipwreck": { + "type": "literal", + "executable": true + }, + "swamp_hut": { + "type": "literal", + "executable": true + }, + "stronghold": { + "type": "literal", + "executable": true + }, + "monument": { + "type": "literal", + "executable": true + }, + "ocean_ruin": { + "type": "literal", + "executable": true + }, + "fortress": { + "type": "literal", + "executable": true + }, + "endcity": { + "type": "literal", + "executable": true + }, + "buried_treasure": { + "type": "literal", + "executable": true + }, + "village": { + "type": "literal", + "executable": true + }, + "nether_fossil": { + "type": "literal", + "executable": true + }, + "bastion_remnant": { + "type": "literal", + "executable": true + } + } + }, + "locatebiome": { + "type": "literal", + "children": { + "biome": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "loot": { + "type": "literal", + "children": { + "replace": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:item_slot", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "give": { + "type": "literal", + "children": { + "players": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "spawn": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "tool": { + "type": "argument", + "parser": "minecraft:item_stack", + "executable": true + }, + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + } + } + }, + "msg": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + } + } + }, + "tell": { + "type": "literal", + "redirect": ["msg"] + }, + "w": { + "type": "literal", + "redirect": ["msg"] + }, + "particle": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:particle", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "delta": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "speed": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "count": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "force": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + }, + "normal": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "playsound": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "children": { + "master": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "music": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "record": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "weather": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "block": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "hostile": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "neutral": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "player": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "ambient": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "voice": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "volume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "pitch": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 2.0 + }, + "children": { + "minVolume": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0, + "max": 1.0 + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + } + } + } + } + }, + "reload": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "recipe": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + }, + "*": { + "type": "literal", + "executable": true + } + } + } + } + }, + "take": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "recipe": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + }, + "*": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "say": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + }, + "schedule": { + "type": "literal", + "children": { + "function": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "minecraft:function", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "children": { + "append": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "greedy" + }, + "executable": true + } + } + } + } + }, + "scoreboard": { + "type": "literal", + "children": { + "objectives": { + "type": "literal", + "children": { + "list": { + "type": "literal", + "executable": true + }, + "add": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "criteria": { + "type": "argument", + "parser": "minecraft:objective_criteria", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "displayname": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "rendertype": { + "type": "literal", + "children": { + "integer": { + "type": "literal", + "executable": true + }, + "hearts": { + "type": "literal", + "executable": true + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + }, + "setdisplay": { + "type": "literal", + "children": { + "slot": { + "type": "argument", + "parser": "minecraft:scoreboard_slot", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "players": { + "type": "literal", + "children": { + "list": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "executable": true + } + }, + "executable": true + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + }, + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "score": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "reset": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + }, + "executable": true + } + } + }, + "enable": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + }, + "operation": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "targetObjective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "operation": { + "type": "argument", + "parser": "minecraft:operation", + "children": { + "source": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "children": { + "sourceObjective": { + "type": "argument", + "parser": "minecraft:objective", + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "seed": { + "type": "literal", + "executable": true + }, + "setblock": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "block": { + "type": "argument", + "parser": "minecraft:block_state", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + } + } + }, + "spawnpoint": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "angle": { + "type": "argument", + "parser": "minecraft:angle", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "setworldspawn": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "children": { + "angle": { + "type": "argument", + "parser": "minecraft:angle", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spectate": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "player": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "players" + }, + "executable": true + } + }, + "executable": true + } + }, + "executable": true + }, + "spreadplayers": { + "type": "literal", + "children": { + "center": { + "type": "argument", + "parser": "minecraft:vec2", + "children": { + "spreadDistance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "children": { + "maxRange": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 1.0 + }, + "children": { + "respectTeams": { + "type": "argument", + "parser": "brigadier:bool", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + } + }, + "under": { + "type": "literal", + "children": { + "maxHeight": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "respectTeams": { + "type": "argument", + "parser": "brigadier:bool", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "stopsound": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "*": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + } + }, + "master": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "music": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "record": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "weather": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "block": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "hostile": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "neutral": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "player": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "ambient": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + }, + "voice": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "parser": "minecraft:resource_location", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:entity_summon", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "nbt": { + "type": "argument", + "parser": "minecraft:nbt_compound_tag", + "executable": true + } + }, + "executable": true + } + }, + "executable": true + } + } + }, + "tag": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "add": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "list": { + "type": "literal", + "executable": true + } + } + } + } + }, + "team": { + "type": "literal", + "children": { + "list": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + }, + "executable": true + }, + "add": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + }, + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + } + }, + "empty": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "executable": true + } + } + }, + "join": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "children": { + "members": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "executable": true + } + }, + "executable": true + } + } + }, + "leave": { + "type": "literal", + "children": { + "members": { + "type": "argument", + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + }, + "executable": true + } + } + }, + "modify": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "parser": "minecraft:team", + "children": { + "displayName": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "minecraft:color", + "executable": true + } + } + }, + "friendlyFire": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "seeFriendlyInvisibles": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "parser": "brigadier:bool", + "executable": true + } + } + }, + "nametagVisibility": { + "type": "literal", + "children": { + "never": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "always": { + "type": "literal", + "executable": true + } + } + }, + "deathMessageVisibility": { + "type": "literal", + "children": { + "never": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "always": { + "type": "literal", + "executable": true + } + } + }, + "collisionRule": { + "type": "literal", + "children": { + "never": { + "type": "literal", + "executable": true + }, + "pushOwnTeam": { + "type": "literal", + "executable": true + }, + "pushOtherTeams": { + "type": "literal", + "executable": true + }, + "always": { + "type": "literal", + "executable": true + } + } + }, + "prefix": { + "type": "literal", + "children": { + "prefix": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "suffix": { + "type": "literal", + "children": { + "suffix": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + } + } + } + } + }, + "teammsg": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + } + }, + "tm": { + "type": "literal", + "redirect": ["teammsg"] + }, + "teleport": { + "type": "literal", + "children": { + "location": { + "type": "argument", + "parser": "minecraft:vec3", + "executable": true + }, + "destination": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + }, + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "entities" + }, + "children": { + "location": { + "type": "argument", + "parser": "minecraft:vec3", + "children": { + "rotation": { + "type": "argument", + "parser": "minecraft:rotation", + "executable": true + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "facingEntity": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "children": { + "facingAnchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "executable": true + } + }, + "executable": true + } + } + }, + "facingLocation": { + "type": "argument", + "parser": "minecraft:vec3", + "executable": true + } + } + } + }, + "executable": true + }, + "destination": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "single", + "type": "entities" + }, + "executable": true + } + } + } + } + }, + "tp": { + "type": "literal", + "redirect": ["teleport"] + }, + "tellraw": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "message": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + } + } + }, + "time": { + "type": "literal", + "children": { + "set": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "noon": { + "type": "literal", + "executable": true + }, + "night": { + "type": "literal", + "executable": true + }, + "midnight": { + "type": "literal", + "executable": true + }, + "time": { + "type": "argument", + "parser": "minecraft:time", + "executable": true + } + } + }, + "add": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "executable": true + } + } + }, + "query": { + "type": "literal", + "children": { + "daytime": { + "type": "literal", + "executable": true + }, + "gametime": { + "type": "literal", + "executable": true + }, + "day": { + "type": "literal", + "executable": true + } + } + } + } + }, + "title": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "amount": "multiple", + "type": "players" + }, + "children": { + "clear": { + "type": "literal", + "executable": true + }, + "reset": { + "type": "literal", + "executable": true + }, + "title": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "subtitle": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "actionbar": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "parser": "minecraft:component", + "executable": true + } + } + }, + "times": { + "type": "literal", + "children": { + "fadeIn": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "stay": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "children": { + "fadeOut": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + } + } + } + } + }, + "trigger": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "children": { + "add": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "brigadier:integer", + "executable": true + } + } + } + }, + "executable": true + } + } + }, + "weather": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + }, + "rain": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + }, + "thunder": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 1000000 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "worldborder": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:double", + "properties": { + "min": -5.9999968e7, + "max": 5.9999968e7 + }, + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:double", + "properties": { + "min": -5.9999968e7, + "max": 5.9999968e7 + }, + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + }, + "executable": true + } + } + }, + "center": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:vec2", + "executable": true + } + } + }, + "damage": { + "type": "literal", + "children": { + "amount": { + "type": "literal", + "children": { + "damagePerBlock": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "executable": true + } + } + }, + "buffer": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:float", + "properties": { + "min": 0.0 + }, + "executable": true + } + } + } + } + }, + "get": { + "type": "literal", + "executable": true + }, + "warning": { + "type": "literal", + "children": { + "distance": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "time": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + } + } + } + } + }, + "jfr": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "ban-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "banlist": { + "type": "literal", + "children": { + "ips": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "ban": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "children": { + "reason": { + "type": "argument", + "parser": "minecraft:message", + "executable": true + } + }, + "executable": true + } + } + }, + "deop": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "op": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "pardon": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "pardon-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "brigadier:string", + "properties": { + "type": "word" + }, + "executable": true + } + } + }, + "perf": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "save-all": { + "type": "literal", + "children": { + "flush": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "save-off": { + "type": "literal", + "executable": true + }, + "save-on": { + "type": "literal", + "executable": true + }, + "setidletimeout": { + "type": "literal", + "children": { + "minutes": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0 + }, + "executable": true + } + } + }, + "stop": { + "type": "literal", + "executable": true + }, + "whitelist": { + "type": "literal", + "children": { + "on": { + "type": "literal", + "executable": true + }, + "off": { + "type": "literal", + "executable": true + }, + "list": { + "type": "literal", + "executable": true + }, + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:game_profile", + "executable": true + } + } + }, + "reload": { + "type": "literal", + "executable": true + } + } + }, + "publish": { + "type": "literal", + "children": { + "port": { + "type": "argument", + "parser": "brigadier:integer", + "properties": { + "min": 0, + "max": 65535 + }, + "executable": true + } + }, + "executable": true + } + } +} diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 696452581..2527013c9 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -1,13 +1,15 @@ __all__ = [ "QuoteHelper", "string_to_number", + "split_version", ] import re from dataclasses import dataclass, field -from typing import Dict, Union +from typing import Dict, Tuple, Union +from beet.core.utils import normalize_string from tokenstream import InvalidSyntax, Token, set_location from .error import InvalidEscapeSequence @@ -21,6 +23,15 @@ def string_to_number(string: str) -> Union[int, float]: return float(string) if "." in string else int(string) +def split_version( + version: Union[str, Tuple[Union[str, int], ...]], +) -> Tuple[int, ...]: + """Break version number into a tuple of integers.""" + if isinstance(version, str): + version = tuple(normalize_string(version).split("_")) + return tuple(map(int, version)) + + @dataclass class QuoteHelper: """Helper for removing quotes and interpreting escape sequences.""" diff --git a/packages/mecha/tests/conftest.py b/packages/mecha/tests/conftest.py index 56d584cf6..720d1e492 100644 --- a/packages/mecha/tests/conftest.py +++ b/packages/mecha/tests/conftest.py @@ -1,8 +1,21 @@ import pytest -from mecha import Mecha +from mecha import CommandSpec, CommandTree, Mecha, get_parsers @pytest.fixture(scope="session") def mc(): return Mecha() + + +@pytest.fixture +def mc_1_18(mc: Mecha): + previous_spec = mc.spec + mc.spec = CommandSpec( + tree=CommandTree.load_from(version="1.18"), + parsers=get_parsers("1.18"), + ) + + yield mc + + mc.spec = previous_spec diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index a8cd55452..04ed694c9 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -106,3 +106,23 @@ def test_say(snapshot: SnapshotFixture, mc: Mecha): assert snapshot() == mc.serialize(ast) assert snapshot() == mc.serialize(ast_multiline) + + +def test_player_name(mc: Mecha): + with pytest.raises(DiagnosticError) as exc_info: + mc.parse("scoreboard players set some_really_long_name_right_here foo 42") + assert ( + exc_info.value.message + == "Reported 1 error.\n\nline 1, column 24: Expected up to 16 characters." + ) + + +def test_player_name_no_length_restriction(mc_1_18: Mecha): + assert ( + mc_1_18.serialize( + mc_1_18.parse( + "scoreboard players set some_really_long_name_right_here foo 42" + ) + ) + == "scoreboard players set some_really_long_name_right_here foo 42\n" + ) From 13eb9cc51fd7e366df2bbed759a5beb6d10c57e1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 11:10:19 +0200 Subject: [PATCH 0369/1554] fix: remove unnecessary args in serializer --- packages/mecha/mecha/serialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 97f4a4106..e1cb50bd0 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -93,7 +93,7 @@ def fallback(self, node: AstNode, result: List[str]): yield child @rule(AstRoot) - def root(self, node: AstRoot, result: List[str], *args: Any): + def root(self, node: AstRoot, result: List[str]): for command in node.commands: yield command result.append("\n") From aac9f283b95f41c272a3ef483c45c0b0696ce3e0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 09:10:59 +0000 Subject: [PATCH 0370/1554] 0.5.4 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 1e48c96fc..4a6cd4e9f 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.5.4 (2021-10-09) +### Fix +* Remove unnecessary args in serializer ([`cf041d6`](https://github.com/mcbeet/mecha/commit/cf041d6412cb63e79f8af5d89ec05c22f077576b)) +* Add 1.18 command tree and handle player names and objectives with no length restriction ([`f1ffaa5`](https://github.com/mcbeet/mecha/commit/f1ffaa576d216d039d779179c22f5b5ce0f46678)) + ## v0.5.3 (2021-10-09) ### Fix * Handle shortened UUID ([`8c2659b`](https://github.com/mcbeet/mecha/commit/8c2659b53f510b37f2fcb6274c87cf22c2e80af1)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d82553244..f1c5238b9 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.3" +__version__ = "0.5.4" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 5fd2330a2..9f7b47570 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.3" +version = "0.5.4" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From cb49a5a6e47fb04fdef1befa3c5953fbb2c72acc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 11:26:57 +0200 Subject: [PATCH 0371/1554] fix: handle more version formats in config --- packages/mecha/mecha/api.py | 12 +++++++++--- packages/mecha/mecha/config.py | 10 ++++++---- packages/mecha/mecha/parse.py | 6 ++---- packages/mecha/mecha/utils.py | 10 +++++++--- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 3705422d1..b942dd378 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -35,6 +35,7 @@ from .parse import delegate, get_parsers from .serialize import Serializer from .spec import CommandSpec +from .utils import VersionNumber AstNodeType = TypeVar("AstNodeType", bound=AstNode) TextFileType = TypeVar("TextFileType", bound=TextFileBase[Any]) @@ -43,7 +44,7 @@ class MechaOptions(BaseModel): """Mecha options.""" - version: str = "1.17" + version: VersionNumber = "1.17" multiline: bool = False rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} @@ -53,7 +54,7 @@ class Mecha: """Class exposing the command api.""" ctx: InitVar[Optional[Context]] = None - version: InitVar[str] = "1.17" + version: InitVar[VersionNumber] = "1.17" multiline: InitVar[bool] = False directory: Path = extra_field(init=False) @@ -75,7 +76,12 @@ class Mecha: default_factory=DiagnosticCollection ) - def __post_init__(self, ctx: Optional[Context], version: str, multiline: bool): + def __post_init__( + self, + ctx: Optional[Context], + version: VersionNumber, + multiline: bool, + ): if ctx: opts = ctx.validate("mecha", MechaOptions) version = opts.version diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index 0b1feef6a..2fec051d6 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -7,9 +7,11 @@ from pathlib import Path from typing import Dict, Iterator, List, Literal, Optional, Tuple, Union -from beet.core.utils import FileSystemPath, JsonDict, normalize_string +from beet.core.utils import FileSystemPath, JsonDict from pydantic import BaseModel +from .utils import VersionNumber, split_version + class CommandTree(BaseModel): """Deserialized representation of the command tree.""" @@ -26,15 +28,15 @@ class CommandTree(BaseModel): def load_from( cls, filename: Optional[FileSystemPath] = None, - version: Optional[str] = None, + version: Optional[VersionNumber] = None, ) -> "CommandTree": """Load the command tree from a file.""" sources: List[str] = [] if filename: sources.append(Path(filename).read_text()) - if version: - version = normalize_string(version) + if version is not None: + version = "_".join(map(str, split_version(version))) sources.append(read_text("mecha.resources", f"{version}.json")) tree = cls.parse_raw(sources[0]) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index d0cc4165f..e0942aedd 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -134,7 +134,7 @@ ) from .error import UnrecognizedParser from .spec import CommandSpec, Parser -from .utils import QuoteHelper, split_version, string_to_number +from .utils import QuoteHelper, VersionNumber, split_version, string_to_number NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" @@ -422,9 +422,7 @@ def get_default_parsers() -> Dict[str, Parser]: } -def get_parsers( - version: Union[str, Tuple[Union[str, int], ...]] = "1.17", -) -> Dict[str, Parser]: +def get_parsers(version: VersionNumber = "1.17") -> Dict[str, Parser]: """Return parsers for a specific version.""" version = split_version(version) diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 2527013c9..42c3966e0 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -1,6 +1,7 @@ __all__ = [ "QuoteHelper", "string_to_number", + "VersionNumber", "split_version", ] @@ -18,15 +19,18 @@ AVOID_QUOTES_REGEX = re.compile(r"^[0-9A-Za-z_\.\+\-]+$") +VersionNumber = Union[str, int, float, Tuple[Union[str, int], ...]] + + def string_to_number(string: str) -> Union[int, float]: """Helper for converting numbers to string and keeping their original type.""" return float(string) if "." in string else int(string) -def split_version( - version: Union[str, Tuple[Union[str, int], ...]], -) -> Tuple[int, ...]: +def split_version(version: VersionNumber) -> Tuple[int, ...]: """Break version number into a tuple of integers.""" + if isinstance(version, (int, float)): + version = str(version) if isinstance(version, str): version = tuple(normalize_string(version).split("_")) return tuple(map(int, version)) From b2997e3136a9f4e3e1cbc6afd1981633f2e2e6c1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 09:28:00 +0000 Subject: [PATCH 0372/1554] 0.5.5 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 4a6cd4e9f..c137ffb60 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.5 (2021-10-09) +### Fix +* Handle more version formats in config ([`117bda1`](https://github.com/mcbeet/mecha/commit/117bda1f3a9c0617e7279f59777a7808c37e7fd4)) + ## v0.5.4 (2021-10-09) ### Fix * Remove unnecessary args in serializer ([`cf041d6`](https://github.com/mcbeet/mecha/commit/cf041d6412cb63e79f8af5d89ec05c22f077576b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index f1c5238b9..65498893c 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.4" +__version__ = "0.5.5" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9f7b47570..5f32801f9 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.4" +version = "0.5.5" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 98f9c1fae427a402e6da993053532ba1d0ab4100 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 13:28:50 +0200 Subject: [PATCH 0373/1554] fix: add ast cache --- packages/mecha/mecha/api.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index b942dd378..a900aa482 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -5,6 +5,7 @@ import os +import pickle from contextlib import contextmanager from dataclasses import InitVar, dataclass from pathlib import Path @@ -21,7 +22,7 @@ overload, ) -from beet import Context, DataPack, Function, TextFileBase +from beet import Cache, Context, DataPack, Function, TextFileBase from beet.core.utils import FileSystemPath, JsonDict, extra_field from pydantic import BaseModel from tokenstream import InvalidSyntax, TokenStream @@ -58,6 +59,7 @@ class Mecha: multiline: InitVar[bool] = False directory: Path = extra_field(init=False) + cache: Optional[Cache] = extra_field(default=None) spec: CommandSpec = extra_field(default=None) @@ -95,6 +97,9 @@ def __post_init__( self.optimize = MutatingReducer(levels=opts.rules) self.check = Reducer(levels=opts.rules) + if not self.cache: + self.cache = ctx.cache["mecha"] + else: self.directory = Path.cwd() @@ -200,12 +205,24 @@ def parse( if not filename and source.source_path: filename = os.path.relpath(source.source_path, self.directory) + cache_miss = None + + if self.cache and filename: + if self.cache.has_changed(self.directory / filename): + cache_miss = self.cache.get_path(f"{filename}-ast") + else: + try: + with self.cache.get_path(f"{filename}-ast").open("rb") as f: + return pickle.load(f) + except FileNotFoundError: + pass + stream = TokenStream(source.text) try: with self.prepare_token_stream(stream, multiline=multiline): with stream.provide(**provide or {}): - return delegate(parser, stream) + ast = delegate(parser, stream) except InvalidSyntax as exc: d = Diagnostic( level="error", @@ -214,6 +231,11 @@ def parse( filename=str(filename) if filename else None, ) raise DiagnosticError(DiagnosticCollection([set_location(d, exc)])) from exc + else: + if self.cache and filename and cache_miss: + with cache_miss.open("wb") as f: + pickle.dump(ast, f) + return ast @overload def compile( From dfaaca9639e38e3ae3e59f251e8eeffea0f8b583 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Oct 2021 13:37:59 +0200 Subject: [PATCH 0374/1554] fix: fast path to avoid traversing ast when there are no rules --- packages/mecha/mecha/dispatch.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 711be0663..0a7e3cce1 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -251,6 +251,8 @@ def use_rule(self, name: Optional[str] = None) -> Iterator[None]: self.diagnostics.add(diagnostic.with_defaults(rule=name)) def __call__(self, node: AstNode) -> T: + if not self.count: + return node # type: ignore return self.invoke(node) From be2fe21cf9bd629b81bd53f950402d63f96fd113 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 11:38:47 +0000 Subject: [PATCH 0375/1554] 0.5.6 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index c137ffb60..0ddcd1cf0 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.5.6 (2021-10-09) +### Fix +* Fast path to avoid traversing ast when there are no rules ([`72322af`](https://github.com/mcbeet/mecha/commit/72322af610b725ec28cd6322cb8a5220beb1b7ae)) +* Add ast cache ([`7ae025a`](https://github.com/mcbeet/mecha/commit/7ae025a635196d9abc0780ab5b8a3d8923a64c35)) + ## v0.5.5 (2021-10-09) ### Fix * Handle more version formats in config ([`117bda1`](https://github.com/mcbeet/mecha/commit/117bda1f3a9c0617e7279f59777a7808c37e7fd4)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 65498893c..e741b54c2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.5" +__version__ = "0.5.6" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 5f32801f9..e06baeaf3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.5" +version = "0.5.6" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b4e3ed21ad8a197c9c48844b3160beaafdc655d8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 10 Oct 2021 00:32:20 +0200 Subject: [PATCH 0376/1554] fix: add logging for ast cache --- packages/mecha/mecha/api.py | 16 ++++++++++++---- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index a900aa482..803d9c943 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -4,6 +4,7 @@ ] +import logging import os import pickle from contextlib import contextmanager @@ -42,6 +43,9 @@ TextFileType = TypeVar("TextFileType", bound=TextFileBase[Any]) +logger = logging.getLogger("mecha") + + class MechaOptions(BaseModel): """Mecha options.""" @@ -208,15 +212,19 @@ def parse( cache_miss = None if self.cache and filename: - if self.cache.has_changed(self.directory / filename): - cache_miss = self.cache.get_path(f"{filename}-ast") - else: + ast_path = self.cache.get_path(f"{filename}-ast") + + if not self.cache.has_changed(self.directory / filename): try: - with self.cache.get_path(f"{filename}-ast").open("rb") as f: + with ast_path.open("rb") as f: + logger.debug("Using cached ast for file %r.", filename) return pickle.load(f) except FileNotFoundError: pass + logger.debug("Updating ast for file %r.", filename) + cache_miss = ast_path + stream = TokenStream(source.text) try: diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index a8a699ef3..589527d95 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.6" +version = "0.41.7" description = "The Minecraft pack development kit" category = "main" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f29f9dbff6cafc022ebf3abcf48d2a8a92b0deadc7d422a737c817c773dfb3b4" +content-hash = "e08843308d7d2cb7713b052dfc2acdd658bf9a386d7edfc47bd309258bb27a20" [metadata.files] atomicwrites = [ @@ -812,8 +812,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.6-py3-none-any.whl", hash = "sha256:b32fa4bff9af6ce3fa2f3838b8ea105c7b681a2aefb9c8df18b69bb082984396"}, - {file = "beet-0.41.6.tar.gz", hash = "sha256:3d54a8ce699c60e8487cae7502165b60e905052f7d75409f585317b79668d798"}, + {file = "beet-0.41.7-py3-none-any.whl", hash = "sha256:504bb6e01dc9747cc49a77394d846ba9f75376b144d9d349a0d82b582283b3ee"}, + {file = "beet-0.41.7.tar.gz", hash = "sha256:99d6b574e5c7b070897edfa7c85b2a7b445296726f4b6b5d9e8cabdd0fac4393"}, ] black = [ {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 91495882e..dc7616d10 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.41.6" +beet = ">=0.41.7" tokenstream = "^1.2.2" [tool.poetry.dev-dependencies] From 85dd1c5aaf9b92868986b4bfc1359666efd4a47d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Oct 2021 22:33:27 +0000 Subject: [PATCH 0377/1554] 0.5.7 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 0ddcd1cf0..e12d965eb 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.7 (2021-10-09) +### Fix +* Add logging for ast cache ([`c1bd76b`](https://github.com/mcbeet/mecha/commit/c1bd76beaa3262ec9b17d95267a050aa7aa16b1f)) + ## v0.5.6 (2021-10-09) ### Fix * Fast path to avoid traversing ast when there are no rules ([`72322af`](https://github.com/mcbeet/mecha/commit/72322af610b725ec28cd6322cb8a5220beb1b7ae)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e741b54c2..a0e57e60c 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.6" +__version__ = "0.5.7" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index dc7616d10..bb893e70c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.6" +version = "0.5.7" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From a1df53e08ad44e777b5e5c948df942625c90e40c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 22:36:14 +0000 Subject: [PATCH 0378/1554] chore(deps-dev): bump rope from 0.19.0 to 0.20.1 Bumps [rope](https://github.com/python-rope/rope) from 0.19.0 to 0.20.1. - [Release notes](https://github.com/python-rope/rope/releases) - [Changelog](https://github.com/python-rope/rope/blob/master/CHANGELOG.md) - [Commits](https://github.com/python-rope/rope/commits) --- updated-dependencies: - dependency-name: rope dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 589527d95..05259caea 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -624,14 +624,14 @@ idna2008 = ["idna"] [[package]] name = "rope" -version = "0.19.0" +version = "0.20.1" description = "a python refactoring library..." category = "dev" optional = false python-versions = "*" [package.extras] -dev = ["pytest"] +dev = ["pytest", "pytest-timeout"] [[package]] name = "secretstorage" @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e08843308d7d2cb7713b052dfc2acdd658bf9a386d7edfc47bd309258bb27a20" +content-hash = "8827f962190036bf8c302be7091f63ba73db6431bc211ff2800ffb626f432145" [metadata.files] atomicwrites = [ @@ -1226,7 +1226,7 @@ rfc3986 = [ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] rope = [ - {file = "rope-0.19.0.tar.gz", hash = "sha256:64e6d747532e1f5c8009ec5aae3e5523a5bcedf516f39a750d57d8ed749d90da"}, + {file = "rope-0.20.1.tar.gz", hash = "sha256:505a2f6b4ac7b18e0429be179f4d8712243a194da5c866b0731f9d91ce7590bb"}, ] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index bb893e70c..85baed274 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -28,7 +28,7 @@ tokenstream = "^1.2.2" [tool.poetry.dev-dependencies] black = "^21.9b0" -rope = "^0.19.0" +rope = "^0.20.1" pytest = "^6.2.5" isort = "^5.9.3" python-semantic-release = "^7.19.2" From a6bafff54fdafcdbacd2dc750b6b44ea585b4ca7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 10 Oct 2021 02:01:07 +0200 Subject: [PATCH 0379/1554] fix: make it possible to omit functions from compilation with match option --- packages/mecha/mecha/api.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 803d9c943..db1b8720e 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -51,6 +51,7 @@ class MechaOptions(BaseModel): version: VersionNumber = "1.17" multiline: bool = False + match: Optional[List[str]] = None rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} @@ -61,6 +62,7 @@ class Mecha: ctx: InitVar[Optional[Context]] = None version: InitVar[VersionNumber] = "1.17" multiline: InitVar[bool] = False + match: Optional[List[str]] = None directory: Path = extra_field(init=False) cache: Optional[Cache] = extra_field(default=None) @@ -93,6 +95,9 @@ def __post_init__( version = opts.version multiline = opts.multiline + if opts.match is not None: + self.match = opts.match + self.directory = ctx.directory self.lint = Reducer(levels=opts.rules) @@ -250,6 +255,7 @@ def compile( self, source: DataPack, *, + match: Optional[List[str]] = None, multiline: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> DataPack: @@ -283,6 +289,7 @@ def compile( self, source: Union[DataPack, TextFileBase[Any], List[str], str, AstRoot], *, + match: Optional[List[str]] = None, filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, @@ -293,7 +300,12 @@ def compile( if isinstance(source, DataPack): result = source - for key, value in source.functions.items(): + + if match is None: + match = self.match + + for key in source.functions.match(*match or ["*"]): + value = source.functions[key] functions.append(value) self.database[value] = CompilationUnit( resource_location=key, From bc45d5d1a343079f1e01e7616846de360ca61229 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 10 Oct 2021 00:03:24 +0000 Subject: [PATCH 0380/1554] 0.5.8 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index e12d965eb..416fc82f5 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.8 (2021-10-10) +### Fix +* Make it possible to omit functions from compilation with match option ([`aabddf6`](https://github.com/mcbeet/mecha/commit/aabddf6200e1fd6449f96f916316afadbc37a795)) + ## v0.5.7 (2021-10-09) ### Fix * Add logging for ast cache ([`c1bd76b`](https://github.com/mcbeet/mecha/commit/c1bd76beaa3262ec9b17d95267a050aa7aa16b1f)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index a0e57e60c..60594dc66 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.7" +__version__ = "0.5.8" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index bb893e70c..079d25f8c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.7" +version = "0.5.8" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 622f3d543ba782311e82391e5d1c4bdc54981daa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Oct 2021 01:41:59 +0000 Subject: [PATCH 0381/1554] chore(deps): bump click from 8.0.1 to 8.0.3 Bumps [click](https://github.com/pallets/click) from 8.0.1 to 8.0.3. - [Release notes](https://github.com/pallets/click/releases) - [Changelog](https://github.com/pallets/click/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/click/compare/8.0.1...8.0.3) --- updated-dependencies: - dependency-name: click dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 6be116a0e..ed73a20c9 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -124,7 +124,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "click" -version = "8.0.1" +version = "8.0.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -894,8 +894,8 @@ chardet = [ {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] click = [ - {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, - {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, ] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, From 6778eee09b3ed178b5d872d20b99d43450576eda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Oct 2021 01:42:18 +0000 Subject: [PATCH 0382/1554] chore(deps): bump beet from 0.41.0 to 0.41.7 Bumps [beet](https://github.com/mcbeet/beet) from 0.41.0 to 0.41.7. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.41.0...v0.41.7) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 6be116a0e..4c686ab21 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.0" +version = "0.41.7" description = "The Minecraft pack development kit" category = "main" optional = false @@ -823,8 +823,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.0-py3-none-any.whl", hash = "sha256:3f0055cc9457e1addea375187dd56b0dcd5de4eb95133f1d6765d3056b74bed5"}, - {file = "beet-0.41.0.tar.gz", hash = "sha256:9cc8e43bf690c687835de9557b50c916e706f71b1153560058e8ce00f0f7227c"}, + {file = "beet-0.41.7-py3-none-any.whl", hash = "sha256:504bb6e01dc9747cc49a77394d846ba9f75376b144d9d349a0d82b582283b3ee"}, + {file = "beet-0.41.7.tar.gz", hash = "sha256:99d6b574e5c7b070897edfa7c85b2a7b445296726f4b6b5d9e8cabdd0fac4393"}, ] black = [ {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, From d6560d1f485c404a5a2576d9b2b5e82e91cdb4a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Oct 2021 12:17:15 +0000 Subject: [PATCH 0383/1554] chore(deps-dev): bump pyright from 1.1.176 to 1.1.178 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.176 to 1.1.178. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.178/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 5d32fd245..d7cde9259 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.176" + "pyright": "^1.1.178" } }, "node_modules/pyright": { - "version": "1.1.176", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.176.tgz", - "integrity": "sha512-2QoRQOhbSVTh/+CdyoL50u6Yn6zV0BTc7/nj2zp8E7scXWwoZVaMMoenAiHnRmwpkB5rw9lY+8q1Cp7JXXTCmA==", + "version": "1.1.178", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.178.tgz", + "integrity": "sha512-OhEoC5HfKZqvY5GVCsHeroYDx85xp4CZwevhNsePxNzZyW+W491K4bfLTvuOBnvcnMWip+aMQ7zzFDkw74Gtkg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.176", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.176.tgz", - "integrity": "sha512-2QoRQOhbSVTh/+CdyoL50u6Yn6zV0BTc7/nj2zp8E7scXWwoZVaMMoenAiHnRmwpkB5rw9lY+8q1Cp7JXXTCmA==", + "version": "1.1.178", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.178.tgz", + "integrity": "sha512-OhEoC5HfKZqvY5GVCsHeroYDx85xp4CZwevhNsePxNzZyW+W491K4bfLTvuOBnvcnMWip+aMQ7zzFDkw74Gtkg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index b1be4a8e2..e5d5b2bfa 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.176" + "pyright": "^1.1.178" } } From 9d7ab0824457700e683d31d988c3f68d73e98a08 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Oct 2021 15:13:36 +0200 Subject: [PATCH 0384/1554] fix: properly check range boundaries when serializing --- packages/mecha/mecha/serialize.py | 4 ++-- ...e__argument_examples_minecraft_entity_0_9__0.txt | 2 +- ...gument_examples_minecraft_float_range_0_0__0.txt | 2 +- ...argument_examples_minecraft_int_range_0_0__0.txt | 2 +- ...argument_examples_minecraft_int_range_0_5__0.txt | 13 +++++++++++++ ...argument_examples_minecraft_int_range_0_6__0.txt | 13 +++++++++++++ 6 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_6__0.txt diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index e1cb50bd0..51da58416 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -185,10 +185,10 @@ def range(self, node: AstRange, result: List[str]): if node.exact: result.append(str(node.value)) else: - if node.min: + if node.min is not None: result.append(str(node.min)) result.append("..") - if node.max: + if node.max is not None: result.append(str(node.max)) @rule(AstTime) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt index 9a764c489..338ee93b5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_9__0.txt @@ -4,7 +4,7 @@ minecraft:entity 0 9 --- @a[ distance = ..-1 , distance = 1..0 , ] --- -@a[distance=..-1, distance=1..] +@a[distance=..-1, distance=1..0] --- location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt index b100cf4cb..84801fd1e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_float_range_0_0__0.txt @@ -4,7 +4,7 @@ minecraft:float_range 0 0 --- 0..5.2 --- -..5.2 +0..5.2 --- location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt index a5b0072ea..a3e5725ff 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_0__0.txt @@ -4,7 +4,7 @@ minecraft:int_range 0 0 --- 0..5 --- -..5 +0..5 --- location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_5__0.txt new file mode 100644 index 000000000..d81284172 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_5__0.txt @@ -0,0 +1,13 @@ +minecraft:int_range 0 5 +--- +{} +--- +..0 +--- +..0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + min: None + max: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_6__0.txt new file mode 100644 index 000000000..359b4b559 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_int_range_0_6__0.txt @@ -0,0 +1,13 @@ +minecraft:int_range 0 6 +--- +{} +--- +0.. +--- +0.. +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + min: 0 + max: None \ No newline at end of file From 87348a212b42bdf35df5144238f3f9a157226aa1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 13 Oct 2021 13:14:25 +0000 Subject: [PATCH 0385/1554] 0.5.9 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 416fc82f5..cf555b966 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.9 (2021-10-13) +### Fix +* Properly check range boundaries when serializing ([`5230024`](https://github.com/mcbeet/mecha/commit/52300241ed11ac0671cf258d7f5438164cf6f678)) + ## v0.5.8 (2021-10-10) ### Fix * Make it possible to omit functions from compilation with match option ([`aabddf6`](https://github.com/mcbeet/mecha/commit/aabddf6200e1fd6449f96f916316afadbc37a795)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 60594dc66..c09e0555a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.8" +__version__ = "0.5.9" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 885c08c44..c7135b55e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.8" +version = "0.5.9" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 1eb0957db249c48c6d2817e2f2f33531c0b38290 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 18 Oct 2021 00:51:27 +0200 Subject: [PATCH 0386/1554] fix: handle json unicode escaping and other json tweaks --- packages/mecha/mecha/parse.py | 12 ++++++-- .../mecha/resources/argument_examples.json | 6 ++-- packages/mecha/mecha/utils.py | 14 +++++++++ ...nt_examples_minecraft_component_0_4__0.txt | 12 ++++++++ ...nt_examples_minecraft_component_0_5__0.txt | 29 +++++++++++++++++++ 5 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_5__0.txt diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e0942aedd..40e3a3df0 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -134,7 +134,13 @@ ) from .error import UnrecognizedParser from .spec import CommandSpec, Parser -from .utils import QuoteHelper, VersionNumber, split_version, string_to_number +from .utils import ( + QuoteHelper, + QuoteHelperWithUnicode, + VersionNumber, + split_version, + string_to_number, +) NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" @@ -808,7 +814,7 @@ class JsonParser: """Parser for json values.""" quote_helper: QuoteHelper = field( - default_factory=lambda: QuoteHelper( + default_factory=lambda: QuoteHelperWithUnicode( escape_sequences={ r"\\": "\\", r"\f": "\f", @@ -885,7 +891,7 @@ def __call__(self, stream: TokenStream) -> AstJson: elif string: value = self.quote_helper.unquote_string(string) elif number: - value = float(number.value) + value = string_to_number(number.value) node = AstJsonValue(value=value) # type: ignore return set_location(node, stream.current) diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index f4e0834ef..0c144c198 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -143,7 +143,9 @@ "\"hello world\"", "\"\"", "{\"text\":\"hello world\"}", - "[\"\"]" + "[\"\"]", + "\"\\u2588\"", + "{\"\\u2588\\\"\\n\":[123]}" ] }, { @@ -257,7 +259,7 @@ ], "minecraft:int_range": [ { - "examples": ["0..5", "0", "-5", "-100..", "..100"] + "examples": ["0..5", "0", "-5", "-100..", "..100", "..0", "0.."] }, { "invalid": true, diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 42c3966e0..7eea26bff 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -1,5 +1,6 @@ __all__ = [ "QuoteHelper", + "QuoteHelperWithUnicode", "string_to_number", "VersionNumber", "split_version", @@ -16,6 +17,7 @@ from .error import InvalidEscapeSequence ESCAPE_REGEX = re.compile(r"\\.") +UNICODE_ESCAPE_REGEX = re.compile(r"\\(?:u([0-9a-fA-F]{4})|.)") AVOID_QUOTES_REGEX = re.compile(r"^[0-9A-Za-z_\.\+\-]+$") @@ -83,3 +85,15 @@ def quote_string(self, value: str, quote: str = '"') -> str: for match, seq in self.escape_characters.items(): value = value.replace(match, seq) return quote + value.replace(quote, "\\" + quote) + quote + + +@dataclass +class QuoteHelperWithUnicode(QuoteHelper): + """Quote helper that handles unicode escape sequences.""" + + escape_regex: "re.Pattern[str]" = UNICODE_ESCAPE_REGEX + + def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: + if unicode_hex := match[1]: + return chr(int(unicode_hex, 16)) + return super().handle_substitution(token, match) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_4__0.txt new file mode 100644 index 000000000..164bd7ce9 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_4__0.txt @@ -0,0 +1,12 @@ +minecraft:component 0 4 +--- +{} +--- +"\u2588" +--- +"\u2588" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: '█' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_5__0.txt new file mode 100644 index 000000000..25965c7b8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_0_5__0.txt @@ -0,0 +1,29 @@ +minecraft:component 0 5 +--- +{} +--- +{"\u2588\"\n":[123]} +--- +{"\u2588\"\n": [123]} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + entries: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + key: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: '█"\n' + value: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + elements: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 123 \ No newline at end of file From 9cfe1ec25497030068bf8bc70cdb4f99e315e8e3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 18 Oct 2021 00:59:00 +0200 Subject: [PATCH 0387/1554] fix: player names can be up to 40 characters not 16 --- packages/mecha/mecha/parse.py | 2 +- .../resources/command_examples.mcfunction | 2 ++ .../multiline_command_examples.mcfunction | 1 + .../snapshots/parse__command_examples__0.txt | 29 +++++++++++++++++-- .../snapshots/parse__command_examples__1.txt | 1 + .../parse__multiline_command_examples__0.txt | 29 +++++++++++++++++-- .../parse__multiline_command_examples__1.txt | 1 + packages/mecha/tests/test_parse.py | 6 ++-- 8 files changed, 64 insertions(+), 7 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 40e3a3df0..e16873a9e 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -436,7 +436,7 @@ def get_parsers(version: VersionNumber = "1.17") -> Dict[str, Parser]: if version < (1, 18): parsers["objective"] = LengthConstraint(parsers["objective"], 16) - parsers["player_name"] = LengthConstraint(parsers["player_name"], 16) + parsers["player_name"] = LengthConstraint(parsers["player_name"], 40) return parsers diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index 2c8117051..252cf5069 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -143,3 +143,5 @@ title @a title {"text":"Chapter I","bold":true} # weather weather clear 1200 weather rain +# other +scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index 330e4cc6a..3b8cbdc5c 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -106,3 +106,4 @@ gamerule scoreboard players set #index global 3 scoreboard players set $index global 3 +scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index d388edc17..e3f8b7362 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5948, lineno=146, colno=1) + end_location: SourceLocation(pos=6035, lineno=148, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -5297,4 +5297,29 @@ end_location: SourceLocation(pos=5947, lineno=145, colno=13) identifier: 'weather:rain' arguments: - \ No newline at end of file + + + location: SourceLocation(pos=5956, lineno=147, colno=1) + end_location: SourceLocation(pos=6034, lineno=147, colno=79) + identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' + arguments: + + location: SourceLocation(pos=5985, lineno=147, colno=30) + end_location: SourceLocation(pos=6003, lineno=147, colno=48) + value: '#sie_1_flags_delta' + + location: SourceLocation(pos=6004, lineno=147, colno=49) + end_location: SourceLocation(pos=6011, lineno=147, colno=56) + value: 'integer' + + location: SourceLocation(pos=6012, lineno=147, colno=57) + end_location: SourceLocation(pos=6013, lineno=147, colno=58) + value: '=' + + location: SourceLocation(pos=6014, lineno=147, colno=59) + end_location: SourceLocation(pos=6026, lineno=147, colno=71) + value: '#sie_1_flags' + + location: SourceLocation(pos=6027, lineno=147, colno=72) + end_location: SourceLocation(pos=6034, lineno=147, colno=79) + value: 'integer' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index 0efb571a3..dac61bb04 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -116,3 +116,4 @@ title @a subtitle {"text": "The story begins...", "color": "gray", "italic": tru title @a title {"text": "Chapter I", "bold": true} weather clear 1200 weather rain +scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 1b03f2e99..6d8002a1d 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1869, lineno=109, colno=1) + end_location: SourceLocation(pos=1948, lineno=110, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -980,4 +980,29 @@ location: SourceLocation(pos=1867, lineno=108, colno=38) end_location: SourceLocation(pos=1868, lineno=108, colno=39) - value: 3 \ No newline at end of file + value: 3 + + location: SourceLocation(pos=1869, lineno=109, colno=1) + end_location: SourceLocation(pos=1947, lineno=109, colno=79) + identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' + arguments: + + location: SourceLocation(pos=1898, lineno=109, colno=30) + end_location: SourceLocation(pos=1916, lineno=109, colno=48) + value: '#sie_1_flags_delta' + + location: SourceLocation(pos=1917, lineno=109, colno=49) + end_location: SourceLocation(pos=1924, lineno=109, colno=56) + value: 'integer' + + location: SourceLocation(pos=1925, lineno=109, colno=57) + end_location: SourceLocation(pos=1926, lineno=109, colno=58) + value: '=' + + location: SourceLocation(pos=1927, lineno=109, colno=59) + end_location: SourceLocation(pos=1939, lineno=109, colno=71) + value: '#sie_1_flags' + + location: SourceLocation(pos=1940, lineno=109, colno=72) + end_location: SourceLocation(pos=1947, lineno=109, colno=79) + value: 'integer' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 6118ae4bf..b93f6cc74 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -21,3 +21,4 @@ execute in the_end run say foo gamerule doDaylightCycle false scoreboard players set #index global 3 scoreboard players set $index global 3 +scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index 04ed694c9..b29db3165 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -110,10 +110,12 @@ def test_say(snapshot: SnapshotFixture, mc: Mecha): def test_player_name(mc: Mecha): with pytest.raises(DiagnosticError) as exc_info: - mc.parse("scoreboard players set some_really_long_name_right_here foo 42") + mc.parse( + "scoreboard players set some_really_long_name_right_here_but_its_actually_even_longer foo 42" + ) assert ( exc_info.value.message - == "Reported 1 error.\n\nline 1, column 24: Expected up to 16 characters." + == "Reported 1 error.\n\nline 1, column 24: Expected up to 40 characters." ) From 14572131d2f5878099b50ee1c31c6e5606842ad1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 18 Oct 2021 01:19:16 +0200 Subject: [PATCH 0388/1554] fix: handle fake player names with all kinds of special characters --- packages/mecha/mecha/parse.py | 4 +--- .../resources/command_examples.mcfunction | 1 + .../snapshots/parse__command_examples__0.txt | 21 +++++++++++++++++-- .../snapshots/parse__command_examples__1.txt | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e16873a9e..f8f019a2f 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -184,9 +184,7 @@ def get_default_parsers() -> Dict[str, Parser]: "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), "uuid": parse_uuid, "objective": LiteralParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), - "player_name": CommentDisambiguation( - LiteralParser("player_name", r"[#\$%a-zA-Z0-9_.+-][a-zA-Z0-9_.+-]*"), - ), + "player_name": CommentDisambiguation(delegate("literal")), "swizzle": parse_swizzle, "team": LiteralParser("team", r"[a-zA-Z0-9_.+-]+"), ################################################################################ diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index 252cf5069..fc581d53f 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -145,3 +145,4 @@ weather clear 1200 weather rain # other scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer +scoreboard players set ✔ foo 42 diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index e3f8b7362..6ab836771 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6035, lineno=148, colno=1) + end_location: SourceLocation(pos=6067, lineno=149, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -5322,4 +5322,21 @@ location: SourceLocation(pos=6027, lineno=147, colno=72) end_location: SourceLocation(pos=6034, lineno=147, colno=79) - value: 'integer' \ No newline at end of file + value: 'integer' + + location: SourceLocation(pos=6035, lineno=148, colno=1) + end_location: SourceLocation(pos=6066, lineno=148, colno=32) + identifier: 'scoreboard:players:set:targets:objective:score' + arguments: + + location: SourceLocation(pos=6058, lineno=148, colno=24) + end_location: SourceLocation(pos=6059, lineno=148, colno=25) + value: '✔' + + location: SourceLocation(pos=6060, lineno=148, colno=26) + end_location: SourceLocation(pos=6063, lineno=148, colno=29) + value: 'foo' + + location: SourceLocation(pos=6064, lineno=148, colno=30) + end_location: SourceLocation(pos=6066, lineno=148, colno=32) + value: 42 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index dac61bb04..0fb038b8f 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -117,3 +117,4 @@ title @a title {"text": "Chapter I", "bold": true} weather clear 1200 weather rain scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer +scoreboard players set ✔ foo 42 From 5c28187199fa766aea1b72a56896122720d89c56 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 18 Oct 2021 01:36:12 +0200 Subject: [PATCH 0389/1554] fix: handle tag and team selector argument without value --- packages/mecha/mecha/ast.py | 2 +- packages/mecha/mecha/parse.py | 44 +++++++++++++++---- .../mecha/resources/argument_examples.json | 9 +++- packages/mecha/mecha/serialize.py | 3 +- ...xamples_minecraft_score_holder_0_18__0.txt | 23 ++++++++++ ...xamples_minecraft_score_holder_0_19__0.txt | 23 ++++++++++ ...xamples_minecraft_score_holder_0_20__0.txt | 23 ++++++++++ ...xamples_minecraft_score_holder_0_21__0.txt | 23 ++++++++++ ...examples_minecraft_score_holder_2_6__0.txt | 9 ++++ 9 files changed, 147 insertions(+), 12 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_19__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_20__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_21__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_6__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index da9a68e20..200f6306b 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -495,7 +495,7 @@ class AstSelectorArgument(AstNode): inverted: bool = False key: AstString = required_field() - value: AstNode = required_field() + value: Optional[AstNode] = required_field() @dataclass(frozen=True) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index f8f019a2f..d3b0f74df 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -43,6 +43,7 @@ "SelectorParser", "SelectorArgumentParser", "SelectorArgumentInvertConstraint", + "SelectorArgumentNoValueConstraint", "parse_selector_scores", "parse_selector_advancements", "SelectorPlayerConstraint", @@ -253,7 +254,10 @@ def get_default_parsers() -> Dict[str, Parser]: ################################################################################ "selector": SelectorParser(), "selector:argument": SelectorArgumentInvertConstraint( - SelectorArgumentParser(), + SelectorArgumentNoValueConstraint( + SelectorArgumentParser(), + allow_no_value=["tag", "team"], + ), allow_invert=[ "tag", "team", @@ -1417,13 +1421,20 @@ def __call__(self, stream: TokenStream) -> Any: inverted = stream.get("exclamation") is not None - try: - value_node = delegate(f"selector:argument:{argument}", stream) - except UnrecognizedParser as exc: - if not exc.parser.startswith("selector:argument:"): - raise - syntax_exc = InvalidSyntax(f"Invalid selector argument {argument!r}.") - raise key_node.emit_error(syntax_exc) from exc + hint = stream.peek() + + if hint and hint.match("comma", ("bracket", "]")): + value_node = None + else: + try: + value_node = delegate(f"selector:argument:{argument}", stream) + except UnrecognizedParser as exc: + if not exc.parser.startswith("selector:argument:"): + raise + syntax_exc = InvalidSyntax( + f"Invalid selector argument {argument!r}." + ) + raise key_node.emit_error(syntax_exc) from exc node = AstSelectorArgument(inverted=inverted, key=key_node, value=value_node) return set_location(node, key_node, value_node) @@ -1446,6 +1457,23 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class SelectorArgumentNoValueConstraint: + """Constraint that only allows a specific set of arguments to have no associated value.""" + + parser: Parser + allow_no_value: List[str] + + def __call__(self, stream: TokenStream) -> Any: + node: AstSelectorArgument = self.parser(stream) + + if not node.value and node.key.value not in self.allow_no_value: + exc = InvalidSyntax(f"Argument {node.key.value!r} must have a value.") + raise node.emit_error(exc) + + return node + + def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: """Parse selector scores.""" with stream.syntax( diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index 0c144c198..ebcc463ad 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -471,7 +471,11 @@ "@a[ x = 0.0 , y = 0.0 , z = 0.0 , dx = 0.0 , dy = 0.0 , dz = 0.0 , ]", "@a[ x = 0.0 , x = 0.0 , dz = 0.0, dz = 0.0 , ]", "@a[ x_rotation = 179.9..-179.9 , y_rotation = 179.9..-179.9 , ]", - "@a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ]" + "@a[ x_rotation = 179.9..-179.9 , x_rotation = 179.9..-179.9 , ]", + "@a[team=]", + "@a[team=!]", + "@a[tag=]", + "@a[tag=!]" ] }, { @@ -487,7 +491,8 @@ "@e[tag=foo, sort=nearest]", "@a[ = 1 , ]", "@s[ sort = arbitrary , sort = unknown , ]", - "@a[ unknown = 1 , ]" + "@a[ unknown = 1 , ]", + "@a[name=]" ] } ], diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 51da58416..46f1f414c 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -232,7 +232,8 @@ def selector_argument(self, node: AstSelectorArgument, result: List[str]): result.append("=") if node.inverted: result.append("!") - yield node.value + if node.value: + yield node.value @rule(AstSelector) def selector(self, node: AstSelector, result: List[str]): diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt new file mode 100644 index 000000000..74b0d3574 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_18__0.txt @@ -0,0 +1,23 @@ +minecraft:score_holder 0 18 +--- +{'amount': 'multiple'} +--- +@a[team=] +--- +@a[team=] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + variable: 'a' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'team' + value: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_19__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_19__0.txt new file mode 100644 index 000000000..6bdcd2e48 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_19__0.txt @@ -0,0 +1,23 @@ +minecraft:score_holder 0 19 +--- +{'amount': 'multiple'} +--- +@a[team=!] +--- +@a[team=!] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + variable: 'a' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + inverted: True + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'team' + value: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_20__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_20__0.txt new file mode 100644 index 000000000..c79577466 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_20__0.txt @@ -0,0 +1,23 @@ +minecraft:score_holder 0 20 +--- +{'amount': 'multiple'} +--- +@a[tag=] +--- +@a[tag=] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + variable: 'a' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + inverted: False + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'tag' + value: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_21__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_21__0.txt new file mode 100644 index 000000000..1b170c893 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_21__0.txt @@ -0,0 +1,23 @@ +minecraft:score_holder 0 21 +--- +{'amount': 'multiple'} +--- +@a[tag=!] +--- +@a[tag=!] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + variable: 'a' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + inverted: True + key: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'tag' + value: None \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_6__0.txt new file mode 100644 index 000000000..3740a4bbc --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_6__0.txt @@ -0,0 +1,9 @@ +minecraft:score_holder 2 6 +--- +{'amount': 'single'} +--- +@a[name=] +--- +Reported 1 error. + +line 1, column 4: Argument 'name' must have a value. \ No newline at end of file From 14b3684a7c5f8f0adb6b71ad06e2e91c74327d73 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Oct 2021 23:37:19 +0000 Subject: [PATCH 0390/1554] 0.5.10 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index cf555b966..d8b196d6b 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.5.10 (2021-10-17) +### Fix +* Handle tag and team selector argument without value ([`1ba966c`](https://github.com/mcbeet/mecha/commit/1ba966c62cb9e8077785a888ede64f6b4986b175)) +* Handle fake player names with all kinds of special characters ([`286bfd8`](https://github.com/mcbeet/mecha/commit/286bfd8fe8729ebc3bd453dd5da8214856d200ac)) +* Player names can be up to 40 characters not 16 ([`80ba827`](https://github.com/mcbeet/mecha/commit/80ba8275ed6d97845765fc6f3c9a2efad923509a)) +* Handle json unicode escaping and other json tweaks ([`4935221`](https://github.com/mcbeet/mecha/commit/49352212fe008c7b5bffbdd94a5fa437d35a737b)) + ## v0.5.9 (2021-10-13) ### Fix * Properly check range boundaries when serializing ([`5230024`](https://github.com/mcbeet/mecha/commit/52300241ed11ac0671cf258d7f5438164cf6f678)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index c09e0555a..b63f38053 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.9" +__version__ = "0.5.10" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c7135b55e..b082467cd 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.9" +version = "0.5.10" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From a2c27b1bf56adebb52c6af4a30553b6183e96013 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 18 Oct 2021 03:12:15 +0200 Subject: [PATCH 0391/1554] fix: provide "annotate" through extra logging argument --- packages/mecha/mecha/plugin.py | 12 +++++------- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/mecha/mecha/plugin.py b/packages/mecha/mecha/plugin.py index 538565222..b0a02c6a5 100644 --- a/packages/mecha/mecha/plugin.py +++ b/packages/mecha/mecha/plugin.py @@ -21,17 +21,15 @@ def beet_default(ctx: Context): yield for diagnostic in mc.diagnostics.exceptions: - args = { - "message": diagnostic.format_message(), - "annotate": diagnostic.format_location(), - } + args = {"message": diagnostic.format_message()} + extra = {"annotate": diagnostic.format_location()} if diagnostic.level == "error": - logger.error("%(message)s", args) + logger.error("%(message)s", args, extra=extra) elif diagnostic.level == "warn": - logger.warn("%(message)s", args) + logger.warn("%(message)s", args, extra=extra) elif diagnostic.level == "info": - logger.info("%(message)s", args) + logger.info("%(message)s", args, extra=extra) if errors := list(mc.diagnostics.get_all_errors()): raise DiagnosticError(DiagnosticCollection(errors), show_details=False) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 05259caea..ada567a58 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.7" +version = "0.41.9" description = "The Minecraft pack development kit" category = "main" optional = false @@ -49,7 +49,7 @@ Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" pydantic = ">=1.8.2,<2.0.0" -PyYAML = ">=5.4.1,<6.0.0" +PyYAML = ">=5.4.1,<7.0.0" toml = ">=0.10.2,<0.11.0" [package.extras] @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "8827f962190036bf8c302be7091f63ba73db6431bc211ff2800ffb626f432145" +content-hash = "ac99de64e0353c5a6927ea5c2a208312f8bc2b6c2524bbe0d07ff378f41262c3" [metadata.files] atomicwrites = [ @@ -812,8 +812,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.7-py3-none-any.whl", hash = "sha256:504bb6e01dc9747cc49a77394d846ba9f75376b144d9d349a0d82b582283b3ee"}, - {file = "beet-0.41.7.tar.gz", hash = "sha256:99d6b574e5c7b070897edfa7c85b2a7b445296726f4b6b5d9e8cabdd0fac4393"}, + {file = "beet-0.41.9-py3-none-any.whl", hash = "sha256:516002505948ab49a3816b989367a4436341190749ea5f9354d827959f53e5d6"}, + {file = "beet-0.41.9.tar.gz", hash = "sha256:156e695681fe0a6c079817d2fc71929fa2c3553ebac1c3b60f64cb08f24322ca"}, ] black = [ {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b082467cd..1d13a977d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.41.7" +beet = ">=0.41.9" tokenstream = "^1.2.2" [tool.poetry.dev-dependencies] From 292f39814a4b1b8bfa549ad9e63d95b5bf50d6eb Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 18 Oct 2021 01:13:26 +0000 Subject: [PATCH 0392/1554] 0.5.11 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index d8b196d6b..3e7f502a7 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.11 (2021-10-18) +### Fix +* Provide "annotate" through extra logging argument ([`e88ad04`](https://github.com/mcbeet/mecha/commit/e88ad0437f0623cc77fee6cfff12c1451fd41dcc)) + ## v0.5.10 (2021-10-17) ### Fix * Handle tag and team selector argument without value ([`1ba966c`](https://github.com/mcbeet/mecha/commit/1ba966c62cb9e8077785a888ede64f6b4986b175)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index b63f38053..9c904013e 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.10" +__version__ = "0.5.11" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1d13a977d..c93105f06 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.10" +version = "0.5.11" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3e90153c651b173b2bf394f46f6904ca27647cf8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 18 Oct 2021 03:39:26 +0200 Subject: [PATCH 0393/1554] refactor: remove diagnostic labels for the moment --- packages/mecha/mecha/contrib/lint_basic.py | 3 --- packages/mecha/mecha/diagnostic.py | 22 ++-------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/packages/mecha/mecha/contrib/lint_basic.py b/packages/mecha/mecha/contrib/lint_basic.py index a073dadea..556d89b53 100644 --- a/packages/mecha/mecha/contrib/lint_basic.py +++ b/packages/mecha/mecha/contrib/lint_basic.py @@ -80,9 +80,6 @@ def selector_argument_order(self, node: AstSelector): message=f"{name.capitalize()} argument should go before {bad_arg_name}.", ) - bad_arg_message = f"Specifying the {bad_arg_name} argument before {name} leads to unnecessary processing." - d.labels[bad_arg] = bad_arg_message - diagnostics.add(set_location(d, arg)) for conflict_index in range(index): diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index 8c318c1b3..905aae7c1 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -1,35 +1,18 @@ __all__ = [ "Diagnostic", "DiagnosticCollection", - "DiagnosticLabelContainer", "DiagnosticError", ] from dataclasses import dataclass, field, replace from types import TracebackType -from typing import Any, Iterator, List, Literal, Optional, Type +from typing import Iterator, List, Literal, Optional, Type -from beet import Container, FormattedPipelineException +from beet import FormattedPipelineException from tokenstream import UNKNOWN_LOCATION, SourceLocation -class DiagnosticLabelContainer(Container[Any, str]): - """Container for diagnostic labels.""" - - def normalize_key(self, key: Any) -> Any: - if isinstance(key, SourceLocation): - return key, key - - location = getattr(key, "location", None) - end_location = getattr(key, "end_location", None) - - if location and end_location: - return location, end_location - - return key - - @dataclass class Diagnostic(Exception): """Exception that can be raised to report messages.""" @@ -42,7 +25,6 @@ class Diagnostic(Exception): filename: Optional[str] = None location: SourceLocation = UNKNOWN_LOCATION end_location: SourceLocation = UNKNOWN_LOCATION - labels: DiagnosticLabelContainer = field(default_factory=DiagnosticLabelContainer) def __str__(self) -> str: return self.format_message() From f904d08e047a86778609bb4440ce2fe58c3d4a82 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Oct 2021 06:26:54 +0200 Subject: [PATCH 0394/1554] feat: show formatted code when logging diagnostics --- packages/mecha/mecha/api.py | 1 + packages/mecha/mecha/contrib/lint_basic.py | 14 +++-- packages/mecha/mecha/database.py | 1 + packages/mecha/mecha/diagnostic.py | 64 ++++++++++++++++------ packages/mecha/mecha/plugin.py | 18 ++++-- packages/mecha/mecha/utils.py | 50 ++++++++++++++++- packages/mecha/poetry.lock | 8 +-- packages/mecha/pyproject.toml | 2 +- 8 files changed, 124 insertions(+), 34 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index db1b8720e..0dc9fcc59 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -242,6 +242,7 @@ def parse( message=str(exc), hint=resource_location, filename=str(filename) if filename else None, + file=source, ) raise DiagnosticError(DiagnosticCollection([set_location(d, exc)])) from exc else: diff --git a/packages/mecha/mecha/contrib/lint_basic.py b/packages/mecha/mecha/contrib/lint_basic.py index 556d89b53..dd35f613f 100644 --- a/packages/mecha/mecha/contrib/lint_basic.py +++ b/packages/mecha/mecha/contrib/lint_basic.py @@ -29,15 +29,21 @@ class BasicLinter(Reducer): def execute_run(self, node: AstCommand): if isinstance(clause := node.arguments[0], AstCommand): if clause.identifier == "execute:run:subcommand": - d = Diagnostic("warn", "Redundant `execute run` clause.") - raise set_location(d, node, clause.arguments[0].location) + raise set_location( + Diagnostic("warn", "Redundant `execute run` clause."), + node, + clause.arguments[0].location.with_horizontal_offset(-1), + ) @rule(AstCommand, identifier="execute:run:subcommand") def run_execute(self, node: AstCommand): if isinstance(clause := node.arguments[0], AstCommand): if clause.identifier == "execute:subcommand": - d = Diagnostic("warn", "Redundant `run execute` clause.") - raise set_location(d, node, clause.arguments[0].location) + raise set_location( + Diagnostic("warn", "Redundant `run execute` clause."), + node, + clause.arguments[0].location.with_horizontal_offset(-1), + ) @rule(AstSelector) def selector_argument_order(self, node: AstSelector): diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 52be9d504..d5fbf6057 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -49,6 +49,7 @@ def process( for index in [value.filename, value.resource_location]: if index: self.index[index] = key + value.diagnostics.file = key return value def __delitem__(self, key: TextFileBase[Any]): diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index 905aae7c1..af471ccf4 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -2,19 +2,23 @@ "Diagnostic", "DiagnosticCollection", "DiagnosticError", + "DiagnosticErrorSummary", ] from dataclasses import dataclass, field, replace from types import TracebackType -from typing import Iterator, List, Literal, Optional, Type +from typing import Any, Iterator, List, Literal, Optional, Type -from beet import FormattedPipelineException +from beet import FormattedPipelineException, TextFileBase from tokenstream import UNKNOWN_LOCATION, SourceLocation +from .error import MechaError +from .utils import underline_code + @dataclass -class Diagnostic(Exception): +class Diagnostic(MechaError): """Exception that can be raised to report messages.""" level: Literal["info", "warn", "error"] @@ -23,6 +27,7 @@ class Diagnostic(Exception): rule: Optional[str] = None hint: Optional[str] = None filename: Optional[str] = None + file: Optional[TextFileBase[Any]] = None location: SourceLocation = UNKNOWN_LOCATION end_location: SourceLocation = UNKNOWN_LOCATION @@ -50,14 +55,24 @@ def format_location(self) -> str: location = self.hint else: location = "" - return location + def format_code(self, code: str) -> Optional[str]: + """Return the formatted code.""" + if self.location.unknown: + return None + return underline_code( + code, + self.location, + self.location if self.end_location.unknown else self.end_location, + ) + def with_defaults( self, rule: Optional[str] = None, hint: Optional[str] = None, filename: Optional[str] = None, + file: Optional[TextFileBase[Any]] = None, ) -> "Diagnostic": """Set default values for unspecified attributes.""" return replace( @@ -65,11 +80,12 @@ def with_defaults( rule=self.rule or rule, hint=self.hint or hint, filename=self.filename or filename, + file=self.file or file, ) @dataclass -class DiagnosticCollection(Exception): +class DiagnosticCollection(MechaError): """Exception that can be raised to group multiple diagnostics.""" exceptions: List[Diagnostic] = field(default_factory=list) @@ -77,10 +93,16 @@ class DiagnosticCollection(Exception): rule: Optional[str] = None hint: Optional[str] = None filename: Optional[str] = None + file: Optional[TextFileBase[Any]] = None def add(self, exc: Diagnostic) -> Diagnostic: """Add diagnostic.""" - exc = exc.with_defaults(rule=self.rule, hint=self.hint, filename=self.filename) + exc = exc.with_defaults( + rule=self.rule, + hint=self.hint, + filename=self.filename, + file=self.file, + ) self.exceptions.append(exc) return exc @@ -117,22 +139,28 @@ def __str__(self) -> str: return f"Reported {len(self.exceptions)} {term}." -class DiagnosticError(FormattedPipelineException): - """Wrap a collection of error diagnostics to abort the build.""" +class DiagnosticError(MechaError): + """Raised with a collection of error diagnostics.""" diagnostics: DiagnosticCollection - def __init__(self, diagnostics: DiagnosticCollection, show_details: bool = True): + def __init__(self, diagnostics: DiagnosticCollection): super().__init__(diagnostics) self.diagnostics = diagnostics - if show_details: - details = "\n".join( - f"{diagnostic.format_location()}: {diagnostic.format_message()}" - for diagnostic in diagnostics.exceptions - ) - self.message = f"{diagnostics}\n\n{details}" - else: - self.message = str(diagnostics) + def __str__(self) -> str: + details = "\n".join( + f"{diagnostic.format_location()}: {diagnostic.format_message()}" + for diagnostic in self.diagnostics.exceptions + ) + return f"{self.diagnostics}\n\n{details}" + + +class DiagnosticErrorSummary(FormattedPipelineException): + """Raised for showing a summary of how many errors occurred.""" - self.format_cause = True + diagnostics: DiagnosticCollection + + def __init__(self, diagnostics: DiagnosticCollection): + super().__init__(diagnostics) + self.message = str(diagnostics) diff --git a/packages/mecha/mecha/plugin.py b/packages/mecha/mecha/plugin.py index b0a02c6a5..001050857 100644 --- a/packages/mecha/mecha/plugin.py +++ b/packages/mecha/mecha/plugin.py @@ -8,7 +8,7 @@ from beet import Context from .api import Mecha -from .diagnostic import DiagnosticCollection, DiagnosticError +from .diagnostic import DiagnosticCollection, DiagnosticErrorSummary logger = logging.getLogger("mecha") @@ -21,15 +21,21 @@ def beet_default(ctx: Context): yield for diagnostic in mc.diagnostics.exceptions: - args = {"message": diagnostic.format_message()} + message = diagnostic.format_message() + + if diagnostic.file: + if source := mc.database[diagnostic.file].source: + if code := diagnostic.format_code(source): + message += f"\n{code}" + extra = {"annotate": diagnostic.format_location()} if diagnostic.level == "error": - logger.error("%(message)s", args, extra=extra) + logger.error("%s", message, extra=extra) elif diagnostic.level == "warn": - logger.warn("%(message)s", args, extra=extra) + logger.warn("%s", message, extra=extra) elif diagnostic.level == "info": - logger.info("%(message)s", args, extra=extra) + logger.info("%s", message, extra=extra) if errors := list(mc.diagnostics.get_all_errors()): - raise DiagnosticError(DiagnosticCollection(errors), show_details=False) + raise DiagnosticErrorSummary(DiagnosticCollection(errors)) diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 7eea26bff..a8467e1b8 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -4,6 +4,7 @@ "string_to_number", "VersionNumber", "split_version", + "underline_code", ] @@ -12,7 +13,7 @@ from typing import Dict, Tuple, Union from beet.core.utils import normalize_string -from tokenstream import InvalidSyntax, Token, set_location +from tokenstream import InvalidSyntax, SourceLocation, Token, set_location from .error import InvalidEscapeSequence @@ -97,3 +98,50 @@ def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: if unicode_hex := match[1]: return chr(int(unicode_hex, 16)) return super().handle_substitution(token, match) + + +def underline_code( + source: str, + location: SourceLocation, + end_location: SourceLocation, + padding: int = 1, +) -> str: + """Underline code.""" + pos, lineno, colno = location + end_pos, end_lineno, end_colno = end_location + + view_begin = pos + view_end = end_pos + + for _ in range(padding + 1): + try: + view_begin = source.rindex("\n", 0, max(view_begin - 1, 0)) + 1 + except ValueError: + view_begin = 0 + try: + view_end = source.index("\n", min(view_end + 1, len(source))) + except ValueError: + view_end = len(source) + + view = source[view_begin:view_end].splitlines() + view_start_line = lineno - source[view_begin:pos].count("\n") + gutter = [f"{l + view_start_line} |" for l in range(len(view))] + + for line in reversed(range(lineno, end_lineno + 1)): + code = view[line - view_start_line] + start = colno if line == lineno else 1 + stop = end_colno if line == end_lineno else len(code) + 1 + + if start >= stop: + stop = start + 1 + + start = max(start, len(code) - len(code.lstrip()) + 1) + stop = min(stop, len(code.rstrip()) + 1) + + if start < stop: + underline = " " * (start - 1) + "^" * (stop - start) + view.insert(line - view_start_line + 1, underline) + gutter.insert(line - view_start_line + 1, ":") + + gutter_size = max(max(len(g) for g in gutter), 8) + return "\n".join(f"{g.rjust(gutter_size)} {text}" for g, text in zip(gutter, view)) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index ada567a58..22cdfef0d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -682,7 +682,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.2.2" +version = "1.2.3" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "ac99de64e0353c5a6927ea5c2a208312f8bc2b6c2524bbe0d07ff378f41262c3" +content-hash = "ca64113f811372659290d9dd5cda747a496246749e7abf0cf9564469e4ac0aae" [metadata.files] atomicwrites = [ @@ -1249,8 +1249,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.2.2-py3-none-any.whl", hash = "sha256:232fe74b730c004c0c0aa7bf7821d5a501219b26ccb3c204c670b79676f8436a"}, - {file = "tokenstream-1.2.2.tar.gz", hash = "sha256:7ecde53eb9ce3bc6df857015333ea2baacf14f90419023c6c2a88a9457e1f78c"}, + {file = "tokenstream-1.2.3-py3-none-any.whl", hash = "sha256:9e8f31608cc376b64256cb3bd533420f0fc9016dde91efdfb42c6a304b7c1f45"}, + {file = "tokenstream-1.2.3.tar.gz", hash = "sha256:4a7331632822a5ad13f8fc7d5f3de12571f2589e17b5f66e2089bcc65c5d0355"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c93105f06..f77495d68 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.41.9" -tokenstream = "^1.2.2" +tokenstream = "^1.2.3" [tool.poetry.dev-dependencies] black = "^21.9b0" From f040ac52ed9262c637d78e84dc3707fcd107f7d3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Oct 2021 06:31:13 +0200 Subject: [PATCH 0395/1554] refactor: move logging logic into finalize --- packages/mecha/mecha/api.py | 33 ++++++++++++++++++++++++++++++++- packages/mecha/mecha/plugin.py | 27 --------------------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 0dc9fcc59..5a9c73aa1 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -32,7 +32,12 @@ from .ast import AstNode, AstRoot from .config import CommandTree from .database import CompilationDatabase, CompilationUnit -from .diagnostic import Diagnostic, DiagnosticCollection, DiagnosticError +from .diagnostic import ( + Diagnostic, + DiagnosticCollection, + DiagnosticError, + DiagnosticErrorSummary, +) from .dispatch import Dispatcher, MutatingReducer, Reducer from .parse import delegate, get_parsers from .serialize import Serializer @@ -109,6 +114,8 @@ def __post_init__( if not self.cache: self.cache = ctx.cache["mecha"] + ctx.require(self.finalize) + else: self.directory = Path.cwd() @@ -385,3 +392,27 @@ def compile( raise DiagnosticError(DiagnosticCollection(errors)) return result + + def finalize(self, ctx: Context): + """Plugin that logs diagnostics and raises an exception if there are errors.""" + yield + + for diagnostic in self.diagnostics.exceptions: + message = diagnostic.format_message() + + if diagnostic.file: + if source := self.database[diagnostic.file].source: + if code := diagnostic.format_code(source): + message += f"\n{code}" + + extra = {"annotate": diagnostic.format_location()} + + if diagnostic.level == "error": + logger.error("%s", message, extra=extra) + elif diagnostic.level == "warn": + logger.warn("%s", message, extra=extra) + elif diagnostic.level == "info": + logger.info("%s", message, extra=extra) + + if errors := list(self.diagnostics.get_all_errors()): + raise DiagnosticErrorSummary(DiagnosticCollection(errors)) diff --git a/packages/mecha/mecha/plugin.py b/packages/mecha/mecha/plugin.py index 001050857..72e17c4f7 100644 --- a/packages/mecha/mecha/plugin.py +++ b/packages/mecha/mecha/plugin.py @@ -3,39 +3,12 @@ ] -import logging - from beet import Context from .api import Mecha -from .diagnostic import DiagnosticCollection, DiagnosticErrorSummary - -logger = logging.getLogger("mecha") def beet_default(ctx: Context): mc = ctx.inject(Mecha) mc.compile(ctx.data, report=mc.diagnostics) - - yield - - for diagnostic in mc.diagnostics.exceptions: - message = diagnostic.format_message() - - if diagnostic.file: - if source := mc.database[diagnostic.file].source: - if code := diagnostic.format_code(source): - message += f"\n{code}" - - extra = {"annotate": diagnostic.format_location()} - - if diagnostic.level == "error": - logger.error("%s", message, extra=extra) - elif diagnostic.level == "warn": - logger.warn("%s", message, extra=extra) - elif diagnostic.level == "info": - logger.info("%s", message, extra=extra) - - if errors := list(mc.diagnostics.get_all_errors()): - raise DiagnosticErrorSummary(DiagnosticCollection(errors)) From 66dccda67ffd3370d25c0bca2beeac3dfde05e6e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Oct 2021 07:29:39 +0200 Subject: [PATCH 0396/1554] feat: make it possible to emit new files during compilation --- packages/mecha/mecha/api.py | 65 +++++++++---------- packages/mecha/mecha/database.py | 33 +++++++++- ...nt_examples_minecraft_component_1_1__0.txt | 2 +- ...ment_examples_minecraft_message_1_0__0.txt | 2 +- ...ent_examples_minecraft_nbt_path_1_0__0.txt | 2 +- ...ent_examples_minecraft_nbt_tag_1_10__0.txt | 2 +- ...ent_examples_minecraft_particle_1_1__0.txt | 2 +- ...ent_examples_minecraft_particle_1_3__0.txt | 2 +- ...ent_examples_minecraft_particle_1_5__0.txt | 2 +- ...examples_minecraft_score_holder_2_3__0.txt | 2 +- packages/mecha/tests/test_compile.py | 2 + packages/mecha/tests/test_parse.py | 4 +- 12 files changed, 75 insertions(+), 45 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 5a9c73aa1..013ab034b 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -304,7 +304,7 @@ def compile( report: Optional[DiagnosticCollection] = None, ) -> Union[DataPack, TextFileBase[Any]]: """Apply all compilation steps.""" - functions: List[TextFileBase[Any]] = [] + self.database.setup_compilation() if isinstance(source, DataPack): result = source @@ -314,7 +314,6 @@ def compile( for key in source.functions.match(*match or ["*"]): value = source.functions[key] - functions.append(value) self.database[value] = CompilationUnit( resource_location=key, filename=( @@ -323,6 +322,7 @@ def compile( else None ), ) + self.database.enqueue(value) else: if isinstance(source, (list, str)): source = Function(source) @@ -334,53 +334,50 @@ def compile( else: result = Function() - functions.append(result) self.database[result] = CompilationUnit( ast=source if isinstance(source, AstRoot) else None, resource_location=resource_location, filename=str(filename) if filename else None, ) + self.database.enqueue(result) - for function in functions: + while not self.database.done: + step, function = self.database.dequeue() compilation_unit = self.database[function] - if compilation_unit.ast: - continue - - try: - compilation_unit.source = function.text - compilation_unit.ast = self.parse( - function, - filename=compilation_unit.filename, - resource_location=compilation_unit.resource_location, - multiline=multiline, - ) - except DiagnosticError as exc: - compilation_unit.diagnostics.extend(exc.diagnostics) - - for compilation_step in self.steps: - for function in functions: - compilation_unit = self.database[function] - + if step < 0: + if compilation_unit.ast: + self.database.enqueue(function, 0) + continue + try: + compilation_unit.source = function.text + compilation_unit.ast = self.parse( + function, + filename=compilation_unit.filename, + resource_location=compilation_unit.resource_location, + multiline=multiline, + ) + self.database.enqueue(function, 0) + except DiagnosticError as exc: + compilation_unit.diagnostics.extend(exc.diagnostics) + + elif step < len(self.steps): if not compilation_unit.ast: continue + with self.steps[step].use_diagnostics(compilation_unit.diagnostics): + compilation_unit.ast = self.steps[step](compilation_unit.ast) + self.database.enqueue(function, step + 1) - with compilation_step.use_diagnostics(compilation_unit.diagnostics): - compilation_unit.ast = compilation_step(compilation_unit.ast) - - for function in functions: - compilation_unit = self.database[function] - - if not compilation_unit.ast: - continue - - with self.serialize.use_diagnostics(compilation_unit.diagnostics): - function.text = self.serialize(compilation_unit.ast) + else: + if not compilation_unit.ast: + continue + with self.serialize.use_diagnostics(compilation_unit.diagnostics): + function.text = self.serialize(compilation_unit.ast) diagnostics = DiagnosticCollection( [ exc - for function in functions + for function in self.database.session for exc in self.database[function].diagnostics.exceptions ] ) diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index d5fbf6057..0725ca5a2 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -5,7 +5,8 @@ from dataclasses import dataclass -from typing import Any, Dict, Optional +from heapq import heappop, heappush +from typing import Any, Dict, List, Optional, Set, Tuple from beet import Container, TextFileBase from beet.core.utils import extra_field @@ -36,10 +37,14 @@ class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): """Compilation database.""" index: Dict[str, TextFileBase[Any]] + queue: List[Tuple[int, str, TextFileBase[Any]]] + session: Set[TextFileBase[Any]] def __init__(self): super().__init__() self.index = {} + self.queue = [] + self.session = set() def process( self, @@ -57,3 +62,29 @@ def __delitem__(self, key: TextFileBase[Any]): if index: del self.index[index] super().__delitem__(key) + + def setup_compilation(self): + """Setup database for compilation.""" + self.queue.clear() + self.session.clear() + + @property + def done(self): + """Return whether the internal queue is empty.""" + return not self.queue + + @property + def current(self) -> TextFileBase[Any]: + """Return the file currently being processed.""" + _, _, key = self.queue[0] + return key + + def enqueue(self, key: TextFileBase[Any], step: int = -1): + """Enqueue a file and schedule it to be processed with the given step.""" + heappush(self.queue, (step, self[key].resource_location or "", key)) + self.session.add(key) + + def dequeue(self) -> Tuple[int, TextFileBase[Any]]: + """Dequeue the next file that needs to be processed.""" + step, _, key = heappop(self.queue) + return step, key diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt index 189d8c7b5..a62cd90c8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:component 1 1 --- Reported 1 error. -line 1, column 8: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']'. \ No newline at end of file +line 1, column 9: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt index ea4664011..d9740386e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt @@ -6,4 +6,4 @@ Hello @p[team=winner :) --- Reported 1 error. -line 1, column 21: Expected bracket ']' but got literal ':)'. \ No newline at end of file +line 1, column 22: Expected bracket ']' but got literal ':)'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt index bc0af67d6..b1e284803 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_path_1_0__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_path 1 0 --- Reported 1 error. -line 1, column 9: Expected curly '}' but got string 'foo'. \ No newline at end of file +line 1, column 10: Expected curly '}' but got string 'foo'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt index a9a6afc86..a59bd6dec 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_10__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 10 --- Reported 1 error. -line 1, column 6: Expected colon but got string 'space'. \ No newline at end of file +line 1, column 7: Expected colon but got string 'space'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt index 1f0d30b47..085e784de 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:dust_color_transition 1.0 0.0 0.0 hello --- Reported 1 error. -line 1, column 44: Expected number but got literal 'hello'. \ No newline at end of file +line 1, column 45: Expected number but got literal 'hello'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt index 214649809..8b20ec3a9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_3__0.txt @@ -6,4 +6,4 @@ falling_dust grass_block[snowy=true]{hello: world wat} --- Reported 1 error. -line 1, column 50: Expected curly '}' but got string 'wat'. \ No newline at end of file +line 1, column 51: Expected curly '}' but got string 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt index 957aafc7e..f2ec04f6c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_5__0.txt @@ -6,4 +6,4 @@ vibration 0.0 64.0 0.0 5.0 thing --- Reported 1 error. -line 1, column 27: Expected number but got literal 'thing'. \ No newline at end of file +line 1, column 28: Expected number but got literal 'thing'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt index d3ae2e033..dc9417883 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt @@ -6,4 +6,4 @@ minecraft:score_holder 2 3 --- Reported 1 error. -line 1, column 4: Expected word or quoted_string but got equal '='. \ No newline at end of file +line 1, column 5: Expected word or quoted_string but got equal '='. \ No newline at end of file diff --git a/packages/mecha/tests/test_compile.py b/packages/mecha/tests/test_compile.py index 5386c076d..0b137ffbb 100644 --- a/packages/mecha/tests/test_compile.py +++ b/packages/mecha/tests/test_compile.py @@ -21,6 +21,7 @@ @rule(AstCommand, identifier="say:message") def convert_say_to_tellraw(node: AstCommand): + print(node) if isinstance(message := node.arguments[0], AstMessage): return replace( node, @@ -42,6 +43,7 @@ def convert_say_to_tellraw(node: AstCommand): @pytest.fixture def dummy_transform(mc: Mecha): + print("plz") mc.transform.extend(convert_say_to_tellraw) yield mc.transform.reset() diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index b29db3165..e3b673fe1 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -58,7 +58,7 @@ def test_argument_examples( test_name, str(properties), value, - exc_info.value.message, + str(exc_info.value), ] ) else: @@ -114,7 +114,7 @@ def test_player_name(mc: Mecha): "scoreboard players set some_really_long_name_right_here_but_its_actually_even_longer foo 42" ) assert ( - exc_info.value.message + str(exc_info.value) == "Reported 1 error.\n\nline 1, column 24: Expected up to 40 characters." ) From edb1c41aae0a23919dddc67383d6a07f0c3f670b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Oct 2021 07:35:36 +0200 Subject: [PATCH 0397/1554] fix: sort diagnostics --- packages/mecha/mecha/api.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 013ab034b..87619ca74 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -377,7 +377,10 @@ def compile( diagnostics = DiagnosticCollection( [ exc - for function in self.database.session + for function in sorted( + self.database.session, + key=lambda f: self.database[f].resource_location or "", + ) for exc in self.database[function].diagnostics.exceptions ] ) From 207c0894c7dd567f629ffeb70f0f10edefd7b17d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 20 Oct 2021 05:37:58 +0000 Subject: [PATCH 0398/1554] 0.6.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 8 ++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 3e7f502a7..fbc0bcd8f 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.6.0 (2021-10-20) +### Feature +* Make it possible to emit new files during compilation ([`a8bff86`](https://github.com/mcbeet/mecha/commit/a8bff869f493a5080c291d59d21f1d9811bbd22d)) +* Show formatted code when logging diagnostics ([`19e3974`](https://github.com/mcbeet/mecha/commit/19e3974ac4d4c8db8ba5a6bc858fa10fd158813b)) + +### Fix +* Sort diagnostics ([`0887b77`](https://github.com/mcbeet/mecha/commit/0887b7736a6c232f867ae72bbad6562697764c4d)) + ## v0.5.11 (2021-10-18) ### Fix * Provide "annotate" through extra logging argument ([`e88ad04`](https://github.com/mcbeet/mecha/commit/e88ad0437f0623cc77fee6cfff12c1451fd41dcc)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 9c904013e..97d7a2d52 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.11" +__version__ = "0.6.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f77495d68..93b7a17d8 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.5.11" +version = "0.6.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From f991b55f444dbad4b986f464464a942e21a94bcc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Oct 2021 09:08:23 +0200 Subject: [PATCH 0399/1554] fix: move InvalidEscapeSequence and UnrecognizedParser --- packages/mecha/mecha/error.py | 24 ------------------------ packages/mecha/mecha/parse.py | 13 ++++++++++++- packages/mecha/mecha/utils.py | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/mecha/mecha/error.py b/packages/mecha/mecha/error.py index 6ab8842fd..f51b979ed 100644 --- a/packages/mecha/mecha/error.py +++ b/packages/mecha/mecha/error.py @@ -1,31 +1,7 @@ __all__ = [ "MechaError", - "InvalidEscapeSequence", - "UnrecognizedParser", ] class MechaError(Exception): """Base class for all mecha errors.""" - - -class InvalidEscapeSequence(MechaError): - """Raised when a QuotedStringHandler encounters an invalid escape sequence.""" - - characters: str - index: int - - def __init__(self, characters: str, index: int): - super().__init__(characters, index) - self.characters = characters - self.index = index - - -class UnrecognizedParser(MechaError): - """Raised when delegating to an unrecognized parser.""" - - parser: str - - def __init__(self, parser: str): - super().__init__(parser) - self.parser = parser diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index d3b0f74df..52aef1dce 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -6,6 +6,7 @@ "get_stream_properties", "get_stream_multiline", "get_stream_line_indentation", + "UnrecognizedParser", "delegate", "consume_line_continuation", "parse_root", @@ -133,7 +134,7 @@ AstVector3, AstVibrationParticleParameters, ) -from .error import UnrecognizedParser +from .error import MechaError from .spec import CommandSpec, Parser from .utils import ( QuoteHelper, @@ -468,6 +469,16 @@ def get_stream_line_indentation(stream: TokenStream) -> int: return stream.data.get("line_indentation", stream.indentation[-1]) +class UnrecognizedParser(MechaError): + """Raised when delegating to an unrecognized parser.""" + + parser: str + + def __init__(self, parser: str): + super().__init__(parser) + self.parser = parser + + @overload def delegate(parser: str) -> Parser: ... diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index a8467e1b8..3d7a41b28 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -1,6 +1,7 @@ __all__ = [ "QuoteHelper", "QuoteHelperWithUnicode", + "InvalidEscapeSequence", "string_to_number", "VersionNumber", "split_version", @@ -15,7 +16,7 @@ from beet.core.utils import normalize_string from tokenstream import InvalidSyntax, SourceLocation, Token, set_location -from .error import InvalidEscapeSequence +from .error import MechaError ESCAPE_REGEX = re.compile(r"\\.") UNICODE_ESCAPE_REGEX = re.compile(r"\\(?:u([0-9a-fA-F]{4})|.)") @@ -39,6 +40,18 @@ def split_version(version: VersionNumber) -> Tuple[int, ...]: return tuple(map(int, version)) +class InvalidEscapeSequence(MechaError): + """Raised when a QuotedStringHandler encounters an invalid escape sequence.""" + + characters: str + index: int + + def __init__(self, characters: str, index: int): + super().__init__(characters, index) + self.characters = characters + self.index = index + + @dataclass class QuoteHelper: """Helper for removing quotes and interpreting escape sequences.""" From afcbc75336933dd3f90298d813843e6083a1ac4f Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 20 Oct 2021 07:09:14 +0000 Subject: [PATCH 0400/1554] 0.6.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index fbc0bcd8f..57f21fe03 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.6.1 (2021-10-20) +### Fix +* Move InvalidEscapeSequence and UnrecognizedParser ([`f17030c`](https://github.com/mcbeet/mecha/commit/f17030c9db2424d4e7a90df88c24b624d938d8df)) + ## v0.6.0 (2021-10-20) ### Feature * Make it possible to emit new files during compilation ([`a8bff86`](https://github.com/mcbeet/mecha/commit/a8bff869f493a5080c291d59d21f1d9811bbd22d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 97d7a2d52..cc66ae399 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.0" +__version__ = "0.6.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 93b7a17d8..82505181c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.6.0" +version = "0.6.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 50e01065064276c0476641ff46d3a135d84eea0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Oct 2021 12:20:08 +0000 Subject: [PATCH 0401/1554] chore(deps-dev): bump pyright from 1.1.178 to 1.1.180 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.178 to 1.1.180. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.180/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index d7cde9259..7e33ff295 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.178" + "pyright": "^1.1.180" } }, "node_modules/pyright": { - "version": "1.1.178", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.178.tgz", - "integrity": "sha512-OhEoC5HfKZqvY5GVCsHeroYDx85xp4CZwevhNsePxNzZyW+W491K4bfLTvuOBnvcnMWip+aMQ7zzFDkw74Gtkg==", + "version": "1.1.180", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.180.tgz", + "integrity": "sha512-jWAvBBpBhdTEUWSaY1cS5dFJys2bR61GKYhCpWmlR/FZ7+zJYVWwsEnE+lXk7iwJ7NrNSlK2+cHiYkN+s5P7sQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.178", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.178.tgz", - "integrity": "sha512-OhEoC5HfKZqvY5GVCsHeroYDx85xp4CZwevhNsePxNzZyW+W491K4bfLTvuOBnvcnMWip+aMQ7zzFDkw74Gtkg==", + "version": "1.1.180", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.180.tgz", + "integrity": "sha512-jWAvBBpBhdTEUWSaY1cS5dFJys2bR61GKYhCpWmlR/FZ7+zJYVWwsEnE+lXk7iwJ7NrNSlK2+cHiYkN+s5P7sQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index e5d5b2bfa..1d4114705 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.178" + "pyright": "^1.1.180" } } From 688d0a9bf31adb18c44147725a0ae2835178bd21 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 23 Oct 2021 07:50:38 +0200 Subject: [PATCH 0402/1554] chore: add shim to allow Github to detect the package --- packages/mecha/setup.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 packages/mecha/setup.py diff --git a/packages/mecha/setup.py b/packages/mecha/setup.py new file mode 100644 index 000000000..71b84438b --- /dev/null +++ b/packages/mecha/setup.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python + +# This is a shim to allow Github to detect the package, build is done with poetry + +import setuptools + +if __name__ == "__main__": + setuptools.setup(name="mecha") From 0c7cd37dbddb030f47f4c79b2759aae89ab0264c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 23 Oct 2021 07:51:34 +0200 Subject: [PATCH 0403/1554] chore: add shim to allow Github to detect the package --- packages/lectern/setup.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 packages/lectern/setup.py diff --git a/packages/lectern/setup.py b/packages/lectern/setup.py new file mode 100644 index 000000000..9978670de --- /dev/null +++ b/packages/lectern/setup.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python + +# This is a shim to allow Github to detect the package, build is done with poetry + +import setuptools + +if __name__ == "__main__": + setuptools.setup(name="lectern") From 9d3ceba66ab42bbf5465a6bc274aa0c1a2644a91 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 23 Oct 2021 07:53:43 +0200 Subject: [PATCH 0404/1554] chore: pyright ignore setup.py --- packages/lectern/pyrightconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/lectern/pyrightconfig.json b/packages/lectern/pyrightconfig.json index 0102dcd92..6ee1ec7ed 100644 --- a/packages/lectern/pyrightconfig.json +++ b/packages/lectern/pyrightconfig.json @@ -1,3 +1,4 @@ { - "typeCheckingMode": "strict" + "typeCheckingMode": "strict", + "ignore": ["setup.py"] } From 91832c9e30dbfa21af9661767b5a0d5dee0d8a8d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 23 Oct 2021 08:13:02 +0200 Subject: [PATCH 0405/1554] fix: update lockfile and add discord badge --- packages/lectern/README.md | 1 + packages/lectern/poetry.lock | 621 +++++++++++++++++++---------------- 2 files changed, 344 insertions(+), 278 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index b4b94412c..2b55112f0 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -6,6 +6,7 @@ [![PyPI](https://img.shields.io/pypi/v/lectern.svg)](https://pypi.org/project/lectern/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/lectern.svg)](https://pypi.org/project/lectern/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) +[![Discord](https://img.shields.io/discord/900530660677156924?color=7289DA&label=discord&logo=discord&logoColor=fff)](https://discord.gg/98MdSGMm8j) > Literate Minecraft data packs and resource packs. diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 427908046..d7bbf610f 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.7" +version = "0.43.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -49,7 +49,7 @@ Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" pydantic = ">=1.8.2,<2.0.0" -PyYAML = ">=5.4.1,<6.0.0" +PyYAML = ">=5.4.1,<7.0.0" toml = ">=0.10.2,<0.11.0" [package.extras] @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.8b0" +version = "21.9b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -84,11 +84,11 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "3.3.0" +version = "4.1.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] packaging = "*" @@ -97,7 +97,7 @@ webencodings = "*" [[package]] name = "certifi" -version = "2020.12.5" +version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -105,7 +105,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.5" +version = "1.15.0" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -115,12 +115,15 @@ python-versions = "*" pycparser = "*" [[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" +name = "charset-normalizer" +version = "2.0.7" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] [[package]] name = "click" @@ -168,7 +171,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.4.7" +version = "35.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -181,9 +184,9 @@ cffi = ">=1.12" docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "docutils" @@ -214,38 +217,38 @@ python-versions = "*" [[package]] name = "gitdb" -version = "4.0.7" +version = "4.0.8" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.4" +python-versions = ">=3.6" [package.dependencies] -smmap = ">=3.0.1,<5" +smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.15" -description = "Python Git Library" +version = "3.1.24" +description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = ">=3.7.4.0" +typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "idna" -version = "2.10" +version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.0.1" +version = "4.8.1" description = "Read metadata from Python packages" category = "dev" optional = false @@ -256,7 +259,8 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -268,7 +272,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.5.0" +version = "1.6.0" description = "Pythonic task execution" category = "dev" optional = false @@ -290,18 +294,19 @@ plugins = ["setuptools"] [[package]] name = "jeepney" -version = "0.6.0" +version = "0.7.1" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false python-versions = ">=3.6" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.1" +version = "3.0.2" description = "A very fast and expressive template engine." category = "main" optional = false @@ -315,7 +320,7 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.0.1" +version = "23.2.1" description = "Store and access your passwords safely." category = "dev" optional = false @@ -379,7 +384,7 @@ numpy = "*" [[package]] name = "numpy" -version = "1.20.1" +version = "1.21.1" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -387,11 +392,11 @@ python-versions = ">=3.7" [[package]] name = "packaging" -version = "20.9" +version = "21.0" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] pyparsing = ">=2.0.2" @@ -406,7 +411,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pkginfo" -version = "1.7.0" +version = "1.7.1" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false @@ -417,7 +422,7 @@ testing = ["nose", "coverage"] [[package]] name = "platformdirs" -version = "2.3.0" +version = "2.4.0" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false @@ -429,14 +434,15 @@ test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -471,7 +477,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.9.0" +version = "2.10.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -520,14 +526,14 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "2.7.1" +version = "2.10.1" description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.6.0" [package.dependencies] -requests = ">=2.22.0" +requests = ">=2.25.0" requests-toolbelt = ">=0.9.1" [package.extras] @@ -570,15 +576,15 @@ python-versions = "*" [[package]] name = "pyyaml" -version = "5.4.1" +version = "6.0" description = "YAML parser and emitter for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "29.0" +version = "30.0" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -588,14 +594,13 @@ python-versions = "*" bleach = ">=2.1.0" docutils = ">=0.13.1" Pygments = ">=2.5.1" -six = "*" [package.extras] -md = ["cmarkgfm (>=0.5.0,<0.6.0)"] +md = ["cmarkgfm (>=0.5.0,<0.7.0)"] [[package]] name = "regex" -version = "2021.4.4" +version = "2021.10.23" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -603,21 +608,21 @@ python-versions = "*" [[package]] name = "requests" -version = "2.25.1" +version = "2.26.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-toolbelt" @@ -674,14 +679,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "6.0.1" +version = "6.3.2" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false python-versions = ">=3.6" +[package.dependencies] +packaging = ">=20.0" +tomli = ">=1.0.0" + [package.extras] -toml = ["toml"] +toml = ["setuptools (>=42)", "tomli (>=1.0.0)"] [[package]] name = "six" @@ -693,11 +702,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" -version = "4.0.0" +version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "toml" @@ -725,12 +734,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "tqdm" -version = "4.60.0" +version = "4.62.3" description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] @@ -738,7 +750,7 @@ telegram = ["requests"] [[package]] name = "twine" -version = "3.4.1" +version = "3.4.2" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -765,16 +777,16 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.4" +version = "1.26.7" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] +brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "webencodings" @@ -786,15 +798,15 @@ python-versions = "*" [[package]] name = "wrapt" -version = "1.12.1" +version = "1.13.2" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.4.1" +version = "3.6.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false @@ -802,7 +814,7 @@ python-versions = ">=3.6" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] lock-version = "1.1" @@ -823,75 +835,76 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.7-py3-none-any.whl", hash = "sha256:504bb6e01dc9747cc49a77394d846ba9f75376b144d9d349a0d82b582283b3ee"}, - {file = "beet-0.41.7.tar.gz", hash = "sha256:99d6b574e5c7b070897edfa7c85b2a7b445296726f4b6b5d9e8cabdd0fac4393"}, + {file = "beet-0.43.3-py3-none-any.whl", hash = "sha256:d9b50456915a0a4730acfd2dd8af34aae9e6a4929541ed4b8eaaa88e5c7300dd"}, + {file = "beet-0.43.3.tar.gz", hash = "sha256:7cd8238aa4aada077bd61964a30fe913fee9dc70cd67557bb8a1f6fad66f42eb"}, ] black = [ - {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, - {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, + {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, + {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, ] bleach = [ - {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, - {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, + {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, + {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, ] certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, + {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, ] click = [ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, @@ -910,20 +923,26 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, + {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, + {file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"}, + {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"}, + {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"}, + {file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"}, + {file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"}, + {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, ] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, @@ -936,45 +955,45 @@ fnvhash = [ {file = "fnvhash-0.1.0.tar.gz", hash = "sha256:3e82d505054f9f3987b2b5b649f7e7b6f48349f6af8a1b8e4d66779699c85a8e"}, ] gitdb = [ - {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, - {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, + {file = "gitdb-4.0.8-py3-none-any.whl", hash = "sha256:6875cbaed01f1b750394f372607803768fc7dad7c58c7ceb5f5917e980d779b2"}, + {file = "gitdb-4.0.8.tar.gz", hash = "sha256:858966a9310649cb24a387c101429bb5a1110068a312517722b0281077e78bc6"}, ] gitpython = [ - {file = "GitPython-3.1.15-py3-none-any.whl", hash = "sha256:a77824e516d3298b04fb36ec7845e92747df8fcfee9cacc32dd6239f9652f867"}, - {file = "GitPython-3.1.15.tar.gz", hash = "sha256:05af150f47a5cca3f4b0af289b73aef8cf3c4fe2385015b06220cbcdee48bb6e"}, + {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"}, + {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"}, ] idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"}, - {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"}, + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, - {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, - {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, + {file = "invoke-1.6.0-py2-none-any.whl", hash = "sha256:e6c9917a1e3e73e7ea91fdf82d5f151ccfe85bf30cc65cdb892444c02dbb5f74"}, + {file = "invoke-1.6.0-py3-none-any.whl", hash = "sha256:769e90caeb1bd07d484821732f931f1ad8916a38e3f3e618644687fc09cb6317"}, + {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"}, ] isort = [ {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, ] jeepney = [ - {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, - {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, + {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, + {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, + {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, + {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, ] keyring = [ - {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, - {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, + {file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"}, + {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, @@ -1045,50 +1064,54 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, - {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, - {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, - {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, - {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, - {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, - {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, - {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, - {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, - {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, - {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, + {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, + {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, + {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, + {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, + {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, + {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, + {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, + {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, + {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, ] packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pkginfo = [ - {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, - {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, + {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, + {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, ] platformdirs = [ - {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, - {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, ] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] py = [ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, @@ -1123,8 +1146,8 @@ pydantic = [ {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1139,8 +1162,8 @@ pytest-insta = [ {file = "pytest_insta-0.1.10-py3-none-any.whl", hash = "sha256:3043c4a668224f473df3de1d60fb356e356687b6931338c42c487abd0c9a19d8"}, ] python-gitlab = [ - {file = "python-gitlab-2.7.1.tar.gz", hash = "sha256:e1f9234a3ee7fbcf9ab1a5cb8b935ae58fdab29af9832ae060bf74d88bac8a7c"}, - {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, + {file = "python-gitlab-2.10.1.tar.gz", hash = "sha256:7afa7d7c062fa62c173190452265a30feefb844428efc58ea5244f3b9fc0d40f"}, + {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, ] python-semantic-release = [ {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, @@ -1151,86 +1174,85 @@ pywin32-ctypes = [ {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, - {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, + {file = "readme_renderer-30.0-py2.py3-none-any.whl", hash = "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc"}, + {file = "readme_renderer-30.0.tar.gz", hash = "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8"}, ] regex = [ - {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, - {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, - {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, - {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, - {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, - {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, - {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, - {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, - {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, - {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, - {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, - {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, - {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, + {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"}, + {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"}, + {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"}, + {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"}, + {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"}, + {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"}, + {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"}, + {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"}, + {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"}, + {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"}, + {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"}, + {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"}, + {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"}, + {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"}, + {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"}, + {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"}, ] requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, @@ -1252,16 +1274,16 @@ semver = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-6.0.1-py3-none-any.whl", hash = "sha256:c3bd5f701c8def44a5c0bfe8d407bef3f80342217ef3492b951f3777bd2d915c"}, - {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, + {file = "setuptools_scm-6.3.2-py3-none-any.whl", hash = "sha256:4c64444b1d49c4063ae60bfe1680f611c8b13833d556fd1d6050c0023162a119"}, + {file = "setuptools_scm-6.3.2.tar.gz", hash = "sha256:a49aa8081eeb3514eb9728fa5040f2eaa962d6c6f4ec9c32f6c1fba88f88a0f2"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] smmap = [ - {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, - {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, @@ -1276,12 +1298,12 @@ tomlkit = [ {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] tqdm = [ - {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, - {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, + {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"}, + {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"}, ] twine = [ - {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, - {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, + {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, + {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, ] typing-extensions = [ {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, @@ -1289,17 +1311,60 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ - {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, - {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, + {file = "wrapt-1.13.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3de7b4d3066cc610054e7aa2c005645e308df2f92be730aae3a47d42e910566a"}, + {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:8164069f775c698d15582bf6320a4f308c50d048c1c10cf7d7a341feaccf5df7"}, + {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9adee1891253670575028279de8365c3a02d3489a74a66d774c321472939a0b1"}, + {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a70d876c9aba12d3bd7f8f1b05b419322c6789beb717044eea2c8690d35cb91b"}, + {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3f87042623530bcffea038f824b63084180513c21e2e977291a9a7e65a66f13b"}, + {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e634136f700a21e1fcead0c137f433dde928979538c14907640607d43537d468"}, + {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3e33c138d1e3620b1e0cc6fd21e46c266393ed5dae0d595b7ed5a6b73ed57aa0"}, + {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:283e402e5357e104ac1e3fba5791220648e9af6fb14ad7d9cc059091af2b31d2"}, + {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ccb34ce599cab7f36a4c90318697ead18312c67a9a76327b3f4f902af8f68ea1"}, + {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fbad5ba74c46517e6488149514b2e2348d40df88cd6b52a83855b7a8bf04723f"}, + {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:724ed2bc9c91a2b9026e5adce310fa60c6e7c8760b03391445730b9789b9d108"}, + {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:83f2793ec6f3ef513ad8d5b9586f5ee6081cad132e6eae2ecb7eac1cc3decae0"}, + {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0473d1558b93e314e84313cc611f6c86be779369f9d3734302bf185a4d2625b1"}, + {file = "wrapt-1.13.2-cp35-cp35m-win32.whl", hash = "sha256:15eee0e6fd07f48af2f66d0e6f2ff1916ffe9732d464d5e2390695296872cad9"}, + {file = "wrapt-1.13.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bc85d17d90201afd88e3d25421da805e4e135012b5d1f149e4de2981394b2a52"}, + {file = "wrapt-1.13.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6ee5f8734820c21b9b8bf705e99faba87f21566d20626568eeb0d62cbeaf23c"}, + {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:53c6706a1bcfb6436f1625511b95b812798a6d2ccc51359cd791e33722b5ea32"}, + {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fbe6aebc9559fed7ea27de51c2bf5c25ba2a4156cf0017556f72883f2496ee9a"}, + {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0582180566e7a13030f896c2f1ac6a56134ab5f3c3f4c5538086f758b1caf3f2"}, + {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bff0a59387a0a2951cb869251257b6553663329a1b5525b5226cab8c88dcbe7e"}, + {file = "wrapt-1.13.2-cp36-cp36m-win32.whl", hash = "sha256:df3eae297a5f1594d1feb790338120f717dac1fa7d6feed7b411f87e0f2401c7"}, + {file = "wrapt-1.13.2-cp36-cp36m-win_amd64.whl", hash = "sha256:1eb657ed84f4d3e6ad648483c8a80a0cf0a78922ef94caa87d327e2e1ad49b48"}, + {file = "wrapt-1.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0cdedf681db878416c05e1831ec69691b0e6577ac7dca9d4f815632e3549580"}, + {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:87ee3c73bdfb4367b26c57259995935501829f00c7b3eed373e2ad19ec21e4e4"}, + {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3e0d16eedc242d01a6f8cf0623e9cdc3b869329da3f97a15961d8864111d8cf0"}, + {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:8318088860968c07e741537030b1abdd8908ee2c71fbe4facdaade624a09e006"}, + {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d90520616fce71c05dedeac3a0fe9991605f0acacd276e5f821842e454485a70"}, + {file = "wrapt-1.13.2-cp37-cp37m-win32.whl", hash = "sha256:22142afab65daffc95863d78effcbd31c19a8003eca73de59f321ee77f73cadb"}, + {file = "wrapt-1.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d0d717e10f952df7ea41200c507cc7e24458f4c45b56c36ad418d2e79dacd1d4"}, + {file = "wrapt-1.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:593cb049ce1c391e0288523b30426c4430b26e74c7e6f6e2844bd99ac7ecc831"}, + {file = "wrapt-1.13.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8860c8011a6961a651b1b9f46fdbc589ab63b0a50d645f7d92659618a3655867"}, + {file = "wrapt-1.13.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ada5e29e59e2feb710589ca1c79fd989b1dd94d27079dc1d199ec954a6ecc724"}, + {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:fdede980273aeca591ad354608778365a3a310e0ecdd7a3587b38bc5be9b1808"}, + {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:af9480de8e63c5f959a092047aaf3d7077422ded84695b3398f5d49254af3e90"}, + {file = "wrapt-1.13.2-cp38-cp38-win32.whl", hash = "sha256:c65e623ea7556e39c4f0818200a046cbba7575a6b570ff36122c276fdd30ab0a"}, + {file = "wrapt-1.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:b20703356cae1799080d0ad15085dc3213c1ac3f45e95afb9f12769b98231528"}, + {file = "wrapt-1.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c5c4cf188b5643a97e87e2110bbd4f5bc491d54a5b90633837b34d5df6a03fe"}, + {file = "wrapt-1.13.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:82223f72eba6f63eafca87a0f614495ae5aa0126fe54947e2b8c023969e9f2d7"}, + {file = "wrapt-1.13.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81a4cf257263b299263472d669692785f9c647e7dca01c18286b8f116dbf6b38"}, + {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:728e2d9b7a99dd955d3426f237b940fc74017c4a39b125fec913f575619ddfe9"}, + {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7574de567dcd4858a2ffdf403088d6df8738b0e1eabea220553abf7c9048f59e"}, + {file = "wrapt-1.13.2-cp39-cp39-win32.whl", hash = "sha256:c7ac2c7a8e34bd06710605b21dd1f3576764443d68e069d2afba9b116014d072"}, + {file = "wrapt-1.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e6d1a8eeef415d7fb29fe017de0e48f45e45efd2d1bfda28fc50b7b330859ef"}, + {file = "wrapt-1.13.2.tar.gz", hash = "sha256:dca56cc5963a5fd7c2aa8607017753f534ee514e09103a6c55d2db70b50e7447"}, ] zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, ] From f1d4e008b5d19886f977a5def84b5248c7834488 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 23 Oct 2021 08:14:04 +0200 Subject: [PATCH 0406/1554] fix: add discord badge --- packages/mecha/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index b978629a3..d39765b91 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -6,6 +6,7 @@ [![PyPI](https://img.shields.io/pypi/v/mecha.svg)](https://pypi.org/project/mecha/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mecha.svg)](https://pypi.org/project/mecha/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) +[![Discord](https://img.shields.io/discord/900530660677156924?color=7289DA&label=discord&logo=discord&logoColor=fff)](https://discord.gg/98MdSGMm8j) > A powerful Minecraft command library. From 07c46cae191e80d29273adcd307bd5fa9af29dd2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 23 Oct 2021 06:14:32 +0000 Subject: [PATCH 0407/1554] 0.16.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 0750b4dcc..7aba82350 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.16.1 (2021-10-23) +### Fix +* Update lockfile and add discord badge ([`3a76ee5`](https://github.com/mcbeet/lectern/commit/3a76ee57d1f125359b74d20d673bfa3dc862742c)) + ## v0.16.0 (2021-09-08) ### Feature * Add lectern.contrib.plugin ([`17e1c78`](https://github.com/mcbeet/lectern/commit/17e1c7830d73035b561388aece25d85a542057f8)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 377112c46..a87aad710 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.16.0" +__version__ = "0.16.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 94b83f1ff..dae03a09d 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.16.0" +version = "0.16.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 3d6f67b7508c3af06594f69eae3f95104075863f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 23 Oct 2021 06:15:04 +0000 Subject: [PATCH 0408/1554] 0.6.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 57f21fe03..26d8a7bdb 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.6.2 (2021-10-23) +### Fix +* Add discord badge ([`d721c44`](https://github.com/mcbeet/mecha/commit/d721c4425119864c93d0d5a17e0b244ef6c18ba3)) + ## v0.6.1 (2021-10-20) ### Fix * Move InvalidEscapeSequence and UnrecognizedParser ([`f17030c`](https://github.com/mcbeet/mecha/commit/f17030c9db2424d4e7a90df88c24b624d938d8df)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index cc66ae399..d9f40f622 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.1" +__version__ = "0.6.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 82505181c..1770b4e15 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.6.1" +version = "0.6.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 39ed672f7787e00f853010c77da8967e95f4d7d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Oct 2021 12:20:16 +0000 Subject: [PATCH 0409/1554] chore(deps): bump beet from 0.41.9 to 0.43.3 Bumps [beet](https://github.com/mcbeet/beet) from 0.41.9 to 0.43.3. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.41.9...v0.43.3) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 22cdfef0d..60fc0e3d5 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.41.9" +version = "0.43.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -812,8 +812,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.41.9-py3-none-any.whl", hash = "sha256:516002505948ab49a3816b989367a4436341190749ea5f9354d827959f53e5d6"}, - {file = "beet-0.41.9.tar.gz", hash = "sha256:156e695681fe0a6c079817d2fc71929fa2c3553ebac1c3b60f64cb08f24322ca"}, + {file = "beet-0.43.3-py3-none-any.whl", hash = "sha256:d9b50456915a0a4730acfd2dd8af34aae9e6a4929541ed4b8eaaa88e5c7300dd"}, + {file = "beet-0.43.3.tar.gz", hash = "sha256:7cd8238aa4aada077bd61964a30fe913fee9dc70cd67557bb8a1f6fad66f42eb"}, ] black = [ {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, @@ -971,6 +971,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, @@ -982,6 +985,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -993,6 +999,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, @@ -1005,6 +1014,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1017,6 +1029,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, From 4e28c247ba07954d6d79c47771fa7e89af06ce1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 12:22:01 +0000 Subject: [PATCH 0410/1554] chore(deps-dev): bump pyright from 1.1.180 to 1.1.184 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.180 to 1.1.184. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.184/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 7e33ff295..52f6c1771 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.180" + "pyright": "^1.1.184" } }, "node_modules/pyright": { - "version": "1.1.180", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.180.tgz", - "integrity": "sha512-jWAvBBpBhdTEUWSaY1cS5dFJys2bR61GKYhCpWmlR/FZ7+zJYVWwsEnE+lXk7iwJ7NrNSlK2+cHiYkN+s5P7sQ==", + "version": "1.1.184", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", + "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.180", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.180.tgz", - "integrity": "sha512-jWAvBBpBhdTEUWSaY1cS5dFJys2bR61GKYhCpWmlR/FZ7+zJYVWwsEnE+lXk7iwJ7NrNSlK2+cHiYkN+s5P7sQ==", + "version": "1.1.184", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", + "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 1d4114705..e2e007a4b 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.180" + "pyright": "^1.1.184" } } From 55036c0f5eb35d29f801e6f176e436ec9257d38e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Nov 2021 12:18:56 +0000 Subject: [PATCH 0411/1554] chore(deps-dev): bump isort from 5.9.3 to 5.10.0 Bumps [isort](https://github.com/pycqa/isort) from 5.9.3 to 5.10.0. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.9.3...5.10.0) --- updated-dependencies: - dependency-name: isort dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 23 +++++++++++++++++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 22cdfef0d..987d9330a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -276,7 +276,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.9.3" +version = "5.10.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "ca64113f811372659290d9dd5cda747a496246749e7abf0cf9564469e4ac0aae" +content-hash = "44718840da3f9463f62e8f00f19e668b81dfd714e091bfcece5e1b39155217a7" [metadata.files] atomicwrites = [ @@ -950,8 +950,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, - {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, + {file = "isort-5.10.0-py3-none-any.whl", hash = "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f"}, + {file = "isort-5.10.0.tar.gz", hash = "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, @@ -971,6 +971,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, @@ -982,6 +985,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -993,6 +999,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, @@ -1005,6 +1014,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1017,6 +1029,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1770b4e15..1e7e58caa 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -30,7 +30,7 @@ tokenstream = "^1.2.3" black = "^21.9b0" rope = "^0.20.1" pytest = "^6.2.5" -isort = "^5.9.3" +isort = "^5.10.0" python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" From cfdc9e1521ca8b8477965b7256efd126bb18fc42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 18:42:09 +0000 Subject: [PATCH 0412/1554] chore(deps-dev): bump black from 21.9b0 to 21.10b0 Bumps [black](https://github.com/psf/black) from 21.9b0 to 21.10b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 12 ++++++------ packages/mecha/pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1d21a5008..ce9f41d3b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.9b0" +version = "21.10b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,9 +77,9 @@ typing-extensions = [ [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "44718840da3f9463f62e8f00f19e668b81dfd714e091bfcece5e1b39155217a7" +content-hash = "e3ad6d068916d84e1891d91f7c26b615d78b99600256a36d0f449ed3a4c5a3c0" [metadata.files] atomicwrites = [ @@ -816,8 +816,8 @@ beet = [ {file = "beet-0.43.3.tar.gz", hash = "sha256:7cd8238aa4aada077bd61964a30fe913fee9dc70cd67557bb8a1f6fad66f42eb"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, + {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1e7e58caa..6b967bc90 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.41.9" tokenstream = "^1.2.3" [tool.poetry.dev-dependencies] -black = "^21.9b0" +black = "^21.10b0" rope = "^0.20.1" pytest = "^6.2.5" isort = "^5.10.0" From d8f9d76f85e1c1335ef3a81b1db10cc9516baa19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 01:25:32 +0000 Subject: [PATCH 0413/1554] chore(deps-dev): bump black from 21.9b0 to 21.10b0 Bumps [black](https://github.com/psf/black) from 21.9b0 to 21.10b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 27 +++++++++++++++++++++------ packages/lectern/pyproject.toml | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index d7bbf610f..bdd88025d 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.9b0" +version = "21.10b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -77,9 +77,9 @@ typing-extensions = [ [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -819,7 +819,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "891a90667ca62e67c6619796efdef4ecb58d7750155b1cb128b0dea4681c9ec3" +content-hash = "9841cf255e41f4c1ee420a6d6d55a098bc2a6f81123830d7aed0b43dab15ddd2" [metadata.files] atomicwrites = [ @@ -839,8 +839,8 @@ beet = [ {file = "beet-0.43.3.tar.gz", hash = "sha256:7cd8238aa4aada077bd61964a30fe913fee9dc70cd67557bb8a1f6fad66f42eb"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, + {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -1005,6 +1005,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, @@ -1016,6 +1019,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1027,6 +1033,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, @@ -1039,6 +1048,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1051,6 +1063,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index dae03a09d..b3c6b3cba 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -30,7 +30,7 @@ markdown-it-py = "^1.1.0" click = "^8.0.1" [tool.poetry.dev-dependencies] -black = "^21.8b0" +black = "^21.10b0" rope = "^0.20.1" pytest = "^6.2.5" isort = "^5.9.3" From 4ed26977435c7f1d7d32f739a89524bb8232a823 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 18:14:58 +0100 Subject: [PATCH 0414/1554] chore: update pyright --- packages/lectern/lectern/extract.py | 2 +- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/lectern/lectern/extract.py b/packages/lectern/lectern/extract.py index dd6063c38..38ea57f0e 100644 --- a/packages/lectern/lectern/extract.py +++ b/packages/lectern/lectern/extract.py @@ -28,7 +28,7 @@ from beet import Cache, DataPack, ResourcePack from beet.core.utils import FileSystemPath -from markdown_it import MarkdownIt +from markdown_it.main import MarkdownIt from markdown_it.token import Token from .directive import Directive diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 3bf233998..1547ff786 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.166" + "pyright": "^1.1.184" } }, "node_modules/pyright": { - "version": "1.1.166", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.166.tgz", - "integrity": "sha512-mO+iPT2dhHzlplAV3iKE6u4gUstGZxxLyMSRd1PKZqWhwhTCCGjn3/7VqbAwUt4fuhY8g0V+SAsu+MPT4H3FvQ==", + "version": "1.1.184", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", + "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.166", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.166.tgz", - "integrity": "sha512-mO+iPT2dhHzlplAV3iKE6u4gUstGZxxLyMSRd1PKZqWhwhTCCGjn3/7VqbAwUt4fuhY8g0V+SAsu+MPT4H3FvQ==", + "version": "1.1.184", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", + "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index 6d9f96453..e2e007a4b 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.166" + "pyright": "^1.1.184" } } From 10df8432a3af392407369aeca7937eaf383ae0d5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 19:55:55 +0100 Subject: [PATCH 0415/1554] feat: add dynamic directive resolvers --- packages/lectern/examples/with_beet/beet.json | 14 ++ .../with_beet/isolated/message_test.md | 13 ++ .../lectern/contrib/relative_location.py | 4 +- .../lectern/lectern/contrib/yaml_to_json.py | 4 +- packages/lectern/lectern/directive.py | 158 ++++++------------ packages/lectern/lectern/document.py | 34 ++-- packages/lectern/lectern/prefetch.py | 4 +- packages/lectern/lectern/serialize.py | 92 ++++++---- packages/lectern/poetry.lock | 23 +-- packages/lectern/pyproject.toml | 2 +- .../examples__beet_project__0.pack.md | 10 ++ packages/lectern/tests/test_directive.py | 4 +- 12 files changed, 176 insertions(+), 186 deletions(-) create mode 100644 packages/lectern/examples/with_beet/isolated/message_test.md diff --git a/packages/lectern/examples/with_beet/beet.json b/packages/lectern/examples/with_beet/beet.json index aab038a5a..c0cc9aa53 100644 --- a/packages/lectern/examples/with_beet/beet.json +++ b/packages/lectern/examples/with_beet/beet.json @@ -32,6 +32,20 @@ "load": ["isolated/plugin_test.md"] } } + }, + { + "require": ["beet.contrib.messages"], + "pipeline": ["lectern", "beet.contrib.render"], + "meta": { + "lectern": { + "load": ["isolated/message_test.md"] + }, + "render": { + "data_pack": { + "functions": ["*"] + } + } + } } ], "meta": { diff --git a/packages/lectern/examples/with_beet/isolated/message_test.md b/packages/lectern/examples/with_beet/isolated/message_test.md new file mode 100644 index 000000000..0158e1bb3 --- /dev/null +++ b/packages/lectern/examples/with_beet/isolated/message_test.md @@ -0,0 +1,13 @@ +# Example with data pack messages + +`@message isolated:my_greeting` + +```json +["", { "text": "hello", "color": "red" }] +``` + +`@function isolated:message_demo` + +```mcfunction +tellraw @a {{ "isolated:my_greeting" | msg }} +``` diff --git a/packages/lectern/lectern/contrib/relative_location.py b/packages/lectern/lectern/contrib/relative_location.py index 6deadc25e..f606b948c 100644 --- a/packages/lectern/lectern/contrib/relative_location.py +++ b/packages/lectern/lectern/contrib/relative_location.py @@ -11,7 +11,7 @@ from beet import Context -from lectern import AnyDirective, Document, Fragment, NamespacedResourceDirective +from lectern import Directive, Document, Fragment, NamespacedResourceDirective def beet_default(ctx: Context): @@ -28,7 +28,7 @@ class RelativeNamespacedResourceLoader: def __call__( self, fragment: Fragment, - directives: Mapping[str, AnyDirective], + directives: Mapping[str, Directive], ) -> Fragment: if isinstance(directives[fragment.directive], NamespacedResourceDirective): name = fragment.expect("name") diff --git a/packages/lectern/lectern/contrib/yaml_to_json.py b/packages/lectern/lectern/contrib/yaml_to_json.py index 383373adb..5a82ccb56 100644 --- a/packages/lectern/lectern/contrib/yaml_to_json.py +++ b/packages/lectern/lectern/contrib/yaml_to_json.py @@ -13,8 +13,8 @@ from beet import Context, JsonFile from lectern import ( - AnyDirective, DataPackDirective, + Directive, Document, Fragment, NamespacedResourceDirective, @@ -27,7 +27,7 @@ def beet_default(ctx: Context): document.loaders.append(handle_yaml) -def handle_yaml(fragment: Fragment, directives: Mapping[str, AnyDirective]) -> Fragment: +def handle_yaml(fragment: Fragment, directives: Mapping[str, Directive]) -> Fragment: """Loader that converts yaml to json.""" directive = directives[fragment.directive] is_yaml = False diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 68d0fcd5b..7edcac372 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -1,75 +1,24 @@ __all__ = [ "Directive", - "AnyDirective", + "DirectiveRegistry", "NamespacedResourceDirective", "DataPackDirective", "ResourcePackDirective", "BundleFragmentMixin", "SkipDirective", - "get_builtin_directives", ] import io from dataclasses import dataclass -from typing import Any, Dict, Protocol, Type, Union +from typing import Any, Callable, Dict, List, Optional, Protocol, Type from zipfile import ZipFile -from beet import DataPack, ResourcePack -from beet.library.base import NamespaceFile -from beet.library.data_pack import ( - Advancement, - Biome, - BlockTag, - ConfiguredCarver, - ConfiguredFeature, - ConfiguredStructureFeature, - ConfiguredSurfaceBuilder, - Dimension, - DimensionType, - EntityTypeTag, - FluidTag, - Function, - FunctionTag, - ItemModifier, - ItemTag, - LootTable, - NoiseSettings, - Predicate, - ProcessorList, - Recipe, - Structure, - TemplatePool, -) -from beet.library.resource_pack import ( - Blockstate, - Font, - FragmentShader, - GlslShader, - GlyphSizeFile, - Language, - Model, - Particle, - Shader, - ShaderPost, - Sound, - Text, - Texture, - TextureMcmeta, - TrueTypeFont, - VertexShader, -) +from beet import Container, DataPack, NamespaceFile, ResourcePack +from beet.core.utils import snake_case from .fragment import Fragment -AnyDirective = Union[ - "Directive", - "NamespacedResourceDirective", - "DataPackDirective", - "ResourcePackDirective", - "SkipDirective", -] - class Directive(Protocol): """Protocol for detecting directives.""" @@ -78,6 +27,53 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): ... +class DirectiveRegistry(Container[str, Directive]): + """Registry for directives.""" + + resolvers: List[Callable[["DirectiveRegistry"], Any]] + assets: ResourcePack + data: DataPack + + def __init__( + self, + assets: Optional[ResourcePack] = None, + data: Optional[DataPack] = None, + ): + super().__init__() + self.resolvers = [] + self.assets = assets or ResourcePack() + self.data = data or DataPack() + + self["data_pack"] = DataPackDirective() + self["resource_pack"] = ResourcePackDirective() + self["skip"] = SkipDirective() + + @self.add_resolver + def _(self: DirectiveRegistry): + for pack in [self.assets, self.data]: + for file_type in pack.resolve_scope_map().values(): + name = snake_case(file_type.__name__) + self[name] = NamespacedResourceDirective(file_type) + + def resolve(self) -> "DirectiveRegistry": + """Resolve all directives in the registry.""" + for callback in self.resolvers: + callback(self) + return self + + def add_resolver(self, resolver: Callable[["DirectiveRegistry"], Any]): + """Add directive resolver.""" + self.resolvers.append(resolver) + + def get_serialization_mapping(self) -> Dict[Type[NamespaceFile], str]: + """Return the serialization mapping.""" + return { + directive.file_type: directive_name + for directive_name, directive in self.items() + if isinstance(directive, NamespacedResourceDirective) + } + + @dataclass class NamespacedResourceDirective: """Directive for including namespaced resources.""" @@ -141,55 +137,3 @@ class SkipDirective: def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): fragment.expect() - - -def get_builtin_directives() -> Dict[str, AnyDirective]: - """Return the built-in directives.""" - return { - # fmt: off - "advancement": NamespacedResourceDirective(Advancement), - "function": NamespacedResourceDirective(Function), - "loot_table": NamespacedResourceDirective(LootTable), - "predicate": NamespacedResourceDirective(Predicate), - "recipe": NamespacedResourceDirective(Recipe), - "structure": NamespacedResourceDirective(Structure), - "block_tag": NamespacedResourceDirective(BlockTag), - "entity_type_tag": NamespacedResourceDirective(EntityTypeTag), - "fluid_tag": NamespacedResourceDirective(FluidTag), - "function_tag": NamespacedResourceDirective(FunctionTag), - "item_tag": NamespacedResourceDirective(ItemTag), - "dimension_type": NamespacedResourceDirective(DimensionType), - "dimension": NamespacedResourceDirective(Dimension), - "biome": NamespacedResourceDirective(Biome), - "configured_carver": NamespacedResourceDirective(ConfiguredCarver), - "configured_feature": NamespacedResourceDirective(ConfiguredFeature), - "configured_structure_feature": NamespacedResourceDirective(ConfiguredStructureFeature), - "configured_surface_builder": NamespacedResourceDirective(ConfiguredSurfaceBuilder), - "noise_settings": NamespacedResourceDirective(NoiseSettings), - "processor_list": NamespacedResourceDirective(ProcessorList), - "template_pool": NamespacedResourceDirective(TemplatePool), - "item_modifier": NamespacedResourceDirective(ItemModifier), - - "blockstate": NamespacedResourceDirective(Blockstate), - "model": NamespacedResourceDirective(Model), - "language": NamespacedResourceDirective(Language), - "font": NamespacedResourceDirective(Font), - "glyph_sizes": NamespacedResourceDirective(GlyphSizeFile), - "truetype_font": NamespacedResourceDirective(TrueTypeFont), - "shader_post": NamespacedResourceDirective(ShaderPost), - "shader": NamespacedResourceDirective(Shader), - "fragment_shader": NamespacedResourceDirective(FragmentShader), - "vertex_shader": NamespacedResourceDirective(VertexShader), - "glsl_shader": NamespacedResourceDirective(GlslShader), - "text": NamespacedResourceDirective(Text), - "texture_mcmeta": NamespacedResourceDirective(TextureMcmeta), - "texture": NamespacedResourceDirective(Texture), - "sound": NamespacedResourceDirective(Sound), - "particle": NamespacedResourceDirective(Particle), - - "data_pack": DataPackDirective(), - "resource_pack": ResourcePackDirective(), - - "skip": SkipDirective(), - # fmt: on - } diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 8c59c70f7..6b7fe68eb 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -5,22 +5,12 @@ from dataclasses import InitVar, dataclass, field from pathlib import Path -from typing import ( - Any, - Dict, - List, - Literal, - MutableMapping, - Optional, - Tuple, - Union, - overload, -) +from typing import Any, Dict, List, Literal, Optional, Tuple, Union, overload from beet import Cache, Context, DataPack, File, ResourcePack from beet.core.utils import FileSystemPath, extra_field -from .directive import AnyDirective, get_builtin_directives +from .directive import DirectiveRegistry from .extract import FragmentLoader, MarkdownExtractor, TextExtractor from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer @@ -40,9 +30,7 @@ class Document: data: DataPack = field(default_factory=DataPack) loaders: List[FragmentLoader] = extra_field(default_factory=list) - directives: MutableMapping[str, AnyDirective] = extra_field( - default_factory=get_builtin_directives - ) + directives: DirectiveRegistry = extra_field(default_factory=DirectiveRegistry) text_extractor: TextExtractor = extra_field(default_factory=TextExtractor) markdown_extractor: MarkdownExtractor = extra_field( @@ -68,9 +56,14 @@ def __post_init__( self.data = ctx.data if cache is None: cache = ctx.cache["lectern"] + if cache: self.text_extractor.cache = cache self.markdown_extractor.cache = cache + + self.directives.assets = self.assets + self.directives.data = self.data + if path: self.load(path) if text: @@ -90,7 +83,7 @@ def add_text(self, source: str): """Extract pack fragments from plain text.""" assets, data = self.text_extractor.extract( source=source, - directives=self.directives, + directives=self.directives.resolve(), loaders=self.loaders, ) self.assets.merge(assets) @@ -104,7 +97,7 @@ def add_markdown( """Extract pack fragments from markdown.""" assets, data = self.markdown_extractor.extract( source=source, - directives=self.directives, + directives=self.directives.resolve(), loaders=self.loaders, external_files=external_files, ) @@ -113,7 +106,11 @@ def add_markdown( def get_text(self) -> str: """Turn the data pack and the resource pack into text.""" - return self.text_serializer.serialize(self.assets, self.data) + return self.text_serializer.serialize( + assets=self.assets, + data=self.data, + mapping=self.directives.resolve().get_serialization_mapping(), + ) @overload def get_markdown( @@ -140,6 +137,7 @@ def get_markdown( content = self.markdown_serializer.serialize( assets=self.assets, data=self.data, + mapping=self.directives.resolve().get_serialization_mapping(), external_files=external_files, external_prefix=prefix, ) diff --git a/packages/lectern/lectern/prefetch.py b/packages/lectern/lectern/prefetch.py index 2275109ab..6fcda5898 100644 --- a/packages/lectern/lectern/prefetch.py +++ b/packages/lectern/lectern/prefetch.py @@ -10,7 +10,7 @@ from beet import BinaryFile, Cache, File from beet.core.utils import FileSystemPath -from .directive import Directive, get_builtin_directives +from .directive import Directive, DirectiveRegistry from .extract import MarkdownExtractor from .fragment import Fragment from .serialize import ExternalFilesManager, SerializedFile @@ -37,7 +37,7 @@ def process_file( ): """Prefetch urls in the specified document.""" if directives is None: - directives = get_builtin_directives() + directives = DirectiveRegistry().resolve() path = Path(path).resolve() output = Path(output).resolve() diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index b6becf1de..7559ee140 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -3,7 +3,6 @@ "MarkdownSerializer", "ExternalFilesManager", "SerializedFile", - "NAMESPACED_RESOURCE_DIRECTIVES", "EXTENSION_HIGHLIGHTING", ] @@ -15,20 +14,12 @@ from mimetypes import guess_type from pathlib import Path from textwrap import indent -from typing import Any, Dict, Iterable, Iterator, Optional, Union +from typing import Any, Dict, Iterable, Iterator, Mapping, Optional, Type, Union from urllib.parse import urlparse from beet import DataPack, File, NamespaceFile, ResourcePack, TextFileBase from beet.core.utils import normalize_string -from .directive import NamespacedResourceDirective, get_builtin_directives - -NAMESPACED_RESOURCE_DIRECTIVES = { - directive.file_type: directive_name - for directive_name, directive in get_builtin_directives().items() - if isinstance(directive, NamespacedResourceDirective) -} - EXTENSION_HIGHLIGHTING = { ".mcfunction": "mcfunction", ".json": "json", @@ -132,19 +123,35 @@ def generate_link_target( class TextSerializer: """Document serializer that outputs plain text.""" - escaped_regex: "re.Pattern[str]" + escaped_regex: Optional["re.Pattern[str]"] def __init__(self): - names = "|".join( - [*NAMESPACED_RESOURCE_DIRECTIVES.values(), "resource_pack", "data_pack"] - ) - self.escaped_regex = re.compile(fr"^(@+(?:{names})\b.*)$", flags=re.MULTILINE) + self.escaped_regex = None + + def get_escaped_regex( + self, mapping: Mapping[Type[NamespaceFile], str] + ) -> "re.Pattern[str]": + """Create and return the escaped regex for the specified serialization mapping.""" + names = "|".join([*mapping.values(), "resource_pack", "data_pack"]) + pattern = fr"^(@+(?:{names})\b.*)$" + + if self.escaped_regex is None or self.escaped_regex.pattern != pattern: + self.escaped_regex = re.compile(pattern, flags=re.MULTILINE) + + return self.escaped_regex - def serialize(self, assets: ResourcePack, data: DataPack) -> str: + def serialize( + self, + assets: ResourcePack, + data: DataPack, + mapping: Mapping[Type[NamespaceFile], str], + ) -> str: """Return the serialized representation.""" + escaped_regex = self.get_escaped_regex(mapping) + return "\n".join( ( - f"@{directive_name} {argument}\n{self.escape_fragment(content)}" + f"@{directive_name} {argument}\n{self.escape_fragment(content, escaped_regex)}" if isinstance(content := file_instance.ensure_serialized(), str) else f"@{directive_name}(base64) {argument}\n" + b64encode(content).decode() @@ -171,9 +178,17 @@ def serialize(self, assets: ResourcePack, data: DataPack) -> str: ), ( ( - NAMESPACED_RESOURCE_DIRECTIVES[file_type], - f"{name}:{path}", - file_instance, + ( + mapping[file_type], + f"{name}:{path}", + file_instance, + ) + if file_type in mapping + else ( + extra_directive, + f"{namespace.directory}/{name}/{'/'.join(file_type.scope)}/{path}{file_type.extension}", + file_instance, + ) ) for name, namespace in pack.items() for file_type, container in namespace.items() @@ -182,11 +197,11 @@ def serialize(self, assets: ResourcePack, data: DataPack) -> str: ) ) - def escape_fragment(self, content: str) -> str: + def escape_fragment(self, content: str, escaped_regex: "re.Pattern[str]") -> str: """Escape embedded directives.""" return "".join( s.replace("@", "@@", 1) if i % 2 else s - for i, s in enumerate(self.escaped_regex.split(content)) + for i, s in enumerate(escaped_regex.split(content)) ) @@ -197,6 +212,7 @@ def serialize( self, assets: ResourcePack, data: DataPack, + mapping: Mapping[Type[NamespaceFile], str], external_files: Optional[Dict[str, File[Any, Any]]] = None, external_prefix: str = "", ) -> str: @@ -213,6 +229,7 @@ def serialize( title, directive, pack, + mapping, external_files, external_prefix, ) @@ -225,6 +242,7 @@ def serialize_pack( title: str, pack_directive: str, pack: Union[DataPack, ResourcePack], + mapping: Mapping[Type[NamespaceFile], str], external_files: Optional[Dict[str, File[Any, Any]]] = None, external_prefix: str = "", ) -> Iterator[str]: @@ -257,19 +275,27 @@ def serialize_pack( ) for file_type, container in namespace.items(): - directive_name = NAMESPACED_RESOURCE_DIRECTIVES[file_type] - for path, file_instance in container.items(): - yield from self.format_serialized_file( - self.serialize_file_instance( - directive_name, - f"{name}:{path}", - file_instance, - external_files, - external_prefix, + if file_type in mapping: + yield from self.format_serialized_file( + self.serialize_file_instance( + mapping[file_type], + f"{name}:{path}", + file_instance, + external_files, + external_prefix, + ) + ) + else: + yield from self.format_serialized_file( + self.serialize_file_instance( + pack_directive, + f"{namespace.directory}/{name}/{'/'.join(file_type.scope)}/{path}{file_type.extension}", + file_instance, + external_files, + external_prefix, + ) ) - ) - yield "" def format_serialized_file(self, chunks: Iterable[str]) -> Iterator[str]: diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index bdd88025d..8599850cd 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.43.3" +version = "0.44.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -819,7 +819,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9841cf255e41f4c1ee420a6d6d55a098bc2a6f81123830d7aed0b43dab15ddd2" +content-hash = "1f8c8cb5c677099ece16af5b6c7ba6bc9633f87c1827087ac34ab847f11d0ff1" [metadata.files] atomicwrites = [ @@ -835,8 +835,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.43.3-py3-none-any.whl", hash = "sha256:d9b50456915a0a4730acfd2dd8af34aae9e6a4929541ed4b8eaaa88e5c7300dd"}, - {file = "beet-0.43.3.tar.gz", hash = "sha256:7cd8238aa4aada077bd61964a30fe913fee9dc70cd67557bb8a1f6fad66f42eb"}, + {file = "beet-0.44.2-py3-none-any.whl", hash = "sha256:2e8f8c01401e312677e78fb73cd731a70752d7d0dc3709df00ef7f10ee57262f"}, + {file = "beet-0.44.2.tar.gz", hash = "sha256:d73c233754da23f008317693e8b3fb3c0cb2e1daefb9ae580dd8a0ef465c4511"}, ] black = [ {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, @@ -1005,9 +1005,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, @@ -1019,9 +1016,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1033,9 +1027,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, @@ -1048,9 +1039,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1063,9 +1051,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index b3c6b3cba..6cb925257 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.40.1" +beet = ">=0.44.2" markdown-it-py = "^1.1.0" click = "^8.0.1" diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index d37500118..39d4dc623 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -477,6 +477,16 @@ +- `@function isolated:message_demo` + +
+ + ```mcfunction + tellraw @a ["", {"text": "hello", "color": "red"}] + ``` + +
+ ## Resource pack - `@resource_pack pack.mcmeta` diff --git a/packages/lectern/tests/test_directive.py b/packages/lectern/tests/test_directive.py index d11f2ce81..d08e7ed08 100644 --- a/packages/lectern/tests/test_directive.py +++ b/packages/lectern/tests/test_directive.py @@ -1,6 +1,6 @@ import pytest -from lectern import Fragment, TextExtractor, get_builtin_directives +from lectern import DirectiveRegistry, Fragment, TextExtractor @pytest.mark.parametrize( @@ -24,6 +24,6 @@ ) def test_parse(source: str, fragment: Fragment): parsed_fragment = next( - TextExtractor().parse_fragments(source, get_builtin_directives()) + TextExtractor().parse_fragments(source, DirectiveRegistry().resolve()) ) assert fragment == parsed_fragment From 674e22cc76a8b0cc4b81e7692da3001abe47ec30 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 5 Nov 2021 18:57:15 +0000 Subject: [PATCH 0416/1554] 0.17.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 7aba82350..3c7f658eb 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.0 (2021-11-05) +### Feature +* Add dynamic directive resolvers ([`b2b6d21`](https://github.com/mcbeet/lectern/commit/b2b6d21207bb0645799f5b26413de10d49ed64f0)) + ## v0.16.1 (2021-10-23) ### Fix * Update lockfile and add discord badge ([`3a76ee5`](https://github.com/mcbeet/lectern/commit/3a76ee57d1f125359b74d20d673bfa3dc862742c)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index a87aad710..2a416280c 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.16.1" +__version__ = "0.17.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 6cb925257..59199e298 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.16.1" +version = "0.17.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 6c878a3ab5eaa745a53feb57ad6f1c77c85154ba Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 20:09:45 +0100 Subject: [PATCH 0417/1554] fix: update list of supported resources --- packages/lectern/README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index 2b55112f0..d864d2ec9 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -129,17 +129,18 @@ Here is a reference of all the supported resources: | `@loot_table` | `@language` | | `@predicate` | `@font` | | `@recipe` | `@glyph_sizes` | -| `@structure` | `@truetype_font` | +| `@structure` | `@true_type_font` | | `@block_tag` | `@shader_post` | | `@entity_type_tag` | `@shader` | | `@fluid_tag` | `@fragment_shader` | | `@function_tag` | `@vertex_shader` | -| `@item_tag` | `@glsl_shader` | -| `@dimension_type` | `@text` | -| `@dimension` | `@texture_mcmeta` | -| `@biome` | `@texture` | -| `@configured_carver` | `@sound` | -| `@configured_feature` | `@particle` | +| `@game_event_tag` | `@glsl_shader` | +| `@item_tag` | `@text` | +| `@dimension_type` | `@texture_mcmeta` | +| `@dimension` | `@texture` | +| `@biome` | `@sound` | +| `@configured_carver` | `@particle` | +| `@configured_feature` | | | `@configured_structure_feature` | | | `@configured_surface_builder` | | | `@noise_settings` | | @@ -147,6 +148,8 @@ Here is a reference of all the supported resources: | `@template_pool` | | | `@item_modifier` | | +> Note that these directives are resolved automatically. If you're working with pack extensions your custom namespaced resources will have their own directives as well. + There are also two built-in directives that can be used to include files using a path relative to the root of the data pack or the resource pack. ``` From 4ae7f468512b1f662149c7d1ef7689016334c0cb Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 5 Nov 2021 19:10:37 +0000 Subject: [PATCH 0418/1554] 0.17.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 3c7f658eb..5ffed1211 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.1 (2021-11-05) +### Fix +* Update list of supported resources ([`fbbbbdc`](https://github.com/mcbeet/lectern/commit/fbbbbdc6a3c96fe0e496e01a8732eadb7ea67485)) + ## v0.17.0 (2021-11-05) ### Feature * Add dynamic directive resolvers ([`b2b6d21`](https://github.com/mcbeet/lectern/commit/b2b6d21207bb0645799f5b26413de10d49ed64f0)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 2a416280c..dfd8a1808 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.17.0" +__version__ = "0.17.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 59199e298..a1d8da205 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.17.0" +version = "0.17.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 0ac06f38feaddd547eb02ecd3bed442ab89626a2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 20:40:01 +0100 Subject: [PATCH 0419/1554] chore: update README --- packages/mecha/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index d39765b91..a00ccfd8f 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -47,7 +47,7 @@ This package provides everything you need for working with Minecraft commands in - Command config resolver that flattens and enumerates all the valid command prototypes - Powerful rule dispatcher for processing specific ast nodes - Composable ast visitors and reducers -- _(soon)_ Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline +- Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python ## Credits From 70855c2b756eb8b77a971d24ef4ac40c0a7b6ba4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 23:26:19 +0100 Subject: [PATCH 0420/1554] feat: add AstJson.from_value --- packages/mecha/mecha/ast.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 200f6306b..72cfde3fe 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -53,7 +53,18 @@ from dataclasses import dataclass, fields -from typing import Any, ClassVar, Iterator, Literal, Optional, Tuple, TypeVar, Union +from typing import ( + Any, + ClassVar, + Iterator, + Literal, + Mapping, + Optional, + Sequence, + Tuple, + TypeVar, + Union, +) from uuid import UUID from beet.core.utils import extra_field, required_field @@ -225,6 +236,28 @@ def evaluate(self) -> Any: """Return the json value.""" raise NotImplementedError() + @classmethod + def from_value(cls, value: Any) -> "AstJson": + """Create json ast nodes representing the specified json value.""" + if value is None or isinstance(value, (bool, str, int, float)): + return AstJsonValue(value=value) + elif isinstance(value, Mapping): + object: Mapping[str, Any] = value + return AstJsonObject( + entries=AstChildren( + AstJsonObjectEntry( + key=AstJsonObjectKey(value=k), + value=cls.from_value(v), + ) + for k, v in object.items() + ) + ) + elif isinstance(value, Sequence): + array: Sequence[Any] = value + return AstJsonArray(elements=AstChildren(cls.from_value(e) for e in array)) + else: + raise ValueError(f"Invalid json value of type {type(value)!r}.") + @dataclass(frozen=True) class AstJsonValue(AstJson): From 1962c70343a0d970f25f0c6c58bf1eb7d8374a47 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 23:27:34 +0100 Subject: [PATCH 0421/1554] feat: default diagnostic location to the location of the node --- packages/mecha/mecha/diagnostic.py | 7 +++++ packages/mecha/mecha/dispatch.py | 44 +++++++++++++++++++----------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index af471ccf4..8c73cc835 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -73,14 +73,21 @@ def with_defaults( hint: Optional[str] = None, filename: Optional[str] = None, file: Optional[TextFileBase[Any]] = None, + location: SourceLocation = UNKNOWN_LOCATION, + end_location: SourceLocation = UNKNOWN_LOCATION, ) -> "Diagnostic": """Set default values for unspecified attributes.""" + if not self.location.unknown: + location = self.location + end_location = self.end_location return replace( self, rule=self.rule or rule, hint=self.hint or hint, filename=self.filename or filename, file=self.file or file, + location=location, + end_location=end_location, ) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 0a7e3cce1..6d4b45512 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -216,7 +216,7 @@ def dispatch( def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: """Invoke rules on the given ast node.""" for name, rule in self.dispatch(node): - with self.use_rule(name): + with self.use_rule(node, name): rule(node, *args, **kwargs) return node @@ -232,7 +232,7 @@ def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: self.diagnostics = previous_diagnostics @contextmanager - def use_rule(self, name: Optional[str] = None) -> Iterator[None]: + def use_rule(self, node: AstNode, name: Optional[str] = None) -> Iterator[None]: """Handle rule diagnostics.""" override_level = self.levels.get(name or "") if override_level == "ignore": @@ -243,12 +243,24 @@ def use_rule(self, name: Optional[str] = None) -> Iterator[None]: except Diagnostic as diagnostic: if override_level: diagnostic.level = override_level - self.diagnostics.add(diagnostic.with_defaults(rule=name)) + self.diagnostics.add( + diagnostic.with_defaults( + rule=name, + location=node.location, + end_location=node.end_location, + ) + ) except DiagnosticCollection as diagnostic: for diagnostic in diagnostic.exceptions: if override_level: diagnostic.level = override_level - self.diagnostics.add(diagnostic.with_defaults(rule=name)) + self.diagnostics.add( + diagnostic.with_defaults( + rule=name, + location=node.location, + end_location=node.end_location, + ) + ) def __call__(self, node: AstNode) -> T: if not self.count: @@ -269,23 +281,23 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: result = None - with self.use_rule(name): + with self.use_rule(node, name): result = rule(node, *args, **kwargs) if rule else (child for child in node) - if isinstance(result, Generator): + if isinstance(result, Generator): + try: + with self.use_rule(node, name): + child = next(result) + except StopIteration as exc: + return exc.value + + while True: + feedback = self.invoke(child, *args, **kwargs) try: - with self.use_rule(name): - child = next(result) + child = result.send(feedback) except StopIteration as exc: return exc.value - while True: - feedback = self.invoke(child, *args, **kwargs) - try: - child = result.send(feedback) - except StopIteration as exc: - return exc.value - return result @@ -319,7 +331,7 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: node = replace(node, **to_replace) for name, rule in self.dispatch(node): - with self.use_rule(name): + with self.use_rule(node, name): node = rule(node, *args, **kwargs) return node From cb3ff7e2eac5d89f3837d37fccc242910e3b8ed0 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 5 Nov 2021 23:36:13 +0100 Subject: [PATCH 0422/1554] feat: add mecha.contrib.messages --- packages/mecha/mecha/contrib/messages.py | 105 +++++++++++++++++++++++ packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 packages/mecha/mecha/contrib/messages.py diff --git a/packages/mecha/mecha/contrib/messages.py b/packages/mecha/mecha/contrib/messages.py new file mode 100644 index 000000000..2f26c0e12 --- /dev/null +++ b/packages/mecha/mecha/contrib/messages.py @@ -0,0 +1,105 @@ +"""Plugin for handling message references in commands.""" + + +__all__ = [ + "AstMessageReference", + "MessageReferenceParser", + "MessageReferenceTransformer", + "MessageReferenceSerializer", +] + + +from dataclasses import dataclass +from typing import Any, List, Optional + +from beet import Context +from beet.contrib.messages import MessageManager +from beet.core.utils import required_field +from tokenstream import TokenStream, set_location + +from mecha import ( + AstJson, + AstLiteral, + AstNode, + AstResourceLocation, + Diagnostic, + Mecha, + MutatingReducer, + Parser, + Visitor, + delegate, + rule, +) + + +@dataclass(frozen=True) +class AstMessageReference(AstNode): + """Ast message reference node.""" + + name: AstResourceLocation = required_field() + path: Optional[AstLiteral] = None + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + messages = ctx.inject(MessageManager) + + component = "command:argument:minecraft:component" + mc.spec.parsers[component] = MessageReferenceParser(mc.spec.parsers[component]) + + mc.transform.extend(MessageReferenceTransformer(messages=messages)) + mc.serialize.extend(MessageReferenceSerializer()) + + +@dataclass +class MessageReferenceParser: + """Parser for message references.""" + + component_parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + token = stream.get(("literal", "from")) + if not token: + return self.component_parser(stream) + + with stream.syntax(path=r"\w+(?:\[\d+\]|\.\w+)*"): + name = delegate("resource_location", stream) + path = stream.get("path") + + if path is not None: + path = set_location(AstLiteral(value=path.value), path) + + node = AstMessageReference(name=name, path=path) + return set_location(node, token, path or name) + + +@dataclass +class MessageReferenceTransformer(MutatingReducer): + """Transformer that turns message references into inline text components.""" + + messages: MessageManager = required_field() + + @rule(AstMessageReference) + def message_reference(self, node: AstMessageReference): + name = node.name.get_canonical_value() + path = node.path and node.path.value + + try: + message = self.messages.get(name, path) + except (KeyError, IndexError): + path = f"{path!r} in " if path else "" + raise Diagnostic("error", f"Message not found {path}{name!r}.") from None + + return set_location(AstJson.from_value(message)) + + +class MessageReferenceSerializer(Visitor): + """Serializer for message references.""" + + @rule(AstMessageReference) + def message_reference(self, node: AstMessageReference, result: List[str]): + result.append("from ") + yield node.name + if node.path: + result.append(" ") + yield node.path diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index ce9f41d3b..8692877af 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.43.3" +version = "0.44.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e3ad6d068916d84e1891d91f7c26b615d78b99600256a36d0f449ed3a4c5a3c0" +content-hash = "f707611cf2e1673ee61df404851d97e8d8473791e593131d6afe1ee1b53e514d" [metadata.files] atomicwrites = [ @@ -812,8 +812,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.43.3-py3-none-any.whl", hash = "sha256:d9b50456915a0a4730acfd2dd8af34aae9e6a4929541ed4b8eaaa88e5c7300dd"}, - {file = "beet-0.43.3.tar.gz", hash = "sha256:7cd8238aa4aada077bd61964a30fe913fee9dc70cd67557bb8a1f6fad66f42eb"}, + {file = "beet-0.44.3-py3-none-any.whl", hash = "sha256:77b2fee85ea16f4492b508f8cf628fa363511bc1880d35bd25a80be356063239"}, + {file = "beet-0.44.3.tar.gz", hash = "sha256:a983d36dff6bccd831a121745be01ab8d3d31516a813e4477a940f14a1591308"}, ] black = [ {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 6b967bc90..4283cf94f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.41.9" +beet = ">=0.44.3" tokenstream = "^1.2.3" [tool.poetry.dev-dependencies] From 87f713cb3b2651cd231e4d7cb56b00259b3ad31c Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 5 Nov 2021 22:37:36 +0000 Subject: [PATCH 0423/1554] 0.7.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 6 ++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 26d8a7bdb..1e514c35d 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,12 @@ +## v0.7.0 (2021-11-05) +### Feature +* Add mecha.contrib.messages ([`99b62de`](https://github.com/mcbeet/mecha/commit/99b62de825a17552489d7b379c79be8b6adf0f34)) +* Default diagnostic location to the location of the node ([`b3b7cca`](https://github.com/mcbeet/mecha/commit/b3b7cca1d90fc44fb2a23f335120d65cbd144e5d)) +* Add AstJson.from_value ([`5ddfdf0`](https://github.com/mcbeet/mecha/commit/5ddfdf0eddca5851529ca24e5c3f5c35a9be2124)) + ## v0.6.2 (2021-10-23) ### Fix * Add discord badge ([`d721c44`](https://github.com/mcbeet/mecha/commit/d721c4425119864c93d0d5a17e0b244ef6c18ba3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d9f40f622..ad2c4d31b 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.2" +__version__ = "0.7.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4283cf94f..3f3d5b849 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.6.2" +version = "0.7.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From ae1d4374408576f34ddca85867d6f74df48286e6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 6 Nov 2021 00:12:44 +0100 Subject: [PATCH 0424/1554] fix: typo when using set_location --- packages/mecha/mecha/contrib/messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/contrib/messages.py b/packages/mecha/mecha/contrib/messages.py index 2f26c0e12..82e6919f1 100644 --- a/packages/mecha/mecha/contrib/messages.py +++ b/packages/mecha/mecha/contrib/messages.py @@ -90,7 +90,7 @@ def message_reference(self, node: AstMessageReference): path = f"{path!r} in " if path else "" raise Diagnostic("error", f"Message not found {path}{name!r}.") from None - return set_location(AstJson.from_value(message)) + return set_location(AstJson.from_value(message), node) class MessageReferenceSerializer(Visitor): From 7271a72231a250abf7aaa7e966d90c1b6f3a5279 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 5 Nov 2021 23:13:29 +0000 Subject: [PATCH 0425/1554] 0.7.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 1e514c35d..da6c389a8 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.7.1 (2021-11-05) +### Fix +* Typo when using set_location ([`2d16d63`](https://github.com/mcbeet/mecha/commit/2d16d6327ce63e67214843fe84b277c6118f0aa5)) + ## v0.7.0 (2021-11-05) ### Feature * Add mecha.contrib.messages ([`99b62de`](https://github.com/mcbeet/mecha/commit/99b62de825a17552489d7b379c79be8b6adf0f34)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index ad2c4d31b..a80341c04 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.7.0" +__version__ = "0.7.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3f3d5b849..9a6b9174d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.7.0" +version = "0.7.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 794dd3ccdc8beb80b653b81c6ee3bf42f19a8e12 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 6 Nov 2021 00:53:03 +0100 Subject: [PATCH 0426/1554] fix: prevent minor caching inconsistency --- packages/mecha/mecha/api.py | 2 ++ packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 87619ca74..d1d34a24b 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -244,6 +244,8 @@ def parse( with stream.provide(**provide or {}): ast = delegate(parser, stream) except InvalidSyntax as exc: + if self.cache and filename and cache_miss: + self.cache.invalidate_changes(self.directory / filename) d = Diagnostic( level="error", message=str(exc), diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 8692877af..aebc11585 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.44.3" +version = "0.44.5" description = "The Minecraft pack development kit" category = "main" optional = false @@ -796,7 +796,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f707611cf2e1673ee61df404851d97e8d8473791e593131d6afe1ee1b53e514d" +content-hash = "7ef494d69fd5683d276251bcc9c25896785b6588a324b95e09ea0dd0dc685425" [metadata.files] atomicwrites = [ @@ -812,8 +812,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.44.3-py3-none-any.whl", hash = "sha256:77b2fee85ea16f4492b508f8cf628fa363511bc1880d35bd25a80be356063239"}, - {file = "beet-0.44.3.tar.gz", hash = "sha256:a983d36dff6bccd831a121745be01ab8d3d31516a813e4477a940f14a1591308"}, + {file = "beet-0.44.5-py3-none-any.whl", hash = "sha256:732967bfbd3e36eda74de62d02e55c52fa308fd793a48e9ce6281985db7173a3"}, + {file = "beet-0.44.5.tar.gz", hash = "sha256:8b092778afad301f20ccba37841aae287005f344af3eba0074f255ff2794f6ff"}, ] black = [ {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9a6b9174d..e0b92c09e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.44.3" +beet = ">=0.44.5" tokenstream = "^1.2.3" [tool.poetry.dev-dependencies] From a76980e284ec1b9ee4412f5b90157a585ba889ab Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 6 Nov 2021 00:13:09 +0000 Subject: [PATCH 0427/1554] 0.7.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index da6c389a8..547bc966c 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.7.2 (2021-11-06) +### Fix +* Prevent minor caching inconsistency ([`5457144`](https://github.com/mcbeet/mecha/commit/5457144bf210cb71a61c9f601bd75ac51e268797)) + ## v0.7.1 (2021-11-05) ### Fix * Typo when using set_location ([`2d16d63`](https://github.com/mcbeet/mecha/commit/2d16d6327ce63e67214843fe84b277c6118f0aa5)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index a80341c04..d1e3a419f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.7.1" +__version__ = "0.7.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e0b92c09e..5264a83c0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.7.1" +version = "0.7.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From dcad401357f714250640b94f5910928a251a75ef Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 7 Nov 2021 20:29:26 +0100 Subject: [PATCH 0428/1554] feat: add mecha.contrib.relative_location --- .../mecha/mecha/contrib/relative_location.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 packages/mecha/mecha/contrib/relative_location.py diff --git a/packages/mecha/mecha/contrib/relative_location.py b/packages/mecha/mecha/contrib/relative_location.py new file mode 100644 index 000000000..c71b93b4d --- /dev/null +++ b/packages/mecha/mecha/contrib/relative_location.py @@ -0,0 +1,56 @@ +"""Plugin that resolves relative resource locations.""" + + +__all__ = [ + "RelativeResourceLocationNormalizer", +] + + +from dataclasses import dataclass, replace +from pathlib import PurePosixPath + +from beet import Context +from beet.core.utils import required_field + +from mecha import ( + AstResourceLocation, + CompilationDatabase, + Diagnostic, + Mecha, + MutatingReducer, + rule, +) + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + mc.normalize.extend(RelativeResourceLocationNormalizer(database=mc.database)) + + +@dataclass +class RelativeResourceLocationNormalizer(MutatingReducer): + """Normalizer that resolves relative resource locations.""" + + database: CompilationDatabase = required_field() + + @rule(AstResourceLocation) + def relative_resource_location(self, node: AstResourceLocation): + if node.namespace is None and node.path.startswith(("./", "../")): + current_file = self.database.current + path = self.database[current_file].resource_location + + if not path: + raise Diagnostic("error", "Can't resolve relative resource location.") + + namespace, _, current_path = path.partition(":") + + resolved = PurePosixPath(current_path).parent + for name in node.path.split("/"): + if name == "..": + resolved = resolved.parent + elif name and name != ".": + resolved = resolved / name + + return replace(node, namespace=namespace, path=str(resolved)) + + return node From 51a85b4fc5447eb52f58c7d2dd9c8a89b941c94f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 7 Nov 2021 19:30:13 +0000 Subject: [PATCH 0429/1554] 0.8.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 547bc966c..b72401b46 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.0 (2021-11-07) +### Feature +* Add mecha.contrib.relative_location ([`7270458`](https://github.com/mcbeet/mecha/commit/72704581a8c088c8852e5c30f5ec111ccf6c4c05)) + ## v0.7.2 (2021-11-06) ### Fix * Prevent minor caching inconsistency ([`5457144`](https://github.com/mcbeet/mecha/commit/5457144bf210cb71a61c9f601bd75ac51e268797)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d1e3a419f..5a76d37df 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.7.2" +__version__ = "0.8.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 5264a83c0..210f09b36 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.7.2" +version = "0.8.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 22b6793faa35d0882edad795ba785b813079ef3b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Nov 2021 04:12:55 +0100 Subject: [PATCH 0430/1554] fix: database.current is now properly updated --- packages/mecha/mecha/api.py | 3 +-- packages/mecha/mecha/database.py | 23 ++++++++++------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index d1d34a24b..1dc3e36bb 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -343,8 +343,7 @@ def compile( ) self.database.enqueue(result) - while not self.database.done: - step, function = self.database.dequeue() + for step, function in self.database.process_queue(): compilation_unit = self.database[function] if step < 0: diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 0725ca5a2..bd7fd2e79 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -6,9 +6,9 @@ from dataclasses import dataclass from heapq import heappop, heappush -from typing import Any, Dict, List, Optional, Set, Tuple +from typing import Any, Dict, Iterator, List, Optional, Set, Tuple -from beet import Container, TextFileBase +from beet import Container, TextFile, TextFileBase from beet.core.utils import extra_field from .ast import AstRoot @@ -39,12 +39,14 @@ class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): index: Dict[str, TextFileBase[Any]] queue: List[Tuple[int, str, TextFileBase[Any]]] session: Set[TextFileBase[Any]] + current: TextFileBase[Any] def __init__(self): super().__init__() self.index = {} self.queue = [] self.session = set() + self.current = TextFile() def process( self, @@ -68,17 +70,6 @@ def setup_compilation(self): self.queue.clear() self.session.clear() - @property - def done(self): - """Return whether the internal queue is empty.""" - return not self.queue - - @property - def current(self) -> TextFileBase[Any]: - """Return the file currently being processed.""" - _, _, key = self.queue[0] - return key - def enqueue(self, key: TextFileBase[Any], step: int = -1): """Enqueue a file and schedule it to be processed with the given step.""" heappush(self.queue, (step, self[key].resource_location or "", key)) @@ -88,3 +79,9 @@ def dequeue(self) -> Tuple[int, TextFileBase[Any]]: """Dequeue the next file that needs to be processed.""" step, _, key = heappop(self.queue) return step, key + + def process_queue(self) -> Iterator[Tuple[int, TextFileBase[Any]]]: + """Yield database entries from the queue.""" + while self.queue: + step, self.current = self.dequeue() + yield step, self.current From 48ebb3ddef8a09355044bcf76fb453d7708b7ed8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 8 Nov 2021 03:13:46 +0000 Subject: [PATCH 0431/1554] 0.8.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index b72401b46..73a91801d 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.1 (2021-11-08) +### Fix +* Database.current is now properly updated ([`e74cd13`](https://github.com/mcbeet/mecha/commit/e74cd13b013df43911a463c5a0c7a457e193f672)) + ## v0.8.0 (2021-11-07) ### Feature * Add mecha.contrib.relative_location ([`7270458`](https://github.com/mcbeet/mecha/commit/72704581a8c088c8852e5c30f5ec111ccf6c4c05)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 5a76d37df..0701e5f67 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.0" +__version__ = "0.8.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 210f09b36..45e757f6f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.8.0" +version = "0.8.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From d6906b8b3182e8e6236ee396be0495ec3ed83b7c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 Nov 2021 10:47:02 +0100 Subject: [PATCH 0432/1554] fix: prevent error when the location is outside the view --- packages/mecha/mecha/utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 3d7a41b28..5a526ef85 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -141,7 +141,8 @@ def underline_code( gutter = [f"{l + view_start_line} |" for l in range(len(view))] for line in reversed(range(lineno, end_lineno + 1)): - code = view[line - view_start_line] + index = line - view_start_line + code = view[index] if index < len(view) else "" start = colno if line == lineno else 1 stop = end_colno if line == end_lineno else len(code) + 1 @@ -153,8 +154,8 @@ def underline_code( if start < stop: underline = " " * (start - 1) + "^" * (stop - start) - view.insert(line - view_start_line + 1, underline) - gutter.insert(line - view_start_line + 1, ":") + view.insert(index + 1, underline) + gutter.insert(index + 1, ":") gutter_size = max(max(len(g) for g in gutter), 8) return "\n".join(f"{g.rjust(gutter_size)} {text}" for g, text in zip(gutter, view)) From 355030a639845d47422b993cdcdd8a2c7976045f Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 8 Nov 2021 09:47:53 +0000 Subject: [PATCH 0433/1554] 0.8.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 73a91801d..30541ee2e 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.2 (2021-11-08) +### Fix +* Prevent error when the location is outside the view ([`96c8005`](https://github.com/mcbeet/mecha/commit/96c800527a6b02ba14a47be74976979c9e534294)) + ## v0.8.1 (2021-11-08) ### Fix * Database.current is now properly updated ([`e74cd13`](https://github.com/mcbeet/mecha/commit/e74cd13b013df43911a463c5a0c7a457e193f672)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 0701e5f67..ed2f43a11 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.1" +__version__ = "0.8.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 45e757f6f..7415d9bac 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.8.1" +version = "0.8.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 1d8e688781c06c92ca7b17b93c9105adfd668d8b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 00:03:07 +0100 Subject: [PATCH 0434/1554] fix: add SingleLineConstraint --- packages/mecha/mecha/parse.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 52aef1dce..c38f35d17 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -57,6 +57,7 @@ "NbtPathParser", "parse_particle", "AggregateParser", + "SingleLineConstraint", "NUMBER_PATTERN", ] @@ -1821,3 +1822,14 @@ def __call__(self, stream: TokenStream) -> Any: values = [(name, parser(stream)) for name, parser in self.fields.items()] node = self.type(**dict(values)) return set_location(node, values[0][1], values[-1][1]) + + +@dataclass +class SingleLineConstraint: + """Constraint that prevents parsing across multiple lines.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.intercept("newline"): + return self.parser(stream) From 32be661fa67a3434409fbb2bae7dbacc00c9f949 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 01:50:52 +0100 Subject: [PATCH 0435/1554] feat: add readonly option and setup examples --- packages/mecha/examples/basic/beet.yml | 4 + .../src/data/demo/functions/foo.mcfunction | 5 + .../mecha/examples/basic_messages/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 1 + .../src/data/demo/messages/greeting.json | 4 + .../mecha/examples/basic_multiline/beet.yml | 7 + .../src/data/demo/functions/foo.mcfunction | 14 ++ .../mecha/examples/basic_readonly/beet.yml | 7 + .../src/data/demo/functions/foo.mcfunction | 5 + .../examples/basic_relative_location/beet.yml | 6 + .../src/data/demo/functions/bar.mcfunction | 1 + .../data/demo/functions/folder/wat.mcfunction | 1 + .../src/data/demo/functions/foo.mcfunction | 2 + .../mecha/examples/custom_command/beet.yml | 6 + .../mecha/examples/custom_command/demo.py | 59 ++++++++ .../src/data/demo/functions/foo.mcfunction | 2 + packages/mecha/examples/greet_command.py | 75 ---------- packages/mecha/mecha/api.py | 13 +- packages/mecha/poetry.lock | 42 +++++- packages/mecha/pyproject.toml | 1 + .../examples__build_basic__0.pack.txt | 11 ++ ...examples__build_basic_messages__0.pack.txt | 10 ++ ...xamples__build_basic_multiline__0.pack.txt | 10 ++ ...examples__build_basic_readonly__0.pack.txt | 14 ++ ..._build_basic_relative_location__0.pack.txt | 17 +++ ...examples__build_custom_command__0.pack.txt | 11 ++ .../examples__output_greet_command__0.txt | 128 ------------------ packages/mecha/tests/test_examples.py | 23 +--- 28 files changed, 264 insertions(+), 221 deletions(-) create mode 100644 packages/mecha/examples/basic/beet.yml create mode 100644 packages/mecha/examples/basic/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/examples/basic_messages/beet.yml create mode 100644 packages/mecha/examples/basic_messages/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/examples/basic_messages/src/data/demo/messages/greeting.json create mode 100644 packages/mecha/examples/basic_multiline/beet.yml create mode 100644 packages/mecha/examples/basic_multiline/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/examples/basic_readonly/beet.yml create mode 100644 packages/mecha/examples/basic_readonly/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/examples/basic_relative_location/beet.yml create mode 100644 packages/mecha/examples/basic_relative_location/src/data/demo/functions/bar.mcfunction create mode 100644 packages/mecha/examples/basic_relative_location/src/data/demo/functions/folder/wat.mcfunction create mode 100644 packages/mecha/examples/basic_relative_location/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/examples/custom_command/beet.yml create mode 100644 packages/mecha/examples/custom_command/demo.py create mode 100644 packages/mecha/examples/custom_command/src/data/demo/functions/foo.mcfunction delete mode 100644 packages/mecha/examples/greet_command.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt delete mode 100644 packages/mecha/tests/snapshots/examples__output_greet_command__0.txt diff --git a/packages/mecha/examples/basic/beet.yml b/packages/mecha/examples/basic/beet.yml new file mode 100644 index 000000000..25081aeef --- /dev/null +++ b/packages/mecha/examples/basic/beet.yml @@ -0,0 +1,4 @@ +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..21d601e38 --- /dev/null +++ b/packages/mecha/examples/basic/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,5 @@ +# Comments and extra newlines are stripped out +say hello + + +say world diff --git a/packages/mecha/examples/basic_messages/beet.yml b/packages/mecha/examples/basic_messages/beet.yml new file mode 100644 index 000000000..1e4db8b73 --- /dev/null +++ b/packages/mecha/examples/basic_messages/beet.yml @@ -0,0 +1,6 @@ +require: + - mecha.contrib.messages +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/basic_messages/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_messages/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..83f31ab90 --- /dev/null +++ b/packages/mecha/examples/basic_messages/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +tellraw @a from demo:greeting diff --git a/packages/mecha/examples/basic_messages/src/data/demo/messages/greeting.json b/packages/mecha/examples/basic_messages/src/data/demo/messages/greeting.json new file mode 100644 index 000000000..d1cf0c531 --- /dev/null +++ b/packages/mecha/examples/basic_messages/src/data/demo/messages/greeting.json @@ -0,0 +1,4 @@ +{ + "text": "hello", + "color": "red" +} diff --git a/packages/mecha/examples/basic_multiline/beet.yml b/packages/mecha/examples/basic_multiline/beet.yml new file mode 100644 index 000000000..2c6a7760b --- /dev/null +++ b/packages/mecha/examples/basic_multiline/beet.yml @@ -0,0 +1,7 @@ +data_pack: + load: [src] +pipeline: + - mecha +meta: + mecha: + multiline: true diff --git a/packages/mecha/examples/basic_multiline/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_multiline/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..84297913b --- /dev/null +++ b/packages/mecha/examples/basic_multiline/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,14 @@ +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] # Check if we're close to the + # player's feet. + run + say I'm facing the target! diff --git a/packages/mecha/examples/basic_readonly/beet.yml b/packages/mecha/examples/basic_readonly/beet.yml new file mode 100644 index 000000000..cc081b663 --- /dev/null +++ b/packages/mecha/examples/basic_readonly/beet.yml @@ -0,0 +1,7 @@ +data_pack: + load: [src] +pipeline: + - mecha +meta: + mecha: + readonly: true diff --git a/packages/mecha/examples/basic_readonly/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_readonly/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..a1ab10bc2 --- /dev/null +++ b/packages/mecha/examples/basic_readonly/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,5 @@ +# With the `readonly` option functions are left untouched +say hello + + +say world diff --git a/packages/mecha/examples/basic_relative_location/beet.yml b/packages/mecha/examples/basic_relative_location/beet.yml new file mode 100644 index 000000000..416e27137 --- /dev/null +++ b/packages/mecha/examples/basic_relative_location/beet.yml @@ -0,0 +1,6 @@ +require: + - mecha.contrib.relative_location +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/basic_relative_location/src/data/demo/functions/bar.mcfunction b/packages/mecha/examples/basic_relative_location/src/data/demo/functions/bar.mcfunction new file mode 100644 index 000000000..516a5d0c0 --- /dev/null +++ b/packages/mecha/examples/basic_relative_location/src/data/demo/functions/bar.mcfunction @@ -0,0 +1 @@ +say hello diff --git a/packages/mecha/examples/basic_relative_location/src/data/demo/functions/folder/wat.mcfunction b/packages/mecha/examples/basic_relative_location/src/data/demo/functions/folder/wat.mcfunction new file mode 100644 index 000000000..e1a3b29e8 --- /dev/null +++ b/packages/mecha/examples/basic_relative_location/src/data/demo/functions/folder/wat.mcfunction @@ -0,0 +1 @@ +function ../bar diff --git a/packages/mecha/examples/basic_relative_location/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_relative_location/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..aed71cd8a --- /dev/null +++ b/packages/mecha/examples/basic_relative_location/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,2 @@ +function ./folder/wat +function ./bar diff --git a/packages/mecha/examples/custom_command/beet.yml b/packages/mecha/examples/custom_command/beet.yml new file mode 100644 index 000000000..7ee8ac0e3 --- /dev/null +++ b/packages/mecha/examples/custom_command/beet.yml @@ -0,0 +1,6 @@ +require: + - demo +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/custom_command/demo.py b/packages/mecha/examples/custom_command/demo.py new file mode 100644 index 000000000..d70847726 --- /dev/null +++ b/packages/mecha/examples/custom_command/demo.py @@ -0,0 +1,59 @@ +from dataclasses import replace +from typing import cast + +from beet import Context + +from mecha import ( + AstChildren, + AstCommand, + AstLiteral, + AstMessage, + AstSelector, + Mecha, + MutatingReducer, + rule, +) + +COMMAND_TREE = { + "type": "root", + "children": { + "greet": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:entity", + "properties": {"amount": "multiple", "type": "players"}, + "executable": True, + } + }, + } + }, +} + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + mc.spec.add_commands(COMMAND_TREE) + mc.transform.extend(GreetCommandTransformer()) + + +class GreetCommandTransformer(MutatingReducer): + @rule(AstCommand, identifier="greet:entity") + def greet_command(self, node: AstCommand) -> AstCommand: + return replace( + node, + identifier="say:message", + arguments=AstChildren( + [ + AstMessage( + fragments=AstChildren( + [ + AstLiteral(value="Hello "), + cast(AstSelector, node.arguments[0]), + ] + ) + ) + ] + ), + ) diff --git a/packages/mecha/examples/custom_command/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/custom_command/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..3c2173105 --- /dev/null +++ b/packages/mecha/examples/custom_command/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,2 @@ +greet @a[tag=!registered] +execute if score #init temp = #wat temp run greet @a[tag=hi] diff --git a/packages/mecha/examples/greet_command.py b/packages/mecha/examples/greet_command.py deleted file mode 100644 index 6247499ed..000000000 --- a/packages/mecha/examples/greet_command.py +++ /dev/null @@ -1,75 +0,0 @@ -from dataclasses import replace -from typing import cast - -from mecha import ( - AstChildren, - AstCommand, - AstLiteral, - AstMessage, - AstSelector, - Mecha, - MutatingReducer, - rule, -) - -mc = Mecha() - -mc.spec.add_commands( - { - "type": "root", - "children": { - "greet": { - "type": "literal", - "children": { - "entity": { - "type": "argument", - "parser": "minecraft:entity", - "properties": {"amount": "multiple", "type": "players"}, - "executable": True, - } - }, - } - }, - } -) - -function = """ - greet @a[ - tag = !registered - ] -""" - -ast = mc.parse(function, multiline=True) -print(ast.dump()) -print(mc.serialize(ast)) - - -@rule(AstCommand, identifier="greet:entity") -def rewrite_greet_command(node: AstCommand) -> AstCommand: - return replace( - node, - identifier="say:message", - arguments=AstChildren( - [ - AstMessage( - fragments=AstChildren( - [ - AstLiteral(value="Hello "), - cast(AstSelector, node.arguments[0]), - ] - ) - ) - ] - ), - ) - - -transform = MutatingReducer() -transform.extend(rewrite_greet_command) - -ast = transform(ast) -print(ast.dump()) -print(mc.serialize(ast)) - -print(ast == mc.parse("say Hello @a[tag=!registered]")) # True -print(mc.parse("execute if score #init temp = #wat temp run greet @a[tag=hi]").dump()) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 1dc3e36bb..6bca361b0 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -56,6 +56,7 @@ class MechaOptions(BaseModel): version: VersionNumber = "1.17" multiline: bool = False + readonly: Optional[bool] = None match: Optional[List[str]] = None rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} @@ -67,6 +68,7 @@ class Mecha: ctx: InitVar[Optional[Context]] = None version: InitVar[VersionNumber] = "1.17" multiline: InitVar[bool] = False + readonly: bool = False match: Optional[List[str]] = None directory: Path = extra_field(init=False) @@ -100,6 +102,8 @@ def __post_init__( version = opts.version multiline = opts.multiline + if opts.readonly is not None: + self.readonly = opts.readonly if opts.match is not None: self.match = opts.match @@ -267,6 +271,7 @@ def compile( *, match: Optional[List[str]] = None, multiline: Optional[bool] = None, + readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> DataPack: ... @@ -279,6 +284,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> TextFileType: ... @@ -291,6 +297,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Function: ... @@ -303,11 +310,15 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Union[DataPack, TextFileBase[Any]]: """Apply all compilation steps.""" self.database.setup_compilation() + if readonly is None: + readonly = self.readonly + if isinstance(source, DataPack): result = source @@ -369,7 +380,7 @@ def compile( compilation_unit.ast = self.steps[step](compilation_unit.ast) self.database.enqueue(function, step + 1) - else: + elif not readonly: if not compilation_unit.ast: continue with self.serialize.use_diagnostics(compilation_unit.diagnostics): diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index aebc11585..1a09112ee 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -331,6 +331,38 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +[[package]] +name = "lectern" +version = "0.17.1" +description = "Literate Minecraft data packs and resource packs." +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +beet = ">=0.44.2" +click = ">=8.0.1,<9.0.0" +markdown-it-py = ">=1.1.0,<2.0.0" + +[[package]] +name = "markdown-it-py" +version = "1.1.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +attrs = ">=19,<22" + +[package.extras] +code_style = ["pre-commit (==2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.0.1" @@ -796,7 +828,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7ef494d69fd5683d276251bcc9c25896785b6588a324b95e09ea0dd0dc685425" +content-hash = "ec3965951f77c8b8b5adc38f3ce66b134147d1832ce3c67b1e6bcc1c9f603272" [metadata.files] atomicwrites = [ @@ -965,6 +997,14 @@ keyring = [ {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] +lectern = [ + {file = "lectern-0.17.1-py3-none-any.whl", hash = "sha256:c38be8d61ecbd6dd50c5aa728f8ee30c8d314fc601aced8295019ca2179d2621"}, + {file = "lectern-0.17.1.tar.gz", hash = "sha256:2813a8e804fe9704315440af75e2b5e7ce24a0db5a1b2c8e0ebfc34d8e400468"}, +] +markdown-it-py = [ + {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, + {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, +] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 7415d9bac..f60491b3b 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -33,6 +33,7 @@ pytest = "^6.2.5" isort = "^5.10.0" python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" +lectern = "^0.17.1" [tool.black] target-version = ["py38"] diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt new file mode 100644 index 000000000..effac699f --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt @@ -0,0 +1,11 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:foo +say hello +say world diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt new file mode 100644 index 000000000..3b91f4510 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt @@ -0,0 +1,10 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:foo +tellraw @a {"text": "hello", "color": "red"} diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt new file mode 100644 index 000000000..4afe26403 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt @@ -0,0 +1,10 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:foo +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt new file mode 100644 index 000000000..d3eb0d65d --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt @@ -0,0 +1,14 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:foo +# With the `readonly` option functions are left untouched +say hello + + +say world diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt new file mode 100644 index 000000000..6d207b8ff --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt @@ -0,0 +1,17 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:bar +say hello + +@function demo:folder/wat +function demo:bar + +@function demo:foo +function demo:folder/wat +function demo:bar diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt new file mode 100644 index 000000000..a8f112a26 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt @@ -0,0 +1,11 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:foo +say Hello @a[tag=!registered] +execute if score #init temp = #wat temp run say Hello @a[tag=hi] diff --git a/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt b/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt deleted file mode 100644 index 35dd26f69..000000000 --- a/packages/mecha/tests/snapshots/examples__output_greet_command__0.txt +++ /dev/null @@ -1,128 +0,0 @@ - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=5, colno=1) - commands: - - location: SourceLocation(pos=5, lineno=2, colno=5) - end_location: SourceLocation(pos=46, lineno=4, colno=6) - identifier: 'greet:entity' - arguments: - - location: SourceLocation(pos=11, lineno=2, colno=11) - end_location: SourceLocation(pos=46, lineno=4, colno=6) - variable: 'a' - arguments: - - location: SourceLocation(pos=23, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=26) - inverted: True - key: - - location: SourceLocation(pos=23, lineno=3, colno=9) - end_location: SourceLocation(pos=26, lineno=3, colno=12) - value: 'tag' - value: - - location: SourceLocation(pos=30, lineno=3, colno=16) - end_location: SourceLocation(pos=40, lineno=3, colno=26) - value: 'registered' -greet @a[tag=!registered] - - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=5, colno=1) - commands: - - location: SourceLocation(pos=5, lineno=2, colno=5) - end_location: SourceLocation(pos=46, lineno=4, colno=6) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - fragments: - - location: SourceLocation(pos=-1, lineno=0, colno=0) - end_location: SourceLocation(pos=-1, lineno=0, colno=0) - value: 'Hello ' - - location: SourceLocation(pos=11, lineno=2, colno=11) - end_location: SourceLocation(pos=46, lineno=4, colno=6) - variable: 'a' - arguments: - - location: SourceLocation(pos=23, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=26) - inverted: True - key: - - location: SourceLocation(pos=23, lineno=3, colno=9) - end_location: SourceLocation(pos=26, lineno=3, colno=12) - value: 'tag' - value: - - location: SourceLocation(pos=30, lineno=3, colno=16) - end_location: SourceLocation(pos=40, lineno=3, colno=26) - value: 'registered' -say Hello @a[tag=!registered] - -True - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - identifier: 'execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand' - arguments: - - location: SourceLocation(pos=17, lineno=1, colno=18) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - value: '#init' - - location: SourceLocation(pos=23, lineno=1, colno=24) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - value: 'temp' - - location: SourceLocation(pos=30, lineno=1, colno=31) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - value: '#wat' - - location: SourceLocation(pos=35, lineno=1, colno=36) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - value: 'temp' - - location: SourceLocation(pos=40, lineno=1, colno=41) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=44, lineno=1, colno=45) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - identifier: 'greet:entity' - arguments: - - location: SourceLocation(pos=50, lineno=1, colno=51) - end_location: SourceLocation(pos=60, lineno=1, colno=61) - variable: 'a' - arguments: - - location: SourceLocation(pos=53, lineno=1, colno=54) - end_location: SourceLocation(pos=59, lineno=1, colno=60) - inverted: False - key: - - location: SourceLocation(pos=53, lineno=1, colno=54) - end_location: SourceLocation(pos=56, lineno=1, colno=57) - value: 'tag' - value: - - location: SourceLocation(pos=57, lineno=1, colno=58) - end_location: SourceLocation(pos=59, lineno=1, colno=60) - value: 'hi' diff --git a/packages/mecha/tests/test_examples.py b/packages/mecha/tests/test_examples.py index 9e6572dc6..47468a0e4 100644 --- a/packages/mecha/tests/test_examples.py +++ b/packages/mecha/tests/test_examples.py @@ -1,21 +1,12 @@ -import sys -from importlib import import_module -from pathlib import Path +import os import pytest +from beet import run_beet +from lectern import Document from pytest_insta import SnapshotFixture -EXAMPLES_DIRECTORY = Path(__file__).parent.parent / "examples" -sys.path.append(str(EXAMPLES_DIRECTORY)) - -@pytest.mark.parametrize( - "module_name", [p.stem for p in EXAMPLES_DIRECTORY.glob("*.py")] -) -def test_output( - snapshot: SnapshotFixture, - capsys: pytest.CaptureFixture[str], - module_name: str, -): - import_module(module_name) - assert snapshot() == capsys.readouterr().out +@pytest.mark.parametrize("directory", os.listdir("examples")) +def test_build(snapshot: SnapshotFixture, directory: str): + with run_beet(directory=f"examples/{directory}") as ctx: + assert snapshot("pack.txt") == ctx.inject(Document) From 96aab20d7c657ccb1ba5d9fce07b228247154880 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 02:54:10 +0100 Subject: [PATCH 0436/1554] feat: add mecha.contrib.annotate_diagnostics --- packages/mecha/examples/basic_lint/beet.yml | 11 +++++ .../src/data/demo/functions/foo.mcfunction | 5 +++ .../mecha/contrib/annotate_diagnostics.py | 44 +++++++++++++++++++ .../mecha/mecha/contrib/clear_diagnostics.py | 11 +++++ packages/mecha/mecha/diagnostic.py | 4 ++ .../examples__build_basic_lint__0.pack.txt | 30 +++++++++++++ 6 files changed, 105 insertions(+) create mode 100644 packages/mecha/examples/basic_lint/beet.yml create mode 100644 packages/mecha/examples/basic_lint/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/annotate_diagnostics.py create mode 100644 packages/mecha/mecha/contrib/clear_diagnostics.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt diff --git a/packages/mecha/examples/basic_lint/beet.yml b/packages/mecha/examples/basic_lint/beet.yml new file mode 100644 index 000000000..6ae642b96 --- /dev/null +++ b/packages/mecha/examples/basic_lint/beet.yml @@ -0,0 +1,11 @@ +require: + - mecha.contrib.lint_basic +data_pack: + load: [src] +pipeline: + - mecha + - mecha.contrib.annotate_diagnostics + - mecha.contrib.clear_diagnostics +meta: + mecha: + readonly: true diff --git a/packages/mecha/examples/basic_lint/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_lint/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..520b18f8e --- /dev/null +++ b/packages/mecha/examples/basic_lint/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,5 @@ +say hello + +execute run say hello @p[scores={tmp=1},gamemode=adventure] + +execute in the_end run execute at @a run setblock ~ ~ ~ lava diff --git a/packages/mecha/mecha/contrib/annotate_diagnostics.py b/packages/mecha/mecha/contrib/annotate_diagnostics.py new file mode 100644 index 000000000..c1ff2346c --- /dev/null +++ b/packages/mecha/mecha/contrib/annotate_diagnostics.py @@ -0,0 +1,44 @@ +"""Plugin that inserts comments containing mecha diagnostics.""" + + +from heapq import heappop, heappush +from typing import Any, Dict, List, Tuple + +from beet import Context, TextFileBase + +from mecha import Mecha + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + + annotations: Dict[TextFileBase[Any], List[Tuple[int, int, List[str]]]] = {} + + for diagnostic in mc.diagnostics.exceptions: + message = f"{diagnostic.level:<7}{diagnostic.format_message()}\n{diagnostic.format_location()}" + + if diagnostic.file and not diagnostic.location.unknown: + if source := mc.database[diagnostic.file].source: + if code := diagnostic.format_code(source): + message += f"\n{code}" + + comments = [f"# {line}" for line in message.splitlines()] + rendered = annotations.setdefault(diagnostic.file, []) + line_index = diagnostic.location.lineno - 1 + + heappush(rendered, (line_index, len(rendered), comments)) + + for function, rendered in annotations.items(): + lines = function.text.splitlines() + result: List[str] = [] + + i = 0 + while rendered: + j, _, comments = heappop(rendered) + result += lines[i:j] + i = j + result += comments + + result += lines[i:] + + function.text = "\n".join(result) diff --git a/packages/mecha/mecha/contrib/clear_diagnostics.py b/packages/mecha/mecha/contrib/clear_diagnostics.py new file mode 100644 index 000000000..aa3df2da1 --- /dev/null +++ b/packages/mecha/mecha/contrib/clear_diagnostics.py @@ -0,0 +1,11 @@ +"""Plugin that clears diagnostics.""" + + +from beet import Context + +from mecha import Mecha + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + mc.diagnostics.clear() diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index 8c73cc835..fad65e348 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -117,6 +117,10 @@ def extend(self, other: "DiagnosticCollection"): """Combine diagnostics from another collection.""" self.exceptions.extend(other.exceptions) + def clear(self): + """Clear all the diagnostics.""" + self.exceptions.clear() + def get_all_errors(self) -> Iterator[Diagnostic]: """Yield all the diagnostics with a severity level of "error".""" for exc in self.exceptions: diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt new file mode 100644 index 000000000..6656d3dbb --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt @@ -0,0 +1,30 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 7, + "description": "" + } +} + +@function demo:foo +say hello + +# warn Gamemode argument should go before scores. (selector_argument_order) +# src/data/demo/functions/foo.mcfunction:3:41 +# 2 | +# 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] +# : ^^^^^^^^^^^^^^^^^^ +# warn Redundant `execute run` clause. (execute_run) +# src/data/demo/functions/foo.mcfunction:3:1 +# 1 | say hello +# 2 | +# 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] +# : ^^^^^^^^^^^ +execute run say hello @p[scores={tmp=1},gamemode=adventure] + +# warn Redundant `run execute` clause. (run_execute) +# src/data/demo/functions/foo.mcfunction:5:20 +# 4 | +# 5 | execute in the_end run execute at @a run setblock ~ ~ ~ lava +# : ^^^^^^^^^^^ +execute in the_end run execute at @a run setblock ~ ~ ~ lava From 9da58929d74a9763ef37049a9b9437e931b1178b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 02:54:43 +0100 Subject: [PATCH 0437/1554] fix: report diagnostics with logger.warning instead of logger.warn --- packages/mecha/mecha/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 6bca361b0..a251ff47e 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -422,7 +422,7 @@ def finalize(self, ctx: Context): if diagnostic.level == "error": logger.error("%s", message, extra=extra) elif diagnostic.level == "warn": - logger.warn("%s", message, extra=extra) + logger.warning("%s", message, extra=extra) elif diagnostic.level == "info": logger.info("%s", message, extra=extra) From 98cdddb5e484a0fb6e4706b958a6f71aab0b9ee1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 02:59:24 +0100 Subject: [PATCH 0438/1554] chore: switch to markdown snapshots for examples --- .../examples__build_basic__0.pack.md | 31 +++++++++++ .../examples__build_basic__0.pack.txt | 11 ---- .../examples__build_basic_lint__0.pack.md | 50 ++++++++++++++++++ .../examples__build_basic_lint__0.pack.txt | 30 ----------- .../examples__build_basic_messages__0.pack.md | 30 +++++++++++ ...examples__build_basic_messages__0.pack.txt | 10 ---- ...examples__build_basic_multiline__0.pack.md | 30 +++++++++++ ...xamples__build_basic_multiline__0.pack.txt | 10 ---- .../examples__build_basic_readonly__0.pack.md | 34 +++++++++++++ ...examples__build_basic_readonly__0.pack.txt | 14 ----- ...__build_basic_relative_location__0.pack.md | 51 +++++++++++++++++++ ..._build_basic_relative_location__0.pack.txt | 17 ------- .../examples__build_custom_command__0.pack.md | 31 +++++++++++ ...examples__build_custom_command__0.pack.txt | 11 ---- packages/mecha/tests/test_examples.py | 2 +- 15 files changed, 258 insertions(+), 104 deletions(-) create mode 100644 packages/mecha/tests/snapshots/examples__build_basic__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt create mode 100644 packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md new file mode 100644 index 000000000..155117064 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md @@ -0,0 +1,31 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + say hello + say world + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt deleted file mode 100644 index effac699f..000000000 --- a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.txt +++ /dev/null @@ -1,11 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:foo -say hello -say world diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md new file mode 100644 index 000000000..a39fe426f --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -0,0 +1,50 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function(strip_final_newline) demo:foo` + +
+ + ```mcfunction + say hello + + # warn Gamemode argument should go before scores. (selector_argument_order) + # src/data/demo/functions/foo.mcfunction:3:41 + # 2 | + # 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] + # : ^^^^^^^^^^^^^^^^^^ + # warn Redundant `execute run` clause. (execute_run) + # src/data/demo/functions/foo.mcfunction:3:1 + # 1 | say hello + # 2 | + # 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] + # : ^^^^^^^^^^^ + execute run say hello @p[scores={tmp=1},gamemode=adventure] + + # warn Redundant `run execute` clause. (run_execute) + # src/data/demo/functions/foo.mcfunction:5:20 + # 4 | + # 5 | execute in the_end run execute at @a run setblock ~ ~ ~ lava + # : ^^^^^^^^^^^ + execute in the_end run execute at @a run setblock ~ ~ ~ lava + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt deleted file mode 100644 index 6656d3dbb..000000000 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.txt +++ /dev/null @@ -1,30 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:foo -say hello - -# warn Gamemode argument should go before scores. (selector_argument_order) -# src/data/demo/functions/foo.mcfunction:3:41 -# 2 | -# 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] -# : ^^^^^^^^^^^^^^^^^^ -# warn Redundant `execute run` clause. (execute_run) -# src/data/demo/functions/foo.mcfunction:3:1 -# 1 | say hello -# 2 | -# 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] -# : ^^^^^^^^^^^ -execute run say hello @p[scores={tmp=1},gamemode=adventure] - -# warn Redundant `run execute` clause. (run_execute) -# src/data/demo/functions/foo.mcfunction:5:20 -# 4 | -# 5 | execute in the_end run execute at @a run setblock ~ ~ ~ lava -# : ^^^^^^^^^^^ -execute in the_end run execute at @a run setblock ~ ~ ~ lava diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md new file mode 100644 index 000000000..3a26b13e4 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + tellraw @a {"text": "hello", "color": "red"} + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt deleted file mode 100644 index 3b91f4510..000000000 --- a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.txt +++ /dev/null @@ -1,10 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:foo -tellraw @a {"text": "hello", "color": "red"} diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md new file mode 100644 index 000000000..96a7a3d6d --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt deleted file mode 100644 index 4afe26403..000000000 --- a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.txt +++ /dev/null @@ -1,10 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:foo -execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md new file mode 100644 index 000000000..0cd492c99 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md @@ -0,0 +1,34 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + # With the `readonly` option functions are left untouched + say hello + + + say world + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt deleted file mode 100644 index d3eb0d65d..000000000 --- a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.txt +++ /dev/null @@ -1,14 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:foo -# With the `readonly` option functions are left untouched -say hello - - -say world diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md new file mode 100644 index 000000000..8d8940fd9 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md @@ -0,0 +1,51 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:bar` + +
+ + ```mcfunction + say hello + ``` + +
+ +- `@function demo:folder/wat` + +
+ + ```mcfunction + function demo:bar + ``` + +
+ +- `@function demo:foo` + +
+ + ```mcfunction + function demo:folder/wat + function demo:bar + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt deleted file mode 100644 index 6d207b8ff..000000000 --- a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.txt +++ /dev/null @@ -1,17 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:bar -say hello - -@function demo:folder/wat -function demo:bar - -@function demo:foo -function demo:folder/wat -function demo:bar diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md new file mode 100644 index 000000000..7b81c43cb --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md @@ -0,0 +1,31 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 7, + "description": "" + } + } + ``` + +
+ +### demo + +- `@function demo:foo` + +
+ + ```mcfunction + say Hello @a[tag=!registered] + execute if score #init temp = #wat temp run say Hello @a[tag=hi] + ``` + +
diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt deleted file mode 100644 index a8f112a26..000000000 --- a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.txt +++ /dev/null @@ -1,11 +0,0 @@ -@data_pack pack.mcmeta -{ - "pack": { - "pack_format": 7, - "description": "" - } -} - -@function demo:foo -say Hello @a[tag=!registered] -execute if score #init temp = #wat temp run say Hello @a[tag=hi] diff --git a/packages/mecha/tests/test_examples.py b/packages/mecha/tests/test_examples.py index 47468a0e4..ceffab1dd 100644 --- a/packages/mecha/tests/test_examples.py +++ b/packages/mecha/tests/test_examples.py @@ -9,4 +9,4 @@ @pytest.mark.parametrize("directory", os.listdir("examples")) def test_build(snapshot: SnapshotFixture, directory: str): with run_beet(directory=f"examples/{directory}") as ctx: - assert snapshot("pack.txt") == ctx.inject(Document) + assert snapshot("pack.md") == ctx.inject(Document) From 5048f4f0abccb59e5ec754119cd855863ac41b03 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 02:02:53 +0000 Subject: [PATCH 0439/1554] 0.9.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 9 +++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 30541ee2e..e71d25933 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,15 @@ +## v0.9.0 (2021-11-16) +### Feature +* Add mecha.contrib.annotate_diagnostics ([`2084667`](https://github.com/mcbeet/mecha/commit/208466709f0b2e1fc1c7a48738152d761681fb55)) +* Add readonly option and setup examples ([`bdb7b1d`](https://github.com/mcbeet/mecha/commit/bdb7b1db66907e1d5eb85a6653e02f9dfd0bdea7)) + +### Fix +* Report diagnostics with logger.warning instead of logger.warn ([`155d01c`](https://github.com/mcbeet/mecha/commit/155d01cd5215894d16a49137d92c4da8c2482696)) +* Add SingleLineConstraint ([`f649b4a`](https://github.com/mcbeet/mecha/commit/f649b4a7bc1cf74725724c22c1fb5ad7767ce03b)) + ## v0.8.2 (2021-11-08) ### Fix * Prevent error when the location is outside the view ([`96c8005`](https://github.com/mcbeet/mecha/commit/96c800527a6b02ba14a47be74976979c9e534294)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index ed2f43a11..c004a17aa 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.2" +__version__ = "0.9.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f60491b3b..a76ab24a3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.8.2" +version = "0.9.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 6dbc95947baa9ea265d6f4ec8fc564d0e100351d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 03:14:57 +0100 Subject: [PATCH 0440/1554] fix: forgot final newline in mecha.contrib.annotate_diagnostics --- packages/mecha/mecha/contrib/annotate_diagnostics.py | 2 +- .../mecha/tests/snapshots/examples__build_basic_lint__0.pack.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/contrib/annotate_diagnostics.py b/packages/mecha/mecha/contrib/annotate_diagnostics.py index c1ff2346c..aff8dcdd0 100644 --- a/packages/mecha/mecha/contrib/annotate_diagnostics.py +++ b/packages/mecha/mecha/contrib/annotate_diagnostics.py @@ -41,4 +41,4 @@ def beet_default(ctx: Context): result += lines[i:] - function.text = "\n".join(result) + function.text = "\n".join(result) + "\n" diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index a39fe426f..4340ae7a0 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -19,7 +19,7 @@ ### demo -- `@function(strip_final_newline) demo:foo` +- `@function demo:foo`
From 6c129c22b21bb2f96317f2b727f3c01edefc7a3f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 02:15:44 +0000 Subject: [PATCH 0441/1554] 0.9.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index e71d25933..403c2a421 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.9.1 (2021-11-16) +### Fix +* Forgot final newline in mecha.contrib.annotate_diagnostics ([`b665a94`](https://github.com/mcbeet/mecha/commit/b665a948c80cb4296721a6b7d55011106c057e9c)) + ## v0.9.0 (2021-11-16) ### Feature * Add mecha.contrib.annotate_diagnostics ([`2084667`](https://github.com/mcbeet/mecha/commit/208466709f0b2e1fc1c7a48738152d761681fb55)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index c004a17aa..69f480435 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.9.0" +__version__ = "0.9.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a76ab24a3..c9f51d176 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.9.0" +version = "0.9.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 223e1dba732751ea568bf1e6a999bb3e55145047 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 01:06:24 +0000 Subject: [PATCH 0442/1554] chore(deps): bump beet from 0.44.2 to 0.44.8 Bumps [beet](https://github.com/mcbeet/beet) from 0.44.2 to 0.44.8. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.44.2...v0.44.8) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 8599850cd..4f846bf20 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.44.2" +version = "0.44.8" description = "The Minecraft pack development kit" category = "main" optional = false @@ -835,8 +835,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.44.2-py3-none-any.whl", hash = "sha256:2e8f8c01401e312677e78fb73cd731a70752d7d0dc3709df00ef7f10ee57262f"}, - {file = "beet-0.44.2.tar.gz", hash = "sha256:d73c233754da23f008317693e8b3fb3c0cb2e1daefb9ae580dd8a0ef465c4511"}, + {file = "beet-0.44.8-py3-none-any.whl", hash = "sha256:6daf3a37d4670c8361a5245613526cb5786498f8d69e0ef52d0f3797ee69fc2d"}, + {file = "beet-0.44.8.tar.gz", hash = "sha256:8f971685a155d74d0461fbf9fe6432e7792c3283cc201235bdd8d0bd53d3c54e"}, ] black = [ {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, @@ -1005,6 +1005,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, @@ -1016,6 +1019,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1027,6 +1033,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, @@ -1039,6 +1048,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1051,6 +1063,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, From f03ede1f55e5e601365001dc700405fe7a91e6b6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 03:43:37 +0100 Subject: [PATCH 0443/1554] feat: add flat markdown --- packages/lectern/README.md | 1 + packages/lectern/lectern/cli.py | 13 +++++++++- packages/lectern/lectern/plugin.py | 10 ++++---- packages/lectern/lectern/serialize.py | 34 ++++++++++++++++++++++----- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/packages/lectern/README.md b/packages/lectern/README.md index d864d2ec9..be6ed581a 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -367,6 +367,7 @@ Options: -r, --resource-pack Extract resource pack. -e, --external-files Emit external files. -p, --prefetch-urls Prefetch markdown links. + -f, --flat Use the flat markdown format. -v, --version Show the version and exit. -h, --help Show this message and exit. ``` diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py index 9a8ea52b6..3def7d218 100644 --- a/packages/lectern/lectern/cli.py +++ b/packages/lectern/lectern/cli.py @@ -47,6 +47,12 @@ def echo(*args: Any, **kwargs: Any): metavar="", help="Prefetch markdown links.", ) +@click.option( + "-f", + "--flat", + is_flag=True, + help="Use the flat markdown format.", +) @click.version_option( __version__, "-v", @@ -61,6 +67,7 @@ def lectern( resource_pack: Optional[str], external_files: Optional[str], prefetch_urls: Optional[str], + flat: bool, ): """Literate Minecraft data packs and resource packs.""" config: Any @@ -97,7 +104,11 @@ def lectern( "resource_pack": {"load": packs}, "pipeline": ["lectern"], "meta": { - "lectern": {"snapshot": dest, "external_files": external_files}, + "lectern": { + "snapshot": dest, + "snapshot_flat": flat, + "external_files": external_files, + }, }, } diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 9a03c631e..8efda12fd 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -16,6 +16,7 @@ class LecternOptions(BaseModel): load: List[str] = [] snapshot: Optional[str] = None + snapshot_flat: bool = False external_files: Optional[str] = None scripts: List[List[str]] = [] @@ -45,7 +46,8 @@ def lectern(ctx: Context, opts: LecternOptions): yield if opts.snapshot: - document.save( - ctx.directory / opts.snapshot, - ctx.directory / opts.external_files if opts.external_files else None, - ) + with document.markdown_serializer.use_flat_format(opts.snapshot_flat): + document.save( + ctx.directory / opts.snapshot, + ctx.directory / opts.external_files if opts.external_files else None, + ) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 7559ee140..4eb04b330 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -9,6 +9,7 @@ import os import re from base64 import b64encode +from contextlib import contextmanager from dataclasses import dataclass, field from itertools import chain from mimetypes import guess_type @@ -208,6 +209,22 @@ def escape_fragment(self, content: str, escaped_regex: "re.Pattern[str]") -> str class MarkdownSerializer: """Document serializer that outputs markdown and emits associated files.""" + flat: bool + + def __init__(self, flat: bool = False): + self.flat = flat + + @contextmanager + def use_flat_format(self, flat: bool = True): + """Context manager for using the flat markdown format.""" + previous = self.flat + self.flat = flat + + try: + yield + finally: + self.flat = previous + def serialize( self, assets: ResourcePack, @@ -300,8 +317,9 @@ def serialize_pack( def format_serialized_file(self, chunks: Iterable[str]) -> Iterator[str]: """Format the markdown chunks for serializing file instances.""" - chunks = [indent(chunk, " ") for chunk in chunks] - chunks[0] = "\n-" + chunks[0][1:] + if not self.flat: + chunks = [indent(chunk, " ") for chunk in chunks] + chunks[0] = "\n-" + chunks[0][1:] yield from chunks def serialize_file_instance( @@ -323,10 +341,12 @@ def serialize_file_instance( content += "\n" yield f"`@{directive} {argument}`" - yield "\n
" + if not self.flat: + yield "\n
" yield "\n```" + EXTENSION_HIGHLIGHTING.get(serialized_file.extension, "") yield content + "```" - yield "\n
" + if not self.flat: + yield "\n
" return @@ -334,8 +354,10 @@ def serialize_file_instance( if serialized_file.content_type.startswith("image/"): yield f"`@{directive} {argument}`" - yield "\n
" + if not self.flat: + yield "\n
" yield f"\n![{directive}{serialized_file.extension}]({target})" - yield "\n
" + if not self.flat: + yield "\n
" else: yield f"[`@{directive} {argument}`]({target})" From 9677e2924cee3dd0cf812ea682021b493d8e8256 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 02:44:28 +0000 Subject: [PATCH 0444/1554] 0.18.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 5ffed1211..a367d7609 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.18.0 (2021-11-16) +### Feature +* Add flat markdown ([`45c5cf5`](https://github.com/mcbeet/lectern/commit/45c5cf5d7c949e824936ce43fce346c06b4af8ad)) + ## v0.17.1 (2021-11-05) ### Fix * Update list of supported resources ([`fbbbbdc`](https://github.com/mcbeet/lectern/commit/fbbbbdc6a3c96fe0e496e01a8732eadb7ea67485)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index dfd8a1808..067529f74 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.17.1" +__version__ = "0.18.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index a1d8da205..1a486ee68 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.17.1" +version = "0.18.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From dec646ee2a109aa66f6b588bfc16df091a3264fb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 03:50:23 +0100 Subject: [PATCH 0445/1554] chore: use flat snapshot format --- packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- .../examples__build_basic__0.pack.md | 36 ++++----- .../examples__build_basic_lint__0.pack.md | 76 ++++++++----------- .../examples__build_basic_messages__0.pack.md | 34 +++------ ...examples__build_basic_multiline__0.pack.md | 34 +++------ .../examples__build_basic_readonly__0.pack.md | 38 ++++------ ...__build_basic_relative_location__0.pack.md | 68 ++++++----------- .../examples__build_custom_command__0.pack.md | 36 ++++----- packages/mecha/tests/test_examples.py | 4 +- 10 files changed, 129 insertions(+), 207 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 1a09112ee..52b680c9b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -333,7 +333,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "lectern" -version = "0.17.1" +version = "0.18.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false @@ -828,7 +828,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "ec3965951f77c8b8b5adc38f3ce66b134147d1832ce3c67b1e6bcc1c9f603272" +content-hash = "f6bf58cfd1efa83843bd6e52afe1ccf582373cb2f17910f1382ccc747af63b25" [metadata.files] atomicwrites = [ @@ -998,8 +998,8 @@ keyring = [ {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] lectern = [ - {file = "lectern-0.17.1-py3-none-any.whl", hash = "sha256:c38be8d61ecbd6dd50c5aa728f8ee30c8d314fc601aced8295019ca2179d2621"}, - {file = "lectern-0.17.1.tar.gz", hash = "sha256:2813a8e804fe9704315440af75e2b5e7ce24a0db5a1b2c8e0ebfc34d8e400468"}, + {file = "lectern-0.18.0-py3-none-any.whl", hash = "sha256:b33ca5c017077bee1de583f24a43502da6666b80cb83beacd45e7963fb3b4c2d"}, + {file = "lectern-0.18.0.tar.gz", hash = "sha256:5c3fa58e8fe93699ea8abd151f9823863146493bdc4163dfb4c859c06128f7d2"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c9f51d176..96a6560d6 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -33,7 +33,7 @@ pytest = "^6.2.5" isort = "^5.10.0" python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" -lectern = "^0.17.1" +lectern = "^0.18.0" [tool.black] target-version = ["py38"] diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md index 155117064..1ae9b7935 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md @@ -1,31 +1,21 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo +`@function demo:foo` -- `@function demo:foo` - -
- - ```mcfunction - say hello - say world - ``` - -
+```mcfunction +say hello +say world +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index 4340ae7a0..4042a9e7f 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -1,50 +1,40 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo - -- `@function demo:foo` - -
- - ```mcfunction - say hello - - # warn Gamemode argument should go before scores. (selector_argument_order) - # src/data/demo/functions/foo.mcfunction:3:41 - # 2 | - # 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] - # : ^^^^^^^^^^^^^^^^^^ - # warn Redundant `execute run` clause. (execute_run) - # src/data/demo/functions/foo.mcfunction:3:1 - # 1 | say hello - # 2 | - # 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] - # : ^^^^^^^^^^^ - execute run say hello @p[scores={tmp=1},gamemode=adventure] - - # warn Redundant `run execute` clause. (run_execute) - # src/data/demo/functions/foo.mcfunction:5:20 - # 4 | - # 5 | execute in the_end run execute at @a run setblock ~ ~ ~ lava - # : ^^^^^^^^^^^ - execute in the_end run execute at @a run setblock ~ ~ ~ lava - ``` - -
+`@function demo:foo` + +```mcfunction +say hello + +# warn Gamemode argument should go before scores. (selector_argument_order) +# src/data/demo/functions/foo.mcfunction:3:41 +# 2 | +# 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] +# : ^^^^^^^^^^^^^^^^^^ +# warn Redundant `execute run` clause. (execute_run) +# src/data/demo/functions/foo.mcfunction:3:1 +# 1 | say hello +# 2 | +# 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] +# : ^^^^^^^^^^^ +execute run say hello @p[scores={tmp=1},gamemode=adventure] + +# warn Redundant `run execute` clause. (run_execute) +# src/data/demo/functions/foo.mcfunction:5:20 +# 4 | +# 5 | execute in the_end run execute at @a run setblock ~ ~ ~ lava +# : ^^^^^^^^^^^ +execute in the_end run execute at @a run setblock ~ ~ ~ lava +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md index 3a26b13e4..005a43ef5 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md @@ -1,30 +1,20 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo +`@function demo:foo` -- `@function demo:foo` - -
- - ```mcfunction - tellraw @a {"text": "hello", "color": "red"} - ``` - -
+```mcfunction +tellraw @a {"text": "hello", "color": "red"} +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md index 96a7a3d6d..a33c2cb83 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md @@ -1,30 +1,20 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo +`@function demo:foo` -- `@function demo:foo` - -
- - ```mcfunction - execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! - ``` - -
+```mcfunction +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md index 0cd492c99..41c823ed9 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md @@ -1,34 +1,24 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo +`@function demo:foo` -- `@function demo:foo` - -
- - ```mcfunction - # With the `readonly` option functions are left untouched - say hello - +```mcfunction +# With the `readonly` option functions are left untouched +say hello - say world - ``` -
+say world +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md index 8d8940fd9..f9215e078 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md @@ -1,51 +1,31 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo - -- `@function demo:bar` - -
- - ```mcfunction - say hello - ``` - -
- -- `@function demo:folder/wat` - -
- - ```mcfunction - function demo:bar - ``` - -
- -- `@function demo:foo` - -
- - ```mcfunction - function demo:folder/wat - function demo:bar - ``` - -
+`@function demo:bar` + +```mcfunction +say hello +``` +`@function demo:folder/wat` + +```mcfunction +function demo:bar +``` +`@function demo:foo` + +```mcfunction +function demo:folder/wat +function demo:bar +``` diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md index 7b81c43cb..84907576a 100644 --- a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md @@ -1,31 +1,21 @@ # Lectern snapshot ## Data pack +`@data_pack pack.mcmeta` -- `@data_pack pack.mcmeta` - -
- - ```json - { - "pack": { - "pack_format": 7, - "description": "" - } +```json +{ + "pack": { + "pack_format": 7, + "description": "" } - ``` - -
+} +``` ### demo +`@function demo:foo` -- `@function demo:foo` - -
- - ```mcfunction - say Hello @a[tag=!registered] - execute if score #init temp = #wat temp run say Hello @a[tag=hi] - ``` - -
+```mcfunction +say Hello @a[tag=!registered] +execute if score #init temp = #wat temp run say Hello @a[tag=hi] +``` diff --git a/packages/mecha/tests/test_examples.py b/packages/mecha/tests/test_examples.py index ceffab1dd..3c1013e50 100644 --- a/packages/mecha/tests/test_examples.py +++ b/packages/mecha/tests/test_examples.py @@ -9,4 +9,6 @@ @pytest.mark.parametrize("directory", os.listdir("examples")) def test_build(snapshot: SnapshotFixture, directory: str): with run_beet(directory=f"examples/{directory}") as ctx: - assert snapshot("pack.md") == ctx.inject(Document) + document = ctx.inject(Document) + document.markdown_serializer.flat = True + assert snapshot("pack.md") == document From 2918c47050ed807684696fb9250fac6e67d2d6a8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 03:57:43 +0100 Subject: [PATCH 0446/1554] fix: tweak styling for diagnostic annotations --- packages/mecha/mecha/contrib/annotate_diagnostics.py | 3 ++- .../tests/snapshots/examples__build_basic_lint__0.pack.md | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/contrib/annotate_diagnostics.py b/packages/mecha/mecha/contrib/annotate_diagnostics.py index aff8dcdd0..4f58ca6ab 100644 --- a/packages/mecha/mecha/contrib/annotate_diagnostics.py +++ b/packages/mecha/mecha/contrib/annotate_diagnostics.py @@ -15,7 +15,7 @@ def beet_default(ctx: Context): annotations: Dict[TextFileBase[Any], List[Tuple[int, int, List[str]]]] = {} for diagnostic in mc.diagnostics.exceptions: - message = f"{diagnostic.level:<7}{diagnostic.format_message()}\n{diagnostic.format_location()}" + message = f"{diagnostic.level.upper():<7}{diagnostic.format_message()}\n{diagnostic.format_location()}" if diagnostic.file and not diagnostic.location.unknown: if source := mc.database[diagnostic.file].source: @@ -23,6 +23,7 @@ def beet_default(ctx: Context): message += f"\n{code}" comments = [f"# {line}" for line in message.splitlines()] + comments[0] = "#>" + comments[0][2:] rendered = annotations.setdefault(diagnostic.file, []) line_index = diagnostic.location.lineno - 1 diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index 4042a9e7f..d6db96fcd 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -18,12 +18,12 @@ ```mcfunction say hello -# warn Gamemode argument should go before scores. (selector_argument_order) +#>WARN Gamemode argument should go before scores. (selector_argument_order) # src/data/demo/functions/foo.mcfunction:3:41 # 2 | # 3 | execute run say hello @p[scores={tmp=1},gamemode=adventure] # : ^^^^^^^^^^^^^^^^^^ -# warn Redundant `execute run` clause. (execute_run) +#>WARN Redundant `execute run` clause. (execute_run) # src/data/demo/functions/foo.mcfunction:3:1 # 1 | say hello # 2 | @@ -31,7 +31,7 @@ say hello # : ^^^^^^^^^^^ execute run say hello @p[scores={tmp=1},gamemode=adventure] -# warn Redundant `run execute` clause. (run_execute) +#>WARN Redundant `run execute` clause. (run_execute) # src/data/demo/functions/foo.mcfunction:5:20 # 4 | # 5 | execute in the_end run execute at @a run setblock ~ ~ ~ lava From 8c7711e1c9cb93960ac8ae112c28150afcb48671 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 02:58:44 +0000 Subject: [PATCH 0447/1554] 0.9.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 403c2a421..b7b261a62 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.9.2 (2021-11-16) +### Fix +* Tweak styling for diagnostic annotations ([`f4e3fde`](https://github.com/mcbeet/mecha/commit/f4e3fdeeb34d3564d39698336e8d66cc321d8fd3)) + ## v0.9.1 (2021-11-16) ### Fix * Forgot final newline in mecha.contrib.annotate_diagnostics ([`b665a94`](https://github.com/mcbeet/mecha/commit/b665a948c80cb4296721a6b7d55011106c057e9c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 69f480435..87297af2a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.9.1" +__version__ = "0.9.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 96a6560d6..3ae0572e7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.9.1" +version = "0.9.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From ed9617ff5fb0592271ad43901387c898b497e5d4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 05:22:39 +0100 Subject: [PATCH 0448/1554] feat: add mecha.contrib.implicit_execute --- .../examples/basic_implicit_execute/beet.yml | 6 ++ .../src/data/demo/functions/foo.mcfunction | 8 ++ .../mecha/mecha/contrib/implicit_execute.py | 78 +++++++++++++++++++ ...s__build_basic_implicit_execute__0.pack.md | 27 +++++++ 4 files changed, 119 insertions(+) create mode 100644 packages/mecha/examples/basic_implicit_execute/beet.yml create mode 100644 packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/implicit_execute.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md diff --git a/packages/mecha/examples/basic_implicit_execute/beet.yml b/packages/mecha/examples/basic_implicit_execute/beet.yml new file mode 100644 index 000000000..1804efec7 --- /dev/null +++ b/packages/mecha/examples/basic_implicit_execute/beet.yml @@ -0,0 +1,6 @@ +require: + - mecha.contrib.implicit_execute +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..38e7d588e --- /dev/null +++ b/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,8 @@ +execute if score @p tmp matches 1 run say hello +execute as @a at @s run setblock ~ ~ ~ stone +execute if score @p tmp matches 1 say hello +execute as @a at @s setblock ~ ~ ~ stone +if score @p tmp matches 1 run say hello +as @a at @s run setblock ~ ~ ~ stone +if score @p tmp matches 1 say hello +as @a at @s setblock ~ ~ ~ stone diff --git a/packages/mecha/mecha/contrib/implicit_execute.py b/packages/mecha/mecha/contrib/implicit_execute.py new file mode 100644 index 000000000..8bb463107 --- /dev/null +++ b/packages/mecha/mecha/contrib/implicit_execute.py @@ -0,0 +1,78 @@ +"""Plugin that handles implicit execute commands.""" + + +from dataclasses import dataclass, replace +from typing import Set, cast + +from beet import Context +from beet.core.utils import required_field +from tokenstream import set_location + +from mecha import AstChildren, AstCommand, AstNode, Mecha, MutatingReducer, rule + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + + if execute := mc.spec.tree.get("execute"): + commands = {literal for literal, _ in mc.spec.tree.get_all_literals()} + commands.discard("execute") + + shorthands = {literal for literal, _ in execute.get_all_literals()} + shorthands.discard("run") + + mc.spec.add_commands( + { + "type": "root", + "children": { + "execute": { + "type": "literal", + "children": { + literal: {"type": "literal", "redirect": [literal]} + for literal in commands + }, + }, + **{ + literal: {"type": "literal", "redirect": ["execute", literal]} + for literal in shorthands + }, + }, + } + ) + + mc.normalize.extend( + ImplicitExecuteNormalizer( + commands=commands, + shorthands=shorthands, + ) + ) + + +@dataclass +class ImplicitExecuteNormalizer(MutatingReducer): + """Normalizer that replaces implicit execute shorthands with the full command.""" + + commands: Set[str] = required_field() + shorthands: Set[str] = required_field() + + @rule(AstCommand) + def implicit_execute(self, node: AstCommand) -> AstCommand: + prefix, _, identifier = node.identifier.partition(":") + + if prefix == "execute" and identifier.partition(":")[0] in self.commands: + subcommand = replace(node, identifier=identifier) + run = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([cast(AstNode, subcommand)]), + ) + return set_location(run, node) + + elif prefix in self.shorthands: + subcommand = replace(node, identifier=f"execute:{node.identifier}") + execute = AstCommand( + identifier="execute:subcommand", + arguments=AstChildren([cast(AstNode, subcommand)]), + ) + return set_location(execute, node) + + return node diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md new file mode 100644 index 000000000..c86f0fe9e --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -0,0 +1,27 @@ +# Lectern snapshot + +## Data pack +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 7, + "description": "" + } +} +``` + +### demo +`@function demo:foo` + +```mcfunction +execute if score @p tmp matches 1 run say hello +execute as @a at @s run setblock ~ ~ ~ stone +execute if score @p tmp matches 1 run say hello +execute as @a at @s run setblock ~ ~ ~ stone +execute if score @p tmp matches 1 run say hello +execute as @a at @s run setblock ~ ~ ~ stone +execute if score @p tmp matches 1 run say hello +execute as @a at @s run setblock ~ ~ ~ stone +``` From 108a767d68340e7f0fe47bd2e6451d87e15f0a96 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 04:23:34 +0000 Subject: [PATCH 0449/1554] 0.10.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index b7b261a62..075a6cf50 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.10.0 (2021-11-16) +### Feature +* Add mecha.contrib.implicit_execute ([`835660f`](https://github.com/mcbeet/mecha/commit/835660f92fcfa9473211c84b2ed754096afb23a8)) + ## v0.9.2 (2021-11-16) ### Fix * Tweak styling for diagnostic annotations ([`f4e3fde`](https://github.com/mcbeet/mecha/commit/f4e3fdeeb34d3564d39698336e8d66cc321d8fd3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 87297af2a..6748adbd6 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.9.2" +__version__ = "0.10.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3ae0572e7..f31d3b998 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.9.2" +version = "0.10.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From d74a9994d9856e5a704c07fd3053503ccb937814 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 05:29:39 +0100 Subject: [PATCH 0450/1554] chore: add more tests for implicit_execute --- .../src/data/demo/functions/foo.mcfunction | 3 +++ packages/mecha/examples/kitchen_sink/beet.yml | 9 ++++++++ .../functions/implicit_execute.mcfunction | 12 +++++++++++ ...s__build_basic_implicit_execute__0.pack.md | 2 ++ .../examples__build_kitchen_sink__0.pack.md | 21 +++++++++++++++++++ 5 files changed, 47 insertions(+) create mode 100644 packages/mecha/examples/kitchen_sink/beet.yml create mode 100644 packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md diff --git a/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction index 38e7d588e..0507ddfa7 100644 --- a/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction @@ -6,3 +6,6 @@ if score @p tmp matches 1 run say hello as @a at @s run setblock ~ ~ ~ stone if score @p tmp matches 1 say hello as @a at @s setblock ~ ~ ~ stone + +execute store result score PLAYER_COUNT global if entity @a +store result score PLAYER_COUNT global if entity @a diff --git a/packages/mecha/examples/kitchen_sink/beet.yml b/packages/mecha/examples/kitchen_sink/beet.yml new file mode 100644 index 000000000..4b55202f5 --- /dev/null +++ b/packages/mecha/examples/kitchen_sink/beet.yml @@ -0,0 +1,9 @@ +require: + - mecha.contrib.implicit_execute +data_pack: + load: [src] +pipeline: + - mecha +meta: + mecha: + multiline: true diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction new file mode 100644 index 000000000..52969db42 --- /dev/null +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction @@ -0,0 +1,12 @@ +as @a at @s align xyz + summon armor_stand ~ ~ ~ { + Tags: [ + "position_history", + "new" + ], + Invisible: 1b, + Marker: 1b + } + +if score @s obj matches 2 + say hi diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md index c86f0fe9e..16a1caa0b 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -24,4 +24,6 @@ execute if score @p tmp matches 1 run say hello execute as @a at @s run setblock ~ ~ ~ stone execute if score @p tmp matches 1 run say hello execute as @a at @s run setblock ~ ~ ~ stone +execute store result score PLAYER_COUNT global if entity @a +execute store result score PLAYER_COUNT global if entity @a ``` diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md new file mode 100644 index 000000000..0d53dcc11 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -0,0 +1,21 @@ +# Lectern snapshot + +## Data pack +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 7, + "description": "" + } +} +``` + +### demo +`@function demo:implicit_execute` + +```mcfunction +execute as @a at @s align xyz run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} +execute if score @s obj matches 2 run say hi +``` From aff771bed4b653b9108a6f3d84131f595032d22c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 15:20:07 +0100 Subject: [PATCH 0451/1554] feat: add keep_comments option --- .../examples/basic_keep_comments/beet.yml | 8 ++ .../src/data/demo/functions/foo.mcfunction | 78 +++++++++++++++ packages/mecha/mecha/api.py | 18 +++- packages/mecha/mecha/database.py | 1 + packages/mecha/mecha/serialize.py | 53 ++++++++-- ...ples__build_basic_keep_comments__0.pack.md | 97 +++++++++++++++++++ 6 files changed, 243 insertions(+), 12 deletions(-) create mode 100644 packages/mecha/examples/basic_keep_comments/beet.yml create mode 100644 packages/mecha/examples/basic_keep_comments/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md diff --git a/packages/mecha/examples/basic_keep_comments/beet.yml b/packages/mecha/examples/basic_keep_comments/beet.yml new file mode 100644 index 000000000..f048780ad --- /dev/null +++ b/packages/mecha/examples/basic_keep_comments/beet.yml @@ -0,0 +1,8 @@ +data_pack: + load: [src] +pipeline: + - mecha +meta: + mecha: + multiline: true + keep_comments: true diff --git a/packages/mecha/examples/basic_keep_comments/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_keep_comments/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..cfaf77097 --- /dev/null +++ b/packages/mecha/examples/basic_keep_comments/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,78 @@ +# This is a file with comments that need to be preserved + + +# First command +execute + as @a + at @s + align xyz + if block ~ ~ ~ wool[ + foo = bar + ] + run + # Summon the trail + summon armor_stand ~ ~ ~ { + Tags: [ + "position_history", + "new" + ], + Invisible: 1b, + Marker: 1b + } + + + +#>Some explanation +# +# Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +# tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +# quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +# consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +# cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat +# non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +tellraw @s { + "text": "Hover me!", + # The hover event is cool + "hoverEvent": { + "action": "show_text", + "value": "Hi!" + } +} + +say breaking news +say breaking news +say breaking news +say breaking news +say breaking news + +execute + # When the player is on wool + as @a + at @s + if block ~ ~-1 ~ #wool + + # Give a special stone block + run give @s stone{ + display: { + Name: '[{"text": "Hello", "bold": true}]', + Lore: [ + '[{ "text": "Something else here" }]', + ] + } + } + +execute + if block ~ ~ ~ #namespace:tag # But what if # we # put # hash # symbols + if entity @s[tag=foo] # everywhere # +tellraw @a { + "text": "Hello # there" +} + +say + this + is a + # some comment + continuation +say wat + +# Final comment diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index a251ff47e..9d627d2b4 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -56,6 +56,7 @@ class MechaOptions(BaseModel): version: VersionNumber = "1.17" multiline: bool = False + keep_comments: bool = False readonly: Optional[bool] = None match: Optional[List[str]] = None rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} @@ -68,6 +69,7 @@ class Mecha: ctx: InitVar[Optional[Context]] = None version: InitVar[VersionNumber] = "1.17" multiline: InitVar[bool] = False + keep_comments: InitVar[bool] = False readonly: bool = False match: Optional[List[str]] = None @@ -84,7 +86,7 @@ class Mecha: steps: List[Dispatcher[AstRoot]] = extra_field(default_factory=list) - serialize: Dispatcher[str] = extra_field(init=False) + serialize: Serializer = extra_field(init=False) database: CompilationDatabase = extra_field(default_factory=CompilationDatabase) diagnostics: DiagnosticCollection = extra_field( @@ -96,11 +98,13 @@ def __post_init__( ctx: Optional[Context], version: VersionNumber, multiline: bool, + keep_comments: bool, ): if ctx: opts = ctx.validate("mecha", MechaOptions) version = opts.version multiline = opts.multiline + keep_comments = opts.keep_comments if opts.readonly is not None: self.readonly = opts.readonly @@ -142,7 +146,11 @@ def __post_init__( parsers=get_parsers(version), ) - self.serialize = Serializer(self.spec) + self.serialize = Serializer( + spec=self.spec, + database=self.database, + keep_comments=keep_comments, + ) @contextmanager def prepare_token_stream( @@ -271,6 +279,7 @@ def compile( *, match: Optional[List[str]] = None, multiline: Optional[bool] = None, + keep_comments: Optional[bool] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> DataPack: @@ -284,6 +293,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + keep_comments: Optional[bool] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> TextFileType: @@ -297,6 +307,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + keep_comments: Optional[bool] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Function: @@ -310,6 +321,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, + keep_comments: Optional[bool] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Union[DataPack, TextFileBase[Any]]: @@ -384,7 +396,7 @@ def compile( if not compilation_unit.ast: continue with self.serialize.use_diagnostics(compilation_unit.diagnostics): - function.text = self.serialize(compilation_unit.ast) + function.text = self.serialize(compilation_unit.ast, keep_comments) diagnostics = DiagnosticCollection( [ diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index bd7fd2e79..4d650734a 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -47,6 +47,7 @@ def __init__(self): self.queue = [] self.session = set() self.current = TextFile() + self[self.current] = CompilationUnit() def process( self, diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 46f1f414c..3b82d8110 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -4,7 +4,11 @@ import json -from typing import Any, Iterable, Iterator, List +import re +from dataclasses import dataclass, field +from typing import Any, Iterable, Iterator, List, Optional + +from beet.core.utils import required_field from .ast import ( AstBlock, @@ -36,19 +40,24 @@ AstTime, AstUUID, ) +from .database import CompilationDatabase from .dispatch import Visitor, rule from .spec import CommandSpec from .utils import QuoteHelper +REGEX_COMMENTS = re.compile(r"^(?:(\s*#.*)|.+)", re.MULTILINE) + +@dataclass class Serializer(Visitor): - spec: CommandSpec - quote_helper: QuoteHelper + spec: CommandSpec = required_field() + database: CompilationDatabase = field(default_factory=CompilationDatabase) + + keep_comments: bool = False - def __init__(self, spec: CommandSpec): - super().__init__() - self.spec = spec - self.quote_helper = QuoteHelper( + regex_comments: "re.Pattern[str]" = field(default=REGEX_COMMENTS) + quote_helper: QuoteHelper = field( + default_factory=lambda: QuoteHelper( escape_sequences={ r"\\": "\\", r"\f": "\f", @@ -57,10 +66,20 @@ def __init__(self, spec: CommandSpec): r"\t": "\t", } ) + ) - def __call__(self, node: AstNode) -> str: + def __call__(self, node: AstNode, keep_comments: Optional[bool] = None) -> str: result: List[str] = [] - self.invoke(node, result) + + if keep_comments is not None: + self.keep_comments, keep_comments = keep_comments, self.keep_comments + + try: + self.invoke(node, result) + finally: + if keep_comments is not None: + self.keep_comments = keep_comments + return "".join(result) def collection( @@ -94,10 +113,26 @@ def fallback(self, node: AstNode, result: List[str]): @rule(AstRoot) def root(self, node: AstRoot, result: List[str]): + pos = 0 + source = self.keep_comments and self.database[self.database.current].source + for command in node.commands: + if source and not command.location.unknown: + if pos > -1: + if fill := source[pos : command.location.pos]: + result.append(self.regex_comments.sub(r"\1", fill)) + try: + pos = source.index("\n", command.location.pos) + 1 + except ValueError: + pos = -1 + yield command result.append("\n") + if source and pos > -1: + if fill := source[pos:]: + result.append(self.regex_comments.sub(r"\1", fill)) + @rule(AstCommand) def command(self, node: AstCommand, result: List[str]): prototype = self.spec.prototypes[node.identifier] diff --git a/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md new file mode 100644 index 000000000..b962aae0d --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md @@ -0,0 +1,97 @@ +# Lectern snapshot + +## Data pack +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 7, + "description": "" + } +} +``` + +### demo +`@function demo:foo` + +```mcfunction +# This is a file with comments that need to be preserved + + +# First command +execute as @a at @s align xyz if block ~ ~ ~ wool[foo=bar] run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} + + + + + + + + # Summon the trail + + + + + + + + + + + +#>Some explanation +# +# Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +# tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +# quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +# consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +# cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat +# non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +tellraw @s {"text": "Hover me!", "hoverEvent": {"action": "show_text", "value": "Hi!"}} + + # The hover event is cool + + + + + + +say breaking news +say breaking news +say breaking news +say breaking news +say breaking news + +execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '[{"text": "Hello", "bold": true}]', Lore: ['[{ "text": "Something else here" }]']}} + # When the player is on wool + + + + + # Give a special stone block + + + + + + + + + +execute if block ~ ~ ~ #namespace:tag if entity @s[tag=foo] + + +tellraw @a {"text": "Hello # there"} + + + +say this is a continuation + + + # some comment + +say wat + +# Final comment +``` From 581246e9702dbcef40d1532ef7ecffd53305bfcd Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 14:20:56 +0000 Subject: [PATCH 0452/1554] 0.11.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 075a6cf50..42d38fecc 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.11.0 (2021-11-16) +### Feature +* Add keep_comments option ([`efda05a`](https://github.com/mcbeet/mecha/commit/efda05a72e361429cad309fedce477580212bb90)) + ## v0.10.0 (2021-11-16) ### Feature * Add mecha.contrib.implicit_execute ([`835660f`](https://github.com/mcbeet/mecha/commit/835660f92fcfa9473211c84b2ed754096afb23a8)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 6748adbd6..79ce9fc14 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.10.0" +__version__ = "0.11.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f31d3b998..0b9c1066d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.10.0" +version = "0.11.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 7e20dc901d5c3c6541a24b400a59f1f7b76361a1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Nov 2021 16:45:39 +0100 Subject: [PATCH 0453/1554] fix: handle possible conflicts between execute shorthands and commands --- packages/mecha/mecha/contrib/implicit_execute.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/mecha/mecha/contrib/implicit_execute.py b/packages/mecha/mecha/contrib/implicit_execute.py index 8bb463107..7e28f73e0 100644 --- a/packages/mecha/mecha/contrib/implicit_execute.py +++ b/packages/mecha/mecha/contrib/implicit_execute.py @@ -21,6 +21,8 @@ def beet_default(ctx: Context): shorthands = {literal for literal, _ in execute.get_all_literals()} shorthands.discard("run") + commands, shorthands = commands - shorthands, shorthands - commands + mc.spec.add_commands( { "type": "root", From 24f42f18d1b7976e56d3272e6a80b5a5efefe280 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Nov 2021 15:46:30 +0000 Subject: [PATCH 0454/1554] 0.11.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 42d38fecc..8e712f6f9 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.11.1 (2021-11-16) +### Fix +* Handle possible conflicts between execute shorthands and commands ([`c10f8cb`](https://github.com/mcbeet/mecha/commit/c10f8cbed99a7a4357d3d7f7b184d19e366a89eb)) + ## v0.11.0 (2021-11-16) ### Feature * Add keep_comments option ([`efda05a`](https://github.com/mcbeet/mecha/commit/efda05a72e361429cad309fedce477580212bb90)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 79ce9fc14..9b9d78724 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.11.0" +__version__ = "0.11.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0b9c1066d..49bb9dfbd 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.11.0" +version = "0.11.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5e672e1e047410fb50feedcd5581a3e2e1262ba0 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 18 Nov 2021 02:34:06 +0100 Subject: [PATCH 0455/1554] feat: add cli command for dumping mecha ast --- packages/mecha/mecha/commands.py | 23 +++++++++++++++++++++++ packages/mecha/pyproject.toml | 3 +++ 2 files changed, 26 insertions(+) create mode 100644 packages/mecha/mecha/commands.py diff --git a/packages/mecha/mecha/commands.py b/packages/mecha/mecha/commands.py new file mode 100644 index 000000000..3f1dd9059 --- /dev/null +++ b/packages/mecha/mecha/commands.py @@ -0,0 +1,23 @@ +import os +import pickle + +import click +from beet import ErrorMessage, Project +from beet.toolchain.cli import beet, echo + +pass_project = click.make_pass_decorator(Project) # type: ignore + + +@beet.command() +@pass_project +@click.argument("filename", type=click.Path(exists=True, dir_okay=False)) +def ast(project: Project, filename: str): + """Inspect cached mecha ast.""" + filename = os.path.relpath(filename, project.directory) + ast_path = project.cache["mecha"].get_path(f"{filename}-ast") + + try: + with ast_path.open("rb") as f: + echo(pickle.load(f).dump()) + except FileNotFoundError as exc: + raise ErrorMessage(f"No cached ast for {filename!r}.") from exc diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 49bb9dfbd..22b12f3d9 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -35,6 +35,9 @@ python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" lectern = "^0.18.0" +[tool.poetry.plugins.beet] +commands = "mecha.commands" + [tool.black] target-version = ["py38"] include = '\.pyi?$' From 200c923d852162db465b2cb7ebc07b029a916b36 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 18 Nov 2021 07:18:49 +0100 Subject: [PATCH 0456/1554] fix: make it possible to create resource location nodes from strings --- packages/mecha/mecha/ast.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 72cfde3fe..546845a55 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -420,6 +420,14 @@ class AstResourceLocation(AstNode): parser = "resource_location_or_tag" + @classmethod + def from_value(cls, value: str) -> "AstResourceLocation": + """Create a resource location node representing the given value.""" + if is_tag := value.startswith("#"): + value = value[1:] + namespace, _, path = value.rpartition(":") + return cls(is_tag=is_tag, namespace=namespace or None, path=path) + def get_canonical_value(self) -> str: """Return the canonical value of the resource location as a string.""" prefix = "#" if self.is_tag else "" From 8811ac5f5dc98bdfb062701d44a2305f5bc2d205 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 18 Nov 2021 07:20:21 +0100 Subject: [PATCH 0457/1554] fix: keep track of the current step in the database --- packages/mecha/mecha/database.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 4d650734a..09dc29016 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -39,6 +39,7 @@ class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): index: Dict[str, TextFileBase[Any]] queue: List[Tuple[int, str, TextFileBase[Any]]] session: Set[TextFileBase[Any]] + step: int current: TextFileBase[Any] def __init__(self): @@ -46,6 +47,7 @@ def __init__(self): self.index = {} self.queue = [] self.session = set() + self.step = -1 self.current = TextFile() self[self.current] = CompilationUnit() @@ -84,5 +86,5 @@ def dequeue(self) -> Tuple[int, TextFileBase[Any]]: def process_queue(self) -> Iterator[Tuple[int, TextFileBase[Any]]]: """Yield database entries from the queue.""" while self.queue: - step, self.current = self.dequeue() - yield step, self.current + self.step, self.current = self.dequeue() + yield self.step, self.current From 315841e3599199db1e675c8cb68295bf6fd20e2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Nov 2021 01:08:34 +0000 Subject: [PATCH 0458/1554] chore(deps-dev): bump black from 21.10b0 to 21.11b0 Bumps [black](https://github.com/psf/black) from 21.10b0 to 21.11b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 4f846bf20..1f2821f2e 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.10b0" +version = "21.11b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -819,7 +819,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "1f8c8cb5c677099ece16af5b6c7ba6bc9633f87c1827087ac34ab847f11d0ff1" +content-hash = "9ab78bee488f6bb3a0bb0ef3ba0ef0d044862f0582eb7c1d4d648d7eb2c2928d" [metadata.files] atomicwrites = [ @@ -839,8 +839,8 @@ beet = [ {file = "beet-0.44.8.tar.gz", hash = "sha256:8f971685a155d74d0461fbf9fe6432e7792c3283cc201235bdd8d0bd53d3c54e"}, ] black = [ - {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, - {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, + {file = "black-21.11b0-py3-none-any.whl", hash = "sha256:0b1f66cbfadcd332ceeaeecf6373d9991d451868d2e2219ad0ac1213fb701117"}, + {file = "black-21.11b0.tar.gz", hash = "sha256:83f3852301c8dcb229e9c444dd79f573c8d31c7c2dad9bbaaa94c808630e32aa"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 1a486ee68..b496e75fd 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -30,7 +30,7 @@ markdown-it-py = "^1.1.0" click = "^8.0.1" [tool.poetry.dev-dependencies] -black = "^21.10b0" +black = "^21.11b0" rope = "^0.20.1" pytest = "^6.2.5" isort = "^5.9.3" From 5734d9e786b3935cbbaf0d5981cce6a2ad2e2f7e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 18 Nov 2021 08:23:31 +0100 Subject: [PATCH 0459/1554] feat: add mecha.contrib.nesting --- .../mecha/examples/basic_nesting/beet.yml | 9 + .../src/data/demo/functions/foo.mcfunction | 39 ++++ packages/mecha/examples/kitchen_sink/beet.yml | 2 + .../data/demo/functions/nesting.mcfunction | 20 ++ packages/mecha/mecha/contrib/nesting.py | 210 ++++++++++++++++++ .../examples__build_basic_nesting__0.pack.md | 70 ++++++ .../examples__build_kitchen_sink__0.pack.md | 31 +++ 7 files changed, 381 insertions(+) create mode 100644 packages/mecha/examples/basic_nesting/beet.yml create mode 100644 packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction create mode 100644 packages/mecha/mecha/contrib/nesting.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md diff --git a/packages/mecha/examples/basic_nesting/beet.yml b/packages/mecha/examples/basic_nesting/beet.yml new file mode 100644 index 000000000..ecdb0c022 --- /dev/null +++ b/packages/mecha/examples/basic_nesting/beet.yml @@ -0,0 +1,9 @@ +require: + - mecha.contrib.nesting +data_pack: + load: [src] +pipeline: + - mecha +meta: + mecha: + multiline: true diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..1e3dd485a --- /dev/null +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,39 @@ +function demo:thing1 + say hello + say world + + function demo:thing2 + say this is a test + + function + demo:thing3 + say this + is + a + test + +execute as @a at @s run function demo:thing4 + setblock ~ ~ ~ stone_pressure_plate + setblock ~ ~-1 ~ tnt + setblock ~ ~-2 ~ stone + + +execute as @a at @s run + function demo:thing5 + setblock ~ ~ ~ stone_pressure_plate + setblock ~ ~-1 ~ tnt + setblock ~ ~-2 ~ stone + +execute as @a at @s + setblock ~ ~ ~ stone_pressure_plate + + # Some comment + setblock ~ ~-1 ~ tnt + setblock ~ ~-2 ~ stone + +execute + as @a + at @s + setblock ~ ~ ~ stone_pressure_plate + setblock ~ ~-1 ~ tnt + setblock ~ ~-2 ~ stone diff --git a/packages/mecha/examples/kitchen_sink/beet.yml b/packages/mecha/examples/kitchen_sink/beet.yml index 4b55202f5..043c9339b 100644 --- a/packages/mecha/examples/kitchen_sink/beet.yml +++ b/packages/mecha/examples/kitchen_sink/beet.yml @@ -1,5 +1,7 @@ require: + - mecha.contrib.relative_location - mecha.contrib.implicit_execute + - mecha.contrib.nesting data_pack: load: [src] pipeline: diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction new file mode 100644 index 000000000..f2e9f506f --- /dev/null +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction @@ -0,0 +1,20 @@ +as @a at @s + say hello + say world + +as @a at @s + if score @s tmp matches 1 + say hello + say world + +function ./nesting/foo + say + this + is + a + test + + +if data storage imp:temp iter.words.remaining[] function ./nesting/loop + say wow + if data storage imp:temp iter.words.remaining[] function ./nesting/loop diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py new file mode 100644 index 000000000..5ae8c0254 --- /dev/null +++ b/packages/mecha/mecha/contrib/nesting.py @@ -0,0 +1,210 @@ +"""Plugin for handling nested commands.""" + + +__all__ = [ + "AstNestedExecute", + "NestedExecuteParser", + "NestedCommandsTransformer", + "parse_nested_root", +] + + +from dataclasses import dataclass, replace +from typing import Any, List, Set, cast + +from beet import Context, ErrorMessage, Function +from beet.core.utils import required_field +from tokenstream import TokenStream, set_location + +from mecha import ( + AstChildren, + AstCommand, + AstNode, + AstResourceLocation, + AstRoot, + CompilationDatabase, + Diagnostic, + Mecha, + MutatingReducer, + Parser, + consume_line_continuation, + delegate, + get_stream_scope, + rule, +) + +COMMAND_TREE = { + "type": "root", + "children": { + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "minecraft:function", + "executable": True, + "children": { + "commands": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + } + }, + }, + }, +} + + +@dataclass(frozen=True) +class AstNestedExecute(AstNode): + """Ast nested execute node.""" + + root: AstRoot = required_field() + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + + if not mc.spec.multiline: + raise ErrorMessage(f"Plugin {__name__!r} requires multiline mode.") + + mc.spec.add_commands(COMMAND_TREE) + + mc.spec.parsers["nested_root"] = parse_nested_root + mc.spec.parsers["command:argument:mecha:nested_root"] = delegate("nested_root") + + if execute := mc.spec.tree.get("execute"): + clauses = { + literal + for literal, tree in execute.get_all_literals() + if tree.redirect is None + } + + mc.spec.parsers["command"] = NestedExecuteParser( + parser=mc.spec.parsers["command"], + clauses=clauses, + ) + + mc.transform.extend(NestedCommandsTransformer(ctx=ctx, database=mc.database)) + + +def parse_nested_root(stream: TokenStream) -> AstRoot: + """Parse nested root.""" + with stream.intercept("indent"): + stream.expect("indent") + + level, command_level = stream.indentation[-2:] + + commands: List[AstCommand] = [] + + with stream.intercept("newline"), stream.provide( + scope=(), + line_indentation=command_level, + ): + while True: + commands.append(delegate("command", stream)) + + # The command parser consumes the trailing newline so we need to rewind + # to be able to use "consume_line_continuation()". + while (token := stream.peek()) and not token.match("newline", "eof"): + stream.index -= 1 + + with stream.provide(multiline=True, line_indentation=level): + if not consume_line_continuation(stream): + break + + node = AstRoot(commands=AstChildren(commands)) + return set_location(node, commands[0], commands[-1]) + + +@dataclass +class NestedExecuteParser: + """Parser for nested execute.""" + + parser: Parser + clauses: Set[str] + + def __call__(self, stream: TokenStream) -> Any: + scope = get_stream_scope(stream) + + if scope != ("execute",): + return self.parser(stream) + + nested = False + + with stream.checkpoint(), stream.intercept("indent"): + stream.expect("indent") + token = stream.get("literal") + nested = not token or token.value not in self.clauses + + if not nested: + return self.parser(stream) + + node = delegate("nested_root", stream) + + if len(node.commands) == 1: + subcommand = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([node.commands[0]]), + ) + return set_location(subcommand, node) + else: + return set_location(AstNestedExecute(root=node), node) + + +@dataclass +class NestedCommandsTransformer(MutatingReducer): + """Transformer that handles nested commands.""" + + ctx: Context = required_field() + database: CompilationDatabase = required_field() + + def emit_function(self, path: str, root: AstRoot): + """Helper method for emitting nested commands into a separate function.""" + function = Function() + self.ctx.data[path] = function + self.database[function] = replace( + self.database[self.database.current], + ast=root, + resource_location=path, + ) + self.database.enqueue(function, self.database.step + 1) + + @rule(AstCommand, identifier="function:name:commands") + def nested_function(self, node: AstCommand): + name, root = node.arguments + + if isinstance(name, AstResourceLocation) and isinstance(root, AstRoot): + path = name.get_canonical_value() + + if path in self.ctx.data.functions: + d = Diagnostic("error", f"Function {path!r} already exists.") + raise set_location(d, name) + + self.emit_function(path, root) + + return replace(node, identifier="function:name", arguments=AstChildren([name])) + + @rule(AstNestedExecute) + def nested_execute(self, node: AstNestedExecute): + generate = self.ctx.generate["nested_execute"] + + if path := self.database[self.database.current].resource_location: + path = generate.format(path + "/nested_execute_{incr}") + else: + path = generate.path() + + self.emit_function(path, node.root) + + resource_location = AstResourceLocation.from_value(path) + + function_call = AstCommand( + identifier="function:name", + arguments=AstChildren([cast(AstNode, resource_location)]), + ) + return AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([cast(AstNode, function_call)]), + ) diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md new file mode 100644 index 000000000..fb37119f6 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -0,0 +1,70 @@ +# Lectern snapshot + +## Data pack +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 7, + "description": "" + } +} +``` + +### demo +`@function demo:foo` + +```mcfunction +function demo:thing1 +execute as @a at @s run function demo:thing4 +execute as @a at @s run function demo:thing5 +execute as @a at @s run function demo:foo/nested_execute_0 +execute as @a at @s run function demo:foo/nested_execute_1 +``` +`@function demo:thing2` + +```mcfunction +say this is a test +``` +`@function demo:thing3` + +```mcfunction +say this is a test +``` +`@function demo:thing1` + +```mcfunction +say hello +say world +function demo:thing2 +function demo:thing3 +``` +`@function demo:thing4` + +```mcfunction +setblock ~ ~ ~ stone_pressure_plate +setblock ~ ~-1 ~ tnt +setblock ~ ~-2 ~ stone +``` +`@function demo:thing5` + +```mcfunction +setblock ~ ~ ~ stone_pressure_plate +setblock ~ ~-1 ~ tnt +setblock ~ ~-2 ~ stone +``` +`@function demo:foo/nested_execute_0` + +```mcfunction +setblock ~ ~ ~ stone_pressure_plate +setblock ~ ~-1 ~ tnt +setblock ~ ~-2 ~ stone +``` +`@function demo:foo/nested_execute_1` + +```mcfunction +setblock ~ ~ ~ stone_pressure_plate +setblock ~ ~-1 ~ tnt +setblock ~ ~-2 ~ stone +``` diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 0d53dcc11..76db633f5 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -19,3 +19,34 @@ execute as @a at @s align xyz run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} execute if score @s obj matches 2 run say hi ``` +`@function demo:nesting` + +```mcfunction +execute as @a at @s run function demo:nesting/nested_execute_0 +execute as @a at @s if score @s tmp matches 1 run function demo:nesting/nested_execute_1 +function demo:nesting/foo +execute if data storage imp:temp iter.words.remaining[] run function demo:nesting/loop +``` +`@function demo:nesting/nested_execute_0` + +```mcfunction +say hello +say world +``` +`@function demo:nesting/nested_execute_1` + +```mcfunction +say hello +say world +``` +`@function demo:nesting/foo` + +```mcfunction +say this is a test +``` +`@function demo:nesting/loop` + +```mcfunction +say wow +execute if data storage imp:temp iter.words.remaining[] run function demo:nesting/loop +``` From b30e61b20d743f2c3aa41fadfa2bb0974f56d245 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 18 Nov 2021 07:24:32 +0000 Subject: [PATCH 0460/1554] 0.12.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 9 +++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 8e712f6f9..acbae97e8 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,15 @@ +## v0.12.0 (2021-11-18) +### Feature +* Add mecha.contrib.nesting ([`94594da`](https://github.com/mcbeet/mecha/commit/94594da2f5602ff6048768464137c8da89e00e27)) +* Add cli command for dumping mecha ast ([`f0cb044`](https://github.com/mcbeet/mecha/commit/f0cb044a40594225aea49a566387b6f0d67b8391)) + +### Fix +* Keep track of the current step in the database ([`c5a7737`](https://github.com/mcbeet/mecha/commit/c5a77374d4439e362cd480a1fe29e3bfb18f8ef3)) +* Make it possible to create resource location nodes from strings ([`6644606`](https://github.com/mcbeet/mecha/commit/6644606269e4b4674e363bbb3bc3c108c6642fbf)) + ## v0.11.1 (2021-11-16) ### Fix * Handle possible conflicts between execute shorthands and commands ([`c10f8cb`](https://github.com/mcbeet/mecha/commit/c10f8cbed99a7a4357d3d7f7b184d19e366a89eb)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 9b9d78724..74f590f6b 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.11.1" +__version__ = "0.12.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 22b12f3d9..2c4a686fd 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.11.1" +version = "0.12.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 93381644d655cc579bda90259ef264542df4f209 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 18 Nov 2021 17:43:58 +0100 Subject: [PATCH 0461/1554] fix: remove error message and automatically activate multiline when using nesting --- packages/mecha/examples/basic_nesting/beet.yml | 3 --- packages/mecha/mecha/contrib/nesting.py | 6 ++---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/mecha/examples/basic_nesting/beet.yml b/packages/mecha/examples/basic_nesting/beet.yml index ecdb0c022..a22acfa43 100644 --- a/packages/mecha/examples/basic_nesting/beet.yml +++ b/packages/mecha/examples/basic_nesting/beet.yml @@ -4,6 +4,3 @@ data_pack: load: [src] pipeline: - mecha -meta: - mecha: - multiline: true diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 5ae8c0254..93d4af6fb 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -12,7 +12,7 @@ from dataclasses import dataclass, replace from typing import Any, List, Set, cast -from beet import Context, ErrorMessage, Function +from beet import Context, Function from beet.core.utils import required_field from tokenstream import TokenStream, set_location @@ -67,9 +67,7 @@ class AstNestedExecute(AstNode): def beet_default(ctx: Context): mc = ctx.inject(Mecha) - if not mc.spec.multiline: - raise ErrorMessage(f"Plugin {__name__!r} requires multiline mode.") - + mc.spec.multiline = True mc.spec.add_commands(COMMAND_TREE) mc.spec.parsers["nested_root"] = parse_nested_root From 39e53060fe9f2c42aabfffc93fdb818af0a81042 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 18 Nov 2021 16:44:50 +0000 Subject: [PATCH 0462/1554] 0.12.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index acbae97e8..f3fb3f39d 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.12.1 (2021-11-18) +### Fix +* Remove error message and automatically activate multiline when using nesting ([`8594bf0`](https://github.com/mcbeet/mecha/commit/8594bf02a306a6622c25d3fd584c299b0d08fe17)) + ## v0.12.0 (2021-11-18) ### Feature * Add mecha.contrib.nesting ([`94594da`](https://github.com/mcbeet/mecha/commit/94594da2f5602ff6048768464137c8da89e00e27)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 74f590f6b..f544edb1c 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.0" +__version__ = "0.12.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2c4a686fd..61a844504 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.12.0" +version = "0.12.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3d6e10901c3ecb9ff668135a3adf266fbc5fab28 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 00:10:05 +0100 Subject: [PATCH 0463/1554] fix: quick fix for messages spanning over multiple lines accidentally --- packages/mecha/mecha/contrib/messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/contrib/messages.py b/packages/mecha/mecha/contrib/messages.py index 82e6919f1..40172d688 100644 --- a/packages/mecha/mecha/contrib/messages.py +++ b/packages/mecha/mecha/contrib/messages.py @@ -62,7 +62,7 @@ def __call__(self, stream: TokenStream) -> Any: if not token: return self.component_parser(stream) - with stream.syntax(path=r"\w+(?:\[\d+\]|\.\w+)*"): + with stream.syntax(path=r"\w+(?:\[\d+\]|\.\w+)*"), stream.intercept("newline"): name = delegate("resource_location", stream) path = stream.get("path") From 55e75a2a713b4af7f52b87cee6fa5d73589c9bd3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 18 Nov 2021 23:10:56 +0000 Subject: [PATCH 0464/1554] 0.12.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f3fb3f39d..8d630bd9d 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.12.2 (2021-11-18) +### Fix +* Quick fix for messages spanning over multiple lines accidentally ([`d065c8b`](https://github.com/mcbeet/mecha/commit/d065c8b42bf6ac22ae76735d3095eff7ec76b6a9)) + ## v0.12.1 (2021-11-18) ### Fix * Remove error message and automatically activate multiline when using nesting ([`8594bf0`](https://github.com/mcbeet/mecha/commit/8594bf02a306a6622c25d3fd584c299b0d08fe17)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index f544edb1c..2e571f5bf 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.1" +__version__ = "0.12.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 61a844504..34afe1478 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.12.1" +version = "0.12.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 16f059a4ffa4d6363290cc69644be40da3c40aa2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 02:00:12 +0100 Subject: [PATCH 0465/1554] fix: refactor multiline argument handling and make block and item parsers more modular --- packages/mecha/mecha/contrib/messages.py | 2 +- packages/mecha/mecha/parse.py | 145 +++-- .../multiline_command_examples.mcfunction | 4 +- .../parse__multiline_command_examples__0.txt | 552 +++++++++--------- .../parse__multiline_command_examples__1.txt | 2 +- 5 files changed, 365 insertions(+), 340 deletions(-) diff --git a/packages/mecha/mecha/contrib/messages.py b/packages/mecha/mecha/contrib/messages.py index 40172d688..82e6919f1 100644 --- a/packages/mecha/mecha/contrib/messages.py +++ b/packages/mecha/mecha/contrib/messages.py @@ -62,7 +62,7 @@ def __call__(self, stream: TokenStream) -> Any: if not token: return self.component_parser(stream) - with stream.syntax(path=r"\w+(?:\[\d+\]|\.\w+)*"), stream.intercept("newline"): + with stream.syntax(path=r"\w+(?:\[\d+\]|\.\w+)*"): name = delegate("resource_location", stream) path = stream.get("path") diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index c38f35d17..84aeed15a 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -12,6 +12,7 @@ "parse_root", "parse_command", "parse_argument", + "MultilineParser", "parse_bool", "NumericParser", "CoordinateParser", @@ -29,6 +30,7 @@ "ResourceLocationParser", "NoTagConstraint", "BlockParser", + "parse_block_states", "ItemParser", "NoBlockStatesConstraint", "NoDataTagsConstraint", @@ -164,13 +166,13 @@ def get_default_parsers() -> Dict[str, Parser]: "word": StringParser(type="word"), "phrase": StringParser(type="phrase"), "greedy": StringParser(type="greedy"), - "json": JsonParser(), + "json": MultilineParser(JsonParser()), "json_object": TypeConstraint( parser=delegate("json"), type=AstJsonObject, message="Expected json object.", ), - "nbt": NbtParser(), + "nbt": MultilineParser(NbtParser()), "nbt_compound": TypeConstraint( parser=delegate("nbt"), type=AstNbtCompound, @@ -190,6 +192,26 @@ def get_default_parsers() -> Dict[str, Parser]: "player_name": CommentDisambiguation(delegate("literal")), "swizzle": parse_swizzle, "team": LiteralParser("team", r"[a-zA-Z0-9_.+-]+"), + "block_predicate": BlockParser( + resource_location_parser=delegate("resource_location_or_tag"), + block_states_parser=AdjacentConstraint( + parser=MultilineParser(parse_block_states), + hint=r"\[", + ), + ), + "block_state": BlockParser( + resource_location_parser=delegate("resource_location"), + block_states_parser=AdjacentConstraint( + parser=MultilineParser(parse_block_states), + hint=r"\[", + ), + ), + "item_predicate": ItemParser( + resource_location_parser=delegate("resource_location_or_tag"), + ), + "item_stack": ItemParser( + resource_location_parser=delegate("resource_location"), + ), ################################################################################ # Particle ################################################################################ @@ -217,27 +239,15 @@ def get_default_parsers() -> Dict[str, Parser]: ), "particle:minecraft:block": AggregateParser( type=AstBlockParticleParameters, - fields={ - "block": BlockParser( - resource_location_parser=delegate("resource_location"), - ) - }, + fields={"block": delegate("block_state")}, ), "particle:minecraft:falling_dust": AggregateParser( type=AstFallingDustParticleParameters, - fields={ - "block": BlockParser( - resource_location_parser=delegate("resource_location"), - ) - }, + fields={"block": delegate("block_state")}, ), "particle:minecraft:item": AggregateParser( type=AstItemParticleParameters, - fields={ - "item": ItemParser( - resource_location_parser=delegate("resource_location"), - ) - }, + fields={"item": delegate("item_stack")}, ), "particle:minecraft:vibration": AggregateParser( type=AstVibrationParticleParameters, @@ -254,7 +264,7 @@ def get_default_parsers() -> Dict[str, Parser]: ################################################################################ # Selector ################################################################################ - "selector": SelectorParser(), + "selector": MultilineParser(SelectorParser()), "selector:argument": SelectorArgumentInvertConstraint( SelectorArgumentNoValueConstraint( SelectorArgumentParser(), @@ -324,12 +334,8 @@ def get_default_parsers() -> Dict[str, Parser]: disallow=["local"], ), "command:argument:minecraft:block_pos": Vector3Parser(delegate("coordinate")), - "command:argument:minecraft:block_predicate": BlockParser( - resource_location_parser=delegate("resource_location_or_tag"), - ), - "command:argument:minecraft:block_state": BlockParser( - resource_location_parser=delegate("resource_location"), - ), + "command:argument:minecraft:block_predicate": delegate("block_predicate"), + "command:argument:minecraft:block_state": delegate("block_state"), "command:argument:minecraft:color": LiteralConstraint( parser=delegate("word"), values=[ @@ -377,13 +383,9 @@ def get_default_parsers() -> Dict[str, Parser]: ), "command:argument:minecraft:int_range": delegate("integer_range"), "command:argument:minecraft:item_enchantment": delegate("word"), - "command:argument:minecraft:item_predicate": ItemParser( - resource_location_parser=delegate("resource_location_or_tag"), - ), + "command:argument:minecraft:item_predicate": delegate("item_predicate"), "command:argument:minecraft:item_slot": delegate("word"), - "command:argument:minecraft:item_stack": ItemParser( - resource_location_parser=delegate("resource_location"), - ), + "command:argument:minecraft:item_stack": delegate("item_stack"), "command:argument:minecraft:message": parse_message, "command:argument:minecraft:mob_effect": delegate("resource_location"), "command:argument:minecraft:nbt_compound_tag": delegate("nbt_compound"), @@ -636,18 +638,33 @@ def parse_argument(stream: TokenStream) -> AstNode: """Parse argument.""" spec = get_stream_spec(stream) scope = get_stream_scope(stream) - multiline = get_stream_multiline(stream) tree = spec.tree.get(scope) if tree and tree.parser: with stream.provide(properties=tree.properties or {}): - with stream.ignore("newline") if multiline else nullcontext(): - return delegate(f"command:argument:{tree.parser}", stream) + return delegate(f"command:argument:{tree.parser}", stream) raise ValueError(f"Missing argument parser in command tree {scope}.") +@dataclass +class MultilineParser: + """Allow a parser to span over multiple lines.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.checkpoint(), stream.intercept("newline"): + newline = stream.get("newline") + + if not newline and get_stream_multiline(stream): + with stream.ignore("newline"): + return self.parser(stream) + + return self.parser(stream) + + def parse_bool(stream: TokenStream) -> AstBool: """Parse bool.""" with stream.syntax(literal=r"\w+"): @@ -1138,6 +1155,9 @@ class CommentDisambiguation: parser: Parser def __call__(self, stream: TokenStream) -> Any: + with stream.intercept("comment"): + consume_line_continuation(stream) + with stream.checkpoint() as commit: last_comment = None @@ -1165,49 +1185,56 @@ class BlockParser: """Parser for minecraft blocks.""" resource_location_parser: Parser + block_states_parser: Parser def __call__(self, stream: TokenStream) -> AstBlock: identifier = self.resource_location_parser(stream) + location = identifier.location end_location = identifier.end_location - with stream.syntax( - bracket=r"\[|\]", - equal=r"=", - comma=r",", - ), stream.checkpoint() as commit: - block_states: List[AstBlockState] = [] - - with stream.intercept("whitespace"): - stream.expect(("bracket", "[")) - - commit() - - for _ in stream.peek_until(("bracket", "]")): - key_node = delegate("phrase", stream) - stream.expect("equal") - value_node = delegate("phrase", stream) - - entry_node = AstBlockState(key=key_node, value=value_node) - entry_node = set_location(entry_node, key_node, value_node) - block_states.append(entry_node) - - if not stream.get("comma"): - stream.expect(("bracket", "]")) - break - + if block_states := self.block_states_parser(stream): end_location = stream.current.end_location + else: + block_states = AstChildren() data_tags = delegate("adjacent_nbt_compound", stream) node = AstBlock( identifier=identifier, - block_states=AstChildren(block_states), + block_states=block_states, data_tags=data_tags, ) return set_location(node, location, data_tags if data_tags else end_location) +def parse_block_states(stream: TokenStream) -> AstChildren[AstBlockState]: + """Parser for minecraft block state.""" + block_states: List[AstBlockState] = [] + + with stream.syntax( + bracket=r"\[|\]", + equal=r"=", + comma=r",", + ): + stream.expect(("bracket", "[")) + + for _ in stream.peek_until(("bracket", "]")): + key_node = delegate("phrase", stream) + stream.expect("equal") + value_node = delegate("phrase", stream) + + entry_node = AstBlockState(key=key_node, value=value_node) + entry_node = set_location(entry_node, key_node, value_node) + block_states.append(entry_node) + + if not stream.get("comma"): + stream.expect(("bracket", "]")) + break + + return AstChildren(block_states) + + @dataclass class ItemParser: """Parser for minecraft items.""" diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index 3b8cbdc5c..ab9d6f216 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -23,9 +23,7 @@ execute if block 0 0 0 execute if block 0 0 0 wool #this is a comment execute if block - ~ - ^ - -0 + ~ 1 -0 #wool tellraw @s { diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 6d8002a1d..8bd2dbcf2 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1948, lineno=110, colno=1) + end_location: SourceLocation(pos=1928, lineno=108, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -355,17 +355,17 @@ data_tags: None location: SourceLocation(pos=488, lineno=25, colno=1) - end_location: SourceLocation(pos=549, lineno=29, colno=14) + end_location: SourceLocation(pos=529, lineno=27, colno=14) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=496, lineno=25, colno=9) - end_location: SourceLocation(pos=549, lineno=29, colno=14) + end_location: SourceLocation(pos=529, lineno=27, colno=14) identifier: 'execute:if:block:pos:block' arguments: location: SourceLocation(pos=509, lineno=26, colno=5) - end_location: SourceLocation(pos=535, lineno=28, colno=15) + end_location: SourceLocation(pos=515, lineno=26, colno=11) x: location: SourceLocation(pos=509, lineno=26, colno=5) @@ -374,23 +374,23 @@ value: 0 y: - location: SourceLocation(pos=519, lineno=27, colno=9) - end_location: SourceLocation(pos=520, lineno=27, colno=10) - type: 'local' - value: 0 + location: SourceLocation(pos=511, lineno=26, colno=7) + end_location: SourceLocation(pos=512, lineno=26, colno=8) + type: 'absolute' + value: 1 z: - location: SourceLocation(pos=533, lineno=28, colno=13) - end_location: SourceLocation(pos=535, lineno=28, colno=15) + location: SourceLocation(pos=513, lineno=26, colno=9) + end_location: SourceLocation(pos=515, lineno=26, colno=11) type: 'absolute' value: 0 - location: SourceLocation(pos=544, lineno=29, colno=9) - end_location: SourceLocation(pos=549, lineno=29, colno=14) + location: SourceLocation(pos=524, lineno=27, colno=9) + end_location: SourceLocation(pos=529, lineno=27, colno=14) identifier: - location: SourceLocation(pos=544, lineno=29, colno=9) - end_location: SourceLocation(pos=549, lineno=29, colno=14) + location: SourceLocation(pos=524, lineno=27, colno=9) + end_location: SourceLocation(pos=529, lineno=27, colno=14) is_tag: True namespace: None path: 'wool' @@ -398,132 +398,132 @@ data_tags: None - location: SourceLocation(pos=551, lineno=31, colno=1) - end_location: SourceLocation(pos=670, lineno=37, colno=2) + location: SourceLocation(pos=531, lineno=29, colno=1) + end_location: SourceLocation(pos=650, lineno=35, colno=2) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=559, lineno=31, colno=9) - end_location: SourceLocation(pos=561, lineno=31, colno=11) + location: SourceLocation(pos=539, lineno=29, colno=9) + end_location: SourceLocation(pos=541, lineno=29, colno=11) variable: 's' arguments: - location: SourceLocation(pos=562, lineno=31, colno=12) - end_location: SourceLocation(pos=670, lineno=37, colno=2) + location: SourceLocation(pos=542, lineno=29, colno=12) + end_location: SourceLocation(pos=650, lineno=35, colno=2) entries: - location: SourceLocation(pos=568, lineno=32, colno=5) - end_location: SourceLocation(pos=587, lineno=32, colno=24) + location: SourceLocation(pos=548, lineno=30, colno=5) + end_location: SourceLocation(pos=567, lineno=30, colno=24) key: - location: SourceLocation(pos=568, lineno=32, colno=5) - end_location: SourceLocation(pos=574, lineno=32, colno=11) + location: SourceLocation(pos=548, lineno=30, colno=5) + end_location: SourceLocation(pos=554, lineno=30, colno=11) value: 'text' value: - location: SourceLocation(pos=576, lineno=32, colno=13) - end_location: SourceLocation(pos=587, lineno=32, colno=24) + location: SourceLocation(pos=556, lineno=30, colno=13) + end_location: SourceLocation(pos=567, lineno=30, colno=24) value: 'Hover me!' - location: SourceLocation(pos=593, lineno=33, colno=5) - end_location: SourceLocation(pos=668, lineno=36, colno=6) + location: SourceLocation(pos=573, lineno=31, colno=5) + end_location: SourceLocation(pos=648, lineno=34, colno=6) key: - location: SourceLocation(pos=593, lineno=33, colno=5) - end_location: SourceLocation(pos=605, lineno=33, colno=17) + location: SourceLocation(pos=573, lineno=31, colno=5) + end_location: SourceLocation(pos=585, lineno=31, colno=17) value: 'hoverEvent' value: - location: SourceLocation(pos=607, lineno=33, colno=19) - end_location: SourceLocation(pos=668, lineno=36, colno=6) + location: SourceLocation(pos=587, lineno=31, colno=19) + end_location: SourceLocation(pos=648, lineno=34, colno=6) entries: - location: SourceLocation(pos=617, lineno=34, colno=9) - end_location: SourceLocation(pos=638, lineno=34, colno=30) + location: SourceLocation(pos=597, lineno=32, colno=9) + end_location: SourceLocation(pos=618, lineno=32, colno=30) key: - location: SourceLocation(pos=617, lineno=34, colno=9) - end_location: SourceLocation(pos=625, lineno=34, colno=17) + location: SourceLocation(pos=597, lineno=32, colno=9) + end_location: SourceLocation(pos=605, lineno=32, colno=17) value: 'action' value: - location: SourceLocation(pos=627, lineno=34, colno=19) - end_location: SourceLocation(pos=638, lineno=34, colno=30) + location: SourceLocation(pos=607, lineno=32, colno=19) + end_location: SourceLocation(pos=618, lineno=32, colno=30) value: 'show_text' - location: SourceLocation(pos=648, lineno=35, colno=9) - end_location: SourceLocation(pos=662, lineno=35, colno=23) + location: SourceLocation(pos=628, lineno=33, colno=9) + end_location: SourceLocation(pos=642, lineno=33, colno=23) key: - location: SourceLocation(pos=648, lineno=35, colno=9) - end_location: SourceLocation(pos=655, lineno=35, colno=16) + location: SourceLocation(pos=628, lineno=33, colno=9) + end_location: SourceLocation(pos=635, lineno=33, colno=16) value: 'value' value: - location: SourceLocation(pos=657, lineno=35, colno=18) - end_location: SourceLocation(pos=662, lineno=35, colno=23) + location: SourceLocation(pos=637, lineno=33, colno=18) + end_location: SourceLocation(pos=642, lineno=33, colno=23) value: 'Hi!' - location: SourceLocation(pos=672, lineno=39, colno=1) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=652, lineno=37, colno=1) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=717, lineno=41, colno=5) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=697, lineno=39, colno=5) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=720, lineno=41, colno=8) - end_location: SourceLocation(pos=722, lineno=41, colno=10) + location: SourceLocation(pos=700, lineno=39, colno=8) + end_location: SourceLocation(pos=702, lineno=39, colno=10) variable: 'a' arguments: - location: SourceLocation(pos=727, lineno=42, colno=5) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=707, lineno=40, colno=5) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=730, lineno=42, colno=8) - end_location: SourceLocation(pos=732, lineno=42, colno=10) + location: SourceLocation(pos=710, lineno=40, colno=8) + end_location: SourceLocation(pos=712, lineno=40, colno=10) variable: 's' arguments: - location: SourceLocation(pos=737, lineno=43, colno=5) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=717, lineno=41, colno=5) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: 'execute:if:block:pos:block:subcommand' arguments: - location: SourceLocation(pos=746, lineno=43, colno=14) - end_location: SourceLocation(pos=753, lineno=43, colno=21) + location: SourceLocation(pos=726, lineno=41, colno=14) + end_location: SourceLocation(pos=733, lineno=41, colno=21) x: - location: SourceLocation(pos=746, lineno=43, colno=14) - end_location: SourceLocation(pos=747, lineno=43, colno=15) + location: SourceLocation(pos=726, lineno=41, colno=14) + end_location: SourceLocation(pos=727, lineno=41, colno=15) type: 'relative' value: 0 y: - location: SourceLocation(pos=748, lineno=43, colno=16) - end_location: SourceLocation(pos=751, lineno=43, colno=19) + location: SourceLocation(pos=728, lineno=41, colno=16) + end_location: SourceLocation(pos=731, lineno=41, colno=19) type: 'relative' value: -1 z: - location: SourceLocation(pos=752, lineno=43, colno=20) - end_location: SourceLocation(pos=753, lineno=43, colno=21) + location: SourceLocation(pos=732, lineno=41, colno=20) + end_location: SourceLocation(pos=733, lineno=41, colno=21) type: 'relative' value: 0 - location: SourceLocation(pos=754, lineno=43, colno=22) - end_location: SourceLocation(pos=759, lineno=43, colno=27) + location: SourceLocation(pos=734, lineno=41, colno=22) + end_location: SourceLocation(pos=739, lineno=41, colno=27) identifier: - location: SourceLocation(pos=754, lineno=43, colno=22) - end_location: SourceLocation(pos=759, lineno=43, colno=27) + location: SourceLocation(pos=734, lineno=41, colno=22) + end_location: SourceLocation(pos=739, lineno=41, colno=27) is_tag: True namespace: None path: 'wool' @@ -531,117 +531,117 @@ data_tags: None - location: SourceLocation(pos=798, lineno=46, colno=5) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=778, lineno=44, colno=5) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=802, lineno=46, colno=9) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=782, lineno=44, colno=9) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: 'give:targets:item' arguments: - location: SourceLocation(pos=807, lineno=46, colno=14) - end_location: SourceLocation(pos=809, lineno=46, colno=16) + location: SourceLocation(pos=787, lineno=44, colno=14) + end_location: SourceLocation(pos=789, lineno=44, colno=16) variable: 's' arguments: - location: SourceLocation(pos=810, lineno=46, colno=17) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=790, lineno=44, colno=17) + end_location: SourceLocation(pos=975, lineno=51, colno=6) identifier: - location: SourceLocation(pos=810, lineno=46, colno=17) - end_location: SourceLocation(pos=815, lineno=46, colno=22) + location: SourceLocation(pos=790, lineno=44, colno=17) + end_location: SourceLocation(pos=795, lineno=44, colno=22) is_tag: False namespace: None path: 'stone' data_tags: - location: SourceLocation(pos=815, lineno=46, colno=22) - end_location: SourceLocation(pos=995, lineno=53, colno=6) + location: SourceLocation(pos=795, lineno=44, colno=22) + end_location: SourceLocation(pos=975, lineno=51, colno=6) entries: - location: SourceLocation(pos=825, lineno=47, colno=9) - end_location: SourceLocation(pos=989, lineno=52, colno=10) + location: SourceLocation(pos=805, lineno=45, colno=9) + end_location: SourceLocation(pos=969, lineno=50, colno=10) key: - location: SourceLocation(pos=825, lineno=47, colno=9) - end_location: SourceLocation(pos=832, lineno=47, colno=16) + location: SourceLocation(pos=805, lineno=45, colno=9) + end_location: SourceLocation(pos=812, lineno=45, colno=16) value: 'display' value: - location: SourceLocation(pos=834, lineno=47, colno=18) - end_location: SourceLocation(pos=989, lineno=52, colno=10) + location: SourceLocation(pos=814, lineno=45, colno=18) + end_location: SourceLocation(pos=969, lineno=50, colno=10) entries: - location: SourceLocation(pos=848, lineno=48, colno=13) - end_location: SourceLocation(pos=889, lineno=48, colno=54) + location: SourceLocation(pos=828, lineno=46, colno=13) + end_location: SourceLocation(pos=869, lineno=46, colno=54) key: - location: SourceLocation(pos=848, lineno=48, colno=13) - end_location: SourceLocation(pos=852, lineno=48, colno=17) + location: SourceLocation(pos=828, lineno=46, colno=13) + end_location: SourceLocation(pos=832, lineno=46, colno=17) value: 'Name' value: - location: SourceLocation(pos=854, lineno=48, colno=19) - end_location: SourceLocation(pos=889, lineno=48, colno=54) + location: SourceLocation(pos=834, lineno=46, colno=19) + end_location: SourceLocation(pos=869, lineno=46, colno=54) value: String('[{"text": "Hello", "bold": true}]') - location: SourceLocation(pos=903, lineno=49, colno=13) - end_location: SourceLocation(pos=979, lineno=51, colno=14) + location: SourceLocation(pos=883, lineno=47, colno=13) + end_location: SourceLocation(pos=959, lineno=49, colno=14) key: - location: SourceLocation(pos=903, lineno=49, colno=13) - end_location: SourceLocation(pos=907, lineno=49, colno=17) + location: SourceLocation(pos=883, lineno=47, colno=13) + end_location: SourceLocation(pos=887, lineno=47, colno=17) value: 'Lore' value: - location: SourceLocation(pos=909, lineno=49, colno=19) - end_location: SourceLocation(pos=979, lineno=51, colno=14) + location: SourceLocation(pos=889, lineno=47, colno=19) + end_location: SourceLocation(pos=959, lineno=49, colno=14) elements: - location: SourceLocation(pos=927, lineno=50, colno=17) - end_location: SourceLocation(pos=964, lineno=50, colno=54) + location: SourceLocation(pos=907, lineno=48, colno=17) + end_location: SourceLocation(pos=944, lineno=48, colno=54) value: String('[{ "text": "Something else here" }]') - location: SourceLocation(pos=997, lineno=55, colno=1) - end_location: SourceLocation(pos=1107, lineno=57, colno=26) + location: SourceLocation(pos=977, lineno=53, colno=1) + end_location: SourceLocation(pos=1087, lineno=55, colno=26) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1009, lineno=56, colno=5) - end_location: SourceLocation(pos=1107, lineno=57, colno=26) + location: SourceLocation(pos=989, lineno=54, colno=5) + end_location: SourceLocation(pos=1087, lineno=55, colno=26) identifier: 'execute:if:block:pos:block:subcommand' arguments: - location: SourceLocation(pos=1018, lineno=56, colno=14) - end_location: SourceLocation(pos=1023, lineno=56, colno=19) + location: SourceLocation(pos=998, lineno=54, colno=14) + end_location: SourceLocation(pos=1003, lineno=54, colno=19) x: - location: SourceLocation(pos=1018, lineno=56, colno=14) - end_location: SourceLocation(pos=1019, lineno=56, colno=15) + location: SourceLocation(pos=998, lineno=54, colno=14) + end_location: SourceLocation(pos=999, lineno=54, colno=15) type: 'relative' value: 0 y: - location: SourceLocation(pos=1020, lineno=56, colno=16) - end_location: SourceLocation(pos=1021, lineno=56, colno=17) + location: SourceLocation(pos=1000, lineno=54, colno=16) + end_location: SourceLocation(pos=1001, lineno=54, colno=17) type: 'relative' value: 0 z: - location: SourceLocation(pos=1022, lineno=56, colno=18) - end_location: SourceLocation(pos=1023, lineno=56, colno=19) + location: SourceLocation(pos=1002, lineno=54, colno=18) + end_location: SourceLocation(pos=1003, lineno=54, colno=19) type: 'relative' value: 0 - location: SourceLocation(pos=1024, lineno=56, colno=20) - end_location: SourceLocation(pos=1038, lineno=56, colno=34) + location: SourceLocation(pos=1004, lineno=54, colno=20) + end_location: SourceLocation(pos=1018, lineno=54, colno=34) identifier: - location: SourceLocation(pos=1024, lineno=56, colno=20) - end_location: SourceLocation(pos=1038, lineno=56, colno=34) + location: SourceLocation(pos=1004, lineno=54, colno=20) + end_location: SourceLocation(pos=1018, lineno=54, colno=34) is_tag: True namespace: 'namespace' path: 'tag' @@ -649,360 +649,360 @@ data_tags: None - location: SourceLocation(pos=1086, lineno=57, colno=5) - end_location: SourceLocation(pos=1107, lineno=57, colno=26) + location: SourceLocation(pos=1066, lineno=55, colno=5) + end_location: SourceLocation(pos=1087, lineno=55, colno=26) identifier: 'execute:if:entity:entities' arguments: - location: SourceLocation(pos=1096, lineno=57, colno=15) - end_location: SourceLocation(pos=1107, lineno=57, colno=26) + location: SourceLocation(pos=1076, lineno=55, colno=15) + end_location: SourceLocation(pos=1087, lineno=55, colno=26) variable: 's' arguments: - location: SourceLocation(pos=1099, lineno=57, colno=18) - end_location: SourceLocation(pos=1106, lineno=57, colno=25) + location: SourceLocation(pos=1079, lineno=55, colno=18) + end_location: SourceLocation(pos=1086, lineno=55, colno=25) inverted: False key: - location: SourceLocation(pos=1099, lineno=57, colno=18) - end_location: SourceLocation(pos=1102, lineno=57, colno=21) + location: SourceLocation(pos=1079, lineno=55, colno=18) + end_location: SourceLocation(pos=1082, lineno=55, colno=21) value: 'tag' value: - location: SourceLocation(pos=1103, lineno=57, colno=22) - end_location: SourceLocation(pos=1106, lineno=57, colno=25) + location: SourceLocation(pos=1083, lineno=55, colno=22) + end_location: SourceLocation(pos=1086, lineno=55, colno=25) value: 'foo' - location: SourceLocation(pos=1124, lineno=59, colno=1) - end_location: SourceLocation(pos=1166, lineno=61, colno=2) + location: SourceLocation(pos=1104, lineno=57, colno=1) + end_location: SourceLocation(pos=1146, lineno=59, colno=2) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=1132, lineno=59, colno=9) - end_location: SourceLocation(pos=1134, lineno=59, colno=11) + location: SourceLocation(pos=1112, lineno=57, colno=9) + end_location: SourceLocation(pos=1114, lineno=57, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=1135, lineno=59, colno=12) - end_location: SourceLocation(pos=1166, lineno=61, colno=2) + location: SourceLocation(pos=1115, lineno=57, colno=12) + end_location: SourceLocation(pos=1146, lineno=59, colno=2) entries: - location: SourceLocation(pos=1141, lineno=60, colno=5) - end_location: SourceLocation(pos=1164, lineno=60, colno=28) + location: SourceLocation(pos=1121, lineno=58, colno=5) + end_location: SourceLocation(pos=1144, lineno=58, colno=28) key: - location: SourceLocation(pos=1141, lineno=60, colno=5) - end_location: SourceLocation(pos=1147, lineno=60, colno=11) + location: SourceLocation(pos=1121, lineno=58, colno=5) + end_location: SourceLocation(pos=1127, lineno=58, colno=11) value: 'text' value: - location: SourceLocation(pos=1149, lineno=60, colno=13) - end_location: SourceLocation(pos=1164, lineno=60, colno=28) + location: SourceLocation(pos=1129, lineno=58, colno=13) + end_location: SourceLocation(pos=1144, lineno=58, colno=28) value: 'Hello # there' - location: SourceLocation(pos=1168, lineno=63, colno=1) - end_location: SourceLocation(pos=1234, lineno=66, colno=6) + location: SourceLocation(pos=1148, lineno=61, colno=1) + end_location: SourceLocation(pos=1214, lineno=64, colno=6) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=1176, lineno=63, colno=9) - end_location: SourceLocation(pos=1178, lineno=63, colno=11) + location: SourceLocation(pos=1156, lineno=61, colno=9) + end_location: SourceLocation(pos=1158, lineno=61, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=1191, lineno=64, colno=5) - end_location: SourceLocation(pos=1234, lineno=66, colno=6) + location: SourceLocation(pos=1171, lineno=62, colno=5) + end_location: SourceLocation(pos=1214, lineno=64, colno=6) entries: - location: SourceLocation(pos=1201, lineno=65, colno=9) - end_location: SourceLocation(pos=1228, lineno=65, colno=36) + location: SourceLocation(pos=1181, lineno=63, colno=9) + end_location: SourceLocation(pos=1208, lineno=63, colno=36) key: - location: SourceLocation(pos=1201, lineno=65, colno=9) - end_location: SourceLocation(pos=1207, lineno=65, colno=15) + location: SourceLocation(pos=1181, lineno=63, colno=9) + end_location: SourceLocation(pos=1187, lineno=63, colno=15) value: 'text' value: - location: SourceLocation(pos=1209, lineno=65, colno=17) - end_location: SourceLocation(pos=1228, lineno=65, colno=36) + location: SourceLocation(pos=1189, lineno=63, colno=17) + end_location: SourceLocation(pos=1208, lineno=63, colno=36) value: 'Hello" # "there' - location: SourceLocation(pos=1236, lineno=68, colno=1) - end_location: SourceLocation(pos=1254, lineno=68, colno=19) + location: SourceLocation(pos=1216, lineno=66, colno=1) + end_location: SourceLocation(pos=1234, lineno=66, colno=19) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=1244, lineno=68, colno=9) - end_location: SourceLocation(pos=1246, lineno=68, colno=11) + location: SourceLocation(pos=1224, lineno=66, colno=9) + end_location: SourceLocation(pos=1226, lineno=66, colno=11) variable: 's' arguments: - location: SourceLocation(pos=1247, lineno=68, colno=12) - end_location: SourceLocation(pos=1254, lineno=68, colno=19) + location: SourceLocation(pos=1227, lineno=66, colno=12) + end_location: SourceLocation(pos=1234, lineno=66, colno=19) elements: - location: SourceLocation(pos=1248, lineno=68, colno=13) - end_location: SourceLocation(pos=1253, lineno=68, colno=18) + location: SourceLocation(pos=1228, lineno=66, colno=13) + end_location: SourceLocation(pos=1233, lineno=66, colno=18) value: 'foo' - location: SourceLocation(pos=1265, lineno=70, colno=1) - end_location: SourceLocation(pos=1308, lineno=75, colno=9) + location: SourceLocation(pos=1245, lineno=68, colno=1) + end_location: SourceLocation(pos=1288, lineno=73, colno=9) identifier: 'say:message' arguments: - location: SourceLocation(pos=1273, lineno=71, colno=5) - end_location: SourceLocation(pos=1308, lineno=75, colno=9) + location: SourceLocation(pos=1253, lineno=69, colno=5) + end_location: SourceLocation(pos=1288, lineno=73, colno=9) fragments: - location: SourceLocation(pos=1273, lineno=71, colno=5) - end_location: SourceLocation(pos=1276, lineno=71, colno=8) + location: SourceLocation(pos=1253, lineno=69, colno=5) + end_location: SourceLocation(pos=1256, lineno=69, colno=8) value: 'foo' - location: SourceLocation(pos=1280, lineno=72, colno=4) - end_location: SourceLocation(pos=1281, lineno=72, colno=5) + location: SourceLocation(pos=1260, lineno=70, colno=4) + end_location: SourceLocation(pos=1261, lineno=70, colno=5) value: ' ' - location: SourceLocation(pos=1281, lineno=72, colno=5) - end_location: SourceLocation(pos=1284, lineno=72, colno=8) + location: SourceLocation(pos=1261, lineno=70, colno=5) + end_location: SourceLocation(pos=1264, lineno=70, colno=8) value: 'bar' - location: SourceLocation(pos=1288, lineno=73, colno=4) - end_location: SourceLocation(pos=1289, lineno=73, colno=5) + location: SourceLocation(pos=1268, lineno=71, colno=4) + end_location: SourceLocation(pos=1269, lineno=71, colno=5) value: ' ' - location: SourceLocation(pos=1289, lineno=73, colno=5) - end_location: SourceLocation(pos=1294, lineno=73, colno=10) + location: SourceLocation(pos=1269, lineno=71, colno=5) + end_location: SourceLocation(pos=1274, lineno=71, colno=10) value: 'hello' - location: SourceLocation(pos=1295, lineno=74, colno=1) - end_location: SourceLocation(pos=1296, lineno=74, colno=2) + location: SourceLocation(pos=1275, lineno=72, colno=1) + end_location: SourceLocation(pos=1276, lineno=72, colno=2) value: ' ' - location: SourceLocation(pos=1296, lineno=74, colno=2) - end_location: SourceLocation(pos=1299, lineno=74, colno=5) + location: SourceLocation(pos=1276, lineno=72, colno=2) + end_location: SourceLocation(pos=1279, lineno=72, colno=5) value: 'wat' - location: SourceLocation(pos=1303, lineno=75, colno=4) - end_location: SourceLocation(pos=1304, lineno=75, colno=5) + location: SourceLocation(pos=1283, lineno=73, colno=4) + end_location: SourceLocation(pos=1284, lineno=73, colno=5) value: ' ' - location: SourceLocation(pos=1304, lineno=75, colno=5) - end_location: SourceLocation(pos=1308, lineno=75, colno=9) + location: SourceLocation(pos=1284, lineno=73, colno=5) + end_location: SourceLocation(pos=1288, lineno=73, colno=9) value: 'welp' - location: SourceLocation(pos=1310, lineno=77, colno=1) - end_location: SourceLocation(pos=1367, lineno=81, colno=17) + location: SourceLocation(pos=1290, lineno=75, colno=1) + end_location: SourceLocation(pos=1347, lineno=79, colno=17) identifier: 'say:message' arguments: - location: SourceLocation(pos=1318, lineno=78, colno=5) - end_location: SourceLocation(pos=1367, lineno=81, colno=17) + location: SourceLocation(pos=1298, lineno=76, colno=5) + end_location: SourceLocation(pos=1347, lineno=79, colno=17) fragments: - location: SourceLocation(pos=1318, lineno=78, colno=5) - end_location: SourceLocation(pos=1322, lineno=78, colno=9) + location: SourceLocation(pos=1298, lineno=76, colno=5) + end_location: SourceLocation(pos=1302, lineno=76, colno=9) value: 'this' - location: SourceLocation(pos=1326, lineno=79, colno=4) - end_location: SourceLocation(pos=1327, lineno=79, colno=5) + location: SourceLocation(pos=1306, lineno=77, colno=4) + end_location: SourceLocation(pos=1307, lineno=77, colno=5) value: ' ' - location: SourceLocation(pos=1327, lineno=79, colno=5) - end_location: SourceLocation(pos=1331, lineno=79, colno=9) + location: SourceLocation(pos=1307, lineno=77, colno=5) + end_location: SourceLocation(pos=1311, lineno=77, colno=9) value: 'is a' - location: SourceLocation(pos=1354, lineno=81, colno=4) - end_location: SourceLocation(pos=1355, lineno=81, colno=5) + location: SourceLocation(pos=1334, lineno=79, colno=4) + end_location: SourceLocation(pos=1335, lineno=79, colno=5) value: ' ' - location: SourceLocation(pos=1355, lineno=81, colno=5) - end_location: SourceLocation(pos=1367, lineno=81, colno=17) + location: SourceLocation(pos=1335, lineno=79, colno=5) + end_location: SourceLocation(pos=1347, lineno=79, colno=17) value: 'continuation' - location: SourceLocation(pos=1369, lineno=83, colno=1) - end_location: SourceLocation(pos=1404, lineno=85, colno=7) + location: SourceLocation(pos=1349, lineno=81, colno=1) + end_location: SourceLocation(pos=1384, lineno=83, colno=7) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=1399, lineno=85, colno=2) - end_location: SourceLocation(pos=1404, lineno=85, colno=7) + location: SourceLocation(pos=1379, lineno=83, colno=2) + end_location: SourceLocation(pos=1384, lineno=83, colno=7) value: False - location: SourceLocation(pos=1406, lineno=87, colno=1) - end_location: SourceLocation(pos=1454, lineno=89, colno=18) + location: SourceLocation(pos=1386, lineno=85, colno=1) + end_location: SourceLocation(pos=1434, lineno=87, colno=18) identifier: 'gamerule:doMobLoot:value' arguments: - location: SourceLocation(pos=1449, lineno=89, colno=13) - end_location: SourceLocation(pos=1454, lineno=89, colno=18) + location: SourceLocation(pos=1429, lineno=87, colno=13) + end_location: SourceLocation(pos=1434, lineno=87, colno=18) value: False - location: SourceLocation(pos=1471, lineno=90, colno=17) - end_location: SourceLocation(pos=1545, lineno=92, colno=26) + location: SourceLocation(pos=1451, lineno=88, colno=17) + end_location: SourceLocation(pos=1525, lineno=90, colno=26) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=1540, lineno=92, colno=21) - end_location: SourceLocation(pos=1545, lineno=92, colno=26) + location: SourceLocation(pos=1520, lineno=90, colno=21) + end_location: SourceLocation(pos=1525, lineno=90, colno=26) value: False - location: SourceLocation(pos=1550, lineno=93, colno=5) - end_location: SourceLocation(pos=1631, lineno=97, colno=24) + location: SourceLocation(pos=1530, lineno=91, colno=5) + end_location: SourceLocation(pos=1611, lineno=95, colno=24) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1558, lineno=93, colno=13) - end_location: SourceLocation(pos=1631, lineno=97, colno=24) + location: SourceLocation(pos=1538, lineno=91, colno=13) + end_location: SourceLocation(pos=1611, lineno=95, colno=24) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=1561, lineno=93, colno=16) - end_location: SourceLocation(pos=1564, lineno=93, colno=19) + location: SourceLocation(pos=1541, lineno=91, colno=16) + end_location: SourceLocation(pos=1544, lineno=91, colno=19) value: 'foo' - location: SourceLocation(pos=1565, lineno=93, colno=20) - end_location: SourceLocation(pos=1631, lineno=97, colno=24) + location: SourceLocation(pos=1545, lineno=91, colno=20) + end_location: SourceLocation(pos=1611, lineno=95, colno=24) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=1577, lineno=94, colno=9) - end_location: SourceLocation(pos=1631, lineno=97, colno=24) + location: SourceLocation(pos=1557, lineno=92, colno=9) + end_location: SourceLocation(pos=1611, lineno=95, colno=24) identifier: 'gamemode:survival:target' arguments: - location: SourceLocation(pos=1620, lineno=97, colno=13) - end_location: SourceLocation(pos=1631, lineno=97, colno=24) + location: SourceLocation(pos=1600, lineno=95, colno=13) + end_location: SourceLocation(pos=1611, lineno=95, colno=24) variable: 's' arguments: - location: SourceLocation(pos=1623, lineno=97, colno=16) - end_location: SourceLocation(pos=1630, lineno=97, colno=23) + location: SourceLocation(pos=1603, lineno=95, colno=16) + end_location: SourceLocation(pos=1610, lineno=95, colno=23) inverted: False key: - location: SourceLocation(pos=1623, lineno=97, colno=16) - end_location: SourceLocation(pos=1626, lineno=97, colno=19) + location: SourceLocation(pos=1603, lineno=95, colno=16) + end_location: SourceLocation(pos=1606, lineno=95, colno=19) value: 'tag' value: - location: SourceLocation(pos=1627, lineno=97, colno=20) - end_location: SourceLocation(pos=1630, lineno=97, colno=23) + location: SourceLocation(pos=1607, lineno=95, colno=20) + end_location: SourceLocation(pos=1610, lineno=95, colno=23) value: 'bar' - location: SourceLocation(pos=1645, lineno=99, colno=13) - end_location: SourceLocation(pos=1654, lineno=99, colno=22) + location: SourceLocation(pos=1625, lineno=97, colno=13) + end_location: SourceLocation(pos=1634, lineno=97, colno=22) identifier: 'say:message' arguments: - location: SourceLocation(pos=1649, lineno=99, colno=17) - end_location: SourceLocation(pos=1654, lineno=99, colno=22) + location: SourceLocation(pos=1629, lineno=97, colno=17) + end_location: SourceLocation(pos=1634, lineno=97, colno=22) fragments: - location: SourceLocation(pos=1649, lineno=99, colno=17) - end_location: SourceLocation(pos=1654, lineno=99, colno=22) + location: SourceLocation(pos=1629, lineno=97, colno=17) + end_location: SourceLocation(pos=1634, lineno=97, colno=22) value: 'hello' - location: SourceLocation(pos=1663, lineno=100, colno=9) - end_location: SourceLocation(pos=1729, lineno=103, colno=20) + location: SourceLocation(pos=1643, lineno=98, colno=9) + end_location: SourceLocation(pos=1709, lineno=101, colno=20) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1671, lineno=100, colno=17) - end_location: SourceLocation(pos=1729, lineno=103, colno=20) + location: SourceLocation(pos=1651, lineno=98, colno=17) + end_location: SourceLocation(pos=1709, lineno=101, colno=20) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=1686, lineno=101, colno=13) - end_location: SourceLocation(pos=1693, lineno=101, colno=20) + location: SourceLocation(pos=1666, lineno=99, colno=13) + end_location: SourceLocation(pos=1673, lineno=99, colno=20) is_tag: False namespace: None path: 'the_end' - location: SourceLocation(pos=1706, lineno=102, colno=13) - end_location: SourceLocation(pos=1729, lineno=103, colno=20) + location: SourceLocation(pos=1686, lineno=100, colno=13) + end_location: SourceLocation(pos=1709, lineno=101, colno=20) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=1722, lineno=103, colno=13) - end_location: SourceLocation(pos=1729, lineno=103, colno=20) + location: SourceLocation(pos=1702, lineno=101, colno=13) + end_location: SourceLocation(pos=1709, lineno=101, colno=20) identifier: 'say:message' arguments: - location: SourceLocation(pos=1726, lineno=103, colno=17) - end_location: SourceLocation(pos=1729, lineno=103, colno=20) + location: SourceLocation(pos=1706, lineno=101, colno=17) + end_location: SourceLocation(pos=1709, lineno=101, colno=20) fragments: - location: SourceLocation(pos=1726, lineno=103, colno=17) - end_location: SourceLocation(pos=1729, lineno=103, colno=20) + location: SourceLocation(pos=1706, lineno=101, colno=17) + end_location: SourceLocation(pos=1709, lineno=101, colno=20) value: 'foo' - location: SourceLocation(pos=1734, lineno=104, colno=5) - end_location: SourceLocation(pos=1789, lineno=105, colno=31) + location: SourceLocation(pos=1714, lineno=102, colno=5) + end_location: SourceLocation(pos=1769, lineno=103, colno=31) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=1784, lineno=105, colno=26) - end_location: SourceLocation(pos=1789, lineno=105, colno=31) + location: SourceLocation(pos=1764, lineno=103, colno=26) + end_location: SourceLocation(pos=1769, lineno=103, colno=31) value: False - location: SourceLocation(pos=1791, lineno=107, colno=1) - end_location: SourceLocation(pos=1829, lineno=107, colno=39) + location: SourceLocation(pos=1771, lineno=105, colno=1) + end_location: SourceLocation(pos=1809, lineno=105, colno=39) identifier: 'scoreboard:players:set:targets:objective:score' arguments: - location: SourceLocation(pos=1814, lineno=107, colno=24) - end_location: SourceLocation(pos=1820, lineno=107, colno=30) + location: SourceLocation(pos=1794, lineno=105, colno=24) + end_location: SourceLocation(pos=1800, lineno=105, colno=30) value: '#index' - location: SourceLocation(pos=1821, lineno=107, colno=31) - end_location: SourceLocation(pos=1827, lineno=107, colno=37) + location: SourceLocation(pos=1801, lineno=105, colno=31) + end_location: SourceLocation(pos=1807, lineno=105, colno=37) value: 'global' - location: SourceLocation(pos=1828, lineno=107, colno=38) - end_location: SourceLocation(pos=1829, lineno=107, colno=39) + location: SourceLocation(pos=1808, lineno=105, colno=38) + end_location: SourceLocation(pos=1809, lineno=105, colno=39) value: 3 - location: SourceLocation(pos=1830, lineno=108, colno=1) - end_location: SourceLocation(pos=1868, lineno=108, colno=39) + location: SourceLocation(pos=1810, lineno=106, colno=1) + end_location: SourceLocation(pos=1848, lineno=106, colno=39) identifier: 'scoreboard:players:set:targets:objective:score' arguments: - location: SourceLocation(pos=1853, lineno=108, colno=24) - end_location: SourceLocation(pos=1859, lineno=108, colno=30) + location: SourceLocation(pos=1833, lineno=106, colno=24) + end_location: SourceLocation(pos=1839, lineno=106, colno=30) value: '$index' - location: SourceLocation(pos=1860, lineno=108, colno=31) - end_location: SourceLocation(pos=1866, lineno=108, colno=37) + location: SourceLocation(pos=1840, lineno=106, colno=31) + end_location: SourceLocation(pos=1846, lineno=106, colno=37) value: 'global' - location: SourceLocation(pos=1867, lineno=108, colno=38) - end_location: SourceLocation(pos=1868, lineno=108, colno=39) + location: SourceLocation(pos=1847, lineno=106, colno=38) + end_location: SourceLocation(pos=1848, lineno=106, colno=39) value: 3 - location: SourceLocation(pos=1869, lineno=109, colno=1) - end_location: SourceLocation(pos=1947, lineno=109, colno=79) + location: SourceLocation(pos=1849, lineno=107, colno=1) + end_location: SourceLocation(pos=1927, lineno=107, colno=79) identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' arguments: - location: SourceLocation(pos=1898, lineno=109, colno=30) - end_location: SourceLocation(pos=1916, lineno=109, colno=48) + location: SourceLocation(pos=1878, lineno=107, colno=30) + end_location: SourceLocation(pos=1896, lineno=107, colno=48) value: '#sie_1_flags_delta' - location: SourceLocation(pos=1917, lineno=109, colno=49) - end_location: SourceLocation(pos=1924, lineno=109, colno=56) + location: SourceLocation(pos=1897, lineno=107, colno=49) + end_location: SourceLocation(pos=1904, lineno=107, colno=56) value: 'integer' - location: SourceLocation(pos=1925, lineno=109, colno=57) - end_location: SourceLocation(pos=1926, lineno=109, colno=58) + location: SourceLocation(pos=1905, lineno=107, colno=57) + end_location: SourceLocation(pos=1906, lineno=107, colno=58) value: '=' - location: SourceLocation(pos=1927, lineno=109, colno=59) - end_location: SourceLocation(pos=1939, lineno=109, colno=71) + location: SourceLocation(pos=1907, lineno=107, colno=59) + end_location: SourceLocation(pos=1919, lineno=107, colno=71) value: '#sie_1_flags' - location: SourceLocation(pos=1940, lineno=109, colno=72) - end_location: SourceLocation(pos=1947, lineno=109, colno=79) + location: SourceLocation(pos=1920, lineno=107, colno=72) + end_location: SourceLocation(pos=1927, lineno=107, colno=79) value: 'integer' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index b93f6cc74..6f50e6167 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -3,7 +3,7 @@ execute if block 0 0 0 #wool execute if block 0 0 0 #wool execute if block 0 0 0 wool execute if block 0 0 0 wool -execute if block ~ ^ 0 #wool +execute if block ~ 1 0 #wool tellraw @s {"text": "Hover me!", "hoverEvent": {"action": "show_text", "value": "Hi!"}} execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '[{"text": "Hello", "bold": true}]', Lore: ['[{ "text": "Something else here" }]']}} execute if block ~ ~ ~ #namespace:tag if entity @s[tag=foo] From d2506a50c77a12ac901e4cab0e7073a6f0b9d7a3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Nov 2021 01:01:02 +0000 Subject: [PATCH 0466/1554] 0.12.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 8d630bd9d..213aa31a4 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.12.3 (2021-11-19) +### Fix +* Refactor multiline argument handling and make block and item parsers more modular ([`0badf8c`](https://github.com/mcbeet/mecha/commit/0badf8ccc75176c19128dc4922e80347fc0924c6)) + ## v0.12.2 (2021-11-18) ### Fix * Quick fix for messages spanning over multiple lines accidentally ([`d065c8b`](https://github.com/mcbeet/mecha/commit/d065c8b42bf6ac22ae76735d3095eff7ec76b6a9)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 2e571f5bf..d68157732 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.2" +__version__ = "0.12.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 34afe1478..79010c9bc 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.12.2" +version = "0.12.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b8749aa20dc55696b38b15e7b7924a20cf4598ae Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 02:23:33 +0100 Subject: [PATCH 0467/1554] test: use messages in kitchen sink example --- packages/mecha/examples/kitchen_sink/beet.yml | 1 + .../src/data/demo/functions/messages.mcfunction | 2 ++ .../examples/kitchen_sink/src/data/demo/messages/greet.json | 4 ++++ .../tests/snapshots/examples__build_kitchen_sink__0.pack.md | 6 ++++++ 4 files changed, 13 insertions(+) create mode 100644 packages/mecha/examples/kitchen_sink/src/data/demo/functions/messages.mcfunction create mode 100644 packages/mecha/examples/kitchen_sink/src/data/demo/messages/greet.json diff --git a/packages/mecha/examples/kitchen_sink/beet.yml b/packages/mecha/examples/kitchen_sink/beet.yml index 043c9339b..9f512b931 100644 --- a/packages/mecha/examples/kitchen_sink/beet.yml +++ b/packages/mecha/examples/kitchen_sink/beet.yml @@ -1,6 +1,7 @@ require: - mecha.contrib.relative_location - mecha.contrib.implicit_execute + - mecha.contrib.messages - mecha.contrib.nesting data_pack: load: [src] diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/messages.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/messages.mcfunction new file mode 100644 index 000000000..1fb072834 --- /dev/null +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/messages.mcfunction @@ -0,0 +1,2 @@ +tellraw @p from ./greet +data modify storage imp:io words set value [alpha, beta, gamma, delta] diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/messages/greet.json b/packages/mecha/examples/kitchen_sink/src/data/demo/messages/greet.json new file mode 100644 index 000000000..d1cf0c531 --- /dev/null +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/messages/greet.json @@ -0,0 +1,4 @@ +{ + "text": "hello", + "color": "red" +} diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 76db633f5..17af46e85 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -19,6 +19,12 @@ execute as @a at @s align xyz run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} execute if score @s obj matches 2 run say hi ``` +`@function demo:messages` + +```mcfunction +tellraw @p {"text": "hello", "color": "red"} +data modify storage imp:io words set value ["alpha", "beta", "gamma", "delta"] +``` `@function demo:nesting` ```mcfunction From 209ed5004253112824b203bbe72f79c765c7e970 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 03:41:54 +0100 Subject: [PATCH 0468/1554] fix: handle execute expand in mecha.contrib.nesting --- .../src/data/demo/functions/foo.mcfunction | 4 ++ .../data/demo/functions/nesting.mcfunction | 11 ++++ packages/mecha/mecha/contrib/nesting.py | 54 +++++++++++++++++++ .../examples__build_basic_nesting__0.pack.md | 2 + .../examples__build_kitchen_sink__0.pack.md | 4 ++ 5 files changed, 75 insertions(+) diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction index 1e3dd485a..240e49bb9 100644 --- a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -37,3 +37,7 @@ execute setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone + +execute as @a at @s expand + say hello + say world diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction index f2e9f506f..01e728b08 100644 --- a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction @@ -14,6 +14,17 @@ function ./nesting/foo a test +as @a at @s expand + say 1 + say 2 + +as @a at @s + if score @s tmp matches 1 + expand + say 1 + say 2 + + if data storage imp:temp iter.words.remaining[] function ./nesting/loop say wow diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 93d4af6fb..325378b32 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -36,6 +36,21 @@ COMMAND_TREE = { "type": "root", "children": { + "execute": { + "type": "literal", + "children": { + "expand": { + "type": "literal", + "children": { + "commands": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + }, + }, + }, "function": { "type": "literal", "children": { @@ -206,3 +221,42 @@ def nested_execute(self, node: AstNestedExecute): identifier="execute:run:subcommand", arguments=AstChildren([cast(AstNode, function_call)]), ) + + @rule(AstRoot) + def execute_expand(self, node: AstRoot): + commands: List[AstCommand] = [] + + for command in node.commands: + args = command.arguments + stack: List[AstCommand] = [command] + + expand = None + + while args and isinstance(subcommand := args[-1], AstCommand): + if subcommand.identifier == "execute:expand:commands": + expand = subcommand + break + stack.append(subcommand) + args = subcommand.arguments + + if expand: + for nested_command in cast(AstRoot, expand.arguments[0]).commands: + expansion = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([cast(AstNode, nested_command)]), + ) + expansion = set_location(expansion, nested_command) + + for prefix in reversed(stack): + args = AstChildren([*prefix.arguments[:-1], expansion]) + expansion = replace(prefix, arguments=args) + + commands.append(expansion) + + else: + commands.append(command) + + if len(commands) > len(node.commands): + return replace(node, commands=AstChildren(commands)) + + return node diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index fb37119f6..57b7d8bfc 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -21,6 +21,8 @@ execute as @a at @s run function demo:thing4 execute as @a at @s run function demo:thing5 execute as @a at @s run function demo:foo/nested_execute_0 execute as @a at @s run function demo:foo/nested_execute_1 +execute as @a at @s run say hello +execute as @a at @s run say world ``` `@function demo:thing2` diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 17af46e85..60dabc35c 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -31,6 +31,10 @@ data modify storage imp:io words set value ["alpha", "beta", "gamma", "delta"] execute as @a at @s run function demo:nesting/nested_execute_0 execute as @a at @s if score @s tmp matches 1 run function demo:nesting/nested_execute_1 function demo:nesting/foo +execute as @a at @s run say 1 +execute as @a at @s run say 2 +execute as @a at @s if score @s tmp matches 1 run say 1 +execute as @a at @s if score @s tmp matches 1 run say 2 execute if data storage imp:temp iter.words.remaining[] run function demo:nesting/loop ``` `@function demo:nesting/nested_execute_0` From 0c84e179af5f5f060caadef267227e3fcd19723f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 03:48:54 +0100 Subject: [PATCH 0469/1554] fix: improve keep comments behavior for commands with unknown locations --- packages/mecha/mecha/serialize.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 3b82d8110..cbb3a4982 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -117,12 +117,13 @@ def root(self, node: AstRoot, result: List[str]): source = self.keep_comments and self.database[self.database.current].source for command in node.commands: - if source and not command.location.unknown: + if source: + end_pos = max(command.location.pos, pos + 1) if pos > -1: - if fill := source[pos : command.location.pos]: + if fill := source[pos:end_pos]: result.append(self.regex_comments.sub(r"\1", fill)) try: - pos = source.index("\n", command.location.pos) + 1 + pos = source.index("\n", end_pos) + 1 except ValueError: pos = -1 From 50d113e601f1597a5edf2bc80d7db11346931729 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 03:51:29 +0100 Subject: [PATCH 0470/1554] chore: update pyright --- packages/mecha/mecha/parse.py | 2 +- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 84aeed15a..daec09823 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -580,7 +580,7 @@ def parse_command(stream: TokenStream) -> AstCommand: commit() - if commit.rollback: + if commit.rollback and tree.children: for (name, child), alternative in stream.choose(*tree.children.items()): with alternative, stream.provide( scope=scope + (name,), diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 52f6c1771..c83479bb1 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.184" + "pyright": "^1.1.188" } }, "node_modules/pyright": { - "version": "1.1.184", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", - "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", + "version": "1.1.188", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.188.tgz", + "integrity": "sha512-9ypjVwXwVroIzo/atn3hvfOuyH/eBRQMr2ayIN/+rqKmx4haNxuCdV/WnYa5QIH6l4LFSMV+rTHLRISIFMv+1w==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.184", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", - "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", + "version": "1.1.188", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.188.tgz", + "integrity": "sha512-9ypjVwXwVroIzo/atn3hvfOuyH/eBRQMr2ayIN/+rqKmx4haNxuCdV/WnYa5QIH6l4LFSMV+rTHLRISIFMv+1w==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index e2e007a4b..5b2de47da 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.184" + "pyright": "^1.1.188" } } From 737975511204fb04e2c315b9a0050019a50f3398 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 Nov 2021 03:53:57 +0100 Subject: [PATCH 0471/1554] chore: update dependencies --- packages/mecha/poetry.lock | 36 +++++++++++------------------------ packages/mecha/pyproject.toml | 7 +++---- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 52b680c9b..a3bbb4911 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.44.5" +version = "0.44.9" description = "The Minecraft pack development kit" category = "main" optional = false @@ -57,7 +57,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.10b0" +version = "21.11b1" description = "The uncompromising code formatter." category = "dev" optional = false @@ -68,7 +68,7 @@ click = ">=7.1.2" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0,<1" platformdirs = ">=2" -regex = ">=2020.1.8" +regex = ">=2021.4.4" tomli = ">=0.2.6,<2.0.0" typing-extensions = [ {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, @@ -276,7 +276,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.10.0" +version = "5.10.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -654,17 +654,6 @@ python-versions = "*" [package.extras] idna2008 = ["idna"] -[[package]] -name = "rope" -version = "0.20.1" -description = "a python refactoring library..." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -dev = ["pytest", "pytest-timeout"] - [[package]] name = "secretstorage" version = "3.3.1" @@ -828,7 +817,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f6bf58cfd1efa83843bd6e52afe1ccf582373cb2f17910f1382ccc747af63b25" +content-hash = "3eed7f12fa3549e344697371947c1a086e0f677e753bfe792438d106f87c17cd" [metadata.files] atomicwrites = [ @@ -844,12 +833,12 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.44.5-py3-none-any.whl", hash = "sha256:732967bfbd3e36eda74de62d02e55c52fa308fd793a48e9ce6281985db7173a3"}, - {file = "beet-0.44.5.tar.gz", hash = "sha256:8b092778afad301f20ccba37841aae287005f344af3eba0074f255ff2794f6ff"}, + {file = "beet-0.44.9-py3-none-any.whl", hash = "sha256:b00c432c1453555de1d40e6461a6301df89f09586ffb28fdd4329d08f2ef10ed"}, + {file = "beet-0.44.9.tar.gz", hash = "sha256:c7592d09f060d0f0c11eb6a206df8a26cc1eac6439fc3166b9275557eb2ad75b"}, ] black = [ - {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, - {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, + {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, + {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -982,8 +971,8 @@ invoke = [ {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, ] isort = [ - {file = "isort-5.10.0-py3-none-any.whl", hash = "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f"}, - {file = "isort-5.10.0.tar.gz", hash = "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345"}, + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, @@ -1280,9 +1269,6 @@ rfc3986 = [ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] -rope = [ - {file = "rope-0.20.1.tar.gz", hash = "sha256:505a2f6b4ac7b18e0429be179f4d8712243a194da5c866b0731f9d91ce7590bb"}, -] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 79010c9bc..521dd7ba8 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,14 +23,13 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.44.5" +beet = ">=0.44.9" tokenstream = "^1.2.3" [tool.poetry.dev-dependencies] -black = "^21.10b0" -rope = "^0.20.1" +black = "^21.11b1" pytest = "^6.2.5" -isort = "^5.10.0" +isort = "^5.10.1" python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" lectern = "^0.18.0" From 600f43297321c7ccd60c4311168bb9dda05af437 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Nov 2021 02:55:02 +0000 Subject: [PATCH 0472/1554] 0.12.4 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 213aa31a4..5b9c74daf 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.12.4 (2021-11-19) +### Fix +* Improve keep comments behavior for commands with unknown locations ([`bdaccbb`](https://github.com/mcbeet/mecha/commit/bdaccbbeab53b91eb92aa0c6ea70db9511b7092c)) +* Handle execute expand in mecha.contrib.nesting ([`6d57f56`](https://github.com/mcbeet/mecha/commit/6d57f560b2edf779c2dada47ca696dc3c8be2a8a)) + ## v0.12.3 (2021-11-19) ### Fix * Refactor multiline argument handling and make block and item parsers more modular ([`0badf8c`](https://github.com/mcbeet/mecha/commit/0badf8ccc75176c19128dc4922e80347fc0924c6)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d68157732..76f36762f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.3" +__version__ = "0.12.4" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 521dd7ba8..4fb1174e1 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.12.3" +version = "0.12.4" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 52ec1dc932363c91f31cf9835f921ff63afd9f85 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Nov 2021 01:41:25 +0100 Subject: [PATCH 0473/1554] fix: better error message when the minecraft version is invalid --- packages/mecha/mecha/config.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index 2fec051d6..5450f2ed4 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -7,6 +7,7 @@ from pathlib import Path from typing import Dict, Iterator, List, Literal, Optional, Tuple, Union +from beet import ErrorMessage from beet.core.utils import FileSystemPath, JsonDict from pydantic import BaseModel @@ -36,8 +37,11 @@ def load_from( if filename: sources.append(Path(filename).read_text()) if version is not None: - version = "_".join(map(str, split_version(version))) - sources.append(read_text("mecha.resources", f"{version}.json")) + version_name = "_".join(map(str, split_version(version))) + try: + sources.append(read_text("mecha.resources", f"{version_name}.json")) + except FileNotFoundError as exc: + raise ErrorMessage(f"Invalid minecraft version {version!r}.") from exc tree = cls.parse_raw(sources[0]) From 7362f05bede0561ceed1388acaa9d1a7eb54bae1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Nov 2021 01:49:55 +0100 Subject: [PATCH 0474/1554] feat: add cli entrypoint --- packages/mecha/mecha/__main__.py | 3 + packages/mecha/mecha/cli.py | 96 ++++++++++++++++++++++++++++++++ packages/mecha/pyproject.toml | 3 + packages/mecha/pytest.ini | 2 +- 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 packages/mecha/mecha/__main__.py create mode 100644 packages/mecha/mecha/cli.py diff --git a/packages/mecha/mecha/__main__.py b/packages/mecha/mecha/__main__.py new file mode 100644 index 000000000..ec2a45fff --- /dev/null +++ b/packages/mecha/mecha/__main__.py @@ -0,0 +1,3 @@ +from mecha.cli import main + +main() diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py new file mode 100644 index 000000000..ac087b380 --- /dev/null +++ b/packages/mecha/mecha/cli.py @@ -0,0 +1,96 @@ +__all__ = [ + "validate", + "mecha", + "main", +] + + +import logging +import zipfile +from pathlib import Path +from typing import Tuple + +import click +from beet import Context, DataPack, Function, run_beet +from beet.toolchain.cli import BeetCommand, LogHandler, error_handler, message_fence + +from mecha import __version__ + +from .api import Mecha + + +def validate(ctx: Context): + """Plugin for running mecha on the provided sources.""" + mc = ctx.inject(Mecha) + source = ctx.meta["source"] + + for path in map(Path, source): + if zipfile.is_zipfile(path) or (path / "data").is_dir(): + mc.compile(DataPack(path=path), report=mc.diagnostics) + elif path.is_dir(): + for filename in path.glob("**/*.mcfunction"): + mc.compile(Function(source_path=filename), report=mc.diagnostics) + elif path.is_file(): + mc.compile(Function(source_path=path), report=mc.diagnostics) + + +@click.command( + cls=BeetCommand, + context_settings={"help_option_names": ("-h", "--help")}, +) +@click.argument("source", nargs=-1, type=click.Path(exists=True)) +@click.option( + "-m", + "--minecraft", + metavar="VERSION", + default="1.17", + help="Minecraft version.", +) +@click.option( + "-l", + "--log", + metavar="LEVEL", + type=click.Choice( + ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"], + case_sensitive=False, + ), + default="WARNING", + help="Configure output verbosity.", +) +@click.version_option( + __version__, + "-v", + "--version", + message=click.style("%(prog)s", fg="red") + + click.style(" v%(version)s", fg="green"), +) +@error_handler(should_exit=True) +def mecha(source: Tuple[str, ...], minecraft: str, log: str): + """Validate data packs and .mcfunction files.""" + logger = logging.getLogger() + logger.setLevel(log) + logger.addHandler(LogHandler()) + + config = { + "pipeline": ["mecha.cli.validate"], + "meta": { + "source": source, + "mecha": { + "version": minecraft, + "readonly": True, + }, + }, + } + + with message_fence(f"Validating with mecha v{__version__}"): + if source: + with run_beet(config): + pass + else: + logger.warning("No path provided.", extra={"prefix": "mecha"}) + logger.warning("Use --help to see usage.", extra={"prefix": "mecha"}) + + +def main(): + """Invoke the command-line entrypoint.""" + mecha(prog_name="mecha") diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4fb1174e1..1203e34bc 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -34,6 +34,9 @@ python-semantic-release = "^7.19.2" pytest-insta = "^0.1.10" lectern = "^0.18.0" +[tool.poetry.scripts] +mecha = "mecha.cli:main" + [tool.poetry.plugins.beet] commands = "mecha.commands" diff --git a/packages/mecha/pytest.ini b/packages/mecha/pytest.ini index 24138b5b7..da3a1d0d7 100644 --- a/packages/mecha/pytest.ini +++ b/packages/mecha/pytest.ini @@ -1,3 +1,3 @@ [pytest] -addopts = tests mecha --doctest-modules +addopts = tests mecha --ignore mecha/__main__.py --doctest-modules doctest_optionflags = NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL From b389a9d5c72f8083ca982b122861b93cffd6497a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Nov 2021 01:51:49 +0100 Subject: [PATCH 0475/1554] chore: put pytest options in pyproject.toml --- packages/mecha/pyproject.toml | 5 +++++ packages/mecha/pytest.ini | 3 --- 2 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 packages/mecha/pytest.ini diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1203e34bc..45c04a320 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -40,6 +40,11 @@ mecha = "mecha.cli:main" [tool.poetry.plugins.beet] commands = "mecha.commands" +[tool.pytest.ini_options] +minversion = "6.0" +addopts = "tests mecha --ignore mecha/__main__.py --doctest-modules" +doctest_optionflags = "NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL ELLIPSIS" + [tool.black] target-version = ["py38"] include = '\.pyi?$' diff --git a/packages/mecha/pytest.ini b/packages/mecha/pytest.ini deleted file mode 100644 index da3a1d0d7..000000000 --- a/packages/mecha/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -addopts = tests mecha --ignore mecha/__main__.py --doctest-modules -doctest_optionflags = NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL From 237a61e8dec2ee245026220641eb6ba93176c2f5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 20 Nov 2021 00:53:30 +0000 Subject: [PATCH 0476/1554] 0.13.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 5b9c74daf..64784a93e 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.13.0 (2021-11-20) +### Feature +* Add cli entrypoint ([`6f291f3`](https://github.com/mcbeet/mecha/commit/6f291f301149e8ab72feb91671209106b022cb54)) + +### Fix +* Better error message when the minecraft version is invalid ([`bd35f9d`](https://github.com/mcbeet/mecha/commit/bd35f9d9e41b9782d90966cb6953a5ba145b007c)) + ## v0.12.4 (2021-11-19) ### Fix * Improve keep comments behavior for commands with unknown locations ([`bdaccbb`](https://github.com/mcbeet/mecha/commit/bdaccbbeab53b91eb92aa0c6ea70db9511b7092c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 76f36762f..85be192e7 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.4" +__version__ = "0.13.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 45c04a320..ff8399e26 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.12.4" +version = "0.13.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 29443cd8ee849b4f32f7957872ff58a583cb183a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Nov 2021 02:23:08 +0100 Subject: [PATCH 0477/1554] fix: add info about the command-line entrypoint on the README --- packages/mecha/README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index a00ccfd8f..4e58d42a9 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -65,6 +65,36 @@ The package can be installed with `pip`. $ pip install mecha ``` +## Command-line utility + +```bash +$ mecha --help +Usage: mecha [OPTIONS] [SOURCE]... + + Validate data packs and .mcfunction files. + +Options: + -m, --minecraft VERSION Minecraft version. + -l, --log LEVEL Configure output verbosity. + -v, --version Show the version and exit. + -h, --help Show this message and exit. +``` + +You can use the command-line utility to check data packs and function files for errors. The command arguments can be zipped and unzipped data packs, individual function files, and if you specify a directory that's not a data pack it will recursively grab all the `.mcfunction` files in the directory. You can use the --minecraft option to select between versions `1.16`, `1.17`, and `1.18`. + +```bash +$ mecha path/to/my_data_pack +Validating with mecha v0.13.0 + +ERROR | mecha Expected curly '}' but got bracket ']'. + | path/to/my_data_pack/data/demo/functions/foo.mcfunction:5:34 + | 4 | + | 5 | say hello @a[scores={foo=1, bar=2] + | : ^ + +Error: Reported 1 error. +``` + ## Contributing Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses [`poetry`](https://python-poetry.org/). From 4d87a70230d1336f0af678fce7727bd7166b43a3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 20 Nov 2021 01:30:56 +0000 Subject: [PATCH 0478/1554] 0.13.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 64784a93e..6959ce71c 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.13.1 (2021-11-20) +### Fix +* Add info about the command-line entrypoint on the README ([`750ec5e`](https://github.com/mcbeet/mecha/commit/750ec5e8b340a6fe6c75122ea664a373351bdfd3)) + ## v0.13.0 (2021-11-20) ### Feature * Add cli entrypoint ([`6f291f3`](https://github.com/mcbeet/mecha/commit/6f291f301149e8ab72feb91671209106b022cb54)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 85be192e7..911373449 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.13.0" +__version__ = "0.13.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ff8399e26..5537de1ab 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.13.0" +version = "0.13.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 38e42ea62f8fb767955bfb4f64f20327df9cc4da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Nov 2021 05:19:18 +0100 Subject: [PATCH 0479/1554] fix: update README --- packages/mecha/README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/mecha/README.md b/packages/mecha/README.md index 4e58d42a9..c030a0f83 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -47,6 +47,7 @@ This package provides everything you need for working with Minecraft commands in - Command config resolver that flattens and enumerates all the valid command prototypes - Powerful rule dispatcher for processing specific ast nodes - Composable ast visitors and reducers +- Comes with useful syntactic extensions like nesting and implicit execute - Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python @@ -80,7 +81,7 @@ Options: -h, --help Show this message and exit. ``` -You can use the command-line utility to check data packs and function files for errors. The command arguments can be zipped and unzipped data packs, individual function files, and if you specify a directory that's not a data pack it will recursively grab all the `.mcfunction` files in the directory. You can use the --minecraft option to select between versions `1.16`, `1.17`, and `1.18`. +You can use the command-line utility to check data packs and function files for errors. The command arguments can be zipped and unzipped data packs, individual function files, and if you specify a directory that's not a data pack it will recursively grab all the `.mcfunction` files in the directory. You can use the `--minecraft` option to select between versions `1.16`, `1.17`, and `1.18`. ```bash $ mecha path/to/my_data_pack @@ -95,6 +96,27 @@ ERROR | mecha Expected curly '}' but got bracket ']'. Error: Reported 1 error. ``` +## Github action + +You can use `mecha` to check your data packs and function files for errors without having to install anything using the [`mcbeet/check-commands`](https://github.com/mcbeet/check-commands) github action. + +```yml +# .github/workflows/check-commands.yml +name: Check commands +on: [push] + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: mcbeet/check-commands@v1 + with: + source: . +``` + +This allows you to make sure that your commands don't contain any error when you push to your repository. For more details check out the [action README](https://github.com/mcbeet/check-commands#usage). + ## Contributing Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses [`poetry`](https://python-poetry.org/). From f9ff0cd1d07a7b841810a9546d10566a05aad8a8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 20 Nov 2021 04:20:10 +0000 Subject: [PATCH 0480/1554] 0.13.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 6959ce71c..5149deee1 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.13.2 (2021-11-20) +### Fix +* Update README ([`3557cb6`](https://github.com/mcbeet/mecha/commit/3557cb670d2c5e87441e03c12ba1d495603f5b8d)) + ## v0.13.1 (2021-11-20) ### Fix * Add info about the command-line entrypoint on the README ([`750ec5e`](https://github.com/mcbeet/mecha/commit/750ec5e8b340a6fe6c75122ea664a373351bdfd3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 911373449..4f4aa4c0d 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.13.1" +__version__ = "0.13.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 5537de1ab..61baf8bdb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.13.1" +version = "0.13.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 633a7978dd5a275ea778259dd70accebf7fe684b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 Nov 2021 13:39:37 +0100 Subject: [PATCH 0481/1554] fix: don't use resource_location for parsing objective criteria --- packages/mecha/mecha/ast.py | 6 ++++++ packages/mecha/mecha/parse.py | 6 ++++-- .../mecha/mecha/resources/argument_examples.json | 11 ++++++++++- packages/mecha/mecha/serialize.py | 6 +----- ...rgument_examples_minecraft_block_state_1_1__0.txt | 2 +- ..._argument_examples_minecraft_dimension_1_0__0.txt | 2 +- ...ument_examples_minecraft_entity_summon_1_0__0.txt | 2 +- ...ument_examples_minecraft_entity_summon_1_1__0.txt | 2 +- ...argument_examples_minecraft_item_stack_1_0__0.txt | 2 +- ..._examples_minecraft_objective_criteria_0_0__0.txt | 12 +++++------- ..._examples_minecraft_objective_criteria_0_1__0.txt | 12 +++++------- ..._examples_minecraft_objective_criteria_0_2__0.txt | 12 +++++------- ..._examples_minecraft_objective_criteria_0_3__0.txt | 12 ++++++++++++ ..._examples_minecraft_objective_criteria_0_4__0.txt | 12 ++++++++++++ ..._examples_minecraft_objective_criteria_0_5__0.txt | 12 ++++++++++++ ..._examples_minecraft_objective_criteria_0_6__0.txt | 12 ++++++++++++ ..._examples_minecraft_objective_criteria_0_7__0.txt | 12 ++++++++++++ ...t_examples_minecraft_resource_location_1_0__0.txt | 2 +- 18 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 546845a55..660ec8ee2 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -428,6 +428,12 @@ def from_value(cls, value: str) -> "AstResourceLocation": namespace, _, path = value.rpartition(":") return cls(is_tag=is_tag, namespace=namespace or None, path=path) + def get_value(self) -> str: + """Return the value of the resource location as a string.""" + prefix = "#" if self.is_tag else "" + namespace = f"{self.namespace}:" if self.namespace else "" + return prefix + namespace + self.path + def get_canonical_value(self) -> str: """Return the canonical value of the resource location as a string.""" prefix = "#" if self.is_tag else "" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index daec09823..0b2184c42 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -392,7 +392,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:nbt_path": delegate("nbt_path"), "command:argument:minecraft:nbt_tag": delegate("nbt"), "command:argument:minecraft:objective": delegate("objective"), - "command:argument:minecraft:objective_criteria": delegate("resource_location"), + "command:argument:minecraft:objective_criteria": delegate("literal"), "command:argument:minecraft:operation": LiteralConstraint( parser=delegate("literal"), values=[ @@ -1143,7 +1143,9 @@ def __call__(self, stream: TokenStream) -> Any: node: AstResourceLocation = self.parser(stream) if node.is_tag: - raise node.emit_error(InvalidSyntax("Specifying a tag is not allowed.")) + raise node.emit_error( + InvalidSyntax(f"Specifying a tag is not allowed {node.get_value()!r}.") + ) return node diff --git a/packages/mecha/mecha/resources/argument_examples.json b/packages/mecha/mecha/resources/argument_examples.json index ebcc463ad..7ff35eb08 100644 --- a/packages/mecha/mecha/resources/argument_examples.json +++ b/packages/mecha/mecha/resources/argument_examples.json @@ -393,7 +393,16 @@ ], "minecraft:objective_criteria": [ { - "examples": ["foo", "foo.bar.baz", "minecraft:foo"] + "examples": [ + "minecraft.mined:minecraft.stone", + "mined:minecraft.stone", + "minecraft.mined:stone", + "mined:stone", + "dummy", + "deathCount", + "playerKillCount", + "teamkill.aqua" + ] } ], "minecraft:operation": [ diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index cbb3a4982..851307968 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -192,11 +192,7 @@ def nbt(self, node: AstNbt, result: List[str]): @rule(AstResourceLocation) def resource_location(self, node: AstResourceLocation, result: List[str]): - if node.is_tag: - result.append("#") - if node.namespace: - result.append(f"{node.namespace}:") - result.append(node.path) + result.append(node.get_value()) @rule(AstBlockState) def block_state(self, node: AstBlockState, result: List[str]): diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt index be47a4549..5e2f16507 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:block_state 1 1 --- Reported 1 error. -line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed '#stone'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt index a4ecdcbf4..7258151b9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_dimension_1_0__0.txt @@ -6,4 +6,4 @@ minecraft:dimension 1 0 --- Reported 1 error. -line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed '#minecraft:overworld'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt index 12cab0466..6f2207100 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_0__0.txt @@ -6,4 +6,4 @@ minecraft:entity_summon 1 0 --- Reported 1 error. -line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed '#minecraft:pig'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt index 3be55cf99..54506b0cc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_summon_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:entity_summon 1 1 --- Reported 1 error. -line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed '#cow'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt index 69d100520..8b3d4e27f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_stack_1_0__0.txt @@ -6,4 +6,4 @@ minecraft:item_stack 1 0 --- Reported 1 error. -line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed '#minecraft:stone'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt index c7148df3f..52a907b77 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt @@ -2,13 +2,11 @@ minecraft:objective_criteria 0 0 --- {} --- -foo +minecraft.mined:minecraft.stone --- -foo +minecraft.mined:minecraft.stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - is_tag: False - namespace: None - path: 'foo' \ No newline at end of file + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 'minecraft.mined:minecraft.stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt index eb3457bad..753d9d0db 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt @@ -2,13 +2,11 @@ minecraft:objective_criteria 0 1 --- {} --- -foo.bar.baz +mined:minecraft.stone --- -foo.bar.baz +mined:minecraft.stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - is_tag: False - namespace: None - path: 'foo.bar.baz' \ No newline at end of file + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'mined:minecraft.stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt index 4d736a6af..7b6a4dbee 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt @@ -2,13 +2,11 @@ minecraft:objective_criteria 0 2 --- {} --- -minecraft:foo +minecraft.mined:stone --- -minecraft:foo +minecraft.mined:stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - is_tag: False - namespace: 'minecraft' - path: 'foo' \ No newline at end of file + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'minecraft.mined:stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt new file mode 100644 index 000000000..6f64cba20 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt @@ -0,0 +1,12 @@ +minecraft:objective_criteria 0 3 +--- +{} +--- +mined:stone +--- +mined:stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'mined:stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt new file mode 100644 index 000000000..1438b7726 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt @@ -0,0 +1,12 @@ +minecraft:objective_criteria 0 4 +--- +{} +--- +dummy +--- +dummy +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'dummy' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt new file mode 100644 index 000000000..cc493c62e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt @@ -0,0 +1,12 @@ +minecraft:objective_criteria 0 5 +--- +{} +--- +deathCount +--- +deathCount +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'deathCount' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt new file mode 100644 index 000000000..a8e9d90bd --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt @@ -0,0 +1,12 @@ +minecraft:objective_criteria 0 6 +--- +{} +--- +playerKillCount +--- +playerKillCount +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'playerKillCount' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt new file mode 100644 index 000000000..4e9c344bc --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt @@ -0,0 +1,12 @@ +minecraft:objective_criteria 0 7 +--- +{} +--- +teamkill.aqua +--- +teamkill.aqua +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'teamkill.aqua' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt index 8d71f8311..fade04fcb 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_resource_location_1_0__0.txt @@ -6,4 +6,4 @@ minecraft:resource_location 1 0 --- Reported 1 error. -line 1, column 1: Specifying a tag is not allowed. \ No newline at end of file +line 1, column 1: Specifying a tag is not allowed '#thing'. \ No newline at end of file From 4b89b50b06970fba0cddaf237c766439e4aedd70 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 20 Nov 2021 12:40:29 +0000 Subject: [PATCH 0482/1554] 0.13.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 5149deee1..c1a51bbe2 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.13.3 (2021-11-20) +### Fix +* Don't use resource_location for parsing objective criteria ([`d8b72e1`](https://github.com/mcbeet/mecha/commit/d8b72e1392f6df64f42d7615c124b40197307eda)) + ## v0.13.2 (2021-11-20) ### Fix * Update README ([`3557cb6`](https://github.com/mcbeet/mecha/commit/3557cb670d2c5e87441e03c12ba1d495603f5b8d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 4f4aa4c0d..f57ea7502 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.13.2" +__version__ = "0.13.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 61baf8bdb..b43373686 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.13.2" +version = "0.13.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 80d18522a9be6960a7d23503fd1c464fd55873a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Nov 2021 12:28:13 +0000 Subject: [PATCH 0483/1554] chore(deps-dev): bump python-semantic-release from 7.19.2 to 7.22.0 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.19.2 to 7.22.0. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.19.2...v7.22.0) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index a3bbb4911..c7ac08800 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -549,7 +549,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.19.2" +version = "7.22.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -817,7 +817,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "3eed7f12fa3549e344697371947c1a086e0f677e753bfe792438d106f87c17cd" +content-hash = "afdc19c8a660272403ec6b015a67f77d99ca033b3ca5f8809458f888167388e4" [metadata.files] atomicwrites = [ @@ -1172,8 +1172,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, - {file = "python_semantic_release-7.19.2-py3-none-any.whl", hash = "sha256:b2c8bb16a643fee0831be4d06138bc1440ebd4f252c3397d41abde179ea56852"}, + {file = "python-semantic-release-7.22.0.tar.gz", hash = "sha256:d43bf40d7dacc1dd64b9f9016d495a617aae193968336d50e5d12f39a51486e4"}, + {file = "python_semantic_release-7.22.0-py3-none-any.whl", hash = "sha256:8eccd599bb4efb5dc1a5a9ed5f89c6ba65be5e77aa2367ccf3d7da50ed84a944"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b43373686..40f6df165 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -30,7 +30,7 @@ tokenstream = "^1.2.3" black = "^21.11b1" pytest = "^6.2.5" isort = "^5.10.1" -python-semantic-release = "^7.19.2" +python-semantic-release = "^7.22.0" pytest-insta = "^0.1.10" lectern = "^0.18.0" From c80700ca1111770496ea9a69c022836c425bf013 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Nov 2021 12:25:36 +0000 Subject: [PATCH 0484/1554] chore(deps-dev): bump pyright from 1.1.188 to 1.1.189 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.188 to 1.1.189. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.189/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index c83479bb1..601e537d6 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.188" + "pyright": "^1.1.189" } }, "node_modules/pyright": { - "version": "1.1.188", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.188.tgz", - "integrity": "sha512-9ypjVwXwVroIzo/atn3hvfOuyH/eBRQMr2ayIN/+rqKmx4haNxuCdV/WnYa5QIH6l4LFSMV+rTHLRISIFMv+1w==", + "version": "1.1.189", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.189.tgz", + "integrity": "sha512-a/uq95CnTD6ExGPvWULWbzfhMc1Tn6MF382hvcl4H7EwfSrZh1fYNJ+1UNlcItz0BURXqUzF5347QAqjf/Xvdg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.188", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.188.tgz", - "integrity": "sha512-9ypjVwXwVroIzo/atn3hvfOuyH/eBRQMr2ayIN/+rqKmx4haNxuCdV/WnYa5QIH6l4LFSMV+rTHLRISIFMv+1w==", + "version": "1.1.189", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.189.tgz", + "integrity": "sha512-a/uq95CnTD6ExGPvWULWbzfhMc1Tn6MF382hvcl4H7EwfSrZh1fYNJ+1UNlcItz0BURXqUzF5347QAqjf/Xvdg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 5b2de47da..8b3dd6ee1 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.188" + "pyright": "^1.1.189" } } From 7fda9267a937c3a02da059de8049b78a8fdd249e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Nov 2021 12:23:57 +0000 Subject: [PATCH 0485/1554] chore(deps): bump beet from 0.44.9 to 0.45.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.44.9 to 0.45.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.44.9...v0.45.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index c7ac08800..6cfcf0262 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.44.9" +version = "0.45.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -44,7 +44,6 @@ base58 = ">=2.1.0,<3.0.0" click = ">=8.0.1,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" @@ -204,14 +203,6 @@ python-versions = "*" [package.dependencies] setuptools_scm = "*" -[[package]] -name = "fnvhash" -version = "0.1.0" -description = "Pure Python FNV hash implementation" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "gitdb" version = "4.0.7" @@ -833,8 +824,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.44.9-py3-none-any.whl", hash = "sha256:b00c432c1453555de1d40e6461a6301df89f09586ffb28fdd4329d08f2ef10ed"}, - {file = "beet-0.44.9.tar.gz", hash = "sha256:c7592d09f060d0f0c11eb6a206df8a26cc1eac6439fc3166b9275557eb2ad75b"}, + {file = "beet-0.45.0-py3-none-any.whl", hash = "sha256:9204b65be8e5fb2cc6f278c381a8c01b7b3ff02338175be2dc91ae9c51403c57"}, + {file = "beet-0.45.0.tar.gz", hash = "sha256:7c3a4a926aa3baa298c7f9185cf83118244ee8696b95bde6307b9d68084623d1"}, ] black = [ {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, @@ -942,9 +933,6 @@ docutils = [ dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, ] -fnvhash = [ - {file = "fnvhash-0.1.0.tar.gz", hash = "sha256:3e82d505054f9f3987b2b5b649f7e7b6f48349f6af8a1b8e4d66779699c85a8e"}, -] gitdb = [ {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, From 1b7bb50f6c45b9851d7e42ba725a3f22fa28fba4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Nov 2021 01:10:55 +0000 Subject: [PATCH 0486/1554] chore(deps): bump beet from 0.44.8 to 0.45.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.44.8 to 0.45.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.44.8...v0.45.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 1f2821f2e..a7288d6d8 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.44.8" +version = "0.45.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -44,7 +44,6 @@ base58 = ">=2.1.0,<3.0.0" click = ">=8.0.1,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -fnvhash = ">=0.1.0,<0.2.0" Jinja2 = ">=3.0.1,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" @@ -207,14 +206,6 @@ python-versions = "*" [package.dependencies] setuptools_scm = "*" -[[package]] -name = "fnvhash" -version = "0.1.0" -description = "Pure Python FNV hash implementation" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "gitdb" version = "4.0.8" @@ -835,8 +826,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.44.8-py3-none-any.whl", hash = "sha256:6daf3a37d4670c8361a5245613526cb5786498f8d69e0ef52d0f3797ee69fc2d"}, - {file = "beet-0.44.8.tar.gz", hash = "sha256:8f971685a155d74d0461fbf9fe6432e7792c3283cc201235bdd8d0bd53d3c54e"}, + {file = "beet-0.45.0-py3-none-any.whl", hash = "sha256:9204b65be8e5fb2cc6f278c381a8c01b7b3ff02338175be2dc91ae9c51403c57"}, + {file = "beet-0.45.0.tar.gz", hash = "sha256:7c3a4a926aa3baa298c7f9185cf83118244ee8696b95bde6307b9d68084623d1"}, ] black = [ {file = "black-21.11b0-py3-none-any.whl", hash = "sha256:0b1f66cbfadcd332ceeaeecf6373d9991d451868d2e2219ad0ac1213fb701117"}, @@ -951,9 +942,6 @@ docutils = [ dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, ] -fnvhash = [ - {file = "fnvhash-0.1.0.tar.gz", hash = "sha256:3e82d505054f9f3987b2b5b649f7e7b6f48349f6af8a1b8e4d66779699c85a8e"}, -] gitdb = [ {file = "gitdb-4.0.8-py3-none-any.whl", hash = "sha256:6875cbaed01f1b750394f372607803768fc7dad7c58c7ceb5f5917e980d779b2"}, {file = "gitdb-4.0.8.tar.gz", hash = "sha256:858966a9310649cb24a387c101429bb5a1110068a312517722b0281077e78bc6"}, From 2e7e3bb8168def5764f602e091f000749146c768 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 25 Nov 2021 02:18:29 +0100 Subject: [PATCH 0487/1554] fix: forgot to explicitly export ImplicitExecuteNormalizer --- packages/mecha/mecha/contrib/implicit_execute.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/mecha/mecha/contrib/implicit_execute.py b/packages/mecha/mecha/contrib/implicit_execute.py index 7e28f73e0..129a48522 100644 --- a/packages/mecha/mecha/contrib/implicit_execute.py +++ b/packages/mecha/mecha/contrib/implicit_execute.py @@ -1,6 +1,11 @@ """Plugin that handles implicit execute commands.""" +__all__ = [ + "ImplicitExecuteNormalizer", +] + + from dataclasses import dataclass, replace from typing import Set, cast From af46d0f19ff8f09673793046fb7f0643a7c2c6ca Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 07:05:07 +0100 Subject: [PATCH 0488/1554] fix: use start() instead of pos when reporting invalid escape sequence position --- packages/mecha/mecha/utils.py | 12 ++++++++++-- ...__argument_examples_minecraft_nbt_tag_1_15__0.txt | 2 +- ...__argument_examples_minecraft_nbt_tag_1_16__0.txt | 2 +- ...e__argument_examples_minecraft_nbt_tag_1_1__0.txt | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 5a526ef85..5abe908ba 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -2,6 +2,7 @@ "QuoteHelper", "QuoteHelperWithUnicode", "InvalidEscapeSequence", + "normalize_whitespace", "string_to_number", "VersionNumber", "split_version", @@ -22,10 +23,17 @@ UNICODE_ESCAPE_REGEX = re.compile(r"\\(?:u([0-9a-fA-F]{4})|.)") AVOID_QUOTES_REGEX = re.compile(r"^[0-9A-Za-z_\.\+\-]+$") +WHITESPACE_REGEX = re.compile(r"\s+") + VersionNumber = Union[str, int, float, Tuple[Union[str, int], ...]] +def normalize_whitespace(op: str) -> str: + """Replace whitespace with underscores.""" + return WHITESPACE_REGEX.sub("_", op).strip("_") + + def string_to_number(string: str) -> Union[int, float]: """Helper for converting numbers to string and keeping their original type.""" return float(string) if "." in string else int(string) @@ -77,7 +85,7 @@ def unquote_string(self, token: Token) -> str: except InvalidEscapeSequence as exc: location = token.location.with_horizontal_offset(exc.index + 1) end_location = location.with_horizontal_offset(len(exc.characters)) - exc = InvalidSyntax(f"Invalid escape sequence {exc.characters!r}.") + exc = InvalidSyntax(f"Invalid escape sequence {exc.characters}.") raise set_location(exc, location, end_location) def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: @@ -90,7 +98,7 @@ def handle_substitution(self, token: Token, match: "re.Match[str]") -> str: try: return self.escape_sequences[characters] except KeyError: - raise InvalidEscapeSequence(characters, match.pos) from None + raise InvalidEscapeSequence(characters, match.start()) from None def quote_string(self, value: str, quote: str = '"') -> str: """Wrap the string in quotes if it can't be represented unquoted.""" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt index f078fba56..7e3986883 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_15__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 15 --- Reported 1 error. -line 1, column 2: Invalid escape sequence "\\'". \ No newline at end of file +line 1, column 2: Invalid escape sequence \'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt index ea0a4cdb3..3af0ec9e8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_16__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 16 --- Reported 1 error. -line 1, column 2: Invalid escape sequence '\\"'. \ No newline at end of file +line 1, column 2: Invalid escape sequence \". \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt index 887b17b6c..dbea3a582 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 1 --- Reported 1 error. -line 1, column 2: Invalid escape sequence '\\n'. \ No newline at end of file +line 1, column 2: Invalid escape sequence \n. \ No newline at end of file From 071376ba747c03b5d878d90d5da021d6ed32db71 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 07:05:37 +0100 Subject: [PATCH 0489/1554] feat: add standalone ResetSyntaxParser --- packages/mecha/mecha/parse.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 0b2184c42..f85af8123 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -60,6 +60,7 @@ "parse_particle", "AggregateParser", "SingleLineConstraint", + "ResetSyntaxParser", "NUMBER_PATTERN", ] @@ -1862,3 +1863,14 @@ class SingleLineConstraint: def __call__(self, stream: TokenStream) -> Any: with stream.intercept("newline"): return self.parser(stream) + + +@dataclass +class ResetSyntaxParser: + """Parser that resets the syntax rules before delegating to a subparser.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.reset_syntax(): + return self.parser(stream) From 1d8fca2fdd218b628f3565846b31c28d091fe1f8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 07:06:19 +0100 Subject: [PATCH 0490/1554] feat: export annotate_diagnostics utility --- .../mecha/contrib/annotate_diagnostics.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/contrib/annotate_diagnostics.py b/packages/mecha/mecha/contrib/annotate_diagnostics.py index 4f58ca6ab..f808eb3f6 100644 --- a/packages/mecha/mecha/contrib/annotate_diagnostics.py +++ b/packages/mecha/mecha/contrib/annotate_diagnostics.py @@ -1,24 +1,36 @@ """Plugin that inserts comments containing mecha diagnostics.""" +__all__ = [ + "annotate_diagnostics", +] + + from heapq import heappop, heappush from typing import Any, Dict, List, Tuple from beet import Context, TextFileBase -from mecha import Mecha +from mecha import CompilationDatabase, DiagnosticCollection, Mecha def beet_default(ctx: Context): mc = ctx.inject(Mecha) + annotate_diagnostics(mc.database, mc.diagnostics) + +def annotate_diagnostics( + database: CompilationDatabase, + diagnostics: DiagnosticCollection, +): + """Insert formatted error messages in the original source as comments.""" annotations: Dict[TextFileBase[Any], List[Tuple[int, int, List[str]]]] = {} - for diagnostic in mc.diagnostics.exceptions: + for diagnostic in diagnostics.exceptions: message = f"{diagnostic.level.upper():<7}{diagnostic.format_message()}\n{diagnostic.format_location()}" if diagnostic.file and not diagnostic.location.unknown: - if source := mc.database[diagnostic.file].source: + if source := database[diagnostic.file].source: if code := diagnostic.format_code(source): message += f"\n{code}" From 5649e9f0e8ac5f95608d210b1af530442ac13a2d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 07:06:36 +0100 Subject: [PATCH 0491/1554] chore: update tokenstream --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6cfcf0262..e0b7aac9d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -694,7 +694,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.2.3" +version = "1.2.6" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -808,7 +808,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "afdc19c8a660272403ec6b015a67f77d99ca033b3ca5f8809458f888167388e4" +content-hash = "040af9daacedb359dea8ca257921daf36c2e53c644d977810d858bd05eec84ac" [metadata.files] atomicwrites = [ @@ -1278,8 +1278,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.2.3-py3-none-any.whl", hash = "sha256:9e8f31608cc376b64256cb3bd533420f0fc9016dde91efdfb42c6a304b7c1f45"}, - {file = "tokenstream-1.2.3.tar.gz", hash = "sha256:4a7331632822a5ad13f8fc7d5f3de12571f2589e17b5f66e2089bcc65c5d0355"}, + {file = "tokenstream-1.2.6-py3-none-any.whl", hash = "sha256:a103cfa6434f856a45d24ab205867ba587304bc201b73cace996bcbde2002e98"}, + {file = "tokenstream-1.2.6.tar.gz", hash = "sha256:24dbed519a8bdeb66f800d6b88101a15a6d2cd64c354e0308caf6f2ff5e2e258"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 40f6df165..44601cfdf 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.44.9" -tokenstream = "^1.2.3" +tokenstream = "^1.2.6" [tool.poetry.dev-dependencies] black = "^21.11b1" From 997e016257bfd7c68690929d4f88f46e791447c7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 07:48:22 +0100 Subject: [PATCH 0492/1554] chore: update beet --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index e0b7aac9d..712938607 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.45.0" +version = "0.45.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -808,7 +808,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "040af9daacedb359dea8ca257921daf36c2e53c644d977810d858bd05eec84ac" +content-hash = "2a99dccbc2bc1194ec2a4c576a030fd0e8c6e3a39657acf1b42288f38226b816" [metadata.files] atomicwrites = [ @@ -824,8 +824,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.45.0-py3-none-any.whl", hash = "sha256:9204b65be8e5fb2cc6f278c381a8c01b7b3ff02338175be2dc91ae9c51403c57"}, - {file = "beet-0.45.0.tar.gz", hash = "sha256:7c3a4a926aa3baa298c7f9185cf83118244ee8696b95bde6307b9d68084623d1"}, + {file = "beet-0.45.1-py3-none-any.whl", hash = "sha256:d6ca9b67079f28515ed3e10c3f33afb3521547d8fe1e4af79eabd32c162ba1da"}, + {file = "beet-0.45.1.tar.gz", hash = "sha256:d9940003c054c43e4b0b8e152ca7f81c76f7fe438c99d5dc947aa8cbf45ff75c"}, ] black = [ {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 44601cfdf..939d02aae 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.44.9" +beet = ">=0.45.1" tokenstream = "^1.2.6" [tool.poetry.dev-dependencies] From fd547e9dc98924b2ebef8ade130e958cdc0c87b8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 10:00:08 +0100 Subject: [PATCH 0493/1554] fix: don't keep using the same rules when the node changes in mutating reducer --- packages/mecha/mecha/dispatch.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 6d4b45512..f9c59c68a 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -330,8 +330,18 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: if to_replace: node = replace(node, **to_replace) - for name, rule in self.dispatch(node): - with self.use_rule(node, name): - node = rule(node, *args, **kwargs) + exhausted = False + + while not exhausted: + exhausted = True + + for name, rule in self.dispatch(node): + with self.use_rule(node, name): + result = rule(node, *args, **kwargs) + + if result is not node: + exhausted = False + node = result + break return node From 75f06ae3bfd64ec48fce215a020dd9dec12b05b6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 12:07:42 +0100 Subject: [PATCH 0494/1554] fix: continuations are no longer allowed for nested execute --- .../src/data/demo/functions/foo.mcfunction | 10 +-- .../data/demo/functions/nesting.mcfunction | 16 +++- packages/mecha/mecha/contrib/nesting.py | 85 ++++++++----------- .../examples__build_kitchen_sink__0.pack.md | 8 ++ 4 files changed, 61 insertions(+), 58 deletions(-) diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction index 240e49bb9..5c3cb4d3c 100644 --- a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -32,11 +32,11 @@ execute as @a at @s setblock ~ ~-2 ~ stone execute - as @a - at @s - setblock ~ ~ ~ stone_pressure_plate - setblock ~ ~-1 ~ tnt - setblock ~ ~-2 ~ stone + execute as @a + execute at @s + setblock ~ ~ ~ stone_pressure_plate + setblock ~ ~-1 ~ tnt + setblock ~ ~-2 ~ stone execute as @a at @s expand say hello diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction index 01e728b08..8420488dc 100644 --- a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction @@ -18,9 +18,8 @@ as @a at @s expand say 1 say 2 -as @a at @s - if score @s tmp matches 1 - expand +as @a at @s expand + if score @s tmp matches 1 expand say 1 say 2 @@ -29,3 +28,14 @@ as @a at @s if data storage imp:temp iter.words.remaining[] function ./nesting/loop say wow if data storage imp:temp iter.words.remaining[] function ./nesting/loop + + +if score @s tmp matches 0 + at @e[type=pig] setblock ~ ~ ~ stone + at @e[type=sheep] setblock ~ ~ ~ dirt + + +if score @s tmp matches 0 + at @e[type=pig] + unless entity @e[type=sheep] + setblock ~ ~ ~ dirt diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 325378b32..a2785613c 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -10,7 +10,7 @@ from dataclasses import dataclass, replace -from typing import Any, List, Set, cast +from typing import Any, List, cast from beet import Context, Function from beet.core.utils import required_field @@ -87,18 +87,7 @@ def beet_default(ctx: Context): mc.spec.parsers["nested_root"] = parse_nested_root mc.spec.parsers["command:argument:mecha:nested_root"] = delegate("nested_root") - - if execute := mc.spec.tree.get("execute"): - clauses = { - literal - for literal, tree in execute.get_all_literals() - if tree.redirect is None - } - - mc.spec.parsers["command"] = NestedExecuteParser( - parser=mc.spec.parsers["command"], - clauses=clauses, - ) + mc.spec.parsers["command"] = NestedExecuteParser(parser=mc.spec.parsers["command"]) mc.transform.extend(NestedCommandsTransformer(ctx=ctx, database=mc.database)) @@ -137,34 +126,19 @@ class NestedExecuteParser: """Parser for nested execute.""" parser: Parser - clauses: Set[str] def __call__(self, stream: TokenStream) -> Any: scope = get_stream_scope(stream) - if scope != ("execute",): - return self.parser(stream) - - nested = False + if scope == ("execute",): + with stream.checkpoint(), stream.intercept("indent"): + indent = stream.get("indent") - with stream.checkpoint(), stream.intercept("indent"): - stream.expect("indent") - token = stream.get("literal") - nested = not token or token.value not in self.clauses + if indent: + node = delegate("nested_root", stream) + return set_location(AstNestedExecute(root=node), node) - if not nested: - return self.parser(stream) - - node = delegate("nested_root", stream) - - if len(node.commands) == 1: - subcommand = AstCommand( - identifier="execute:run:subcommand", - arguments=AstChildren([node.commands[0]]), - ) - return set_location(subcommand, node) - else: - return set_location(AstNestedExecute(root=node), node) + return self.parser(stream) @dataclass @@ -204,22 +178,30 @@ def nested_function(self, node: AstCommand): def nested_execute(self, node: AstNestedExecute): generate = self.ctx.generate["nested_execute"] - if path := self.database[self.database.current].resource_location: - path = generate.format(path + "/nested_execute_{incr}") + if len(node.root.commands) == 1: + subcommand = node.root.commands[0] + + if subcommand.identifier == "execute:subcommand": + return subcommand.arguments[0] + else: - path = generate.path() + if path := self.database[self.database.current].resource_location: + path = generate.format(path + "/nested_execute_{incr}") + else: + path = generate.path() - self.emit_function(path, node.root) + self.emit_function(path, node.root) - resource_location = AstResourceLocation.from_value(path) + resource_location = AstResourceLocation.from_value(path) + + subcommand = AstCommand( + identifier="function:name", + arguments=AstChildren([cast(AstNode, resource_location)]), + ) - function_call = AstCommand( - identifier="function:name", - arguments=AstChildren([cast(AstNode, resource_location)]), - ) return AstCommand( identifier="execute:run:subcommand", - arguments=AstChildren([cast(AstNode, function_call)]), + arguments=AstChildren([cast(AstNode, subcommand)]), ) @rule(AstRoot) @@ -241,11 +223,14 @@ def execute_expand(self, node: AstRoot): if expand: for nested_command in cast(AstRoot, expand.arguments[0]).commands: - expansion = AstCommand( - identifier="execute:run:subcommand", - arguments=AstChildren([cast(AstNode, nested_command)]), - ) - expansion = set_location(expansion, nested_command) + if nested_command.identifier == "execute:subcommand": + expansion = cast(AstCommand, nested_command.arguments[0]) + else: + expansion = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([cast(AstNode, nested_command)]), + ) + expansion = set_location(expansion, nested_command) for prefix in reversed(stack): args = AstChildren([*prefix.arguments[:-1], expansion]) diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 60dabc35c..845c952ef 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -36,6 +36,8 @@ execute as @a at @s run say 2 execute as @a at @s if score @s tmp matches 1 run say 1 execute as @a at @s if score @s tmp matches 1 run say 2 execute if data storage imp:temp iter.words.remaining[] run function demo:nesting/loop +execute if score @s tmp matches 0 run function demo:nesting/nested_execute_2 +execute if score @s tmp matches 0 at @e[type=pig] unless entity @e[type=sheep] run setblock ~ ~ ~ dirt ``` `@function demo:nesting/nested_execute_0` @@ -60,3 +62,9 @@ say this is a test say wow execute if data storage imp:temp iter.words.remaining[] run function demo:nesting/loop ``` +`@function demo:nesting/nested_execute_2` + +```mcfunction +execute at @e[type=pig] run setblock ~ ~ ~ stone +execute at @e[type=sheep] run setblock ~ ~ ~ dirt +``` From aaa0318cb00870a09e9dc50d288c10f9cfcda42d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 26 Nov 2021 12:16:08 +0100 Subject: [PATCH 0495/1554] feat: start working on scripting --- .../mecha/mecha/contrib/scripting/__init__.py | 3 + packages/mecha/mecha/contrib/scripting/ast.py | 60 ++++ .../mecha/mecha/contrib/scripting/parse.py | 312 ++++++++++++++++++ .../mecha/mecha/contrib/scripting/plugin.py | 92 ++++++ packages/mecha/mecha/resources/__init__.py | 11 + .../resources/scripting_examples.mcfunction | 137 ++++++++ .../tests/snapshots/scripting__parse_0__0.txt | 13 + .../snapshots/scripting__parse_10__0.txt | 38 +++ .../snapshots/scripting__parse_11__0.txt | 38 +++ .../snapshots/scripting__parse_12__0.txt | 48 +++ .../snapshots/scripting__parse_13__0.txt | 43 +++ .../snapshots/scripting__parse_14__0.txt | 43 +++ .../snapshots/scripting__parse_15__0.txt | 33 ++ .../snapshots/scripting__parse_16__0.txt | 153 +++++++++ .../snapshots/scripting__parse_17__0.txt | 238 +++++++++++++ .../snapshots/scripting__parse_18__0.txt | 5 + .../snapshots/scripting__parse_19__0.txt | 5 + .../tests/snapshots/scripting__parse_1__0.txt | 13 + .../snapshots/scripting__parse_20__0.txt | 33 ++ .../snapshots/scripting__parse_21__0.txt | 13 + .../snapshots/scripting__parse_22__0.txt | 13 + .../snapshots/scripting__parse_23__0.txt | 13 + .../snapshots/scripting__parse_24__0.txt | 13 + .../snapshots/scripting__parse_25__0.txt | 13 + .../snapshots/scripting__parse_26__0.txt | 13 + .../snapshots/scripting__parse_27__0.txt | 5 + .../snapshots/scripting__parse_28__0.txt | 5 + .../snapshots/scripting__parse_29__0.txt | 13 + .../tests/snapshots/scripting__parse_2__0.txt | 13 + .../snapshots/scripting__parse_30__0.txt | 5 + .../snapshots/scripting__parse_31__0.txt | 5 + .../snapshots/scripting__parse_32__0.txt | 31 ++ .../snapshots/scripting__parse_33__0.txt | 41 +++ .../snapshots/scripting__parse_34__0.txt | 63 ++++ .../snapshots/scripting__parse_35__0.txt | 88 +++++ .../snapshots/scripting__parse_36__0.txt | 12 + .../snapshots/scripting__parse_37__0.txt | 13 + .../snapshots/scripting__parse_38__0.txt | 4 + .../snapshots/scripting__parse_39__0.txt | 4 + .../tests/snapshots/scripting__parse_3__0.txt | 13 + .../snapshots/scripting__parse_40__0.txt | 7 + .../snapshots/scripting__parse_41__0.txt | 30 ++ .../snapshots/scripting__parse_42__0.txt | 104 ++++++ .../snapshots/scripting__parse_43__0.txt | 68 ++++ .../snapshots/scripting__parse_44__0.txt | 84 +++++ .../snapshots/scripting__parse_45__0.txt | 58 ++++ .../snapshots/scripting__parse_46__0.txt | 114 +++++++ .../snapshots/scripting__parse_47__0.txt | 32 ++ .../snapshots/scripting__parse_48__0.txt | 7 + .../tests/snapshots/scripting__parse_4__0.txt | 13 + .../tests/snapshots/scripting__parse_5__0.txt | 23 ++ .../tests/snapshots/scripting__parse_6__0.txt | 23 ++ .../tests/snapshots/scripting__parse_7__0.txt | 33 ++ .../tests/snapshots/scripting__parse_8__0.txt | 33 ++ .../tests/snapshots/scripting__parse_9__0.txt | 28 ++ packages/mecha/tests/test_scripting.py | 41 +++ 56 files changed, 2409 insertions(+) create mode 100644 packages/mecha/mecha/contrib/scripting/__init__.py create mode 100644 packages/mecha/mecha/contrib/scripting/ast.py create mode 100644 packages/mecha/mecha/contrib/scripting/parse.py create mode 100644 packages/mecha/mecha/contrib/scripting/plugin.py create mode 100644 packages/mecha/mecha/resources/scripting_examples.mcfunction create mode 100644 packages/mecha/tests/snapshots/scripting__parse_0__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_10__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_11__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_12__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_13__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_14__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_15__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_16__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_17__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_18__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_19__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_1__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_20__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_21__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_22__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_23__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_24__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_25__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_26__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_27__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_28__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_29__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_2__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_30__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_31__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_32__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_33__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_34__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_35__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_36__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_37__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_38__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_39__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_3__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_40__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_41__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_42__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_43__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_44__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_45__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_46__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_47__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_48__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_4__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_5__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_6__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_7__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_8__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_9__0.txt create mode 100644 packages/mecha/tests/test_scripting.py diff --git a/packages/mecha/mecha/contrib/scripting/__init__.py b/packages/mecha/mecha/contrib/scripting/__init__.py new file mode 100644 index 000000000..dc6e15135 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/__init__.py @@ -0,0 +1,3 @@ +from .ast import * +from .parse import * +from .plugin import * diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py new file mode 100644 index 000000000..8a32d7a35 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -0,0 +1,60 @@ +__all__ = [ + "AstExpression", + "AstExpressionBinary", + "AstExpressionUnary", + "AstValue", + "AstIdentifier", + "AstAssignment", +] + + +from dataclasses import dataclass +from typing import Any + +from beet.core.utils import required_field + +from mecha import AstNode + + +@dataclass(frozen=True) +class AstExpression(AstNode): + """Base ast node for expressions.""" + + +@dataclass(frozen=True) +class AstExpressionBinary(AstExpression): + """Ast expression binary node.""" + + operator: str = required_field() + left: AstExpression = required_field() + right: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstExpressionUnary(AstExpression): + """Ast expression unary node.""" + + operator: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstValue(AstExpression): + """Ast value node.""" + + value: Any = required_field() + + +@dataclass(frozen=True) +class AstIdentifier(AstExpression): + """Ast identifier node.""" + + value: str = required_field() + + +@dataclass(frozen=True) +class AstAssignment(AstNode): + """Ast assignment node.""" + + left: AstIdentifier = required_field() + right: AstExpression = required_field() diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py new file mode 100644 index 000000000..c87483138 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -0,0 +1,312 @@ +__all__ = [ + "get_scripting_parsers", + "get_stream_identifiers", + "UndefinedIdentifier", + "parse_statement", + "IfElseConstraint", + "BinaryParser", + "UnaryParser", + "AtomParser", +] + + +from dataclasses import dataclass, field +from difflib import get_close_matches +from typing import Any, Dict, List, Set + +from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location + +from mecha import AstRoot, Parser, ResetSyntaxParser, delegate +from mecha.utils import ( + QuoteHelper, + QuoteHelperWithUnicode, + normalize_whitespace, + string_to_number, +) + +from .ast import ( + AstAssignment, + AstExpressionBinary, + AstExpressionUnary, + AstIdentifier, + AstValue, +) + +IDENTIFIER_PATTERN: str = r"[a-zA-Z_][a-zA-Z0-9_]*" + + +def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: + """Return the scripting parsers.""" + parsers = { + "root": IfElseConstraint(parsers["root"]), + "nested_root": IfElseConstraint(parsers["nested_root"]), + "scripting:statement": parse_statement, + "scripting:expression": delegate("scripting:disjunction"), + "scripting:disjunction": BinaryParser( + operators=[r"\bor\b"], + parser=delegate("scripting:conjunction"), + ), + "scripting:conjunction": BinaryParser( + operators=[r"\band\b"], + parser=delegate("scripting:inversion"), + ), + "scripting:inversion": UnaryParser( + operators=[r"\bnot\b"], + parser=delegate("scripting:comparison"), + ), + "scripting:comparison": BinaryParser( + operators=[ + "==", + "!=", + "<=", + "<", + ">=", + ">", + r"\bnot\s+in\b", + r"\bin\b", + r"\bis\s+not\b", + r"\bis\b", + ], + parser=delegate("scripting:bitwise_or"), + ), + "scripting:bitwise_or": BinaryParser( + operators=[r"\|"], + parser=delegate("scripting:bitwise_xor"), + ), + "scripting:bitwise_xor": BinaryParser( + operators=[r"\^"], + parser=delegate("scripting:bitwise_and"), + ), + "scripting:bitwise_and": BinaryParser( + operators=["&"], + parser=delegate("scripting:shift_expr"), + ), + "scripting:shift_expr": BinaryParser( + operators=["<<", ">>"], + parser=delegate("scripting:sum"), + ), + "scripting:sum": BinaryParser( + operators=[r"\+", "-"], + parser=delegate("scripting:term"), + ), + "scripting:term": BinaryParser( + operators=[r"\*", "//", "/", "%"], + parser=delegate("scripting:factor"), + ), + "scripting:factor": UnaryParser( + operators=[r"\+", "-", "~"], + parser=delegate("scripting:power"), + ), + "scripting:power": BinaryParser( + operators=[r"\*\*"], + parser=delegate("scripting:primary"), + right_associative=True, + ), + "scripting:primary": delegate("scripting:atom"), + "scripting:atom": AtomParser(), + } + + for arg in ["scripting:statement", "scripting:expression"]: + parsers[f"command:argument:mecha:{arg}"] = ResetSyntaxParser(delegate(arg)) + + return parsers + + +def get_stream_identifiers(stream: TokenStream) -> Set[str]: + """Return the set of accessible identifiers currently associated with the token stream.""" + return stream.data.setdefault("identifiers", set()) + + +class UndefinedIdentifier(UnexpectedToken): + """Raised when an identifier is not defined.""" + + identifiers: Set[str] + + def __init__(self, token: Token, identifiers: Set[str]): + super().__init__(token) + self.identifiers = identifiers + + def __str__(self) -> str: + msg = f"Identifier {self.token.value!r} is not defined." + + if matches := get_close_matches(self.token.value, self.identifiers): + matches = [repr(m) for m in matches] + + if len(matches) == 1: + suggestion = f"{matches[0]}" + else: + *head, before_last, last = matches + suggestion = ", ".join(head + [f"{before_last} or {last}"]) + + msg += f" Did you mean {suggestion}?" + + return msg + + +def parse_statement(stream: TokenStream) -> Any: + """Parse statement.""" + identifiers = get_stream_identifiers(stream) + + with stream.syntax( + equal=r"=", + identifier=IDENTIFIER_PATTERN, + ): + with stream.checkpoint() as commit: + token = stream.expect("identifier") + stream.expect("equal") + commit() + + identifier = set_location(AstIdentifier(value=token.value), token) + expression = delegate("scripting:expression", stream) + + identifiers.add(identifier.value) + + node = AstAssignment(left=identifier, right=expression) + node = set_location(node, identifier, expression) + + if commit.rollback: + node = delegate("scripting:expression", stream) + + return node + + +@dataclass +class IfElseConstraint: + """Constraint that makes sure that if statements are properly formed.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> AstRoot: + node: AstRoot = self.parser(stream) + + previous = "" + + for command in node.commands: + if command.identifier in ["elif:condition:body", "else:body"]: + if previous not in ["if:condition:body", "elif:condition:body"]: + exc = InvalidSyntax( + "Conditional branch must be part of an if statement." + ) + raise set_location(exc, command) + previous = command.identifier + + return node + + +@dataclass +class BinaryParser: + """Parser for binary expressions.""" + + operators: List[str] + parser: Parser + right_associative: bool = False + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(operator="|".join(self.operators)): + nodes = [self.parser(stream)] + operations: List[str] = [] + + for op in stream.collect("operator"): + nodes.append(self.parser(stream)) + operations.append(normalize_whitespace(op.value)) + + if self.right_associative: + result = nodes[-1] + nodes = nodes[-2::-1] + operations = operations[::-1] + else: + result = nodes[0] + nodes = nodes[1:] + + for op, node in zip(operations, nodes): + if self.right_associative: + result, node = node, result + result = AstExpressionBinary(operator=op, left=result, right=node) + result = set_location(result, result.left, result.right) + + return result + + +@dataclass +class UnaryParser: + """Parser for unary expressions.""" + + operators: List[str] + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(operator="|".join(self.operators)): + if op := stream.get("operator"): + operator = normalize_whitespace(op.value) + node = AstExpressionUnary(operator=operator, value=self(stream)) + return set_location(node, op, node.value) + return self.parser(stream) + + +@dataclass +class AtomParser: + """Parser for atoms.""" + + quote_helper: QuoteHelper = field( + default_factory=lambda: QuoteHelperWithUnicode( + escape_sequences={ + r"\\": "\\", + r"\f": "\f", + r"\n": "\n", + r"\r": "\r", + r"\t": "\t", + } + ) + ) + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + + with stream.syntax( + brace=r"\(|\)", + true=r"\bTrue\b", + false=r"\bFalse\b", + none=r"\bNone\b", + identifier=IDENTIFIER_PATTERN, + string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", + number=r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b", + ): + brace, true, false, none, identifier, string, number = stream.expect( + ("brace", "("), + "true", + "false", + "none", + "identifier", + "string", + "number", + ) + + if brace: + with stream.ignore("newline"): + inner = delegate("scripting:expression", stream) + stream.expect(("brace", ")")) + return inner + + if identifier: + if ( + stream.data.get("check_identifiers", True) + and identifier.value not in identifiers + ): + stream.index -= 1 + exc = UndefinedIdentifier(identifier, identifiers) + raise set_location(exc, identifier) + return set_location(AstIdentifier(value=identifier.value), identifier) + + if true: + value = True + elif false: + value = False + elif none: + value = None + elif string: + value = self.quote_helper.unquote_string(string) + elif number: + value = string_to_number(number.value) + + node = AstValue(value=value) # type: ignore + return set_location(node, stream.current) diff --git a/packages/mecha/mecha/contrib/scripting/plugin.py b/packages/mecha/mecha/contrib/scripting/plugin.py new file mode 100644 index 000000000..2e120f020 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/plugin.py @@ -0,0 +1,92 @@ +__all__ = [ + "beet_default", +] + + +from beet import Context + +from mecha import Mecha + +from .parse import get_scripting_parsers + +COMMAND_TREE = { + "type": "root", + "children": { + "statement": { + "type": "argument", + "parser": "mecha:scripting:statement", + "executable": True, + }, + "if": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + } + }, + }, + "elif": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + } + }, + }, + "else": { + "type": "literal", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + }, + "while": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + } + }, + }, + }, +} + + +def beet_default(ctx: Context): + ctx.require( + "mecha.contrib.relative_location", + "mecha.contrib.implicit_execute", + "mecha.contrib.nesting", + ) + + mc = ctx.inject(Mecha) + + mc.spec.add_commands(COMMAND_TREE) + mc.spec.parsers.update(get_scripting_parsers(mc.spec.parsers)) diff --git a/packages/mecha/mecha/resources/__init__.py b/packages/mecha/mecha/resources/__init__.py index 2cf8d0d00..bab7305cf 100644 --- a/packages/mecha/mecha/resources/__init__.py +++ b/packages/mecha/mecha/resources/__init__.py @@ -2,11 +2,13 @@ "get_argument_examples", "get_command_examples", "get_multiline_command_examples", + "get_scripting_examples", ] import json from importlib.resources import read_text +from typing import List from beet import Function from beet.core.utils import JsonDict @@ -24,3 +26,12 @@ def get_multiline_command_examples() -> Function: return Function( read_text("mecha.resources", "multiline_command_examples.mcfunction") ) + + +def get_scripting_examples() -> List[Function]: + return [ + Function(source) + for source in read_text( + "mecha.resources", "scripting_examples.mcfunction" + ).split("###\n") + ] diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction new file mode 100644 index 000000000..cb93fe4dd --- /dev/null +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -0,0 +1,137 @@ +0 +### +123 +### +123.456 +### +22220099.6667e-3 +### +0.67e6 +### +1 + 2 +### +1 - 2 +### +1 - 2 + 3 +### +1 - (2 + 3) +### +2 + -54 +### +2 + -54 * 10 +### +(2 + -54) * 10 +### +---64+++64 +### +1 * 2 / 3 * 4 +### +1 * 2 / (3 * 4) +### +16 // 5 % 7 +### +-2 ** 3 + ~4 * 5 // 6 / 7 % 9 + 10 - 11 << 12 >> 13 & 14 ^ 15 | 16 +### +False or True and "hello" or not "foo" == "bar" or 1 != 2 and 1 < 2 and 2 <= 3 and 5 > 4 and 6 >= 5 and 1 in 1 and 2 not in 2 and 3 is 3 and 3 is not 3 +### +64 §§§ +### +17 % %3 +### +True and (False or True) +### +"this" +### +"this\nthat" +### +"\"\u2588this\nthat" +### +'' +### +'"\'"' +### +'something \t\f\n\\\'here' +### +'abc\"' +### +"hey" "hey" +### +None +### +foo +### +"hello" + foo +### +foo = 1 +foo +### +foo = 1 +"hello" + foo +### +a = 1 +if a == 1 + a = 0 +### +if True + say hello +elif True or False + say hello +else + say hello +### +if True + say hello +elif True or False + say hello +else "blah" + say hello +### +if True + say hello +a = 1 +else + say hello +### +if +### +if True and +### +if True +say hello +### +while True + say hello +### +if score @s tmp matches 0 + if "thing" == "bar" + say hello + if "thing" == "foo" + say hello +### +if score @s tmp matches 0 + if "thing" == "foo" + say hello +### +if score @s tmp matches 0 + while True + say hello + while True + say hello +### +if score @s tmp matches 0 + while True + say hello +### +if score @s tmp matches 42 + count = 42 + while count > 0 + say hello + count = count - 1 +### +foo = ( + "abc" + + "def" +) +### +1 * 2 +* 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_0__0.txt b/packages/mecha/tests/snapshots/scripting__parse_0__0.txt new file mode 100644 index 000000000..923aec9d5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_0__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_10__0.txt b/packages/mecha/tests/snapshots/scripting__parse_10__0.txt new file mode 100644 index 000000000..c40b9dabe --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_10__0.txt @@ -0,0 +1,38 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 2 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '*' + left: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 54 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 10 diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__0.txt b/packages/mecha/tests/snapshots/scripting__parse_11__0.txt new file mode 100644 index 000000000..1fc33b920 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_11__0.txt @@ -0,0 +1,38 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '*' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '+' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 2 + right: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '-' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 54 + right: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 10 diff --git a/packages/mecha/tests/snapshots/scripting__parse_12__0.txt b/packages/mecha/tests/snapshots/scripting__parse_12__0.txt new file mode 100644 index 000000000..5bc748c8c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_12__0.txt @@ -0,0 +1,48 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 64 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 64 diff --git a/packages/mecha/tests/snapshots/scripting__parse_13__0.txt b/packages/mecha/tests/snapshots/scripting__parse_13__0.txt new file mode 100644 index 000000000..39d410b48 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_13__0.txt @@ -0,0 +1,43 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '/' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 3 + right: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 4 diff --git a/packages/mecha/tests/snapshots/scripting__parse_14__0.txt b/packages/mecha/tests/snapshots/scripting__parse_14__0.txt new file mode 100644 index 000000000..66b2eb6fb --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_14__0.txt @@ -0,0 +1,43 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '/' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '*' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 3 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 4 diff --git a/packages/mecha/tests/snapshots/scripting__parse_15__0.txt b/packages/mecha/tests/snapshots/scripting__parse_15__0.txt new file mode 100644 index 000000000..afbc460f5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_15__0.txt @@ -0,0 +1,33 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '%' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '//' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 16 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 5 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_16__0.txt b/packages/mecha/tests/snapshots/scripting__parse_16__0.txt new file mode 100644 index 000000000..fb5292f9f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_16__0.txt @@ -0,0 +1,153 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + operator: '^' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + operator: '&' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + operator: '>>' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + operator: '<<' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '**' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 2 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 3 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + operator: '%' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '/' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + operator: '//' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + operator: '*' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '~' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 4 + right: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 5 + right: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 6 + right: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 7 + right: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + value: 9 + right: + + location: SourceLocation(pos=32, lineno=1, colno=33) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + value: 10 + right: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 11 + right: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + value: 12 + right: + + location: SourceLocation(pos=49, lineno=1, colno=50) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: 13 + right: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + value: 14 + right: + + location: SourceLocation(pos=59, lineno=1, colno=60) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + value: 15 + right: + + location: SourceLocation(pos=64, lineno=1, colno=65) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + value: 16 diff --git a/packages/mecha/tests/snapshots/scripting__parse_17__0.txt b/packages/mecha/tests/snapshots/scripting__parse_17__0.txt new file mode 100644 index 000000000..aaab05888 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_17__0.txt @@ -0,0 +1,238 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=152, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: False + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: 'and' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: True + right: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'hello' + right: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: 'not' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'foo' + right: + + location: SourceLocation(pos=42, lineno=1, colno=43) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + value: 'bar' + right: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + operator: '!=' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=52, lineno=1, colno=53) + value: 1 + right: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 2 + right: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + operator: '<' + left: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=63, lineno=1, colno=64) + value: 1 + right: + + location: SourceLocation(pos=66, lineno=1, colno=67) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + value: 2 + right: + + location: SourceLocation(pos=72, lineno=1, colno=73) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + operator: '<=' + left: + + location: SourceLocation(pos=72, lineno=1, colno=73) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + value: 2 + right: + + location: SourceLocation(pos=77, lineno=1, colno=78) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + value: 3 + right: + + location: SourceLocation(pos=83, lineno=1, colno=84) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + operator: '>' + left: + + location: SourceLocation(pos=83, lineno=1, colno=84) + end_location: SourceLocation(pos=84, lineno=1, colno=85) + value: 5 + right: + + location: SourceLocation(pos=87, lineno=1, colno=88) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + value: 4 + right: + + location: SourceLocation(pos=93, lineno=1, colno=94) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + operator: '>=' + left: + + location: SourceLocation(pos=93, lineno=1, colno=94) + end_location: SourceLocation(pos=94, lineno=1, colno=95) + value: 6 + right: + + location: SourceLocation(pos=98, lineno=1, colno=99) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + value: 5 + right: + + location: SourceLocation(pos=104, lineno=1, colno=105) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + operator: 'in' + left: + + location: SourceLocation(pos=104, lineno=1, colno=105) + end_location: SourceLocation(pos=105, lineno=1, colno=106) + value: 1 + right: + + location: SourceLocation(pos=109, lineno=1, colno=110) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + value: 1 + right: + + location: SourceLocation(pos=115, lineno=1, colno=116) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + operator: 'not_in' + left: + + location: SourceLocation(pos=115, lineno=1, colno=116) + end_location: SourceLocation(pos=116, lineno=1, colno=117) + value: 2 + right: + + location: SourceLocation(pos=124, lineno=1, colno=125) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + value: 2 + right: + + location: SourceLocation(pos=130, lineno=1, colno=131) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + operator: 'is' + left: + + location: SourceLocation(pos=130, lineno=1, colno=131) + end_location: SourceLocation(pos=131, lineno=1, colno=132) + value: 3 + right: + + location: SourceLocation(pos=135, lineno=1, colno=136) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + value: 3 + right: + + location: SourceLocation(pos=141, lineno=1, colno=142) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'is_not' + left: + + location: SourceLocation(pos=141, lineno=1, colno=142) + end_location: SourceLocation(pos=142, lineno=1, colno=143) + value: 3 + right: + + location: SourceLocation(pos=150, lineno=1, colno=151) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_18__0.txt b/packages/mecha/tests/snapshots/scripting__parse_18__0.txt new file mode 100644 index 000000000..836723a41 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_18__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected newline or eof but got literal '§§§'. +# line 1, column 4 +# 1 | 64 §§§ +# : ^^^ +64 §§§ diff --git a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt new file mode 100644 index 000000000..e53f85493 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected brace '(', true, false, none, identifier, string or number but got invalid '%3'. +# line 1, column 6 +# 1 | 17 % %3 +# : ^^ +17 % %3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_1__0.txt b/packages/mecha/tests/snapshots/scripting__parse_1__0.txt new file mode 100644 index 000000000..57d06bed6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_1__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 123 diff --git a/packages/mecha/tests/snapshots/scripting__parse_20__0.txt b/packages/mecha/tests/snapshots/scripting__parse_20__0.txt new file mode 100644 index 000000000..37cc6f198 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_20__0.txt @@ -0,0 +1,33 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: 'and' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: 'or' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: False + right: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: True diff --git a/packages/mecha/tests/snapshots/scripting__parse_21__0.txt b/packages/mecha/tests/snapshots/scripting__parse_21__0.txt new file mode 100644 index 000000000..30e640d7b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_21__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'this' diff --git a/packages/mecha/tests/snapshots/scripting__parse_22__0.txt b/packages/mecha/tests/snapshots/scripting__parse_22__0.txt new file mode 100644 index 000000000..b26ece9e5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_22__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'this\nthat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_23__0.txt b/packages/mecha/tests/snapshots/scripting__parse_23__0.txt new file mode 100644 index 000000000..10d37ede1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_23__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: '"█this\nthat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_24__0.txt b/packages/mecha/tests/snapshots/scripting__parse_24__0.txt new file mode 100644 index 000000000..37b77b372 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_24__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: '' diff --git a/packages/mecha/tests/snapshots/scripting__parse_25__0.txt b/packages/mecha/tests/snapshots/scripting__parse_25__0.txt new file mode 100644 index 000000000..4750b7ed6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_25__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: '"\'"' diff --git a/packages/mecha/tests/snapshots/scripting__parse_26__0.txt b/packages/mecha/tests/snapshots/scripting__parse_26__0.txt new file mode 100644 index 000000000..7beda8f1d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_26__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: "something \t\x0c\n\\'here" diff --git a/packages/mecha/tests/snapshots/scripting__parse_27__0.txt b/packages/mecha/tests/snapshots/scripting__parse_27__0.txt new file mode 100644 index 000000000..c8a617445 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_27__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid escape sequence \". +# line 1, column 5 +# 1 | 'abc\"' +# : ^^ +'abc\"' diff --git a/packages/mecha/tests/snapshots/scripting__parse_28__0.txt b/packages/mecha/tests/snapshots/scripting__parse_28__0.txt new file mode 100644 index 000000000..afbff79c1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_28__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected newline or eof but got literal '"hey"'. +# line 1, column 7 +# 1 | "hey" "hey" +# : ^^^^^ +"hey" "hey" diff --git a/packages/mecha/tests/snapshots/scripting__parse_29__0.txt b/packages/mecha/tests/snapshots/scripting__parse_29__0.txt new file mode 100644 index 000000000..e5cb679fa --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_29__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: None diff --git a/packages/mecha/tests/snapshots/scripting__parse_2__0.txt b/packages/mecha/tests/snapshots/scripting__parse_2__0.txt new file mode 100644 index 000000000..cb278d819 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_2__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 123.456 diff --git a/packages/mecha/tests/snapshots/scripting__parse_30__0.txt b/packages/mecha/tests/snapshots/scripting__parse_30__0.txt new file mode 100644 index 000000000..ba1c6fcd8 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_30__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 83 other tokens but got literal 'foo'. +# line 1, column 1 +# 1 | foo +# : ^^^ +foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_31__0.txt b/packages/mecha/tests/snapshots/scripting__parse_31__0.txt new file mode 100644 index 000000000..a9a51d480 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_31__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 11 +# 1 | "hello" + foo +# : ^^^ +"hello" + foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__0.txt b/packages/mecha/tests/snapshots/scripting__parse_32__0.txt new file mode 100644 index 000000000..4be84492a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_32__0.txt @@ -0,0 +1,31 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__0.txt b/packages/mecha/tests/snapshots/scripting__parse_33__0.txt new file mode 100644 index 000000000..df8004348 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_33__0.txt @@ -0,0 +1,41 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + value: 'hello' + right: + + location: SourceLocation(pos=18, lineno=2, colno=11) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt new file mode 100644 index 000000000..a084c5160 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt @@ -0,0 +1,63 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=4) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + operator: '==' + left: + + location: SourceLocation(pos=9, lineno=2, colno=4) + end_location: SourceLocation(pos=10, lineno=2, colno=5) + value: 'a' + right: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: 1 + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + commands: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + left: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=21, lineno=3, colno=6) + value: 'a' + right: + + location: SourceLocation(pos=24, lineno=3, colno=9) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt new file mode 100644 index 000000000..9c903aae2 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt @@ -0,0 +1,88 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: True + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=22, lineno=3, colno=1) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + identifier: 'elif:condition:body' + arguments: + + location: SourceLocation(pos=27, lineno=3, colno=6) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + operator: 'or' + left: + + location: SourceLocation(pos=27, lineno=3, colno=6) + end_location: SourceLocation(pos=31, lineno=3, colno=10) + value: True + right: + + location: SourceLocation(pos=35, lineno=3, colno=14) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + value: False + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + commands: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + fragments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + value: 'hello' + + location: SourceLocation(pos=55, lineno=5, colno=1) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=64, lineno=6, colno=5) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=64, lineno=6, colno=5) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_36__0.txt b/packages/mecha/tests/snapshots/scripting__parse_36__0.txt new file mode 100644 index 000000000..219af3dc1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_36__0.txt @@ -0,0 +1,12 @@ +if True + say hello +elif True or False + say hello +#>ERROR Expected indent but got literal '"blah"'. +# line 5, column 6 +# 4 | say hello +# 5 | else "blah" +# : ^^^^^^ +# 6 | say hello +else "blah" + say hello diff --git a/packages/mecha/tests/snapshots/scripting__parse_37__0.txt b/packages/mecha/tests/snapshots/scripting__parse_37__0.txt new file mode 100644 index 000000000..d68a5ed80 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_37__0.txt @@ -0,0 +1,13 @@ +if True + say hello +a = 1 +#>ERROR Conditional branch must be part of an if statement. +# line 4, column 1 +# 2 | say hello +# 3 | a = 1 +# 4 | else +# : ^^^^ +# 5 | say hello +# : ^^^^^^^^^ +else + say hello diff --git a/packages/mecha/tests/snapshots/scripting__parse_38__0.txt b/packages/mecha/tests/snapshots/scripting__parse_38__0.txt new file mode 100644 index 000000000..36b3119df --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_38__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected literal 'block', literal 'score', literal 'blocks', literal 'entity', literal 'predicate' or literal 'data' but got newline '\n'. +# line 1, column 3 +# 1 | if +if diff --git a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt new file mode 100644 index 000000000..5318bc27e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected brace '(', true, false, none, identifier, string or number but got newline '\n'. +# line 1, column 12 +# 1 | if True and +if True and diff --git a/packages/mecha/tests/snapshots/scripting__parse_3__0.txt b/packages/mecha/tests/snapshots/scripting__parse_3__0.txt new file mode 100644 index 000000000..00a3b8fff --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_3__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 22220.0996667 diff --git a/packages/mecha/tests/snapshots/scripting__parse_40__0.txt b/packages/mecha/tests/snapshots/scripting__parse_40__0.txt new file mode 100644 index 000000000..5f45018e9 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_40__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected indent but got newline '\n'. +# line 1, column 8 +# 1 | if True +# 2 | say hello +# : ^ +if True +say hello diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt new file mode 100644 index 000000000..3a8d2525d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt @@ -0,0 +1,30 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: True + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt new file mode 100644 index 000000000..1aa7d6ba9 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -0,0 +1,104 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt new file mode 100644 index 000000000..645dc01d0 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -0,0 +1,68 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt new file mode 100644 index 000000000..3775da60e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -0,0 +1,84 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt new file mode 100644 index 000000000..ec83d54a9 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -0,0 +1,58 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt new file mode 100644 index 000000000..59284b69a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -0,0 +1,114 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=106, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + left: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + right: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + left: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) + value: 'count' + right: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__0.txt b/packages/mecha/tests/snapshots/scripting__parse_47__0.txt new file mode 100644 index 000000000..b05055855 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_47__0.txt @@ -0,0 +1,32 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + right: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + operator: '+' + left: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + value: 'abc' + right: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + value: 'def' diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt new file mode 100644 index 000000000..d36045b51 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -0,0 +1,7 @@ +1 * 2 +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 90 other tokens but got literal '*'. +# line 2, column 1 +# 1 | 1 * 2 +# 2 | * 3 +# : ^ +* 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_4__0.txt b/packages/mecha/tests/snapshots/scripting__parse_4__0.txt new file mode 100644 index 000000000..42f11c5dc --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_4__0.txt @@ -0,0 +1,13 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 670000.0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_5__0.txt b/packages/mecha/tests/snapshots/scripting__parse_5__0.txt new file mode 100644 index 000000000..9984589a5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_5__0.txt @@ -0,0 +1,23 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 diff --git a/packages/mecha/tests/snapshots/scripting__parse_6__0.txt b/packages/mecha/tests/snapshots/scripting__parse_6__0.txt new file mode 100644 index 000000000..8acd9a4f5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_6__0.txt @@ -0,0 +1,23 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 diff --git a/packages/mecha/tests/snapshots/scripting__parse_7__0.txt b/packages/mecha/tests/snapshots/scripting__parse_7__0.txt new file mode 100644 index 000000000..e700f668f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_7__0.txt @@ -0,0 +1,33 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_8__0.txt b/packages/mecha/tests/snapshots/scripting__parse_8__0.txt new file mode 100644 index 000000000..17403fa1f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_8__0.txt @@ -0,0 +1,33 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 2 + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_9__0.txt b/packages/mecha/tests/snapshots/scripting__parse_9__0.txt new file mode 100644 index 000000000..8211e2366 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_9__0.txt @@ -0,0 +1,28 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 2 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 54 diff --git a/packages/mecha/tests/test_scripting.py b/packages/mecha/tests/test_scripting.py new file mode 100644 index 000000000..40af27bc9 --- /dev/null +++ b/packages/mecha/tests/test_scripting.py @@ -0,0 +1,41 @@ +import pytest +from beet import Function, run_beet +from pytest_insta import SnapshotFixture + +from mecha import ( + CompilationDatabase, + CompilationUnit, + DiagnosticError, + Mecha, + get_scripting_examples, +) +from mecha.contrib.annotate_diagnostics import annotate_diagnostics + + +@pytest.fixture(scope="session") +def mc_scripting(): + with run_beet({"require": ["mecha.contrib.scripting"]}) as ctx: + yield ctx.inject(Mecha) + + +@pytest.mark.parametrize( + "source", + params := get_scripting_examples(), + ids=range(len(params)), +) +def test_parse(snapshot: SnapshotFixture, mc_scripting: Mecha, source: Function): + ast = None + diagnostics = None + + try: + ast = mc_scripting.parse(source) + except DiagnosticError as exc: + diagnostics = exc.diagnostics + + if ast: + assert snapshot() == ast.dump() + "\n" + elif diagnostics: + database = CompilationDatabase() + database[source] = CompilationUnit(source=source.text) + annotate_diagnostics(database, diagnostics) + assert snapshot() == source.text From 6eebf97da7196044ca772c831e412c6bd54cd170 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 26 Nov 2021 11:17:21 +0000 Subject: [PATCH 0496/1554] 0.14.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 12 ++++++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index c1a51bbe2..a3f8ed9c8 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,18 @@ +## v0.14.0 (2021-11-26) +### Feature +* Start working on scripting ([`d9ba6d3`](https://github.com/mcbeet/mecha/commit/d9ba6d3b4d18bc5e5cbe6a76391646c6f0736758)) +* Export annotate_diagnostics utility ([`8ac1026`](https://github.com/mcbeet/mecha/commit/8ac1026ec7b6dde5f49057e20cfd7c2cdd4ef8cb)) +* Add standalone ResetSyntaxParser ([`602a975`](https://github.com/mcbeet/mecha/commit/602a9758e35ee702d6fa7aaa44ee13fa1f3faaed)) + +### Fix +* Continuations are no longer allowed for nested execute ([`59a8e74`](https://github.com/mcbeet/mecha/commit/59a8e74c3416c58327827820bd99c39417cb13ad)) +* Don't keep using the same rules when the node changes in mutating reducer ([`89d92f6`](https://github.com/mcbeet/mecha/commit/89d92f6e50e802873dda7a5960819b95fa74ef5f)) +* Use start() instead of pos when reporting invalid escape sequence position ([`e9cc97b`](https://github.com/mcbeet/mecha/commit/e9cc97bd90b551e6163d83316c423daa7aec3cfc)) +* Forgot to explicitly export ImplicitExecuteNormalizer ([`4c5298a`](https://github.com/mcbeet/mecha/commit/4c5298afcb1a4a50b5a3674be38d637e503fc4f8)) + ## v0.13.3 (2021-11-20) ### Fix * Don't use resource_location for parsing objective criteria ([`d8b72e1`](https://github.com/mcbeet/mecha/commit/d8b72e1392f6df64f42d7615c124b40197307eda)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index f57ea7502..25d5dbc7f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.13.3" +__version__ = "0.14.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 939d02aae..8d26f7171 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.13.3" +version = "0.14.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 654b0f590b63fdb11d564645ad2bf0a14cacb3a8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Nov 2021 15:32:06 +0100 Subject: [PATCH 0497/1554] fix: allow json-flavored keywords --- .../mecha/mecha/contrib/scripting/parse.py | 12 +++---- .../resources/scripting_examples.mcfunction | 2 ++ .../snapshots/scripting__parse_19__0.txt | 2 +- .../snapshots/scripting__parse_39__0.txt | 2 +- .../snapshots/scripting__parse_49__0.txt | 33 +++++++++++++++++++ 5 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_49__0.txt diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index c87483138..392251318 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -264,18 +264,18 @@ def __call__(self, stream: TokenStream) -> Any: with stream.syntax( brace=r"\(|\)", - true=r"\bTrue\b", - false=r"\bFalse\b", - none=r"\bNone\b", + true=r"\b[tT]rue\b", + false=r"\b[fF]alse\b", + null=r"\b(?:null|None)\b", identifier=IDENTIFIER_PATTERN, string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", number=r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b", ): - brace, true, false, none, identifier, string, number = stream.expect( + brace, true, false, null, identifier, string, number = stream.expect( ("brace", "("), "true", "false", - "none", + "null", "identifier", "string", "number", @@ -301,7 +301,7 @@ def __call__(self, stream: TokenStream) -> Any: value = True elif false: value = False - elif none: + elif null: value = None elif string: value = self.quote_helper.unquote_string(string) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index cb93fe4dd..65ec439c6 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -135,3 +135,5 @@ foo = ( ### 1 * 2 * 3 +### +true | false | null diff --git a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt index e53f85493..cc32b29e4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', true, false, none, identifier, string or number but got invalid '%3'. +#>ERROR Expected brace '(', true, false, null, identifier, string or number but got invalid '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt index 5318bc27e..4b5b4792e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', true, false, none, identifier, string or number but got newline '\n'. +#>ERROR Expected brace '(', true, false, null, identifier, string or number but got newline '\n'. # line 1, column 12 # 1 | if True and if True and diff --git a/packages/mecha/tests/snapshots/scripting__parse_49__0.txt b/packages/mecha/tests/snapshots/scripting__parse_49__0.txt new file mode 100644 index 000000000..5d85674a5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_49__0.txt @@ -0,0 +1,33 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True + right: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: False + right: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: None From c251bde38365fbc9f0081c861aea5754dd4a2805 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Nov 2021 20:27:43 +0100 Subject: [PATCH 0498/1554] feat: parse assignment target, for loop, break, continue --- packages/mecha/mecha/contrib/scripting/ast.py | 23 ++- .../mecha/mecha/contrib/scripting/parse.py | 178 ++++++++++++++---- .../mecha/mecha/contrib/scripting/plugin.py | 35 ++++ .../resources/scripting_examples.mcfunction | 42 +++++ .../snapshots/scripting__parse_30__0.txt | 5 +- .../snapshots/scripting__parse_32__0.txt | 7 +- .../snapshots/scripting__parse_33__0.txt | 7 +- .../snapshots/scripting__parse_34__0.txt | 14 +- .../snapshots/scripting__parse_46__0.txt | 14 +- .../snapshots/scripting__parse_47__0.txt | 7 +- .../snapshots/scripting__parse_48__0.txt | 2 +- .../snapshots/scripting__parse_50__0.txt | 42 +++++ .../snapshots/scripting__parse_51__0.txt | 34 ++++ .../snapshots/scripting__parse_52__0.txt | 5 + .../snapshots/scripting__parse_53__0.txt | 42 +++++ .../snapshots/scripting__parse_54__0.txt | 7 + .../snapshots/scripting__parse_55__0.txt | 40 ++++ .../snapshots/scripting__parse_56__0.txt | 5 + .../snapshots/scripting__parse_57__0.txt | 42 +++++ .../snapshots/scripting__parse_58__0.txt | 5 + .../snapshots/scripting__parse_59__0.txt | 5 + .../snapshots/scripting__parse_60__0.txt | 5 + .../snapshots/scripting__parse_61__0.txt | 7 + .../snapshots/scripting__parse_62__0.txt | 40 ++++ .../snapshots/scripting__parse_63__0.txt | 23 +++ .../snapshots/scripting__parse_64__0.txt | 50 +++++ 26 files changed, 625 insertions(+), 61 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_50__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_51__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_52__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_53__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_54__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_55__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_56__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_57__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_58__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_59__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_60__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_61__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_62__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_63__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_64__0.txt diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 8a32d7a35..3993d93da 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -4,12 +4,14 @@ "AstExpressionUnary", "AstValue", "AstIdentifier", + "AstAssignmentTarget", + "AstAssignmentTargetIdentifier", "AstAssignment", ] from dataclasses import dataclass -from typing import Any +from typing import Any, ClassVar from beet.core.utils import required_field @@ -52,9 +54,24 @@ class AstIdentifier(AstExpression): value: str = required_field() +@dataclass(frozen=True) +class AstAssignmentTarget(AstNode): + """Base node for assignment targets.""" + + multiple: ClassVar[bool] = False + + +@dataclass(frozen=True) +class AstAssignmentTargetIdentifier(AstAssignmentTarget): + """Ast assignment target identifier node.""" + + value: str = required_field() + + @dataclass(frozen=True) class AstAssignment(AstNode): """Ast assignment node.""" - left: AstIdentifier = required_field() - right: AstExpression = required_field() + operator: str = required_field() + target: AstAssignmentTarget = required_field() + value: AstExpression = required_field() diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 392251318..e6c6471bd 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -1,9 +1,13 @@ __all__ = [ "get_scripting_parsers", "get_stream_identifiers", + "get_stream_pending_identifiers", "UndefinedIdentifier", "parse_statement", + "AssignmentTargetParser", "IfElseConstraint", + "BreakContinueConstraint", + "FlushPendingIdentifiersParser", "BinaryParser", "UnaryParser", "AtomParser", @@ -12,11 +16,11 @@ from dataclasses import dataclass, field from difflib import get_close_matches -from typing import Any, Dict, List, Set +from typing import Any, Dict, Iterable, List, Set, Tuple from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location -from mecha import AstRoot, Parser, ResetSyntaxParser, delegate +from mecha import AstRoot, Parser, ResetSyntaxParser, delegate, get_stream_scope from mecha.utils import ( QuoteHelper, QuoteHelperWithUnicode, @@ -26,6 +30,8 @@ from .ast import ( AstAssignment, + AstAssignmentTarget, + AstAssignmentTargetIdentifier, AstExpressionBinary, AstExpressionUnary, AstIdentifier, @@ -37,10 +43,45 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: """Return the scripting parsers.""" - parsers = { - "root": IfElseConstraint(parsers["root"]), - "nested_root": IfElseConstraint(parsers["nested_root"]), + return { + ################################################################################ + # Command + ################################################################################ + "root": FlushPendingIdentifiersParser( + BreakContinueConstraint( + parser=IfElseConstraint(parsers["root"]), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ) + ), + "nested_root": FlushPendingIdentifiersParser( + BreakContinueConstraint( + parser=IfElseConstraint(parsers["nested_root"]), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ) + ), + "command:argument:mecha:scripting:statement": ResetSyntaxParser( + delegate("scripting:statement") + ), + "command:argument:mecha:scripting:assignment_target": ResetSyntaxParser( + delegate("scripting:assignment_target") + ), + "command:argument:mecha:scripting:expression": ResetSyntaxParser( + delegate("scripting:expression") + ), + ################################################################################ + # Scripting + ################################################################################ "scripting:statement": parse_statement, + "scripting:assignment_target": AssignmentTargetParser( + allow_undefined_identifiers=True + ), + "scripting:augmented_assignment_target": AssignmentTargetParser(), "scripting:expression": delegate("scripting:disjunction"), "scripting:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -106,25 +147,25 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: "scripting:atom": AtomParser(), } - for arg in ["scripting:statement", "scripting:expression"]: - parsers[f"command:argument:mecha:{arg}"] = ResetSyntaxParser(delegate(arg)) - - return parsers - def get_stream_identifiers(stream: TokenStream) -> Set[str]: """Return the set of accessible identifiers currently associated with the token stream.""" return stream.data.setdefault("identifiers", set()) +def get_stream_pending_identifiers(stream: TokenStream) -> Set[str]: + """Return the set of pending identifiers currently associated with the token stream.""" + return stream.data.setdefault("pending_identifiers", set()) + + class UndefinedIdentifier(UnexpectedToken): """Raised when an identifier is not defined.""" - identifiers: Set[str] + identifiers: Tuple[str, ...] - def __init__(self, token: Token, identifiers: Set[str]): + def __init__(self, token: Token, identifiers: Iterable[str]): super().__init__(token) - self.identifiers = identifiers + self.identifiers = tuple(identifiers) def __str__(self) -> str: msg = f"Identifier {self.token.value!r} is not defined." @@ -146,28 +187,62 @@ def __str__(self) -> str: def parse_statement(stream: TokenStream) -> Any: """Parse statement.""" identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) - with stream.syntax( - equal=r"=", - identifier=IDENTIFIER_PATTERN, + for parser, alternative in stream.choose( + "scripting:augmented_assignment_target", + "scripting:assignment_target", + "scripting:expression", ): - with stream.checkpoint() as commit: - token = stream.expect("identifier") - stream.expect("equal") - commit() + with alternative: + pending_identifiers.clear() + node = delegate(parser, stream) + + if isinstance(node, AstAssignmentTarget): + pattern = r"=(?!=)" - identifier = set_location(AstIdentifier(value=token.value), token) - expression = delegate("scripting:expression", stream) + if ( + parser == "scripting:augmented_assignment_target" + and not node.multiple + ): + pattern += r"|\+=|-=|\*=|//=|/=|%=|&=|\|=|\^=|<<=|>>=|\*\*=" - identifiers.add(identifier.value) + with stream.syntax(assignment=pattern): + op = stream.expect("assignment") - node = AstAssignment(left=identifier, right=expression) - node = set_location(node, identifier, expression) + expression = delegate("scripting:expression", stream) - if commit.rollback: - node = delegate("scripting:expression", stream) + identifiers |= pending_identifiers + pending_identifiers.clear() - return node + node = AstAssignment(operator=op.value, target=node, value=expression) + node = set_location(node, node.target, node.value) + + return node + + +@dataclass +class AssignmentTargetParser: + """Parser for assignment targets.""" + + allow_undefined_identifiers: bool = False + + def __call__(self, stream: TokenStream) -> AstAssignmentTarget: + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + + with stream.syntax(identifier=IDENTIFIER_PATTERN): + token = stream.expect("identifier") + + if self.allow_undefined_identifiers: + pending_identifiers.add(token.value) + elif token.value not in identifiers: + exc = UndefinedIdentifier(token, identifiers) + raise set_location(exc, token) + + node = set_location(AstAssignmentTargetIdentifier(value=token.value), token) + + return node @dataclass @@ -193,6 +268,47 @@ def __call__(self, stream: TokenStream) -> AstRoot: return node +@dataclass +class BreakContinueConstraint: + """Constraint that makes sure that break and continue statements only occur in loops.""" + + parser: Parser + allowed_scopes: Set[Tuple[str, ...]] + + def __call__(self, stream: TokenStream) -> AstRoot: + scope = get_stream_scope(stream) + loop = stream.data.get("loop") or scope in self.allowed_scopes + + with stream.provide(loop=loop): + node: AstRoot = self.parser(stream) + + if not loop: + for command in node.commands: + if command.identifier in ["break", "continue"]: + exc = InvalidSyntax( + f"Can only use {command.identifier!r} in loops." + ) + raise set_location(exc, command) + + return node + + +@dataclass +class FlushPendingIdentifiersParser: + """Parser that flushes pending identifiers.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + + identifiers |= pending_identifiers + pending_identifiers.clear() + + return self.parser(stream) + + @dataclass class BinaryParser: """Parser for binary expressions.""" @@ -288,11 +404,7 @@ def __call__(self, stream: TokenStream) -> Any: return inner if identifier: - if ( - stream.data.get("check_identifiers", True) - and identifier.value not in identifiers - ): - stream.index -= 1 + if identifier.value not in identifiers: exc = UndefinedIdentifier(identifier, identifiers) raise set_location(exc, identifier) return set_location(AstIdentifier(value=identifier.value), identifier) diff --git a/packages/mecha/mecha/contrib/scripting/plugin.py b/packages/mecha/mecha/contrib/scripting/plugin.py index 2e120f020..8d8e51b58 100644 --- a/packages/mecha/mecha/contrib/scripting/plugin.py +++ b/packages/mecha/mecha/contrib/scripting/plugin.py @@ -75,6 +75,41 @@ } }, }, + "for": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "mecha:scripting:assignment_target", + "children": { + "in": { + "type": "literal", + "children": { + "iterable": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + } + }, + } + }, + } + }, + } + }, + }, + "break": { + "type": "literal", + "executable": True, + }, + "continue": { + "type": "literal", + "executable": True, + }, }, } diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 65ec439c6..39321e266 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -137,3 +137,45 @@ foo = ( * 3 ### true | false | null +### +foo = 1 +foo == 1 +### +for c in "abc" + say something +### +foo = foo +### +foo = 1 +foo = foo +### +for foo in foo + foo = foo +### +for foo in "foo" + foo = foo +### +foo += "hey" +### +foo = "" +foo += "hey" +### +wat = the = "f" +### +break +### +continue +### +if true + break +### +for i in "" + say hello + continue +### +while false + break +### +for i in "abc" + if i == "b" + break diff --git a/packages/mecha/tests/snapshots/scripting__parse_30__0.txt b/packages/mecha/tests/snapshots/scripting__parse_30__0.txt index ba1c6fcd8..a0daccf18 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_30__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_30__0.txt @@ -1,5 +1,4 @@ -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 83 other tokens but got literal 'foo'. -# line 1, column 1 +#>ERROR Expected assignment but got newline '\n'. +# line 1, column 4 # 1 | foo -# : ^^^ foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__0.txt b/packages/mecha/tests/snapshots/scripting__parse_32__0.txt index 4be84492a..4d1fb98f3 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_32__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_32__0.txt @@ -10,12 +10,13 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) - left: - + operator: '=' + target: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - right: + value: location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__0.txt b/packages/mecha/tests/snapshots/scripting__parse_33__0.txt index df8004348..89c04d7ef 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_33__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_33__0.txt @@ -10,12 +10,13 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) - left: - + operator: '=' + target: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - right: + value: location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt index a084c5160..4b5a117fe 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt @@ -10,12 +10,13 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) - left: - + operator: '=' + target: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 'a' - right: + value: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) @@ -51,12 +52,13 @@ location: SourceLocation(pos=20, lineno=3, colno=5) end_location: SourceLocation(pos=25, lineno=3, colno=10) - left: - + operator: '=' + target: + location: SourceLocation(pos=20, lineno=3, colno=5) end_location: SourceLocation(pos=21, lineno=3, colno=6) value: 'a' - right: + value: location: SourceLocation(pos=24, lineno=3, colno=9) end_location: SourceLocation(pos=25, lineno=3, colno=10) diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index 59284b69a..ba62454e9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -38,12 +38,13 @@ location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=41, lineno=2, colno=15) - left: - + operator: '=' + target: + location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=36, lineno=2, colno=10) value: 'count' - right: + value: location: SourceLocation(pos=39, lineno=2, colno=13) end_location: SourceLocation(pos=41, lineno=2, colno=15) @@ -92,12 +93,13 @@ location: SourceLocation(pos=88, lineno=5, colno=9) end_location: SourceLocation(pos=105, lineno=5, colno=26) - left: - + operator: '=' + target: + location: SourceLocation(pos=88, lineno=5, colno=9) end_location: SourceLocation(pos=93, lineno=5, colno=14) value: 'count' - right: + value: location: SourceLocation(pos=96, lineno=5, colno=17) end_location: SourceLocation(pos=105, lineno=5, colno=26) diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__0.txt b/packages/mecha/tests/snapshots/scripting__parse_47__0.txt index b05055855..727b6988b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_47__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_47__0.txt @@ -10,12 +10,13 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=29, lineno=3, colno=12) - left: - + operator: '=' + target: + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' - right: + value: location: SourceLocation(pos=12, lineno=2, colno=5) end_location: SourceLocation(pos=29, lineno=3, colno=12) diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index d36045b51..5d8856eee 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 90 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 95 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_50__0.txt b/packages/mecha/tests/snapshots/scripting__parse_50__0.txt new file mode 100644 index 000000000..c52ae62b7 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_50__0.txt @@ -0,0 +1,42 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + operator: '==' + left: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' + right: + + location: SourceLocation(pos=15, lineno=2, colno=8) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt new file mode 100644 index 000000000..211b83541 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt @@ -0,0 +1,34 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'c' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'abc' + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + fragments: + + location: SourceLocation(pos=23, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + value: 'something' diff --git a/packages/mecha/tests/snapshots/scripting__parse_52__0.txt b/packages/mecha/tests/snapshots/scripting__parse_52__0.txt new file mode 100644 index 000000000..27f7819c1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_52__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 7 +# 1 | foo = foo +# : ^^^ +foo = foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_53__0.txt b/packages/mecha/tests/snapshots/scripting__parse_53__0.txt new file mode 100644 index 000000000..f27dd30a1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_53__0.txt @@ -0,0 +1,42 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=14, lineno=2, colno=7) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_54__0.txt b/packages/mecha/tests/snapshots/scripting__parse_54__0.txt new file mode 100644 index 000000000..e493bd042 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_54__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 12 +# 1 | for foo in foo +# : ^^^ +# 2 | foo = foo +for foo in foo + foo = foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__0.txt b/packages/mecha/tests/snapshots/scripting__parse_55__0.txt new file mode 100644 index 000000000..d80570e50 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_55__0.txt @@ -0,0 +1,40 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'foo' + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'foo' + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=27, lineno=2, colno=11) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_56__0.txt b/packages/mecha/tests/snapshots/scripting__parse_56__0.txt new file mode 100644 index 000000000..d101402cc --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_56__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected assignment but got invalid '+= "hey"'. +# line 1, column 5 +# 1 | foo += "hey" +# : ^^^^^^^^ +foo += "hey" diff --git a/packages/mecha/tests/snapshots/scripting__parse_57__0.txt b/packages/mecha/tests/snapshots/scripting__parse_57__0.txt new file mode 100644 index 000000000..b9b85e197 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_57__0.txt @@ -0,0 +1,42 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: '' + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + operator: '+=' + target: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=16, lineno=2, colno=8) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + value: 'hey' diff --git a/packages/mecha/tests/snapshots/scripting__parse_58__0.txt b/packages/mecha/tests/snapshots/scripting__parse_58__0.txt new file mode 100644 index 000000000..9a6e11c95 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_58__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'the' is not defined. +# line 1, column 7 +# 1 | wat = the = "f" +# : ^^^ +wat = the = "f" diff --git a/packages/mecha/tests/snapshots/scripting__parse_59__0.txt b/packages/mecha/tests/snapshots/scripting__parse_59__0.txt new file mode 100644 index 000000000..881a78c30 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_59__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only use 'break' in loops. +# line 1, column 1 +# 1 | break +# : ^^^^^ +break diff --git a/packages/mecha/tests/snapshots/scripting__parse_60__0.txt b/packages/mecha/tests/snapshots/scripting__parse_60__0.txt new file mode 100644 index 000000000..a2e2bba79 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_60__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only use 'continue' in loops. +# line 1, column 1 +# 1 | continue +# : ^^^^^^^^ +continue diff --git a/packages/mecha/tests/snapshots/scripting__parse_61__0.txt b/packages/mecha/tests/snapshots/scripting__parse_61__0.txt new file mode 100644 index 000000000..965d0e647 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_61__0.txt @@ -0,0 +1,7 @@ +if true +#>ERROR Can only use 'break' in loops. +# line 2, column 5 +# 1 | if true +# 2 | break +# : ^^^^^ + break diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt new file mode 100644 index 000000000..b812d08ae --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt @@ -0,0 +1,40 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=3, colno=13) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: '' + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=30, lineno=3, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=13) + identifier: 'continue' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__0.txt b/packages/mecha/tests/snapshots/scripting__parse_63__0.txt new file mode 100644 index 000000000..e9aac407b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_63__0.txt @@ -0,0 +1,23 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=10) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: False + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=10) + identifier: 'break' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__0.txt b/packages/mecha/tests/snapshots/scripting__parse_64__0.txt new file mode 100644 index 000000000..bde76a242 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_64__0.txt @@ -0,0 +1,50 @@ + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'abc' + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=8) + end_location: SourceLocation(pos=30, lineno=2, colno=16) + operator: '==' + left: + + location: SourceLocation(pos=22, lineno=2, colno=8) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + value: 'i' + right: + + location: SourceLocation(pos=27, lineno=2, colno=13) + end_location: SourceLocation(pos=30, lineno=2, colno=16) + value: 'b' + + location: SourceLocation(pos=39, lineno=3, colno=9) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=39, lineno=3, colno=9) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'break' + arguments: + From 8a70adcb7e0c31d8a1fb199e09c4f8d0849b1dd7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 27 Nov 2021 20:30:58 +0100 Subject: [PATCH 0499/1554] test: prefix scripting snapshots with the source --- packages/mecha/tests/snapshots/scripting__parse_0__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_10__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_11__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_12__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_13__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_14__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_15__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_16__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_17__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_1__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_20__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_21__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_22__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_23__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_24__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_25__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_26__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_29__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_2__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_32__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_33__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_34__0.txt | 4 ++++ packages/mecha/tests/snapshots/scripting__parse_35__0.txt | 7 +++++++ packages/mecha/tests/snapshots/scripting__parse_3__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_41__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_42__0.txt | 6 ++++++ packages/mecha/tests/snapshots/scripting__parse_43__0.txt | 4 ++++ packages/mecha/tests/snapshots/scripting__parse_44__0.txt | 6 ++++++ packages/mecha/tests/snapshots/scripting__parse_45__0.txt | 4 ++++ packages/mecha/tests/snapshots/scripting__parse_46__0.txt | 6 ++++++ packages/mecha/tests/snapshots/scripting__parse_47__0.txt | 5 +++++ packages/mecha/tests/snapshots/scripting__parse_49__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_4__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_50__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_51__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_53__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_55__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_57__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_5__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_62__0.txt | 4 ++++ packages/mecha/tests/snapshots/scripting__parse_63__0.txt | 3 +++ packages/mecha/tests/snapshots/scripting__parse_64__0.txt | 4 ++++ packages/mecha/tests/snapshots/scripting__parse_6__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_7__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_8__0.txt | 2 ++ packages/mecha/tests/snapshots/scripting__parse_9__0.txt | 2 ++ packages/mecha/tests/test_scripting.py | 2 +- 47 files changed, 132 insertions(+), 1 deletion(-) diff --git a/packages/mecha/tests/snapshots/scripting__parse_0__0.txt b/packages/mecha/tests/snapshots/scripting__parse_0__0.txt index 923aec9d5..2d73ad98b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_0__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_0__0.txt @@ -1,3 +1,5 @@ +0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_10__0.txt b/packages/mecha/tests/snapshots/scripting__parse_10__0.txt index c40b9dabe..326b2e8d3 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_10__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_10__0.txt @@ -1,3 +1,5 @@ +2 + -54 * 10 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__0.txt b/packages/mecha/tests/snapshots/scripting__parse_11__0.txt index 1fc33b920..721ede5ab 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_11__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_11__0.txt @@ -1,3 +1,5 @@ +(2 + -54) * 10 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_12__0.txt b/packages/mecha/tests/snapshots/scripting__parse_12__0.txt index 5bc748c8c..4618625be 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_12__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_12__0.txt @@ -1,3 +1,5 @@ +---64+++64 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_13__0.txt b/packages/mecha/tests/snapshots/scripting__parse_13__0.txt index 39d410b48..2c95ec305 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_13__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_13__0.txt @@ -1,3 +1,5 @@ +1 * 2 / 3 * 4 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_14__0.txt b/packages/mecha/tests/snapshots/scripting__parse_14__0.txt index 66b2eb6fb..57ac2d229 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_14__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_14__0.txt @@ -1,3 +1,5 @@ +1 * 2 / (3 * 4) +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=16, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_15__0.txt b/packages/mecha/tests/snapshots/scripting__parse_15__0.txt index afbc460f5..3c92c36e4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_15__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_15__0.txt @@ -1,3 +1,5 @@ +16 // 5 % 7 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_16__0.txt b/packages/mecha/tests/snapshots/scripting__parse_16__0.txt index fb5292f9f..8c00ebe08 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_16__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_16__0.txt @@ -1,3 +1,5 @@ +-2 ** 3 + ~4 * 5 // 6 / 7 % 9 + 10 - 11 << 12 >> 13 & 14 ^ 15 | 16 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_17__0.txt b/packages/mecha/tests/snapshots/scripting__parse_17__0.txt index aaab05888..4208774c3 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_17__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_17__0.txt @@ -1,3 +1,5 @@ +False or True and "hello" or not "foo" == "bar" or 1 != 2 and 1 < 2 and 2 <= 3 and 5 > 4 and 6 >= 5 and 1 in 1 and 2 not in 2 and 3 is 3 and 3 is not 3 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=152, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_1__0.txt b/packages/mecha/tests/snapshots/scripting__parse_1__0.txt index 57d06bed6..8b485e614 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_1__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_1__0.txt @@ -1,3 +1,5 @@ +123 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_20__0.txt b/packages/mecha/tests/snapshots/scripting__parse_20__0.txt index 37cc6f198..f35293ed1 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_20__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_20__0.txt @@ -1,3 +1,5 @@ +True and (False or True) +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=25, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_21__0.txt b/packages/mecha/tests/snapshots/scripting__parse_21__0.txt index 30e640d7b..ec03f5292 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_21__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_21__0.txt @@ -1,3 +1,5 @@ +"this" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_22__0.txt b/packages/mecha/tests/snapshots/scripting__parse_22__0.txt index b26ece9e5..cac667878 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_22__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_22__0.txt @@ -1,3 +1,5 @@ +"this\nthat" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_23__0.txt b/packages/mecha/tests/snapshots/scripting__parse_23__0.txt index 10d37ede1..644a61704 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_23__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_23__0.txt @@ -1,3 +1,5 @@ +"\"\u2588this\nthat" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_24__0.txt b/packages/mecha/tests/snapshots/scripting__parse_24__0.txt index 37b77b372..c1a6a1bf0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_24__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_24__0.txt @@ -1,3 +1,5 @@ +'' +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_25__0.txt b/packages/mecha/tests/snapshots/scripting__parse_25__0.txt index 4750b7ed6..2ba333ef7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_25__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_25__0.txt @@ -1,3 +1,5 @@ +'"\'"' +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_26__0.txt b/packages/mecha/tests/snapshots/scripting__parse_26__0.txt index 7beda8f1d..805ec53c6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_26__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_26__0.txt @@ -1,3 +1,5 @@ +'something \t\f\n\\\'here' +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=27, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_29__0.txt b/packages/mecha/tests/snapshots/scripting__parse_29__0.txt index e5cb679fa..213e86025 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_29__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_29__0.txt @@ -1,3 +1,5 @@ +None +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_2__0.txt b/packages/mecha/tests/snapshots/scripting__parse_2__0.txt index cb278d819..a2d3001f6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_2__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_2__0.txt @@ -1,3 +1,5 @@ +123.456 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__0.txt b/packages/mecha/tests/snapshots/scripting__parse_32__0.txt index 4d1fb98f3..17d7fbb2c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_32__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_32__0.txt @@ -1,3 +1,6 @@ +foo = 1 +foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__0.txt b/packages/mecha/tests/snapshots/scripting__parse_33__0.txt index 89c04d7ef..cfea52be6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_33__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_33__0.txt @@ -1,3 +1,6 @@ +foo = 1 +"hello" + foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt index 4b5a117fe..afc879219 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt @@ -1,3 +1,7 @@ +a = 1 +if a == 1 + a = 0 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=26, lineno=4, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt index 9c903aae2..b613c6f21 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt @@ -1,3 +1,10 @@ +if True + say hello +elif True or False + say hello +else + say hello +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=73, lineno=6, colno=14) diff --git a/packages/mecha/tests/snapshots/scripting__parse_3__0.txt b/packages/mecha/tests/snapshots/scripting__parse_3__0.txt index 00a3b8fff..24f775025 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_3__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_3__0.txt @@ -1,3 +1,5 @@ +22220099.6667e-3 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt index 3a8d2525d..178afd3c1 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt @@ -1,3 +1,6 @@ +while True + say hello +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=2, colno=14) diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt index 1aa7d6ba9..3619487ea 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -1,3 +1,9 @@ +if score @s tmp matches 0 + if "thing" == "bar" + say hello + if "thing" == "foo" + say hello +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=109, lineno=5, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt index 645dc01d0..21abe3540 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -1,3 +1,7 @@ +if score @s tmp matches 0 + if "thing" == "foo" + say hello +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=3, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt index 3775da60e..cbd65768f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -1,3 +1,9 @@ +if score @s tmp matches 0 + while True + say hello + while True + say hello +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=91, lineno=5, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt index ec83d54a9..721a98d0b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -1,3 +1,7 @@ +if score @s tmp matches 0 + while True + say hello +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=58, lineno=3, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index ba62454e9..32e117225 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -1,3 +1,9 @@ +if score @s tmp matches 42 + count = 42 + while count > 0 + say hello + count = count - 1 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=106, lineno=6, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__0.txt b/packages/mecha/tests/snapshots/scripting__parse_47__0.txt index 727b6988b..8e1941c39 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_47__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_47__0.txt @@ -1,3 +1,8 @@ +foo = ( + "abc" + + "def" +) +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=5, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_49__0.txt b/packages/mecha/tests/snapshots/scripting__parse_49__0.txt index 5d85674a5..de1f5b318 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_49__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_49__0.txt @@ -1,3 +1,5 @@ +true | false | null +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_4__0.txt b/packages/mecha/tests/snapshots/scripting__parse_4__0.txt index 42f11c5dc..00f0ca737 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_4__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_4__0.txt @@ -1,3 +1,5 @@ +0.67e6 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_50__0.txt b/packages/mecha/tests/snapshots/scripting__parse_50__0.txt index c52ae62b7..f8ffa39ab 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_50__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_50__0.txt @@ -1,3 +1,6 @@ +foo = 1 +foo == 1 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt index 211b83541..b924c894b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt @@ -1,3 +1,6 @@ +for c in "abc" + say something +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=2, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_53__0.txt b/packages/mecha/tests/snapshots/scripting__parse_53__0.txt index f27dd30a1..7b28628de 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_53__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_53__0.txt @@ -1,3 +1,6 @@ +foo = 1 +foo = foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=18, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__0.txt b/packages/mecha/tests/snapshots/scripting__parse_55__0.txt index d80570e50..65bc306f0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_55__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_55__0.txt @@ -1,3 +1,6 @@ +for foo in "foo" + foo = foo +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_57__0.txt b/packages/mecha/tests/snapshots/scripting__parse_57__0.txt index b9b85e197..b3e3588a8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_57__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_57__0.txt @@ -1,3 +1,6 @@ +foo = "" +foo += "hey" +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_5__0.txt b/packages/mecha/tests/snapshots/scripting__parse_5__0.txt index 9984589a5..edd85d9c6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_5__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_5__0.txt @@ -1,3 +1,5 @@ +1 + 2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt index b812d08ae..3e564226d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt @@ -1,3 +1,7 @@ +for i in "" + say hello + continue +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=4, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__0.txt b/packages/mecha/tests/snapshots/scripting__parse_63__0.txt index e9aac407b..0a158453e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_63__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_63__0.txt @@ -1,3 +1,6 @@ +while false + break +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=3, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__0.txt b/packages/mecha/tests/snapshots/scripting__parse_64__0.txt index bde76a242..042e5b54e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_64__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_64__0.txt @@ -1,3 +1,7 @@ +for i in "abc" + if i == "b" + break +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=45, lineno=4, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_6__0.txt b/packages/mecha/tests/snapshots/scripting__parse_6__0.txt index 8acd9a4f5..64606d3ad 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_6__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_6__0.txt @@ -1,3 +1,5 @@ +1 - 2 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_7__0.txt b/packages/mecha/tests/snapshots/scripting__parse_7__0.txt index e700f668f..5dfc9ebcd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_7__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_7__0.txt @@ -1,3 +1,5 @@ +1 - 2 + 3 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_8__0.txt b/packages/mecha/tests/snapshots/scripting__parse_8__0.txt index 17403fa1f..3b94ff5b8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_8__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_8__0.txt @@ -1,3 +1,5 @@ +1 - (2 + 3) +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=2, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_9__0.txt b/packages/mecha/tests/snapshots/scripting__parse_9__0.txt index 8211e2366..77a73c63b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_9__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_9__0.txt @@ -1,3 +1,5 @@ +2 + -54 +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=2, colno=1) diff --git a/packages/mecha/tests/test_scripting.py b/packages/mecha/tests/test_scripting.py index 40af27bc9..a41b54165 100644 --- a/packages/mecha/tests/test_scripting.py +++ b/packages/mecha/tests/test_scripting.py @@ -33,7 +33,7 @@ def test_parse(snapshot: SnapshotFixture, mc_scripting: Mecha, source: Function) diagnostics = exc.diagnostics if ast: - assert snapshot() == ast.dump() + "\n" + assert snapshot() == f"{source.text}---\n{ast.dump()}\n" elif diagnostics: database = CompilationDatabase() database[source] = CompilationUnit(source=source.text) From 785700a3711f44c8f4d8fb09f1fe81b3805bc14f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Nov 2021 19:35:37 +0000 Subject: [PATCH 0500/1554] 0.15.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index a3f8ed9c8..0446a22dd 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.15.0 (2021-11-27) +### Feature +* Parse assignment target, for loop, break, continue ([`ef25788`](https://github.com/mcbeet/mecha/commit/ef25788227576bcf35b7b8cc369653d6609efae3)) + +### Fix +* Allow json-flavored keywords ([`fff9f13`](https://github.com/mcbeet/mecha/commit/fff9f13dafad6ec85bd335e59c15be7dee450ebe)) + ## v0.14.0 (2021-11-26) ### Feature * Start working on scripting ([`d9ba6d3`](https://github.com/mcbeet/mecha/commit/d9ba6d3b4d18bc5e5cbe6a76391646c6f0736758)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 25d5dbc7f..e82d0f3d6 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.14.0" +__version__ = "0.15.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8d26f7171..b4a8d7619 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.14.0" +version = "0.15.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From fbbd24170ca09f533b2313261394471b336c4a0d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 28 Nov 2021 00:56:39 +0100 Subject: [PATCH 0501/1554] fix: iterate over indices instead of arguments values --- packages/mecha/mecha/prototype.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/prototype.py b/packages/mecha/mecha/prototype.py index f670e345b..2b4a7db7c 100644 --- a/packages/mecha/mecha/prototype.py +++ b/packages/mecha/mecha/prototype.py @@ -27,11 +27,11 @@ class CommandPrototype(NamedTuple): def get_argument(self, arg: Union[str, int]) -> CommandArgument: """Return the argument corresponding to the given name or index.""" if isinstance(arg, str): - for i in self.arguments: - if self.get_argument(i).name == arg: - arg = i - break + for i in range(len(self.arguments)): + argument = self.get_argument(i) + if argument.name == arg: + return argument else: - arg = len(self.signature) + raise ValueError(f"No argument {arg!r}.") return self.signature[self.arguments[arg]] # type: ignore From bc4d45059784d955da3c05b1941e86f97840b385 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Nov 2021 23:57:35 +0000 Subject: [PATCH 0502/1554] 0.15.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 0446a22dd..cc715ffa3 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.15.1 (2021-11-27) +### Fix +* Iterate over indices instead of arguments values ([`0f6d0ae`](https://github.com/mcbeet/mecha/commit/0f6d0aebfb659f3a8d9e3ce01ba48d72ff5ea833)) + ## v0.15.0 (2021-11-27) ### Feature * Parse assignment target, for loop, break, continue ([`ef25788`](https://github.com/mcbeet/mecha/commit/ef25788227576bcf35b7b8cc369653d6609efae3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e82d0f3d6..960e2686a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.15.0" +__version__ = "0.15.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b4a8d7619..f709542cd 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.15.0" +version = "0.15.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 64eca651b71d942d90c71c84ddf1b0f503b66d7e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 29 Nov 2021 02:22:48 +0100 Subject: [PATCH 0503/1554] chore: update dependencies --- packages/lectern/package-lock.json | 14 +++++----- packages/lectern/package.json | 2 +- packages/lectern/poetry.lock | 42 ++++++++++-------------------- packages/lectern/pyproject.toml | 9 +++---- 4 files changed, 26 insertions(+), 41 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 1547ff786..4bf9c9ee5 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.184" + "pyright": "^1.1.190" } }, "node_modules/pyright": { - "version": "1.1.184", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", - "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", + "version": "1.1.190", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.190.tgz", + "integrity": "sha512-rZXmg/xapDxuiqyzs15nj3cxj6IGroX2UNXdEKwTT7RNdwohahfdolqoLIBCtIrbLLmgNUXWtL0cCEqljBKNRg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.184", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.184.tgz", - "integrity": "sha512-SK/2cvIdj9hrkDasxVahK3Keo2fWgwN5phjwOyWGobW5KN1HLYWXQX335ls1FvC0ccWpGZfOBSmTWSu/JjpgFg==", + "version": "1.1.190", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.190.tgz", + "integrity": "sha512-rZXmg/xapDxuiqyzs15nj3cxj6IGroX2UNXdEKwTT7RNdwohahfdolqoLIBCtIrbLLmgNUXWtL0cCEqljBKNRg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index e2e007a4b..fa1cbd414 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.184" + "pyright": "^1.1.190" } } diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a7288d6d8..dd2c319d2 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.45.0" +version = "0.45.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -56,7 +56,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.11b0" +version = "21.11b1" description = "The uncompromising code formatter." category = "dev" optional = false @@ -67,7 +67,7 @@ click = ">=7.1.2" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0,<1" platformdirs = ">=2" -regex = ">=2020.1.8" +regex = ">=2021.4.4" tomli = ">=0.2.6,<2.0.0" typing-extensions = [ {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, @@ -271,7 +271,7 @@ python-versions = "*" [[package]] name = "isort" -version = "5.9.3" +version = "5.10.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -533,7 +533,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.19.2" +version = "7.22.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -637,17 +637,6 @@ python-versions = "*" [package.extras] idna2008 = ["idna"] -[[package]] -name = "rope" -version = "0.20.1" -description = "a python refactoring library..." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -dev = ["pytest", "pytest-timeout"] - [[package]] name = "secretstorage" version = "3.3.1" @@ -810,7 +799,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9ab78bee488f6bb3a0bb0ef3ba0ef0d044862f0582eb7c1d4d648d7eb2c2928d" +content-hash = "090780fd8c19b6c82bbcf9531c72f759625c72ee4213517efc2715b3eaf34ace" [metadata.files] atomicwrites = [ @@ -826,12 +815,12 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.45.0-py3-none-any.whl", hash = "sha256:9204b65be8e5fb2cc6f278c381a8c01b7b3ff02338175be2dc91ae9c51403c57"}, - {file = "beet-0.45.0.tar.gz", hash = "sha256:7c3a4a926aa3baa298c7f9185cf83118244ee8696b95bde6307b9d68084623d1"}, + {file = "beet-0.45.3-py3-none-any.whl", hash = "sha256:e1a53d93789c3b5bc499ff47bad808af4d9604d9c4022d35e8ee48aa880d1bf2"}, + {file = "beet-0.45.3.tar.gz", hash = "sha256:86c35ce84c4bcf351430e06037d825c1179b1a5873755ce909ac7ac181ac0b6b"}, ] black = [ - {file = "black-21.11b0-py3-none-any.whl", hash = "sha256:0b1f66cbfadcd332ceeaeecf6373d9991d451868d2e2219ad0ac1213fb701117"}, - {file = "black-21.11b0.tar.gz", hash = "sha256:83f3852301c8dcb229e9c444dd79f573c8d31c7c2dad9bbaaa94c808630e32aa"}, + {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, + {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -968,8 +957,8 @@ invoke = [ {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"}, ] isort = [ - {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, - {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] jeepney = [ {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, @@ -1169,8 +1158,8 @@ python-gitlab = [ {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.19.2.tar.gz", hash = "sha256:8ca0e5f72d31e7b0603b95caad6fb2d5315483ac1fadd86648771966d9ec6f2c"}, - {file = "python_semantic_release-7.19.2-py3-none-any.whl", hash = "sha256:b2c8bb16a643fee0831be4d06138bc1440ebd4f252c3397d41abde179ea56852"}, + {file = "python-semantic-release-7.22.0.tar.gz", hash = "sha256:d43bf40d7dacc1dd64b9f9016d495a617aae193968336d50e5d12f39a51486e4"}, + {file = "python_semantic_release-7.22.0-py3-none-any.whl", hash = "sha256:8eccd599bb4efb5dc1a5a9ed5f89c6ba65be5e77aa2367ccf3d7da50ed84a944"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1265,9 +1254,6 @@ rfc3986 = [ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] -rope = [ - {file = "rope-0.20.1.tar.gz", hash = "sha256:505a2f6b4ac7b18e0429be179f4d8712243a194da5c866b0731f9d91ce7590bb"}, -] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index b496e75fd..71cd7f589 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,16 +25,15 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.44.2" +beet = ">=0.45.3" markdown-it-py = "^1.1.0" click = "^8.0.1" [tool.poetry.dev-dependencies] -black = "^21.11b0" -rope = "^0.20.1" +black = "^21.11b1" pytest = "^6.2.5" -isort = "^5.9.3" -python-semantic-release = "^7.19.2" +isort = "^5.10.1" +python-semantic-release = "^7.22.0" pytest-insta = "^0.1.10" [tool.poetry.scripts] From e80fa9f5bfb2ffca51b155cf132ccbb5e88aebbe Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 29 Nov 2021 02:23:11 +0100 Subject: [PATCH 0504/1554] fix: missing blank line in flat format --- packages/lectern/lectern/serialize.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 4eb04b330..9fb186c8a 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -317,7 +317,9 @@ def serialize_pack( def format_serialized_file(self, chunks: Iterable[str]) -> Iterator[str]: """Format the markdown chunks for serializing file instances.""" - if not self.flat: + if self.flat: + yield "" + else: chunks = [indent(chunk, " ") for chunk in chunks] chunks[0] = "\n-" + chunks[0][1:] yield from chunks From 55b406d29293ebc81d6c6cbe8c5a3d6c0302d8d7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Nov 2021 01:24:34 +0000 Subject: [PATCH 0505/1554] 0.18.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index a367d7609..ba55bc70d 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.18.1 (2021-11-29) +### Fix +* Missing blank line in flat format ([`db3c1fc`](https://github.com/mcbeet/lectern/commit/db3c1fcfb9f252cf037ea22c706d6a254d4b0ad3)) + ## v0.18.0 (2021-11-16) ### Feature * Add flat markdown ([`45c5cf5`](https://github.com/mcbeet/lectern/commit/45c5cf5d7c949e824936ce43fce346c06b4af8ad)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 067529f74..31e1ccadb 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.18.0" +__version__ = "0.18.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 71cd7f589..7289952b3 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.18.0" +version = "0.18.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From d38997d3d90791f178b48927e5b2628db95bef2c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 30 Nov 2021 22:40:07 +0100 Subject: [PATCH 0506/1554] chore: update beet --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 712938607..95d5bbcca 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.45.1" +version = "0.48.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -808,7 +808,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "2a99dccbc2bc1194ec2a4c576a030fd0e8c6e3a39657acf1b42288f38226b816" +content-hash = "5cc5bdf9dcc9aae8d1ba0e5b1e20eb5b8e950d662e18d0cd8d84fe8f73e82d0e" [metadata.files] atomicwrites = [ @@ -824,8 +824,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.45.1-py3-none-any.whl", hash = "sha256:d6ca9b67079f28515ed3e10c3f33afb3521547d8fe1e4af79eabd32c162ba1da"}, - {file = "beet-0.45.1.tar.gz", hash = "sha256:d9940003c054c43e4b0b8e152ca7f81c76f7fe438c99d5dc947aa8cbf45ff75c"}, + {file = "beet-0.48.0-py3-none-any.whl", hash = "sha256:bd06a4c3d28f9278f20e901fdbf2db9f0ed35cc5f5d185ffc4319b9990fbc6e2"}, + {file = "beet-0.48.0.tar.gz", hash = "sha256:75cbae315f9c7e3c642281a6c061feed2f0af63a174b9c4a22b1727eb9f55b28"}, ] black = [ {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f709542cd..8c9fe70eb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.45.1" +beet = ">=0.48.0" tokenstream = "^1.2.6" [tool.poetry.dev-dependencies] From 88ce8490b769df2584cc01fd467296037c015a73 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 30 Nov 2021 23:10:36 +0100 Subject: [PATCH 0507/1554] fix: add custom repr for AstChildren --- packages/mecha/mecha/ast.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 660ec8ee2..fb2c0a564 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -134,6 +134,9 @@ def emit_error(self, exc: T) -> T: class AstChildren(Tuple[AstNodeType, ...]): """Specialized tuple subclass for holding multiple child ast nodes.""" + def __repr__(self) -> str: + return f"AstChildren({super().__repr__()})" + @dataclass(frozen=True) class AstRoot(AstNode): From a300cb08a89cc3014b2d7b6802f8e9eeb93577aa Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 01:14:23 +0100 Subject: [PATCH 0508/1554] chore: update dependencies --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 14 +++++++------- packages/mecha/pyproject.toml | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 601e537d6..7ec87cd77 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.189" + "pyright": "^1.1.191" } }, "node_modules/pyright": { - "version": "1.1.189", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.189.tgz", - "integrity": "sha512-a/uq95CnTD6ExGPvWULWbzfhMc1Tn6MF382hvcl4H7EwfSrZh1fYNJ+1UNlcItz0BURXqUzF5347QAqjf/Xvdg==", + "version": "1.1.191", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.191.tgz", + "integrity": "sha512-1WyWpfLudnT+wBNYoaqQV2yOmpzI8otmDIGrEdLG0pikHWktuVSq8rvcqLF2QzzZVgb67TWCXp9u+wBt214lzA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.189", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.189.tgz", - "integrity": "sha512-a/uq95CnTD6ExGPvWULWbzfhMc1Tn6MF382hvcl4H7EwfSrZh1fYNJ+1UNlcItz0BURXqUzF5347QAqjf/Xvdg==", + "version": "1.1.191", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.191.tgz", + "integrity": "sha512-1WyWpfLudnT+wBNYoaqQV2yOmpzI8otmDIGrEdLG0pikHWktuVSq8rvcqLF2QzzZVgb67TWCXp9u+wBt214lzA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 8b3dd6ee1..ddf9ea325 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.189" + "pyright": "^1.1.191" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 95d5bbcca..89fb02c3d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -540,7 +540,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.22.0" +version = "7.23.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -694,7 +694,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.2.6" +version = "1.2.7" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -808,7 +808,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "5cc5bdf9dcc9aae8d1ba0e5b1e20eb5b8e950d662e18d0cd8d84fe8f73e82d0e" +content-hash = "7cdb19a6e5ebad758272d5d076375bf8b507c4bf06ff03a4913fec5cb25a823a" [metadata.files] atomicwrites = [ @@ -1160,8 +1160,8 @@ python-gitlab = [ {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.22.0.tar.gz", hash = "sha256:d43bf40d7dacc1dd64b9f9016d495a617aae193968336d50e5d12f39a51486e4"}, - {file = "python_semantic_release-7.22.0-py3-none-any.whl", hash = "sha256:8eccd599bb4efb5dc1a5a9ed5f89c6ba65be5e77aa2367ccf3d7da50ed84a944"}, + {file = "python-semantic-release-7.23.0.tar.gz", hash = "sha256:48c33bf671dafa1257e7d955543856eb98486a3f976f586053556ae180d725da"}, + {file = "python_semantic_release-7.23.0-py3-none-any.whl", hash = "sha256:5bf7fcdb28e5e9888c9a15a1168afe53302116a6874d818580d4c58db60283ab"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1278,8 +1278,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.2.6-py3-none-any.whl", hash = "sha256:a103cfa6434f856a45d24ab205867ba587304bc201b73cace996bcbde2002e98"}, - {file = "tokenstream-1.2.6.tar.gz", hash = "sha256:24dbed519a8bdeb66f800d6b88101a15a6d2cd64c354e0308caf6f2ff5e2e258"}, + {file = "tokenstream-1.2.7-py3-none-any.whl", hash = "sha256:6aae8f38e305b5493e686faf3ab43f53b281821a9cde99b4d7b4cf815c08cc39"}, + {file = "tokenstream-1.2.7.tar.gz", hash = "sha256:2070c5163c26f0a595ea7a870472bb6ac4df3523bceafc42ed16dbb94304cd53"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8c9fe70eb..52292ffe0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,13 +24,13 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.48.0" -tokenstream = "^1.2.6" +tokenstream = "^1.2.7" [tool.poetry.dev-dependencies] black = "^21.11b1" pytest = "^6.2.5" isort = "^5.10.1" -python-semantic-release = "^7.22.0" +python-semantic-release = "^7.23.0" pytest-insta = "^0.1.10" lectern = "^0.18.0" From 087fa5488948e59b1861a6174cd6b75dec63df67 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 01:23:04 +0100 Subject: [PATCH 0509/1554] feat: parse primary expressions --- packages/mecha/mecha/contrib/scripting/ast.py | 20 +++- .../mecha/mecha/contrib/scripting/parse.py | 98 +++++++++++++++---- .../mecha/mecha/contrib/scripting/utils.py | 24 +++++ .../resources/scripting_examples.mcfunction | 14 +++ .../snapshots/scripting__parse_65__0.txt | 24 +++++ .../snapshots/scripting__parse_66__0.txt | 33 +++++++ .../snapshots/scripting__parse_67__0.txt | 39 ++++++++ .../snapshots/scripting__parse_68__0.txt | 85 ++++++++++++++++ .../snapshots/scripting__parse_69__0.txt | 36 +++++++ 9 files changed, 352 insertions(+), 21 deletions(-) create mode 100644 packages/mecha/mecha/contrib/scripting/utils.py create mode 100644 packages/mecha/tests/snapshots/scripting__parse_65__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_66__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_67__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_68__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_69__0.txt diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 3993d93da..a4a116439 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -4,6 +4,8 @@ "AstExpressionUnary", "AstValue", "AstIdentifier", + "AstLookup", + "AstCall", "AstAssignmentTarget", "AstAssignmentTargetIdentifier", "AstAssignment", @@ -15,7 +17,7 @@ from beet.core.utils import required_field -from mecha import AstNode +from mecha import AstChildren, AstNode @dataclass(frozen=True) @@ -54,6 +56,22 @@ class AstIdentifier(AstExpression): value: str = required_field() +@dataclass(frozen=True) +class AstLookup(AstExpression): + """Ast lookup node.""" + + value: AstExpression = required_field() + arguments: AstChildren[AstExpression] = required_field() + + +@dataclass(frozen=True) +class AstCall(AstExpression): + """Ast call node.""" + + value: AstExpression = required_field() + arguments: AstChildren[AstExpression] = required_field() + + @dataclass(frozen=True) class AstAssignmentTarget(AstNode): """Base node for assignment targets.""" diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index e6c6471bd..02b93ed5b 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -20,25 +20,33 @@ from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location -from mecha import AstRoot, Parser, ResetSyntaxParser, delegate, get_stream_scope -from mecha.utils import ( - QuoteHelper, - QuoteHelperWithUnicode, - normalize_whitespace, - string_to_number, +from mecha import ( + AstChildren, + AstRoot, + Parser, + ResetSyntaxParser, + delegate, + get_stream_scope, ) +from mecha.utils import QuoteHelper, normalize_whitespace, string_to_number from .ast import ( AstAssignment, AstAssignmentTarget, AstAssignmentTargetIdentifier, + AstCall, + AstExpression, AstExpressionBinary, AstExpressionUnary, AstIdentifier, + AstLookup, AstValue, ) +from .utils import ScriptingQuoteHelper IDENTIFIER_PATTERN: str = r"[a-zA-Z_][a-zA-Z0-9_]*" +STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" +NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: @@ -143,7 +151,7 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: parser=delegate("scripting:primary"), right_associative=True, ), - "scripting:primary": delegate("scripting:atom"), + "scripting:primary": PrimaryParser(), "scripting:atom": AtomParser(), } @@ -359,21 +367,71 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) +@dataclass +class PrimaryParser: + """Parser for primary expressions.""" + + quote_helper: QuoteHelper = field(default_factory=ScriptingQuoteHelper) + + def __call__(self, stream: TokenStream) -> Any: + node = delegate("scripting:atom", stream) + + with stream.syntax( + dot=r"\.", + comma=r",", + brace=r"\(|\)", + bracket=r"\[|\]", + identifier=IDENTIFIER_PATTERN, + string=STRING_PATTERN, + number=r"(?:0|[1-9][0-9]*)", + ): + while token := stream.get("dot", ("brace", "("), ("bracket", "[")): + arguments: List[AstExpression] = [] + + if token.match("dot"): + identifier, string, number = stream.expect( + "identifier", + "string", + "number", + ) + + if identifier: + value = identifier.value + elif string: + value = self.quote_helper.unquote_string(string) + elif number: + value = int(number.value) + + arguments.append( + set_location(AstValue(value=value), stream.current) + ) + + else: + close = ("brace", ")") if token.match("brace") else ("bracket", "]") + + with stream.ignore("newline"): + for _ in stream.peek_until(close): + arguments.append(delegate("scripting:expression", stream)) + + if not stream.get("comma"): + stream.expect(close) + break + + if token.match("brace"): + node = AstCall(value=node, arguments=AstChildren(arguments)) + else: + node = AstLookup(value=node, arguments=AstChildren(arguments)) + + node = set_location(node, node.value, stream.current) + + return node + + @dataclass class AtomParser: """Parser for atoms.""" - quote_helper: QuoteHelper = field( - default_factory=lambda: QuoteHelperWithUnicode( - escape_sequences={ - r"\\": "\\", - r"\f": "\f", - r"\n": "\n", - r"\r": "\r", - r"\t": "\t", - } - ) - ) + quote_helper: QuoteHelper = field(default_factory=ScriptingQuoteHelper) def __call__(self, stream: TokenStream) -> Any: identifiers = get_stream_identifiers(stream) @@ -384,8 +442,8 @@ def __call__(self, stream: TokenStream) -> Any: false=r"\b[fF]alse\b", null=r"\b(?:null|None)\b", identifier=IDENTIFIER_PATTERN, - string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", - number=r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b", + string=STRING_PATTERN, + number=NUMBER_PATTERN, ): brace, true, false, null, identifier, string, number = stream.expect( ("brace", "("), diff --git a/packages/mecha/mecha/contrib/scripting/utils.py b/packages/mecha/mecha/contrib/scripting/utils.py new file mode 100644 index 000000000..b0f974ed7 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/utils.py @@ -0,0 +1,24 @@ +__all__ = [ + "ScriptingQuoteHelper", +] + + +from dataclasses import dataclass, field +from typing import Dict + +from mecha.utils import QuoteHelperWithUnicode + + +@dataclass +class ScriptingQuoteHelper(QuoteHelperWithUnicode): + """Quote helper used for scripting.""" + + escape_sequences: Dict[str, str] = field( + default_factory=lambda: { + r"\\": "\\", + r"\f": "\f", + r"\n": "\n", + r"\r": "\r", + r"\t": "\t", + } + ) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 39321e266..40a488d30 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -179,3 +179,17 @@ while false for i in "abc" if i == "b" break +### +"foo".bar +### +"foo".bar.baz +### +"foo".bar()[0] +### +"foo".bar()[0]."hello".99."with space"("thing" * 7) +### +"foo"( + 1, + 2, + 3, +) diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__0.txt b/packages/mecha/tests/snapshots/scripting__parse_65__0.txt new file mode 100644 index 000000000..8afa8dbdb --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_65__0.txt @@ -0,0 +1,24 @@ +"foo".bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__0.txt b/packages/mecha/tests/snapshots/scripting__parse_66__0.txt new file mode 100644 index 000000000..845ec40ed --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_66__0.txt @@ -0,0 +1,33 @@ +"foo".bar.baz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'bar' + arguments: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'baz' diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__0.txt b/packages/mecha/tests/snapshots/scripting__parse_67__0.txt new file mode 100644 index 000000000..b34b67cf2 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_67__0.txt @@ -0,0 +1,39 @@ +"foo".bar()[0] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'bar' + arguments: + + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__0.txt b/packages/mecha/tests/snapshots/scripting__parse_68__0.txt new file mode 100644 index 000000000..94927b249 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_68__0.txt @@ -0,0 +1,85 @@ +"foo".bar()[0]."hello".99."with space"("thing" * 7) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'bar' + arguments: + + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: 'hello' + arguments: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 99 + arguments: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'with space' + arguments: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + operator: '*' + left: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + value: 'thing' + right: + + location: SourceLocation(pos=49, lineno=1, colno=50) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_69__0.txt b/packages/mecha/tests/snapshots/scripting__parse_69__0.txt new file mode 100644 index 000000000..199348866 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_69__0.txt @@ -0,0 +1,36 @@ +"foo"( + 1, + 2, + 3, +) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=5, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=5, colno=2) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=11, lineno=2, colno=5) + end_location: SourceLocation(pos=12, lineno=2, colno=6) + value: 1 + + location: SourceLocation(pos=18, lineno=3, colno=5) + end_location: SourceLocation(pos=19, lineno=3, colno=6) + value: 2 + + location: SourceLocation(pos=25, lineno=4, colno=5) + end_location: SourceLocation(pos=26, lineno=4, colno=6) + value: 3 From a14b0e7891cc7caf1774c8ead4f17afcf8538427 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 01:24:11 +0100 Subject: [PATCH 0510/1554] feat: make it possible to swap the cache backend --- packages/mecha/mecha/api.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 9d627d2b4..ec8c9ff70 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -1,6 +1,7 @@ __all__ = [ "Mecha", "MechaOptions", + "CacheBackend", ] @@ -9,6 +10,7 @@ import pickle from contextlib import contextmanager from dataclasses import InitVar, dataclass +from io import BufferedReader, BufferedWriter from pathlib import Path from typing import ( Any, @@ -17,6 +19,7 @@ List, Literal, Optional, + Protocol, Type, TypeVar, Union, @@ -51,6 +54,16 @@ logger = logging.getLogger("mecha") +class CacheBackend(Protocol): + """Protocol for the cache backend.""" + + def load(self, f: BufferedReader) -> Any: + ... + + def dump(self, obj: Any, f: BufferedWriter): + ... + + class MechaOptions(BaseModel): """Mecha options.""" @@ -75,6 +88,7 @@ class Mecha: directory: Path = extra_field(init=False) cache: Optional[Cache] = extra_field(default=None) + cache_backend: CacheBackend = extra_field(default=pickle) spec: CommandSpec = extra_field(default=None) @@ -241,12 +255,12 @@ def parse( if not self.cache.has_changed(self.directory / filename): try: with ast_path.open("rb") as f: - logger.debug("Using cached ast for file %r.", filename) - return pickle.load(f) - except FileNotFoundError: + ast = self.cache_backend.load(f) + logger.debug("Load cached ast for file %r.", filename) + return ast + except Exception: pass - logger.debug("Updating ast for file %r.", filename) cache_miss = ast_path stream = TokenStream(source.text) @@ -268,8 +282,12 @@ def parse( raise DiagnosticError(DiagnosticCollection([set_location(d, exc)])) from exc else: if self.cache and filename and cache_miss: - with cache_miss.open("wb") as f: - pickle.dump(ast, f) + try: + with cache_miss.open("wb") as f: + self.cache_backend.dump(ast, f) + logger.debug("Update cached ast for file %r.", filename) + except Exception: + pass return ast @overload From 66054b9fa6a8462853b75dbaa90e20164aa17658 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 05:46:43 +0100 Subject: [PATCH 0511/1554] fix: redefine comments and literals in ResetSyntaxParser --- packages/mecha/mecha/parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index f85af8123..bee247470 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1872,5 +1872,5 @@ class ResetSyntaxParser: parser: Parser def __call__(self, stream: TokenStream) -> Any: - with stream.reset_syntax(): + with stream.reset_syntax(comment=r"#.*$", literal=r"\S+"): return self.parser(stream) From 0f713f1c4e768120327f8ad580a75cb71b6d5a4f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 05:48:58 +0100 Subject: [PATCH 0512/1554] chore: update tokenstream --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 89fb02c3d..dbe47ba9e 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -694,7 +694,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.2.7" +version = "1.3.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -808,7 +808,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7cdb19a6e5ebad758272d5d076375bf8b507c4bf06ff03a4913fec5cb25a823a" +content-hash = "52d0d5a8c1c8c70b67fbbfbf790215ca094dd429798c22419b15c7b9b8036c21" [metadata.files] atomicwrites = [ @@ -1278,8 +1278,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.2.7-py3-none-any.whl", hash = "sha256:6aae8f38e305b5493e686faf3ab43f53b281821a9cde99b4d7b4cf815c08cc39"}, - {file = "tokenstream-1.2.7.tar.gz", hash = "sha256:2070c5163c26f0a595ea7a870472bb6ac4df3523bceafc42ed16dbb94304cd53"}, + {file = "tokenstream-1.3.0-py3-none-any.whl", hash = "sha256:a9e55ab04f1115b3951cab24422ca2d43a488790d5a493d88232b7e33c6efbda"}, + {file = "tokenstream-1.3.0.tar.gz", hash = "sha256:9b4174b6429e7ae356515d937be1ddd1457f4fad314af783d32cef71bdf4ca41"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 52292ffe0..d077fb4d4 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.48.0" -tokenstream = "^1.2.7" +tokenstream = "^1.3.0" [tool.poetry.dev-dependencies] black = "^21.11b1" From b17c6fc86ec4a751352c2e8c29cb4e2ae539c47b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 07:07:44 +0100 Subject: [PATCH 0513/1554] feat: parse functions --- packages/mecha/mecha/contrib/nesting.py | 8 +- packages/mecha/mecha/contrib/scripting/ast.py | 38 +++- .../mecha/mecha/contrib/scripting/parse.py | 207 +++++++++++++++--- .../mecha/mecha/contrib/scripting/plugin.py | 27 +++ packages/mecha/mecha/parse.py | 12 - .../resources/scripting_examples.mcfunction | 99 +++++++++ .../snapshots/scripting__parse_19__0.txt | 2 +- .../snapshots/scripting__parse_48__0.txt | 2 +- .../snapshots/scripting__parse_56__0.txt | 4 +- .../snapshots/scripting__parse_65__0.txt | 10 +- .../snapshots/scripting__parse_66__0.txt | 20 +- .../snapshots/scripting__parse_67__0.txt | 14 +- .../snapshots/scripting__parse_68__0.txt | 22 +- .../snapshots/scripting__parse_70__0.txt | 51 +++++ .../snapshots/scripting__parse_71__0.txt | 69 ++++++ .../snapshots/scripting__parse_72__0.txt | 75 +++++++ .../snapshots/scripting__parse_73__0.txt | 4 + .../snapshots/scripting__parse_74__0.txt | 4 + .../snapshots/scripting__parse_75__0.txt | 7 + .../snapshots/scripting__parse_76__0.txt | 7 + .../snapshots/scripting__parse_77__0.txt | 68 ++++++ .../snapshots/scripting__parse_78__0.txt | 10 + .../snapshots/scripting__parse_79__0.txt | 9 + .../snapshots/scripting__parse_80__0.txt | 20 ++ .../snapshots/scripting__parse_81__0.txt | 183 ++++++++++++++++ .../snapshots/scripting__parse_82__0.txt | 115 ++++++++++ .../snapshots/scripting__parse_83__0.txt | 11 + .../snapshots/scripting__parse_84__0.txt | 28 +++ .../snapshots/scripting__parse_85__0.txt | 5 + .../snapshots/scripting__parse_86__0.txt | 5 + .../snapshots/scripting__parse_87__0.txt | 67 ++++++ .../snapshots/scripting__parse_88__0.txt | 8 + 32 files changed, 1121 insertions(+), 90 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_70__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_71__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_72__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_73__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_74__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_75__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_76__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_77__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_78__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_79__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_80__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_81__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_82__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_83__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_84__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_85__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_86__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_87__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_88__0.txt diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index a2785613c..5c01bc794 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -29,6 +29,7 @@ Parser, consume_line_continuation, delegate, + get_stream_properties, get_stream_scope, rule, ) @@ -94,8 +95,11 @@ def beet_default(ctx: Context): def parse_nested_root(stream: TokenStream) -> AstRoot: """Parse nested root.""" - with stream.intercept("indent"): - stream.expect("indent") + properties = get_stream_properties(stream) + + if properties.get("check_nesting", True): + with stream.intercept("indent"): + stream.expect("indent") level, command_level = stream.indentation[-2:] diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index a4a116439..3ec0fa150 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -4,18 +4,23 @@ "AstExpressionUnary", "AstValue", "AstIdentifier", + "AstAttribute", "AstLookup", "AstCall", "AstAssignmentTarget", "AstAssignmentTargetIdentifier", "AstAssignment", + "AstFunctionSignature", + "AstFunctionSignatureArgument", + "AstFunctionRoot", ] from dataclasses import dataclass -from typing import Any, ClassVar +from typing import Any, ClassVar, Optional from beet.core.utils import required_field +from tokenstream import TokenStream from mecha import AstChildren, AstNode @@ -56,6 +61,14 @@ class AstIdentifier(AstExpression): value: str = required_field() +@dataclass(frozen=True) +class AstAttribute(AstExpression): + """Ast attribute node.""" + + name: str = required_field() + value: AstExpression = required_field() + + @dataclass(frozen=True) class AstLookup(AstExpression): """Ast lookup node.""" @@ -93,3 +106,26 @@ class AstAssignment(AstNode): operator: str = required_field() target: AstAssignmentTarget = required_field() value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstFunctionSignatureArgument(AstNode): + """Ast function signature argument node.""" + + name: str = required_field() + default: Optional[AstExpression] = None + + +@dataclass(frozen=True) +class AstFunctionSignature(AstNode): + """Ast function signature node.""" + + name: str = required_field() + arguments: AstChildren[AstFunctionSignatureArgument] = required_field() + + +@dataclass(frozen=True) +class AstFunctionRoot(AstNode): + """Ast function root node.""" + + stream: TokenStream = required_field() diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 02b93ed5b..b433df617 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -3,28 +3,35 @@ "get_stream_identifiers", "get_stream_pending_identifiers", "UndefinedIdentifier", + "create_scripting_root_parser", "parse_statement", "AssignmentTargetParser", "IfElseConstraint", "BreakContinueConstraint", "FlushPendingIdentifiersParser", + "parse_function_signature", + "parse_function_root", + "FunctionRootBacktracker", + "ReturnConstraint", "BinaryParser", "UnaryParser", "AtomParser", ] -from dataclasses import dataclass, field +from dataclasses import dataclass, field, replace from difflib import get_close_matches from typing import Any, Dict, Iterable, List, Set, Tuple +from beet.core.utils import required_field from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location from mecha import ( AstChildren, + AstCommand, AstRoot, Parser, - ResetSyntaxParser, + consume_line_continuation, delegate, get_stream_scope, ) @@ -34,10 +41,14 @@ AstAssignment, AstAssignmentTarget, AstAssignmentTargetIdentifier, + AstAttribute, AstCall, AstExpression, AstExpressionBinary, AstExpressionUnary, + AstFunctionRoot, + AstFunctionSignature, + AstFunctionSignatureArgument, AstIdentifier, AstLookup, AstValue, @@ -55,32 +66,18 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: ################################################################################ # Command ################################################################################ - "root": FlushPendingIdentifiersParser( - BreakContinueConstraint( - parser=IfElseConstraint(parsers["root"]), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), - }, - ) - ), - "nested_root": FlushPendingIdentifiersParser( - BreakContinueConstraint( - parser=IfElseConstraint(parsers["nested_root"]), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), - }, - ) + "root": create_scripting_root_parser(parsers["root"]), + "nested_root": create_scripting_root_parser(parsers["nested_root"]), + "command:argument:mecha:scripting:statement": delegate("scripting:statement"), + "command:argument:mecha:scripting:assignment_target": delegate( + "scripting:assignment_target" ), - "command:argument:mecha:scripting:statement": ResetSyntaxParser( - delegate("scripting:statement") + "command:argument:mecha:scripting:expression": delegate("scripting:expression"), + "command:argument:mecha:scripting:function_signature": delegate( + "scripting:function_signature" ), - "command:argument:mecha:scripting:assignment_target": ResetSyntaxParser( - delegate("scripting:assignment_target") - ), - "command:argument:mecha:scripting:expression": ResetSyntaxParser( - delegate("scripting:expression") + "command:argument:mecha:scripting:function_root": delegate( + "scripting:function_root" ), ################################################################################ # Scripting @@ -90,6 +87,8 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: allow_undefined_identifiers=True ), "scripting:augmented_assignment_target": AssignmentTargetParser(), + "scripting:function_signature": parse_function_signature, + "scripting:function_root": parse_function_root, "scripting:expression": delegate("scripting:disjunction"), "scripting:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -192,6 +191,23 @@ def __str__(self) -> str: return msg +def create_scripting_root_parser(parser: Parser): + """Return parser for the root node when using scripting.""" + return FunctionRootBacktracker( + FlushPendingIdentifiersParser( + ReturnConstraint( + BreakContinueConstraint( + parser=IfElseConstraint(parser), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ) + ) + ) + ) + + def parse_statement(stream: TokenStream) -> Any: """Parse statement.""" identifiers = get_stream_identifiers(stream) @@ -317,6 +333,138 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) +def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: + """Parse function signature.""" + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + scoped_identifiers = set(identifiers) + + arguments: List[AstFunctionSignatureArgument] = [] + + with stream.syntax( + comma=r",", + equal=r"=(?!=)", + brace=r"\(|\)", + identifier=IDENTIFIER_PATTERN, + ): + identifier = stream.expect("identifier") + stream.expect(("brace", "(")) + + scoped_identifiers.add(identifier.value) + + with stream.ignore("newline"): + for _ in stream.peek_until(("brace", ")")): + name = stream.expect("identifier") + + default = None + if stream.get("equal"): + with stream.provide( + identifiers=scoped_identifiers | {arg.name for arg in arguments} + ): + default = delegate("scripting:expression", stream) + + argument = AstFunctionSignatureArgument( + name=name.value, + default=default, + ) + arguments.append(set_location(argument, name, stream.current)) + + if not stream.get("comma"): + stream.expect(("brace", ")")) + break + + identifiers.add(identifier.value) + pending_identifiers |= {arg.name for arg in arguments} + + node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) + return set_location(node, identifier, stream.current) + + +def parse_function_root(stream: TokenStream) -> AstFunctionRoot: + """Parse function root.""" + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + + stream_copy = stream.copy() + + with stream.syntax(statement=r"[^\s#].*"): + token = stream.expect("statement") + while consume_line_continuation(stream): + stream.expect("statement") + + stream_copy.data["identifiers"] = identifiers | pending_identifiers + stream_copy.data["pending_identifiers"] = set() + + pending_identifiers.clear() + + node = AstFunctionRoot(stream=stream_copy) + return set_location(node, token, stream.current) + + +@dataclass +class FunctionRootBacktracker: + """Parser for backtracking over function root nodes.""" + + parser: Parser = required_field() + + def __call__(self, stream: TokenStream) -> AstRoot: + should_replace = False + commands: List[AstCommand] = [] + + node: AstRoot = self.parser(stream) + + identifiers = get_stream_identifiers(stream) + + for command in node.commands: + if command.identifier == "def:function:body": + if isinstance(function_root := command.arguments[-1], AstFunctionRoot): + should_replace = True + + function_stream = function_root.stream + function_stream.data["identifiers"] |= identifiers + function_stream.data.update( + properties={"check_nesting": False}, + function=True, + ) + + command = replace( + command, + arguments=AstChildren( + [ + *command.arguments[:-1], + delegate("nested_root", function_root.stream), + ] + ), + ) + + commands.append(command) + + if should_replace: + return replace(node, commands=AstChildren(commands)) + + return node + + +@dataclass +class ReturnConstraint: + """Constraint that makes sure that return statements only occur in functions.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> AstRoot: + node: AstRoot = self.parser(stream) + + if stream.data.get("function"): + return node + + for command in node.commands: + if command.identifier in ["return", "return:value"]: + exc = InvalidSyntax("Can only use 'return' in functions.") + raise set_location(exc, command) + + return node + + @dataclass class BinaryParser: """Parser for binary expressions.""" @@ -396,8 +544,11 @@ def __call__(self, stream: TokenStream) -> Any: ) if identifier: - value = identifier.value - elif string: + node = AstAttribute(value=node, name=identifier.value) + node = set_location(node, node, identifier) + continue + + if string: value = self.quote_helper.unquote_string(string) elif number: value = int(number.value) diff --git a/packages/mecha/mecha/contrib/scripting/plugin.py b/packages/mecha/mecha/contrib/scripting/plugin.py index 8d8e51b58..c68a218d8 100644 --- a/packages/mecha/mecha/contrib/scripting/plugin.py +++ b/packages/mecha/mecha/contrib/scripting/plugin.py @@ -17,6 +17,33 @@ "parser": "mecha:scripting:statement", "executable": True, }, + "def": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "mecha:scripting:function_signature", + "children": { + "body": { + "type": "argument", + "parser": "mecha:scripting:function_root", + "executable": True, + } + }, + } + }, + }, + "return": { + "type": "literal", + "executable": True, + "children": { + "value": { + "type": "argument", + "parser": "mecha:scripting:expression", + "executable": True, + } + }, + }, "if": { "type": "literal", "children": { diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index bee247470..0b2184c42 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -60,7 +60,6 @@ "parse_particle", "AggregateParser", "SingleLineConstraint", - "ResetSyntaxParser", "NUMBER_PATTERN", ] @@ -1863,14 +1862,3 @@ class SingleLineConstraint: def __call__(self, stream: TokenStream) -> Any: with stream.intercept("newline"): return self.parser(stream) - - -@dataclass -class ResetSyntaxParser: - """Parser that resets the syntax rules before delegating to a subparser.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.reset_syntax(comment=r"#.*$", literal=r"\S+"): - return self.parser(stream) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 40a488d30..09daf1200 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -193,3 +193,102 @@ for i in "abc" 2, 3, ) +### +def foo() + say hello +foo() +### +def foo() + def bar() + foo() + bar() +### +def foo( + a=1, + b=a, + c=a + b, +) + say hello +### +def f +### +def f() +### +def f() +say yolo +### +def f(a=a) + say wat +### +def f(a, b=a) + b += a + say wat +### +def f(a, b) + def g(c) + a + b + c +g() +### +def f(a, b) + def g(c) + a + b + f(c) +### +def foo(something) + def wat() + say + yo + wat + is + dat +# this is a comment + x = "hello" + for i in somehng + x += i * 3 + + say wow + wat() +### +def foo(something) + def wat() + say + yo + wat + is + dat +# this is a comment + x = "hello" + for i in something + x += i * 3 + + say wow + wat() +### +def foo() + thing += bar() +def bar() + thing += foo() +thing = bar() +### +def foo() + bar() + thing +def bar() + foo() + thin +thing = bar() +### +def foo() + return +### +return "hello" +### +return foo +### +def f() + def g() + return foo + foo = 0 +### +def f() + foo = 0 +f(foo) diff --git a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt index cc32b29e4..267388c17 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', true, false, null, identifier, string or number but got invalid '%3'. +#>ERROR Expected brace '(', true, false, null, identifier, string or number but got literal '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 5d8856eee..109c59e76 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 95 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 97 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_56__0.txt b/packages/mecha/tests/snapshots/scripting__parse_56__0.txt index d101402cc..0c087e88e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_56__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_56__0.txt @@ -1,5 +1,5 @@ -#>ERROR Expected assignment but got invalid '+= "hey"'. +#>ERROR Expected assignment but got literal '+='. # line 1, column 5 # 1 | foo += "hey" -# : ^^^^^^^^ +# : ^^ foo += "hey" diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__0.txt b/packages/mecha/tests/snapshots/scripting__parse_65__0.txt index 8afa8dbdb..4ef71611f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_65__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_65__0.txt @@ -9,16 +9,12 @@ end_location: SourceLocation(pos=9, lineno=1, colno=10) identifier: 'statement' arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) + + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' value: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'foo' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__0.txt b/packages/mecha/tests/snapshots/scripting__parse_66__0.txt index 845ec40ed..10c917dc8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_66__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_66__0.txt @@ -9,25 +9,17 @@ end_location: SourceLocation(pos=13, lineno=1, colno=14) identifier: 'statement' arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) + + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'baz' value: - - location: SourceLocation(pos=0, lineno=1, colno=1) + + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' value: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'foo' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'bar' - arguments: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'baz' diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__0.txt b/packages/mecha/tests/snapshots/scripting__parse_67__0.txt index b34b67cf2..ee518aa8f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_67__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_67__0.txt @@ -10,26 +10,22 @@ identifier: 'statement' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: - - location: SourceLocation(pos=0, lineno=1, colno=1) + + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' value: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'foo' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'bar' arguments: arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__0.txt b/packages/mecha/tests/snapshots/scripting__parse_68__0.txt index 94927b249..99097c6e7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_68__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_68__0.txt @@ -10,42 +10,38 @@ identifier: 'statement' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=51, lineno=1, colno=52) value: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=38, lineno=1, colno=39) value: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=22, lineno=1, colno=23) value: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: - - location: SourceLocation(pos=0, lineno=1, colno=1) + + location: SourceLocation(pos=-1, lineno=0, colno=0) end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' value: location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'foo' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'bar' arguments: arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__0.txt b/packages/mecha/tests/snapshots/scripting__parse_70__0.txt new file mode 100644 index 000000000..1db6b5ce4 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_70__0.txt @@ -0,0 +1,51 @@ +def foo() + say hello +foo() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=24, lineno=3, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=24, lineno=3, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=6) + value: + + location: SourceLocation(pos=24, lineno=3, colno=1) + end_location: SourceLocation(pos=27, lineno=3, colno=4) + value: 'foo' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__0.txt b/packages/mecha/tests/snapshots/scripting__parse_71__0.txt new file mode 100644 index 000000000..3b338633c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_71__0.txt @@ -0,0 +1,69 @@ +def foo() + def bar() + foo() + bar() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + name: 'bar' + arguments: + + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + value: + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=35, lineno=3, colno=12) + value: 'foo' + arguments: + + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + value: + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + value: 'bar' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__0.txt b/packages/mecha/tests/snapshots/scripting__parse_72__0.txt new file mode 100644 index 000000000..c13f2117e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_72__0.txt @@ -0,0 +1,75 @@ +def foo( + a=1, + b=a, + c=a + b, +) + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=41, lineno=5, colno=2) + name: 'foo' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + name: 'a' + default: + + location: SourceLocation(pos=15, lineno=2, colno=7) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + value: 1 + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + name: 'b' + default: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + value: 'a' + + location: SourceLocation(pos=31, lineno=4, colno=5) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + name: 'c' + default: + + location: SourceLocation(pos=33, lineno=4, colno=7) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + operator: '+' + left: + + location: SourceLocation(pos=33, lineno=4, colno=7) + end_location: SourceLocation(pos=34, lineno=4, colno=8) + value: 'a' + right: + + location: SourceLocation(pos=37, lineno=4, colno=11) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + value: 'b' + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_73__0.txt b/packages/mecha/tests/snapshots/scripting__parse_73__0.txt new file mode 100644 index 000000000..03a27def6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_73__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected brace '(' but got newline '\n'. +# line 1, column 6 +# 1 | def f +def f diff --git a/packages/mecha/tests/snapshots/scripting__parse_74__0.txt b/packages/mecha/tests/snapshots/scripting__parse_74__0.txt new file mode 100644 index 000000000..c1b3ae5bb --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_74__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected statement but reached end of file. +# line 1, column 8 +# 1 | def f() +def f() diff --git a/packages/mecha/tests/snapshots/scripting__parse_75__0.txt b/packages/mecha/tests/snapshots/scripting__parse_75__0.txt new file mode 100644 index 000000000..279d853a8 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_75__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected statement but got newline '\n'. +# line 1, column 8 +# 1 | def f() +# 2 | say yolo +# : ^ +def f() +say yolo diff --git a/packages/mecha/tests/snapshots/scripting__parse_76__0.txt b/packages/mecha/tests/snapshots/scripting__parse_76__0.txt new file mode 100644 index 000000000..3074c6bd4 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_76__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'a' is not defined. +# line 1, column 9 +# 1 | def f(a=a) +# : ^ +# 2 | say wat +def f(a=a) + say wat diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__0.txt b/packages/mecha/tests/snapshots/scripting__parse_77__0.txt new file mode 100644 index 000000000..93f3f7b91 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_77__0.txt @@ -0,0 +1,68 @@ +def f(a, b=a) + b += a + say wat +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'a' + default: None + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + name: 'b' + default: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'a' + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=11) + operator: '+=' + target: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=6) + value: 'b' + value: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=24, lineno=2, colno=11) + value: 'a' + + location: SourceLocation(pos=29, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=33, lineno=3, colno=9) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + fragments: + + location: SourceLocation(pos=33, lineno=3, colno=9) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_78__0.txt b/packages/mecha/tests/snapshots/scripting__parse_78__0.txt new file mode 100644 index 000000000..5b9cbb9c8 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_78__0.txt @@ -0,0 +1,10 @@ +def f(a, b) + def g(c) + a + b + c +#>ERROR Expected assignment but got literal '()'. +# line 5, column 2 +# 4 | c +# 5 | g() +# : ^^ +g() diff --git a/packages/mecha/tests/snapshots/scripting__parse_79__0.txt b/packages/mecha/tests/snapshots/scripting__parse_79__0.txt new file mode 100644 index 000000000..baa66bb83 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_79__0.txt @@ -0,0 +1,9 @@ +def f(a, b) + def g(c) + a + b +#>ERROR Identifier 'c' is not defined. +# line 4, column 7 +# 3 | a + b +# 4 | f(c) +# : ^ + f(c) diff --git a/packages/mecha/tests/snapshots/scripting__parse_80__0.txt b/packages/mecha/tests/snapshots/scripting__parse_80__0.txt new file mode 100644 index 000000000..1e92542a6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_80__0.txt @@ -0,0 +1,20 @@ +def foo(something) + def wat() + say + yo + wat + is + dat +# this is a comment + x = "hello" +#>ERROR Identifier 'somehng' is not defined. Did you mean 'something'? +# line 10, column 18 +# 9 | x = "hello" +# 10 | for i in somehng +# : ^^^^^^^ +# 11 | x += i * 3 + for i in somehng + x += i * 3 + + say wow + wat() diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__0.txt b/packages/mecha/tests/snapshots/scripting__parse_81__0.txt new file mode 100644 index 000000000..f48929a9b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_81__0.txt @@ -0,0 +1,183 @@ +def foo(something) + def wat() + say + yo + wat + is + dat +# this is a comment + x = "hello" + for i in something + x += i * 3 + + say wow + wat() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'something' + default: None + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=27, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=14) + name: 'wat' + arguments: + + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=57, lineno=4, colno=13) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + fragments: + + location: SourceLocation(pos=57, lineno=4, colno=13) + end_location: SourceLocation(pos=59, lineno=4, colno=15) + value: 'yo' + + location: SourceLocation(pos=71, lineno=5, colno=12) + end_location: SourceLocation(pos=72, lineno=5, colno=13) + value: ' ' + + location: SourceLocation(pos=72, lineno=5, colno=13) + end_location: SourceLocation(pos=75, lineno=5, colno=16) + value: 'wat' + + location: SourceLocation(pos=87, lineno=6, colno=12) + end_location: SourceLocation(pos=88, lineno=6, colno=13) + value: ' ' + + location: SourceLocation(pos=88, lineno=6, colno=13) + end_location: SourceLocation(pos=90, lineno=6, colno=15) + value: 'is' + + location: SourceLocation(pos=102, lineno=7, colno=12) + end_location: SourceLocation(pos=103, lineno=7, colno=13) + value: ' ' + + location: SourceLocation(pos=103, lineno=7, colno=13) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + value: 'dat' + + location: SourceLocation(pos=135, lineno=9, colno=9) + end_location: SourceLocation(pos=146, lineno=9, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=135, lineno=9, colno=9) + end_location: SourceLocation(pos=146, lineno=9, colno=20) + operator: '=' + target: + + location: SourceLocation(pos=135, lineno=9, colno=9) + end_location: SourceLocation(pos=136, lineno=9, colno=10) + value: 'x' + value: + + location: SourceLocation(pos=139, lineno=9, colno=13) + end_location: SourceLocation(pos=146, lineno=9, colno=20) + value: 'hello' + + location: SourceLocation(pos=155, lineno=10, colno=9) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=159, lineno=10, colno=13) + end_location: SourceLocation(pos=160, lineno=10, colno=14) + value: 'i' + + location: SourceLocation(pos=164, lineno=10, colno=18) + end_location: SourceLocation(pos=173, lineno=10, colno=27) + value: 'something' + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + commands: + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + operator: '+=' + target: + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=187, lineno=11, colno=14) + value: 'x' + value: + + location: SourceLocation(pos=191, lineno=11, colno=18) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + operator: '*' + left: + + location: SourceLocation(pos=191, lineno=11, colno=18) + end_location: SourceLocation(pos=192, lineno=11, colno=19) + value: 'i' + right: + + location: SourceLocation(pos=195, lineno=11, colno=22) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + value: 3 + + location: SourceLocation(pos=206, lineno=13, colno=9) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=210, lineno=13, colno=13) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + fragments: + + location: SourceLocation(pos=210, lineno=13, colno=13) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + value: 'wow' + + location: SourceLocation(pos=218, lineno=14, colno=5) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=218, lineno=14, colno=5) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + value: + + location: SourceLocation(pos=218, lineno=14, colno=5) + end_location: SourceLocation(pos=221, lineno=14, colno=8) + value: 'wat' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__0.txt b/packages/mecha/tests/snapshots/scripting__parse_82__0.txt new file mode 100644 index 000000000..c69ca071b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_82__0.txt @@ -0,0 +1,115 @@ +def foo() + thing += bar() +def bar() + thing += foo() +thing = bar() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=72, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + operator: '+=' + target: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=10) + value: 'thing' + value: + + location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + value: + + location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + value: 'bar' + arguments: + + + location: SourceLocation(pos=29, lineno=3, colno=1) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=33, lineno=3, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=10) + name: 'bar' + arguments: + + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + commands: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + operator: '+=' + target: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=48, lineno=4, colno=10) + value: 'thing' + value: + + location: SourceLocation(pos=52, lineno=4, colno=14) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + value: + + location: SourceLocation(pos=52, lineno=4, colno=14) + end_location: SourceLocation(pos=55, lineno=4, colno=17) + value: 'foo' + arguments: + + + location: SourceLocation(pos=58, lineno=5, colno=1) + end_location: SourceLocation(pos=71, lineno=5, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=58, lineno=5, colno=1) + end_location: SourceLocation(pos=71, lineno=5, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=58, lineno=5, colno=1) + end_location: SourceLocation(pos=63, lineno=5, colno=6) + value: 'thing' + value: + + location: SourceLocation(pos=66, lineno=5, colno=9) + end_location: SourceLocation(pos=71, lineno=5, colno=14) + value: + + location: SourceLocation(pos=66, lineno=5, colno=9) + end_location: SourceLocation(pos=69, lineno=5, colno=12) + value: 'bar' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_83__0.txt b/packages/mecha/tests/snapshots/scripting__parse_83__0.txt new file mode 100644 index 000000000..379a70675 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_83__0.txt @@ -0,0 +1,11 @@ +def foo() + bar() + thing +def bar() +#>ERROR Identifier 'thin' is not defined. Did you mean 'thing'? +# line 4, column 13 +# 3 | def bar() +# 4 | foo() + thin +# : ^^^^ +# 5 | thing = bar() + foo() + thin +thing = bar() diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__0.txt b/packages/mecha/tests/snapshots/scripting__parse_84__0.txt new file mode 100644 index 000000000..2675c1bb1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_84__0.txt @@ -0,0 +1,28 @@ +def foo() + return +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + identifier: 'return' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_85__0.txt b/packages/mecha/tests/snapshots/scripting__parse_85__0.txt new file mode 100644 index 000000000..7ae67654b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_85__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only use 'return' in functions. +# line 1, column 1 +# 1 | return "hello" +# : ^^^^^^^^^^^^^^ +return "hello" diff --git a/packages/mecha/tests/snapshots/scripting__parse_86__0.txt b/packages/mecha/tests/snapshots/scripting__parse_86__0.txt new file mode 100644 index 000000000..773e7171f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_86__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 8 +# 1 | return foo +# : ^^^ +return foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__0.txt b/packages/mecha/tests/snapshots/scripting__parse_87__0.txt new file mode 100644 index 000000000..6159f72d6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_87__0.txt @@ -0,0 +1,67 @@ +def f() + def g() + return foo + foo = 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + name: 'g' + arguments: + + + location: SourceLocation(pos=28, lineno=3, colno=9) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + commands: + + location: SourceLocation(pos=28, lineno=3, colno=9) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=35, lineno=3, colno=16) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + value: 'foo' + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=49, lineno=4, colno=11) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_88__0.txt b/packages/mecha/tests/snapshots/scripting__parse_88__0.txt new file mode 100644 index 000000000..5deabe7be --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_88__0.txt @@ -0,0 +1,8 @@ +def f() + foo = 0 +#>ERROR Identifier 'foo' is not defined. +# line 3, column 3 +# 2 | foo = 0 +# 3 | f(foo) +# : ^^^ +f(foo) From e5b58816575567ddcaa380e48185bda4cb17b3fb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 07:42:52 +0100 Subject: [PATCH 0514/1554] feat: parse interpolated arguments --- .../mecha/mecha/contrib/scripting/parse.py | 31 ++++++++++ .../resources/scripting_examples.mcfunction | 8 +++ .../snapshots/scripting__parse_42__0.txt | 5 +- .../snapshots/scripting__parse_43__0.txt | 5 +- .../snapshots/scripting__parse_44__0.txt | 5 +- .../snapshots/scripting__parse_45__0.txt | 5 +- .../snapshots/scripting__parse_46__0.txt | 5 +- .../snapshots/scripting__parse_89__0.txt | 60 +++++++++++++++++++ .../snapshots/scripting__parse_90__0.txt | 9 +++ 9 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_89__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_90__0.txt diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index b433df617..802bff246 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -4,6 +4,7 @@ "get_stream_pending_identifiers", "UndefinedIdentifier", "create_scripting_root_parser", + "InterpolatedArgumentParser", "parse_statement", "AssignmentTargetParser", "IfElseConstraint", @@ -34,6 +35,7 @@ consume_line_continuation, delegate, get_stream_scope, + get_stream_spec, ) from mecha.utils import QuoteHelper, normalize_whitespace, string_to_number @@ -68,6 +70,7 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: ################################################################################ "root": create_scripting_root_parser(parsers["root"]), "nested_root": create_scripting_root_parser(parsers["nested_root"]), + "command:argument": InterpolatedArgumentParser(parsers["command:argument"]), "command:argument:mecha:scripting:statement": delegate("scripting:statement"), "command:argument:mecha:scripting:assignment_target": delegate( "scripting:assignment_target" @@ -89,6 +92,7 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: "scripting:augmented_assignment_target": AssignmentTargetParser(), "scripting:function_signature": parse_function_signature, "scripting:function_root": parse_function_root, + "scripting:interpolated_command_argument": delegate("scripting:primary"), "scripting:expression": delegate("scripting:disjunction"), "scripting:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -208,6 +212,33 @@ def create_scripting_root_parser(parser: Parser): ) +@dataclass +class InterpolatedArgumentParser: + """Parser for interpolated command arguments.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + spec = get_stream_spec(stream) + scope = get_stream_scope(stream) + + tree = spec.tree.get(scope) + + if ( + tree + and tree.parser + and tree.parser.startswith(("mecha:scripting", "mecha:nested_root")) + ): + return self.parser(stream) + + for parser, alternative in stream.choose( + delegate("scripting:interpolated_command_argument"), + self.parser, + ): + with alternative: + return parser(stream) + + def parse_statement(stream: TokenStream) -> Any: """Parse statement.""" identifiers = get_stream_identifiers(stream) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 09daf1200..ad533e2c4 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -292,3 +292,11 @@ def f() def f() foo = 0 f(foo) +### +def f(x) + tellraw @a x +f("thing") +### +def f(x) + tellraw @a xx +f("thing") diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt index 3619487ea..3b79abbb2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -23,11 +23,10 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 + value: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=109, lineno=5, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt index 21abe3540..919614440 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -21,11 +21,10 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 + value: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=67, lineno=3, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt index cbd65768f..7e8c3751d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -23,11 +23,10 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 + value: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=91, lineno=5, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt index 721a98d0b..c4a3bb80d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -21,11 +21,10 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 + value: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index 32e117225..ebc0cd0dd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -23,11 +23,10 @@ if score @s tmp matches 42 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=26, lineno=1, colno=27) - min: 42 - max: 42 + value: 42 location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=105, lineno=5, colno=26) diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt new file mode 100644 index 000000000..af1f18893 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt @@ -0,0 +1,60 @@ +def f(x) + tellraw @a x +f("thing") +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'x' + default: None + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=23, lineno=2, colno=15) + variable: 'a' + arguments: + + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + value: 'x' + + location: SourceLocation(pos=26, lineno=3, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=3, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=11) + value: + + location: SourceLocation(pos=26, lineno=3, colno=1) + end_location: SourceLocation(pos=27, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=28, lineno=3, colno=3) + end_location: SourceLocation(pos=35, lineno=3, colno=10) + value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_90__0.txt b/packages/mecha/tests/snapshots/scripting__parse_90__0.txt new file mode 100644 index 000000000..cbb0f3ee9 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_90__0.txt @@ -0,0 +1,9 @@ +def f(x) +#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? +# line 2, column 16 +# 1 | def f(x) +# 2 | tellraw @a xx +# : ^^ +# 3 | f("thing") + tellraw @a xx +f("thing") From f70c51ff1a5c9d1e70d83bce398a334a37944ba7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Dec 2021 06:44:07 +0000 Subject: [PATCH 0515/1554] 0.16.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 11 +++++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index cc715ffa3..d67b10692 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,17 @@ +## v0.16.0 (2021-12-01) +### Feature +* Parse interpolated arguments ([`1e364ff`](https://github.com/mcbeet/mecha/commit/1e364ffa65e757378a42fc82ec3774eb0275e7ff)) +* Parse functions ([`717b450`](https://github.com/mcbeet/mecha/commit/717b45041091c3462105525d488ded48318cfd8b)) +* Make it possible to swap the cache backend ([`2870424`](https://github.com/mcbeet/mecha/commit/2870424013d1f046b99bf101d9f006b99a6e103b)) +* Parse primary expressions ([`1c9033c`](https://github.com/mcbeet/mecha/commit/1c9033c119e20986209fa17730db68ff580345af)) + +### Fix +* Redefine comments and literals in ResetSyntaxParser ([`3b7ed25`](https://github.com/mcbeet/mecha/commit/3b7ed25ca309c1410a8846ece0bb4229099ca078)) +* Add custom repr for AstChildren ([`1371be9`](https://github.com/mcbeet/mecha/commit/1371be9b73f6e8849a7b3752b3f5417ced6618f3)) + ## v0.15.1 (2021-11-27) ### Fix * Iterate over indices instead of arguments values ([`0f6d0ae`](https://github.com/mcbeet/mecha/commit/0f6d0aebfb659f3a8d9e3ce01ba48d72ff5ea833)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 960e2686a..2141c86b3 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.15.1" +__version__ = "0.16.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index d077fb4d4..8efcbfc76 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.15.1" +version = "0.16.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3a2a4ceede92c3f071b57501ed41421dbb10503e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 09:10:20 +0100 Subject: [PATCH 0516/1554] feat: parse lists and dicts --- packages/mecha/mecha/contrib/scripting/ast.py | 25 +++ .../mecha/mecha/contrib/scripting/parse.py | 68 +++++++- .../resources/scripting_examples.mcfunction | 53 ++++++ .../snapshots/scripting__parse_19__0.txt | 2 +- .../snapshots/scripting__parse_39__0.txt | 2 +- .../snapshots/scripting__parse_48__0.txt | 2 +- .../snapshots/scripting__parse_91__0.txt | 30 ++++ .../snapshots/scripting__parse_92__0.txt | 50 ++++++ .../snapshots/scripting__parse_93__0.txt | 50 ++++++ .../snapshots/scripting__parse_94__0.txt | 85 ++++++++++ .../snapshots/scripting__parse_95__0.txt | 155 ++++++++++++++++++ .../snapshots/scripting__parse_96__0.txt | 155 ++++++++++++++++++ .../snapshots/scripting__parse_97__0.txt | 83 ++++++++++ 13 files changed, 756 insertions(+), 4 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_91__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_92__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_93__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_94__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_95__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_96__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_97__0.txt diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 3ec0fa150..c8e0c5dfd 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -4,6 +4,9 @@ "AstExpressionUnary", "AstValue", "AstIdentifier", + "AstList", + "AstDictItem", + "AstDict", "AstAttribute", "AstLookup", "AstCall", @@ -61,6 +64,28 @@ class AstIdentifier(AstExpression): value: str = required_field() +@dataclass(frozen=True) +class AstList(AstExpression): + """Ast list node.""" + + items: AstChildren[AstExpression] = required_field() + + +@dataclass(frozen=True) +class AstDictItem(AstNode): + """Ast dict item node.""" + + key: AstExpression = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstDict(AstExpression): + """Ast dict node.""" + + items: AstChildren[AstDictItem] = required_field() + + @dataclass(frozen=True) class AstAttribute(AstExpression): """Ast attribute node.""" diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 802bff246..f916ceb92 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -45,6 +45,8 @@ AstAssignmentTargetIdentifier, AstAttribute, AstCall, + AstDict, + AstDictItem, AstExpression, AstExpressionBinary, AstExpressionUnary, @@ -52,6 +54,7 @@ AstFunctionSignature, AstFunctionSignatureArgument, AstIdentifier, + AstList, AstLookup, AstValue, ) @@ -620,6 +623,10 @@ def __call__(self, stream: TokenStream) -> Any: with stream.syntax( brace=r"\(|\)", + curly=r"\{|\}", + bracket=r"\[|\]", + colon=r":", + comma=r",", true=r"\b[tT]rue\b", false=r"\b[fF]alse\b", null=r"\b(?:null|None)\b", @@ -627,8 +634,20 @@ def __call__(self, stream: TokenStream) -> Any: string=STRING_PATTERN, number=NUMBER_PATTERN, ): - brace, true, false, null, identifier, string, number = stream.expect( + ( + brace, + curly, + bracket, + true, + false, + null, + identifier, + string, + number, + ) = stream.expect( ("brace", "("), + ("curly", "{"), + ("bracket", "["), "true", "false", "null", @@ -643,6 +662,53 @@ def __call__(self, stream: TokenStream) -> Any: stream.expect(("brace", ")")) return inner + if curly: + items: List[AstDictItem] = [] + + with stream.ignore("newline"): + for _ in stream.peek_until(("curly", "}")): + with stream.checkpoint() as commit: + identifier = stream.expect("identifier") + stream.expect("colon") + commit() + + if identifier.value in identifiers: + key = AstIdentifier(value=identifier.value) + else: + key = AstValue(value=identifier.value) + + key = set_location(key, identifier) + + if commit.rollback: + key = delegate("scripting:expression", stream) + stream.expect("colon") + + value = delegate("scripting:expression", stream) + + item = AstDictItem(key=key, value=value) + items.append(set_location(item, key, value)) + + if not stream.get("comma"): + stream.expect(("curly", "}")) + break + + node = AstDict(items=AstChildren(items)) + return set_location(node, curly, stream.current) + + if bracket: + elements: List[AstExpression] = [] + + with stream.ignore("newline"): + for _ in stream.peek_until(("bracket", "]")): + elements.append(delegate("scripting:expression", stream)) + + if not stream.get("comma"): + stream.expect(("bracket", "]")) + break + + node = AstList(items=AstChildren(elements)) + return set_location(node, bracket, stream.current) + if identifier: if identifier.value not in identifiers: exc = UndefinedIdentifier(identifier, identifiers) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index ad533e2c4..b4a6abf9c 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -300,3 +300,56 @@ f("thing") def f(x) tellraw @a xx f("thing") +### +{ + foo: "bar" +} +### +foo = "hello" +{ + foo: "bar" +} +### +foo = "hello" +{ + "foo": foo +} +### +foo = "hello" +{ + foo * 3: 42, + 16 + 3: [], +} +### +predicate = { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "score1": { + "min": { + "type": "minecraft:score", + "target": "this", + "score": "score2", + "scale": 1 + } + } + } +} +### +predicate = { + condition: "minecraft:entity_scores", + entity: "this", + scores: { + score1: { + min: { + type: "minecraft:score", + target: "this", + score: "score2", + scale: 1 + } + } + } +} +### +def f() + return {f(): f(), other: [{}, {}, "wat"]} diff --git a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt index 267388c17..9646279fd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', true, false, null, identifier, string or number but got literal '%3'. +#>ERROR Expected brace '(', curly '{', bracket '[', true, false, null or 3 other tokens but got literal '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt index 4b5b4792e..abc184b0e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', true, false, null, identifier, string or number but got newline '\n'. +#>ERROR Expected brace '(', curly '{', bracket '[', true, false, null or 3 other tokens but got newline '\n'. # line 1, column 12 # 1 | if True and if True and diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 109c59e76..33c729b7a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 97 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 99 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_91__0.txt b/packages/mecha/tests/snapshots/scripting__parse_91__0.txt new file mode 100644 index 000000000..79ad03c06 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_91__0.txt @@ -0,0 +1,30 @@ +{ + foo: "bar" +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + items: + + location: SourceLocation(pos=6, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=15) + key: + + location: SourceLocation(pos=6, lineno=2, colno=5) + end_location: SourceLocation(pos=9, lineno=2, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=11, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=15) + value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_92__0.txt b/packages/mecha/tests/snapshots/scripting__parse_92__0.txt new file mode 100644 index 000000000..6567e4887 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_92__0.txt @@ -0,0 +1,50 @@ +foo = "hello" +{ + foo: "bar" +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=23, lineno=3, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=25, lineno=3, colno=10) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_93__0.txt b/packages/mecha/tests/snapshots/scripting__parse_93__0.txt new file mode 100644 index 000000000..2f985b767 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_93__0.txt @@ -0,0 +1,50 @@ +foo = "hello" +{ + "foo": foo +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + value: 'foo' + value: + + location: SourceLocation(pos=27, lineno=3, colno=12) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_94__0.txt b/packages/mecha/tests/snapshots/scripting__parse_94__0.txt new file mode 100644 index 000000000..052c4081e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_94__0.txt @@ -0,0 +1,85 @@ +foo = "hello" +{ + foo * 3: 42, + 16 + 3: [], +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=50, lineno=5, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=50, lineno=5, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=16) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=27, lineno=3, colno=12) + operator: '*' + left: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=23, lineno=3, colno=8) + value: 'foo' + right: + + location: SourceLocation(pos=26, lineno=3, colno=11) + end_location: SourceLocation(pos=27, lineno=3, colno=12) + value: 3 + value: + + location: SourceLocation(pos=29, lineno=3, colno=14) + end_location: SourceLocation(pos=31, lineno=3, colno=16) + value: 42 + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=15) + key: + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=39, lineno=4, colno=7) + value: 16 + right: + + location: SourceLocation(pos=42, lineno=4, colno=10) + end_location: SourceLocation(pos=43, lineno=4, colno=11) + value: 3 + value: + + location: SourceLocation(pos=45, lineno=4, colno=13) + end_location: SourceLocation(pos=47, lineno=4, colno=15) + items: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_95__0.txt b/packages/mecha/tests/snapshots/scripting__parse_95__0.txt new file mode 100644 index 000000000..7b9d4e3c6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_95__0.txt @@ -0,0 +1,155 @@ +predicate = { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "score1": { + "min": { + "type": "minecraft:score", + "target": "this", + "score": "score2", + "scale": 1 + } + } + } +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=248, lineno=15, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=247, lineno=14, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=247, lineno=14, colno=2) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'predicate' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=247, lineno=14, colno=2) + items: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=54, lineno=2, colno=41) + key: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=27, lineno=2, colno=14) + value: 'condition' + value: + + location: SourceLocation(pos=29, lineno=2, colno=16) + end_location: SourceLocation(pos=54, lineno=2, colno=41) + value: 'minecraft:entity_scores' + + location: SourceLocation(pos=58, lineno=3, colno=3) + end_location: SourceLocation(pos=74, lineno=3, colno=19) + key: + + location: SourceLocation(pos=58, lineno=3, colno=3) + end_location: SourceLocation(pos=66, lineno=3, colno=11) + value: 'entity' + value: + + location: SourceLocation(pos=68, lineno=3, colno=13) + end_location: SourceLocation(pos=74, lineno=3, colno=19) + value: 'this' + + location: SourceLocation(pos=78, lineno=4, colno=3) + end_location: SourceLocation(pos=245, lineno=13, colno=4) + key: + + location: SourceLocation(pos=78, lineno=4, colno=3) + end_location: SourceLocation(pos=86, lineno=4, colno=11) + value: 'scores' + value: + + location: SourceLocation(pos=88, lineno=4, colno=13) + end_location: SourceLocation(pos=245, lineno=13, colno=4) + items: + + location: SourceLocation(pos=94, lineno=5, colno=5) + end_location: SourceLocation(pos=241, lineno=12, colno=6) + key: + + location: SourceLocation(pos=94, lineno=5, colno=5) + end_location: SourceLocation(pos=102, lineno=5, colno=13) + value: 'score1' + value: + + location: SourceLocation(pos=104, lineno=5, colno=15) + end_location: SourceLocation(pos=241, lineno=12, colno=6) + items: + + location: SourceLocation(pos=112, lineno=6, colno=7) + end_location: SourceLocation(pos=235, lineno=11, colno=8) + key: + + location: SourceLocation(pos=112, lineno=6, colno=7) + end_location: SourceLocation(pos=117, lineno=6, colno=12) + value: 'min' + value: + + location: SourceLocation(pos=119, lineno=6, colno=14) + end_location: SourceLocation(pos=235, lineno=11, colno=8) + items: + + location: SourceLocation(pos=129, lineno=7, colno=9) + end_location: SourceLocation(pos=154, lineno=7, colno=34) + key: + + location: SourceLocation(pos=129, lineno=7, colno=9) + end_location: SourceLocation(pos=135, lineno=7, colno=15) + value: 'type' + value: + + location: SourceLocation(pos=137, lineno=7, colno=17) + end_location: SourceLocation(pos=154, lineno=7, colno=34) + value: 'minecraft:score' + + location: SourceLocation(pos=164, lineno=8, colno=9) + end_location: SourceLocation(pos=180, lineno=8, colno=25) + key: + + location: SourceLocation(pos=164, lineno=8, colno=9) + end_location: SourceLocation(pos=172, lineno=8, colno=17) + value: 'target' + value: + + location: SourceLocation(pos=174, lineno=8, colno=19) + end_location: SourceLocation(pos=180, lineno=8, colno=25) + value: 'this' + + location: SourceLocation(pos=190, lineno=9, colno=9) + end_location: SourceLocation(pos=207, lineno=9, colno=26) + key: + + location: SourceLocation(pos=190, lineno=9, colno=9) + end_location: SourceLocation(pos=197, lineno=9, colno=16) + value: 'score' + value: + + location: SourceLocation(pos=199, lineno=9, colno=18) + end_location: SourceLocation(pos=207, lineno=9, colno=26) + value: 'score2' + + location: SourceLocation(pos=217, lineno=10, colno=9) + end_location: SourceLocation(pos=227, lineno=10, colno=19) + key: + + location: SourceLocation(pos=217, lineno=10, colno=9) + end_location: SourceLocation(pos=224, lineno=10, colno=16) + value: 'scale' + value: + + location: SourceLocation(pos=226, lineno=10, colno=18) + end_location: SourceLocation(pos=227, lineno=10, colno=19) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__0.txt b/packages/mecha/tests/snapshots/scripting__parse_96__0.txt new file mode 100644 index 000000000..348d04f71 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_96__0.txt @@ -0,0 +1,155 @@ +predicate = { + condition: "minecraft:entity_scores", + entity: "this", + scores: { + score1: { + min: { + type: "minecraft:score", + target: "this", + score: "score2", + scale: 1 + } + } + } +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=230, lineno=15, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=229, lineno=14, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=229, lineno=14, colno=2) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'predicate' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=229, lineno=14, colno=2) + items: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=52, lineno=2, colno=39) + key: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + value: 'condition' + value: + + location: SourceLocation(pos=27, lineno=2, colno=14) + end_location: SourceLocation(pos=52, lineno=2, colno=39) + value: 'minecraft:entity_scores' + + location: SourceLocation(pos=56, lineno=3, colno=3) + end_location: SourceLocation(pos=70, lineno=3, colno=17) + key: + + location: SourceLocation(pos=56, lineno=3, colno=3) + end_location: SourceLocation(pos=62, lineno=3, colno=9) + value: 'entity' + value: + + location: SourceLocation(pos=64, lineno=3, colno=11) + end_location: SourceLocation(pos=70, lineno=3, colno=17) + value: 'this' + + location: SourceLocation(pos=74, lineno=4, colno=3) + end_location: SourceLocation(pos=227, lineno=13, colno=4) + key: + + location: SourceLocation(pos=74, lineno=4, colno=3) + end_location: SourceLocation(pos=80, lineno=4, colno=9) + value: 'scores' + value: + + location: SourceLocation(pos=82, lineno=4, colno=11) + end_location: SourceLocation(pos=227, lineno=13, colno=4) + items: + + location: SourceLocation(pos=88, lineno=5, colno=5) + end_location: SourceLocation(pos=223, lineno=12, colno=6) + key: + + location: SourceLocation(pos=88, lineno=5, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=11) + value: 'score1' + value: + + location: SourceLocation(pos=96, lineno=5, colno=13) + end_location: SourceLocation(pos=223, lineno=12, colno=6) + items: + + location: SourceLocation(pos=104, lineno=6, colno=7) + end_location: SourceLocation(pos=217, lineno=11, colno=8) + key: + + location: SourceLocation(pos=104, lineno=6, colno=7) + end_location: SourceLocation(pos=107, lineno=6, colno=10) + value: 'min' + value: + + location: SourceLocation(pos=109, lineno=6, colno=12) + end_location: SourceLocation(pos=217, lineno=11, colno=8) + items: + + location: SourceLocation(pos=119, lineno=7, colno=9) + end_location: SourceLocation(pos=142, lineno=7, colno=32) + key: + + location: SourceLocation(pos=119, lineno=7, colno=9) + end_location: SourceLocation(pos=123, lineno=7, colno=13) + value: 'type' + value: + + location: SourceLocation(pos=125, lineno=7, colno=15) + end_location: SourceLocation(pos=142, lineno=7, colno=32) + value: 'minecraft:score' + + location: SourceLocation(pos=152, lineno=8, colno=9) + end_location: SourceLocation(pos=166, lineno=8, colno=23) + key: + + location: SourceLocation(pos=152, lineno=8, colno=9) + end_location: SourceLocation(pos=158, lineno=8, colno=15) + value: 'target' + value: + + location: SourceLocation(pos=160, lineno=8, colno=17) + end_location: SourceLocation(pos=166, lineno=8, colno=23) + value: 'this' + + location: SourceLocation(pos=176, lineno=9, colno=9) + end_location: SourceLocation(pos=191, lineno=9, colno=24) + key: + + location: SourceLocation(pos=176, lineno=9, colno=9) + end_location: SourceLocation(pos=181, lineno=9, colno=14) + value: 'score' + value: + + location: SourceLocation(pos=183, lineno=9, colno=16) + end_location: SourceLocation(pos=191, lineno=9, colno=24) + value: 'score2' + + location: SourceLocation(pos=201, lineno=10, colno=9) + end_location: SourceLocation(pos=209, lineno=10, colno=17) + key: + + location: SourceLocation(pos=201, lineno=10, colno=9) + end_location: SourceLocation(pos=206, lineno=10, colno=14) + value: 'scale' + value: + + location: SourceLocation(pos=208, lineno=10, colno=16) + end_location: SourceLocation(pos=209, lineno=10, colno=17) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__0.txt b/packages/mecha/tests/snapshots/scripting__parse_97__0.txt new file mode 100644 index 000000000..574633f33 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_97__0.txt @@ -0,0 +1,83 @@ +def f() + return {f(): f(), other: [{}, {}, "wat"]} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=12) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + items: + + location: SourceLocation(pos=20, lineno=2, colno=13) + end_location: SourceLocation(pos=28, lineno=2, colno=21) + key: + + location: SourceLocation(pos=20, lineno=2, colno=13) + end_location: SourceLocation(pos=23, lineno=2, colno=16) + value: + + location: SourceLocation(pos=20, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'f' + arguments: + + value: + + location: SourceLocation(pos=25, lineno=2, colno=18) + end_location: SourceLocation(pos=28, lineno=2, colno=21) + value: + + location: SourceLocation(pos=25, lineno=2, colno=18) + end_location: SourceLocation(pos=26, lineno=2, colno=19) + value: 'f' + arguments: + + + location: SourceLocation(pos=30, lineno=2, colno=23) + end_location: SourceLocation(pos=52, lineno=2, colno=45) + key: + + location: SourceLocation(pos=30, lineno=2, colno=23) + end_location: SourceLocation(pos=35, lineno=2, colno=28) + value: 'other' + value: + + location: SourceLocation(pos=37, lineno=2, colno=30) + end_location: SourceLocation(pos=52, lineno=2, colno=45) + items: + + location: SourceLocation(pos=38, lineno=2, colno=31) + end_location: SourceLocation(pos=40, lineno=2, colno=33) + items: + + + location: SourceLocation(pos=42, lineno=2, colno=35) + end_location: SourceLocation(pos=44, lineno=2, colno=37) + items: + + + location: SourceLocation(pos=46, lineno=2, colno=39) + end_location: SourceLocation(pos=51, lineno=2, colno=44) + value: 'wat' From 62de665b5f5f26f72469023270ce272b8043eab5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Dec 2021 08:11:21 +0000 Subject: [PATCH 0517/1554] 0.17.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index d67b10692..9463519d5 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.0 (2021-12-01) +### Feature +* Parse lists and dicts ([`5b1776b`](https://github.com/mcbeet/mecha/commit/5b1776be44c63392060e56f47a03082dcf201871)) + ## v0.16.0 (2021-12-01) ### Feature * Parse interpolated arguments ([`1e364ff`](https://github.com/mcbeet/mecha/commit/1e364ffa65e757378a42fc82ec3774eb0275e7ff)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 2141c86b3..d3ea8daac 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.16.0" +__version__ = "0.17.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8efcbfc76..3c1c28474 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.16.0" +version = "0.17.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 8eab10b069be38cbf9b87055d34a7609dded9884 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Dec 2021 21:25:11 +0100 Subject: [PATCH 0518/1554] chore: update lectern --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- .../tests/snapshots/examples__build_basic__0.pack.md | 2 ++ .../examples__build_basic_implicit_execute__0.pack.md | 2 ++ .../examples__build_basic_keep_comments__0.pack.md | 2 ++ .../snapshots/examples__build_basic_lint__0.pack.md | 2 ++ .../examples__build_basic_messages__0.pack.md | 2 ++ .../examples__build_basic_multiline__0.pack.md | 2 ++ .../snapshots/examples__build_basic_nesting__0.pack.md | 9 +++++++++ .../examples__build_basic_readonly__0.pack.md | 2 ++ .../examples__build_basic_relative_location__0.pack.md | 4 ++++ .../examples__build_custom_command__0.pack.md | 2 ++ .../snapshots/examples__build_kitchen_sink__0.pack.md | 9 +++++++++ 13 files changed, 44 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index dbe47ba9e..6708c5d57 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -324,14 +324,14 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "lectern" -version = "0.18.0" +version = "0.18.1" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.44.2" +beet = ">=0.45.3" click = ">=8.0.1,<9.0.0" markdown-it-py = ">=1.1.0,<2.0.0" @@ -808,7 +808,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "52d0d5a8c1c8c70b67fbbfbf790215ca094dd429798c22419b15c7b9b8036c21" +content-hash = "d8fd159c4ad7be1add35eb49f368a3b71884e002d7759761f6787e604437503e" [metadata.files] atomicwrites = [ @@ -975,8 +975,8 @@ keyring = [ {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] lectern = [ - {file = "lectern-0.18.0-py3-none-any.whl", hash = "sha256:b33ca5c017077bee1de583f24a43502da6666b80cb83beacd45e7963fb3b4c2d"}, - {file = "lectern-0.18.0.tar.gz", hash = "sha256:5c3fa58e8fe93699ea8abd151f9823863146493bdc4163dfb4c859c06128f7d2"}, + {file = "lectern-0.18.1-py3-none-any.whl", hash = "sha256:a6b6b19cfb3d54893f0ea085e8f582004f6191f1a6878ed1970ba272cedd8044"}, + {file = "lectern-0.18.1.tar.gz", hash = "sha256:2ccb479b7300fe9b40c1f292409170168627962896887b16e810c4fe33f3e2fa"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3c1c28474..3c3c00298 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -32,7 +32,7 @@ pytest = "^6.2.5" isort = "^5.10.1" python-semantic-release = "^7.23.0" pytest-insta = "^0.1.10" -lectern = "^0.18.0" +lectern = ">=0.18.1" [tool.poetry.scripts] mecha = "mecha.cli:main" diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md index 1ae9b7935..51fbf35bd 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md index 16a1caa0b..6e3f71756 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md index b962aae0d..0d459a5c6 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index d6db96fcd..2fb0190c9 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md index 005a43ef5..41a66a04d 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md index a33c2cb83..f5ec1a6d1 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index 57b7d8bfc..e84627b36 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction @@ -24,16 +26,19 @@ execute as @a at @s run function demo:foo/nested_execute_1 execute as @a at @s run say hello execute as @a at @s run say world ``` + `@function demo:thing2` ```mcfunction say this is a test ``` + `@function demo:thing3` ```mcfunction say this is a test ``` + `@function demo:thing1` ```mcfunction @@ -42,6 +47,7 @@ say world function demo:thing2 function demo:thing3 ``` + `@function demo:thing4` ```mcfunction @@ -49,6 +55,7 @@ setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone ``` + `@function demo:thing5` ```mcfunction @@ -56,6 +63,7 @@ setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone ``` + `@function demo:foo/nested_execute_0` ```mcfunction @@ -63,6 +71,7 @@ setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone ``` + `@function demo:foo/nested_execute_1` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md index 41c823ed9..7a4cbd277 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md index f9215e078..591e06d7a 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,16 +14,19 @@ ``` ### demo + `@function demo:bar` ```mcfunction say hello ``` + `@function demo:folder/wat` ```mcfunction function demo:bar ``` + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md index 84907576a..737c63a99 100644 --- a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,6 +14,7 @@ ``` ### demo + `@function demo:foo` ```mcfunction diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 845c952ef..2f18c172b 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -1,6 +1,7 @@ # Lectern snapshot ## Data pack + `@data_pack pack.mcmeta` ```json @@ -13,18 +14,21 @@ ``` ### demo + `@function demo:implicit_execute` ```mcfunction execute as @a at @s align xyz run summon armor_stand ~ ~ ~ {Tags: ["position_history", "new"], Invisible: 1b, Marker: 1b} execute if score @s obj matches 2 run say hi ``` + `@function demo:messages` ```mcfunction tellraw @p {"text": "hello", "color": "red"} data modify storage imp:io words set value ["alpha", "beta", "gamma", "delta"] ``` + `@function demo:nesting` ```mcfunction @@ -39,29 +43,34 @@ execute if data storage imp:temp iter.words.remaining[] run function demo:nestin execute if score @s tmp matches 0 run function demo:nesting/nested_execute_2 execute if score @s tmp matches 0 at @e[type=pig] unless entity @e[type=sheep] run setblock ~ ~ ~ dirt ``` + `@function demo:nesting/nested_execute_0` ```mcfunction say hello say world ``` + `@function demo:nesting/nested_execute_1` ```mcfunction say hello say world ``` + `@function demo:nesting/foo` ```mcfunction say this is a test ``` + `@function demo:nesting/loop` ```mcfunction say wow execute if data storage imp:temp iter.words.remaining[] run function demo:nesting/loop ``` + `@function demo:nesting/nested_execute_2` ```mcfunction From 80e9f938f049704087c8d4f3c58d7652cb7443d4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 2 Dec 2021 02:22:05 +0100 Subject: [PATCH 0519/1554] fix: convert normalizers to parsers and get rid of normalize step --- packages/mecha/mecha/api.py | 4 - .../mecha/mecha/contrib/implicit_execute.py | 79 ++++---- .../mecha/mecha/contrib/relative_location.py | 35 ++-- .../mecha/mecha/contrib/scripting/parse.py | 17 ++ .../resources/scripting_examples.mcfunction | 6 + .../snapshots/scripting__parse_42__0.txt | 159 ++++++++-------- .../snapshots/scripting__parse_43__0.txt | 99 +++++----- .../snapshots/scripting__parse_44__0.txt | 123 ++++++------ .../snapshots/scripting__parse_45__0.txt | 81 ++++---- .../snapshots/scripting__parse_46__0.txt | 179 +++++++++--------- .../snapshots/scripting__parse_48__0.txt | 2 +- .../snapshots/scripting__parse_98__0.txt | 8 + .../snapshots/scripting__parse_99__0.txt | 7 + 13 files changed, 434 insertions(+), 365 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_98__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_99__0.txt diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index ec8c9ff70..5b5e28aac 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -93,7 +93,6 @@ class Mecha: spec: CommandSpec = extra_field(default=None) lint: Dispatcher[AstRoot] = extra_field(init=False) - normalize: Dispatcher[AstRoot] = extra_field(init=False) transform: Dispatcher[AstRoot] = extra_field(init=False) optimize: Dispatcher[AstRoot] = extra_field(init=False) check: Dispatcher[AstRoot] = extra_field(init=False) @@ -128,7 +127,6 @@ def __post_init__( self.directory = ctx.directory self.lint = Reducer(levels=opts.rules) - self.normalize = MutatingReducer(levels=opts.rules) self.transform = MutatingReducer(levels=opts.rules) self.optimize = MutatingReducer(levels=opts.rules) self.check = Reducer(levels=opts.rules) @@ -142,13 +140,11 @@ def __post_init__( self.directory = Path.cwd() self.lint = Reducer() - self.normalize = MutatingReducer() self.transform = MutatingReducer() self.optimize = MutatingReducer() self.check = Reducer() self.steps.append(self.lint) - self.steps.append(self.normalize) self.steps.append(self.transform) self.steps.append(self.optimize) self.steps.append(self.check) diff --git a/packages/mecha/mecha/contrib/implicit_execute.py b/packages/mecha/mecha/contrib/implicit_execute.py index 129a48522..913556b5e 100644 --- a/packages/mecha/mecha/contrib/implicit_execute.py +++ b/packages/mecha/mecha/contrib/implicit_execute.py @@ -2,21 +2,22 @@ __all__ = [ - "ImplicitExecuteNormalizer", + "ImplicitExecuteParser", ] from dataclasses import dataclass, replace -from typing import Set, cast +from typing import Any, Set, cast from beet import Context -from beet.core.utils import required_field -from tokenstream import set_location +from tokenstream import TokenStream, set_location -from mecha import AstChildren, AstCommand, AstNode, Mecha, MutatingReducer, rule +from mecha import AstChildren, AstCommand, AstNode, Mecha, Parser def beet_default(ctx: Context): + ctx.require("mecha.contrib.nesting") + mc = ctx.inject(Mecha) if execute := mc.spec.tree.get("execute"): @@ -47,39 +48,47 @@ def beet_default(ctx: Context): } ) - mc.normalize.extend( - ImplicitExecuteNormalizer( - commands=commands, - shorthands=shorthands, - ) + mc.spec.parsers["command"] = ImplicitExecuteParser( + commands={ + name + for name in mc.spec.prototypes + if (s := name.split(":", 2)[:2]) + and s[0] == "execute" + and s[1] in commands + }, + shorthands={ + name + for name in mc.spec.prototypes + if name.partition(":")[0] in shorthands + }, + parser=mc.spec.parsers["command"], ) @dataclass -class ImplicitExecuteNormalizer(MutatingReducer): - """Normalizer that replaces implicit execute shorthands with the full command.""" - - commands: Set[str] = required_field() - shorthands: Set[str] = required_field() - - @rule(AstCommand) - def implicit_execute(self, node: AstCommand) -> AstCommand: - prefix, _, identifier = node.identifier.partition(":") - - if prefix == "execute" and identifier.partition(":")[0] in self.commands: - subcommand = replace(node, identifier=identifier) - run = AstCommand( - identifier="execute:run:subcommand", - arguments=AstChildren([cast(AstNode, subcommand)]), - ) - return set_location(run, node) - - elif prefix in self.shorthands: - subcommand = replace(node, identifier=f"execute:{node.identifier}") - execute = AstCommand( - identifier="execute:subcommand", - arguments=AstChildren([cast(AstNode, subcommand)]), - ) - return set_location(execute, node) +class ImplicitExecuteParser: + """Parser that replaces implicit execute shorthands with the full command.""" + + commands: Set[str] + shorthands: Set[str] + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier in self.commands: + subcommand = replace(node, identifier=node.identifier[8:]) + run = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([cast(AstNode, subcommand)]), + ) + return set_location(run, node) + + elif node.identifier in self.shorthands: + subcommand = replace(node, identifier=f"execute:{node.identifier}") + execute = AstCommand( + identifier="execute:subcommand", + arguments=AstChildren([cast(AstNode, subcommand)]), + ) + return set_location(execute, node) return node diff --git a/packages/mecha/mecha/contrib/relative_location.py b/packages/mecha/mecha/contrib/relative_location.py index c71b93b4d..84701afca 100644 --- a/packages/mecha/mecha/contrib/relative_location.py +++ b/packages/mecha/mecha/contrib/relative_location.py @@ -2,7 +2,7 @@ __all__ = [ - "RelativeResourceLocationNormalizer", + "RelativeResourceLocationParser", ] @@ -10,37 +10,38 @@ from pathlib import PurePosixPath from beet import Context -from beet.core.utils import required_field +from tokenstream import InvalidSyntax, TokenStream, set_location -from mecha import ( - AstResourceLocation, - CompilationDatabase, - Diagnostic, - Mecha, - MutatingReducer, - rule, -) +from mecha import AstResourceLocation, CompilationDatabase, Mecha, Parser def beet_default(ctx: Context): mc = ctx.inject(Mecha) - mc.normalize.extend(RelativeResourceLocationNormalizer(database=mc.database)) + mc.spec.parsers["resource_location_or_tag"] = RelativeResourceLocationParser( + database=mc.database, + parser=mc.spec.parsers["resource_location_or_tag"], + ) @dataclass -class RelativeResourceLocationNormalizer(MutatingReducer): - """Normalizer that resolves relative resource locations.""" +class RelativeResourceLocationParser: + """Parser that resolves relative resource locations.""" - database: CompilationDatabase = required_field() + database: CompilationDatabase + parser: Parser + + def __call__(self, stream: TokenStream) -> AstResourceLocation: + node: AstResourceLocation = self.parser(stream) - @rule(AstResourceLocation) - def relative_resource_location(self, node: AstResourceLocation): if node.namespace is None and node.path.startswith(("./", "../")): current_file = self.database.current path = self.database[current_file].resource_location if not path: - raise Diagnostic("error", "Can't resolve relative resource location.") + exc = InvalidSyntax( + f"Can't resolve relative resource location {node.path!r}." + ) + raise set_location(exc, node) namespace, _, current_path = path.partition(":") diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index f916ceb92..d120ea763 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -4,6 +4,7 @@ "get_stream_pending_identifiers", "UndefinedIdentifier", "create_scripting_root_parser", + "ExecuteIfConditionConstraint", "InterpolatedArgumentParser", "parse_statement", "AssignmentTargetParser", @@ -73,6 +74,7 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: ################################################################################ "root": create_scripting_root_parser(parsers["root"]), "nested_root": create_scripting_root_parser(parsers["nested_root"]), + "command": ExecuteIfConditionConstraint(parsers["command"]), "command:argument": InterpolatedArgumentParser(parsers["command:argument"]), "command:argument:mecha:scripting:statement": delegate("scripting:statement"), "command:argument:mecha:scripting:assignment_target": delegate( @@ -215,6 +217,21 @@ def create_scripting_root_parser(parser: Parser): ) +@dataclass +class ExecuteIfConditionConstraint: + """Constraint that prevents inlining if conditions as execute subcommands.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier == "execute:if:condition:body": + exc = InvalidSyntax("Can't inline conditions as execute subcommands.") + raise set_location(exc, node) + + return node + + @dataclass class InterpolatedArgumentParser: """Parser for interpolated command arguments.""" diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index b4a6abf9c..3f46bd63d 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -353,3 +353,9 @@ predicate = { ### def f() return {f(): f(), other: [{}, {}, "wat"]} +### +at @s if "foo" == "bar" + say yolo +### +at @s for i in "foo" + say yolo diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt index 3b79abbb2..f9508556d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -11,99 +11,104 @@ if score @s tmp matches 0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:score:target:targetObjective:matches:range:subcommand' + identifier: 'execute:subcommand' arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) + + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=109, lineno=5, colno=18) - root: - + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 0 + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - + root: + location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + location: SourceLocation(pos=58, lineno=3, colno=9) end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - operator: '==' - left: - + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=86, lineno=4, colno=19) end_location: SourceLocation(pos=91, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + location: SourceLocation(pos=100, lineno=5, colno=9) end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt index 919614440..3ce65e185 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -9,63 +9,68 @@ if score @s tmp matches 0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:score:target:targetObjective:matches:range:subcommand' + identifier: 'execute:subcommand' arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) + + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=3, colno=18) - root: - + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 0 + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - + root: + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + location: SourceLocation(pos=58, lineno=3, colno=9) end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt index 7e8c3751d..823961833 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -11,79 +11,84 @@ if score @s tmp matches 0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'if:score:target:targetObjective:matches:range:subcommand' + identifier: 'execute:subcommand' arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) + + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=91, lineno=5, colno=18) - root: - + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 0 + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - + root: + location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + location: SourceLocation(pos=49, lineno=3, colno=9) end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=82, lineno=5, colno=9) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + location: SourceLocation(pos=82, lineno=5, colno=9) end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt index c4a3bb80d..4b9975abf 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -9,53 +9,58 @@ if score @s tmp matches 0 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'if:score:target:targetObjective:matches:range:subcommand' + identifier: 'execute:subcommand' arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) + + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=58, lineno=3, colno=18) - root: - + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 0 + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - + root: + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + location: SourceLocation(pos=49, lineno=3, colno=9) end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index ebc0cd0dd..663ebdfea 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -11,111 +11,116 @@ if score @s tmp matches 42 location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'if:score:target:targetObjective:matches:range:subcommand' + identifier: 'execute:subcommand' arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: 42 - - location: SourceLocation(pos=31, lineno=2, colno=5) + + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=105, lineno=5, colno=26) - root: - + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 42 + location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - + root: + location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - identifier: 'statement' - arguments: - + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=41, lineno=2, colno=15) - operator: '=' - target: - + identifier: 'statement' + arguments: + location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'count' - value: - - location: SourceLocation(pos=39, lineno=2, colno=13) end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 42 - - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - operator: '>' - left: - + operator: '=' + target: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + value: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=60, lineno=3, colno=19) end_location: SourceLocation(pos=61, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - + identifier: 'say:message' + arguments: + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'statement' - arguments: - + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + location: SourceLocation(pos=88, lineno=5, colno=9) end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '=' - target: - + identifier: 'statement' + arguments: + location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) - value: 'count' - value: - - location: SourceLocation(pos=96, lineno=5, colno=17) end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) + operator: '=' + target: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) value: 'count' - right: - - location: SourceLocation(pos=104, lineno=5, colno=25) + value: + + location: SourceLocation(pos=96, lineno=5, colno=17) end_location: SourceLocation(pos=105, lineno=5, colno=26) - value: 1 + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 33c729b7a..932c6b820 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 99 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 100 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_98__0.txt b/packages/mecha/tests/snapshots/scripting__parse_98__0.txt new file mode 100644 index 000000000..3322a079e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_98__0.txt @@ -0,0 +1,8 @@ +#>ERROR Can't inline conditions as execute subcommands. +# line 1, column 7 +# 1 | at @s if "foo" == "bar" +# : ^^^^^^^^^^^^^^^^^ +# 2 | say yolo +# : ^^^^^^^^ +at @s if "foo" == "bar" + say yolo diff --git a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt new file mode 100644 index 000000000..ebc80394e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected literal 'run', literal 'if', literal 'unless', literal 'as', literal 'at', literal 'store' or 81 other tokens but got literal 'for'. +# line 1, column 7 +# 1 | at @s for i in "foo" +# : ^^^ +# 2 | say yolo +at @s for i in "foo" + say yolo From 9372f260b8c0086e11fe04d96396b19d9cc1d937 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 3 Dec 2021 10:30:46 +0100 Subject: [PATCH 0520/1554] fix: forgot to take into account number of matched fields when sorting rules --- packages/mecha/mecha/dispatch.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index f9c59c68a..8f75fe83c 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -190,7 +190,9 @@ def dispatch( node: AstNode, ) -> Iterator[Tuple[Optional[str], Callable[..., Any]]]: """Dispatch rules.""" - priority_queue: List[Tuple[int, int, Optional[str], Callable[..., Any]]] = [] + priority_queue: List[ + Tuple[int, int, int, Optional[str], Callable[..., Any]] + ] = [] for i, node_type in enumerate(type(node).mro()): if value := self.rules.get(node_type): @@ -202,12 +204,15 @@ def dispatch( for name, value in match_fields ): for priority, name, callback in callbacks: - heappush(priority_queue, (i, -priority, name, callback)) + heappush( + priority_queue, + (i, -len(match_fields), -priority, name, callback), + ) dispatched: Set[Callable[..., Any]] = set() while priority_queue: - _, _, name, callback = heappop(priority_queue) + _, _, _, name, callback = heappop(priority_queue) if callback not in dispatched: dispatched.add(callback) From d25de3e80587a68fe09d452735613a163c2d24d3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 3 Dec 2021 10:32:44 +0100 Subject: [PATCH 0521/1554] fix: invalidate ast cache on version bumps --- packages/mecha/mecha/api.py | 35 ++++++++++++++++++++++++-------- packages/mecha/mecha/commands.py | 5 +++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 5b5e28aac..49531312f 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -1,13 +1,14 @@ __all__ = [ "Mecha", "MechaOptions", - "CacheBackend", + "AstCacheBackend", ] import logging import os import pickle +import sys from contextlib import contextmanager from dataclasses import InitVar, dataclass from io import BufferedReader, BufferedWriter @@ -19,7 +20,6 @@ List, Literal, Optional, - Protocol, Type, TypeVar, Union, @@ -32,6 +32,8 @@ from tokenstream import InvalidSyntax, TokenStream from tokenstream.location import set_location +from mecha import __version__ + from .ast import AstNode, AstRoot from .config import CommandTree from .database import CompilationDatabase, CompilationUnit @@ -54,14 +56,29 @@ logger = logging.getLogger("mecha") -class CacheBackend(Protocol): - """Protocol for the cache backend.""" +class AstCacheBackend: + """Backend for the ast cache.""" - def load(self, f: BufferedReader) -> Any: - ... + def load_data(self, f: BufferedReader) -> JsonDict: + """Load the pickled data.""" + data = pickle.load(f) + if data["mecha"] != __version__ or data["python"] != sys.version: + raise ValueError("Version mismatch.") + return data - def dump(self, obj: Any, f: BufferedWriter): - ... + def dump_data(self, data: JsonDict, f: BufferedWriter): + """Dump the pickled data.""" + data["mecha"] = __version__ + data["python"] = sys.version + pickle.dump(data, f) + + def load(self, f: BufferedReader) -> AstRoot: + """Load the ast.""" + return self.load_data(f)["ast"] + + def dump(self, node: AstRoot, f: BufferedWriter): + """Dump the ast.""" + self.dump_data({"ast": node}, f) class MechaOptions(BaseModel): @@ -88,7 +105,7 @@ class Mecha: directory: Path = extra_field(init=False) cache: Optional[Cache] = extra_field(default=None) - cache_backend: CacheBackend = extra_field(default=pickle) + cache_backend: AstCacheBackend = extra_field(default=pickle) spec: CommandSpec = extra_field(default=None) diff --git a/packages/mecha/mecha/commands.py b/packages/mecha/mecha/commands.py index 3f1dd9059..e9a4cb586 100644 --- a/packages/mecha/mecha/commands.py +++ b/packages/mecha/mecha/commands.py @@ -1,10 +1,11 @@ import os -import pickle import click from beet import ErrorMessage, Project from beet.toolchain.cli import beet, echo +from mecha import AstCacheBackend + pass_project = click.make_pass_decorator(Project) # type: ignore @@ -18,6 +19,6 @@ def ast(project: Project, filename: str): try: with ast_path.open("rb") as f: - echo(pickle.load(f).dump()) + echo(AstCacheBackend().load(f).dump()) except FileNotFoundError as exc: raise ErrorMessage(f"No cached ast for {filename!r}.") from exc From d1d6726ec3b018c8c1c829706e6fd9938a705b93 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 4 Dec 2021 10:16:32 +0100 Subject: [PATCH 0522/1554] feat: add codegen --- .../mecha/examples/basic_scripting/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 71 +++ .../mecha/mecha/contrib/scripting/__init__.py | 3 + packages/mecha/mecha/contrib/scripting/ast.py | 11 +- .../mecha/mecha/contrib/scripting/codegen.py | 591 ++++++++++++++++++ .../mecha/mecha/contrib/scripting/helpers.py | 90 +++ .../mecha/mecha/contrib/scripting/parse.py | 99 +-- .../mecha/mecha/contrib/scripting/plugin.py | 146 +---- .../contrib/scripting/resources/__init__.py | 0 .../contrib/scripting/resources/commands.json | 130 ++++ .../mecha/mecha/contrib/scripting/runtime.py | 195 ++++++ packages/mecha/mecha/parse.py | 14 + .../resources/scripting_examples.mcfunction | 8 + ...examples__build_basic_scripting__0.pack.md | 50 ++ .../tests/snapshots/scripting__parse_0__1.txt | 22 + .../snapshots/scripting__parse_100__0.txt | 19 + .../snapshots/scripting__parse_100__1.txt | 4 + .../snapshots/scripting__parse_101__0.txt | 35 ++ .../snapshots/scripting__parse_101__1.txt | 60 ++ .../snapshots/scripting__parse_102__0.txt | 46 ++ .../snapshots/scripting__parse_102__1.txt | 93 +++ .../snapshots/scripting__parse_10__1.txt | 47 ++ .../snapshots/scripting__parse_11__1.txt | 47 ++ .../snapshots/scripting__parse_12__1.txt | 57 ++ .../snapshots/scripting__parse_13__1.txt | 52 ++ .../snapshots/scripting__parse_14__1.txt | 52 ++ .../snapshots/scripting__parse_15__1.txt | 42 ++ .../snapshots/scripting__parse_16__1.txt | 162 +++++ .../snapshots/scripting__parse_17__1.txt | 247 ++++++++ .../snapshots/scripting__parse_19__0.txt | 2 +- .../tests/snapshots/scripting__parse_1__1.txt | 22 + .../snapshots/scripting__parse_20__1.txt | 42 ++ .../snapshots/scripting__parse_21__1.txt | 22 + .../snapshots/scripting__parse_22__1.txt | 22 + .../snapshots/scripting__parse_23__1.txt | 22 + .../snapshots/scripting__parse_24__1.txt | 22 + .../snapshots/scripting__parse_25__1.txt | 22 + .../snapshots/scripting__parse_26__1.txt | 22 + .../snapshots/scripting__parse_29__1.txt | 22 + .../tests/snapshots/scripting__parse_2__1.txt | 22 + .../snapshots/scripting__parse_32__1.txt | 42 ++ .../snapshots/scripting__parse_33__1.txt | 52 ++ .../snapshots/scripting__parse_34__1.txt | 76 +++ .../snapshots/scripting__parse_35__1.txt | 156 +++++ .../snapshots/scripting__parse_39__0.txt | 2 +- .../tests/snapshots/scripting__parse_3__1.txt | 22 + .../snapshots/scripting__parse_41__1.txt | 58 ++ .../snapshots/scripting__parse_42__0.txt | 5 +- .../snapshots/scripting__parse_42__1.txt | 542 ++++++++++++++++ .../snapshots/scripting__parse_43__0.txt | 5 +- .../snapshots/scripting__parse_43__1.txt | 342 ++++++++++ .../snapshots/scripting__parse_44__0.txt | 5 +- .../snapshots/scripting__parse_44__1.txt | 442 +++++++++++++ .../snapshots/scripting__parse_45__0.txt | 5 +- .../snapshots/scripting__parse_45__1.txt | 292 +++++++++ .../snapshots/scripting__parse_46__0.txt | 5 +- .../snapshots/scripting__parse_46__1.txt | 580 +++++++++++++++++ .../snapshots/scripting__parse_47__1.txt | 42 ++ .../snapshots/scripting__parse_48__0.txt | 2 +- .../snapshots/scripting__parse_49__1.txt | 42 ++ .../tests/snapshots/scripting__parse_4__1.txt | 22 + .../snapshots/scripting__parse_50__1.txt | 52 ++ .../snapshots/scripting__parse_51__1.txt | 62 ++ .../snapshots/scripting__parse_53__1.txt | 52 ++ .../snapshots/scripting__parse_55__1.txt | 50 ++ .../snapshots/scripting__parse_57__1.txt | 52 ++ .../tests/snapshots/scripting__parse_5__1.txt | 32 + .../snapshots/scripting__parse_62__1.txt | 65 ++ .../snapshots/scripting__parse_63__1.txt | 33 + .../snapshots/scripting__parse_64__1.txt | 61 ++ .../snapshots/scripting__parse_65__1.txt | 28 + .../snapshots/scripting__parse_66__1.txt | 33 + .../snapshots/scripting__parse_67__1.txt | 43 ++ .../snapshots/scripting__parse_68__1.txt | 89 +++ .../snapshots/scripting__parse_69__1.txt | 39 ++ .../tests/snapshots/scripting__parse_6__1.txt | 32 + .../snapshots/scripting__parse_70__1.txt | 76 +++ .../snapshots/scripting__parse_71__1.txt | 76 +++ .../snapshots/scripting__parse_72__1.txt | 103 +++ .../snapshots/scripting__parse_77__1.txt | 92 +++ .../tests/snapshots/scripting__parse_7__1.txt | 42 ++ .../snapshots/scripting__parse_81__1.txt | 236 +++++++ .../snapshots/scripting__parse_82__1.txt | 122 ++++ .../snapshots/scripting__parse_84__1.txt | 35 ++ .../snapshots/scripting__parse_87__1.txt | 74 +++ .../snapshots/scripting__parse_89__0.txt | 9 +- .../snapshots/scripting__parse_89__1.txt | 112 ++++ .../tests/snapshots/scripting__parse_8__1.txt | 42 ++ .../snapshots/scripting__parse_91__1.txt | 35 ++ .../snapshots/scripting__parse_92__1.txt | 55 ++ .../snapshots/scripting__parse_93__1.txt | 55 ++ .../snapshots/scripting__parse_94__1.txt | 89 +++ .../snapshots/scripting__parse_95__1.txt | 149 +++++ .../snapshots/scripting__parse_96__1.txt | 149 +++++ .../snapshots/scripting__parse_97__1.txt | 90 +++ .../tests/snapshots/scripting__parse_9__1.txt | 37 ++ packages/mecha/tests/test_scripting.py | 21 +- 97 files changed, 7596 insertions(+), 206 deletions(-) create mode 100644 packages/mecha/examples/basic_scripting/beet.yml create mode 100644 packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/scripting/codegen.py create mode 100644 packages/mecha/mecha/contrib/scripting/helpers.py create mode 100644 packages/mecha/mecha/contrib/scripting/resources/__init__.py create mode 100644 packages/mecha/mecha/contrib/scripting/resources/commands.json create mode 100644 packages/mecha/mecha/contrib/scripting/runtime.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md create mode 100644 packages/mecha/tests/snapshots/scripting__parse_0__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_100__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_100__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_101__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_101__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_102__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_102__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_10__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_11__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_12__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_13__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_14__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_15__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_16__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_17__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_1__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_20__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_21__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_22__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_23__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_24__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_25__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_26__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_29__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_2__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_32__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_33__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_34__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_35__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_3__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_41__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_42__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_43__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_44__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_45__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_46__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_47__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_49__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_4__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_50__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_51__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_53__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_55__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_57__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_5__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_62__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_63__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_64__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_65__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_66__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_67__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_68__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_69__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_6__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_70__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_71__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_72__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_77__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_7__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_81__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_82__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_84__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_87__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_89__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_8__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_91__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_92__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_93__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_94__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_95__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_96__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_97__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_9__1.txt diff --git a/packages/mecha/examples/basic_scripting/beet.yml b/packages/mecha/examples/basic_scripting/beet.yml new file mode 100644 index 000000000..6e75ff680 --- /dev/null +++ b/packages/mecha/examples/basic_scripting/beet.yml @@ -0,0 +1,6 @@ +require: + - mecha.contrib.scripting +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..9f7c23380 --- /dev/null +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,71 @@ +say hello +say this is a function file augmented with mecha + +if score @s tmp matches 1.. as @a + for feature in [ + "multiline", + "nesting", + "implicit execute", + "relative location", + ] + say (feature + " is automatically enabled") + message = "abc" * 5 + say message.upper() + +def you_can_make_functions() + say you_can_make_functions.__name__.replace("_", " ").capitalize() + tellraw @a [ + "", + {"text": "yep"}, + ] + return "and return values" + +say you_can_make_functions() + +def fib(n) + if n <= 1 + return n + return fib(n - 1) + fib(n - 2) + +say fib(7) +say fib(8) +say fib(9) + +def default_params_are_neat( + number, + result=fib(number), + thing={ + "number": number, + "result": result, + }, +) + say Unlike in python default params are evaluated when the function is called + say number + say result + say thing + +default_params_are_neat(12) + +say this is basically a custom subset of python +say functions are first-class objects just like in python + +my_functions = [] + +for i in "abc" + def functions_in_loop(value) + def yo() + say value.upper() + return yo + my_functions.append(functions_in_loop(i * 3)) + +my_functions[0]() +my_functions[1]() +my_functions[2]() + +should_break = False + +while True + if should_break + break + say just once + should_break = True diff --git a/packages/mecha/mecha/contrib/scripting/__init__.py b/packages/mecha/mecha/contrib/scripting/__init__.py index dc6e15135..c827b77af 100644 --- a/packages/mecha/mecha/contrib/scripting/__init__.py +++ b/packages/mecha/mecha/contrib/scripting/__init__.py @@ -1,3 +1,6 @@ from .ast import * +from .codegen import * +from .helpers import * from .parse import * from .plugin import * +from .runtime import * diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index c8e0c5dfd..9779a53a7 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -16,11 +16,12 @@ "AstFunctionSignature", "AstFunctionSignatureArgument", "AstFunctionRoot", + "AstCommandInterpolation", ] from dataclasses import dataclass -from typing import Any, ClassVar, Optional +from typing import Any, ClassVar, Optional, Tuple from beet.core.utils import required_field from tokenstream import TokenStream @@ -154,3 +155,11 @@ class AstFunctionRoot(AstNode): """Ast function root node.""" stream: TokenStream = required_field() + + +@dataclass(frozen=True) +class AstCommandInterpolation(AstNode): + """Ast command interpolation node.""" + + scope: Tuple[str, ...] = required_field() + value: AstExpression = required_field() diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py new file mode 100644 index 000000000..a9c6545b5 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -0,0 +1,591 @@ +__all__ = [ + "Codegen", + "Accumulator", + "ChildrenCollector", + "CommandCollector", + "RootCommandCollector", + "visit_single", + "visit_multiple", + "visit_generic", + "visit_body", +] + + +from contextlib import contextmanager +from dataclasses import dataclass, field, fields +from typing import ( + Any, + Dict, + Generator, + Iterable, + List, + Literal, + Optional, + Tuple, + Type, + cast, + overload, +) + +from beet.core.utils import normalize_string, required_field + +from mecha import AstChildren, AstCommand, AstNode, AstRoot, CommandSpec, Visitor, rule + +from .ast import ( + AstAssignment, + AstAssignmentTargetIdentifier, + AstAttribute, + AstCall, + AstCommandInterpolation, + AstDict, + AstExpressionBinary, + AstExpressionUnary, + AstFunctionSignature, + AstIdentifier, + AstList, + AstLookup, + AstValue, +) + + +@dataclass +class Accumulator: + """Utility for generating python code.""" + + indentation: str = "" + refs: List[Any] = field(default_factory=list) + lines: List[str] = field(default_factory=list) + counter: int = 0 + header: Dict[str, str] = field(default_factory=dict) + + def get_source(self) -> str: + """Return the source code.""" + header = "".join( + f"{variable} = {expression}\n" + for expression, variable in self.header.items() + ) + return header + "".join(self.lines) + + def helper(self, name: str, *args: Any) -> str: + """Emit helper.""" + helper = f"_mecha_runtime.helpers[{name!r}]" + + if helper not in self.header: + self.header[helper] = f"_mecha_helper_{normalize_string(name)}" + + return f"{self.header[helper]}({', '.join(map(str, args))})" + + def replace(self, node: str, **kwargs: str) -> str: + """Emit replace helper.""" + return self.helper("replace", node, *(f"{k}={v}" for k, v in kwargs.items())) + + def missing(self) -> str: + """Emit missing sentinel.""" + self.header["_mecha_runtime.helpers['missing']"] = f"_mecha_helper_missing" + return f"_mecha_helper_missing" + + def children(self, nodes: Iterable[str]) -> str: + """Emit children helper.""" + return self.helper("children", f"[{', '.join(nodes)}]") + + def make_ref(self, obj: Any) -> str: + """Register ref.""" + index = len(self.refs) + self.refs.append(obj) + return f"_mecha_refs[{index}]" + + def make_ref_slice(self, objs: Iterable[Any]) -> str: + """Register ref slice.""" + start = len(self.refs) + self.refs.extend(objs) + stop = len(self.refs) + return f"_mecha_refs[{start}:{stop}]" + + def make_variable(self) -> str: + """Create a unique variable name.""" + name = f"_mecha_var{self.counter}" + self.counter += 1 + return name + + @contextmanager + def block(self): + """Wrap statements in an indented block.""" + previous_indentation = self.indentation + self.indentation += " " + try: + yield + finally: + self.indentation = previous_indentation + + def statement(self, code: str): + """Emit statement.""" + self.lines.append(f"{self.indentation}{code}\n") + + +@dataclass +class ChildrenCollector: + """Generic children collector.""" + + acc: Accumulator + start_index: int + children: List[str] = field(default_factory=list) + + def add_static(self, *args: AstNode): + self.children.extend(self.acc.make_ref(node) for node in args) + + def add_dynamic(self, *args: str): + self.children.extend(args) + + def flush(self) -> str: + return self.acc.children(self.children) + + +class CommandCollector(ChildrenCollector): + """Collector for commands.""" + + def add_static(self, *args: AstNode): + if len(args) > 1: + self.acc.statement( + f"_mecha_runtime.commands.extend({self.acc.make_ref_slice(args)})" + ) + elif args: + self.acc.statement( + f"_mecha_runtime.commands.append({self.acc.make_ref(args[0])})" + ) + + def add_dynamic(self, *args: str): + for arg in args: + self.acc.statement(f"_mecha_runtime.commands.append({arg})") + + +class RootCommandCollector(CommandCollector): + """Collector for commands in a standalone root node.""" + + def flush(self) -> str: + commands = self.acc.make_variable() + self.acc.lines[self.start_index :] = [ + f" {line}" for line in self.acc.lines[self.start_index :] + ] + self.acc.lines.insert( + self.start_index, + f"{self.acc.indentation}with _mecha_runtime.scope() as {commands}:\n", + ) + return self.acc.helper("children", commands) + + +@overload +def visit_single( + node: AstNode, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + ... + + +@overload +def visit_single( + node: AstNode, + required: Literal[True], +) -> Generator[AstNode, Optional[List[str]], str]: + ... + + +def visit_single( + node: AstNode, + required: bool = False, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + """Yield the node and make sure that it returns a single result.""" + result = yield node + + if result is None: + if required: + raise ValueError( + f"Result required for {node.__class__.__name__} {result!r}." + ) + return None + + if len(result) != 1: + raise ValueError( + f"Expected single result for {node.__class__.__name__} {result!r}." + ) + + return result[0] + + +def visit_multiple( + children: AstChildren[AstNode], + acc: Accumulator, + children_collector: Type[ChildrenCollector] = ChildrenCollector, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + """Yield all the nodes and return a single result pointing to the new children.""" + current_count = 0 + collector = None + index = len(acc.lines) + + for i, child in enumerate(children): + result = yield child + if result is None: + continue + if not collector: + collector = children_collector(acc, index) + + lines = acc.lines[index:] + del acc.lines[index:] + collector.add_static(*children[current_count:i]) + acc.lines.extend(lines) + collector.add_dynamic(*result) + + current_count = i + 1 + index = len(acc.lines) + + if collector: + collector.add_static(*children[current_count:]) + return collector.flush() + + return None + + +def visit_generic( + node: AstNode, + acc: Accumulator, + children_collector: Type[ChildrenCollector] = ChildrenCollector, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + """Recursively yield all the fields and return a result pointing to the updated node.""" + to_replace: Dict[str, str] = {} + + for f in fields(node): + attribute = getattr(node, f.name) + result = None + + if isinstance(attribute, AstChildren): + attribute = cast(AstChildren[AstNode], attribute) + result = yield from visit_multiple(attribute, acc, children_collector) + + elif isinstance(attribute, AstNode): + result = yield from visit_single(attribute) + + if result is not None: + to_replace[f.name] = result + + if not to_replace: + return None + + return acc.replace(acc.make_ref(node), **to_replace) + + +def visit_body( + node: AstRoot, + acc: Accumulator, +) -> Generator[AstNode, Optional[List[str]], None]: + """Emit each individual command in the current scope.""" + commands = cast(AstChildren[AstNode], node.commands) + result = yield from visit_multiple(commands, acc, CommandCollector) + if result is None: + acc.statement(f"_mecha_runtime.commands.extend({acc.make_ref(node)}.commands)") + + +@dataclass +class Codegen(Visitor): + """Code generator.""" + + spec: CommandSpec = required_field() + + def __call__(self, node: AstRoot) -> Tuple[Optional[str], Optional[str], List[Any]]: # type: ignore + acc = Accumulator() + result = self.invoke(node, acc) + if result is None: + return None, None, acc.refs + elif len(result) != 1: + raise ValueError( + f"Expected single result for {node.__class__.__name__} {result!r}." + ) + output = acc.make_variable() + acc.statement(f"{output} = {result[0]}") + return acc.get_source(), output, acc.refs + + @rule(AstNode) + def fallback( + self, + node: AstNode, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_generic(node, acc) + if result is None: + return None + return [result] + + @rule(AstRoot) + def root( + self, + node: AstRoot, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_generic(node, acc, RootCommandCollector) + if result is None: + return None + return [result] + + @rule(AstCommand, identifier="statement") + def statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.arguments[0]) + if value is not None: + acc.statement(value) + return [] + + @rule(AstCommand, identifier="def:function:body") + def function( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + signature = cast(AstFunctionSignature, node.arguments[0]) + arguments: List[str] = [ + f"{arg.name}={acc.missing()}" if arg.default else arg.name + for arg in signature.arguments + ] + + acc.statement(f"def {signature.name}({', '.join(arguments)}):") + + with acc.block(): + for arg in signature.arguments: + if arg.default: + acc.statement(f"if {arg.name} is {acc.missing()}:") + with acc.block(): + value = yield from visit_single(arg.default, required=True) + acc.statement(f"{arg.name} = {value}") + + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + + return [] + + @rule(AstCommand, identifier="return") + @rule(AstCommand, identifier="return:value") + def return_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + statement = "return" + if node.arguments: + value = yield from visit_single(node.arguments[0], required=True) + statement += f" {value}" + acc.statement(statement) + return [] + + @rule(AstCommand, identifier="if:condition:body") + def if_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + condition = yield from visit_single(node.arguments[0], required=True) + acc.statement(f"if {condition}:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + return [] + + @rule(AstCommand, identifier="elif:condition:body") + def elif_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + condition = yield from visit_single(node.arguments[0], required=True) + acc.statement(f"elif {condition}:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + return [] + + @rule(AstCommand, identifier="else:body") + def else_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + acc.statement(f"else:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[0]), acc) + return [] + + @rule(AstCommand, identifier="while:condition:body") + def while_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + condition = yield from visit_single(node.arguments[0], required=True) + acc.statement(f"while {condition}:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + return [] + + @rule(AstCommand, identifier="for:target:in:iterable:body") + def for_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + target = yield from visit_single(node.arguments[0], required=True) + iterable = yield from visit_single(node.arguments[1], required=True) + acc.statement(f"for {target} in {iterable}:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[2]), acc) + return [] + + @rule(AstCommand, identifier="break") + def break_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement("break") + return [] + + @rule(AstCommand, identifier="continue") + def continue_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement("continue") + return [] + + @rule(AstCommandInterpolation) + def command_interpolation( + self, + node: AstCommandInterpolation, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + tree = self.spec.tree.get(node.scope) + if not tree: + raise ValueError("Missing entry for command argument {scope!r}.") + + result = yield from visit_single(node.value, required=True) + + return [ + acc.helper( + "set_location", + acc.helper(f"convert:{tree.parser}", result, tree.properties or {}), + acc.make_ref(node), + ) + ] + + @rule(AstExpressionBinary) + def binary( + self, + node: AstExpressionBinary, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + op = node.operator.replace("_", " ") + left = yield from visit_single(node.left, required=True) + right = yield from visit_single(node.right, required=True) + return [f"({left} {op} {right})"] + + @rule(AstExpressionUnary) + def unary( + self, + node: AstExpressionUnary, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + op = node.operator.replace("_", " ") + value = yield from visit_single(node.value, required=True) + return [f"({op} {value})"] + + @rule(AstValue) + def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: + return [repr(node.value)] + + @rule(AstIdentifier) + def identifier(self, node: AstIdentifier, acc: Accumulator) -> Optional[List[str]]: + return [node.value] + + @rule(AstList) + def list( + self, + node: AstList, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + items: List[str] = [] + + for item in node.items: + value = yield from visit_single(item, required=True) + items.append(value) + + return [f"[{', '.join(items)}]"] + + @rule(AstDict) + def dict( + self, + node: AstDict, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + items: List[str] = [] + + for item in node.items: + key = yield from visit_single(item.key, required=True) + value = yield from visit_single(item.value, required=True) + items.append(f"{key}: {value}") + + return [f"{{{', '.join(items)}}}"] + + @rule(AstAttribute) + def attribute( + self, + node: AstAttribute, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.value, required=True) + return [acc.helper("get_attribute", value, repr(node.name))] + + @rule(AstLookup) + def lookup( + self, + node: AstLookup, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + arguments: List[str] = [] + + for arg in node.arguments: + value = yield from visit_single(arg, required=True) + arguments.append(value) + + value = yield from visit_single(node.value, required=True) + + return [f"{value}[{', '.join(arguments)}]"] + + @rule(AstCall) + def call( + self, + node: AstCall, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + arguments: List[str] = [] + + for arg in node.arguments: + value = yield from visit_single(arg, required=True) + arguments.append(value) + + value = yield from visit_single(node.value, required=True) + + return [f"{value}({', '.join(arguments)})"] + + @rule(AstAssignment) + def assignment( + self, + node: AstAssignment, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + op = node.operator + target = yield from visit_single(node.target, required=True) + value = yield from visit_single(node.value, required=True) + return [f"{target} {op} {value}"] + + @rule(AstAssignmentTargetIdentifier) + def assignment_target_identifier( + self, + node: AstAssignmentTargetIdentifier, + acc: Accumulator, + ) -> Optional[List[str]]: + return [node.value] diff --git a/packages/mecha/mecha/contrib/scripting/helpers.py b/packages/mecha/mecha/contrib/scripting/helpers.py new file mode 100644 index 000000000..8c04497d9 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/helpers.py @@ -0,0 +1,90 @@ +__all__ = [ + "get_scripting_helpers", +] + + +import re +from dataclasses import replace +from typing import Any, Dict, Union, cast + +from beet.core.utils import JsonDict +from tokenstream import set_location + +from mecha import ( + AstBool, + AstChildren, + AstJson, + AstLiteral, + AstNode, + AstNumber, + AstString, +) +from mecha.ast import AstMessage, AstSelector + +WORD_REGEX = re.compile(r"[0-9A-Za-z_\.\+\-]+") + + +def get_scripting_helpers() -> Dict[str, Any]: + """Return a collection of helpers used by the generated code.""" + return { + "replace": replace, + "missing": object(), + "children": AstChildren, + "set_location": set_location, + "get_attribute": get_attribute, + "convert:brigadier:bool": convert_bool, + "convert:brigadier:double": convert_float, + "convert:brigadier:float": convert_float, + "convert:brigadier:integer": convert_int, + "convert:brigadier:long": convert_int, + "convert:brigadier:string": convert_string, + "convert:minecraft:component": convert_json, + "convert:minecraft:message": convert_message, + } + + +def get_attribute(obj: Any, attr: str): + try: + return getattr(obj, attr) + except AttributeError: + pass + return obj[attr] + + +def convert_bool(obj: Any, properties: JsonDict) -> AstBool: + return AstBool(value=bool(obj)) + + +def convert_float(obj: Any, properties: JsonDict) -> AstNumber: + return AstNumber(value=float(obj)) + + +def convert_int(obj: Any, properties: JsonDict) -> AstNumber: + return AstNumber(value=int(obj)) + + +def convert_string(obj: Any, properties: JsonDict) -> AstNode: + value = str(obj) + string_type = properties["type"] + + if string_type == "greedy": + return AstLiteral(value=value) + elif string_type == "word": + if WORD_REGEX.match(value): + return AstLiteral(value=value) + raise ValueError("Invalid word {value!r}.") + elif string_type == "phrase": + return AstString(value=value) + + raise ValueError(f"Invalid string type {string_type!r}.") + + +def convert_json(obj: Any, properties: JsonDict) -> AstJson: + return AstJson.from_value(obj) + + +def convert_message(obj: Any, properties: JsonDict) -> AstMessage: + fragments = AstChildren([AstLiteral(value=str(obj))]) + return AstMessage( + fragments=cast(AstChildren[Union[AstLiteral, AstSelector]], fragments) + ) diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index d120ea763..e2467bb06 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -17,7 +17,8 @@ "ReturnConstraint", "BinaryParser", "UnaryParser", - "AtomParser", + "PrimaryParser", + "LiteralParser", ] @@ -29,6 +30,7 @@ from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location from mecha import ( + AlternativeParser, AstChildren, AstCommand, AstRoot, @@ -46,6 +48,7 @@ AstAssignmentTargetIdentifier, AstAttribute, AstCall, + AstCommandInterpolation, AstDict, AstDictItem, AstExpression, @@ -61,6 +64,9 @@ ) from .utils import ScriptingQuoteHelper +TRUE_PATTERN: str = r"\b[tT]rue\b" +FALSE_PATTERN: str = r"\b[fF]alse\b" +NULL_PATTERN: str = r"\b(?:null|None)\b" IDENTIFIER_PATTERN: str = r"[a-zA-Z_][a-zA-Z0-9_]*" STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" @@ -97,7 +103,8 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: "scripting:augmented_assignment_target": AssignmentTargetParser(), "scripting:function_signature": parse_function_signature, "scripting:function_root": parse_function_root, - "scripting:interpolated_command_argument": delegate("scripting:primary"), + "scripting:interpolation": PrimaryParser(delegate("scripting:identifier")), + "scripting:identifier": parse_identifier, "scripting:expression": delegate("scripting:disjunction"), "scripting:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -159,8 +166,14 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: parser=delegate("scripting:primary"), right_associative=True, ), - "scripting:primary": PrimaryParser(), - "scripting:atom": AtomParser(), + "scripting:primary": PrimaryParser(delegate("scripting:atom")), + "scripting:atom": AlternativeParser( + [ + delegate("scripting:identifier"), + delegate("scripting:literal"), + ] + ), + "scripting:literal": LiteralParser(), } @@ -251,12 +264,15 @@ def __call__(self, stream: TokenStream) -> Any: ): return self.parser(stream) - for parser, alternative in stream.choose( - delegate("scripting:interpolated_command_argument"), - self.parser, - ): + for parser, alternative in stream.choose("interpolation", "argument"): with alternative: - return parser(stream) + if parser == "interpolation": + node = delegate("scripting:interpolation", stream) + return set_location( + AstCommandInterpolation(scope=scope, value=node), node + ) + elif parser == "argument": + return self.parser(stream) def parse_statement(stream: TokenStream) -> Any: @@ -452,6 +468,25 @@ def parse_function_root(stream: TokenStream) -> AstFunctionRoot: return set_location(node, token, stream.current) +def parse_identifier(stream: TokenStream) -> AstIdentifier: + """Parse identifier.""" + identifiers = get_stream_identifiers(stream) + + with stream.syntax( + true=TRUE_PATTERN, + false=FALSE_PATTERN, + null=NULL_PATTERN, + identifier=IDENTIFIER_PATTERN, + ): + token = stream.expect("identifier") + + if token.value not in identifiers: + exc = UndefinedIdentifier(token, identifiers) + raise set_location(exc, token) + + return set_location(AstIdentifier(value=token.value), token) + + @dataclass class FunctionRootBacktracker: """Parser for backtracking over function root nodes.""" @@ -570,10 +605,17 @@ def __call__(self, stream: TokenStream) -> Any: class PrimaryParser: """Parser for primary expressions.""" + parser: Parser quote_helper: QuoteHelper = field(default_factory=ScriptingQuoteHelper) def __call__(self, stream: TokenStream) -> Any: - node = delegate("scripting:atom", stream) + with stream.syntax(brace=r"\(|\)"): + if stream.get(("brace", "(")): + with stream.ignore("newline"): + node = delegate("scripting:expression", stream) + stream.expect(("brace", ")")) + else: + node = self.parser(stream) with stream.syntax( dot=r"\.", @@ -630,8 +672,8 @@ def __call__(self, stream: TokenStream) -> Any: @dataclass -class AtomParser: - """Parser for atoms.""" +class LiteralParser: + """Parser for literals.""" quote_helper: QuoteHelper = field(default_factory=ScriptingQuoteHelper) @@ -639,46 +681,27 @@ def __call__(self, stream: TokenStream) -> Any: identifiers = get_stream_identifiers(stream) with stream.syntax( - brace=r"\(|\)", curly=r"\{|\}", bracket=r"\[|\]", colon=r":", comma=r",", - true=r"\b[tT]rue\b", - false=r"\b[fF]alse\b", - null=r"\b(?:null|None)\b", + true=TRUE_PATTERN, + false=FALSE_PATTERN, + null=NULL_PATTERN, identifier=IDENTIFIER_PATTERN, string=STRING_PATTERN, number=NUMBER_PATTERN, ): - ( - brace, - curly, - bracket, - true, - false, - null, - identifier, - string, - number, - ) = stream.expect( - ("brace", "("), + curly, bracket, true, false, null, string, number = stream.expect( ("curly", "{"), ("bracket", "["), "true", "false", "null", - "identifier", "string", "number", ) - if brace: - with stream.ignore("newline"): - inner = delegate("scripting:expression", stream) - stream.expect(("brace", ")")) - return inner - if curly: items: List[AstDictItem] = [] @@ -726,12 +749,6 @@ def __call__(self, stream: TokenStream) -> Any: node = AstList(items=AstChildren(elements)) return set_location(node, bracket, stream.current) - if identifier: - if identifier.value not in identifiers: - exc = UndefinedIdentifier(identifier, identifiers) - raise set_location(exc, identifier) - return set_location(AstIdentifier(value=identifier.value), identifier) - if true: value = True elif false: diff --git a/packages/mecha/mecha/contrib/scripting/plugin.py b/packages/mecha/mecha/contrib/scripting/plugin.py index c68a218d8..d66a11ff4 100644 --- a/packages/mecha/mecha/contrib/scripting/plugin.py +++ b/packages/mecha/mecha/contrib/scripting/plugin.py @@ -5,150 +5,8 @@ from beet import Context -from mecha import Mecha - -from .parse import get_scripting_parsers - -COMMAND_TREE = { - "type": "root", - "children": { - "statement": { - "type": "argument", - "parser": "mecha:scripting:statement", - "executable": True, - }, - "def": { - "type": "literal", - "children": { - "function": { - "type": "argument", - "parser": "mecha:scripting:function_signature", - "children": { - "body": { - "type": "argument", - "parser": "mecha:scripting:function_root", - "executable": True, - } - }, - } - }, - }, - "return": { - "type": "literal", - "executable": True, - "children": { - "value": { - "type": "argument", - "parser": "mecha:scripting:expression", - "executable": True, - } - }, - }, - "if": { - "type": "literal", - "children": { - "condition": { - "type": "argument", - "parser": "mecha:scripting:expression", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": True, - } - }, - } - }, - }, - "elif": { - "type": "literal", - "children": { - "condition": { - "type": "argument", - "parser": "mecha:scripting:expression", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": True, - } - }, - } - }, - }, - "else": { - "type": "literal", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": True, - } - }, - }, - "while": { - "type": "literal", - "children": { - "condition": { - "type": "argument", - "parser": "mecha:scripting:expression", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": True, - } - }, - } - }, - }, - "for": { - "type": "literal", - "children": { - "target": { - "type": "argument", - "parser": "mecha:scripting:assignment_target", - "children": { - "in": { - "type": "literal", - "children": { - "iterable": { - "type": "argument", - "parser": "mecha:scripting:expression", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": True, - } - }, - } - }, - } - }, - } - }, - }, - "break": { - "type": "literal", - "executable": True, - }, - "continue": { - "type": "literal", - "executable": True, - }, - }, -} +from .runtime import Runtime def beet_default(ctx: Context): - ctx.require( - "mecha.contrib.relative_location", - "mecha.contrib.implicit_execute", - "mecha.contrib.nesting", - ) - - mc = ctx.inject(Mecha) - - mc.spec.add_commands(COMMAND_TREE) - mc.spec.parsers.update(get_scripting_parsers(mc.spec.parsers)) + ctx.inject(Runtime) diff --git a/packages/mecha/mecha/contrib/scripting/resources/__init__.py b/packages/mecha/mecha/contrib/scripting/resources/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mecha/mecha/contrib/scripting/resources/commands.json b/packages/mecha/mecha/contrib/scripting/resources/commands.json new file mode 100644 index 000000000..7b783b460 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/resources/commands.json @@ -0,0 +1,130 @@ +{ + "type": "root", + "children": { + "statement": { + "type": "argument", + "parser": "mecha:scripting:statement", + "executable": true + }, + "def": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "mecha:scripting:function_signature", + "children": { + "body": { + "type": "argument", + "parser": "mecha:scripting:function_root", + "executable": true + } + } + } + } + }, + "return": { + "type": "literal", + "executable": true, + "children": { + "value": { + "type": "argument", + "parser": "mecha:scripting:expression", + "executable": true + } + } + }, + "if": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + }, + "elif": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + }, + "else": { + "type": "literal", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + }, + "while": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + }, + "for": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "mecha:scripting:assignment_target", + "children": { + "in": { + "type": "literal", + "children": { + "iterable": { + "type": "argument", + "parser": "mecha:scripting:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + } + } + } + } + }, + "break": { + "type": "literal", + "executable": true + }, + "continue": { + "type": "literal", + "executable": true + } + } +} diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py new file mode 100644 index 000000000..043c6b074 --- /dev/null +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -0,0 +1,195 @@ +__all__ = [ + "Runtime", + "Module", + "ModuleCacheBackend", + "Evaluator", +] + + +import marshal +from contextlib import contextmanager +from dataclasses import dataclass, field +from importlib.resources import read_text +from io import BufferedReader, BufferedWriter +from pathlib import Path +from types import CodeType +from typing import Any, Dict, Iterator, List, Optional, Union + +from beet import Context, TextFileBase +from beet.core.utils import JsonDict, required_field + +from mecha import ( + AstCacheBackend, + AstCommand, + AstRoot, + CommandTree, + CompilationDatabase, + Dispatcher, + Mecha, + Visitor, + rule, +) + +from .codegen import Codegen +from .helpers import get_scripting_helpers +from .parse import get_scripting_parsers + + +@dataclass +class Module: + """Class holding the state of a compiled module.""" + + ast: AstRoot + code: Optional[CodeType] + refs: List[Any] + output: Optional[str] + namespace: JsonDict = field(default_factory=dict) + + +class Runtime: + """The scripting runtime.""" + + directory: Path + database: CompilationDatabase + codegen: Codegen + evaluate: Dispatcher[AstRoot] + modules: Dict[TextFileBase[Any], Module] + commands: List[AstCommand] + helpers: Dict[str, Any] + + def __init__(self, ctx: Union[Context, Mecha]): + if isinstance(ctx, Context): + ctx.require( + "mecha.contrib.relative_location", + "mecha.contrib.nesting", + "mecha.contrib.implicit_execute", + ) + mc = ctx.inject(Mecha) + else: + mc = ctx + + commands_json = read_text("mecha.contrib.scripting.resources", "commands.json") + mc.spec.add_commands(CommandTree.parse_raw(commands_json)) + mc.spec.parsers.update(get_scripting_parsers(mc.spec.parsers)) + + self.directory = mc.directory + self.database = mc.database + self.codegen = Codegen(spec=mc.spec) + + self.evaluate = Evaluator(runtime=self) + mc.steps.insert(0, self.evaluate) + + self.modules = {} + self.commands = [] + self.helpers = get_scripting_helpers() + + mc.cache_backend = ModuleCacheBackend(self) + + def get_module( + self, + node: AstRoot, + file_instance: Optional[TextFileBase[Any]] = None, + ) -> Module: + """Return an executable module for the given ast.""" + if file_instance is None: + file_instance = self.database.current + + module = self.modules.get(file_instance) + if module and module.ast is node: + return module + + source, output, refs = self.codegen(node) + + if source and output: + if filename := self.database[file_instance].filename: + filename = str(self.directory / filename) + else: + filename = "" + + code = compile(source, filename, "exec") + + else: + code = None + + module = Module(node, code, refs, output) + self.modules[file_instance] = module + + return module + + def get_output(self, module: Module) -> AstRoot: + """Run the module and return the output ast.""" + if not module.code or not module.output: + return module.ast + if module.output in module.namespace: + return module.namespace[module.output] + + module.namespace["_mecha_runtime"] = self + module.namespace["_mecha_refs"] = module.refs + module.namespace["__file__"] = module.code.co_filename + + exec(module.code, module.namespace) + + return module.namespace[module.output] + + @contextmanager + def scope( + self, + commands: Optional[List[AstCommand]] = None, + ) -> Iterator[List[AstCommand]]: + """Create a new scope to gather commands.""" + if commands is None: + commands = [] + + previous_commands = self.commands + self.commands = commands + + try: + yield commands + finally: + self.commands = previous_commands + + +@dataclass +class ModuleCacheBackend(AstCacheBackend): + """Cache backend that also restores the generated modules.""" + + runtime: Runtime + + def load(self, f: BufferedReader) -> AstRoot: + data = self.load_data(f) + ast = data["ast"] + + self.runtime.modules[self.runtime.database.current] = Module( + ast=ast, + code=marshal.load(f), + refs=data["refs"], + output=data["output"], + ) + + return ast + + def dump(self, node: AstRoot, f: BufferedWriter): + module = self.runtime.get_module(node) + + self.dump_data( + { + "ast": module.ast, + "refs": module.refs, + "output": module.output, + }, + f, + ) + + marshal.dump(module.code, f) + + +@dataclass +class Evaluator(Visitor): + """Visitor that evaluates modules.""" + + runtime: Runtime = required_field() + + @rule(AstRoot) + def root(self, node: AstRoot) -> AstRoot: + module = self.runtime.get_module(node) + return self.runtime.get_output(module) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 0b2184c42..03eb6763d 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -60,6 +60,7 @@ "parse_particle", "AggregateParser", "SingleLineConstraint", + "AlternativeParser", "NUMBER_PATTERN", ] @@ -1862,3 +1863,16 @@ class SingleLineConstraint: def __call__(self, stream: TokenStream) -> Any: with stream.intercept("newline"): return self.parser(stream) + + + +@dataclass +class AlternativeParser: + """Parser that tries the given alternatives in order.""" + + parsers: List[Parser] + + def __call__(self, stream: TokenStream) -> Any: + for parser, alternative in stream.choose(*self.parsers): + with alternative: + return parser(stream) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 3f46bd63d..87a0ee166 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -359,3 +359,11 @@ at @s if "foo" == "bar" ### at @s for i in "foo" say yolo +### +say hello +### +def wat() + say hello +### +a = '' +tellraw @p a diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md new file mode 100644 index 000000000..45e57221d --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -0,0 +1,50 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 7, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello +say this is a function file augmented with mecha +execute if score @s tmp matches 1.. as @a run function demo:foo/nested_execute_0 +say You can make functions +tellraw @a ["", {"text": "yep"}] +say and return values +say 13 +say 21 +say 34 +say Unlike in python default params are evaluated when the function is called +say 12 +say 144 +say {'number': 12, 'result': 144} +say this is basically a custom subset of python +say functions are first-class objects just like in python +say AAA +say BBB +say CCC +say just once +``` + +`@function demo:foo/nested_execute_0` + +```mcfunction +say multiline is automatically enabled +say nesting is automatically enabled +say implicit execute is automatically enabled +say relative location is automatically enabled +say ABCABCABCABCABC +``` diff --git a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt new file mode 100644 index 000000000..40367b7f4 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 0 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_100__0.txt b/packages/mecha/tests/snapshots/scripting__parse_100__0.txt new file mode 100644 index 000000000..9dea9998a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_100__0.txt @@ -0,0 +1,19 @@ +say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_100__1.txt b/packages/mecha/tests/snapshots/scripting__parse_100__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_100__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__0.txt b/packages/mecha/tests/snapshots/scripting__parse_101__0.txt new file mode 100644 index 000000000..0c3f4f26b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_101__0.txt @@ -0,0 +1,35 @@ +def wat() + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'wat' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt new file mode 100644 index 000000000..b7438444b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt @@ -0,0 +1,60 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def wat(): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'wat' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__0.txt b/packages/mecha/tests/snapshots/scripting__parse_102__0.txt new file mode 100644 index 000000000..188063524 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_102__0.txt @@ -0,0 +1,46 @@ +a = '' +tellraw @p a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: '' + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=9) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + variable: 'p' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt new file mode 100644 index 000000000..bf08d4ae6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt @@ -0,0 +1,93 @@ +_mecha_helper_convert_minecraft_component = _mecha_runtime.helpers['convert:minecraft:component'] +_mecha_helper_set_location = _mecha_runtime.helpers['set_location'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + a = '' + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_minecraft_component(a, {}), _mecha_refs[0])]))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + value: 'a' +_mecha_refs[1] + + location: SourceLocation(pos=15, lineno=2, colno=9) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + variable: 'p' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=9) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + variable: 'p' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + value: 'a' +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: '' + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=9) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + variable: 'p' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt new file mode 100644 index 000000000..09838208b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt @@ -0,0 +1,47 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (2 + ((- 54) * 10)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 2 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '*' + left: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 54 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 10 diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt new file mode 100644 index 000000000..b206347c9 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt @@ -0,0 +1,47 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ((2 + (- 54)) * 10) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '*' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '+' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 2 + right: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '-' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 54 + right: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 10 diff --git a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt new file mode 100644 index 000000000..0c9de4f1c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt @@ -0,0 +1,57 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ((- (- (- 64))) + (+ (+ 64))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 64 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 64 diff --git a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt new file mode 100644 index 000000000..90e168090 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt @@ -0,0 +1,52 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (((1 * 2) / 3) * 4) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '/' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 3 + right: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 4 diff --git a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt new file mode 100644 index 000000000..eb479a562 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt @@ -0,0 +1,52 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ((1 * 2) / (3 * 4)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '/' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '*' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 3 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 4 diff --git a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt new file mode 100644 index 000000000..34fb12022 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ((16 // 5) % 7) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '%' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '//' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 16 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 5 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt new file mode 100644 index 000000000..45cde3179 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt @@ -0,0 +1,162 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (((((((((- (2 ** 3)) + (((((~ 4) * 5) // 6) / 7) % 9)) + 10) - 11) << 12) >> 13) & 14) ^ 15) | 16) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + operator: '^' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + operator: '&' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + operator: '>>' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + operator: '<<' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '**' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 2 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 3 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + operator: '%' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '/' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + operator: '//' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + operator: '*' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '~' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 4 + right: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 5 + right: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 6 + right: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 7 + right: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + value: 9 + right: + + location: SourceLocation(pos=32, lineno=1, colno=33) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + value: 10 + right: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 11 + right: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + value: 12 + right: + + location: SourceLocation(pos=49, lineno=1, colno=50) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: 13 + right: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + value: 14 + right: + + location: SourceLocation(pos=59, lineno=1, colno=60) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + value: 15 + right: + + location: SourceLocation(pos=64, lineno=1, colno=65) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + value: 16 diff --git a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt new file mode 100644 index 000000000..66a084c98 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt @@ -0,0 +1,247 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (((False or (True and 'hello')) or (not ('foo' == 'bar'))) or (((((((((1 != 2) and (1 < 2)) and (2 <= 3)) and (5 > 4)) and (6 >= 5)) and (1 in 1)) and (2 not in 2)) and (3 is 3)) and (3 is not 3))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=152, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: False + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: 'and' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: True + right: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'hello' + right: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: 'not' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'foo' + right: + + location: SourceLocation(pos=42, lineno=1, colno=43) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + value: 'bar' + right: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + operator: '!=' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=52, lineno=1, colno=53) + value: 1 + right: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 2 + right: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + operator: '<' + left: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=63, lineno=1, colno=64) + value: 1 + right: + + location: SourceLocation(pos=66, lineno=1, colno=67) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + value: 2 + right: + + location: SourceLocation(pos=72, lineno=1, colno=73) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + operator: '<=' + left: + + location: SourceLocation(pos=72, lineno=1, colno=73) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + value: 2 + right: + + location: SourceLocation(pos=77, lineno=1, colno=78) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + value: 3 + right: + + location: SourceLocation(pos=83, lineno=1, colno=84) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + operator: '>' + left: + + location: SourceLocation(pos=83, lineno=1, colno=84) + end_location: SourceLocation(pos=84, lineno=1, colno=85) + value: 5 + right: + + location: SourceLocation(pos=87, lineno=1, colno=88) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + value: 4 + right: + + location: SourceLocation(pos=93, lineno=1, colno=94) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + operator: '>=' + left: + + location: SourceLocation(pos=93, lineno=1, colno=94) + end_location: SourceLocation(pos=94, lineno=1, colno=95) + value: 6 + right: + + location: SourceLocation(pos=98, lineno=1, colno=99) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + value: 5 + right: + + location: SourceLocation(pos=104, lineno=1, colno=105) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + operator: 'in' + left: + + location: SourceLocation(pos=104, lineno=1, colno=105) + end_location: SourceLocation(pos=105, lineno=1, colno=106) + value: 1 + right: + + location: SourceLocation(pos=109, lineno=1, colno=110) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + value: 1 + right: + + location: SourceLocation(pos=115, lineno=1, colno=116) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + operator: 'not_in' + left: + + location: SourceLocation(pos=115, lineno=1, colno=116) + end_location: SourceLocation(pos=116, lineno=1, colno=117) + value: 2 + right: + + location: SourceLocation(pos=124, lineno=1, colno=125) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + value: 2 + right: + + location: SourceLocation(pos=130, lineno=1, colno=131) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + operator: 'is' + left: + + location: SourceLocation(pos=130, lineno=1, colno=131) + end_location: SourceLocation(pos=131, lineno=1, colno=132) + value: 3 + right: + + location: SourceLocation(pos=135, lineno=1, colno=136) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + value: 3 + right: + + location: SourceLocation(pos=141, lineno=1, colno=142) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'is_not' + left: + + location: SourceLocation(pos=141, lineno=1, colno=142) + end_location: SourceLocation(pos=142, lineno=1, colno=143) + value: 3 + right: + + location: SourceLocation(pos=150, lineno=1, colno=151) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt index 9646279fd..c495bb56c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', curly '{', bracket '[', true, false, null or 3 other tokens but got literal '%3'. +#>ERROR Expected identifier, curly '{', bracket '[', true, false, null, string or number but got literal '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt new file mode 100644 index 000000000..ead259730 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 123 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 123 diff --git a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt new file mode 100644 index 000000000..a68edbba7 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (True and (False or True)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: 'and' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: 'or' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: False + right: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: True diff --git a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt new file mode 100644 index 000000000..be366f5aa --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 'this' +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'this' diff --git a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt new file mode 100644 index 000000000..42b57ffe0 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 'this\nthat' +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'this\nthat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt new file mode 100644 index 000000000..f941e5787 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + '"█this\nthat' +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: '"█this\nthat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt new file mode 100644 index 000000000..ac69a4414 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + '' +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: '' diff --git a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt new file mode 100644 index 000000000..fb1d5cfc1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + '"\'"' +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: '"\'"' diff --git a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt new file mode 100644 index 000000000..59aed96ff --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + "something \t\x0c\n\\'here" +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: "something \t\x0c\n\\'here" diff --git a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt new file mode 100644 index 000000000..1495e8e82 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + None +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: None diff --git a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt new file mode 100644 index 000000000..67f2311dc --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 123.456 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 123.456 diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt new file mode 100644 index 000000000..31380d88a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 1 + foo +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt new file mode 100644 index 000000000..477a0096d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt @@ -0,0 +1,52 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 1 + ('hello' + foo) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + value: 'hello' + right: + + location: SourceLocation(pos=18, lineno=2, colno=11) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt new file mode 100644 index 000000000..b7ca026b1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt @@ -0,0 +1,76 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + a = 1 + if (a == 1): + a = 0 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=4) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + operator: '==' + left: + + location: SourceLocation(pos=9, lineno=2, colno=4) + end_location: SourceLocation(pos=10, lineno=2, colno=5) + value: 'a' + right: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: 1 + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + commands: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=21, lineno=3, colno=6) + value: 'a' + value: + + location: SourceLocation(pos=24, lineno=3, colno=9) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt new file mode 100644 index 000000000..73e1651b8 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -0,0 +1,156 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + if True: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + elif (True or False): + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + else: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + commands: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + fragments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + value: 'hello' +_mecha_refs[2] + + location: SourceLocation(pos=64, lineno=6, colno=5) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=64, lineno=6, colno=5) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + value: 'hello' +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: True + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=22, lineno=3, colno=1) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + identifier: 'elif:condition:body' + arguments: + + location: SourceLocation(pos=27, lineno=3, colno=6) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + operator: 'or' + left: + + location: SourceLocation(pos=27, lineno=3, colno=6) + end_location: SourceLocation(pos=31, lineno=3, colno=10) + value: True + right: + + location: SourceLocation(pos=35, lineno=3, colno=14) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + value: False + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + commands: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + fragments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + value: 'hello' + + location: SourceLocation(pos=55, lineno=5, colno=1) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=64, lineno=6, colno=5) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=64, lineno=6, colno=5) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt index abc184b0e..b131e0e86 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected brace '(', curly '{', bracket '[', true, false, null or 3 other tokens but got newline '\n'. +#>ERROR Expected identifier, curly '{', bracket '[', true, false, null, string or number but got newline '\n'. # line 1, column 12 # 1 | if True and if True and diff --git a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt new file mode 100644 index 000000000..c8ac527ad --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 22220.0996667 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 22220.0996667 diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt new file mode 100644 index 000000000..1b55516b2 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt @@ -0,0 +1,58 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + while True: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: True + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt index f9508556d..f05ff1a3c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -28,10 +28,11 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 + min: 0 + max: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=109, lineno=5, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt new file mode 100644 index 000000000..c98e050c5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt @@ -0,0 +1,542 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + with _mecha_runtime.scope() as _mecha_var0: + if ('thing' == 'bar'): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + if ('thing' == 'foo'): + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' +_mecha_refs[2] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' +_mecha_refs[3] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' +_mecha_refs[4] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[6] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' +_mecha_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=72, lineno=4, colno=5) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=75, lineno=4, colno=8) + end_location: SourceLocation(pos=82, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=86, lineno=4, colno=19) + end_location: SourceLocation(pos=91, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=100, lineno=5, colno=9) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=104, lineno=5, colno=13) + end_location: SourceLocation(pos=109, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt index 3ce65e185..1242d60ac 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -26,10 +26,11 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 + min: 0 + max: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=67, lineno=3, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt new file mode 100644 index 000000000..8a664636b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt @@ -0,0 +1,342 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + with _mecha_runtime.scope() as _mecha_var0: + if ('thing' == 'foo'): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' +_mecha_refs[2] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' +_mecha_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=2, colno=8) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=44, lineno=2, colno=19) + end_location: SourceLocation(pos=49, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=58, lineno=3, colno=9) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=62, lineno=3, colno=13) + end_location: SourceLocation(pos=67, lineno=3, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt index 823961833..32d399d3f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -28,10 +28,11 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 + min: 0 + max: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=91, lineno=5, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt new file mode 100644 index 000000000..40204172f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt @@ -0,0 +1,442 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + with _mecha_runtime.scope() as _mecha_var0: + while True: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + while True: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' +_mecha_refs[2] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' +_mecha_refs[3] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' +_mecha_refs[4] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[6] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' +_mecha_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=63, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=69, lineno=4, colno=11) + end_location: SourceLocation(pos=73, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=82, lineno=5, colno=9) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=86, lineno=5, colno=13) + end_location: SourceLocation(pos=91, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt index 4b9975abf..68d3300a7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -26,10 +26,11 @@ if score @s tmp matches 0 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 0 + min: 0 + max: 0 location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt new file mode 100644 index 000000000..b94292289 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt @@ -0,0 +1,292 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + with _mecha_runtime.scope() as _mecha_var0: + while True: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' +_mecha_refs[2] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' +_mecha_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + root: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=11) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=53, lineno=3, colno=13) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index 663ebdfea..3f2365ac0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -28,10 +28,11 @@ if score @s tmp matches 42 location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: 42 + min: 42 + max: 42 location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=105, lineno=5, colno=26) diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt new file mode 100644 index 000000000..2f7ca7e71 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt @@ -0,0 +1,580 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + with _mecha_runtime.scope() as _mecha_var0: + count = 42 + while (count > 0): + _mecha_runtime.commands.append(_mecha_refs[0]) + count = (count - 1) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + value: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) + value: 'count' + value: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 +_mecha_refs[2] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + value: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) + value: 'count' + value: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 +_mecha_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + value: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) + value: 'count' + value: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + value: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) + value: 'count' + value: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=106, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'count' + value: + + location: SourceLocation(pos=39, lineno=2, colno=13) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=52, lineno=3, colno=11) + end_location: SourceLocation(pos=57, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=60, lineno=3, colno=19) + end_location: SourceLocation(pos=61, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=70, lineno=4, colno=9) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=74, lineno=4, colno=13) + end_location: SourceLocation(pos=79, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=88, lineno=5, colno=9) + end_location: SourceLocation(pos=93, lineno=5, colno=14) + value: 'count' + value: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=96, lineno=5, colno=17) + end_location: SourceLocation(pos=101, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=104, lineno=5, colno=25) + end_location: SourceLocation(pos=105, lineno=5, colno=26) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt new file mode 100644 index 000000000..4a95acd1d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = ('abc' + 'def') +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + operator: '+' + left: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + value: 'abc' + right: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + value: 'def' diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 932c6b820..33c729b7a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 100 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 99 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt new file mode 100644 index 000000000..9dc02e3fa --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ((True | False) | None) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True + right: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: False + right: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: None diff --git a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt new file mode 100644 index 000000000..3773e3587 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt @@ -0,0 +1,22 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 670000.0 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 670000.0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt new file mode 100644 index 000000000..df7b925dc --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt @@ -0,0 +1,52 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 1 + (foo == 1) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + operator: '==' + left: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' + right: + + location: SourceLocation(pos=15, lineno=2, colno=8) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt new file mode 100644 index 000000000..7672d4a2a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt @@ -0,0 +1,62 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + for c in 'abc': + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + fragments: + + location: SourceLocation(pos=23, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + value: 'something' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'c' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'abc' + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + fragments: + + location: SourceLocation(pos=23, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=18) + value: 'something' diff --git a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt new file mode 100644 index 000000000..e0e2b7e8c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt @@ -0,0 +1,52 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 1 + foo = foo +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=14, lineno=2, colno=7) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt new file mode 100644 index 000000000..f22ffaa1c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt @@ -0,0 +1,50 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + for foo in 'foo': + foo = foo +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'foo' + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'foo' + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=21, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=27, lineno=2, colno=11) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt new file mode 100644 index 000000000..f3f0683eb --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt @@ -0,0 +1,52 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = '' + foo += 'hey' +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: '' + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + operator: '+=' + target: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=16, lineno=2, colno=8) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + value: 'hey' diff --git a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt new file mode 100644 index 000000000..b8ce5294a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt @@ -0,0 +1,32 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (1 + 2) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt new file mode 100644 index 000000000..dc9c32c7a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt @@ -0,0 +1,65 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + for i in '': + _mecha_runtime.commands.append(_mecha_refs[0]) + continue +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=3, colno=13) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: '' + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=30, lineno=3, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=13) + identifier: 'continue' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt new file mode 100644 index 000000000..340d4ca6f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt @@ -0,0 +1,33 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + while False: + break +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=10) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: False + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=10) + identifier: 'break' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt new file mode 100644 index 000000000..e1b6415d3 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt @@ -0,0 +1,61 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + for i in 'abc': + if (i == 'b'): + break +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'abc' + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=8) + end_location: SourceLocation(pos=30, lineno=2, colno=16) + operator: '==' + left: + + location: SourceLocation(pos=22, lineno=2, colno=8) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + value: 'i' + right: + + location: SourceLocation(pos=27, lineno=2, colno=13) + end_location: SourceLocation(pos=30, lineno=2, colno=16) + value: 'b' + + location: SourceLocation(pos=39, lineno=3, colno=9) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=39, lineno=3, colno=9) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'break' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt new file mode 100644 index 000000000..ce018c07a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt @@ -0,0 +1,28 @@ +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + _mecha_helper_get_attribute('foo', 'bar') +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt new file mode 100644 index 000000000..247ecab8d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt @@ -0,0 +1,33 @@ +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + _mecha_helper_get_attribute(_mecha_helper_get_attribute('foo', 'bar'), 'baz') +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'baz' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt new file mode 100644 index 000000000..bb181ba07 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt @@ -0,0 +1,43 @@ +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + _mecha_helper_get_attribute('foo', 'bar')()[0] +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt new file mode 100644 index 000000000..8267bb024 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt @@ -0,0 +1,89 @@ +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + _mecha_helper_get_attribute('foo', 'bar')()[0]['hello'][99]['with space'](('thing' * 7)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: 'hello' + arguments: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 99 + arguments: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'with space' + arguments: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + operator: '*' + left: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + value: 'thing' + right: + + location: SourceLocation(pos=49, lineno=1, colno=50) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt new file mode 100644 index 000000000..12e8bb560 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt @@ -0,0 +1,39 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + 'foo'(1, 2, 3) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=5, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=5, colno=2) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=11, lineno=2, colno=5) + end_location: SourceLocation(pos=12, lineno=2, colno=6) + value: 1 + + location: SourceLocation(pos=18, lineno=3, colno=5) + end_location: SourceLocation(pos=19, lineno=3, colno=6) + value: 2 + + location: SourceLocation(pos=25, lineno=4, colno=5) + end_location: SourceLocation(pos=26, lineno=4, colno=6) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt new file mode 100644 index 000000000..24fd7792e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt @@ -0,0 +1,32 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (1 - 2) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt new file mode 100644 index 000000000..39eb79a1f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt @@ -0,0 +1,76 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + foo() +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=24, lineno=3, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=24, lineno=3, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=6) + value: + + location: SourceLocation(pos=24, lineno=3, colno=1) + end_location: SourceLocation(pos=27, lineno=3, colno=4) + value: 'foo' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt new file mode 100644 index 000000000..9e6057cd4 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt @@ -0,0 +1,76 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(): + def bar(): + foo() + bar() +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=9) + end_location: SourceLocation(pos=23, lineno=2, colno=14) + name: 'bar' + arguments: + + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=14) + value: + + location: SourceLocation(pos=32, lineno=3, colno=9) + end_location: SourceLocation(pos=35, lineno=3, colno=12) + value: 'foo' + arguments: + + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=10) + value: + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + value: 'bar' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt new file mode 100644 index 000000000..2ccb7dd94 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt @@ -0,0 +1,103 @@ +_mecha_helper_missing = _mecha_runtime.helpers['missing'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(a=_mecha_helper_missing, b=_mecha_helper_missing, c=_mecha_helper_missing): + if a is _mecha_helper_missing: + a = 1 + if b is _mecha_helper_missing: + b = a + if c is _mecha_helper_missing: + c = (a + b) + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + value: 'hello' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=41, lineno=5, colno=2) + name: 'foo' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + name: 'a' + default: + + location: SourceLocation(pos=15, lineno=2, colno=7) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + value: 1 + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + name: 'b' + default: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + value: 'a' + + location: SourceLocation(pos=31, lineno=4, colno=5) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + name: 'c' + default: + + location: SourceLocation(pos=33, lineno=4, colno=7) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + operator: '+' + left: + + location: SourceLocation(pos=33, lineno=4, colno=7) + end_location: SourceLocation(pos=34, lineno=4, colno=8) + value: 'a' + right: + + location: SourceLocation(pos=37, lineno=4, colno=11) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + value: 'b' + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=55, lineno=6, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt new file mode 100644 index 000000000..44d9c334e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt @@ -0,0 +1,92 @@ +_mecha_helper_missing = _mecha_runtime.helpers['missing'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(a, b=_mecha_helper_missing): + if b is _mecha_helper_missing: + b = a + b += a + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=29, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=33, lineno=3, colno=9) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + fragments: + + location: SourceLocation(pos=33, lineno=3, colno=9) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + value: 'wat' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'a' + default: None + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + name: 'b' + default: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'a' + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=11) + operator: '+=' + target: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=6) + value: 'b' + value: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=24, lineno=2, colno=11) + value: 'a' + + location: SourceLocation(pos=29, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=33, lineno=3, colno=9) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + fragments: + + location: SourceLocation(pos=33, lineno=3, colno=9) + end_location: SourceLocation(pos=36, lineno=3, colno=12) + value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt new file mode 100644 index 000000000..a36bdc6e8 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ((1 - 2) + 3) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt new file mode 100644 index 000000000..c08a7340a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt @@ -0,0 +1,236 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(something): + def wat(): + _mecha_runtime.commands.append(_mecha_refs[0]) + x = 'hello' + for i in something: + x += (i * 3) + _mecha_runtime.commands.append(_mecha_refs[1]) + wat() +_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=57, lineno=4, colno=13) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + fragments: + + location: SourceLocation(pos=57, lineno=4, colno=13) + end_location: SourceLocation(pos=59, lineno=4, colno=15) + value: 'yo' + + location: SourceLocation(pos=71, lineno=5, colno=12) + end_location: SourceLocation(pos=72, lineno=5, colno=13) + value: ' ' + + location: SourceLocation(pos=72, lineno=5, colno=13) + end_location: SourceLocation(pos=75, lineno=5, colno=16) + value: 'wat' + + location: SourceLocation(pos=87, lineno=6, colno=12) + end_location: SourceLocation(pos=88, lineno=6, colno=13) + value: ' ' + + location: SourceLocation(pos=88, lineno=6, colno=13) + end_location: SourceLocation(pos=90, lineno=6, colno=15) + value: 'is' + + location: SourceLocation(pos=102, lineno=7, colno=12) + end_location: SourceLocation(pos=103, lineno=7, colno=13) + value: ' ' + + location: SourceLocation(pos=103, lineno=7, colno=13) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + value: 'dat' +_mecha_refs[1] + + location: SourceLocation(pos=206, lineno=13, colno=9) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=210, lineno=13, colno=13) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + fragments: + + location: SourceLocation(pos=210, lineno=13, colno=13) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + value: 'wow' +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'something' + default: None + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=27, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=14) + name: 'wat' + arguments: + + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=57, lineno=4, colno=13) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + fragments: + + location: SourceLocation(pos=57, lineno=4, colno=13) + end_location: SourceLocation(pos=59, lineno=4, colno=15) + value: 'yo' + + location: SourceLocation(pos=71, lineno=5, colno=12) + end_location: SourceLocation(pos=72, lineno=5, colno=13) + value: ' ' + + location: SourceLocation(pos=72, lineno=5, colno=13) + end_location: SourceLocation(pos=75, lineno=5, colno=16) + value: 'wat' + + location: SourceLocation(pos=87, lineno=6, colno=12) + end_location: SourceLocation(pos=88, lineno=6, colno=13) + value: ' ' + + location: SourceLocation(pos=88, lineno=6, colno=13) + end_location: SourceLocation(pos=90, lineno=6, colno=15) + value: 'is' + + location: SourceLocation(pos=102, lineno=7, colno=12) + end_location: SourceLocation(pos=103, lineno=7, colno=13) + value: ' ' + + location: SourceLocation(pos=103, lineno=7, colno=13) + end_location: SourceLocation(pos=106, lineno=7, colno=16) + value: 'dat' + + location: SourceLocation(pos=135, lineno=9, colno=9) + end_location: SourceLocation(pos=146, lineno=9, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=135, lineno=9, colno=9) + end_location: SourceLocation(pos=146, lineno=9, colno=20) + operator: '=' + target: + + location: SourceLocation(pos=135, lineno=9, colno=9) + end_location: SourceLocation(pos=136, lineno=9, colno=10) + value: 'x' + value: + + location: SourceLocation(pos=139, lineno=9, colno=13) + end_location: SourceLocation(pos=146, lineno=9, colno=20) + value: 'hello' + + location: SourceLocation(pos=155, lineno=10, colno=9) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=159, lineno=10, colno=13) + end_location: SourceLocation(pos=160, lineno=10, colno=14) + value: 'i' + + location: SourceLocation(pos=164, lineno=10, colno=18) + end_location: SourceLocation(pos=173, lineno=10, colno=27) + value: 'something' + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + commands: + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + operator: '+=' + target: + + location: SourceLocation(pos=186, lineno=11, colno=13) + end_location: SourceLocation(pos=187, lineno=11, colno=14) + value: 'x' + value: + + location: SourceLocation(pos=191, lineno=11, colno=18) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + operator: '*' + left: + + location: SourceLocation(pos=191, lineno=11, colno=18) + end_location: SourceLocation(pos=192, lineno=11, colno=19) + value: 'i' + right: + + location: SourceLocation(pos=195, lineno=11, colno=22) + end_location: SourceLocation(pos=196, lineno=11, colno=23) + value: 3 + + location: SourceLocation(pos=206, lineno=13, colno=9) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=210, lineno=13, colno=13) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + fragments: + + location: SourceLocation(pos=210, lineno=13, colno=13) + end_location: SourceLocation(pos=213, lineno=13, colno=16) + value: 'wow' + + location: SourceLocation(pos=218, lineno=14, colno=5) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=218, lineno=14, colno=5) + end_location: SourceLocation(pos=223, lineno=14, colno=10) + value: + + location: SourceLocation(pos=218, lineno=14, colno=5) + end_location: SourceLocation(pos=221, lineno=14, colno=8) + value: 'wat' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt new file mode 100644 index 000000000..02cf3ee57 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt @@ -0,0 +1,122 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(): + thing += bar() + def bar(): + thing += foo() + thing = bar() +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=72, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + operator: '+=' + target: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=10) + value: 'thing' + value: + + location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=28, lineno=2, colno=19) + value: + + location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + value: 'bar' + arguments: + + + location: SourceLocation(pos=29, lineno=3, colno=1) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=33, lineno=3, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=10) + name: 'bar' + arguments: + + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + commands: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + operator: '+=' + target: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=48, lineno=4, colno=10) + value: 'thing' + value: + + location: SourceLocation(pos=52, lineno=4, colno=14) + end_location: SourceLocation(pos=57, lineno=4, colno=19) + value: + + location: SourceLocation(pos=52, lineno=4, colno=14) + end_location: SourceLocation(pos=55, lineno=4, colno=17) + value: 'foo' + arguments: + + + location: SourceLocation(pos=58, lineno=5, colno=1) + end_location: SourceLocation(pos=71, lineno=5, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=58, lineno=5, colno=1) + end_location: SourceLocation(pos=71, lineno=5, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=58, lineno=5, colno=1) + end_location: SourceLocation(pos=63, lineno=5, colno=6) + value: 'thing' + value: + + location: SourceLocation(pos=66, lineno=5, colno=9) + end_location: SourceLocation(pos=71, lineno=5, colno=14) + value: + + location: SourceLocation(pos=66, lineno=5, colno=9) + end_location: SourceLocation(pos=69, lineno=5, colno=12) + value: 'bar' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt new file mode 100644 index 000000000..c2d2cbc2b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt @@ -0,0 +1,35 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(): + return +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + identifier: 'return' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt new file mode 100644 index 000000000..785acc536 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt @@ -0,0 +1,74 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + def g(): + return foo + foo = 0 +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=16, lineno=2, colno=9) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + name: 'g' + arguments: + + + location: SourceLocation(pos=28, lineno=3, colno=9) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + commands: + + location: SourceLocation(pos=28, lineno=3, colno=9) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=35, lineno=3, colno=16) + end_location: SourceLocation(pos=38, lineno=3, colno=19) + value: 'foo' + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=43, lineno=4, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=49, lineno=4, colno=11) + end_location: SourceLocation(pos=50, lineno=4, colno=12) + value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt index af1f18893..8e1cf76b4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt @@ -36,10 +36,15 @@ f("thing") variable: 'a' arguments: - + location: SourceLocation(pos=24, lineno=2, colno=16) end_location: SourceLocation(pos=25, lineno=2, colno=17) - value: 'x' + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + value: 'x' location: SourceLocation(pos=26, lineno=3, colno=1) end_location: SourceLocation(pos=36, lineno=3, colno=11) diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt new file mode 100644 index 000000000..6ee5a5001 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt @@ -0,0 +1,112 @@ +_mecha_helper_convert_minecraft_component = _mecha_runtime.helpers['convert:minecraft:component'] +_mecha_helper_set_location = _mecha_runtime.helpers['set_location'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(x): + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_minecraft_component(x, {}), _mecha_refs[0])]))) + f('thing') +_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + value: 'x' +_mecha_refs[1] + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=23, lineno=2, colno=15) + variable: 'a' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=23, lineno=2, colno=15) + variable: 'a' + arguments: + + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + value: 'x' +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'x' + default: None + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=23, lineno=2, colno=15) + variable: 'a' + arguments: + + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + scope: ('tellraw', 'targets', 'message') + value: + + location: SourceLocation(pos=24, lineno=2, colno=16) + end_location: SourceLocation(pos=25, lineno=2, colno=17) + value: 'x' + + location: SourceLocation(pos=26, lineno=3, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=3, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=11) + value: + + location: SourceLocation(pos=26, lineno=3, colno=1) + end_location: SourceLocation(pos=27, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=28, lineno=3, colno=3) + end_location: SourceLocation(pos=35, lineno=3, colno=10) + value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt new file mode 100644 index 000000000..0ad760245 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt @@ -0,0 +1,42 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (1 - (2 + 3)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 2 + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt new file mode 100644 index 000000000..dcf5571eb --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt @@ -0,0 +1,35 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + {'foo': 'bar'} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + items: + + location: SourceLocation(pos=6, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=15) + key: + + location: SourceLocation(pos=6, lineno=2, colno=5) + end_location: SourceLocation(pos=9, lineno=2, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=11, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=15) + value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt new file mode 100644 index 000000000..853fdc369 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt @@ -0,0 +1,55 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 'hello' + {foo: 'bar'} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=23, lineno=3, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=25, lineno=3, colno=10) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt new file mode 100644 index 000000000..2ba3de71e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt @@ -0,0 +1,55 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 'hello' + {'foo': foo} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + value: 'foo' + value: + + location: SourceLocation(pos=27, lineno=3, colno=12) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt new file mode 100644 index 000000000..c7c4a56db --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt @@ -0,0 +1,89 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 'hello' + {(foo * 3): 42, (16 + 3): []} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=50, lineno=5, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=50, lineno=5, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=16) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=27, lineno=3, colno=12) + operator: '*' + left: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=23, lineno=3, colno=8) + value: 'foo' + right: + + location: SourceLocation(pos=26, lineno=3, colno=11) + end_location: SourceLocation(pos=27, lineno=3, colno=12) + value: 3 + value: + + location: SourceLocation(pos=29, lineno=3, colno=14) + end_location: SourceLocation(pos=31, lineno=3, colno=16) + value: 42 + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=15) + key: + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=39, lineno=4, colno=7) + value: 16 + right: + + location: SourceLocation(pos=42, lineno=4, colno=10) + end_location: SourceLocation(pos=43, lineno=4, colno=11) + value: 3 + value: + + location: SourceLocation(pos=45, lineno=4, colno=13) + end_location: SourceLocation(pos=47, lineno=4, colno=15) + items: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt new file mode 100644 index 000000000..d43df612c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt @@ -0,0 +1,149 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + predicate = {'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': {'score1': {'min': {'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1}}}} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=248, lineno=15, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=247, lineno=14, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=247, lineno=14, colno=2) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'predicate' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=247, lineno=14, colno=2) + items: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=54, lineno=2, colno=41) + key: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=27, lineno=2, colno=14) + value: 'condition' + value: + + location: SourceLocation(pos=29, lineno=2, colno=16) + end_location: SourceLocation(pos=54, lineno=2, colno=41) + value: 'minecraft:entity_scores' + + location: SourceLocation(pos=58, lineno=3, colno=3) + end_location: SourceLocation(pos=74, lineno=3, colno=19) + key: + + location: SourceLocation(pos=58, lineno=3, colno=3) + end_location: SourceLocation(pos=66, lineno=3, colno=11) + value: 'entity' + value: + + location: SourceLocation(pos=68, lineno=3, colno=13) + end_location: SourceLocation(pos=74, lineno=3, colno=19) + value: 'this' + + location: SourceLocation(pos=78, lineno=4, colno=3) + end_location: SourceLocation(pos=245, lineno=13, colno=4) + key: + + location: SourceLocation(pos=78, lineno=4, colno=3) + end_location: SourceLocation(pos=86, lineno=4, colno=11) + value: 'scores' + value: + + location: SourceLocation(pos=88, lineno=4, colno=13) + end_location: SourceLocation(pos=245, lineno=13, colno=4) + items: + + location: SourceLocation(pos=94, lineno=5, colno=5) + end_location: SourceLocation(pos=241, lineno=12, colno=6) + key: + + location: SourceLocation(pos=94, lineno=5, colno=5) + end_location: SourceLocation(pos=102, lineno=5, colno=13) + value: 'score1' + value: + + location: SourceLocation(pos=104, lineno=5, colno=15) + end_location: SourceLocation(pos=241, lineno=12, colno=6) + items: + + location: SourceLocation(pos=112, lineno=6, colno=7) + end_location: SourceLocation(pos=235, lineno=11, colno=8) + key: + + location: SourceLocation(pos=112, lineno=6, colno=7) + end_location: SourceLocation(pos=117, lineno=6, colno=12) + value: 'min' + value: + + location: SourceLocation(pos=119, lineno=6, colno=14) + end_location: SourceLocation(pos=235, lineno=11, colno=8) + items: + + location: SourceLocation(pos=129, lineno=7, colno=9) + end_location: SourceLocation(pos=154, lineno=7, colno=34) + key: + + location: SourceLocation(pos=129, lineno=7, colno=9) + end_location: SourceLocation(pos=135, lineno=7, colno=15) + value: 'type' + value: + + location: SourceLocation(pos=137, lineno=7, colno=17) + end_location: SourceLocation(pos=154, lineno=7, colno=34) + value: 'minecraft:score' + + location: SourceLocation(pos=164, lineno=8, colno=9) + end_location: SourceLocation(pos=180, lineno=8, colno=25) + key: + + location: SourceLocation(pos=164, lineno=8, colno=9) + end_location: SourceLocation(pos=172, lineno=8, colno=17) + value: 'target' + value: + + location: SourceLocation(pos=174, lineno=8, colno=19) + end_location: SourceLocation(pos=180, lineno=8, colno=25) + value: 'this' + + location: SourceLocation(pos=190, lineno=9, colno=9) + end_location: SourceLocation(pos=207, lineno=9, colno=26) + key: + + location: SourceLocation(pos=190, lineno=9, colno=9) + end_location: SourceLocation(pos=197, lineno=9, colno=16) + value: 'score' + value: + + location: SourceLocation(pos=199, lineno=9, colno=18) + end_location: SourceLocation(pos=207, lineno=9, colno=26) + value: 'score2' + + location: SourceLocation(pos=217, lineno=10, colno=9) + end_location: SourceLocation(pos=227, lineno=10, colno=19) + key: + + location: SourceLocation(pos=217, lineno=10, colno=9) + end_location: SourceLocation(pos=224, lineno=10, colno=16) + value: 'scale' + value: + + location: SourceLocation(pos=226, lineno=10, colno=18) + end_location: SourceLocation(pos=227, lineno=10, colno=19) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt new file mode 100644 index 000000000..19ce2d155 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt @@ -0,0 +1,149 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + predicate = {'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': {'score1': {'min': {'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1}}}} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=230, lineno=15, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=229, lineno=14, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=229, lineno=14, colno=2) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'predicate' + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=229, lineno=14, colno=2) + items: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=52, lineno=2, colno=39) + key: + + location: SourceLocation(pos=16, lineno=2, colno=3) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + value: 'condition' + value: + + location: SourceLocation(pos=27, lineno=2, colno=14) + end_location: SourceLocation(pos=52, lineno=2, colno=39) + value: 'minecraft:entity_scores' + + location: SourceLocation(pos=56, lineno=3, colno=3) + end_location: SourceLocation(pos=70, lineno=3, colno=17) + key: + + location: SourceLocation(pos=56, lineno=3, colno=3) + end_location: SourceLocation(pos=62, lineno=3, colno=9) + value: 'entity' + value: + + location: SourceLocation(pos=64, lineno=3, colno=11) + end_location: SourceLocation(pos=70, lineno=3, colno=17) + value: 'this' + + location: SourceLocation(pos=74, lineno=4, colno=3) + end_location: SourceLocation(pos=227, lineno=13, colno=4) + key: + + location: SourceLocation(pos=74, lineno=4, colno=3) + end_location: SourceLocation(pos=80, lineno=4, colno=9) + value: 'scores' + value: + + location: SourceLocation(pos=82, lineno=4, colno=11) + end_location: SourceLocation(pos=227, lineno=13, colno=4) + items: + + location: SourceLocation(pos=88, lineno=5, colno=5) + end_location: SourceLocation(pos=223, lineno=12, colno=6) + key: + + location: SourceLocation(pos=88, lineno=5, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=11) + value: 'score1' + value: + + location: SourceLocation(pos=96, lineno=5, colno=13) + end_location: SourceLocation(pos=223, lineno=12, colno=6) + items: + + location: SourceLocation(pos=104, lineno=6, colno=7) + end_location: SourceLocation(pos=217, lineno=11, colno=8) + key: + + location: SourceLocation(pos=104, lineno=6, colno=7) + end_location: SourceLocation(pos=107, lineno=6, colno=10) + value: 'min' + value: + + location: SourceLocation(pos=109, lineno=6, colno=12) + end_location: SourceLocation(pos=217, lineno=11, colno=8) + items: + + location: SourceLocation(pos=119, lineno=7, colno=9) + end_location: SourceLocation(pos=142, lineno=7, colno=32) + key: + + location: SourceLocation(pos=119, lineno=7, colno=9) + end_location: SourceLocation(pos=123, lineno=7, colno=13) + value: 'type' + value: + + location: SourceLocation(pos=125, lineno=7, colno=15) + end_location: SourceLocation(pos=142, lineno=7, colno=32) + value: 'minecraft:score' + + location: SourceLocation(pos=152, lineno=8, colno=9) + end_location: SourceLocation(pos=166, lineno=8, colno=23) + key: + + location: SourceLocation(pos=152, lineno=8, colno=9) + end_location: SourceLocation(pos=158, lineno=8, colno=15) + value: 'target' + value: + + location: SourceLocation(pos=160, lineno=8, colno=17) + end_location: SourceLocation(pos=166, lineno=8, colno=23) + value: 'this' + + location: SourceLocation(pos=176, lineno=9, colno=9) + end_location: SourceLocation(pos=191, lineno=9, colno=24) + key: + + location: SourceLocation(pos=176, lineno=9, colno=9) + end_location: SourceLocation(pos=181, lineno=9, colno=14) + value: 'score' + value: + + location: SourceLocation(pos=183, lineno=9, colno=16) + end_location: SourceLocation(pos=191, lineno=9, colno=24) + value: 'score2' + + location: SourceLocation(pos=201, lineno=10, colno=9) + end_location: SourceLocation(pos=209, lineno=10, colno=17) + key: + + location: SourceLocation(pos=201, lineno=10, colno=9) + end_location: SourceLocation(pos=206, lineno=10, colno=14) + value: 'scale' + value: + + location: SourceLocation(pos=208, lineno=10, colno=16) + end_location: SourceLocation(pos=209, lineno=10, colno=17) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt new file mode 100644 index 000000000..985d1c77c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt @@ -0,0 +1,90 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + return {f(): f(), 'other': [{}, {}, 'wat']} +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=12) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + items: + + location: SourceLocation(pos=20, lineno=2, colno=13) + end_location: SourceLocation(pos=28, lineno=2, colno=21) + key: + + location: SourceLocation(pos=20, lineno=2, colno=13) + end_location: SourceLocation(pos=23, lineno=2, colno=16) + value: + + location: SourceLocation(pos=20, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'f' + arguments: + + value: + + location: SourceLocation(pos=25, lineno=2, colno=18) + end_location: SourceLocation(pos=28, lineno=2, colno=21) + value: + + location: SourceLocation(pos=25, lineno=2, colno=18) + end_location: SourceLocation(pos=26, lineno=2, colno=19) + value: 'f' + arguments: + + + location: SourceLocation(pos=30, lineno=2, colno=23) + end_location: SourceLocation(pos=52, lineno=2, colno=45) + key: + + location: SourceLocation(pos=30, lineno=2, colno=23) + end_location: SourceLocation(pos=35, lineno=2, colno=28) + value: 'other' + value: + + location: SourceLocation(pos=37, lineno=2, colno=30) + end_location: SourceLocation(pos=52, lineno=2, colno=45) + items: + + location: SourceLocation(pos=38, lineno=2, colno=31) + end_location: SourceLocation(pos=40, lineno=2, colno=33) + items: + + + location: SourceLocation(pos=42, lineno=2, colno=35) + end_location: SourceLocation(pos=44, lineno=2, colno=37) + items: + + + location: SourceLocation(pos=46, lineno=2, colno=39) + end_location: SourceLocation(pos=51, lineno=2, colno=44) + value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt new file mode 100644 index 000000000..9b59c17ed --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt @@ -0,0 +1,37 @@ +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + (2 + (- 54)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 2 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 54 diff --git a/packages/mecha/tests/test_scripting.py b/packages/mecha/tests/test_scripting.py index a41b54165..0fa12136f 100644 --- a/packages/mecha/tests/test_scripting.py +++ b/packages/mecha/tests/test_scripting.py @@ -1,8 +1,9 @@ import pytest -from beet import Function, run_beet +from beet import Context, Function, run_beet from pytest_insta import SnapshotFixture from mecha import ( + AstNode, CompilationDatabase, CompilationUnit, DiagnosticError, @@ -10,12 +11,13 @@ get_scripting_examples, ) from mecha.contrib.annotate_diagnostics import annotate_diagnostics +from mecha.contrib.scripting import Runtime @pytest.fixture(scope="session") -def mc_scripting(): +def ctx_scripting(): with run_beet({"require": ["mecha.contrib.scripting"]}) as ctx: - yield ctx.inject(Mecha) + yield ctx @pytest.mark.parametrize( @@ -23,17 +25,26 @@ def mc_scripting(): params := get_scripting_examples(), ids=range(len(params)), ) -def test_parse(snapshot: SnapshotFixture, mc_scripting: Mecha, source: Function): +def test_parse(snapshot: SnapshotFixture, ctx_scripting: Context, source: Function): + mc = ctx_scripting.inject(Mecha) + runtime = ctx_scripting.inject(Runtime) + ast = None diagnostics = None try: - ast = mc_scripting.parse(source) + ast = mc.parse(source) except DiagnosticError as exc: diagnostics = exc.diagnostics if ast: assert snapshot() == f"{source.text}---\n{ast.dump()}\n" + text, output, refs = runtime.codegen(ast) + text = text or "# Nothing\n" + assert snapshot() == f"{text}---\noutput = {output}\n---\n" + "".join( + f"_mecha_refs[{i}]\n{obj.dump() if isinstance(obj, AstNode) else repr(obj)}\n" + for i, obj in enumerate(refs) + ) elif diagnostics: database = CompilationDatabase() database[source] = CompilationUnit(source=source.text) From f72ebcfdcc770dc31bfa7d392afcf88f386f8849 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 4 Dec 2021 11:37:10 +0100 Subject: [PATCH 0523/1554] feat: interpolation now works on most nodes instead of command arguments specifically --- .../src/data/demo/functions/foo.mcfunction | 7 + packages/mecha/mecha/ast.py | 74 +- packages/mecha/mecha/contrib/scripting/ast.py | 10 +- .../mecha/mecha/contrib/scripting/codegen.py | 21 +- .../mecha/mecha/contrib/scripting/helpers.py | 76 +- .../mecha/mecha/contrib/scripting/parse.py | 50 +- .../mecha/mecha/contrib/scripting/runtime.py | 2 +- packages/mecha/mecha/parse.py | 37 +- .../resources/scripting_examples.mcfunction | 10 + ...examples__build_basic_scripting__0.pack.md | 1 + .../snapshots/scripting__parse_102__0.txt | 4 +- .../snapshots/scripting__parse_102__1.txt | 16 +- .../snapshots/scripting__parse_103__0.txt | 178 +++ .../snapshots/scripting__parse_103__1.txt | 1181 +++++++++++++++++ .../snapshots/scripting__parse_89__0.txt | 4 +- .../snapshots/scripting__parse_89__1.txt | 16 +- 16 files changed, 1556 insertions(+), 131 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_103__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_103__1.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 9f7c23380..15663e150 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -69,3 +69,10 @@ while True break say just once should_break = True + +something = '{"text": "Hello", "bold": true}' +as @a at @s if block ~ ~-1 ~ #wool give @s stone{ + display: { + Name: something + } +} diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index fb2c0a564..8ad006020 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -70,11 +70,13 @@ from beet.core.utils import extra_field, required_field # pyright: reportMissingTypeStubs=false -from nbtlib import ByteArray, Compound, IntArray +from nbtlib import Byte, ByteArray, Compound, Double, Int, IntArray from nbtlib import List as ListTag -from nbtlib import LongArray +from nbtlib import LongArray, String from tokenstream import UNKNOWN_LOCATION, SourceLocation, set_location +from .utils import string_to_number + T = TypeVar("T") AstNodeType = TypeVar("AstNodeType", bound="AstNode") @@ -245,11 +247,11 @@ def from_value(cls, value: Any) -> "AstJson": if value is None or isinstance(value, (bool, str, int, float)): return AstJsonValue(value=value) elif isinstance(value, Mapping): - object: Mapping[str, Any] = value + object: Mapping[Any, Any] = value return AstJsonObject( entries=AstChildren( AstJsonObjectEntry( - key=AstJsonObjectKey(value=k), + key=AstJsonObjectKey(value=str(k)), value=cls.from_value(v), ) for k, v in object.items() @@ -323,6 +325,34 @@ def evaluate(self) -> Any: """Return the nbt value.""" raise NotImplementedError() + @classmethod + def from_value(cls, value: Any) -> "AstNbt": + """Create nbt ast nodes representing the specified value.""" + if isinstance(value, bool): + return AstNbtValue(value=Byte(1 if value else 0)) + elif isinstance(value, int): + return AstNbtValue(value=Int(value)) + elif isinstance(value, float): + return AstNbtValue(value=Double(value)) + elif isinstance(value, str): + return AstNbtValue(value=String(value)) + elif isinstance(value, Mapping): + compound: Mapping[Any, Any] = value + return AstNbtCompound( + entries=AstChildren( + AstNbtCompoundEntry( + key=AstNbtCompoundKey(value=str(k)), + value=cls.from_value(v), + ) + for k, v in compound.items() + ) + ) + elif isinstance(value, Sequence): + lst: Sequence[Any] = value + return AstNbtList(elements=AstChildren(cls.from_value(e) for e in lst)) + else: + raise ValueError(f"Invalid nbt value of type {type(value)!r}.") + @dataclass(frozen=True) class AstNbtValue(AstNbt): @@ -476,6 +506,8 @@ class AstRange(AstNode): min: Optional[Union[int, float]] = required_field() max: Optional[Union[int, float]] = required_field() + parser = "range" + @property def exact(self) -> bool: """Wether the range is an exact match.""" @@ -486,7 +518,21 @@ def value(self) -> Union[int, float]: """Return the exact value.""" return self.min # type: ignore - parser = "range" + @classmethod + def from_value(cls, value: Union[str, int, float]) -> "AstRange": + """Create a range node from a given value.""" + if isinstance(value, (int, float)): + return AstRange(min=value, max=value) + + minimum, separator, maximum = value.partition("..") + + if not separator: + maximum = minimum + + return AstRange( + min=string_to_number(minimum) if minimum else None, + max=string_to_number(maximum) if maximum else None, + ) @dataclass(frozen=True) @@ -498,6 +544,24 @@ class AstTime(AstNode): parser = "time" + @classmethod + def from_value(cls, value: Union[str, int, float]) -> "AstTime": + """Create a time node from a given value.""" + unit = "tick" + + if isinstance(value, str): + if value.endswith(("d", "s", "t")): + if value[-1] == "d": + unit = "day" + elif value[-1] == "s": + unit = "second" + else: + unit = "tick" + value = value[:-1] + value = string_to_number(value) + + return cls(value=value, unit=unit) + @dataclass(frozen=True) class AstSelectorScoreMatch(AstNode): diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 9779a53a7..72890d77e 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -16,12 +16,12 @@ "AstFunctionSignature", "AstFunctionSignatureArgument", "AstFunctionRoot", - "AstCommandInterpolation", + "AstInterpolation", ] from dataclasses import dataclass -from typing import Any, ClassVar, Optional, Tuple +from typing import Any, ClassVar, Optional from beet.core.utils import required_field from tokenstream import TokenStream @@ -158,8 +158,8 @@ class AstFunctionRoot(AstNode): @dataclass(frozen=True) -class AstCommandInterpolation(AstNode): - """Ast command interpolation node.""" +class AstInterpolation(AstNode): + """Ast interpolation node.""" - scope: Tuple[str, ...] = required_field() + converter: str = required_field() value: AstExpression = required_field() diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index a9c6545b5..4dab45ddd 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -27,21 +27,21 @@ overload, ) -from beet.core.utils import normalize_string, required_field +from beet.core.utils import normalize_string -from mecha import AstChildren, AstCommand, AstNode, AstRoot, CommandSpec, Visitor, rule +from mecha import AstChildren, AstCommand, AstNode, AstRoot, Visitor, rule from .ast import ( AstAssignment, AstAssignmentTargetIdentifier, AstAttribute, AstCall, - AstCommandInterpolation, AstDict, AstExpressionBinary, AstExpressionUnary, AstFunctionSignature, AstIdentifier, + AstInterpolation, AstList, AstLookup, AstValue, @@ -282,12 +282,9 @@ def visit_body( acc.statement(f"_mecha_runtime.commands.extend({acc.make_ref(node)}.commands)") -@dataclass class Codegen(Visitor): """Code generator.""" - spec: CommandSpec = required_field() - def __call__(self, node: AstRoot) -> Tuple[Optional[str], Optional[str], List[Any]]: # type: ignore acc = Accumulator() result = self.invoke(node, acc) @@ -452,22 +449,18 @@ def continue_statement( acc.statement("continue") return [] - @rule(AstCommandInterpolation) - def command_interpolation( + @rule(AstInterpolation) + def interpolation( self, - node: AstCommandInterpolation, + node: AstInterpolation, acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - tree = self.spec.tree.get(node.scope) - if not tree: - raise ValueError("Missing entry for command argument {scope!r}.") - result = yield from visit_single(node.value, required=True) return [ acc.helper( "set_location", - acc.helper(f"convert:{tree.parser}", result, tree.properties or {}), + acc.helper(f"convert_{node.converter}", result), acc.make_ref(node), ) ] diff --git a/packages/mecha/mecha/contrib/scripting/helpers.py b/packages/mecha/mecha/contrib/scripting/helpers.py index 8c04497d9..7c901e961 100644 --- a/packages/mecha/mecha/contrib/scripting/helpers.py +++ b/packages/mecha/mecha/contrib/scripting/helpers.py @@ -3,11 +3,9 @@ ] -import re from dataclasses import replace from typing import Any, Dict, Union, cast -from beet.core.utils import JsonDict from tokenstream import set_location from mecha import ( @@ -15,13 +13,15 @@ AstChildren, AstJson, AstLiteral, - AstNode, + AstMessage, AstNumber, + AstResourceLocation, + AstSelector, AstString, + AstTime, ) -from mecha.ast import AstMessage, AstSelector - -WORD_REGEX = re.compile(r"[0-9A-Za-z_\.\+\-]+") +from mecha.ast import AstNbt, AstRange +from mecha.utils import string_to_number def get_scripting_helpers() -> Dict[str, Any]: @@ -32,14 +32,16 @@ def get_scripting_helpers() -> Dict[str, Any]: "children": AstChildren, "set_location": set_location, "get_attribute": get_attribute, - "convert:brigadier:bool": convert_bool, - "convert:brigadier:double": convert_float, - "convert:brigadier:float": convert_float, - "convert:brigadier:integer": convert_int, - "convert:brigadier:long": convert_int, - "convert:brigadier:string": convert_string, - "convert:minecraft:component": convert_json, - "convert:minecraft:message": convert_message, + "convert_literal": convert_literal, + "convert_bool": convert_bool, + "convert_numeric": convert_numeric, + "convert_time": convert_time, + "convert_string": convert_string, + "convert_json": convert_json, + "convert_nbt": convert_nbt, + "convert_range": convert_range, + "convert_resource_location": convert_resource_location, + "convert_message": convert_message, } @@ -51,39 +53,45 @@ def get_attribute(obj: Any, attr: str): return obj[attr] -def convert_bool(obj: Any, properties: JsonDict) -> AstBool: - return AstBool(value=bool(obj)) +def convert_literal(obj: Any) -> AstLiteral: + return AstLiteral(value=str(obj)) -def convert_float(obj: Any, properties: JsonDict) -> AstNumber: - return AstNumber(value=float(obj)) +def convert_bool(obj: Any) -> AstBool: + return AstBool(value=bool(obj)) -def convert_int(obj: Any, properties: JsonDict) -> AstNumber: - return AstNumber(value=int(obj)) +def convert_numeric(obj: Any) -> AstNumber: + if isinstance(obj, str): + obj = string_to_number(obj) + return AstNumber(value=obj) -def convert_string(obj: Any, properties: JsonDict) -> AstNode: - value = str(obj) - string_type = properties["type"] +def convert_time(obj: Any) -> AstTime: + return AstTime.from_value(obj) - if string_type == "greedy": - return AstLiteral(value=value) - elif string_type == "word": - if WORD_REGEX.match(value): - return AstLiteral(value=value) - raise ValueError("Invalid word {value!r}.") - elif string_type == "phrase": - return AstString(value=value) - raise ValueError(f"Invalid string type {string_type!r}.") +def convert_string(obj: Any) -> AstString: + return AstString(value=str(obj)) -def convert_json(obj: Any, properties: JsonDict) -> AstJson: +def convert_json(obj: Any) -> AstJson: return AstJson.from_value(obj) -def convert_message(obj: Any, properties: JsonDict) -> AstMessage: +def convert_nbt(obj: Any) -> AstNbt: + return AstNbt.from_value(obj) + + +def convert_range(obj: Any) -> AstRange: + return AstRange.from_value(obj) + + +def convert_resource_location(obj: Any) -> AstResourceLocation: + return AstResourceLocation.from_value(str(obj)) + + +def convert_message(obj: Any) -> AstMessage: fragments = AstChildren([AstLiteral(value=str(obj))]) return AstMessage( fragments=cast(AstChildren[Union[AstLiteral, AstSelector]], fragments) diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index e2467bb06..8c82cc6a1 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -5,7 +5,7 @@ "UndefinedIdentifier", "create_scripting_root_parser", "ExecuteIfConditionConstraint", - "InterpolatedArgumentParser", + "InterpolationParser", "parse_statement", "AssignmentTargetParser", "IfElseConstraint", @@ -38,7 +38,6 @@ consume_line_continuation, delegate, get_stream_scope, - get_stream_spec, ) from mecha.utils import QuoteHelper, normalize_whitespace, string_to_number @@ -48,7 +47,6 @@ AstAssignmentTargetIdentifier, AstAttribute, AstCall, - AstCommandInterpolation, AstDict, AstDictItem, AstExpression, @@ -58,6 +56,7 @@ AstFunctionSignature, AstFunctionSignatureArgument, AstIdentifier, + AstInterpolation, AstList, AstLookup, AstValue, @@ -81,7 +80,6 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: "root": create_scripting_root_parser(parsers["root"]), "nested_root": create_scripting_root_parser(parsers["nested_root"]), "command": ExecuteIfConditionConstraint(parsers["command"]), - "command:argument": InterpolatedArgumentParser(parsers["command:argument"]), "command:argument:mecha:scripting:statement": delegate("scripting:statement"), "command:argument:mecha:scripting:assignment_target": delegate( "scripting:assignment_target" @@ -174,6 +172,28 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: ] ), "scripting:literal": LiteralParser(), + ################################################################################ + # Interpolation + ################################################################################ + "literal": InterpolationParser("literal", parsers["literal"]), + "bool": InterpolationParser("bool", parsers["bool"]), + "numeric": InterpolationParser("numeric", parsers["numeric"]), + "time": InterpolationParser("time", parsers["time"]), + "word": InterpolationParser("literal", parsers["word"]), + "phrase": InterpolationParser("string", parsers["phrase"]), + "greedy": InterpolationParser("literal", parsers["greedy"]), + "json": InterpolationParser("json", parsers["json"]), + "nbt": InterpolationParser("nbt", parsers["nbt"]), + "range": InterpolationParser("range", parsers["range"]), + "resource_location_or_tag": InterpolationParser( + "resource_location", parsers["resource_location_or_tag"] + ), + "objective": InterpolationParser("literal", parsers["objective"]), + "swizzle": InterpolationParser("literal", parsers["swizzle"]), + "team": InterpolationParser("literal", parsers["team"]), + "command:argument:minecraft:message": InterpolationParser( + "message", parsers["command:argument:minecraft:message"] + ), } @@ -246,31 +266,19 @@ def __call__(self, stream: TokenStream) -> Any: @dataclass -class InterpolatedArgumentParser: - """Parser for interpolated command arguments.""" +class InterpolationParser: + """Parser for interpolation.""" + converter: str parser: Parser def __call__(self, stream: TokenStream) -> Any: - spec = get_stream_spec(stream) - scope = get_stream_scope(stream) - - tree = spec.tree.get(scope) - - if ( - tree - and tree.parser - and tree.parser.startswith(("mecha:scripting", "mecha:nested_root")) - ): - return self.parser(stream) - for parser, alternative in stream.choose("interpolation", "argument"): with alternative: if parser == "interpolation": node = delegate("scripting:interpolation", stream) - return set_location( - AstCommandInterpolation(scope=scope, value=node), node - ) + node = AstInterpolation(converter=self.converter, value=node) + return set_location(node, node.value) elif parser == "argument": return self.parser(stream) diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index 043c6b074..294efd812 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -74,7 +74,7 @@ def __init__(self, ctx: Union[Context, Mecha]): self.directory = mc.directory self.database = mc.database - self.codegen = Codegen(spec=mc.spec) + self.codegen = Codegen() self.evaluate = Evaluator(runtime=self) mc.steps.insert(0, self.evaluate) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 03eb6763d..5452848f5 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -888,7 +888,7 @@ def __call__(self, stream: TokenStream) -> AstJson: stream.expect("colon") - value_node = self(stream) + value_node = delegate("json", stream) entry_node = AstJsonObjectEntry(key=key_node, value=value_node) entries.append(set_location(entry_node, key_node, value_node)) @@ -905,7 +905,7 @@ def __call__(self, stream: TokenStream) -> AstJson: elements: List[AstJson] = [] for _ in stream.peek_until(("bracket", "]")): - elements.append(self(stream)) + elements.append(delegate("json", stream)) if not stream.get("comma"): stream.expect(("bracket", "]")) @@ -1006,7 +1006,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: stream.expect("colon") - value_node = self(stream) + value_node = delegate("nbt", stream) entry_node = AstNbtCompoundEntry(key=key_node, value=value_node) entries.append(set_location(entry_node, key_node, value_node)) @@ -1023,7 +1023,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: elements: List[AstNbt] = [] for _ in stream.peek_until(("bracket", "]")): - elements.append(self(stream)) + elements.append(delegate("nbt", stream)) if not stream.get("comma"): stream.expect(("bracket", "]")) @@ -1324,16 +1324,7 @@ class RangeParser: def __call__(self, stream: TokenStream) -> AstRange: with stream.syntax(range=self.pattern): token = stream.expect("range") - minimum, separator, maximum = token.value.partition("..") - - if not separator: - maximum = minimum - - node = AstRange( - min=string_to_number(minimum) if minimum else None, - max=string_to_number(maximum) if maximum else None, - ) - return set_location(node, token) + return set_location(AstRange.from_value(token.value), token) @dataclass @@ -1387,22 +1378,7 @@ class TimeParser(NumericParser): pattern: str = NUMBER_PATTERN + r"[dst]?" def create_node(self, stream: TokenStream) -> Any: - token = stream.current - value = token.value - - if value.endswith(("d", "s", "t")): - if value[-1] == "d": - unit = "day" - elif value[-1] == "s": - unit = "second" - else: - unit = "tick" - value = value[:-1] - else: - unit = "tick" - - node = AstTime(value=string_to_number(value), unit=unit) - return set_location(node, token) + return set_location(AstTime.from_value(stream.current.value), stream.current) def parse_uuid(stream: TokenStream) -> AstUUID: @@ -1865,7 +1841,6 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) - @dataclass class AlternativeParser: """Parser that tries the given alternatives in order.""" diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 87a0ee166..f25a3b6bb 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -367,3 +367,13 @@ def wat() ### a = '' tellraw @p a +### +foo = '[{"text": "Hello", "bold": true}]' +as @a at @s if block ~ ~-1 ~ #wool give @s stone{ + display: { + Name: foo, + Lore: [ + '[{ "text": "Something else here" }]', + ] + } +} diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 45e57221d..c7061c417 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -37,6 +37,7 @@ say AAA say BBB say CCC say just once +execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '{"text": "Hello", "bold": true}'}} ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__0.txt b/packages/mecha/tests/snapshots/scripting__parse_102__0.txt index 188063524..899a7a3eb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__0.txt @@ -35,10 +35,10 @@ tellraw @p a variable: 'p' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=18, lineno=2, colno=12) diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt index bf08d4ae6..cd94cb501 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt @@ -1,19 +1,19 @@ -_mecha_helper_convert_minecraft_component = _mecha_runtime.helpers['convert:minecraft:component'] +_mecha_helper_convert_json = _mecha_runtime.helpers['convert_json'] _mecha_helper_set_location = _mecha_runtime.helpers['set_location'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: a = '' - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_minecraft_component(a, {}), _mecha_refs[0])]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_json(a), _mecha_refs[0])]))) _mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 --- _mecha_refs[0] - + location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=18, lineno=2, colno=12) @@ -38,10 +38,10 @@ _mecha_refs[2] variable: 'p' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=18, lineno=2, colno=12) @@ -82,10 +82,10 @@ _mecha_refs[3] variable: 'p' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=18, lineno=2, colno=12) diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__0.txt b/packages/mecha/tests/snapshots/scripting__parse_103__0.txt new file mode 100644 index 000000000..aa5c1ddaf --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_103__0.txt @@ -0,0 +1,178 @@ +foo = '[{"text": "Hello", "bold": true}]' +as @a at @s if block ~ ~-1 ~ #wool give @s stone{ + display: { + Name: foo, + Lore: [ + '[{ "text": "Something else here" }]', + ] + } +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=211, lineno=10, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + value: '[{"text": "Hello", "bold": true}]' + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt new file mode 100644 index 000000000..c16a60b65 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt @@ -0,0 +1,1181 @@ +_mecha_helper_convert_nbt = _mecha_runtime.helpers['convert_nbt'] +_mecha_helper_set_location = _mecha_runtime.helpers['set_location'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +with _mecha_runtime.scope() as _mecha_var0: + foo = '[{"text": "Hello", "bold": true}]' + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_helper_set_location(_mecha_helper_convert_nbt(foo), _mecha_refs[0])), _mecha_refs[2]])))])))]))]))]))]))]))]))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' +_mecha_refs[1] + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' +_mecha_refs[2] + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[3] + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[4] + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[5] + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[6] + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[7] + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + +_mecha_refs[8] + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[9] + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[10] + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 +_mecha_refs[11] + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None +_mecha_refs[12] + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[13] + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + +_mecha_refs[14] + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[15] + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + +_mecha_refs[16] + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[17] + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') +_mecha_refs[18] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=211, lineno=10, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + value: '[{"text": "Hello", "bold": true}]' + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt index 8e1cf76b4..0386bfdf5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt @@ -36,10 +36,10 @@ f("thing") variable: 'a' arguments: - + location: SourceLocation(pos=24, lineno=2, colno=16) end_location: SourceLocation(pos=25, lineno=2, colno=17) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=24, lineno=2, colno=16) diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt index 6ee5a5001..6ce58950f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt @@ -1,20 +1,20 @@ -_mecha_helper_convert_minecraft_component = _mecha_runtime.helpers['convert:minecraft:component'] +_mecha_helper_convert_json = _mecha_runtime.helpers['convert_json'] _mecha_helper_set_location = _mecha_runtime.helpers['set_location'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(x): - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_minecraft_component(x, {}), _mecha_refs[0])]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_json(x), _mecha_refs[0])]))) f('thing') _mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 --- _mecha_refs[0] - + location: SourceLocation(pos=24, lineno=2, colno=16) end_location: SourceLocation(pos=25, lineno=2, colno=17) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=24, lineno=2, colno=16) @@ -39,10 +39,10 @@ _mecha_refs[2] variable: 'a' arguments: - + location: SourceLocation(pos=24, lineno=2, colno=16) end_location: SourceLocation(pos=25, lineno=2, colno=17) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=24, lineno=2, colno=16) @@ -83,10 +83,10 @@ _mecha_refs[3] variable: 'a' arguments: - + location: SourceLocation(pos=24, lineno=2, colno=16) end_location: SourceLocation(pos=25, lineno=2, colno=17) - scope: ('tellraw', 'targets', 'message') + converter: 'json' value: location: SourceLocation(pos=24, lineno=2, colno=16) From 5cb530be6911884385b8189ec6bac8c10e0e9b09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Dec 2021 12:17:30 +0000 Subject: [PATCH 0524/1554] chore(deps-dev): bump pyright from 1.1.191 to 1.1.192 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.191 to 1.1.192. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.192/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 7ec87cd77..e21cd7cdd 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.191" + "pyright": "^1.1.192" } }, "node_modules/pyright": { - "version": "1.1.191", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.191.tgz", - "integrity": "sha512-1WyWpfLudnT+wBNYoaqQV2yOmpzI8otmDIGrEdLG0pikHWktuVSq8rvcqLF2QzzZVgb67TWCXp9u+wBt214lzA==", + "version": "1.1.192", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.192.tgz", + "integrity": "sha512-yOGHGwYUze4Rz2t/F/I6E/6aj915jrOXCl7XFtslEF4vlCbBWPi61kkTcpsPckXZT9EQt3U4DeHvovtWrUYD/g==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.191", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.191.tgz", - "integrity": "sha512-1WyWpfLudnT+wBNYoaqQV2yOmpzI8otmDIGrEdLG0pikHWktuVSq8rvcqLF2QzzZVgb67TWCXp9u+wBt214lzA==", + "version": "1.1.192", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.192.tgz", + "integrity": "sha512-yOGHGwYUze4Rz2t/F/I6E/6aj915jrOXCl7XFtslEF4vlCbBWPi61kkTcpsPckXZT9EQt3U4DeHvovtWrUYD/g==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index ddf9ea325..feb25a0dc 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.191" + "pyright": "^1.1.192" } } From ef1e7d62d735f9ce005627f7067c10c1f9ca473c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 4 Dec 2021 12:53:55 +0100 Subject: [PATCH 0525/1554] chore: pyright smokes crack --- packages/mecha/mecha/api.py | 11 ++++++----- packages/mecha/mecha/contrib/scripting/runtime.py | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 49531312f..2db5e1649 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -27,13 +27,11 @@ ) from beet import Cache, Context, DataPack, Function, TextFileBase -from beet.core.utils import FileSystemPath, JsonDict, extra_field +from beet.core.utils import FileSystemPath, JsonDict, extra_field, import_from_string from pydantic import BaseModel from tokenstream import InvalidSyntax, TokenStream from tokenstream.location import set_location -from mecha import __version__ - from .ast import AstNode, AstRoot from .config import CommandTree from .database import CompilationDatabase, CompilationUnit @@ -56,19 +54,22 @@ logger = logging.getLogger("mecha") +@dataclass class AstCacheBackend: """Backend for the ast cache.""" + version: str = import_from_string("mecha.__version__") + def load_data(self, f: BufferedReader) -> JsonDict: """Load the pickled data.""" data = pickle.load(f) - if data["mecha"] != __version__ or data["python"] != sys.version: + if data["mecha"] != self.version or data["python"] != sys.version: raise ValueError("Version mismatch.") return data def dump_data(self, data: JsonDict, f: BufferedWriter): """Dump the pickled data.""" - data["mecha"] = __version__ + data["mecha"] = self.version data["python"] = sys.version pickle.dump(data, f) diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index 294efd812..a813e169e 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -83,7 +83,7 @@ def __init__(self, ctx: Union[Context, Mecha]): self.commands = [] self.helpers = get_scripting_helpers() - mc.cache_backend = ModuleCacheBackend(self) + mc.cache_backend = ModuleCacheBackend(runtime=self) def get_module( self, @@ -153,7 +153,7 @@ def scope( class ModuleCacheBackend(AstCacheBackend): """Cache backend that also restores the generated modules.""" - runtime: Runtime + runtime: Runtime = required_field() def load(self, f: BufferedReader) -> AstRoot: data = self.load_data(f) From 00f6ba93ff0f1a70bf651fd7a0f227c9a7517287 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 4 Dec 2021 11:54:38 +0000 Subject: [PATCH 0526/1554] 0.18.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 10 ++++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 9463519d5..f92337dbc 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,16 @@ +## v0.18.0 (2021-12-04) +### Feature +* Interpolation now works on most nodes instead of command arguments specifically ([`288f836`](https://github.com/mcbeet/mecha/commit/288f836fff0c447bb743d89b46b1dfc06d53b7f8)) +* Add codegen ([`0d4409f`](https://github.com/mcbeet/mecha/commit/0d4409ffa271f8968f16a84a4be20063e920c0de)) + +### Fix +* Invalidate ast cache on version bumps ([`0cd634c`](https://github.com/mcbeet/mecha/commit/0cd634c5deffe0bbbe1efa4f1498364b28a6f266)) +* Forgot to take into account number of matched fields when sorting rules ([`d13fa3c`](https://github.com/mcbeet/mecha/commit/d13fa3c06a42d6cfe28b8e775ba3af4e77093cff)) +* Convert normalizers to parsers and get rid of normalize step ([`2c44606`](https://github.com/mcbeet/mecha/commit/2c44606e146d1d27a6061cf056fb931a08a51147)) + ## v0.17.0 (2021-12-01) ### Feature * Parse lists and dicts ([`5b1776b`](https://github.com/mcbeet/mecha/commit/5b1776be44c63392060e56f47a03082dcf201871)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d3ea8daac..eacd6f2c9 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.0" +__version__ = "0.18.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3c3c00298..2cb14256e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.17.0" +version = "0.18.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b0797afaf9732773739d502d869792276abc21ab Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 08:43:23 +0100 Subject: [PATCH 0527/1554] fix: typo when tracking attribute source location --- packages/mecha/mecha/contrib/scripting/parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 8c82cc6a1..87d43f7af 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -646,7 +646,7 @@ def __call__(self, stream: TokenStream) -> Any: if identifier: node = AstAttribute(value=node, name=identifier.value) - node = set_location(node, node, identifier) + node = set_location(node, node.value, identifier) continue if string: From 9b8fcb34d84b73286249ce080dbdd8ff2a3f58bb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 10:27:29 +0100 Subject: [PATCH 0528/1554] fix: add exception handling to dispatcher --- packages/mecha/mecha/dispatch.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 8f75fe83c..293650813 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -5,6 +5,7 @@ "MutatingReducer", "Rule", "rule", + "CompilationError", ] @@ -32,6 +33,7 @@ overload, ) +from beet import FormattedPipelineException, PipelineFallthroughException from beet.core.utils import extra_field from .ast import AstChildren, AstNode @@ -40,6 +42,15 @@ T = TypeVar("T") +class CompilationError(FormattedPipelineException): + """Raised when an error occurs in a rule.""" + + def __init__(self, message: str) -> None: + super().__init__(message) + self.message = message + self.format_cause = True + + @dataclass class Rule: """Rule that can be associated to an ast node by the dispatcher.""" @@ -266,6 +277,16 @@ def use_rule(self, node: AstNode, name: Optional[str] = None) -> Iterator[None]: end_location=node.end_location, ) ) + except StopIteration: + raise + except PipelineFallthroughException: + raise + except Exception as exc: + msg = "Compilation raised an exception." + if name: + msg += f" ({name})" + tb = exc.__traceback__ and exc.__traceback__.tb_next + raise CompilationError(msg) from exc.with_traceback(tb) def __call__(self, node: AstNode) -> T: if not self.count: From b7f353d6b3199ed0800207e1280b3af2da0cce00 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 11:35:53 +0100 Subject: [PATCH 0529/1554] feat: track line numbers and rewrite tracebacks coming from generated code --- .../mecha/mecha/contrib/scripting/codegen.py | 46 ++++++++----- .../mecha/mecha/contrib/scripting/helpers.py | 68 ++++++++++++------- .../mecha/mecha/contrib/scripting/parse.py | 2 +- .../mecha/mecha/contrib/scripting/runtime.py | 42 +++++++++--- .../mecha/mecha/contrib/scripting/utils.py | 64 ++++++++++++++++- .../tests/snapshots/scripting__parse_0__1.txt | 1 + .../snapshots/scripting__parse_101__1.txt | 1 + .../snapshots/scripting__parse_102__1.txt | 10 ++- .../snapshots/scripting__parse_103__1.txt | 10 ++- .../snapshots/scripting__parse_10__1.txt | 9 ++- .../snapshots/scripting__parse_11__1.txt | 9 ++- .../snapshots/scripting__parse_12__1.txt | 15 +++- .../snapshots/scripting__parse_13__1.txt | 9 ++- .../snapshots/scripting__parse_14__1.txt | 9 ++- .../snapshots/scripting__parse_15__1.txt | 7 +- .../snapshots/scripting__parse_16__1.txt | 33 ++++++++- .../snapshots/scripting__parse_17__1.txt | 49 ++++++++++++- .../tests/snapshots/scripting__parse_1__1.txt | 1 + .../snapshots/scripting__parse_20__1.txt | 7 +- .../snapshots/scripting__parse_21__1.txt | 1 + .../snapshots/scripting__parse_22__1.txt | 1 + .../snapshots/scripting__parse_23__1.txt | 1 + .../snapshots/scripting__parse_24__1.txt | 1 + .../snapshots/scripting__parse_25__1.txt | 1 + .../snapshots/scripting__parse_26__1.txt | 1 + .../snapshots/scripting__parse_29__1.txt | 1 + .../tests/snapshots/scripting__parse_2__1.txt | 1 + .../snapshots/scripting__parse_32__1.txt | 5 +- .../snapshots/scripting__parse_33__1.txt | 7 +- .../snapshots/scripting__parse_34__1.txt | 7 +- .../snapshots/scripting__parse_35__1.txt | 5 +- .../tests/snapshots/scripting__parse_3__1.txt | 1 + .../snapshots/scripting__parse_41__1.txt | 1 + .../snapshots/scripting__parse_42__1.txt | 9 ++- .../snapshots/scripting__parse_43__1.txt | 5 +- .../snapshots/scripting__parse_44__1.txt | 1 + .../snapshots/scripting__parse_45__1.txt | 1 + .../snapshots/scripting__parse_46__1.txt | 13 +++- .../snapshots/scripting__parse_47__1.txt | 5 +- .../snapshots/scripting__parse_49__1.txt | 7 +- .../tests/snapshots/scripting__parse_4__1.txt | 1 + .../snapshots/scripting__parse_50__1.txt | 7 +- .../snapshots/scripting__parse_51__1.txt | 1 + .../snapshots/scripting__parse_53__1.txt | 5 +- .../snapshots/scripting__parse_55__1.txt | 5 +- .../snapshots/scripting__parse_57__1.txt | 1 + .../tests/snapshots/scripting__parse_5__1.txt | 5 +- .../snapshots/scripting__parse_62__1.txt | 1 + .../snapshots/scripting__parse_63__1.txt | 1 + .../snapshots/scripting__parse_64__1.txt | 7 +- .../snapshots/scripting__parse_65__0.txt | 2 +- .../snapshots/scripting__parse_65__1.txt | 7 +- .../snapshots/scripting__parse_66__0.txt | 4 +- .../snapshots/scripting__parse_66__1.txt | 11 ++- .../snapshots/scripting__parse_67__0.txt | 6 +- .../snapshots/scripting__parse_67__1.txt | 15 ++-- .../snapshots/scripting__parse_68__0.txt | 14 ++-- .../snapshots/scripting__parse_68__1.txt | 33 ++++++--- .../snapshots/scripting__parse_69__1.txt | 5 +- .../tests/snapshots/scripting__parse_6__1.txt | 5 +- .../snapshots/scripting__parse_70__1.txt | 7 +- .../snapshots/scripting__parse_71__1.txt | 13 +++- .../snapshots/scripting__parse_72__1.txt | 13 +++- .../snapshots/scripting__parse_77__1.txt | 9 ++- .../tests/snapshots/scripting__parse_7__1.txt | 7 +- .../snapshots/scripting__parse_81__1.txt | 17 ++++- .../snapshots/scripting__parse_82__1.txt | 19 +++++- .../snapshots/scripting__parse_84__1.txt | 1 + .../snapshots/scripting__parse_87__1.txt | 5 +- .../snapshots/scripting__parse_89__1.txt | 16 +++-- .../tests/snapshots/scripting__parse_8__1.txt | 7 +- .../snapshots/scripting__parse_91__1.txt | 5 +- .../snapshots/scripting__parse_92__1.txt | 7 +- .../snapshots/scripting__parse_93__1.txt | 7 +- .../snapshots/scripting__parse_94__1.txt | 13 +++- .../snapshots/scripting__parse_95__1.txt | 11 ++- .../snapshots/scripting__parse_96__1.txt | 11 ++- .../snapshots/scripting__parse_97__1.txt | 19 +++++- .../tests/snapshots/scripting__parse_9__1.txt | 7 +- 79 files changed, 653 insertions(+), 144 deletions(-) diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index 4dab45ddd..614d1188b 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -64,7 +64,18 @@ def get_source(self) -> str: f"{variable} = {expression}\n" for expression, variable in self.header.items() ) - return header + "".join(self.lines) + + source = header + "".join(self.lines) + + current_line = 1 + line_numbers: List[int] = [1] + + for line in source.splitlines(): + if line.startswith("#"): + current_line = int(line[1:]) + line_numbers.append(current_line) + + return f"_mecha_lineno = {line_numbers!r}\n{source}" def helper(self, name: str, *args: Any) -> str: """Emit helper.""" @@ -121,6 +132,12 @@ def statement(self, code: str): """Emit statement.""" self.lines.append(f"{self.indentation}{code}\n") + def lineno(self, node: Optional[AstNode] = None): + """Emit line number.""" + if node and not node.location.unknown: + return f"\n#{node.location.lineno}\n" + return "" + @dataclass class ChildrenCollector: @@ -456,14 +473,8 @@ def interpolation( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: result = yield from visit_single(node.value, required=True) - - return [ - acc.helper( - "set_location", - acc.helper(f"convert_{node.converter}", result), - acc.make_ref(node), - ) - ] + result = acc.helper(f"interpolate_{node.converter}", result, acc.make_ref(node)) + return [f"({acc.lineno(node)}{result})"] @rule(AstExpressionBinary) def binary( @@ -474,7 +485,7 @@ def binary( op = node.operator.replace("_", " ") left = yield from visit_single(node.left, required=True) right = yield from visit_single(node.right, required=True) - return [f"({left} {op} {right})"] + return [f"({acc.lineno(node)}{left} {op} {right})"] @rule(AstExpressionUnary) def unary( @@ -484,7 +495,7 @@ def unary( ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: op = node.operator.replace("_", " ") value = yield from visit_single(node.value, required=True) - return [f"({op} {value})"] + return [f"({acc.lineno(node)}{op} {value})"] @rule(AstValue) def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: @@ -492,7 +503,7 @@ def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: @rule(AstIdentifier) def identifier(self, node: AstIdentifier, acc: Accumulator) -> Optional[List[str]]: - return [node.value] + return [f"({acc.lineno(node)}{node.value})"] @rule(AstList) def list( @@ -506,7 +517,7 @@ def list( value = yield from visit_single(item, required=True) items.append(value) - return [f"[{', '.join(items)}]"] + return [f"({acc.lineno(node)}[{', '.join(items)}])"] @rule(AstDict) def dict( @@ -521,7 +532,7 @@ def dict( value = yield from visit_single(item.value, required=True) items.append(f"{key}: {value}") - return [f"{{{', '.join(items)}}}"] + return [f"({acc.lineno(node)}{{{', '.join(items)}}})"] @rule(AstAttribute) def attribute( @@ -530,7 +541,8 @@ def attribute( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: value = yield from visit_single(node.value, required=True) - return [acc.helper("get_attribute", value, repr(node.name))] + result = acc.helper("get_attribute", value, repr(node.name)) + return [f"({acc.lineno(node)}{result})"] @rule(AstLookup) def lookup( @@ -546,7 +558,7 @@ def lookup( value = yield from visit_single(node.value, required=True) - return [f"{value}[{', '.join(arguments)}]"] + return [f"({acc.lineno(node)}{value}[{', '.join(arguments)}])"] @rule(AstCall) def call( @@ -562,7 +574,7 @@ def call( value = yield from visit_single(node.value, required=True) - return [f"{value}({', '.join(arguments)})"] + return [f"({acc.lineno(node)}{value}({', '.join(arguments)}))"] @rule(AstAssignment) def assignment( diff --git a/packages/mecha/mecha/contrib/scripting/helpers.py b/packages/mecha/mecha/contrib/scripting/helpers.py index 7c901e961..42531fcdd 100644 --- a/packages/mecha/mecha/contrib/scripting/helpers.py +++ b/packages/mecha/mecha/contrib/scripting/helpers.py @@ -4,7 +4,8 @@ from dataclasses import replace -from typing import Any, Dict, Union, cast +from functools import wraps +from typing import Any, Callable, Dict, Union, cast from tokenstream import set_location @@ -14,15 +15,19 @@ AstJson, AstLiteral, AstMessage, + AstNbt, + AstNode, AstNumber, + AstRange, AstResourceLocation, AstSelector, AstString, AstTime, ) -from mecha.ast import AstNbt, AstRange from mecha.utils import string_to_number +from .utils import internal + def get_scripting_helpers() -> Dict[str, Any]: """Return a collection of helpers used by the generated code.""" @@ -30,68 +35,79 @@ def get_scripting_helpers() -> Dict[str, Any]: "replace": replace, "missing": object(), "children": AstChildren, - "set_location": set_location, "get_attribute": get_attribute, - "convert_literal": convert_literal, - "convert_bool": convert_bool, - "convert_numeric": convert_numeric, - "convert_time": convert_time, - "convert_string": convert_string, - "convert_json": convert_json, - "convert_nbt": convert_nbt, - "convert_range": convert_range, - "convert_resource_location": convert_resource_location, - "convert_message": convert_message, + "interpolate_literal": converter(interpolate_literal), + "interpolate_bool": converter(interpolate_bool), + "interpolate_numeric": converter(interpolate_numeric), + "interpolate_time": converter(interpolate_time), + "interpolate_string": converter(interpolate_string), + "interpolate_json": converter(interpolate_json), + "interpolate_nbt": converter(interpolate_nbt), + "interpolate_range": converter(interpolate_range), + "interpolate_resource_location": converter(interpolate_resource_location), + "interpolate_message": converter(interpolate_message), } +@internal def get_attribute(obj: Any, attr: str): try: return getattr(obj, attr) - except AttributeError: - pass - return obj[attr] + except AttributeError as exc: + try: + return obj[attr] + except (TypeError, LookupError): + raise exc from None + + +def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: + @internal + @wraps(f) + def wrapper(obj: Any, node: AstNode) -> AstNode: + return set_location(f(obj), node) + + return wrapper -def convert_literal(obj: Any) -> AstLiteral: +def interpolate_literal(obj: Any) -> AstLiteral: return AstLiteral(value=str(obj)) -def convert_bool(obj: Any) -> AstBool: +def interpolate_bool(obj: Any) -> AstBool: return AstBool(value=bool(obj)) -def convert_numeric(obj: Any) -> AstNumber: +def interpolate_numeric(obj: Any) -> AstNumber: if isinstance(obj, str): obj = string_to_number(obj) return AstNumber(value=obj) -def convert_time(obj: Any) -> AstTime: +def interpolate_time(obj: Any) -> AstTime: return AstTime.from_value(obj) -def convert_string(obj: Any) -> AstString: +def interpolate_string(obj: Any) -> AstString: return AstString(value=str(obj)) -def convert_json(obj: Any) -> AstJson: +def interpolate_json(obj: Any) -> AstJson: return AstJson.from_value(obj) -def convert_nbt(obj: Any) -> AstNbt: +def interpolate_nbt(obj: Any) -> AstNbt: return AstNbt.from_value(obj) -def convert_range(obj: Any) -> AstRange: +def interpolate_range(obj: Any) -> AstRange: return AstRange.from_value(obj) -def convert_resource_location(obj: Any) -> AstResourceLocation: +def interpolate_resource_location(obj: Any) -> AstResourceLocation: return AstResourceLocation.from_value(str(obj)) -def convert_message(obj: Any) -> AstMessage: +def interpolate_message(obj: Any) -> AstMessage: fragments = AstChildren([AstLiteral(value=str(obj))]) return AstMessage( fragments=cast(AstChildren[Union[AstLiteral, AstSelector]], fragments) diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 87d43f7af..8c44f4bda 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -66,7 +66,7 @@ TRUE_PATTERN: str = r"\b[tT]rue\b" FALSE_PATTERN: str = r"\b[fF]alse\b" NULL_PATTERN: str = r"\b(?:null|None)\b" -IDENTIFIER_PATTERN: str = r"[a-zA-Z_][a-zA-Z0-9_]*" +IDENTIFIER_PATTERN: str = r"(?!_mecha_)[a-zA-Z_][a-zA-Z0-9_]*" STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index a813e169e..b33a3e932 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -15,7 +15,7 @@ from types import CodeType from typing import Any, Dict, Iterator, List, Optional, Union -from beet import Context, TextFileBase +from beet import Context, PipelineFallthroughException, TextFileBase from beet.core.utils import JsonDict, required_field from mecha import ( @@ -24,6 +24,7 @@ AstRoot, CommandTree, CompilationDatabase, + CompilationError, Dispatcher, Mecha, Visitor, @@ -33,6 +34,7 @@ from .codegen import Codegen from .helpers import get_scripting_helpers from .parse import get_scripting_parsers +from .utils import rewrite_traceback @dataclass @@ -43,6 +45,7 @@ class Module: code: Optional[CodeType] refs: List[Any] output: Optional[str] + resource_location: Optional[str] = None namespace: JsonDict = field(default_factory=dict) @@ -98,20 +101,22 @@ def get_module( if module and module.ast is node: return module + compilation_unit = self.database[file_instance] source, output, refs = self.codegen(node) if source and output: - if filename := self.database[file_instance].filename: - filename = str(self.directory / filename) - else: - filename = "" + filename = ( + str(self.directory / compilation_unit.filename) + if compilation_unit.filename + else "" + ) code = compile(source, filename, "exec") else: code = None - module = Module(node, code, refs, output) + module = Module(node, code, refs, output, compilation_unit.resource_location) self.modules[file_instance] = module return module @@ -125,9 +130,11 @@ def get_output(self, module: Module) -> AstRoot: module.namespace["_mecha_runtime"] = self module.namespace["_mecha_refs"] = module.refs + module.namespace["__name__"] = module.resource_location module.namespace["__file__"] = module.code.co_filename - exec(module.code, module.namespace) + with self.error_handler(): + exec(module.code, module.namespace) return module.namespace[module.output] @@ -148,6 +155,14 @@ def scope( finally: self.commands = previous_commands + @contextmanager + def error_handler(self): + """Handle errors coming from compiled modules.""" + try: + yield + except Exception as exc: + raise rewrite_traceback(exc) from None + @dataclass class ModuleCacheBackend(AstCacheBackend): @@ -164,6 +179,7 @@ def load(self, f: BufferedReader) -> AstRoot: code=marshal.load(f), refs=data["refs"], output=data["output"], + resource_location=data["resource_location"], ) return ast @@ -176,6 +192,7 @@ def dump(self, node: AstRoot, f: BufferedWriter): "ast": module.ast, "refs": module.refs, "output": module.output, + "resource_location": module.resource_location, }, f, ) @@ -192,4 +209,13 @@ class Evaluator(Visitor): @rule(AstRoot) def root(self, node: AstRoot) -> AstRoot: module = self.runtime.get_module(node) - return self.runtime.get_output(module) + try: + return self.runtime.get_output(module) + except PipelineFallthroughException: + raise + except Exception as exc: + msg = "Top-level statement raised an exception." + if module.resource_location: + msg += f" ({module.resource_location})" + tb = exc.__traceback__.tb_next.tb_next # type: ignore + raise CompilationError(msg) from exc.with_traceback(tb) diff --git a/packages/mecha/mecha/contrib/scripting/utils.py b/packages/mecha/mecha/contrib/scripting/utils.py index b0f974ed7..3e910e94e 100644 --- a/packages/mecha/mecha/contrib/scripting/utils.py +++ b/packages/mecha/mecha/contrib/scripting/utils.py @@ -1,13 +1,28 @@ __all__ = [ "ScriptingQuoteHelper", + "rewrite_traceback", + "fake_traceback", + "internal", + "INTERNAL_CODE", ] from dataclasses import dataclass, field -from typing import Dict +from types import CodeType, TracebackType +from typing import Dict, List, Set, TypeVar from mecha.utils import QuoteHelperWithUnicode +T = TypeVar("T") + + +INTERNAL_CODE: Set[CodeType] = set() + + +def internal(f: T) -> T: + INTERNAL_CODE.add(f.__code__) # type: ignore + return f + @dataclass class ScriptingQuoteHelper(QuoteHelperWithUnicode): @@ -22,3 +37,50 @@ class ScriptingQuoteHelper(QuoteHelperWithUnicode): r"\t": "\t", } ) + + +def rewrite_traceback(exc: Exception) -> Exception: + tb = exc.__traceback__ and exc.__traceback__.tb_next + + stack: List[TracebackType] = [] + + while tb is not None: + if tb.tb_frame.f_code in INTERNAL_CODE: + tb = tb.tb_next + continue + + line_numbers = tb.tb_frame.f_globals.get("_mecha_lineno") + + if line_numbers and tb.tb_lineno < len(line_numbers): + lineno = line_numbers[tb.tb_lineno] + stack.append(fake_traceback(exc, tb, lineno)) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc.with_traceback(tb) + + +def fake_traceback(exc: Exception, tb: TracebackType, lineno: int) -> TracebackType: # type: ignore + name = tb.tb_frame.f_code.co_name + filename = tb.tb_frame.f_globals["__file__"] + + if name == "": + name = tb.tb_frame.f_globals.get("__name__") + + code = compile("\n" * (lineno - 1) + "raise _mecha_exc", filename, "exec") + + if name: + code = code.replace(co_name=name) + + try: + exec(code, {"_mecha_exc": exc}) + except Exception as exc: + return exc.__traceback__.tb_next # type: ignore diff --git a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt index 40367b7f4..50d84ed55 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt index b7438444b..2937873c8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt index cd94cb501..77dd847bc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt @@ -1,10 +1,14 @@ -_mecha_helper_convert_json = _mecha_runtime.helpers['convert_json'] -_mecha_helper_set_location = _mecha_runtime.helpers['set_location'] +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: a = '' - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_json(a), _mecha_refs[0])]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], ( +#2 +_mecha_helper_interpolate_json(( +#2 +a), _mecha_refs[0]))]))) _mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt index c16a60b65..8f3248b37 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt @@ -1,10 +1,14 @@ -_mecha_helper_convert_nbt = _mecha_runtime.helpers['convert_nbt'] -_mecha_helper_set_location = _mecha_runtime.helpers['set_location'] +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4] +_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] _mecha_helper_children = _mecha_runtime.helpers['children'] with _mecha_runtime.scope() as _mecha_var0: foo = '[{"text": "Hello", "bold": true}]' - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_helper_set_location(_mecha_helper_convert_nbt(foo), _mecha_refs[0])), _mecha_refs[2]])))])))]))]))]))]))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=( +#4 +_mecha_helper_interpolate_nbt(( +#4 +foo), _mecha_refs[0]))), _mecha_refs[2]])))])))]))]))]))]))]))]))) _mecha_var1 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt index 09838208b..fd70dcd06 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt @@ -1,7 +1,14 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (2 + ((- 54) * 10)) + ( +#1 +2 + ( +#1 +( +#1 +- 54) * 10)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt index b206347c9..7d731ce69 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt @@ -1,7 +1,14 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - ((2 + (- 54)) * 10) + ( +#1 +( +#1 +2 + ( +#1 +- 54)) * 10) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt index 0c9de4f1c..792b94206 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt @@ -1,7 +1,20 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - ((- (- (- 64))) + (+ (+ 64))) + ( +#1 +( +#1 +- ( +#1 +- ( +#1 +- 64))) + ( +#1 ++ ( +#1 ++ 64))) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt index 90e168090..7da480916 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt @@ -1,7 +1,14 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (((1 * 2) / 3) * 4) + ( +#1 +( +#1 +( +#1 +1 * 2) / 3) * 4) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt index eb479a562..84646042c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt @@ -1,7 +1,14 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - ((1 * 2) / (3 * 4)) + ( +#1 +( +#1 +1 * 2) / ( +#1 +3 * 4)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt index 34fb12022..109a1b3c4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt @@ -1,7 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - ((16 // 5) % 7) + ( +#1 +( +#1 +16 // 5) % 7) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt index 45cde3179..fcaac9fdb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt @@ -1,7 +1,38 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (((((((((- (2 ** 3)) + (((((~ 4) * 5) // 6) / 7) % 9)) + 10) - 11) << 12) >> 13) & 14) ^ 15) | 16) + ( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +- ( +#1 +2 ** 3)) + ( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +~ 4) * 5) // 6) / 7) % 9)) + 10) - 11) << 12) >> 13) & 14) ^ 15) | 16) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt index 66a084c98..2c059e075 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt @@ -1,7 +1,54 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (((False or (True and 'hello')) or (not ('foo' == 'bar'))) or (((((((((1 != 2) and (1 < 2)) and (2 <= 3)) and (5 > 4)) and (6 >= 5)) and (1 in 1)) and (2 not in 2)) and (3 is 3)) and (3 is not 3))) + ( +#1 +( +#1 +( +#1 +False or ( +#1 +True and 'hello')) or ( +#1 +not ( +#1 +'foo' == 'bar'))) or ( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +1 != 2) and ( +#1 +1 < 2)) and ( +#1 +2 <= 3)) and ( +#1 +5 > 4)) and ( +#1 +6 >= 5)) and ( +#1 +1 in 1)) and ( +#1 +2 not in 2)) and ( +#1 +3 is 3)) and ( +#1 +3 is not 3))) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt index ead259730..dd5d3042d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt index a68edbba7..b6dfd779d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt @@ -1,7 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (True and (False or True)) + ( +#1 +True and ( +#1 +False or True)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt index be366f5aa..0c771248c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt index 42b57ffe0..48b913a39 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt index f941e5787..1552b613f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt index ac69a4414..e5b300d05 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt index fb1d5cfc1..8998687f8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt index 59aed96ff..155e4be80 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt index 1495e8e82..00aa261cc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt index 67f2311dc..3c7a9234d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt index 31380d88a..259cf46a6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt @@ -1,8 +1,11 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 - foo + ( +#2 +foo) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt index 477a0096d..0808007d8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 - ('hello' + foo) + ( +#2 +'hello' + ( +#2 +foo)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt index b7ca026b1..e2b1c3623 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: a = 1 - if (a == 1): + if ( +#2 +( +#2 +a) == 1): a = 0 _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt index 73e1651b8..e70ae2d06 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -1,9 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: if True: _mecha_runtime.commands.extend(_mecha_refs[0].commands) - elif (True or False): + elif ( +#3 +True or False): _mecha_runtime.commands.extend(_mecha_refs[1].commands) else: _mecha_runtime.commands.extend(_mecha_refs[2].commands) diff --git a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt index c8ac527ad..dc91c0e74 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt index 1b55516b2..791f1811e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt index c98e050c5..fadcfee4c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt @@ -1,10 +1,15 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: - if ('thing' == 'bar'): + if ( +#2 +'thing' == 'bar'): _mecha_runtime.commands.extend(_mecha_refs[0].commands) - if ('thing' == 'foo'): + if ( +#4 +'thing' == 'foo'): _mecha_runtime.commands.extend(_mecha_refs[1].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1)) diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt index 8a664636b..b29e6daac 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt @@ -1,8 +1,11 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: - if ('thing' == 'foo'): + if ( +#2 +'thing' == 'foo'): _mecha_runtime.commands.extend(_mecha_refs[0].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt index 40204172f..3668e5d77 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt index b94292289..50801c7ab 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt index 2f7ca7e71..523ec900b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt @@ -1,11 +1,20 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: count = 42 - while (count > 0): + while ( +#3 +( +#3 +count) > 0): _mecha_runtime.commands.append(_mecha_refs[0]) - count = (count - 1) + count = ( +#5 +( +#5 +count) - 1) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) --- diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt index 4a95acd1d..96af8b407 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt @@ -1,7 +1,10 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - foo = ('abc' + 'def') + foo = ( +#2 +'abc' + 'def') _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt index 9dc02e3fa..58beef004 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt @@ -1,7 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - ((True | False) | None) + ( +#1 +( +#1 +True | False) | None) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt index 3773e3587..0de1a8139 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt index df7b925dc..2f6e87709 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 - (foo == 1) + ( +#2 +( +#2 +foo) == 1) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt index 7672d4a2a..d4cccffc9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt index e0e2b7e8c..0c6712a8e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt @@ -1,8 +1,11 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 - foo = foo + foo = ( +#2 +foo) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt index f22ffaa1c..1333b92af 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt @@ -1,8 +1,11 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: for foo in 'foo': - foo = foo + foo = ( +#2 +foo) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt index f3f0683eb..d836b4043 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt index b8ce5294a..06a5120b5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt @@ -1,7 +1,10 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (1 + 2) + ( +#1 +1 + 2) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt index dc9c32c7a..990391824 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt index 340d4ca6f..57089c285 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt index e1b6415d3..0b98a4973 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: for i in 'abc': - if (i == 'b'): + if ( +#2 +( +#2 +i) == 'b'): break _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__0.txt b/packages/mecha/tests/snapshots/scripting__parse_65__0.txt index 4ef71611f..3b219c6f0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_65__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_65__0.txt @@ -10,7 +10,7 @@ identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt index ce018c07a..38778c9c4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt @@ -1,8 +1,11 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - _mecha_helper_get_attribute('foo', 'bar') + ( +#1 +_mecha_helper_get_attribute('foo', 'bar')) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 @@ -18,7 +21,7 @@ _mecha_refs[0] identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__0.txt b/packages/mecha/tests/snapshots/scripting__parse_66__0.txt index 10c917dc8..fadf43b3f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_66__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_66__0.txt @@ -10,12 +10,12 @@ identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'baz' value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt index 247ecab8d..68f61165a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - _mecha_helper_get_attribute(_mecha_helper_get_attribute('foo', 'bar'), 'baz') + ( +#1 +_mecha_helper_get_attribute(( +#1 +_mecha_helper_get_attribute('foo', 'bar')), 'baz')) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 @@ -18,12 +23,12 @@ _mecha_refs[0] identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'baz' value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__0.txt b/packages/mecha/tests/snapshots/scripting__parse_67__0.txt index ee518aa8f..24660c3d2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_67__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_67__0.txt @@ -10,15 +10,15 @@ identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt index bb181ba07..52a4f3fca 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt @@ -1,8 +1,15 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - _mecha_helper_get_attribute('foo', 'bar')()[0] + ( +#1 +( +#1 +( +#1 +_mecha_helper_get_attribute('foo', 'bar'))())[0]) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 @@ -18,15 +25,15 @@ _mecha_refs[0] identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__0.txt b/packages/mecha/tests/snapshots/scripting__parse_68__0.txt index 99097c6e7..7e797bf1c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_68__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_68__0.txt @@ -10,31 +10,31 @@ identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=51, lineno=1, colno=52) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=38, lineno=1, colno=39) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=1, colno=23) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt index 8267bb024..44ddf143c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt @@ -1,8 +1,25 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - _mecha_helper_get_attribute('foo', 'bar')()[0]['hello'][99]['with space'](('thing' * 7)) + ( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +( +#1 +_mecha_helper_get_attribute('foo', 'bar'))())[0])['hello'])[99])['with space'])(( +#1 +'thing' * 7))) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 @@ -18,31 +35,31 @@ _mecha_refs[0] identifier: 'statement' arguments: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=51, lineno=1, colno=52) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=38, lineno=1, colno=39) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=1, colno=23) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: - location: SourceLocation(pos=-1, lineno=0, colno=0) + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'bar' value: diff --git a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt index 12e8bb560..795641dd0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt @@ -1,7 +1,10 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - 'foo'(1, 2, 3) + ( +#1 +'foo'(1, 2, 3)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt index 24fd7792e..ff64f322e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt @@ -1,7 +1,10 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (1 - 2) + ( +#1 +1 - 2) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt index 39eb79a1f..a3f86c699 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt @@ -1,9 +1,14 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): _mecha_runtime.commands.extend(_mecha_refs[0].commands) - foo() + ( +#3 +( +#3 +foo)()) _mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt index 9e6057cd4..1f40535cf 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt @@ -1,10 +1,19 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): def bar(): - foo() - bar() + ( +#3 +( +#3 +foo)()) + ( +#4 +( +#4 +bar)()) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt index 2ccb7dd94..41c4fe1fb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4] _mecha_helper_missing = _mecha_runtime.helpers['missing'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] @@ -6,9 +7,17 @@ with _mecha_runtime.scope() as _mecha_var0: if a is _mecha_helper_missing: a = 1 if b is _mecha_helper_missing: - b = a + b = ( +#3 +a) if c is _mecha_helper_missing: - c = (a + b) + c = ( +#4 +( +#4 +a) + ( +#4 +b)) _mecha_runtime.commands.extend(_mecha_refs[0].commands) _mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) --- diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt index 44d9c334e..5bf769469 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt @@ -1,11 +1,16 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2] _mecha_helper_missing = _mecha_runtime.helpers['missing'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(a, b=_mecha_helper_missing): if b is _mecha_helper_missing: - b = a - b += a + b = ( +#1 +a) + b += ( +#2 +a) _mecha_runtime.commands.append(_mecha_refs[0]) _mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) --- diff --git a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt index a36bdc6e8..91c34efce 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt @@ -1,7 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - ((1 - 2) + 3) + ( +#1 +( +#1 +1 - 2) + 3) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt index c08a7340a..92ad8fb10 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: @@ -5,10 +6,20 @@ with _mecha_runtime.scope() as _mecha_var0: def wat(): _mecha_runtime.commands.append(_mecha_refs[0]) x = 'hello' - for i in something: - x += (i * 3) + for i in ( +#10 +something): + x += ( +#11 +( +#11 +i) * 3) _mecha_runtime.commands.append(_mecha_refs[1]) - wat() + ( +#14 +( +#14 +wat)()) _mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt index 02cf3ee57..fffd66b90 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt @@ -1,11 +1,24 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): - thing += bar() + thing += ( +#2 +( +#2 +bar)()) def bar(): - thing += foo() - thing = bar() + thing += ( +#4 +( +#4 +foo)()) + thing = ( +#5 +( +#5 +bar)()) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt index c2d2cbc2b..733d23a50 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt @@ -1,3 +1,4 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt index 785acc536..038421f21 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt @@ -1,9 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(): def g(): - return foo + return ( +#3 +foo) foo = 0 _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt index 6ce58950f..b48b01227 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt @@ -1,11 +1,19 @@ -_mecha_helper_convert_json = _mecha_runtime.helpers['convert_json'] -_mecha_helper_set_location = _mecha_runtime.helpers['set_location'] +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3] +_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(x): - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_helper_set_location(_mecha_helper_convert_json(x), _mecha_refs[0])]))) - f('thing') + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], ( +#2 +_mecha_helper_interpolate_json(( +#2 +x), _mecha_refs[0]))]))) + ( +#3 +( +#3 +f)('thing')) _mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt index 0ad760245..3850484e2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt @@ -1,7 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (1 - (2 + 3)) + ( +#1 +1 - ( +#1 +2 + 3)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt index dcf5571eb..98885bc0b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt @@ -1,7 +1,10 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - {'foo': 'bar'} + ( +#1 +{'foo': 'bar'}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt index 853fdc369..a30f86acc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'hello' - {foo: 'bar'} + ( +#2 +{( +#3 +foo): 'bar'}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt index 2ba3de71e..f4a44d786 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt @@ -1,8 +1,13 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'hello' - {'foo': foo} + ( +#2 +{'foo': ( +#3 +foo)}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt index c7c4a56db..27a571e09 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt @@ -1,8 +1,19 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'hello' - {(foo * 3): 42, (16 + 3): []} + ( +#2 +{( +#3 +( +#3 +foo) * 3): 42, ( +#4 +16 + 3): ( +#4 +[])}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt index d43df612c..45ce95392 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt @@ -1,7 +1,16 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 4, 4, 5, 5, 6, 6, 6] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - predicate = {'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': {'score1': {'min': {'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1}}}} + predicate = ( +#1 +{'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': ( +#4 +{'score1': ( +#5 +{'min': ( +#6 +{'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1})})})}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt index 19ce2d155..4c8f01c5f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt @@ -1,7 +1,16 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 4, 4, 5, 5, 6, 6, 6] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - predicate = {'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': {'score1': {'min': {'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1}}}} + predicate = ( +#1 +{'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': ( +#4 +{'score1': ( +#5 +{'min': ( +#6 +{'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1})})})}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt index 985d1c77c..a2edf8568 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt @@ -1,8 +1,25 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(): - return {f(): f(), 'other': [{}, {}, 'wat']} + return ( +#2 +{( +#2 +( +#2 +f)()): ( +#2 +( +#2 +f)()), 'other': ( +#2 +[( +#2 +{}), ( +#2 +{}), 'wat'])}) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt index 9b59c17ed..db5b5a55f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt @@ -1,7 +1,12 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: - (2 + (- 54)) + ( +#1 +2 + ( +#1 +- 54)) _mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) --- output = _mecha_var1 From d3bce4c413ccb07b876d2c1909e7e4f0f1d45202 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 5 Dec 2021 10:37:53 +0000 Subject: [PATCH 0530/1554] 0.19.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 8 ++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f92337dbc..3425696b8 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.19.0 (2021-12-05) +### Feature +* Track line numbers and rewrite tracebacks coming from generated code ([`8582212`](https://github.com/mcbeet/mecha/commit/8582212361aed3fa0c6f6dc575cf9d18725478d1)) + +### Fix +* Add exception handling to dispatcher ([`d8e9e95`](https://github.com/mcbeet/mecha/commit/d8e9e9563a6d4576efa815e0e4fb3d8f96eea04e)) +* Typo when tracking attribute source location ([`500441d`](https://github.com/mcbeet/mecha/commit/500441d959ba670ef70936a659089160e7584090)) + ## v0.18.0 (2021-12-04) ### Feature * Interpolation now works on most nodes instead of command arguments specifically ([`288f836`](https://github.com/mcbeet/mecha/commit/288f836fff0c447bb743d89b46b1dfc06d53b7f8)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index eacd6f2c9..cdb30f0d6 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.18.0" +__version__ = "0.19.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2cb14256e..78a7d8dfc 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.18.0" +version = "0.19.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From aa7233b84ff4c6b4524880f4755ae7f5823ac98a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 12:05:54 +0100 Subject: [PATCH 0531/1554] feat: add tuples --- .../src/data/demo/functions/foo.mcfunction | 5 ++ packages/mecha/mecha/contrib/scripting/ast.py | 8 ++ .../mecha/mecha/contrib/scripting/codegen.py | 15 ++++ .../mecha/mecha/contrib/scripting/parse.py | 23 +++++- .../resources/scripting_examples.mcfunction | 2 + ...examples__build_basic_scripting__0.pack.md | 3 + .../snapshots/scripting__parse_104__0.txt | 58 ++++++++++++++ .../snapshots/scripting__parse_104__1.txt | 76 +++++++++++++++++++ 8 files changed, 186 insertions(+), 4 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_104__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_104__1.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 15663e150..43c8ef288 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -76,3 +76,8 @@ as @a at @s if block ~ ~-1 ~ #wool give @s stone{ Name: something } } + +with_tuples = ((((())))) + (1,2,3) + (4,) +say with_tuples +say (with_tuples) +say (with_tuples,) diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 72890d77e..30208d8c5 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -4,6 +4,7 @@ "AstExpressionUnary", "AstValue", "AstIdentifier", + "AstTuple", "AstList", "AstDictItem", "AstDict", @@ -65,6 +66,13 @@ class AstIdentifier(AstExpression): value: str = required_field() +@dataclass(frozen=True) +class AstTuple(AstExpression): + """Ast tuple node.""" + + items: AstChildren[AstExpression] = required_field() + + @dataclass(frozen=True) class AstList(AstExpression): """Ast list node.""" diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index 614d1188b..da5f0a21e 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -44,6 +44,7 @@ AstInterpolation, AstList, AstLookup, + AstTuple, AstValue, ) @@ -505,6 +506,20 @@ def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: def identifier(self, node: AstIdentifier, acc: Accumulator) -> Optional[List[str]]: return [f"({acc.lineno(node)}{node.value})"] + @rule(AstTuple) + def tuple( + self, + node: AstTuple, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + items: List[str] = [] + + for item in node.items: + value = yield from visit_single(item, required=True) + items.append(f"{value},") + + return [f"({acc.lineno(node)}({''.join(items)}))"] + @rule(AstList) def list( self, diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 8c44f4bda..7a1763e77 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -59,6 +59,7 @@ AstInterpolation, AstList, AstLookup, + AstTuple, AstValue, ) from .utils import ScriptingQuoteHelper @@ -617,11 +618,25 @@ class PrimaryParser: quote_helper: QuoteHelper = field(default_factory=ScriptingQuoteHelper) def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(brace=r"\(|\)"): - if stream.get(("brace", "(")): + with stream.syntax(brace=r"\(|\)", comma=r","): + if token := stream.get(("brace", "(")): with stream.ignore("newline"): - node = delegate("scripting:expression", stream) - stream.expect(("brace", ")")) + comma = None + items: List[AstExpression] = [] + + for _ in stream.peek_until(("brace", ")")): + items.append(delegate("scripting:expression", stream)) + + if not (comma := stream.get("comma")): + stream.expect(("brace", ")")) + break + + if len(items) == 1 and not comma: + node = items[0] + else: + node = AstTuple(items=AstChildren(items)) + node = set_location(node, token, stream.current) + else: node = self.parser(stream) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index f25a3b6bb..ae3a966f4 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -377,3 +377,5 @@ as @a at @s if block ~ ~-1 ~ #wool give @s stone{ ] } } +### +thing = (1, 'hey') + () + ("wow",) diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index c7061c417..8fd2a360e 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -38,6 +38,9 @@ say BBB say CCC say just once execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '{"text": "Hello", "bold": true}'}} +say (1, 2, 3, 4) +say (1, 2, 3, 4) +say ((1, 2, 3, 4),) ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_104__0.txt b/packages/mecha/tests/snapshots/scripting__parse_104__0.txt new file mode 100644 index 000000000..ea98c5614 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_104__0.txt @@ -0,0 +1,58 @@ +thing = (1, 'hey') + () + ("wow",) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'thing' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + items: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'hey' + right: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + items: + + right: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + items: + + location: SourceLocation(pos=27, lineno=1, colno=28) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 'wow' diff --git a/packages/mecha/tests/snapshots/scripting__parse_104__1.txt b/packages/mecha/tests/snapshots/scripting__parse_104__1.txt new file mode 100644 index 000000000..0fa41fb1d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_104__1.txt @@ -0,0 +1,76 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + thing = ( +#1 +( +#1 +( +#1 +(1,'hey',)) + ( +#1 +())) + ( +#1 +('wow',))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'thing' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + items: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'hey' + right: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + items: + + right: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + items: + + location: SourceLocation(pos=27, lineno=1, colno=28) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 'wow' From cf5d89b5ee27b4bf3f938829283665b0e961c017 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 13:32:42 +0100 Subject: [PATCH 0532/1554] feat: add f-strings --- .../src/data/demo/functions/foo.mcfunction | 3 + packages/mecha/mecha/contrib/scripting/ast.py | 9 +++ .../mecha/mecha/contrib/scripting/codegen.py | 15 +++++ .../mecha/mecha/contrib/scripting/parse.py | 57 ++++++++++++++++++- .../resources/scripting_examples.mcfunction | 26 +++++++++ ...examples__build_basic_scripting__0.pack.md | 2 + .../snapshots/scripting__parse_105__0.txt | 17 ++++++ .../snapshots/scripting__parse_105__1.txt | 27 +++++++++ .../snapshots/scripting__parse_106__0.txt | 40 +++++++++++++ .../snapshots/scripting__parse_106__1.txt | 52 +++++++++++++++++ .../snapshots/scripting__parse_107__0.txt | 40 +++++++++++++ .../snapshots/scripting__parse_107__1.txt | 52 +++++++++++++++++ .../snapshots/scripting__parse_108__0.txt | 30 ++++++++++ .../snapshots/scripting__parse_108__1.txt | 42 ++++++++++++++ .../snapshots/scripting__parse_109__0.txt | 30 ++++++++++ .../snapshots/scripting__parse_109__1.txt | 42 ++++++++++++++ .../snapshots/scripting__parse_110__0.txt | 20 +++++++ .../snapshots/scripting__parse_110__1.txt | 30 ++++++++++ .../snapshots/scripting__parse_111__0.txt | 40 +++++++++++++ .../snapshots/scripting__parse_111__1.txt | 54 ++++++++++++++++++ .../snapshots/scripting__parse_112__0.txt | 27 +++++++++ .../snapshots/scripting__parse_112__1.txt | 37 ++++++++++++ .../snapshots/scripting__parse_113__0.txt | 27 +++++++++ .../snapshots/scripting__parse_113__1.txt | 37 ++++++++++++ .../snapshots/scripting__parse_114__0.txt | 27 +++++++++ .../snapshots/scripting__parse_114__1.txt | 37 ++++++++++++ .../snapshots/scripting__parse_115__0.txt | 5 ++ .../snapshots/scripting__parse_116__0.txt | 5 ++ 28 files changed, 828 insertions(+), 2 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_105__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_105__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_106__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_106__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_107__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_107__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_108__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_108__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_109__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_109__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_110__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_110__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_111__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_111__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_112__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_112__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_113__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_113__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_114__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_114__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_115__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_116__0.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 43c8ef288..11ea16fa7 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -81,3 +81,6 @@ with_tuples = ((((())))) + (1,2,3) + (4,) say with_tuples say (with_tuples) say (with_tuples,) +a = f'\\' +say f"f-strings {"work".upper()!r} too {a}" +say f"{{{f"{{{f"{{{7:08}}}\\"}}}\""}}}" diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 30208d8c5..96be6eb76 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -4,6 +4,7 @@ "AstExpressionUnary", "AstValue", "AstIdentifier", + "AstFormatString", "AstTuple", "AstList", "AstDictItem", @@ -66,6 +67,14 @@ class AstIdentifier(AstExpression): value: str = required_field() +@dataclass(frozen=True) +class AstFormatString(AstExpression): + """Ast format string node.""" + + fmt: str = required_field() + values: AstChildren[AstExpression] = required_field() + + @dataclass(frozen=True) class AstTuple(AstExpression): """Ast tuple node.""" diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index da5f0a21e..83727e10a 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -39,6 +39,7 @@ AstDict, AstExpressionBinary, AstExpressionUnary, + AstFormatString, AstFunctionSignature, AstIdentifier, AstInterpolation, @@ -506,6 +507,20 @@ def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: def identifier(self, node: AstIdentifier, acc: Accumulator) -> Optional[List[str]]: return [f"({acc.lineno(node)}{node.value})"] + @rule(AstFormatString) + def format_string( + self, + node: AstFormatString, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + values: List[str] = [] + + for value in node.values: + result = yield from visit_single(value, required=True) + values.append(result) + + return [f"({acc.lineno(node)}{node.fmt!r}.format({', '.join(values)}))"] + @rule(AstTuple) def tuple( self, diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 7a1763e77..70f29a536 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -52,6 +52,7 @@ AstExpression, AstExpressionBinary, AstExpressionUnary, + AstFormatString, AstFunctionRoot, AstFunctionSignature, AstFunctionSignatureArgument, @@ -618,8 +619,10 @@ class PrimaryParser: quote_helper: QuoteHelper = field(default_factory=ScriptingQuoteHelper) def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(brace=r"\(|\)", comma=r","): - if token := stream.get(("brace", "(")): + with stream.syntax(brace=r"\(|\)", comma=r",", format_string=r"f['\"]"): + token = stream.get(("brace", "("), "format_string") + + if token and token.match("brace"): with stream.ignore("newline"): comma = None items: List[AstExpression] = [] @@ -637,6 +640,56 @@ def __call__(self, stream: TokenStream) -> Any: node = AstTuple(items=AstChildren(items)) node = set_location(node, token, stream.current) + elif token and token.match("format_string"): + quote = token.value[-1] + + with stream.syntax( + escape=fr"\\.", + double_brace=r"\{\{|\}\}", + brace=r"\{|\}", + quote=quote, + text=r"[^\\]+?", + ): + fmt = quote + values: List[AstExpression] = [] + + for escape, double_brace, brace, text in stream.collect( + "escape", + "double_brace", + ("brace", "{"), + "text", + ): + if escape: + fmt += escape.value + elif double_brace: + fmt += double_brace.value + elif brace: + fmt += "{" + with stream.syntax(text=None): + values.append(delegate("scripting:expression", stream)) + with stream.syntax(spec=r"[:!][^\}]+", double_brace=None): + if spec := stream.get("spec"): + fmt += spec.value + stream.expect(("brace", "}")) + fmt += "}" + elif text: + fmt += text.value + + end_quote = stream.expect("quote") + fmt += end_quote.value + + fmt = self.quote_helper.unquote_string( + Token( + "format_string", + fmt, + token.location.with_horizontal_offset(1), + end_quote.end_location, + ) + ) + + node = AstFormatString(fmt=fmt, values=AstChildren(values)) + node = set_location(node, token, end_quote) + else: node = self.parser(stream) diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index ae3a966f4..2081c9e78 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -379,3 +379,29 @@ as @a at @s if block ~ ~-1 ~ #wool give @s stone{ } ### thing = (1, 'hey') + () + ("wow",) +### +f"hello" +### +foo = "world" +f"hello {foo}" +### +foo = "world" +f"hello {foo!r}" +### +f"hello {1 + 1}" +### +f"hello {1 + 1:03}" +### +f'{{}}nope{1}' +### +yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" +### +yo = f"" +### +yo = f"\"" +### +yo = f"\\" +### +yo = f"}" +### +yo = f'thing \e' diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 8fd2a360e..69e724a5d 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -41,6 +41,8 @@ execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '{" say (1, 2, 3, 4) say (1, 2, 3, 4) say ((1, 2, 3, 4),) +say f-strings 'WORK' too \ +say {{{00000007}\}"} ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_105__0.txt b/packages/mecha/tests/snapshots/scripting__parse_105__0.txt new file mode 100644 index 000000000..4a84017c5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_105__0.txt @@ -0,0 +1,17 @@ +f"hello" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + fmt: 'hello' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_105__1.txt b/packages/mecha/tests/snapshots/scripting__parse_105__1.txt new file mode 100644 index 000000000..e01e9117b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_105__1.txt @@ -0,0 +1,27 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ( +#1 +'hello'.format()) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + fmt: 'hello' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_106__0.txt b/packages/mecha/tests/snapshots/scripting__parse_106__0.txt new file mode 100644 index 000000000..15dacf8dc --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_106__0.txt @@ -0,0 +1,40 @@ +foo = "world" +f"hello {foo}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + fmt: 'hello {}' + values: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=13) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_106__1.txt b/packages/mecha/tests/snapshots/scripting__parse_106__1.txt new file mode 100644 index 000000000..bf6dd308f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_106__1.txt @@ -0,0 +1,52 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 'world' + ( +#2 +'hello {}'.format(( +#2 +foo))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + fmt: 'hello {}' + values: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=13) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_107__0.txt b/packages/mecha/tests/snapshots/scripting__parse_107__0.txt new file mode 100644 index 000000000..099ff6b9f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_107__0.txt @@ -0,0 +1,40 @@ +foo = "world" +f"hello {foo!r}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=17) + fmt: 'hello {!r}' + values: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=13) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_107__1.txt b/packages/mecha/tests/snapshots/scripting__parse_107__1.txt new file mode 100644 index 000000000..72d650fa6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_107__1.txt @@ -0,0 +1,52 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + foo = 'world' + ( +#2 +'hello {!r}'.format(( +#2 +foo))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=17) + fmt: 'hello {!r}' + values: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=13) + value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_108__0.txt b/packages/mecha/tests/snapshots/scripting__parse_108__0.txt new file mode 100644 index 000000000..7c764727d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_108__0.txt @@ -0,0 +1,30 @@ +f"hello {1 + 1}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + fmt: 'hello {}' + values: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_108__1.txt b/packages/mecha/tests/snapshots/scripting__parse_108__1.txt new file mode 100644 index 000000000..816b749f9 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_108__1.txt @@ -0,0 +1,42 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ( +#1 +'hello {}'.format(( +#1 +1 + 1))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + fmt: 'hello {}' + values: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_109__0.txt b/packages/mecha/tests/snapshots/scripting__parse_109__0.txt new file mode 100644 index 000000000..c14171f43 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_109__0.txt @@ -0,0 +1,30 @@ +f"hello {1 + 1:03}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + fmt: 'hello {:03}' + values: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_109__1.txt b/packages/mecha/tests/snapshots/scripting__parse_109__1.txt new file mode 100644 index 000000000..f3295465b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_109__1.txt @@ -0,0 +1,42 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ( +#1 +'hello {:03}'.format(( +#1 +1 + 1))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + fmt: 'hello {:03}' + values: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_110__0.txt b/packages/mecha/tests/snapshots/scripting__parse_110__0.txt new file mode 100644 index 000000000..eecf265fc --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_110__0.txt @@ -0,0 +1,20 @@ +f'{{}}nope{1}' +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + fmt: '{{}}nope{}' + values: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_110__1.txt b/packages/mecha/tests/snapshots/scripting__parse_110__1.txt new file mode 100644 index 000000000..5106f2031 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_110__1.txt @@ -0,0 +1,30 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + ( +#1 +'{{}}nope{}'.format(1)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + fmt: '{{}}nope{}' + values: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_111__0.txt b/packages/mecha/tests/snapshots/scripting__parse_111__0.txt new file mode 100644 index 000000000..bf9333bb3 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_111__0.txt @@ -0,0 +1,40 @@ +yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + fmt: '{{{}}}' + values: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + fmt: '{{{}}}' + values: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + fmt: '{{{:08}}}' + values: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_111__1.txt b/packages/mecha/tests/snapshots/scripting__parse_111__1.txt new file mode 100644 index 000000000..7675bc23e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_111__1.txt @@ -0,0 +1,54 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + yo = ( +#1 +'{{{}}}'.format(( +#1 +'{{{}}}'.format(( +#1 +'{{{:08}}}'.format(7)))))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + fmt: '{{{}}}' + values: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + fmt: '{{{}}}' + values: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + fmt: '{{{:08}}}' + values: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_112__0.txt b/packages/mecha/tests/snapshots/scripting__parse_112__0.txt new file mode 100644 index 000000000..d790bed77 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_112__0.txt @@ -0,0 +1,27 @@ +yo = f"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + fmt: '' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_112__1.txt b/packages/mecha/tests/snapshots/scripting__parse_112__1.txt new file mode 100644 index 000000000..07d0a7b12 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_112__1.txt @@ -0,0 +1,37 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + yo = ( +#1 +''.format()) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + fmt: '' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_113__0.txt b/packages/mecha/tests/snapshots/scripting__parse_113__0.txt new file mode 100644 index 000000000..6875f4b6e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_113__0.txt @@ -0,0 +1,27 @@ +yo = f"\"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + fmt: '"' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_113__1.txt b/packages/mecha/tests/snapshots/scripting__parse_113__1.txt new file mode 100644 index 000000000..bf4c21f0c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_113__1.txt @@ -0,0 +1,37 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + yo = ( +#1 +'"'.format()) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + fmt: '"' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_114__0.txt b/packages/mecha/tests/snapshots/scripting__parse_114__0.txt new file mode 100644 index 000000000..995a72630 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_114__0.txt @@ -0,0 +1,27 @@ +yo = f"\\" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + fmt: '\\' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_114__1.txt b/packages/mecha/tests/snapshots/scripting__parse_114__1.txt new file mode 100644 index 000000000..1f8be8e48 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_114__1.txt @@ -0,0 +1,37 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + yo = ( +#1 +'\\'.format()) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + fmt: '\\' + values: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_115__0.txt b/packages/mecha/tests/snapshots/scripting__parse_115__0.txt new file mode 100644 index 000000000..d448a7276 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_115__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected quote but got brace '}'. +# line 1, column 8 +# 1 | yo = f"}" +# : ^ +yo = f"}" diff --git a/packages/mecha/tests/snapshots/scripting__parse_116__0.txt b/packages/mecha/tests/snapshots/scripting__parse_116__0.txt new file mode 100644 index 000000000..8bb2a7b3c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_116__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid escape sequence \e. +# line 1, column 14 +# 1 | yo = f'thing \e' +# : ^^ +yo = f'thing \e' From e95ff7533ca61b97bff46b9b76dfc4aa1af726ed Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 13:49:13 +0100 Subject: [PATCH 0533/1554] feat: tweak constraints and make it possible to convert tuples to ranges --- .../src/data/demo/functions/foo.mcfunction | 4 + packages/mecha/mecha/ast.py | 17 +- packages/mecha/mecha/parse.py | 123 ++++----- .../resources/scripting_examples.mcfunction | 3 + ...examples__build_basic_scripting__0.pack.md | 2 + .../snapshots/scripting__parse_117__0.txt | 81 ++++++ .../snapshots/scripting__parse_117__1.txt | 252 ++++++++++++++++++ 7 files changed, 417 insertions(+), 65 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_117__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_117__1.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 11ea16fa7..587242ee0 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -84,3 +84,7 @@ say (with_tuples,) a = f'\\' say f"f-strings {"work".upper()!r} too {a}" say f"{{{f"{{{f"{{{7:08}}}\\"}}}\""}}}" + +x = 8 +if score @s tmp matches (x, None) say wat +if score @s tmp matches f"{x}.." say wat diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 8ad006020..082334edc 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -519,11 +519,26 @@ def value(self) -> Union[int, float]: return self.min # type: ignore @classmethod - def from_value(cls, value: Union[str, int, float]) -> "AstRange": + def from_value( + cls, + value: Union[ + str, + int, + float, + Tuple[Union[int, float, str], Union[int, float, str]], + ], + ) -> "AstRange": """Create a range node from a given value.""" if isinstance(value, (int, float)): return AstRange(min=value, max=value) + if isinstance(value, tuple): + min, max = value + return AstRange( + min=string_to_number(min) if isinstance(min, str) else min, + max=string_to_number(max) if isinstance(max, str) else max, + ) + minimum, separator, maximum = value.partition("..") if not separator: diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 5452848f5..7fdae408e 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -727,11 +727,9 @@ class IntegerConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstNumber = self.parser(stream) - - if not isinstance(node.value, int): - raise node.emit_error(InvalidSyntax("Expected integer value.")) - + if isinstance(node := self.parser(stream), AstNumber): + if not isinstance(node.value, int): + raise node.emit_error(InvalidSyntax("Expected integer value.")) return node @@ -743,14 +741,18 @@ class MinMaxConstraint: def __call__(self, stream: TokenStream) -> Any: properties = get_stream_properties(stream) - node: AstNumber = self.parser(stream) - if "min" in properties and node.value < properties["min"]: - exc = InvalidSyntax(f"Expected value to be at least {properties['min']}.") - raise node.emit_error(exc) - if "max" in properties and node.value > properties["max"]: - exc = InvalidSyntax(f"Expected value to be at most {properties['max']}.") - raise node.emit_error(exc) + if isinstance(node := self.parser(stream), AstNumber): + if "min" in properties and node.value < properties["min"]: + exc = InvalidSyntax( + f"Expected value to be at least {properties['min']}." + ) + raise node.emit_error(exc) + if "max" in properties and node.value > properties["max"]: + exc = InvalidSyntax( + f"Expected value to be at most {properties['max']}." + ) + raise node.emit_error(exc) return node @@ -763,12 +765,10 @@ class RestrictCoordinateConstraint: disallow: List[Literal["absolute", "relative", "local"]] def __call__(self, stream: TokenStream) -> Any: - node: AstCoordinate = self.parser(stream) - - if node.type in self.disallow: - exc = InvalidSyntax(f"Specifying {node.type} coordinates not allowed.") - raise node.emit_error(exc) - + if isinstance(node := self.parser(stream), AstCoordinate): + if node.type in self.disallow: + exc = InvalidSyntax(f"Specifying {node.type} coordinates not allowed.") + raise node.emit_error(exc) return node @@ -1141,12 +1141,12 @@ class NoTagConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstResourceLocation = self.parser(stream) - - if node.is_tag: - raise node.emit_error( - InvalidSyntax(f"Specifying a tag is not allowed {node.get_value()!r}.") - ) + if isinstance(node := self.parser(stream), AstResourceLocation): + if node.is_tag: + exc = InvalidSyntax( + f"Specifying a tag is not allowed {node.get_value()!r}." + ) + raise node.emit_error(exc) return node @@ -1262,11 +1262,10 @@ class NoBlockStatesConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstBlock = self.parser(stream) - - if node.block_states: - raise node.emit_error(InvalidSyntax("Specifying block states not allowed.")) - + if isinstance(node := self.parser(stream), AstBlock): + if node.block_states: + exc = InvalidSyntax("Specifying block states not allowed.") + raise node.emit_error(exc) return node @@ -1277,11 +1276,10 @@ class NoDataTagsConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstBlock = self.parser(stream) - - if node.data_tags: - raise node.emit_error(InvalidSyntax("Specifying data tags not allowed.")) - + if isinstance(node := self.parser(stream), AstBlock): + if node.data_tags: + exc = InvalidSyntax("Specifying data tags not allowed.") + raise node.emit_error(exc) return node @@ -1307,11 +1305,10 @@ class LiteralConstraint: values: List[Any] def __call__(self, stream: TokenStream) -> Any: - node: AstLiteral = self.parser(stream) - - if node.value not in self.values: - raise node.emit_error(InvalidSyntax(f"Unexpected value {node.value!r}.")) - + if isinstance(node := self.parser(stream), AstLiteral): + if node.value not in self.values: + exc = InvalidSyntax(f"Unexpected value {node.value!r}.") + raise node.emit_error(exc) return node @@ -1334,11 +1331,9 @@ class IntegerRangeConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstRange = self.parser(stream) - - if isinstance(node.min, float) or isinstance(node.max, float): - raise node.emit_error(InvalidSyntax("Expected integer range.")) - + if isinstance(node := self.parser(stream), AstRange): + if isinstance(node.min, float) or isinstance(node.max, float): + raise node.emit_error(InvalidSyntax("Expected integer range.")) return node @@ -1350,12 +1345,10 @@ class LengthConstraint: limit: int def __call__(self, stream: TokenStream) -> Any: - node: AstLiteral = self.parser(stream) - - if len(node.value) > self.limit: - exc = InvalidSyntax(f"Expected up to {self.limit} characters.") - raise node.emit_error(exc) - + if isinstance(node := self.parser(stream), AstLiteral): + if len(node.value) > self.limit: + exc = InvalidSyntax(f"Expected up to {self.limit} characters.") + raise node.emit_error(exc) return node @@ -1466,12 +1459,10 @@ class SelectorArgumentInvertConstraint: allow_invert: List[str] def __call__(self, stream: TokenStream) -> Any: - node: AstSelectorArgument = self.parser(stream) - - if node.inverted and node.key.value not in self.allow_invert: - exc = InvalidSyntax(f"Can not invert argument {node.key.value!r}.") - raise node.emit_error(exc) - + if isinstance(node := self.parser(stream), AstSelectorArgument): + if node.inverted and node.key.value not in self.allow_invert: + exc = InvalidSyntax(f"Can not invert argument {node.key.value!r}.") + raise node.emit_error(exc) return node @@ -1483,12 +1474,10 @@ class SelectorArgumentNoValueConstraint: allow_no_value: List[str] def __call__(self, stream: TokenStream) -> Any: - node: AstSelectorArgument = self.parser(stream) - - if not node.value and node.key.value not in self.allow_no_value: - exc = InvalidSyntax(f"Argument {node.key.value!r} must have a value.") - raise node.emit_error(exc) - + if isinstance(node := self.parser(stream), AstSelectorArgument): + if not node.value and node.key.value not in self.allow_no_value: + exc = InvalidSyntax(f"Argument {node.key.value!r} must have a value.") + raise node.emit_error(exc) return node @@ -1575,7 +1564,10 @@ class SelectorPlayerConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstSelector = self.parser(stream) + node = self.parser(stream) + + if not isinstance(node, AstSelector): + return node is_player = node.variable in "pras" @@ -1622,7 +1614,10 @@ class SelectorSingleConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - node: AstSelector = self.parser(stream) + node = self.parser(stream) + + if not isinstance(node, AstSelector): + return node is_single = node.variable in "prs" diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 2081c9e78..2acd74164 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -405,3 +405,6 @@ yo = f"\\" yo = f"}" ### yo = f'thing \e' +### +x = 8 +if score @s tmp matches (x, None) say wat diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 69e724a5d..c7cf9851e 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -43,6 +43,8 @@ say (1, 2, 3, 4) say ((1, 2, 3, 4),) say f-strings 'WORK' too \ say {{{00000007}\}"} +execute if score @s tmp matches 8.. run say wat +execute if score @s tmp matches 8.. run say wat ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_117__0.txt b/packages/mecha/tests/snapshots/scripting__parse_117__0.txt new file mode 100644 index 000000000..9ee052bea --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_117__0.txt @@ -0,0 +1,81 @@ +x = 8 +if score @s tmp matches (x, None) say wat +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'x' + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 8 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + converter: 'range' + value: + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + items: + + location: SourceLocation(pos=31, lineno=2, colno=26) + end_location: SourceLocation(pos=32, lineno=2, colno=27) + value: 'x' + + location: SourceLocation(pos=34, lineno=2, colno=29) + end_location: SourceLocation(pos=38, lineno=2, colno=33) + value: None + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + fragments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt new file mode 100644 index 000000000..c5219b9a6 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt @@ -0,0 +1,252 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2] +_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + x = 8 + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_refs[2], ( +#2 +_mecha_helper_interpolate_range(( +#2 +(( +#2 +x),None,)), _mecha_refs[0])), _mecha_refs[3]]))]))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + converter: 'range' + value: + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + items: + + location: SourceLocation(pos=31, lineno=2, colno=26) + end_location: SourceLocation(pos=32, lineno=2, colno=27) + value: 'x' + + location: SourceLocation(pos=34, lineno=2, colno=29) + end_location: SourceLocation(pos=38, lineno=2, colno=33) + value: None +_mecha_refs[1] + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' +_mecha_refs[3] + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + fragments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + value: 'wat' +_mecha_refs[4] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + converter: 'range' + value: + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + items: + + location: SourceLocation(pos=31, lineno=2, colno=26) + end_location: SourceLocation(pos=32, lineno=2, colno=27) + value: 'x' + + location: SourceLocation(pos=34, lineno=2, colno=29) + end_location: SourceLocation(pos=38, lineno=2, colno=33) + value: None + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + fragments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + value: 'wat' +_mecha_refs[5] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + converter: 'range' + value: + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + items: + + location: SourceLocation(pos=31, lineno=2, colno=26) + end_location: SourceLocation(pos=32, lineno=2, colno=27) + value: 'x' + + location: SourceLocation(pos=34, lineno=2, colno=29) + end_location: SourceLocation(pos=38, lineno=2, colno=33) + value: None + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + fragments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + value: 'wat' +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'x' + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 8 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + converter: 'range' + value: + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + items: + + location: SourceLocation(pos=31, lineno=2, colno=26) + end_location: SourceLocation(pos=32, lineno=2, colno=27) + value: 'x' + + location: SourceLocation(pos=34, lineno=2, colno=29) + end_location: SourceLocation(pos=38, lineno=2, colno=33) + value: None + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + fragments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + value: 'wat' From a721a6fa7ba1f2807d8f521865e9f562ff8437ac Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 14:31:46 +0100 Subject: [PATCH 0534/1554] feat: add globals --- .../src/data/demo/functions/foo.mcfunction | 8 ++ .../mecha/mecha/contrib/scripting/runtime.py | 40 +++++++++- .../mecha/mecha/contrib/scripting/utils.py | 56 +++++++++++++- .../resources/scripting_examples.mcfunction | 4 +- ...examples__build_basic_scripting__0.pack.md | 35 +++++++++ .../snapshots/scripting__parse_58__0.txt | 2 +- .../snapshots/scripting__parse_96__0.txt | 76 +++++++++---------- .../snapshots/scripting__parse_96__1.txt | 72 +++++++++--------- 8 files changed, 211 insertions(+), 82 deletions(-) diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 587242ee0..1f00096fd 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -88,3 +88,11 @@ say f"{{{f"{{{f"{{{7:08}}}\\"}}}\""}}}" x = 8 if score @s tmp matches (x, None) say wat if score @s tmp matches f"{x}.." say wat + + +def copy_items(type, count) + for i in range(count) + item replace entity @a f"{type}.{i}" from entity @s f"{type}.{i}" + +copy_items('hotbar', 9) +copy_items('inventory', 26) diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index b33a3e932..52cc01068 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -3,9 +3,11 @@ "Module", "ModuleCacheBackend", "Evaluator", + "GlobalsInjection", ] +import builtins import marshal from contextlib import contextmanager from dataclasses import dataclass, field @@ -13,10 +15,11 @@ from io import BufferedReader, BufferedWriter from pathlib import Path from types import CodeType -from typing import Any, Dict, Iterator, List, Optional, Union +from typing import Any, Dict, Iterator, List, Optional, Set, Union from beet import Context, PipelineFallthroughException, TextFileBase from beet.core.utils import JsonDict, required_field +from tokenstream import TokenStream from mecha import ( AstCacheBackend, @@ -27,6 +30,7 @@ CompilationError, Dispatcher, Mecha, + Parser, Visitor, rule, ) @@ -34,7 +38,7 @@ from .codegen import Codegen from .helpers import get_scripting_helpers from .parse import get_scripting_parsers -from .utils import rewrite_traceback +from .utils import SAFE_BUILTINS, rewrite_traceback @dataclass @@ -45,7 +49,8 @@ class Module: code: Optional[CodeType] refs: List[Any] output: Optional[str] - resource_location: Optional[str] = None + resource_location: Optional[str] + globals: Set[str] namespace: JsonDict = field(default_factory=dict) @@ -59,6 +64,7 @@ class Runtime: modules: Dict[TextFileBase[Any], Module] commands: List[AstCommand] helpers: Dict[str, Any] + globals: JsonDict def __init__(self, ctx: Union[Context, Mecha]): if isinstance(ctx, Context): @@ -74,6 +80,7 @@ def __init__(self, ctx: Union[Context, Mecha]): commands_json = read_text("mecha.contrib.scripting.resources", "commands.json") mc.spec.add_commands(CommandTree.parse_raw(commands_json)) mc.spec.parsers.update(get_scripting_parsers(mc.spec.parsers)) + mc.spec.parsers["root"] = GlobalsInjection(self, mc.spec.parsers["root"]) self.directory = mc.directory self.database = mc.database @@ -85,6 +92,7 @@ def __init__(self, ctx: Union[Context, Mecha]): self.modules = {} self.commands = [] self.helpers = get_scripting_helpers() + self.globals = {name: getattr(builtins, name) for name in SAFE_BUILTINS} mc.cache_backend = ModuleCacheBackend(runtime=self) @@ -116,7 +124,14 @@ def get_module( else: code = None - module = Module(node, code, refs, output, compilation_unit.resource_location) + module = Module( + node, + code, + refs, + output, + compilation_unit.resource_location, + set(self.globals), + ) self.modules[file_instance] = module return module @@ -174,12 +189,16 @@ def load(self, f: BufferedReader) -> AstRoot: data = self.load_data(f) ast = data["ast"] + if data["globals"] != set(self.runtime.globals): + raise ValueError("Globals mismatch.") + self.runtime.modules[self.runtime.database.current] = Module( ast=ast, code=marshal.load(f), refs=data["refs"], output=data["output"], resource_location=data["resource_location"], + globals=data["globals"], ) return ast @@ -193,6 +212,7 @@ def dump(self, node: AstRoot, f: BufferedWriter): "refs": module.refs, "output": module.output, "resource_location": module.resource_location, + "globals": module.globals, }, f, ) @@ -219,3 +239,15 @@ def root(self, node: AstRoot) -> AstRoot: msg += f" ({module.resource_location})" tb = exc.__traceback__.tb_next.tb_next # type: ignore raise CompilationError(msg) from exc.with_traceback(tb) + + +@dataclass +class GlobalsInjection: + """Inject global identifiers.""" + + runtime: Runtime + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide(identifiers=set(self.runtime.globals)): + return self.parser(stream) diff --git a/packages/mecha/mecha/contrib/scripting/utils.py b/packages/mecha/mecha/contrib/scripting/utils.py index 3e910e94e..fd33f0df2 100644 --- a/packages/mecha/mecha/contrib/scripting/utils.py +++ b/packages/mecha/mecha/contrib/scripting/utils.py @@ -4,12 +4,13 @@ "fake_traceback", "internal", "INTERNAL_CODE", + "SAFE_BUILTINS", ] from dataclasses import dataclass, field from types import CodeType, TracebackType -from typing import Dict, List, Set, TypeVar +from typing import Dict, List, Set, Tuple, TypeVar from mecha.utils import QuoteHelperWithUnicode @@ -24,6 +25,59 @@ def internal(f: T) -> T: return f +SAFE_BUILTINS: Tuple[str, ...] = ( + "abs", + "all", + "any", + "ascii", + "bin", + "bool", + "bytearray", + "bytes", + "callable", + "chr", + "complex", + "dict", + "divmod", + "enumerate", + "filter", + "float", + "format", + "frozenset", + "hasattr", + "hash", + "hex", + "id", + "int", + "isinstance", + "issubclass", + "iter", + "len", + "list", + "map", + "max", + "min", + "next", + "object", + "oct", + "ord", + "pow", + "print", + "range", + "repr", + "reversed", + "round", + "set", + "slice", + "sorted", + "str", + "sum", + "tuple", + "type", + "zip", +) + + @dataclass class ScriptingQuoteHelper(QuoteHelperWithUnicode): """Quote helper used for scripting.""" diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 2acd74164..8dd4459cb 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -341,8 +341,8 @@ predicate = { entity: "this", scores: { score1: { - min: { - type: "minecraft:score", + "min": { + "type": "minecraft:score", target: "this", score: "score2", scale: 1 diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index c7cf9851e..0bb0436a6 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -45,6 +45,41 @@ say f-strings 'WORK' too \ say {{{00000007}\}"} execute if score @s tmp matches 8.. run say wat execute if score @s tmp matches 8.. run say wat +item replace entity @a hotbar.0 from entity @s hotbar.0 +item replace entity @a hotbar.1 from entity @s hotbar.1 +item replace entity @a hotbar.2 from entity @s hotbar.2 +item replace entity @a hotbar.3 from entity @s hotbar.3 +item replace entity @a hotbar.4 from entity @s hotbar.4 +item replace entity @a hotbar.5 from entity @s hotbar.5 +item replace entity @a hotbar.6 from entity @s hotbar.6 +item replace entity @a hotbar.7 from entity @s hotbar.7 +item replace entity @a hotbar.8 from entity @s hotbar.8 +item replace entity @a inventory.0 from entity @s inventory.0 +item replace entity @a inventory.1 from entity @s inventory.1 +item replace entity @a inventory.2 from entity @s inventory.2 +item replace entity @a inventory.3 from entity @s inventory.3 +item replace entity @a inventory.4 from entity @s inventory.4 +item replace entity @a inventory.5 from entity @s inventory.5 +item replace entity @a inventory.6 from entity @s inventory.6 +item replace entity @a inventory.7 from entity @s inventory.7 +item replace entity @a inventory.8 from entity @s inventory.8 +item replace entity @a inventory.9 from entity @s inventory.9 +item replace entity @a inventory.10 from entity @s inventory.10 +item replace entity @a inventory.11 from entity @s inventory.11 +item replace entity @a inventory.12 from entity @s inventory.12 +item replace entity @a inventory.13 from entity @s inventory.13 +item replace entity @a inventory.14 from entity @s inventory.14 +item replace entity @a inventory.15 from entity @s inventory.15 +item replace entity @a inventory.16 from entity @s inventory.16 +item replace entity @a inventory.17 from entity @s inventory.17 +item replace entity @a inventory.18 from entity @s inventory.18 +item replace entity @a inventory.19 from entity @s inventory.19 +item replace entity @a inventory.20 from entity @s inventory.20 +item replace entity @a inventory.21 from entity @s inventory.21 +item replace entity @a inventory.22 from entity @s inventory.22 +item replace entity @a inventory.23 from entity @s inventory.23 +item replace entity @a inventory.24 from entity @s inventory.24 +item replace entity @a inventory.25 from entity @s inventory.25 ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_58__0.txt b/packages/mecha/tests/snapshots/scripting__parse_58__0.txt index 9a6e11c95..428e86669 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_58__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_58__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'the' is not defined. +#>ERROR Identifier 'the' is not defined. Did you mean 'hex'? # line 1, column 7 # 1 | wat = the = "f" # : ^^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__0.txt b/packages/mecha/tests/snapshots/scripting__parse_96__0.txt index 348d04f71..dfd7fe7ab 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_96__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_96__0.txt @@ -3,8 +3,8 @@ predicate = { entity: "this", scores: { score1: { - min: { - type: "minecraft:score", + "min": { + "type": "minecraft:score", target: "this", score: "score2", scale: 1 @@ -15,16 +15,16 @@ predicate = { --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=230, lineno=15, colno=1) + end_location: SourceLocation(pos=234, lineno=15, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=229, lineno=14, colno=2) + end_location: SourceLocation(pos=233, lineno=14, colno=2) identifier: 'statement' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=229, lineno=14, colno=2) + end_location: SourceLocation(pos=233, lineno=14, colno=2) operator: '=' target: @@ -34,7 +34,7 @@ predicate = { value: location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=229, lineno=14, colno=2) + end_location: SourceLocation(pos=233, lineno=14, colno=2) items: location: SourceLocation(pos=16, lineno=2, colno=3) @@ -64,7 +64,7 @@ predicate = { value: 'this' location: SourceLocation(pos=74, lineno=4, colno=3) - end_location: SourceLocation(pos=227, lineno=13, colno=4) + end_location: SourceLocation(pos=231, lineno=13, colno=4) key: location: SourceLocation(pos=74, lineno=4, colno=3) @@ -73,11 +73,11 @@ predicate = { value: location: SourceLocation(pos=82, lineno=4, colno=11) - end_location: SourceLocation(pos=227, lineno=13, colno=4) + end_location: SourceLocation(pos=231, lineno=13, colno=4) items: location: SourceLocation(pos=88, lineno=5, colno=5) - end_location: SourceLocation(pos=223, lineno=12, colno=6) + end_location: SourceLocation(pos=227, lineno=12, colno=6) key: location: SourceLocation(pos=88, lineno=5, colno=5) @@ -86,70 +86,70 @@ predicate = { value: location: SourceLocation(pos=96, lineno=5, colno=13) - end_location: SourceLocation(pos=223, lineno=12, colno=6) + end_location: SourceLocation(pos=227, lineno=12, colno=6) items: location: SourceLocation(pos=104, lineno=6, colno=7) - end_location: SourceLocation(pos=217, lineno=11, colno=8) + end_location: SourceLocation(pos=221, lineno=11, colno=8) key: location: SourceLocation(pos=104, lineno=6, colno=7) - end_location: SourceLocation(pos=107, lineno=6, colno=10) + end_location: SourceLocation(pos=109, lineno=6, colno=12) value: 'min' value: - location: SourceLocation(pos=109, lineno=6, colno=12) - end_location: SourceLocation(pos=217, lineno=11, colno=8) + location: SourceLocation(pos=111, lineno=6, colno=14) + end_location: SourceLocation(pos=221, lineno=11, colno=8) items: - location: SourceLocation(pos=119, lineno=7, colno=9) - end_location: SourceLocation(pos=142, lineno=7, colno=32) + location: SourceLocation(pos=121, lineno=7, colno=9) + end_location: SourceLocation(pos=146, lineno=7, colno=34) key: - location: SourceLocation(pos=119, lineno=7, colno=9) - end_location: SourceLocation(pos=123, lineno=7, colno=13) + location: SourceLocation(pos=121, lineno=7, colno=9) + end_location: SourceLocation(pos=127, lineno=7, colno=15) value: 'type' value: - location: SourceLocation(pos=125, lineno=7, colno=15) - end_location: SourceLocation(pos=142, lineno=7, colno=32) + location: SourceLocation(pos=129, lineno=7, colno=17) + end_location: SourceLocation(pos=146, lineno=7, colno=34) value: 'minecraft:score' - location: SourceLocation(pos=152, lineno=8, colno=9) - end_location: SourceLocation(pos=166, lineno=8, colno=23) + location: SourceLocation(pos=156, lineno=8, colno=9) + end_location: SourceLocation(pos=170, lineno=8, colno=23) key: - location: SourceLocation(pos=152, lineno=8, colno=9) - end_location: SourceLocation(pos=158, lineno=8, colno=15) + location: SourceLocation(pos=156, lineno=8, colno=9) + end_location: SourceLocation(pos=162, lineno=8, colno=15) value: 'target' value: - location: SourceLocation(pos=160, lineno=8, colno=17) - end_location: SourceLocation(pos=166, lineno=8, colno=23) + location: SourceLocation(pos=164, lineno=8, colno=17) + end_location: SourceLocation(pos=170, lineno=8, colno=23) value: 'this' - location: SourceLocation(pos=176, lineno=9, colno=9) - end_location: SourceLocation(pos=191, lineno=9, colno=24) + location: SourceLocation(pos=180, lineno=9, colno=9) + end_location: SourceLocation(pos=195, lineno=9, colno=24) key: - location: SourceLocation(pos=176, lineno=9, colno=9) - end_location: SourceLocation(pos=181, lineno=9, colno=14) + location: SourceLocation(pos=180, lineno=9, colno=9) + end_location: SourceLocation(pos=185, lineno=9, colno=14) value: 'score' value: - location: SourceLocation(pos=183, lineno=9, colno=16) - end_location: SourceLocation(pos=191, lineno=9, colno=24) + location: SourceLocation(pos=187, lineno=9, colno=16) + end_location: SourceLocation(pos=195, lineno=9, colno=24) value: 'score2' - location: SourceLocation(pos=201, lineno=10, colno=9) - end_location: SourceLocation(pos=209, lineno=10, colno=17) + location: SourceLocation(pos=205, lineno=10, colno=9) + end_location: SourceLocation(pos=213, lineno=10, colno=17) key: - location: SourceLocation(pos=201, lineno=10, colno=9) - end_location: SourceLocation(pos=206, lineno=10, colno=14) + location: SourceLocation(pos=205, lineno=10, colno=9) + end_location: SourceLocation(pos=210, lineno=10, colno=14) value: 'scale' value: - location: SourceLocation(pos=208, lineno=10, colno=16) - end_location: SourceLocation(pos=209, lineno=10, colno=17) + location: SourceLocation(pos=212, lineno=10, colno=16) + end_location: SourceLocation(pos=213, lineno=10, colno=17) value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt index 4c8f01c5f..819c0b011 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt @@ -18,16 +18,16 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=230, lineno=15, colno=1) + end_location: SourceLocation(pos=234, lineno=15, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=229, lineno=14, colno=2) + end_location: SourceLocation(pos=233, lineno=14, colno=2) identifier: 'statement' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=229, lineno=14, colno=2) + end_location: SourceLocation(pos=233, lineno=14, colno=2) operator: '=' target: @@ -37,7 +37,7 @@ _mecha_refs[0] value: location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=229, lineno=14, colno=2) + end_location: SourceLocation(pos=233, lineno=14, colno=2) items: location: SourceLocation(pos=16, lineno=2, colno=3) @@ -67,7 +67,7 @@ _mecha_refs[0] value: 'this' location: SourceLocation(pos=74, lineno=4, colno=3) - end_location: SourceLocation(pos=227, lineno=13, colno=4) + end_location: SourceLocation(pos=231, lineno=13, colno=4) key: location: SourceLocation(pos=74, lineno=4, colno=3) @@ -76,11 +76,11 @@ _mecha_refs[0] value: location: SourceLocation(pos=82, lineno=4, colno=11) - end_location: SourceLocation(pos=227, lineno=13, colno=4) + end_location: SourceLocation(pos=231, lineno=13, colno=4) items: location: SourceLocation(pos=88, lineno=5, colno=5) - end_location: SourceLocation(pos=223, lineno=12, colno=6) + end_location: SourceLocation(pos=227, lineno=12, colno=6) key: location: SourceLocation(pos=88, lineno=5, colno=5) @@ -89,70 +89,70 @@ _mecha_refs[0] value: location: SourceLocation(pos=96, lineno=5, colno=13) - end_location: SourceLocation(pos=223, lineno=12, colno=6) + end_location: SourceLocation(pos=227, lineno=12, colno=6) items: location: SourceLocation(pos=104, lineno=6, colno=7) - end_location: SourceLocation(pos=217, lineno=11, colno=8) + end_location: SourceLocation(pos=221, lineno=11, colno=8) key: location: SourceLocation(pos=104, lineno=6, colno=7) - end_location: SourceLocation(pos=107, lineno=6, colno=10) + end_location: SourceLocation(pos=109, lineno=6, colno=12) value: 'min' value: - location: SourceLocation(pos=109, lineno=6, colno=12) - end_location: SourceLocation(pos=217, lineno=11, colno=8) + location: SourceLocation(pos=111, lineno=6, colno=14) + end_location: SourceLocation(pos=221, lineno=11, colno=8) items: - location: SourceLocation(pos=119, lineno=7, colno=9) - end_location: SourceLocation(pos=142, lineno=7, colno=32) + location: SourceLocation(pos=121, lineno=7, colno=9) + end_location: SourceLocation(pos=146, lineno=7, colno=34) key: - location: SourceLocation(pos=119, lineno=7, colno=9) - end_location: SourceLocation(pos=123, lineno=7, colno=13) + location: SourceLocation(pos=121, lineno=7, colno=9) + end_location: SourceLocation(pos=127, lineno=7, colno=15) value: 'type' value: - location: SourceLocation(pos=125, lineno=7, colno=15) - end_location: SourceLocation(pos=142, lineno=7, colno=32) + location: SourceLocation(pos=129, lineno=7, colno=17) + end_location: SourceLocation(pos=146, lineno=7, colno=34) value: 'minecraft:score' - location: SourceLocation(pos=152, lineno=8, colno=9) - end_location: SourceLocation(pos=166, lineno=8, colno=23) + location: SourceLocation(pos=156, lineno=8, colno=9) + end_location: SourceLocation(pos=170, lineno=8, colno=23) key: - location: SourceLocation(pos=152, lineno=8, colno=9) - end_location: SourceLocation(pos=158, lineno=8, colno=15) + location: SourceLocation(pos=156, lineno=8, colno=9) + end_location: SourceLocation(pos=162, lineno=8, colno=15) value: 'target' value: - location: SourceLocation(pos=160, lineno=8, colno=17) - end_location: SourceLocation(pos=166, lineno=8, colno=23) + location: SourceLocation(pos=164, lineno=8, colno=17) + end_location: SourceLocation(pos=170, lineno=8, colno=23) value: 'this' - location: SourceLocation(pos=176, lineno=9, colno=9) - end_location: SourceLocation(pos=191, lineno=9, colno=24) + location: SourceLocation(pos=180, lineno=9, colno=9) + end_location: SourceLocation(pos=195, lineno=9, colno=24) key: - location: SourceLocation(pos=176, lineno=9, colno=9) - end_location: SourceLocation(pos=181, lineno=9, colno=14) + location: SourceLocation(pos=180, lineno=9, colno=9) + end_location: SourceLocation(pos=185, lineno=9, colno=14) value: 'score' value: - location: SourceLocation(pos=183, lineno=9, colno=16) - end_location: SourceLocation(pos=191, lineno=9, colno=24) + location: SourceLocation(pos=187, lineno=9, colno=16) + end_location: SourceLocation(pos=195, lineno=9, colno=24) value: 'score2' - location: SourceLocation(pos=201, lineno=10, colno=9) - end_location: SourceLocation(pos=209, lineno=10, colno=17) + location: SourceLocation(pos=205, lineno=10, colno=9) + end_location: SourceLocation(pos=213, lineno=10, colno=17) key: - location: SourceLocation(pos=201, lineno=10, colno=9) - end_location: SourceLocation(pos=206, lineno=10, colno=14) + location: SourceLocation(pos=205, lineno=10, colno=9) + end_location: SourceLocation(pos=210, lineno=10, colno=14) value: 'scale' value: - location: SourceLocation(pos=208, lineno=10, colno=16) - end_location: SourceLocation(pos=209, lineno=10, colno=17) + location: SourceLocation(pos=212, lineno=10, colno=16) + end_location: SourceLocation(pos=213, lineno=10, colno=17) value: 1 From ec8dee8ed2147d66846d974cf58b179ab1253f89 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 14:48:26 +0100 Subject: [PATCH 0535/1554] feat: add yield statements --- .../src/data/demo/functions/foo.mcfunction | 14 ++ .../mecha/mecha/contrib/scripting/codegen.py | 15 ++ .../mecha/mecha/contrib/scripting/parse.py | 34 ++++- .../contrib/scripting/resources/commands.json | 21 +++ .../resources/scripting_examples.mcfunction | 13 ++ ...examples__build_basic_scripting__0.pack.md | 4 + .../snapshots/scripting__parse_118__0.txt | 90 ++++++++++++ .../snapshots/scripting__parse_118__1.txt | 132 ++++++++++++++++++ .../snapshots/scripting__parse_119__0.txt | 7 + .../snapshots/scripting__parse_120__0.txt | 28 ++++ .../snapshots/scripting__parse_120__1.txt | 36 +++++ .../snapshots/scripting__parse_48__0.txt | 2 +- 12 files changed, 389 insertions(+), 7 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_118__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_118__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_119__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_120__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_120__1.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 1f00096fd..38f4b54b0 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -96,3 +96,17 @@ def copy_items(type, count) copy_items('hotbar', 9) copy_items('inventory', 26) + +def f() + yield 1 + yield 2 + yield 3 + +for i in f() + say i + +def wow(ok) + yield from ok() + yield from ok() + +say list(wow(f)) diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index 83727e10a..5d7161f5a 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -390,6 +390,21 @@ def return_statement( acc.statement(statement) return [] + @rule(AstCommand, identifier="yield") + @rule(AstCommand, identifier="yield:value") + @rule(AstCommand, identifier="yield:from:value") + def yield_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + statement = "yield from" if node.identifier == "yield:from:value" else "yield" + if node.arguments: + value = yield from visit_single(node.arguments[0], required=True) + statement += f" {value}" + acc.statement(statement) + return [] + @rule(AstCommand, identifier="if:condition:body") def if_statement( self, diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 70f29a536..3a42b156f 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -15,6 +15,7 @@ "parse_function_root", "FunctionRootBacktracker", "ReturnConstraint", + "YieldConstraint", "BinaryParser", "UnaryParser", "PrimaryParser", @@ -240,12 +241,14 @@ def create_scripting_root_parser(parser: Parser): return FunctionRootBacktracker( FlushPendingIdentifiersParser( ReturnConstraint( - BreakContinueConstraint( - parser=IfElseConstraint(parser), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), - }, + YieldConstraint( + BreakContinueConstraint( + parser=IfElseConstraint(parser), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ) ) ) ) @@ -561,6 +564,25 @@ def __call__(self, stream: TokenStream) -> AstRoot: return node +@dataclass +class YieldConstraint: + """Constraint that makes sure that yield statements only occur in functions.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> AstRoot: + node: AstRoot = self.parser(stream) + + if stream.data.get("function"): + return node + for command in node.commands: + if command.identifier in ["yield", "yield:value", "yield:from:value"]: + exc = InvalidSyntax("Can only use 'yield' in functions.") + raise set_location(exc, command) + + return node + + @dataclass class BinaryParser: """Parser for binary expressions.""" diff --git a/packages/mecha/mecha/contrib/scripting/resources/commands.json b/packages/mecha/mecha/contrib/scripting/resources/commands.json index 7b783b460..197652283 100644 --- a/packages/mecha/mecha/contrib/scripting/resources/commands.json +++ b/packages/mecha/mecha/contrib/scripting/resources/commands.json @@ -33,6 +33,27 @@ } } }, + "yield": { + "type": "literal", + "executable": true, + "children": { + "from": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "mecha:scripting:expression", + "executable": true + } + } + }, + "value": { + "type": "argument", + "parser": "mecha:scripting:expression", + "executable": true + } + } + }, "if": { "type": "literal", "children": { diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 8dd4459cb..9e72ec0b9 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -408,3 +408,16 @@ yo = f'thing \e' ### x = 8 if score @s tmp matches (x, None) say wat +### +def f() + yield 1 + yield 2 + yield 3 +for i in f() + say i +### +if True + yield +### +def f() + yield diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 0bb0436a6..c3ba26940 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -80,6 +80,10 @@ item replace entity @a inventory.22 from entity @s inventory.22 item replace entity @a inventory.23 from entity @s inventory.23 item replace entity @a inventory.24 from entity @s inventory.24 item replace entity @a inventory.25 from entity @s inventory.25 +say 1 +say 2 +say 3 +say [1, 2, 3, 1, 2, 3] ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_118__0.txt b/packages/mecha/tests/snapshots/scripting__parse_118__0.txt new file mode 100644 index 000000000..cd94f78ee --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_118__0.txt @@ -0,0 +1,90 @@ +def f() + yield 1 + yield 2 + yield 3 +for i in f() + say i +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=11) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + value: 1 + + location: SourceLocation(pos=24, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=30, lineno=3, colno=11) + end_location: SourceLocation(pos=31, lineno=3, colno=12) + value: 2 + + location: SourceLocation(pos=36, lineno=4, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=42, lineno=4, colno=11) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + value: 3 + + location: SourceLocation(pos=44, lineno=5, colno=1) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=48, lineno=5, colno=5) + end_location: SourceLocation(pos=49, lineno=5, colno=6) + value: 'i' + + location: SourceLocation(pos=53, lineno=5, colno=10) + end_location: SourceLocation(pos=56, lineno=5, colno=13) + value: + + location: SourceLocation(pos=53, lineno=5, colno=10) + end_location: SourceLocation(pos=54, lineno=5, colno=11) + value: 'f' + arguments: + + + location: SourceLocation(pos=61, lineno=6, colno=5) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=61, lineno=6, colno=5) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + value: 'i' diff --git a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt new file mode 100644 index 000000000..4f9a7ea58 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt @@ -0,0 +1,132 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + yield 1 + yield 2 + yield 3 + for i in ( +#5 +( +#5 +f)()): + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([( +#6 +_mecha_helper_interpolate_message(( +#6 +i), _mecha_refs[0]))]))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + value: 'i' +_mecha_refs[1] + + location: SourceLocation(pos=61, lineno=6, colno=5) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + value: 'i' +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=11) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + value: 1 + + location: SourceLocation(pos=24, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=30, lineno=3, colno=11) + end_location: SourceLocation(pos=31, lineno=3, colno=12) + value: 2 + + location: SourceLocation(pos=36, lineno=4, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=42, lineno=4, colno=11) + end_location: SourceLocation(pos=43, lineno=4, colno=12) + value: 3 + + location: SourceLocation(pos=44, lineno=5, colno=1) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=48, lineno=5, colno=5) + end_location: SourceLocation(pos=49, lineno=5, colno=6) + value: 'i' + + location: SourceLocation(pos=53, lineno=5, colno=10) + end_location: SourceLocation(pos=56, lineno=5, colno=13) + value: + + location: SourceLocation(pos=53, lineno=5, colno=10) + end_location: SourceLocation(pos=54, lineno=5, colno=11) + value: 'f' + arguments: + + + location: SourceLocation(pos=61, lineno=6, colno=5) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=61, lineno=6, colno=5) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=65, lineno=6, colno=9) + end_location: SourceLocation(pos=66, lineno=6, colno=10) + value: 'i' diff --git a/packages/mecha/tests/snapshots/scripting__parse_119__0.txt b/packages/mecha/tests/snapshots/scripting__parse_119__0.txt new file mode 100644 index 000000000..eded6970c --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_119__0.txt @@ -0,0 +1,7 @@ +if True +#>ERROR Can only use 'yield' in functions. +# line 2, column 5 +# 1 | if True +# 2 | yield +# : ^^^^^ + yield diff --git a/packages/mecha/tests/snapshots/scripting__parse_120__0.txt b/packages/mecha/tests/snapshots/scripting__parse_120__0.txt new file mode 100644 index 000000000..5dee359b7 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_120__0.txt @@ -0,0 +1,28 @@ +def f() + yield +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'yield' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt new file mode 100644 index 000000000..399ccf04b --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt @@ -0,0 +1,36 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + yield +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'yield' + arguments: + diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 33c729b7a..932c6b820 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 99 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 100 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 From ff7ab43052cc2baf4581131f3c63236bea906acd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 14:49:35 +0100 Subject: [PATCH 0536/1554] feat: expose ctx --- packages/mecha/mecha/contrib/scripting/runtime.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index 52cc01068..11688d3b9 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -94,6 +94,9 @@ def __init__(self, ctx: Union[Context, Mecha]): self.helpers = get_scripting_helpers() self.globals = {name: getattr(builtins, name) for name in SAFE_BUILTINS} + if isinstance(ctx, Context): + self.globals["ctx"] = ctx + mc.cache_backend = ModuleCacheBackend(runtime=self) def get_module( From 306b8b9edb7e7a76bb03acd6517b5065f0c3509f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 14:55:50 +0100 Subject: [PATCH 0537/1554] feat: inject context object --- .../basic_scripting/src/data/demo/functions/foo.mcfunction | 2 ++ packages/mecha/mecha/contrib/scripting/runtime.py | 6 +++--- packages/mecha/mecha/contrib/scripting/utils.py | 6 +++--- .../snapshots/examples__build_basic_scripting__0.pack.md | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 38f4b54b0..354491b05 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -110,3 +110,5 @@ def wow(ok) yield from ok() say list(wow(f)) + +say ctx.generate.id("hello") diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index 11688d3b9..3dab26e41 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -7,7 +7,6 @@ ] -import builtins import marshal from contextlib import contextmanager from dataclasses import dataclass, field @@ -92,7 +91,7 @@ def __init__(self, ctx: Union[Context, Mecha]): self.modules = {} self.commands = [] self.helpers = get_scripting_helpers() - self.globals = {name: getattr(builtins, name) for name in SAFE_BUILTINS} + self.globals = {} if isinstance(ctx, Context): self.globals["ctx"] = ctx @@ -146,6 +145,7 @@ def get_output(self, module: Module) -> AstRoot: if module.output in module.namespace: return module.namespace[module.output] + module.namespace.update(self.globals) module.namespace["_mecha_runtime"] = self module.namespace["_mecha_refs"] = module.refs module.namespace["__name__"] = module.resource_location @@ -252,5 +252,5 @@ class GlobalsInjection: parser: Parser def __call__(self, stream: TokenStream) -> Any: - with stream.provide(identifiers=set(self.runtime.globals)): + with stream.provide(identifiers=set(self.runtime.globals) | SAFE_BUILTINS): return self.parser(stream) diff --git a/packages/mecha/mecha/contrib/scripting/utils.py b/packages/mecha/mecha/contrib/scripting/utils.py index fd33f0df2..5bd4f05c0 100644 --- a/packages/mecha/mecha/contrib/scripting/utils.py +++ b/packages/mecha/mecha/contrib/scripting/utils.py @@ -10,7 +10,7 @@ from dataclasses import dataclass, field from types import CodeType, TracebackType -from typing import Dict, List, Set, Tuple, TypeVar +from typing import Dict, List, Set, TypeVar from mecha.utils import QuoteHelperWithUnicode @@ -25,7 +25,7 @@ def internal(f: T) -> T: return f -SAFE_BUILTINS: Tuple[str, ...] = ( +SAFE_BUILTINS: Set[str] = { "abs", "all", "any", @@ -75,7 +75,7 @@ def internal(f: T) -> T: "tuple", "type", "zip", -) +} @dataclass diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index c3ba26940..4c11356ac 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -84,6 +84,7 @@ say 1 say 2 say 3 say [1, 2, 3, 1, 2, 3] +say basic_scripting.hello ``` `@function demo:foo/nested_execute_0` From 18dc30fc03647359dd16c6efe79edd16d8e58f97 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Dec 2021 18:34:39 +0100 Subject: [PATCH 0538/1554] feat: add import statements --- .../src/data/demo/functions/foo.mcfunction | 14 +++ .../src/data/demo/functions/thing.mcfunction | 3 + .../mecha/mecha/contrib/scripting/codegen.py | 47 +++++++++ .../mecha/mecha/contrib/scripting/parse.py | 79 +++++++++++++-- .../contrib/scripting/resources/commands.json | 44 +++++++++ .../mecha/mecha/contrib/scripting/runtime.py | 36 ++++++- .../resources/scripting_examples.mcfunction | 24 +++++ ...examples__build_basic_scripting__0.pack.md | 10 ++ .../snapshots/scripting__parse_121__0.txt | 5 + .../snapshots/scripting__parse_122__0.txt | 5 + .../snapshots/scripting__parse_123__0.txt | 5 + .../snapshots/scripting__parse_124__0.txt | 5 + .../snapshots/scripting__parse_125__0.txt | 7 ++ .../snapshots/scripting__parse_126__0.txt | 41 ++++++++ .../snapshots/scripting__parse_126__1.txt | 59 +++++++++++ .../snapshots/scripting__parse_127__0.txt | 45 +++++++++ .../snapshots/scripting__parse_127__1.txt | 63 ++++++++++++ .../snapshots/scripting__parse_128__0.txt | 41 ++++++++ .../snapshots/scripting__parse_128__1.txt | 82 +++++++++++++++ .../snapshots/scripting__parse_129__0.txt | 74 ++++++++++++++ .../snapshots/scripting__parse_129__1.txt | 99 +++++++++++++++++++ .../snapshots/scripting__parse_48__0.txt | 2 +- 22 files changed, 781 insertions(+), 9 deletions(-) create mode 100644 packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction create mode 100644 packages/mecha/tests/snapshots/scripting__parse_121__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_122__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_123__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_124__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_125__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_126__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_126__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_127__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_127__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_128__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_128__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_129__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_129__1.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 354491b05..5d21d4c3c 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -112,3 +112,17 @@ def wow(ok) say list(wow(f)) say ctx.generate.id("hello") + +import math +say math.cos(math.pi) + +import math as m +say (math is m) + +from ./thing import do_stuff + +say do_stuff(1, math.pi) + +import ./thing as thing + +say (thing.do_stuff is do_stuff) diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction new file mode 100644 index 000000000..4c1cc294d --- /dev/null +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction @@ -0,0 +1,3 @@ +def do_stuff(a, b) + import math + return a + math.cos(b) diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index 5d7161f5a..b37f2073b 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -30,6 +30,7 @@ from beet.core.utils import normalize_string from mecha import AstChildren, AstCommand, AstNode, AstRoot, Visitor, rule +from mecha.ast import AstLiteral, AstResourceLocation from .ast import ( AstAssignment, @@ -483,6 +484,52 @@ def continue_statement( acc.statement("continue") return [] + @rule(AstCommand, identifier="import:module") + @rule(AstCommand, identifier="import:module:as:alias") + @rule(AstCommand, identifier="from:module:import:subcommand") + def import_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement(acc.lineno(node)) + + module = cast(AstResourceLocation, node.arguments[0]) + + if node.identifier == "from:module:import:subcommand": + names: List[str] = [] + subcommand = cast(AstCommand, node.arguments[1]) + + while True: + if isinstance(name := subcommand.arguments[0], AstLiteral): + names.append(name.value) + if subcommand.identifier == "from:module:import:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + if module.namespace: + acc.statement( + f"{', '.join(names)} = _mecha_runtime.from_module_import({module.get_value()!r}, {', '.join(map(repr, names))})" + ) + else: + acc.statement(f"from {module.path} import {', '.join(names)}") + + elif node.identifier == "import:module:as:alias": + alias = cast(AstLiteral, node.arguments[1]).value + + if module.namespace: + acc.statement( + f"{alias} = _mecha_runtime.import_module({module.get_value()!r}).namespace" + ) + else: + acc.statement(f"import {module.path} as {alias}") + + else: + acc.statement(f"import {module.path}") + + return [] + @rule(AstInterpolation) def interpolation( self, diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 3a42b156f..72bc84c9f 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -13,6 +13,9 @@ "FlushPendingIdentifiersParser", "parse_function_signature", "parse_function_root", + "parse_identifier", + "ImportLocationConstraint", + "ImportStatementHandler", "FunctionRootBacktracker", "ReturnConstraint", "YieldConstraint", @@ -23,9 +26,10 @@ ] +import re from dataclasses import dataclass, field, replace from difflib import get_close_matches -from typing import Any, Dict, Iterable, List, Set, Tuple +from typing import Any, Dict, Iterable, List, Set, Tuple, cast from beet.core.utils import required_field from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location @@ -34,12 +38,12 @@ AlternativeParser, AstChildren, AstCommand, + AstLiteral, + AstResourceLocation, AstRoot, - Parser, - consume_line_continuation, - delegate, - get_stream_scope, ) +from mecha import LiteralParser as BasicLiteralParser +from mecha import Parser, consume_line_continuation, delegate, get_stream_scope from mecha.utils import QuoteHelper, normalize_whitespace, string_to_number from .ast import ( @@ -73,6 +77,8 @@ STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" +IMPORT_REGEX = re.compile(fr"^{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*$") + def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: """Return the scripting parsers.""" @@ -82,11 +88,17 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: ################################################################################ "root": create_scripting_root_parser(parsers["root"]), "nested_root": create_scripting_root_parser(parsers["nested_root"]), - "command": ExecuteIfConditionConstraint(parsers["command"]), + "command": ImportStatementHandler( + ExecuteIfConditionConstraint(parsers["command"]) + ), "command:argument:mecha:scripting:statement": delegate("scripting:statement"), "command:argument:mecha:scripting:assignment_target": delegate( "scripting:assignment_target" ), + "command:argument:mecha:scripting:import": delegate("scripting:import"), + "command:argument:mecha:scripting:import_name": delegate( + "scripting:import_name" + ), "command:argument:mecha:scripting:expression": delegate("scripting:expression"), "command:argument:mecha:scripting:function_signature": delegate( "scripting:function_signature" @@ -106,6 +118,10 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: "scripting:function_root": parse_function_root, "scripting:interpolation": PrimaryParser(delegate("scripting:identifier")), "scripting:identifier": parse_identifier, + "scripting:import": ImportLocationConstraint( + parsers["resource_location_or_tag"] + ), + "scripting:import_name": BasicLiteralParser("name", IDENTIFIER_PATTERN), "scripting:expression": delegate("scripting:disjunction"), "scripting:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -500,6 +516,57 @@ def parse_identifier(stream: TokenStream) -> AstIdentifier: return set_location(AstIdentifier(value=token.value), token) +@dataclass +class ImportLocationConstraint: + """Constraint for import location.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstResourceLocation = self.parser(stream) + + if node.is_tag or node.namespace is None and not IMPORT_REGEX.match(node.path): + exc = InvalidSyntax(f"Invalid module location {node.get_value()!r}.") + raise set_location(exc, node) + + return node + + +@dataclass +class ImportStatementHandler: + """Handle import statements.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier == "import:module": + if isinstance(module := node.arguments[0], AstResourceLocation): + if module.namespace: + exc = InvalidSyntax( + f"Can't import {module.get_value()!r} without alias." + ) + raise set_location(exc, module) + else: + identifiers.add(module.path.partition(".")[0]) + elif node.identifier == "import:module:as:alias": + if isinstance(alias := node.arguments[1], AstLiteral): + identifiers.add(alias.value) + elif node.identifier == "from:module:import:subcommand": + subcommand = cast(AstCommand, node.arguments[1]) + while True: + if isinstance(name := subcommand.arguments[0], AstLiteral): + identifiers.add(name.value) + if subcommand.identifier == "from:module:import:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + return node + + @dataclass class FunctionRootBacktracker: """Parser for backtracking over function root nodes.""" diff --git a/packages/mecha/mecha/contrib/scripting/resources/commands.json b/packages/mecha/mecha/contrib/scripting/resources/commands.json index 197652283..61039fdd1 100644 --- a/packages/mecha/mecha/contrib/scripting/resources/commands.json +++ b/packages/mecha/mecha/contrib/scripting/resources/commands.json @@ -146,6 +146,50 @@ "continue": { "type": "literal", "executable": true + }, + "import": { + "type": "literal", + "children": { + "module": { + "type": "argument", + "parser": "mecha:scripting:import", + "executable": true, + "children": { + "as": { + "type": "literal", + "children": { + "alias": { + "type": "argument", + "parser": "mecha:scripting:import_name", + "executable": true + } + } + } + } + } + } + }, + "from": { + "type": "literal", + "children": { + "module": { + "type": "argument", + "parser": "mecha:scripting:import", + "children": { + "import": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "mecha:scripting:import_name", + "executable": true, + "redirect": ["from", "module", "import"] + } + } + } + } + } + } } } } diff --git a/packages/mecha/mecha/contrib/scripting/runtime.py b/packages/mecha/mecha/contrib/scripting/runtime.py index 3dab26e41..ab63dcd99 100644 --- a/packages/mecha/mecha/contrib/scripting/runtime.py +++ b/packages/mecha/mecha/contrib/scripting/runtime.py @@ -51,6 +51,7 @@ class Module: resource_location: Optional[str] globals: Set[str] namespace: JsonDict = field(default_factory=dict) + executing: bool = False class Runtime: @@ -145,14 +146,22 @@ def get_output(self, module: Module) -> AstRoot: if module.output in module.namespace: return module.namespace[module.output] + if module.executing: + raise ValueError("Import cycle detected.") + module.namespace.update(self.globals) module.namespace["_mecha_runtime"] = self module.namespace["_mecha_refs"] = module.refs module.namespace["__name__"] = module.resource_location module.namespace["__file__"] = module.code.co_filename - with self.error_handler(): - exec(module.code, module.namespace) + module.executing = True + + try: + with self.error_handler(): + exec(module.code, module.namespace) + finally: + module.executing = False return module.namespace[module.output] @@ -181,6 +190,29 @@ def error_handler(self): except Exception as exc: raise rewrite_traceback(exc) from None + def import_module(self, resource_location: str) -> Module: + """Import module.""" + file_instance = self.database.index[resource_location] + compilation_unit = self.database[file_instance] + + if not compilation_unit.ast: + raise ValueError(f"Module {resource_location!r} doesn't have an ast yet.") + + module = self.get_module(compilation_unit.ast, file_instance) + self.get_output(module) + + return module + + def from_module_import(self, resource_location: str, *args: str) -> Any: + """Import a specific name from a module.""" + module = self.import_module(resource_location) + try: + values = [module.namespace[name] for name in args] + except KeyError as exc: + msg = f"Couldn't import {exc} from {resource_location!r}." + raise ImportError(msg) from None + return values[0] if len(values) == 1 else values + @dataclass class ModuleCacheBackend(AstCacheBackend): diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 9e72ec0b9..5f10382d1 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -421,3 +421,27 @@ if True ### def f() yield +### +import demo:foo +### +import ./thing +### +import wat/is/that +### +from wat/is/that import foo +### +import math +mah.sin(1) +### +import math +math.sin(1) +### +import math as m +m.sin(1) +### +from demo:foo import thing +say thing +### +def f() + from demo:foo import a b c +say a diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 4c11356ac..e4d8154e6 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -85,6 +85,16 @@ say 2 say 3 say [1, 2, 3, 1, 2, 3] say basic_scripting.hello +say -1.0 +say True +say 0.0 +say True +``` + +`@function(strip_final_newline) demo:thing` + +```mcfunction + ``` `@function demo:foo/nested_execute_0` diff --git a/packages/mecha/tests/snapshots/scripting__parse_121__0.txt b/packages/mecha/tests/snapshots/scripting__parse_121__0.txt new file mode 100644 index 000000000..078fdc525 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_121__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can't import 'demo:foo' without alias. +# line 1, column 8 +# 1 | import demo:foo +# : ^^^^^^^^ +import demo:foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_122__0.txt b/packages/mecha/tests/snapshots/scripting__parse_122__0.txt new file mode 100644 index 000000000..48755d502 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_122__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can't resolve relative resource location './thing'. +# line 1, column 8 +# 1 | import ./thing +# : ^^^^^^^ +import ./thing diff --git a/packages/mecha/tests/snapshots/scripting__parse_123__0.txt b/packages/mecha/tests/snapshots/scripting__parse_123__0.txt new file mode 100644 index 000000000..0f6473b28 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_123__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid module location 'wat/is/that'. +# line 1, column 8 +# 1 | import wat/is/that +# : ^^^^^^^^^^^ +import wat/is/that diff --git a/packages/mecha/tests/snapshots/scripting__parse_124__0.txt b/packages/mecha/tests/snapshots/scripting__parse_124__0.txt new file mode 100644 index 000000000..846353f25 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_124__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid module location 'wat/is/that'. +# line 1, column 6 +# 1 | from wat/is/that import foo +# : ^^^^^^^^^^^ +from wat/is/that import foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_125__0.txt b/packages/mecha/tests/snapshots/scripting__parse_125__0.txt new file mode 100644 index 000000000..1413d9f1f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_125__0.txt @@ -0,0 +1,7 @@ +import math +#>ERROR Expected assignment but got literal '.sin(1)'. +# line 2, column 4 +# 1 | import math +# 2 | mah.sin(1) +# : ^^^^^^^ +mah.sin(1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_126__0.txt b/packages/mecha/tests/snapshots/scripting__parse_126__0.txt new file mode 100644 index 000000000..fbfc859d1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_126__0.txt @@ -0,0 +1,41 @@ +import math +math.sin(1) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'import:module' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=12) + value: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + name: 'sin' + value: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=5) + value: 'math' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=11) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_126__1.txt b/packages/mecha/tests/snapshots/scripting__parse_126__1.txt new file mode 100644 index 000000000..6f0396bce --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_126__1.txt @@ -0,0 +1,59 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + +#1 + + import math + ( +#2 +( +#2 +_mecha_helper_get_attribute(( +#2 +math), 'sin'))(1)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'import:module' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=12) + value: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + name: 'sin' + value: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=5) + value: 'math' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=11) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_127__0.txt b/packages/mecha/tests/snapshots/scripting__parse_127__0.txt new file mode 100644 index 000000000..1da1c6252 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_127__0.txt @@ -0,0 +1,45 @@ +import math as m +m.sin(1) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'import:module:as:alias' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'm' + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=9) + value: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=6) + name: 'sin' + value: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=2) + value: 'm' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=7) + end_location: SourceLocation(pos=24, lineno=2, colno=8) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt new file mode 100644 index 000000000..8665b739a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt @@ -0,0 +1,63 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + +#1 + + import math as m + ( +#2 +( +#2 +_mecha_helper_get_attribute(( +#2 +m), 'sin'))(1)) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'import:module:as:alias' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'm' + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=9) + value: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=6) + name: 'sin' + value: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=2) + value: 'm' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=7) + end_location: SourceLocation(pos=24, lineno=2, colno=8) + value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_128__0.txt b/packages/mecha/tests/snapshots/scripting__parse_128__0.txt new file mode 100644 index 000000000..d49ddbbe1 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_128__0.txt @@ -0,0 +1,41 @@ +from demo:foo import thing +say thing +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + is_tag: False + namespace: 'demo' + path: 'foo' + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 'thing' + + location: SourceLocation(pos=27, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt new file mode 100644 index 000000000..8c7af4f21 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt @@ -0,0 +1,82 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + +#1 + + thing = _mecha_runtime.from_module_import('demo:foo', 'thing') + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([( +#2 +_mecha_helper_interpolate_message(( +#2 +thing), _mecha_refs[0]))]))) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'thing' +_mecha_refs[1] + + location: SourceLocation(pos=27, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'thing' +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + is_tag: False + namespace: 'demo' + path: 'foo' + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 'thing' + + location: SourceLocation(pos=27, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + converter: 'message' + value: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__0.txt b/packages/mecha/tests/snapshots/scripting__parse_129__0.txt new file mode 100644 index 000000000..2a78021af --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_129__0.txt @@ -0,0 +1,74 @@ +def f() + from demo:foo import a b c +say a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=10) + end_location: SourceLocation(pos=25, lineno=2, colno=18) + is_tag: False + namespace: 'demo' + path: 'foo' + + location: SourceLocation(pos=33, lineno=2, colno=26) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:name:subcommand' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=26) + end_location: SourceLocation(pos=34, lineno=2, colno=27) + value: 'a' + + location: SourceLocation(pos=35, lineno=2, colno=28) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:name:subcommand' + arguments: + + location: SourceLocation(pos=35, lineno=2, colno=28) + end_location: SourceLocation(pos=36, lineno=2, colno=29) + value: 'b' + + location: SourceLocation(pos=37, lineno=2, colno=30) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=37, lineno=2, colno=30) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + value: 'c' + + location: SourceLocation(pos=39, lineno=3, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + fragments: + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt new file mode 100644 index 000000000..74f8fbcb7 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt @@ -0,0 +1,99 @@ +_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + +#2 + + a, b, c = _mecha_runtime.from_module_import('demo:foo', 'a', 'b', 'c') + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=39, lineno=3, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + fragments: + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + value: 'a' +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + commands: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=10) + end_location: SourceLocation(pos=25, lineno=2, colno=18) + is_tag: False + namespace: 'demo' + path: 'foo' + + location: SourceLocation(pos=33, lineno=2, colno=26) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:name:subcommand' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=26) + end_location: SourceLocation(pos=34, lineno=2, colno=27) + value: 'a' + + location: SourceLocation(pos=35, lineno=2, colno=28) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:name:subcommand' + arguments: + + location: SourceLocation(pos=35, lineno=2, colno=28) + end_location: SourceLocation(pos=36, lineno=2, colno=29) + value: 'b' + + location: SourceLocation(pos=37, lineno=2, colno=30) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=37, lineno=2, colno=30) + end_location: SourceLocation(pos=38, lineno=2, colno=31) + value: 'c' + + location: SourceLocation(pos=39, lineno=3, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + fragments: + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=6) + value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 932c6b820..ff926c25c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 100 other tokens but got literal '*'. +#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 102 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 From e12b6f4c2552770ded229533d146fdd3f0d03b23 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 5 Dec 2021 17:37:12 +0000 Subject: [PATCH 0539/1554] 0.20.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 11 +++++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 3425696b8..6dd45b4ff 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,17 @@ +## v0.20.0 (2021-12-05) +### Feature +* Add import statements ([`970bd01`](https://github.com/mcbeet/mecha/commit/970bd017d8104ea2c54ebc85c2d2c58ffe735e9f)) +* Inject context object ([`98e6727`](https://github.com/mcbeet/mecha/commit/98e672712819d37f34856a1fa5701157dc0cfbbe)) +* Expose ctx ([`e1714f0`](https://github.com/mcbeet/mecha/commit/e1714f0bdb1fc473e3fecfe28818294bf4692501)) +* Add yield statements ([`410e60a`](https://github.com/mcbeet/mecha/commit/410e60a35266ed5e66ca52a3c4aaa30064d26627)) +* Add globals ([`7d934a2`](https://github.com/mcbeet/mecha/commit/7d934a20f82cad8b97f8126a03cee0a5e086227e)) +* Tweak constraints and make it possible to convert tuples to ranges ([`f130359`](https://github.com/mcbeet/mecha/commit/f130359b5b3768b7dc9d59a46a24d9e808a30497)) +* Add f-strings ([`88b12d2`](https://github.com/mcbeet/mecha/commit/88b12d2cf64296d8cb228d3817d9db8d93f727e2)) +* Add tuples ([`80534e5`](https://github.com/mcbeet/mecha/commit/80534e5af70d2459aef4215b46912ecf5316e716)) + ## v0.19.0 (2021-12-05) ### Feature * Track line numbers and rewrite tracebacks coming from generated code ([`8582212`](https://github.com/mcbeet/mecha/commit/8582212361aed3fa0c6f6dc575cf9d18725478d1)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index cdb30f0d6..44a096f15 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.19.0" +__version__ = "0.20.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 78a7d8dfc..0d0674d22 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.19.0" +version = "0.20.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 22d0313ab8aa5ff9004d1fb07cf4c6bae5b649dc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 6 Dec 2021 07:52:26 +0100 Subject: [PATCH 0540/1554] fix: make line mapping more compact --- .../mecha/mecha/contrib/scripting/codegen.py | 19 ++++++++----- .../mecha/mecha/contrib/scripting/utils.py | 6 ++-- .../tests/snapshots/scripting__parse_0__1.txt | 5 ++-- .../snapshots/scripting__parse_101__1.txt | 5 ++-- .../snapshots/scripting__parse_102__1.txt | 7 ++--- .../snapshots/scripting__parse_103__1.txt | 7 ++--- .../snapshots/scripting__parse_104__1.txt | 10 ++----- .../snapshots/scripting__parse_105__1.txt | 6 ++-- .../snapshots/scripting__parse_106__1.txt | 7 ++--- .../snapshots/scripting__parse_107__1.txt | 7 ++--- .../snapshots/scripting__parse_108__1.txt | 7 ++--- .../snapshots/scripting__parse_109__1.txt | 7 ++--- .../snapshots/scripting__parse_10__1.txt | 8 ++---- .../snapshots/scripting__parse_110__1.txt | 6 ++-- .../snapshots/scripting__parse_111__1.txt | 8 ++---- .../snapshots/scripting__parse_112__1.txt | 6 ++-- .../snapshots/scripting__parse_113__1.txt | 6 ++-- .../snapshots/scripting__parse_114__1.txt | 6 ++-- .../snapshots/scripting__parse_117__1.txt | 8 ++---- .../snapshots/scripting__parse_118__1.txt | 9 ++---- .../snapshots/scripting__parse_11__1.txt | 8 ++---- .../snapshots/scripting__parse_120__1.txt | 5 ++-- .../snapshots/scripting__parse_126__1.txt | 9 ++---- .../snapshots/scripting__parse_127__1.txt | 9 ++---- .../snapshots/scripting__parse_128__1.txt | 8 ++---- .../snapshots/scripting__parse_129__1.txt | 6 ++-- .../snapshots/scripting__parse_12__1.txt | 11 ++------ .../snapshots/scripting__parse_13__1.txt | 8 ++---- .../snapshots/scripting__parse_14__1.txt | 8 ++---- .../snapshots/scripting__parse_15__1.txt | 7 ++--- .../snapshots/scripting__parse_16__1.txt | 20 ++----------- .../snapshots/scripting__parse_17__1.txt | 28 ++----------------- .../tests/snapshots/scripting__parse_1__1.txt | 5 ++-- .../snapshots/scripting__parse_20__1.txt | 7 ++--- .../snapshots/scripting__parse_21__1.txt | 5 ++-- .../snapshots/scripting__parse_22__1.txt | 5 ++-- .../snapshots/scripting__parse_23__1.txt | 5 ++-- .../snapshots/scripting__parse_24__1.txt | 5 ++-- .../snapshots/scripting__parse_25__1.txt | 5 ++-- .../snapshots/scripting__parse_26__1.txt | 5 ++-- .../snapshots/scripting__parse_29__1.txt | 5 ++-- .../tests/snapshots/scripting__parse_2__1.txt | 5 ++-- .../snapshots/scripting__parse_32__1.txt | 6 ++-- .../snapshots/scripting__parse_33__1.txt | 7 ++--- .../snapshots/scripting__parse_34__1.txt | 7 ++--- .../snapshots/scripting__parse_35__1.txt | 6 ++-- .../tests/snapshots/scripting__parse_3__1.txt | 5 ++-- .../snapshots/scripting__parse_41__1.txt | 5 ++-- .../snapshots/scripting__parse_42__1.txt | 7 ++--- .../snapshots/scripting__parse_43__1.txt | 6 ++-- .../snapshots/scripting__parse_44__1.txt | 5 ++-- .../snapshots/scripting__parse_45__1.txt | 5 ++-- .../snapshots/scripting__parse_46__1.txt | 9 ++---- .../snapshots/scripting__parse_47__1.txt | 6 ++-- .../snapshots/scripting__parse_49__1.txt | 7 ++--- .../tests/snapshots/scripting__parse_4__1.txt | 5 ++-- .../snapshots/scripting__parse_50__1.txt | 7 ++--- .../snapshots/scripting__parse_51__1.txt | 5 ++-- .../snapshots/scripting__parse_53__1.txt | 6 ++-- .../snapshots/scripting__parse_55__1.txt | 6 ++-- .../snapshots/scripting__parse_57__1.txt | 5 ++-- .../tests/snapshots/scripting__parse_5__1.txt | 6 ++-- .../snapshots/scripting__parse_62__1.txt | 5 ++-- .../snapshots/scripting__parse_63__1.txt | 5 ++-- .../snapshots/scripting__parse_64__1.txt | 7 ++--- .../snapshots/scripting__parse_65__1.txt | 6 ++-- .../snapshots/scripting__parse_66__1.txt | 7 ++--- .../snapshots/scripting__parse_67__1.txt | 8 ++---- .../snapshots/scripting__parse_68__1.txt | 13 ++------- .../snapshots/scripting__parse_69__1.txt | 6 ++-- .../tests/snapshots/scripting__parse_6__1.txt | 6 ++-- .../snapshots/scripting__parse_70__1.txt | 7 ++--- .../snapshots/scripting__parse_71__1.txt | 9 ++---- .../snapshots/scripting__parse_72__1.txt | 9 ++---- .../snapshots/scripting__parse_77__1.txt | 7 ++--- .../tests/snapshots/scripting__parse_7__1.txt | 7 ++--- .../snapshots/scripting__parse_81__1.txt | 10 ++----- .../snapshots/scripting__parse_82__1.txt | 11 ++------ .../snapshots/scripting__parse_84__1.txt | 5 ++-- .../snapshots/scripting__parse_87__1.txt | 6 ++-- .../snapshots/scripting__parse_89__1.txt | 9 ++---- .../tests/snapshots/scripting__parse_8__1.txt | 7 ++--- .../snapshots/scripting__parse_91__1.txt | 6 ++-- .../snapshots/scripting__parse_92__1.txt | 7 ++--- .../snapshots/scripting__parse_93__1.txt | 7 ++--- .../snapshots/scripting__parse_94__1.txt | 10 ++----- .../snapshots/scripting__parse_95__1.txt | 9 ++---- .../snapshots/scripting__parse_96__1.txt | 9 ++---- .../snapshots/scripting__parse_97__1.txt | 13 ++------- .../tests/snapshots/scripting__parse_9__1.txt | 7 ++--- 90 files changed, 192 insertions(+), 476 deletions(-) diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index b37f2073b..3b5d41c14 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -68,17 +68,22 @@ def get_source(self) -> str: for expression, variable in self.header.items() ) - source = header + "".join(self.lines) + lines: List[str] = ["_mecha_lineno = "] + numbers1: List[int] = [1] + numbers2: List[int] = [1] - current_line = 1 - line_numbers: List[int] = [1] - - for line in source.splitlines(): + for line in (header + "".join(self.lines)).splitlines(): if line.startswith("#"): current_line = int(line[1:]) - line_numbers.append(current_line) + if numbers2[-1] != current_line: + numbers1.append(len(lines)) + numbers2.append(current_line) + else: + lines.append(line) + + lines[0] += f"{numbers1}, {numbers2}" - return f"_mecha_lineno = {line_numbers!r}\n{source}" + return "\n".join(lines) def helper(self, name: str, *args: Any) -> str: """Emit helper.""" diff --git a/packages/mecha/mecha/contrib/scripting/utils.py b/packages/mecha/mecha/contrib/scripting/utils.py index 5bd4f05c0..d22e793f8 100644 --- a/packages/mecha/mecha/contrib/scripting/utils.py +++ b/packages/mecha/mecha/contrib/scripting/utils.py @@ -8,6 +8,7 @@ ] +from bisect import bisect from dataclasses import dataclass, field from types import CodeType, TracebackType from typing import Dict, List, Set, TypeVar @@ -105,8 +106,9 @@ def rewrite_traceback(exc: Exception) -> Exception: line_numbers = tb.tb_frame.f_globals.get("_mecha_lineno") - if line_numbers and tb.tb_lineno < len(line_numbers): - lineno = line_numbers[tb.tb_lineno] + if line_numbers: + n1, n2 = line_numbers + lineno = n2[bisect(n1, tb.tb_lineno) - 1] stack.append(fake_traceback(exc, tb, lineno)) else: stack.append(tb) diff --git a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt index 50d84ed55..824ad16e7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 0 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt index 2937873c8..1ede98196 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def wat(): _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt index 77dd847bc..e3661d8c8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt @@ -1,16 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 7], [1, 2] _mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: a = '' _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], ( -#2 _mecha_helper_interpolate_json(( -#2 a), _mecha_refs[0]))]))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt index 8f3248b37..442922616 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt @@ -1,16 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4] +_mecha_lineno = [1, 7], [1, 4] _mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] _mecha_helper_children = _mecha_runtime.helpers['children'] with _mecha_runtime.scope() as _mecha_var0: foo = '[{"text": "Hello", "bold": true}]' _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=( -#4 _mecha_helper_interpolate_nbt(( -#4 foo), _mecha_refs[0]))), _mecha_refs[2]])))])))]))]))]))]))]))]))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_104__1.txt b/packages/mecha/tests/snapshots/scripting__parse_104__1.txt index 0fa41fb1d..d3a31f58c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_104__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_104__1.txt @@ -1,20 +1,14 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: thing = ( -#1 ( -#1 ( -#1 (1,'hey',)) + ( -#1 ())) + ( -#1 ('wow',))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_105__1.txt b/packages/mecha/tests/snapshots/scripting__parse_105__1.txt index e01e9117b..c22c58150 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_105__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_105__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 'hello'.format()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_106__1.txt b/packages/mecha/tests/snapshots/scripting__parse_106__1.txt index bf6dd308f..e94cad974 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_106__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_106__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'world' ( -#2 'hello {}'.format(( -#2 foo))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_107__1.txt b/packages/mecha/tests/snapshots/scripting__parse_107__1.txt index 72d650fa6..a79b9d8ea 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_107__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_107__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'world' ( -#2 'hello {!r}'.format(( -#2 foo))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_108__1.txt b/packages/mecha/tests/snapshots/scripting__parse_108__1.txt index 816b749f9..81ffbd7e4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_108__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_108__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 'hello {}'.format(( -#1 1 + 1))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_109__1.txt b/packages/mecha/tests/snapshots/scripting__parse_109__1.txt index f3295465b..bdaea1357 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_109__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_109__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 'hello {:03}'.format(( -#1 1 + 1))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt index fd70dcd06..9819a5afb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt @@ -1,16 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 2 + ( -#1 ( -#1 - 54) * 10)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_110__1.txt b/packages/mecha/tests/snapshots/scripting__parse_110__1.txt index 5106f2031..a12404137 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_110__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_110__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 '{{}}nope{}'.format(1)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_111__1.txt b/packages/mecha/tests/snapshots/scripting__parse_111__1.txt index 7675bc23e..a0eb6ba59 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_111__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_111__1.txt @@ -1,16 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: yo = ( -#1 '{{{}}}'.format(( -#1 '{{{}}}'.format(( -#1 '{{{:08}}}'.format(7)))))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_112__1.txt b/packages/mecha/tests/snapshots/scripting__parse_112__1.txt index 07d0a7b12..8679c1917 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_112__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_112__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: yo = ( -#1 ''.format()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_113__1.txt b/packages/mecha/tests/snapshots/scripting__parse_113__1.txt index bf4c21f0c..2ab1cb0d4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_113__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_113__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: yo = ( -#1 '"'.format()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_114__1.txt b/packages/mecha/tests/snapshots/scripting__parse_114__1.txt index 1f8be8e48..bc1bb7057 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_114__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_114__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: yo = ( -#1 '\\'.format()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt index c5219b9a6..0b433f603 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt @@ -1,18 +1,14 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 7], [1, 2] _mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: x = 8 _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_refs[2], ( -#2 _mecha_helper_interpolate_range(( -#2 (( -#2 x),None,)), _mecha_refs[0])), _mecha_refs[3]]))]))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt index 4f9a7ea58..f3f234b91 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt @@ -1,4 +1,4 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6] +_mecha_lineno = [1, 10, 13], [1, 5, 6] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] @@ -8,17 +8,12 @@ with _mecha_runtime.scope() as _mecha_var0: yield 2 yield 3 for i in ( -#5 ( -#5 f)()): _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([( -#6 _mecha_helper_interpolate_message(( -#6 i), _mecha_refs[0]))]))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt index 7d731ce69..8258b8c68 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt @@ -1,16 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 2 + ( -#1 - 54)) * 10) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt index 399ccf04b..d01c95d71 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(): yield -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_126__1.txt b/packages/mecha/tests/snapshots/scripting__parse_126__1.txt index 6f0396bce..416173321 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_126__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_126__1.txt @@ -1,21 +1,16 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 9], [1, 2] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: -#1 import math ( -#2 ( -#2 _mecha_helper_get_attribute(( -#2 math), 'sin'))(1)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt index 8665b739a..2e3eeb621 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt @@ -1,21 +1,16 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 9], [1, 2] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: -#1 import math as m ( -#2 ( -#2 _mecha_helper_get_attribute(( -#2 m), 'sin'))(1)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt index 8c7af4f21..8114cf6a0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt @@ -1,19 +1,15 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 9], [1, 2] _mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: -#1 thing = _mecha_runtime.from_module_import('demo:foo', 'thing') _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([( -#2 _mecha_helper_interpolate_message(( -#2 thing), _mecha_refs[0]))]))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt index 74f8fbcb7..b4bc56a7a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt @@ -1,15 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(): -#2 a, b, c = _mecha_runtime.from_module_import('demo:foo', 'a', 'b', 'c') _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt index 792b94206..2cda732e6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt @@ -1,22 +1,15 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 - ( -#1 - ( -#1 - 64))) + ( -#1 + ( -#1 + 64))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt index 7da480916..5d6496692 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt @@ -1,16 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 ( -#1 1 * 2) / 3) * 4) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt index 84646042c..b9d95c15a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt @@ -1,16 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 1 * 2) / ( -#1 3 * 4)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt index 109a1b3c4..f3b8d946f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 16 // 5) % 7) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt index fcaac9fdb..f14238a89 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt @@ -1,40 +1,24 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 - ( -#1 2 ** 3)) + ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ~ 4) * 5) // 6) / 7) % 9)) + 10) - 11) << 12) >> 13) & 14) ^ 15) | 16) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt index 2c059e075..2745c193a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt @@ -1,56 +1,32 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 ( -#1 False or ( -#1 True and 'hello')) or ( -#1 not ( -#1 'foo' == 'bar'))) or ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 1 != 2) and ( -#1 1 < 2)) and ( -#1 2 <= 3)) and ( -#1 5 > 4)) and ( -#1 6 >= 5)) and ( -#1 1 in 1)) and ( -#1 2 not in 2)) and ( -#1 3 is 3)) and ( -#1 3 is not 3))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt index dd5d3042d..fff705c63 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 123 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt index b6dfd779d..fd3531626 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 True and ( -#1 False or True)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt index 0c771248c..b2a112803 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 'this' -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt index 48b913a39..2f991a09a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 'this\nthat' -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt index 1552b613f..ce706f7e3 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: '"█this\nthat' -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt index e5b300d05..e3c948748 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: '' -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt index 8998687f8..489a1ce44 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: '"\'"' -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt index 155e4be80..bcca85714 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: "something \t\x0c\n\\'here" -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt index 00aa261cc..f5ed1e247 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: None -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt index 3c7a9234d..e565c5bf0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 123.456 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt index 259cf46a6..69432b483 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt @@ -1,13 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 ( -#2 foo) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt index 0808007d8..fd4b4ed46 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 ( -#2 'hello' + ( -#2 foo)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt index e2b1c3623..c72d582df 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt @@ -1,16 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: a = 1 if ( -#2 ( -#2 a) == 1): a = 0 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt index e70ae2d06..9ef742fd8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -1,17 +1,15 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3] +_mecha_lineno = [1, 7], [1, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: if True: _mecha_runtime.commands.extend(_mecha_refs[0].commands) elif ( -#3 True or False): _mecha_runtime.commands.extend(_mecha_refs[1].commands) else: _mecha_runtime.commands.extend(_mecha_refs[2].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt index dc91c0e74..a542e3e62 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 22220.0996667 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt index 791f1811e..5fe96b586 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: while True: _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt index fadcfee4c..e23b1cf22 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt @@ -1,19 +1,16 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4] +_mecha_lineno = [1, 6, 9], [1, 2, 4] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: if ( -#2 'thing' == 'bar'): _mecha_runtime.commands.extend(_mecha_refs[0].commands) if ( -#4 'thing' == 'foo'): _mecha_runtime.commands.extend(_mecha_refs[1].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1)) ---- +_mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt index b29e6daac..46e2945bb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt @@ -1,15 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: if ( -#2 'thing' == 'foo'): _mecha_runtime.commands.extend(_mecha_refs[0].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) ---- +_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt index 3668e5d77..3bb7589af 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt @@ -1,4 +1,4 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: @@ -8,8 +8,7 @@ with _mecha_runtime.scope() as _mecha_var1: while True: _mecha_runtime.commands.extend(_mecha_refs[1].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1)) ---- +_mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt index 50801c7ab..4cef23a97 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt @@ -1,4 +1,4 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: @@ -6,8 +6,7 @@ with _mecha_runtime.scope() as _mecha_var1: while True: _mecha_runtime.commands.extend(_mecha_refs[0].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) ---- +_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt index 523ec900b..1792e220f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt @@ -1,23 +1,18 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5] +_mecha_lineno = [1, 7, 11], [1, 3, 5] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: count = 42 while ( -#3 ( -#3 count) > 0): _mecha_runtime.commands.append(_mecha_refs[0]) count = ( -#5 ( -#5 count) - 1) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1)) ---- +_mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt index 96af8b407..48f78cdb5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 2, 2, 2] +_mecha_lineno = [1, 5], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = ( -#2 'abc' + 'def') -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt index 58beef004..a9e6ccb25 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 True | False) | None) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt index 0de1a8139..a00d3e5fc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt @@ -1,10 +1,9 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: 670000.0 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt index 2f6e87709..b636062fb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 ( -#2 ( -#2 foo) == 1) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt index d4cccffc9..8368efe91 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: for c in 'abc': _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt index 0c6712a8e..50bc16f72 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt @@ -1,13 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 1 foo = ( -#2 foo) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt index 1333b92af..c96e2886b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt @@ -1,13 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: for foo in 'foo': foo = ( -#2 foo) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt index d836b4043..757eced4c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = '' foo += 'hey' -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt index 06a5120b5..dde7191ec 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 1 + 2) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt index 990391824..6484078c1 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt @@ -1,12 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: for i in '': _mecha_runtime.commands.append(_mecha_refs[0]) continue -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt index 57089c285..1fceea782 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: while False: break -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt index 0b98a4973..c56ebbd3b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt @@ -1,16 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: for i in 'abc': if ( -#2 ( -#2 i) == 'b'): break -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt index 38778c9c4..e1c313f78 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt @@ -1,13 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 _mecha_helper_get_attribute('foo', 'bar')) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt index 68f61165a..2085ec0e6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 _mecha_helper_get_attribute(( -#1 _mecha_helper_get_attribute('foo', 'bar')), 'baz')) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt index 52a4f3fca..636962b50 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt @@ -1,17 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 ( -#1 _mecha_helper_get_attribute('foo', 'bar'))())[0]) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt index 44ddf143c..f2a32f680 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt @@ -1,27 +1,18 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 ( -#1 _mecha_helper_get_attribute('foo', 'bar'))())[0])['hello'])[99])['with space'])(( -#1 'thing' * 7))) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt index 795641dd0..e465cc9b9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 'foo'(1, 2, 3)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt index ff64f322e..10c8467e6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 1 - 2) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt index a3f86c699..df16f8a22 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt @@ -1,16 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3] +_mecha_lineno = [1, 7], [1, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): _mecha_runtime.commands.extend(_mecha_refs[0].commands) ( -#3 ( -#3 foo)()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt index 1f40535cf..829616f07 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt @@ -1,21 +1,16 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4] +_mecha_lineno = [1, 7, 10], [1, 3, 4] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): def bar(): ( -#3 ( -#3 foo)()) ( -#4 ( -#4 bar)()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt index 41c4fe1fb..0c39ccbc8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt @@ -1,4 +1,4 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4] +_mecha_lineno = [1, 10, 13], [1, 3, 4] _mecha_helper_missing = _mecha_runtime.helpers['missing'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] @@ -8,19 +8,14 @@ with _mecha_runtime.scope() as _mecha_var0: a = 1 if b is _mecha_helper_missing: b = ( -#3 a) if c is _mecha_helper_missing: c = ( -#4 ( -#4 a) + ( -#4 b)) _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt index 5bf769469..1ac557cdd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt @@ -1,4 +1,4 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2] +_mecha_lineno = [1, 10], [1, 2] _mecha_helper_missing = _mecha_runtime.helpers['missing'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] @@ -6,14 +6,11 @@ with _mecha_runtime.scope() as _mecha_var0: def f(a, b=_mecha_helper_missing): if b is _mecha_helper_missing: b = ( -#1 a) b += ( -#2 a) _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt index 91c34efce..c36c5d96f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 ( -#1 1 - 2) + 3) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt index 92ad8fb10..aa4316f5f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt @@ -1,4 +1,4 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14] +_mecha_lineno = [1, 9, 11, 15], [1, 10, 11, 14] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: @@ -7,21 +7,15 @@ with _mecha_runtime.scope() as _mecha_var0: _mecha_runtime.commands.append(_mecha_refs[0]) x = 'hello' for i in ( -#10 something): x += ( -#11 ( -#11 i) * 3) _mecha_runtime.commands.append(_mecha_refs[1]) ( -#14 ( -#14 wat)()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt index fffd66b90..8e6f1c54d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt @@ -1,26 +1,19 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5] +_mecha_lineno = [1, 6, 10, 13], [1, 2, 4, 5] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): thing += ( -#2 ( -#2 bar)()) def bar(): thing += ( -#4 ( -#4 foo)()) thing = ( -#5 ( -#5 bar)()) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt index 733d23a50..6a75a4db3 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt @@ -1,11 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def foo(): return -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt index 038421f21..5babc72c5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt @@ -1,15 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3] +_mecha_lineno = [1, 7], [1, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(): def g(): return ( -#3 foo) foo = 0 -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt index b48b01227..5a9167361 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt @@ -1,21 +1,16 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3] +_mecha_lineno = [1, 7, 10], [1, 2, 3] _mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(x): _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], ( -#2 _mecha_helper_interpolate_json(( -#2 x), _mecha_refs[0]))]))) ( -#3 ( -#3 f)('thing')) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt index 3850484e2..a8f8295ca 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 1 - ( -#1 2 + 3)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt index 98885bc0b..0784fe34e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt @@ -1,12 +1,10 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 {'foo': 'bar'}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt index a30f86acc..a0f45d72d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3] +_mecha_lineno = [1, 6, 7], [1, 2, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'hello' ( -#2 {( -#3 foo): 'bar'}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt index f4a44d786..c68ad43db 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt @@ -1,15 +1,12 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3] +_mecha_lineno = [1, 6, 7], [1, 2, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'hello' ( -#2 {'foo': ( -#3 foo)}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt index 27a571e09..840027125 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt @@ -1,21 +1,15 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4] +_mecha_lineno = [1, 6, 7, 9], [1, 2, 3, 4] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: foo = 'hello' ( -#2 {( -#3 ( -#3 foo) * 3): 42, ( -#4 16 + 3): ( -#4 [])}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt index 45ce95392..fab0ee8ca 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt @@ -1,18 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 4, 4, 5, 5, 6, 6, 6] +_mecha_lineno = [1, 6, 7, 8], [1, 4, 5, 6] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: predicate = ( -#1 {'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': ( -#4 {'score1': ( -#5 {'min': ( -#6 {'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1})})})}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt index 819c0b011..df02efc6f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt @@ -1,18 +1,13 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 4, 4, 5, 5, 6, 6, 6] +_mecha_lineno = [1, 6, 7, 8], [1, 4, 5, 6] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: predicate = ( -#1 {'condition': 'minecraft:entity_scores', 'entity': 'this', 'scores': ( -#4 {'score1': ( -#5 {'min': ( -#6 {'type': 'minecraft:score', 'target': 'this', 'score': 'score2', 'scale': 1})})})}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt index a2edf8568..4dd35dc79 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt @@ -1,27 +1,18 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +_mecha_lineno = [1, 6], [1, 2] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: def f(): return ( -#2 {( -#2 ( -#2 f)()): ( -#2 ( -#2 f)()), 'other': ( -#2 [( -#2 {}), ( -#2 {}), 'wat'])}) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt index db5b5a55f..44384fc20 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt @@ -1,14 +1,11 @@ -_mecha_lineno = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +_mecha_lineno = [1], [1] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: ( -#1 2 + ( -#1 - 54)) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- _mecha_refs[0] From e4f36e23938ba2ae0e160917f70e8e222ccd154c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Dec 2021 06:55:27 +0000 Subject: [PATCH 0541/1554] 0.20.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 6dd45b4ff..c2c768d6d 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.20.1 (2021-12-06) +### Fix +* Make line mapping more compact ([`4044ce4`](https://github.com/mcbeet/mecha/commit/4044ce4355946f334c14e7b891aa4faf3a77bea1)) + ## v0.20.0 (2021-12-05) ### Feature * Add import statements ([`970bd01`](https://github.com/mcbeet/mecha/commit/970bd017d8104ea2c54ebc85c2d2c58ffe735e9f)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 44a096f15..71a985300 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.20.0" +__version__ = "0.20.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0d0674d22..9900bc367 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.20.0" +version = "0.20.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3599a9a963390196338a95f537397dc503af7480 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 12:22:45 +0000 Subject: [PATCH 0542/1554] chore(deps-dev): bump black from 21.11b1 to 21.12b0 Bumps [black](https://github.com/psf/black) from 21.11b1 to 21.12b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 60 +++-------------------------------- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 57 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 6708c5d57..7d40edea6 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -56,7 +56,7 @@ image = ["pillow"] [[package]] name = "black" -version = "21.11b1" +version = "21.12b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -67,7 +67,6 @@ click = ">=7.1.2" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0,<1" platformdirs = ">=2" -regex = ">=2021.4.4" tomli = ">=0.2.6,<2.0.0" typing-extensions = [ {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, @@ -597,14 +596,6 @@ six = "*" [package.extras] md = ["cmarkgfm (>=0.5.0,<0.6.0)"] -[[package]] -name = "regex" -version = "2021.4.4" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "requests" version = "2.25.1" @@ -808,7 +799,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d8fd159c4ad7be1add35eb49f368a3b71884e002d7759761f6787e604437503e" +content-hash = "858d28c421bbdc9da8f049dae663de9f13a388d8a1007c7f8c355b140e80c91c" [metadata.files] atomicwrites = [ @@ -828,8 +819,8 @@ beet = [ {file = "beet-0.48.0.tar.gz", hash = "sha256:75cbae315f9c7e3c642281a6c061feed2f0af63a174b9c4a22b1727eb9f55b28"}, ] black = [ - {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, - {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, + {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, + {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -1202,49 +1193,6 @@ readme-renderer = [ {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] -regex = [ - {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, - {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, - {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, - {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, - {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, - {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, - {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, - {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, - {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, - {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, - {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, - {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, - {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, -] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9900bc367..2599e61b2 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.48.0" tokenstream = "^1.3.0" [tool.poetry.dev-dependencies] -black = "^21.11b1" +black = "^21.12b0" pytest = "^6.2.5" isort = "^5.10.1" python-semantic-release = "^7.23.0" From dfae9ab553d1b3eb7aecb574381a4e86bc912ee4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 12:20:59 +0000 Subject: [PATCH 0543/1554] chore(deps-dev): bump pyright from 1.1.192 to 1.1.193 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.192 to 1.1.193. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.193/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index e21cd7cdd..70ad98ad8 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.192" + "pyright": "^1.1.193" } }, "node_modules/pyright": { - "version": "1.1.192", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.192.tgz", - "integrity": "sha512-yOGHGwYUze4Rz2t/F/I6E/6aj915jrOXCl7XFtslEF4vlCbBWPi61kkTcpsPckXZT9EQt3U4DeHvovtWrUYD/g==", + "version": "1.1.193", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.193.tgz", + "integrity": "sha512-01hkfhK1PYKPSWbJrYgNwwlsVH+Thp1xmkKZjxVZrGFqavkJbhETlg1RcAHMnmU8Sg7G4Ry99dW6IsSGyCdzXg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.192", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.192.tgz", - "integrity": "sha512-yOGHGwYUze4Rz2t/F/I6E/6aj915jrOXCl7XFtslEF4vlCbBWPi61kkTcpsPckXZT9EQt3U4DeHvovtWrUYD/g==", + "version": "1.1.193", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.193.tgz", + "integrity": "sha512-01hkfhK1PYKPSWbJrYgNwwlsVH+Thp1xmkKZjxVZrGFqavkJbhETlg1RcAHMnmU8Sg7G4Ry99dW6IsSGyCdzXg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index feb25a0dc..8774c9e3e 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.192" + "pyright": "^1.1.193" } } From 7cf55fbc4e41eafae4c93049350a39d150ad2e9b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 6 Dec 2021 16:57:02 +0100 Subject: [PATCH 0544/1554] fix: small optimization and update tokenstream to get sorted explanations --- packages/mecha/mecha/parse.py | 7 +- .../resources/scripting_examples.mcfunction | 8 + packages/mecha/poetry.lock | 8 +- packages/mecha/pyproject.toml | 2 +- ...rgument_examples_brigadier_bool_1_0__0.txt | 2 +- ...rgument_examples_brigadier_bool_1_1__0.txt | 2 +- ...mples_minecraft_block_predicate_1_1__0.txt | 2 +- ...mples_minecraft_block_predicate_1_2__0.txt | 2 +- ..._examples_minecraft_block_state_1_2__0.txt | 2 +- ..._examples_minecraft_block_state_1_3__0.txt | 2 +- ...nt_examples_minecraft_component_1_0__0.txt | 2 +- ...nt_examples_minecraft_component_1_1__0.txt | 2 +- ...ment_examples_minecraft_nbt_tag_1_0__0.txt | 2 +- ...ment_examples_minecraft_nbt_tag_1_2__0.txt | 2 +- ...ent_examples_minecraft_particle_1_2__0.txt | 2 +- ...examples_minecraft_score_holder_2_3__0.txt | 2 +- .../snapshots/scripting__parse_130__0.txt | 115 ++++ .../snapshots/scripting__parse_130__1.txt | 595 ++++++++++++++++++ .../snapshots/scripting__parse_131__0.txt | 5 + .../snapshots/scripting__parse_18__0.txt | 2 +- .../snapshots/scripting__parse_19__0.txt | 2 +- .../snapshots/scripting__parse_28__0.txt | 2 +- .../snapshots/scripting__parse_38__0.txt | 2 +- .../snapshots/scripting__parse_39__0.txt | 2 +- .../snapshots/scripting__parse_48__0.txt | 2 +- .../snapshots/scripting__parse_99__0.txt | 2 +- 26 files changed, 753 insertions(+), 25 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_130__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_130__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_131__0.txt diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 7fdae408e..a88f60218 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -582,7 +582,12 @@ def parse_command(stream: TokenStream) -> AstCommand: commit() if commit.rollback and tree.children: - for (name, child), alternative in stream.choose(*tree.children.items()): + for (name, child), alternative in stream.choose( + *sorted( + tree.children.items(), + key=lambda p: p[1].type != "argument", + ) + ): with alternative, stream.provide( scope=scope + (name,), line_indentation=level, diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 5f10382d1..b06da8f74 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -445,3 +445,11 @@ say thing def f() from demo:foo import a b c say a +### +if score @s tmp matches 1.. if entity @p[tag=foo] + if True + say 42 + else + say no +### +setblock = 0 diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 7d40edea6..2ba3240ea 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -685,7 +685,7 @@ python-versions = ">=3.5" [[package]] name = "tokenstream" -version = "1.3.0" +version = "1.3.1" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -799,7 +799,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "858d28c421bbdc9da8f049dae663de9f13a388d8a1007c7f8c355b140e80c91c" +content-hash = "182de919bf2f14bafc3b730a0fb03b4a5a3607e8127ca7f35082d319510e14cc" [metadata.files] atomicwrites = [ @@ -1226,8 +1226,8 @@ smmap = [ {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, ] tokenstream = [ - {file = "tokenstream-1.3.0-py3-none-any.whl", hash = "sha256:a9e55ab04f1115b3951cab24422ca2d43a488790d5a493d88232b7e33c6efbda"}, - {file = "tokenstream-1.3.0.tar.gz", hash = "sha256:9b4174b6429e7ae356515d937be1ddd1457f4fad314af783d32cef71bdf4ca41"}, + {file = "tokenstream-1.3.1-py3-none-any.whl", hash = "sha256:bfdf6a6f68a32789bc9bc934ca9ca889ee90904be62c6ab84b79d2a87b6942ac"}, + {file = "tokenstream-1.3.1.tar.gz", hash = "sha256:761b1a42d33aa945f3d39b5bc5f84454407032f856ad5bf54349c080148d6b15"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2599e61b2..078122e55 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.48.0" -tokenstream = "^1.3.0" +tokenstream = "^1.3.1" [tool.poetry.dev-dependencies] black = "^21.12b0" diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt index 9a2367a6a..bb791f2b7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_0__0.txt @@ -6,4 +6,4 @@ blob --- Reported 1 error. -line 1, column 1: Expected literal 'true' or literal 'false' but got literal 'blob'. \ No newline at end of file +line 1, column 1: Expected literal 'false' or literal 'true' but got literal 'blob'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt index 2f73a60f8..1f25fb0d6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_bool_1_1__0.txt @@ -6,4 +6,4 @@ thing --- Reported 1 error. -line 1, column 1: Expected literal 'true' or literal 'false' but got literal 'thing'. \ No newline at end of file +line 1, column 1: Expected literal 'false' or literal 'true' but got literal 'thing'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt index 2261c3703..a43fd997d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:block_predicate 1 1 --- Reported 1 error. -line 1, column 16: Expected word or quoted_string but reached end of file. \ No newline at end of file +line 1, column 16: Expected quoted_string or word but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt index f8066a579..4e6d280f0 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_2__0.txt @@ -6,4 +6,4 @@ minecraft:block_predicate 1 2 --- Reported 1 error. -line 1, column 8: Expected word or quoted_string but reached end of file. \ No newline at end of file +line 1, column 8: Expected quoted_string or word but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt index 46c9ebb89..ea21ec4e5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_2__0.txt @@ -6,4 +6,4 @@ stone[foo=bar, --- Reported 1 error. -line 1, column 15: Expected word or quoted_string but reached end of file. \ No newline at end of file +line 1, column 15: Expected quoted_string or word but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt index b0570ea5e..cdb1d43d7 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_3__0.txt @@ -6,4 +6,4 @@ stone[ --- Reported 1 error. -line 1, column 7: Expected word or quoted_string but reached end of file. \ No newline at end of file +line 1, column 7: Expected quoted_string or word but reached end of file. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt index 96cac8e58..656eec621 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt @@ -6,4 +6,4 @@ wat --- Reported 1 error. -line 1, column 1: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got literal 'wat'. \ No newline at end of file +line 1, column 1: Expected bracket '[', curly '{', literal 'false', literal 'null', literal 'true', number or string but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt index a62cd90c8..83ac916d4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:component 1 1 --- Reported 1 error. -line 1, column 9: Expected curly '{', bracket '[', string, number, literal 'null', literal 'true' or literal 'false' but got bracket ']'. \ No newline at end of file +line 1, column 9: Expected bracket '[', curly '{', literal 'false', literal 'null', literal 'true', number or string but got bracket ']'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt index 3b251b78e..35ffdb57c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_0__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 0 --- Reported 1 error. -line 1, column 1: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\"'. \ No newline at end of file +line 1, column 1: Expected array, bracket '[', curly '{', number, quoted_string or string but got literal '"\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt index 0ed6ce4a9..abceb8d9e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_2__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 2 --- Reported 1 error. -line 1, column 1: Expected curly '{', bracket '[', array, number, string or quoted_string but got literal '"\\\\\\"'. \ No newline at end of file +line 1, column 1: Expected array, bracket '[', curly '{', number, quoted_string or string but got literal '"\\\\\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt index f0f7d4bb9..0f1ce6ac6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_2__0.txt @@ -6,4 +6,4 @@ block minecraft:grass_block[snowy=] --- Reported 1 error. -line 1, column 35: Expected word or quoted_string but got bracket ']'. \ No newline at end of file +line 1, column 35: Expected quoted_string or word but got bracket ']'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt index dc9417883..27c0f6434 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_3__0.txt @@ -6,4 +6,4 @@ minecraft:score_holder 2 3 --- Reported 1 error. -line 1, column 5: Expected word or quoted_string but got equal '='. \ No newline at end of file +line 1, column 5: Expected quoted_string or word but got equal '='. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__0.txt b/packages/mecha/tests/snapshots/scripting__parse_130__0.txt new file mode 100644 index 000000000..96dd7ea19 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_130__0.txt @@ -0,0 +1,115 @@ +if score @s tmp matches 1.. if entity @p[tag=foo] + if True + say 42 + else + say no +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + root: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt new file mode 100644 index 000000000..177cf445d --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt @@ -0,0 +1,595 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + with _mecha_runtime.scope() as _mecha_var0: + if True: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + else: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[11], commands=_mecha_helper_children(_mecha_var1))--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' +_mecha_refs[1] + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' +_mecha_refs[2] + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' +_mecha_refs[3] + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + root: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' +_mecha_refs[4] + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' +_mecha_refs[5] + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + root: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' +_mecha_refs[6] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[7] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[8] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None +_mecha_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + root: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' +_mecha_refs[10] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + root: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' +_mecha_refs[11] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + root: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=54, lineno=2, colno=5) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=8) + end_location: SourceLocation(pos=61, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=70, lineno=3, colno=9) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=74, lineno=3, colno=13) + end_location: SourceLocation(pos=76, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=81, lineno=4, colno=5) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=94, lineno=5, colno=9) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=98, lineno=5, colno=13) + end_location: SourceLocation(pos=100, lineno=5, colno=15) + value: 'no' diff --git a/packages/mecha/tests/snapshots/scripting__parse_131__0.txt b/packages/mecha/tests/snapshots/scripting__parse_131__0.txt new file mode 100644 index 000000000..4b0cfd700 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_131__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected coordinate but got literal '='. +# line 1, column 10 +# 1 | setblock = 0 +# : ^ +setblock = 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_18__0.txt b/packages/mecha/tests/snapshots/scripting__parse_18__0.txt index 836723a41..361818698 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_18__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_18__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected newline or eof but got literal '§§§'. +#>ERROR Expected eof or newline but got literal '§§§'. # line 1, column 4 # 1 | 64 §§§ # : ^^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt index c495bb56c..58251e9a7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_19__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected identifier, curly '{', bracket '[', true, false, null, string or number but got literal '%3'. +#>ERROR Expected bracket '[', curly '{', false, identifier, null, number, string or true but got literal '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_28__0.txt b/packages/mecha/tests/snapshots/scripting__parse_28__0.txt index afbff79c1..dddee99be 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_28__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_28__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected newline or eof but got literal '"hey"'. +#>ERROR Expected eof or newline but got literal '"hey"'. # line 1, column 7 # 1 | "hey" "hey" # : ^^^^^ diff --git a/packages/mecha/tests/snapshots/scripting__parse_38__0.txt b/packages/mecha/tests/snapshots/scripting__parse_38__0.txt index 36b3119df..6ee60a116 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_38__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_38__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected literal 'block', literal 'score', literal 'blocks', literal 'entity', literal 'predicate' or literal 'data' but got newline '\n'. +#>ERROR Expected identifier but reached end of file. # line 1, column 3 # 1 | if if diff --git a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt index b131e0e86..495afedb6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_39__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_39__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected identifier, curly '{', bracket '[', true, false, null, string or number but got newline '\n'. +#>ERROR Expected bracket '[', curly '{', false, identifier, null, number, string or true but got newline '\n'. # line 1, column 12 # 1 | if True and if True and diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index ff926c25c..688d53d30 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected literal 'advancement', literal 'attribute', literal 'execute', literal 'bossbar', literal 'clear', literal 'clone' or 102 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'advancement', literal 'align' or 100 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt index ebc80394e..cca4aba02 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected literal 'run', literal 'if', literal 'unless', literal 'as', literal 'at', literal 'store' or 81 other tokens but got literal 'for'. +#>ERROR Expected literal 'advancement', literal 'align', literal 'anchored', literal 'as', literal 'at', literal 'attribute' or 81 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo" # : ^^^ From b46cf62853f4394e54a9426692f94177d6e370ea Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Dec 2021 15:58:22 +0000 Subject: [PATCH 0545/1554] 0.20.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index c2c768d6d..89326b841 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.20.2 (2021-12-06) +### Fix +* Small optimization and update tokenstream to get sorted explanations ([`510da71`](https://github.com/mcbeet/mecha/commit/510da716aec9b393733bcb13e186e2c93da23317)) + ## v0.20.1 (2021-12-06) ### Fix * Make line mapping more compact ([`4044ce4`](https://github.com/mcbeet/mecha/commit/4044ce4355946f334c14e7b891aa4faf3a77bea1)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 71a985300..5df139fe9 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.20.1" +__version__ = "0.20.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 078122e55..f3758e894 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.20.1" +version = "0.20.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 692fd2e614fba5dd63d8ae126f9a9d2ad98223da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Dec 2021 12:01:22 +0100 Subject: [PATCH 0546/1554] fix: use specialized nodes for literals --- .../mecha/examples/custom_command/demo.py | 4 +- packages/mecha/mecha/ast.py | 250 +++++++++++++++++- packages/mecha/mecha/contrib/messages.py | 13 +- packages/mecha/mecha/contrib/scripting/ast.py | 8 + .../mecha/mecha/contrib/scripting/codegen.py | 16 +- .../mecha/mecha/contrib/scripting/helpers.py | 89 +++---- .../mecha/mecha/contrib/scripting/parse.py | 45 ++-- packages/mecha/mecha/parse.py | 235 +++++++--------- ...ument_examples_brigadier_string_0_0__0.txt | 2 +- ...ument_examples_brigadier_string_0_1__0.txt | 2 +- ...ument_examples_brigadier_string_2_0__0.txt | 2 +- ...ument_examples_brigadier_string_2_1__0.txt | 2 +- ...ument_examples_brigadier_string_2_2__0.txt | 2 +- ...gument_examples_minecraft_color_0_0__0.txt | 2 +- ...gument_examples_minecraft_color_0_1__0.txt | 2 +- ...gument_examples_minecraft_color_1_0__0.txt | 2 +- ...ument_examples_minecraft_entity_0_0__0.txt | 2 +- ...ment_examples_minecraft_entity_0_10__0.txt | 4 +- ...ument_examples_minecraft_entity_0_1__0.txt | 2 +- ...ument_examples_minecraft_entity_0_6__0.txt | 2 +- ...ument_examples_minecraft_entity_2_2__0.txt | 2 +- ...ument_examples_minecraft_entity_5_0__0.txt | 2 +- ...ument_examples_minecraft_entity_5_1__0.txt | 2 +- ...ument_examples_minecraft_entity_5_2__0.txt | 2 +- ...xamples_minecraft_entity_anchor_0_0__0.txt | 2 +- ...xamples_minecraft_entity_anchor_0_1__0.txt | 2 +- ...examples_minecraft_game_profile_0_0__0.txt | 2 +- ...examples_minecraft_game_profile_0_1__0.txt | 2 +- ...ples_minecraft_item_enchantment_0_0__0.txt | 2 +- ...ples_minecraft_item_enchantment_0_1__0.txt | 2 +- ...nt_examples_minecraft_item_slot_0_0__0.txt | 2 +- ...nt_examples_minecraft_item_slot_0_1__0.txt | 2 +- ...nt_examples_minecraft_item_slot_0_2__0.txt | 2 +- ...ment_examples_minecraft_message_0_0__0.txt | 2 +- ...ment_examples_minecraft_message_0_1__0.txt | 2 +- ...ment_examples_minecraft_message_0_3__0.txt | 4 +- ...ment_examples_minecraft_message_0_4__0.txt | 6 +- ...nt_examples_minecraft_objective_0_0__0.txt | 2 +- ...nt_examples_minecraft_objective_0_1__0.txt | 2 +- ...nt_examples_minecraft_objective_0_2__0.txt | 2 +- ...es_minecraft_objective_criteria_0_0__0.txt | 2 +- ...es_minecraft_objective_criteria_0_1__0.txt | 2 +- ...es_minecraft_objective_criteria_0_2__0.txt | 2 +- ...es_minecraft_objective_criteria_0_3__0.txt | 2 +- ...es_minecraft_objective_criteria_0_4__0.txt | 2 +- ...es_minecraft_objective_criteria_0_5__0.txt | 2 +- ...es_minecraft_objective_criteria_0_6__0.txt | 2 +- ...es_minecraft_objective_criteria_0_7__0.txt | 2 +- ...nt_examples_minecraft_operation_0_0__0.txt | 2 +- ...nt_examples_minecraft_operation_0_1__0.txt | 2 +- ...nt_examples_minecraft_operation_0_2__0.txt | 2 +- ...nt_examples_minecraft_operation_1_0__0.txt | 2 +- ...examples_minecraft_score_holder_0_0__0.txt | 2 +- ...examples_minecraft_score_holder_0_1__0.txt | 2 +- ...examples_minecraft_score_holder_0_2__0.txt | 2 +- ...examples_minecraft_score_holder_0_4__0.txt | 2 +- ...examples_minecraft_score_holder_0_6__0.txt | 2 +- ...examples_minecraft_score_holder_0_7__0.txt | 4 +- ...examples_minecraft_score_holder_0_8__0.txt | 4 +- ...examples_minecraft_score_holder_0_9__0.txt | 4 +- ...examples_minecraft_score_holder_1_2__0.txt | 4 +- ...examples_minecraft_score_holder_2_1__0.txt | 2 +- ...examples_minecraft_score_holder_2_4__0.txt | 2 +- ...mples_minecraft_scoreboard_slot_0_0__0.txt | 2 +- ...mples_minecraft_scoreboard_slot_0_1__0.txt | 2 +- ...ment_examples_minecraft_swizzle_0_0__0.txt | 2 +- ...ment_examples_minecraft_swizzle_0_1__0.txt | 2 +- ...ment_examples_minecraft_swizzle_1_0__0.txt | 2 +- ...ment_examples_minecraft_swizzle_1_1__0.txt | 2 +- ...ment_examples_minecraft_swizzle_1_2__0.txt | 2 +- ...ment_examples_minecraft_swizzle_1_3__0.txt | 2 +- ...rgument_examples_minecraft_team_0_0__0.txt | 2 +- ...rgument_examples_minecraft_team_0_1__0.txt | 2 +- .../snapshots/parse__command_examples__0.txt | 74 +++--- .../parse__multiline_command_examples__0.txt | 58 ++-- .../snapshots/scripting__parse_100__0.txt | 2 +- .../snapshots/scripting__parse_101__0.txt | 2 +- .../snapshots/scripting__parse_101__1.txt | 4 +- .../snapshots/scripting__parse_102__0.txt | 2 +- .../snapshots/scripting__parse_102__1.txt | 2 +- .../snapshots/scripting__parse_117__0.txt | 4 +- .../snapshots/scripting__parse_117__1.txt | 16 +- .../snapshots/scripting__parse_127__0.txt | 2 +- .../snapshots/scripting__parse_127__1.txt | 2 +- .../snapshots/scripting__parse_128__0.txt | 2 +- .../snapshots/scripting__parse_128__1.txt | 2 +- .../snapshots/scripting__parse_129__0.txt | 8 +- .../snapshots/scripting__parse_129__1.txt | 10 +- .../snapshots/scripting__parse_130__0.txt | 8 +- .../snapshots/scripting__parse_130__1.txt | 46 ++-- .../snapshots/scripting__parse_35__0.txt | 6 +- .../snapshots/scripting__parse_35__1.txt | 12 +- .../snapshots/scripting__parse_41__0.txt | 2 +- .../snapshots/scripting__parse_41__1.txt | 4 +- .../snapshots/scripting__parse_42__0.txt | 6 +- .../snapshots/scripting__parse_42__1.txt | 32 +-- .../snapshots/scripting__parse_43__0.txt | 4 +- .../snapshots/scripting__parse_43__1.txt | 20 +- .../snapshots/scripting__parse_44__0.txt | 6 +- .../snapshots/scripting__parse_44__1.txt | 32 +-- .../snapshots/scripting__parse_45__0.txt | 4 +- .../snapshots/scripting__parse_45__1.txt | 20 +- .../snapshots/scripting__parse_46__0.txt | 4 +- .../snapshots/scripting__parse_46__1.txt | 20 +- .../snapshots/scripting__parse_51__0.txt | 2 +- .../snapshots/scripting__parse_51__1.txt | 4 +- .../snapshots/scripting__parse_62__0.txt | 2 +- .../snapshots/scripting__parse_62__1.txt | 4 +- .../snapshots/scripting__parse_70__0.txt | 2 +- .../snapshots/scripting__parse_70__1.txt | 4 +- .../snapshots/scripting__parse_72__0.txt | 2 +- .../snapshots/scripting__parse_72__1.txt | 4 +- .../snapshots/scripting__parse_77__0.txt | 2 +- .../snapshots/scripting__parse_77__1.txt | 4 +- .../snapshots/scripting__parse_81__0.txt | 16 +- .../snapshots/scripting__parse_81__1.txt | 32 +-- packages/mecha/tests/test_compile.py | 4 +- packages/mecha/tests/test_dispatch.py | 4 +- 118 files changed, 751 insertions(+), 557 deletions(-) diff --git a/packages/mecha/examples/custom_command/demo.py b/packages/mecha/examples/custom_command/demo.py index d70847726..0e5eb981a 100644 --- a/packages/mecha/examples/custom_command/demo.py +++ b/packages/mecha/examples/custom_command/demo.py @@ -6,8 +6,8 @@ from mecha import ( AstChildren, AstCommand, - AstLiteral, AstMessage, + AstMessageText, AstSelector, Mecha, MutatingReducer, @@ -49,7 +49,7 @@ def greet_command(self, node: AstCommand) -> AstCommand: AstMessage( fragments=AstChildren( [ - AstLiteral(value="Hello "), + AstMessageText(value="Hello "), cast(AstSelector, node.arguments[0]), ] ) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 082334edc..04316e1f8 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -3,12 +3,28 @@ "AstChildren", "AstRoot", "AstCommand", - "AstLiteral", "AstString", "AstBool", "AstNumber", "AstUUID", "AstCoordinate", + "AstLiteral", + "AstOption", + "AstWord", + "AstGreedy", + "AstObjective", + "AstObjectiveCriteria", + "AstScoreboardOperation", + "AstTeam", + "AstPlayerName", + "AstSwizzle", + "AstAdvancementPredicate", + "AstWildcard", + "AstColor", + "AstColorReset", + "AstSortOrder", + "AstGamemode", + "AstEntityAnchor", "AstVector2", "AstVector3", "AstJson", @@ -38,6 +54,7 @@ "AstSelectorAdvancementMatch", "AstSelectorArgument", "AstSelector", + "AstMessageText", "AstMessage", "AstNbtPathSubscript", "AstNbtPath", @@ -52,7 +69,9 @@ ] +import re from dataclasses import dataclass, fields +from itertools import permutations from typing import ( Any, ClassVar, @@ -62,8 +81,10 @@ Optional, Sequence, Tuple, + Type, TypeVar, Union, + cast, ) from uuid import UUID @@ -79,6 +100,7 @@ T = TypeVar("T") AstNodeType = TypeVar("AstNodeType", bound="AstNode") +AstLiteralType = TypeVar("AstLiteralType", bound="AstLiteral") @dataclass(frozen=True) @@ -159,15 +181,6 @@ class AstCommand(AstNode): parser = "command" -@dataclass(frozen=True) -class AstLiteral(AstNode): - """Ast literal node.""" - - value: str = required_field() - - parser = "literal" - - @dataclass(frozen=True) class AstString(AstNode): """Ast string node.""" @@ -176,6 +189,11 @@ class AstString(AstNode): parser = "phrase" + @classmethod + def from_value(cls, value: Any) -> "AstString": + """Return a string node from the given value.""" + return AstString(value=str(value)) + @dataclass(frozen=True) class AstBool(AstNode): @@ -185,6 +203,11 @@ class AstBool(AstNode): parser = "bool" + @classmethod + def from_value(cls, value: Any) -> "AstBool": + """Return a bool node from the given value.""" + return AstBool(value=bool(value)) + @dataclass(frozen=True) class AstNumber(AstNode): @@ -194,6 +217,15 @@ class AstNumber(AstNode): parser = "numeric" + @classmethod + def from_value(cls, value: Any) -> "AstNumber": + """Return a number node from the given value.""" + if isinstance(value, str): + value = string_to_number(value) + if isinstance(value, (int, float)): + return AstNumber(value=value) + raise ValueError("Invalid number {value!r}.") + @dataclass(frozen=True) class AstUUID(AstNode): @@ -231,6 +263,182 @@ class AstVector3(AstNode): z: AstCoordinate = required_field() +@dataclass(frozen=True) +class AstLiteral(AstNode): + """Base ast node for literals.""" + + value: str = required_field() + + regex: ClassVar["re.Pattern[str]"] = re.compile(r"[^#:\s]+") + + @classmethod + def from_value(cls: Type[AstLiteralType], value: Any) -> AstLiteralType: + """Return a literal node from a given value.""" + value = str(value) + match = cls.regex.match(value) + if match and match[0] == value: + return cls(value=value) + raise ValueError(f"Invalid {cls.parser or 'literal'} {value!r}.") + + +@dataclass(frozen=True) +class AstWord(AstLiteral): + """Ast word node.""" + + parser = "word" + regex = re.compile(r"[0-9A-Za-z_\.\+\-]+") + + +@dataclass(frozen=True) +class AstOption(AstLiteral): + """Base node for options.""" + + options: ClassVar[Tuple[str, ...]] = () + + def __init_subclass__(cls): + patterns = [ + fr"{pattern}\b" if pattern[-1].isalnum() else pattern + for option in cls.options + if (pattern := re.escape(option)) + ] + cls.regex = re.compile("|".join(patterns)) + + +@dataclass(frozen=True) +class AstGreedy(AstLiteral): + """Ast greedy node.""" + + parser = "greedy" + regex = re.compile(r".+") + + +@dataclass(frozen=True) +class AstObjective(AstLiteral): + """Ast objective node.""" + + parser = "objective" + regex = re.compile(r"[a-zA-Z0-9_.+-]+") + + +@dataclass(frozen=True) +class AstObjectiveCriteria(AstLiteral): + """Ast objective criteria node.""" + + parser = "objective_criteria" + regex = re.compile(r"[a-zA-Z0-9_.+-]+(?::[a-zA-Z0-9_.+-]+)?") + + +@dataclass(frozen=True) +class AstScoreboardOperation(AstOption): + """Ast scoreboard operation node.""" + + parser = "scoreboard_operation" + options = "+=", "-=", "*=", "/=", "%=", "=", "><", "<", ">" + + +@dataclass(frozen=True) +class AstTeam(AstLiteral): + """Ast team node.""" + + parser = "team" + regex = re.compile(r"[a-zA-Z0-9_.+-]+") + + +@dataclass(frozen=True) +class AstPlayerName(AstLiteral): + """Ast player name node.""" + + parser = "player_name" + regex = re.compile(r"[^:*\s]+") + + +@dataclass(frozen=True) +class AstSwizzle(AstOption): + """Ast swizzle node.""" + + parser = "swizzle" + options = ( + tuple("xyz") + + tuple(map("".join, permutations("xyz", 2))) + + tuple(map("".join, permutations("xyz", 3))) + ) + + +@dataclass(frozen=True) +class AstAdvancementPredicate(AstLiteral): + """Ast advancement predicate node.""" + + parser = "advancement_predicate" + regex = re.compile(r"[0-9A-Za-z_\.\+\-]+") + + +@dataclass(frozen=True) +class AstWildcard(AstLiteral): + """Ast wildcard node.""" + + value: str = "*" + + parser = "wildcard" + regex = re.compile(r"\*") + + +@dataclass(frozen=True) +class AstColor(AstOption): + """Ast color node.""" + + parser = "color" + options = ( + "black", + "dark_blue", + "dark_green", + "dark_aqua", + "dark_red", + "dark_purple", + "gold", + "gray", + "dark_gray", + "blue", + "green", + "aqua", + "red", + "light_purple", + "yellow", + "white", + ) + + +@dataclass(frozen=True) +class AstColorReset(AstOption): + """Ast color reset node.""" + + parser = "color_reset" + options = ("reset",) + + +@dataclass(frozen=True) +class AstSortOrder(AstOption): + """Ast sort order node.""" + + parser = "sort_order" + options = "nearest", "furthest", "random", "arbitrary" + + +@dataclass(frozen=True) +class AstGamemode(AstOption): + """Ast gamemode node.""" + + parser = "gamemode" + options = "adventure", "creative", "spectator", "survival" + + +@dataclass(frozen=True) +class AstEntityAnchor(AstOption): + """Ast entity anchor node.""" + + parser = "entity_anchor" + options = "eyes", "feet" + + @dataclass(frozen=True) class AstJson(AstNode): """Base ast node for json.""" @@ -582,7 +790,7 @@ def from_value(cls, value: Union[str, int, float]) -> "AstTime": class AstSelectorScoreMatch(AstNode): """Ast selector score match node.""" - key: AstLiteral = required_field() + key: AstObjective = required_field() value: AstRange = required_field() @@ -597,7 +805,7 @@ class AstSelectorScores(AstNode): class AstSelectorAdvancementPredicateMatch(AstNode): """Ast selector advancement predicate match node.""" - key: AstLiteral = required_field() + key: AstAdvancementPredicate = required_field() value: AstBool = required_field() @@ -637,11 +845,27 @@ class AstSelector(AstNode): parser = "selector" +@dataclass(frozen=True) +class AstMessageText(AstLiteral): + """Ast message text node.""" + + value: str = required_field() + regex = re.compile(r".+") + + @dataclass(frozen=True) class AstMessage(AstNode): """Ast message node.""" - fragments: AstChildren[Union[AstLiteral, AstSelector]] = required_field() + fragments: AstChildren[Union[AstMessageText, AstSelector]] = required_field() + + @classmethod + def from_value(cls, obj: Any) -> "AstMessage": + """Return message node from a given value.""" + fragments = AstChildren([AstMessageText.from_value(obj)]) + return AstMessage( + fragments=cast(AstChildren[Union[AstMessageText, AstSelector]], fragments) + ) @dataclass(frozen=True) diff --git a/packages/mecha/mecha/contrib/messages.py b/packages/mecha/mecha/contrib/messages.py index 82e6919f1..8c618f35d 100644 --- a/packages/mecha/mecha/contrib/messages.py +++ b/packages/mecha/mecha/contrib/messages.py @@ -3,6 +3,7 @@ __all__ = [ "AstMessageReference", + "AstMessageReferencePath", "MessageReferenceParser", "MessageReferenceTransformer", "MessageReferenceSerializer", @@ -19,7 +20,6 @@ from mecha import ( AstJson, - AstLiteral, AstNode, AstResourceLocation, Diagnostic, @@ -32,12 +32,19 @@ ) +@dataclass(frozen=True) +class AstMessageReferencePath(AstNode): + """Ast message reference path node.""" + + value: str = required_field() + + @dataclass(frozen=True) class AstMessageReference(AstNode): """Ast message reference node.""" name: AstResourceLocation = required_field() - path: Optional[AstLiteral] = None + path: Optional[AstMessageReferencePath] = None def beet_default(ctx: Context): @@ -67,7 +74,7 @@ def __call__(self, stream: TokenStream) -> Any: path = stream.get("path") if path is not None: - path = set_location(AstLiteral(value=path.value), path) + path = set_location(AstMessageReferencePath(value=path.value), path) node = AstMessageReference(name=name, path=path) return set_location(node, token, path or name) diff --git a/packages/mecha/mecha/contrib/scripting/ast.py b/packages/mecha/mecha/contrib/scripting/ast.py index 96be6eb76..b9a80dc80 100644 --- a/packages/mecha/mecha/contrib/scripting/ast.py +++ b/packages/mecha/mecha/contrib/scripting/ast.py @@ -19,6 +19,7 @@ "AstFunctionSignatureArgument", "AstFunctionRoot", "AstInterpolation", + "AstImportedIdentifier", ] @@ -180,3 +181,10 @@ class AstInterpolation(AstNode): converter: str = required_field() value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstImportedIdentifier(AstNode): + """Ast imported identifier node.""" + + value: str = required_field() diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index 3b5d41c14..5095878ac 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -29,8 +29,15 @@ from beet.core.utils import normalize_string -from mecha import AstChildren, AstCommand, AstNode, AstRoot, Visitor, rule -from mecha.ast import AstLiteral, AstResourceLocation +from mecha import ( + AstChildren, + AstCommand, + AstNode, + AstResourceLocation, + AstRoot, + Visitor, + rule, +) from .ast import ( AstAssignment, @@ -43,6 +50,7 @@ AstFormatString, AstFunctionSignature, AstIdentifier, + AstImportedIdentifier, AstInterpolation, AstList, AstLookup, @@ -506,7 +514,7 @@ def import_statement( subcommand = cast(AstCommand, node.arguments[1]) while True: - if isinstance(name := subcommand.arguments[0], AstLiteral): + if isinstance(name := subcommand.arguments[0], AstImportedIdentifier): names.append(name.value) if subcommand.identifier == "from:module:import:name:subcommand": subcommand = cast(AstCommand, subcommand.arguments[1]) @@ -521,7 +529,7 @@ def import_statement( acc.statement(f"from {module.path} import {', '.join(names)}") elif node.identifier == "import:module:as:alias": - alias = cast(AstLiteral, node.arguments[1]).value + alias = cast(AstImportedIdentifier, node.arguments[1]).value if module.namespace: acc.statement( diff --git a/packages/mecha/mecha/contrib/scripting/helpers.py b/packages/mecha/mecha/contrib/scripting/helpers.py index 42531fcdd..da5720738 100644 --- a/packages/mecha/mecha/contrib/scripting/helpers.py +++ b/packages/mecha/mecha/contrib/scripting/helpers.py @@ -5,26 +5,32 @@ from dataclasses import replace from functools import wraps -from typing import Any, Callable, Dict, Union, cast +from typing import Any, Callable, Dict from tokenstream import set_location from mecha import ( AstBool, AstChildren, + AstColor, + AstGamemode, + AstGreedy, AstJson, - AstLiteral, AstMessage, AstNbt, AstNode, AstNumber, + AstObjective, + AstObjectiveCriteria, AstRange, AstResourceLocation, - AstSelector, + AstSortOrder, AstString, + AstSwizzle, + AstTeam, AstTime, + AstWord, ) -from mecha.utils import string_to_number from .utils import internal @@ -36,16 +42,24 @@ def get_scripting_helpers() -> Dict[str, Any]: "missing": object(), "children": AstChildren, "get_attribute": get_attribute, - "interpolate_literal": converter(interpolate_literal), - "interpolate_bool": converter(interpolate_bool), - "interpolate_numeric": converter(interpolate_numeric), - "interpolate_time": converter(interpolate_time), - "interpolate_string": converter(interpolate_string), - "interpolate_json": converter(interpolate_json), - "interpolate_nbt": converter(interpolate_nbt), - "interpolate_range": converter(interpolate_range), - "interpolate_resource_location": converter(interpolate_resource_location), - "interpolate_message": converter(interpolate_message), + "interpolate_bool": converter(AstBool.from_value), + "interpolate_numeric": converter(AstNumber.from_value), + "interpolate_time": converter(AstTime.from_value), + "interpolate_word": converter(AstWord.from_value), + "interpolate_phrase": converter(AstString.from_value), + "interpolate_greedy": converter(AstGreedy.from_value), + "interpolate_json": converter(AstJson.from_value), + "interpolate_nbt": converter(AstNbt.from_value), + "interpolate_range": converter(AstRange.from_value), + "interpolate_resource_location": converter(AstResourceLocation.from_value), + "interpolate_objective": converter(AstObjective.from_value), + "interpolate_objective_criteria": converter(AstObjectiveCriteria.from_value), + "interpolate_swizzle": converter(AstSwizzle.from_value), + "interpolate_team": converter(AstTeam.from_value), + "interpolate_color": converter(AstColor.from_value), + "interpolate_sort_order": converter(AstSortOrder.from_value), + "interpolate_gamemode": converter(AstGamemode.from_value), + "interpolate_message": converter(AstMessage.from_value), } @@ -61,54 +75,11 @@ def get_attribute(obj: Any, attr: str): def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: + internal(f) + @internal @wraps(f) def wrapper(obj: Any, node: AstNode) -> AstNode: return set_location(f(obj), node) return wrapper - - -def interpolate_literal(obj: Any) -> AstLiteral: - return AstLiteral(value=str(obj)) - - -def interpolate_bool(obj: Any) -> AstBool: - return AstBool(value=bool(obj)) - - -def interpolate_numeric(obj: Any) -> AstNumber: - if isinstance(obj, str): - obj = string_to_number(obj) - return AstNumber(value=obj) - - -def interpolate_time(obj: Any) -> AstTime: - return AstTime.from_value(obj) - - -def interpolate_string(obj: Any) -> AstString: - return AstString(value=str(obj)) - - -def interpolate_json(obj: Any) -> AstJson: - return AstJson.from_value(obj) - - -def interpolate_nbt(obj: Any) -> AstNbt: - return AstNbt.from_value(obj) - - -def interpolate_range(obj: Any) -> AstRange: - return AstRange.from_value(obj) - - -def interpolate_resource_location(obj: Any) -> AstResourceLocation: - return AstResourceLocation.from_value(str(obj)) - - -def interpolate_message(obj: Any) -> AstMessage: - fragments = AstChildren([AstLiteral(value=str(obj))]) - return AstMessage( - fragments=cast(AstChildren[Union[AstLiteral, AstSelector]], fragments) - ) diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 72bc84c9f..1e562adde 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -16,6 +16,7 @@ "parse_identifier", "ImportLocationConstraint", "ImportStatementHandler", + "parse_import_name", "FunctionRootBacktracker", "ReturnConstraint", "YieldConstraint", @@ -38,12 +39,13 @@ AlternativeParser, AstChildren, AstCommand, - AstLiteral, AstResourceLocation, AstRoot, + Parser, + consume_line_continuation, + delegate, + get_stream_scope, ) -from mecha import LiteralParser as BasicLiteralParser -from mecha import Parser, consume_line_continuation, delegate, get_stream_scope from mecha.utils import QuoteHelper, normalize_whitespace, string_to_number from .ast import ( @@ -62,6 +64,7 @@ AstFunctionSignature, AstFunctionSignatureArgument, AstIdentifier, + AstImportedIdentifier, AstInterpolation, AstList, AstLookup, @@ -121,7 +124,7 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: "scripting:import": ImportLocationConstraint( parsers["resource_location_or_tag"] ), - "scripting:import_name": BasicLiteralParser("name", IDENTIFIER_PATTERN), + "scripting:import_name": parse_import_name, "scripting:expression": delegate("scripting:disjunction"), "scripting:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -194,25 +197,28 @@ def get_scripting_parsers(parsers: Dict[str, Parser]) -> Dict[str, Parser]: ################################################################################ # Interpolation ################################################################################ - "literal": InterpolationParser("literal", parsers["literal"]), "bool": InterpolationParser("bool", parsers["bool"]), "numeric": InterpolationParser("numeric", parsers["numeric"]), "time": InterpolationParser("time", parsers["time"]), - "word": InterpolationParser("literal", parsers["word"]), - "phrase": InterpolationParser("string", parsers["phrase"]), - "greedy": InterpolationParser("literal", parsers["greedy"]), + "word": InterpolationParser("word", parsers["word"]), + "phrase": InterpolationParser("phrase", parsers["phrase"]), + "greedy": InterpolationParser("greedy", parsers["greedy"]), "json": InterpolationParser("json", parsers["json"]), "nbt": InterpolationParser("nbt", parsers["nbt"]), "range": InterpolationParser("range", parsers["range"]), "resource_location_or_tag": InterpolationParser( "resource_location", parsers["resource_location_or_tag"] ), - "objective": InterpolationParser("literal", parsers["objective"]), - "swizzle": InterpolationParser("literal", parsers["swizzle"]), - "team": InterpolationParser("literal", parsers["team"]), - "command:argument:minecraft:message": InterpolationParser( - "message", parsers["command:argument:minecraft:message"] + "objective": InterpolationParser("objective", parsers["objective"]), + "objective_criteria": InterpolationParser( + "objective_criteria", parsers["objective_criteria"] ), + "swizzle": InterpolationParser("swizzle", parsers["swizzle"]), + "team": InterpolationParser("team", parsers["team"]), + "color": InterpolationParser("color", parsers["color"]), + "sort_order": InterpolationParser("sort_order", parsers["sort_order"]), + "gamemode": InterpolationParser("gamemode", parsers["gamemode"]), + "message": InterpolationParser("message", parsers["message"]), } @@ -552,12 +558,14 @@ def __call__(self, stream: TokenStream) -> Any: else: identifiers.add(module.path.partition(".")[0]) elif node.identifier == "import:module:as:alias": - if isinstance(alias := node.arguments[1], AstLiteral): + if isinstance(alias := node.arguments[1], AstImportedIdentifier): identifiers.add(alias.value) elif node.identifier == "from:module:import:subcommand": subcommand = cast(AstCommand, node.arguments[1]) while True: - if isinstance(name := subcommand.arguments[0], AstLiteral): + if isinstance( + name := subcommand.arguments[0], AstImportedIdentifier + ): identifiers.add(name.value) if subcommand.identifier == "from:module:import:name:subcommand": subcommand = cast(AstCommand, subcommand.arguments[1]) @@ -567,6 +575,13 @@ def __call__(self, stream: TokenStream) -> Any: return node +def parse_import_name(stream: TokenStream) -> AstImportedIdentifier: + """Parse import name.""" + with stream.syntax(name=IDENTIFIER_PATTERN): + token = stream.expect("name") + return set_location(AstImportedIdentifier(value=token.value), token) + + @dataclass class FunctionRootBacktracker: """Parser for backtracking over function root nodes.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index a88f60218..d8beea201 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -34,13 +34,11 @@ "ItemParser", "NoBlockStatesConstraint", "NoDataTagsConstraint", - "LiteralParser", - "LiteralConstraint", + "BasicLiteralParser", "RangeParser", "IntegerRangeConstraint", "LengthConstraint", "CommentDisambiguation", - "parse_swizzle", "TimeParser", "parse_uuid", "SelectorParser", @@ -54,7 +52,7 @@ "SelectorSingleConstraint", "SelectorAmountConstraint", "EntityParser", - "ScoreHolderParser", + "parse_wildcard", "parse_message", "NbtPathParser", "parse_particle", @@ -87,16 +85,22 @@ from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location from .ast import ( + AstAdvancementPredicate, AstBlock, AstBlockParticleParameters, AstBlockState, AstBool, AstChildren, + AstColor, + AstColorReset, AstCommand, AstCoordinate, AstDustColorTransitionParticleParameters, AstDustParticleParameters, + AstEntityAnchor, AstFallingDustParticleParameters, + AstGamemode, + AstGreedy, AstItem, AstItemParticleParameters, AstJson, @@ -107,6 +111,7 @@ AstJsonValue, AstLiteral, AstMessage, + AstMessageText, AstNbt, AstNbtByteArray, AstNbtCompound, @@ -120,10 +125,14 @@ AstNbtValue, AstNode, AstNumber, + AstObjective, + AstObjectiveCriteria, AstParticle, + AstPlayerName, AstRange, AstResourceLocation, AstRoot, + AstScoreboardOperation, AstSelector, AstSelectorAdvancementMatch, AstSelectorAdvancementPredicateMatch, @@ -131,12 +140,17 @@ AstSelectorArgument, AstSelectorScoreMatch, AstSelectorScores, + AstSortOrder, AstString, + AstSwizzle, + AstTeam, AstTime, AstUUID, AstVector2, AstVector3, AstVibrationParticleParameters, + AstWildcard, + AstWord, ) from .error import MechaError from .spec import CommandSpec, Parser @@ -157,7 +171,6 @@ def get_default_parsers() -> Dict[str, Parser]: ################################################################################ # Primitives ################################################################################ - "literal": LiteralParser(name="literal"), "bool": parse_bool, "numeric": NumericParser(), "integer": IntegerConstraint(delegate("numeric")), @@ -167,13 +180,13 @@ def get_default_parsers() -> Dict[str, Parser]: "word": StringParser(type="word"), "phrase": StringParser(type="phrase"), "greedy": StringParser(type="greedy"), - "json": MultilineParser(JsonParser()), + "json": JsonParser(), "json_object": TypeConstraint( parser=delegate("json"), type=AstJsonObject, message="Expected json object.", ), - "nbt": MultilineParser(NbtParser()), + "nbt": NbtParser(), "nbt_compound": TypeConstraint( parser=delegate("nbt"), type=AstNbtCompound, @@ -189,10 +202,19 @@ def get_default_parsers() -> Dict[str, Parser]: "resource_location_or_tag": CommentDisambiguation(ResourceLocationParser()), "resource_location": NoTagConstraint(delegate("resource_location_or_tag")), "uuid": parse_uuid, - "objective": LiteralParser("objective", r"[a-zA-Z0-9_.+-]+|\*"), - "player_name": CommentDisambiguation(delegate("literal")), - "swizzle": parse_swizzle, - "team": LiteralParser("team", r"[a-zA-Z0-9_.+-]+"), + "objective": BasicLiteralParser(AstObjective), + "objective_criteria": BasicLiteralParser(AstObjectiveCriteria), + "scoreboard_operation": BasicLiteralParser(AstScoreboardOperation), + "player_name": CommentDisambiguation(BasicLiteralParser(AstPlayerName)), + "swizzle": BasicLiteralParser(AstSwizzle), + "team": BasicLiteralParser(AstTeam), + "advancement_predicate": BasicLiteralParser(AstAdvancementPredicate), + "wildcard": parse_wildcard, + "color": BasicLiteralParser(AstColor), + "color_reset": BasicLiteralParser(AstColorReset), + "sort_order": BasicLiteralParser(AstSortOrder), + "gamemode": BasicLiteralParser(AstGamemode), + "entity_anchor": BasicLiteralParser(AstEntityAnchor), "block_predicate": BlockParser( resource_location_parser=delegate("resource_location_or_tag"), block_states_parser=AdjacentConstraint( @@ -213,6 +235,7 @@ def get_default_parsers() -> Dict[str, Parser]: "item_stack": ItemParser( resource_location_parser=delegate("resource_location"), ), + "message": parse_message, ################################################################################ # Particle ################################################################################ @@ -290,27 +313,11 @@ def get_default_parsers() -> Dict[str, Parser]: "selector:argument:dz": delegate("numeric"), "selector:argument:scores": parse_selector_scores, "selector:argument:tag": delegate("word"), - "selector:argument:team": delegate("word"), + "selector:argument:team": delegate("team"), "selector:argument:limit": delegate("integer"), - "selector:argument:sort": LiteralConstraint( - parser=delegate("word"), - values=[ - "nearest", - "furthest", - "random", - "arbitrary", - ], - ), + "selector:argument:sort": delegate("sort_order"), "selector:argument:level": delegate("integer_range"), - "selector:argument:gamemode": LiteralConstraint( - parser=delegate("word"), - values=[ - "adventure", - "creative", - "spectator", - "survival", - ], - ), + "selector:argument:gamemode": delegate("gamemode"), "selector:argument:name": delegate("phrase"), "selector:argument:x_rotation": delegate("range"), "selector:argument:y_rotation": delegate("range"), @@ -335,29 +342,17 @@ def get_default_parsers() -> Dict[str, Parser]: disallow=["local"], ), "command:argument:minecraft:block_pos": Vector3Parser(delegate("coordinate")), - "command:argument:minecraft:block_predicate": delegate("block_predicate"), - "command:argument:minecraft:block_state": delegate("block_state"), - "command:argument:minecraft:color": LiteralConstraint( - parser=delegate("word"), - values=[ - "reset", - "black", - "dark_blue", - "dark_green", - "dark_aqua", - "dark_red", - "dark_purple", - "gold", - "gray", - "dark_gray", - "blue", - "green", - "aqua", - "red", - "light_purple", - "yellow", - "white", - ], + "command:argument:minecraft:block_predicate": MultilineParser( + delegate("block_predicate") + ), + "command:argument:minecraft:block_state": MultilineParser( + delegate("block_state") + ), + "command:argument:minecraft:color": AlternativeParser( + [ + delegate("color"), + delegate("color_reset"), + ] ), "command:argument:minecraft:column_pos": Vector2Parser( coordinate_parser=RestrictCoordinateConstraint( @@ -365,17 +360,14 @@ def get_default_parsers() -> Dict[str, Parser]: disallow=["local"], ), ), - "command:argument:minecraft:component": delegate("json"), + "command:argument:minecraft:component": MultilineParser(delegate("json")), "command:argument:minecraft:dimension": delegate("resource_location"), "command:argument:minecraft:entity": EntityParser( selector_parser=SelectorTypeConstraint( SelectorAmountConstraint(delegate("selector")) ), ), - "command:argument:minecraft:entity_anchor": LiteralConstraint( - parser=delegate("word"), - values=["eyes", "feet"], - ), + "command:argument:minecraft:entity_anchor": delegate("entity_anchor"), "command:argument:minecraft:entity_summon": delegate("resource_location"), "command:argument:minecraft:float_range": delegate("range"), "command:argument:minecraft:function": delegate("resource_location_or_tag"), @@ -384,30 +376,28 @@ def get_default_parsers() -> Dict[str, Parser]: ), "command:argument:minecraft:int_range": delegate("integer_range"), "command:argument:minecraft:item_enchantment": delegate("word"), - "command:argument:minecraft:item_predicate": delegate("item_predicate"), + "command:argument:minecraft:item_predicate": MultilineParser( + delegate("item_predicate") + ), "command:argument:minecraft:item_slot": delegate("word"), - "command:argument:minecraft:item_stack": delegate("item_stack"), - "command:argument:minecraft:message": parse_message, + "command:argument:minecraft:item_stack": MultilineParser( + delegate("item_stack") + ), + "command:argument:minecraft:message": delegate("message"), "command:argument:minecraft:mob_effect": delegate("resource_location"), - "command:argument:minecraft:nbt_compound_tag": delegate("nbt_compound"), + "command:argument:minecraft:nbt_compound_tag": MultilineParser( + delegate("nbt_compound") + ), "command:argument:minecraft:nbt_path": delegate("nbt_path"), - "command:argument:minecraft:nbt_tag": delegate("nbt"), - "command:argument:minecraft:objective": delegate("objective"), - "command:argument:minecraft:objective_criteria": delegate("literal"), - "command:argument:minecraft:operation": LiteralConstraint( - parser=delegate("literal"), - values=[ - "+=", - "-=", - "*=", - "/=", - "%=", - "=", - "<", - ">", - "><", - ], + "command:argument:minecraft:nbt_tag": MultilineParser(delegate("nbt")), + "command:argument:minecraft:objective": AlternativeParser( + [ + delegate("objective"), + delegate("wildcard"), + ] ), + "command:argument:minecraft:objective_criteria": delegate("objective_criteria"), + "command:argument:minecraft:operation": delegate("scoreboard_operation"), "command:argument:minecraft:particle": delegate("particle"), "command:argument:minecraft:resource_location": delegate("resource_location"), "command:argument:minecraft:rotation": Vector2Parser( @@ -416,10 +406,11 @@ def get_default_parsers() -> Dict[str, Parser]: disallow=["local"], ), ), - "command:argument:minecraft:score_holder": ScoreHolderParser( - entity_parser=EntityParser( - selector_parser=SelectorAmountConstraint(delegate("selector")), - ), + "command:argument:minecraft:score_holder": AlternativeParser( + [ + EntityParser(SelectorAmountConstraint(delegate("selector"))), + delegate("wildcard"), + ] ), "command:argument:minecraft:scoreboard_slot": delegate("word"), "command:argument:minecraft:swizzle": delegate("swizzle"), @@ -732,7 +723,7 @@ class IntegerConstraint: parser: Parser def __call__(self, stream: TokenStream) -> Any: - if isinstance(node := self.parser(stream), AstNumber): + if isinstance(node := self.parser(stream), (AstNumber, AstCoordinate)): if not isinstance(node.value, int): raise node.emit_error(InvalidSyntax("Expected integer value.")) return node @@ -789,17 +780,17 @@ def __call__(self, stream: TokenStream) -> Any: with stream.intercept("whitespace"): while stream.get("whitespace"): continue - with stream.syntax(line=r".+"): + with stream.syntax(line=AstGreedy.regex.pattern): token = stream.expect("line") - node = AstLiteral(value=token.value) + node = AstGreedy(value=token.value) else: with stream.syntax( - word=r"[0-9A-Za-z_\.\+\-]+", + word=AstWord.regex.pattern, quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", ): if self.type == "word": token = stream.expect("word") - node = AstLiteral(value=token.value) + node = AstWord(value=token.value) else: token = stream.expect_any("word", "quoted_string") node = AstString(value=self.quote_helper.unquote_string(token)) @@ -1289,32 +1280,20 @@ def __call__(self, stream: TokenStream) -> Any: @dataclass -class LiteralParser: +class BasicLiteralParser: """Parser for simple literal values.""" - name: str - pattern: str = r"\S+" - - def __call__(self, stream: TokenStream) -> AstLiteral: - with stream.syntax(**{self.name: self.pattern}): - token = stream.expect(self.name) - node = AstLiteral(value=token.value) - return set_location(node, token) - - -@dataclass -class LiteralConstraint: - """Constraint that only allows a set of predefined values.""" - - parser: Parser - values: List[Any] + type: Type[AstLiteral] def __call__(self, stream: TokenStream) -> Any: - if isinstance(node := self.parser(stream), AstLiteral): - if node.value not in self.values: - exc = InvalidSyntax(f"Unexpected value {node.value!r}.") - raise node.emit_error(exc) - return node + if not self.type.parser: + raise ValueError( + f"Literal node type must have an associated parser {self.type!r}." + ) + with stream.syntax(**{self.type.parser: self.type.regex.pattern}): + token = stream.expect(self.type.parser) + node = self.type(value=token.value) + return set_location(node, token) @dataclass @@ -1357,17 +1336,6 @@ def __call__(self, stream: TokenStream) -> Any: return node -def parse_swizzle(stream: TokenStream) -> AstLiteral: - """Parse swizzle.""" - node = delegate("literal", stream) - - normalized = set(node.value[:3]) & {"x", "y", "z"} - if not normalized or len(node.value) != len(normalized): - raise node.emit_error(InvalidSyntax(f"Invalid swizzle {node.value!r}.")) - - return node - - @dataclass class TimeParser(NumericParser): """Parser for time.""" @@ -1490,7 +1458,7 @@ def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: """Parse selector scores.""" with stream.syntax( curly=r"\{|\}", - objective=r"[a-zA-Z0-9_.+-]+", + objective=AstObjective.regex.pattern, equal=r"=", comma=r",", ): @@ -1499,7 +1467,7 @@ def parse_selector_scores(stream: TokenStream) -> AstSelectorScores: scores: List[AstSelectorScoreMatch] = [] for key in stream.collect("objective"): - key_node = AstLiteral(value=key.value) + key_node = AstObjective(value=key.value) key_node = set_location(key_node, key) stream.expect("equal") @@ -1533,7 +1501,7 @@ def parse_selector_advancements(stream: TokenStream) -> AstSelectorAdvancements: predicates: List[AstSelectorAdvancementPredicateMatch] = [] for _ in stream.peek_until(("curly", "}")): - pkey = delegate("word", stream) + pkey = delegate("advancement_predicate", stream) stream.expect("equal") pvalue = delegate("bool", stream) @@ -1679,18 +1647,11 @@ def __call__(self, stream: TokenStream) -> Any: return delegate("player_name", stream) -@dataclass -class ScoreHolderParser: - """Parser for score holder.""" - - entity_parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(wildcard=r"\*"): - if token := stream.get("wildcard"): - node = AstLiteral(value=token.value) - return set_location(node, token) - return self.entity_parser(stream) +def parse_wildcard(stream: TokenStream) -> AstWildcard: + """Parse wildcard.""" + with stream.syntax(wildcard=r"\*"): + token = stream.expect("wildcard") + return set_location(AstWildcard(), token) def parse_message(stream: TokenStream) -> AstMessage: @@ -1715,13 +1676,13 @@ def parse_message(stream: TokenStream) -> AstMessage: with stream.syntax(text=None): fragments.append(delegate("selector", stream)) elif text: - text_node = AstLiteral(value=text.value) + text_node = AstMessageText(value=text.value) text_node = set_location(text_node, text) fragments.append(text_node) with stream.syntax(text=None): if consume_line_continuation(stream): - whitespace_node = AstLiteral(value=" ") + whitespace_node = AstMessageText(value=" ") whitespace_node = set_location( whitespace_node, stream.current.end_location.with_horizontal_offset(-1), diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt index c84e5039e..4c411d45a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_0__0.txt @@ -6,7 +6,7 @@ word --- word --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt index 4aa78b7ad..1feaf94c1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_0_1__0.txt @@ -6,7 +6,7 @@ word_with_underscores --- word_with_underscores --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'word_with_underscores' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt index 0d1f3682e..ce1d367bd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_0__0.txt @@ -6,7 +6,7 @@ word --- word --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'word' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt index 6d5c0f784..2a3966e3d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_1__0.txt @@ -6,7 +6,7 @@ words with spaces --- words with spaces --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=1, colno=18) value: 'words with spaces' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt index 843d2316d..b5923420a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_brigadier_string_2_2__0.txt @@ -6,7 +6,7 @@ brigadier:string 2 2 --- "and symbols" --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: '"and symbols"' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt index 0fc76e09d..9f5841288 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_0__0.txt @@ -6,7 +6,7 @@ red --- red --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'red' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt index 448c34452..0f9dbdf89 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_0_1__0.txt @@ -6,7 +6,7 @@ green --- green --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'green' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt index 0f1ca28f2..9e99f06bf 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_color_1_0__0.txt @@ -6,4 +6,4 @@ creeper --- Reported 1 error. -line 1, column 1: Unexpected value 'creeper'. \ No newline at end of file +line 1, column 1: Expected color or color_reset but got literal 'creeper'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt index 626d8756c..6c032bfad 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_0__0.txt @@ -6,7 +6,7 @@ Player --- Player --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt index 816e237a7..804e08df4 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_10__0.txt @@ -21,7 +21,7 @@ minecraft:entity 0 10 end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'gamemode' value: - + location: SourceLocation(pos=17, lineno=1, colno=18) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'creative' @@ -35,7 +35,7 @@ minecraft:entity 0 10 end_location: SourceLocation(pos=36, lineno=1, colno=37) value: 'gamemode' value: - + location: SourceLocation(pos=41, lineno=1, colno=42) end_location: SourceLocation(pos=50, lineno=1, colno=51) value: 'adventure' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt index 34d6c2a97..ba1f8c1f5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:entity 0 1 --- 0123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt index 388561f6a..6093107c8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_0_6__0.txt @@ -55,7 +55,7 @@ minecraft:entity 0 6 location: SourceLocation(pos=62, lineno=1, colno=63) end_location: SourceLocation(pos=72, lineno=1, colno=73) key: - + location: SourceLocation(pos=62, lineno=1, colno=63) end_location: SourceLocation(pos=65, lineno=1, colno=66) value: 'qux' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt index 24892a10a..bff66a50d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_2_2__0.txt @@ -6,4 +6,4 @@ minecraft:entity 2 2 --- Reported 1 error. -line 1, column 38: Unexpected value 'unknown'. \ No newline at end of file +line 1, column 38: Expected gamemode but got literal 'unknown'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt index f3e484e62..1fc5e7d49 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_0__0.txt @@ -6,7 +6,7 @@ minecraft:entity 5 0 --- #foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '#foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt index b095a6de7..c52f6634e 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_1__0.txt @@ -6,7 +6,7 @@ $foo --- $foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '$foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt index 84d33c604..4def68d1a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_5_2__0.txt @@ -6,7 +6,7 @@ minecraft:entity 5 2 --- %foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '%foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt index 55b5be45a..b5e8f64cd 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_0__0.txt @@ -6,7 +6,7 @@ eyes --- eyes --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'eyes' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt index 794eba481..fc5000ca5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_entity_anchor_0_1__0.txt @@ -6,7 +6,7 @@ feet --- feet --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'feet' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt index ead477181..42515e53c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_0__0.txt @@ -6,7 +6,7 @@ Player --- Player --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt index e19aab19c..4d5ebdd24 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_game_profile_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:game_profile 0 1 --- 0123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt index dc2c06dec..18774d3f2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_0__0.txt @@ -6,7 +6,7 @@ unbreaking --- unbreaking --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'unbreaking' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt index b9ec9efe3..a6b5c19bc 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_enchantment_0_1__0.txt @@ -6,7 +6,7 @@ silk_touch --- silk_touch --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'silk_touch' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt index 7bb7bf8dc..19c9ae835 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_0__0.txt @@ -6,7 +6,7 @@ container.5 --- container.5 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 'container.5' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt index 02c9d78c1..632167b7a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:item_slot 0 1 --- 12 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) value: '12' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt index 859534796..0f8b59362 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_item_slot_0_2__0.txt @@ -6,7 +6,7 @@ weapon --- weapon --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'weapon' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt index 9a14ae13f..17996d30f 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_0__0.txt @@ -10,7 +10,7 @@ Hello world! location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) fragments: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'Hello world!' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt index 6d5c1168c..c2ecc052c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_1__0.txt @@ -10,7 +10,7 @@ foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) fragments: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt index 55a9f7942..2c4e9fdb1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_3__0.txt @@ -10,7 +10,7 @@ Hello @p :) location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) fragments: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Hello ' @@ -20,7 +20,7 @@ Hello @p :) variable: 'p' arguments: - + location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: ' :)' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt index bd482a8ac..f5bdcf51c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_0_4__0.txt @@ -10,7 +10,7 @@ foo @a[tag=a, tag=b] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) fragments: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 'foo ' @@ -29,7 +29,7 @@ foo @a[tag=a, tag=b] end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'tag' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'a' @@ -43,7 +43,7 @@ foo @a[tag=a, tag=b] end_location: SourceLocation(pos=17, lineno=1, colno=18) value: 'tag' value: - + location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=19, lineno=1, colno=20) value: 'b' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt index 47671b78a..15c6ea84c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_0__0.txt @@ -6,7 +6,7 @@ foo --- foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt index f5d0ad879..f03931674 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:objective 0 1 --- * --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt index 5c6ab875f..e16711726 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_0_2__0.txt @@ -6,7 +6,7 @@ minecraft:objective 0 2 --- 012 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: '012' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt index 52a907b77..6569d6036 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_0__0.txt @@ -6,7 +6,7 @@ minecraft.mined:minecraft.stone --- minecraft.mined:minecraft.stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=1, colno=32) value: 'minecraft.mined:minecraft.stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt index 753d9d0db..a10a95297 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_1__0.txt @@ -6,7 +6,7 @@ mined:minecraft.stone --- mined:minecraft.stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'mined:minecraft.stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt index 7b6a4dbee..413849a20 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_2__0.txt @@ -6,7 +6,7 @@ minecraft.mined:stone --- minecraft.mined:stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'minecraft.mined:stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt index 6f64cba20..59d0ea20b 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_3__0.txt @@ -6,7 +6,7 @@ mined:stone --- mined:stone --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 'mined:stone' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt index 1438b7726..0915319d5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_4__0.txt @@ -6,7 +6,7 @@ dummy --- dummy --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 'dummy' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt index cc493c62e..02e25d2d5 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_5__0.txt @@ -6,7 +6,7 @@ deathCount --- deathCount --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'deathCount' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt index a8e9d90bd..d2ccc2982 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_6__0.txt @@ -6,7 +6,7 @@ playerKillCount --- playerKillCount --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'playerKillCount' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt index 4e9c344bc..5c1961dba 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_objective_criteria_0_7__0.txt @@ -6,7 +6,7 @@ teamkill.aqua --- teamkill.aqua --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'teamkill.aqua' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt index 73bea2915..07bd147da 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_0__0.txt @@ -6,7 +6,7 @@ minecraft:operation 0 0 --- = --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '=' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt index f63ef3e02..4d66eb466 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:operation 0 1 --- > --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '>' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt index 44ce57407..63fe2141d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_0_2__0.txt @@ -6,7 +6,7 @@ minecraft:operation 0 2 --- < --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '<' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt index 8e93928cb..9a91a9334 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_operation_1_0__0.txt @@ -6,4 +6,4 @@ wat --- Reported 1 error. -line 1, column 1: Unexpected value 'wat'. \ No newline at end of file +line 1, column 1: Expected scoreboard_operation but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt index 0860f514b..a3abc8985 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_0__0.txt @@ -6,7 +6,7 @@ Player --- Player --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'Player' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt index 0f6cd2ecf..a39da15a9 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:score_holder 0 1 --- 0123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=1, colno=5) value: '0123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt index 1039aab36..3b09122a1 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_2__0.txt @@ -6,7 +6,7 @@ minecraft:score_holder 0 2 --- * --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: '*' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt index 425039daf..9fed9434d 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_4__0.txt @@ -29,7 +29,7 @@ minecraft:score_holder 0 4 location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=24, lineno=1, colno=25) key: - + location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=18, lineno=1, colno=19) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt index e54e9994b..55c110526 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_6__0.txt @@ -21,7 +21,7 @@ minecraft:score_holder 0 6 end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'sort' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=20, lineno=1, colno=21) value: 'arbitrary' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt index 79b0d6584..91d487f28 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_7__0.txt @@ -21,7 +21,7 @@ minecraft:score_holder 0 7 end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'tag' value: - + location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'foo' @@ -35,7 +35,7 @@ minecraft:score_holder 0 7 end_location: SourceLocation(pos=19, lineno=1, colno=20) value: 'tag' value: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=27, lineno=1, colno=28) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt index ccc14a8eb..36991c686 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_8__0.txt @@ -21,7 +21,7 @@ minecraft:score_holder 0 8 end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'team' value: - + location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'foo' @@ -35,7 +35,7 @@ minecraft:score_holder 0 8 end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 'team' value: - + location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=31, lineno=1, colno=32) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt index 2f839c2df..9254b1c37 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_9__0.txt @@ -21,7 +21,7 @@ minecraft:score_holder 0 9 end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'team' value: - + location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'foo' @@ -35,7 +35,7 @@ minecraft:score_holder 0 9 end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'team' value: - + location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=27, lineno=1, colno=28) value: 'bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt index 895c2dad5..604cc47fe 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_1_2__0.txt @@ -21,7 +21,7 @@ minecraft:score_holder 1 2 end_location: SourceLocation(pos=6, lineno=1, colno=7) value: 'tag' value: - + location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=10, lineno=1, colno=11) value: 'foo' @@ -49,7 +49,7 @@ minecraft:score_holder 1 2 end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'sort' value: - + location: SourceLocation(pos=26, lineno=1, colno=27) end_location: SourceLocation(pos=33, lineno=1, colno=34) value: 'nearest' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt index a2fe8f2e4..ccec7927c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_1__0.txt @@ -6,4 +6,4 @@ minecraft:score_holder 2 1 --- Reported 1 error. -line 1, column 32: Unexpected value 'wat'. \ No newline at end of file +line 1, column 32: Expected sort_order but got literal 'wat,'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt index ae78318d4..866574b72 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_2_4__0.txt @@ -6,4 +6,4 @@ minecraft:score_holder 2 4 --- Reported 1 error. -line 1, column 31: Unexpected value 'unknown'. \ No newline at end of file +line 1, column 31: Expected sort_order but got literal 'unknown'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt index 09e9f5d84..4f6a182a8 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_0__0.txt @@ -6,7 +6,7 @@ sidebar --- sidebar --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'sidebar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt index 698cb2979..8df4ada61 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_scoreboard_slot_0_1__0.txt @@ -6,7 +6,7 @@ foo.bar --- foo.bar --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 'foo.bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt index 60d43818d..c52267d80 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_0__0.txt @@ -6,7 +6,7 @@ xyz --- xyz --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'xyz' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt index 237a8357a..43b585d26 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_0_1__0.txt @@ -6,7 +6,7 @@ x --- x --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=1, lineno=1, colno=2) value: 'x' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt index 70a6163e6..ef4d6e68a 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_0__0.txt @@ -6,4 +6,4 @@ sup --- Reported 1 error. -line 1, column 1: Invalid swizzle 'sup'. \ No newline at end of file +line 1, column 1: Expected swizzle but got literal 'sup'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt index fbce1178c..e9b005d49 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_1__0.txt @@ -6,4 +6,4 @@ wat --- Reported 1 error. -line 1, column 1: Invalid swizzle 'wat'. \ No newline at end of file +line 1, column 1: Expected swizzle but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt index e7765afb2..d023907a6 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_2__0.txt @@ -6,4 +6,4 @@ xx --- Reported 1 error. -line 1, column 1: Invalid swizzle 'xx'. \ No newline at end of file +line 1, column 1: Expected swizzle but got literal 'xx'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt index dcb833b3c..6947443ec 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_swizzle_1_3__0.txt @@ -6,4 +6,4 @@ yzy --- Reported 1 error. -line 1, column 1: Invalid swizzle 'yzy'. \ No newline at end of file +line 1, column 1: Expected swizzle but got literal 'yzy'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt index 3a1fb4ee3..b7f219935 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_0__0.txt @@ -6,7 +6,7 @@ foo --- foo --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt index dbb4f95ec..4ff8b8c70 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_team_0_1__0.txt @@ -6,7 +6,7 @@ minecraft:team 0 1 --- 123 --- - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=1, colno=4) value: '123' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 6ab836771..5f33431d0 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -62,7 +62,7 @@ end_location: SourceLocation(pos=184, lineno=8, colno=12) identifier: 'clear:targets' arguments: - + location: SourceLocation(pos=179, lineno=8, colno=7) end_location: SourceLocation(pos=184, lineno=8, colno=12) value: 'Alice' @@ -71,7 +71,7 @@ end_location: SourceLocation(pos=211, lineno=9, colno=27) identifier: 'clear:targets:item' arguments: - + location: SourceLocation(pos=191, lineno=9, colno=7) end_location: SourceLocation(pos=196, lineno=9, colno=12) value: 'Alice' @@ -239,7 +239,7 @@ end_location: SourceLocation(pos=402, lineno=13, colno=59) value: 'sort' value: - + location: SourceLocation(pos=403, lineno=13, colno=60) end_location: SourceLocation(pos=410, lineno=13, colno=67) value: 'nearest' @@ -305,7 +305,7 @@ end_location: SourceLocation(pos=478, lineno=14, colno=42) value: 'sort' value: - + location: SourceLocation(pos=479, lineno=14, colno=43) end_location: SourceLocation(pos=485, lineno=14, colno=49) value: 'random' @@ -588,7 +588,7 @@ end_location: SourceLocation(pos=767, lineno=18, colno=46) value: 'sort' value: - + location: SourceLocation(pos=768, lineno=18, colno=47) end_location: SourceLocation(pos=775, lineno=18, colno=54) value: 'nearest' @@ -667,7 +667,7 @@ end_location: SourceLocation(pos=853, lineno=19, colno=47) value: 'sort' value: - + location: SourceLocation(pos=854, lineno=19, colno=48) end_location: SourceLocation(pos=861, lineno=19, colno=55) value: 'nearest' @@ -830,7 +830,7 @@ variable: 'a' arguments: - + location: SourceLocation(pos=1154, lineno=29, colno=12) end_location: SourceLocation(pos=1162, lineno=29, colno=20) value: 'infinity' @@ -845,7 +845,7 @@ variable: 'p' arguments: - + location: SourceLocation(pos=1174, lineno=30, colno=12) end_location: SourceLocation(pos=1183, lineno=30, colno=21) value: 'sharpness' @@ -863,7 +863,7 @@ end_location: SourceLocation(pos=1237, lineno=32, colno=42) identifier: 'execute:align:axes:subcommand' arguments: - + location: SourceLocation(pos=1210, lineno=32, colno=15) end_location: SourceLocation(pos=1213, lineno=32, colno=18) value: 'yxz' @@ -914,7 +914,7 @@ end_location: SourceLocation(pos=1272, lineno=33, colno=35) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=1255, lineno=33, colno=18) end_location: SourceLocation(pos=1259, lineno=33, colno=22) value: 'eyes' @@ -959,7 +959,7 @@ end_location: SourceLocation(pos=1308, lineno=34, colno=36) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=1290, lineno=34, colno=18) end_location: SourceLocation(pos=1294, lineno=34, colno=22) value: 'eyes' @@ -1535,7 +1535,7 @@ variable: 'p' arguments: - + location: SourceLocation(pos=1706, lineno=42, colno=52) end_location: SourceLocation(pos=1710, lineno=42, colno=56) value: 'feet' @@ -2075,7 +2075,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2176, lineno=51, colno=21) end_location: SourceLocation(pos=2177, lineno=51, colno=22) value: 'A' @@ -2085,7 +2085,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2183, lineno=51, colno=28) end_location: SourceLocation(pos=2184, lineno=51, colno=29) value: 'B' @@ -2243,7 +2243,7 @@ end_location: SourceLocation(pos=2362, lineno=53, colno=60) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=2332, lineno=53, colno=30) end_location: SourceLocation(pos=2336, lineno=53, colno=34) value: 'eyes' @@ -2459,7 +2459,7 @@ location: SourceLocation(pos=2507, lineno=55, colno=50) end_location: SourceLocation(pos=2528, lineno=55, colno=71) fragments: - + location: SourceLocation(pos=2507, lineno=55, colno=50) end_location: SourceLocation(pos=2528, lineno=55, colno=71) value: '"My feet are soaked!"' @@ -2490,7 +2490,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2559, lineno=56, colno=31) end_location: SourceLocation(pos=2563, lineno=56, colno=35) value: 'test' @@ -2500,7 +2500,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=2569, lineno=56, colno=41) end_location: SourceLocation(pos=2573, lineno=56, colno=45) value: 'test' @@ -2518,7 +2518,7 @@ location: SourceLocation(pos=2582, lineno=56, colno=54) end_location: SourceLocation(pos=2598, lineno=56, colno=70) fragments: - + location: SourceLocation(pos=2582, lineno=56, colno=54) end_location: SourceLocation(pos=2598, lineno=56, colno=70) value: '"Score is reset"' @@ -2818,7 +2818,7 @@ end_location: SourceLocation(pos=2916, lineno=61, colno=65) identifier: 'execute:as:targets:subcommand' arguments: - + location: SourceLocation(pos=2863, lineno=61, colno=12) end_location: SourceLocation(pos=2868, lineno=61, colno=17) value: 'Alice' @@ -2874,11 +2874,11 @@ end_location: SourceLocation(pos=2988, lineno=62, colno=72) identifier: 'execute:store:result:score:targets:objective:subcommand' arguments: - + location: SourceLocation(pos=2944, lineno=62, colno=28) end_location: SourceLocation(pos=2949, lineno=62, colno=33) value: '#temp' - + location: SourceLocation(pos=2950, lineno=62, colno=34) end_location: SourceLocation(pos=2956, lineno=62, colno=40) value: 'global' @@ -2911,7 +2911,7 @@ end_location: SourceLocation(pos=3031, lineno=64, colno=30) identifier: 'experience:query:targets:levels' arguments: - + location: SourceLocation(pos=3019, lineno=64, colno=18) end_location: SourceLocation(pos=3024, lineno=64, colno=23) value: 'Steve' @@ -3716,7 +3716,7 @@ end_location: SourceLocation(pos=4104, lineno=92, colno=26) type: 'relative' value: 0 - + location: SourceLocation(pos=4105, lineno=92, colno=27) end_location: SourceLocation(pos=4117, lineno=92, colno=39) value: 'container.26' @@ -3746,7 +3746,7 @@ variable: 'p' arguments: - + location: SourceLocation(pos=4173, lineno=93, colno=24) end_location: SourceLocation(pos=4181, lineno=93, colno=32) value: 'hotbar.8' @@ -3776,7 +3776,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=4237, lineno=94, colno=24) end_location: SourceLocation(pos=4251, lineno=94, colno=38) value: 'weapon.offhand' @@ -3786,7 +3786,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=4267, lineno=94, colno=54) end_location: SourceLocation(pos=4282, lineno=94, colno=69) value: 'weapon.mainhand' @@ -3806,7 +3806,7 @@ end_location: SourceLocation(pos=4308, lineno=97, colno=11) identifier: 'kill:targets' arguments: - + location: SourceLocation(pos=4303, lineno=97, colno=6) end_location: SourceLocation(pos=4308, lineno=97, colno=11) value: 'Steve' @@ -4015,7 +4015,7 @@ location: SourceLocation(pos=4513, lineno=106, colno=8) end_location: SourceLocation(pos=4515, lineno=106, colno=10) fragments: - + location: SourceLocation(pos=4513, lineno=106, colno=8) end_location: SourceLocation(pos=4515, lineno=106, colno=10) value: 'Hi' @@ -4936,7 +4936,7 @@ end_location: SourceLocation(pos=5441, lineno=127, colno=15) identifier: 'teleport:destination' arguments: - + location: SourceLocation(pos=5436, lineno=127, colno=10) end_location: SourceLocation(pos=5441, lineno=127, colno=15) value: 'Alice' @@ -5303,23 +5303,23 @@ end_location: SourceLocation(pos=6034, lineno=147, colno=79) identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' arguments: - + location: SourceLocation(pos=5985, lineno=147, colno=30) end_location: SourceLocation(pos=6003, lineno=147, colno=48) value: '#sie_1_flags_delta' - + location: SourceLocation(pos=6004, lineno=147, colno=49) end_location: SourceLocation(pos=6011, lineno=147, colno=56) value: 'integer' - + location: SourceLocation(pos=6012, lineno=147, colno=57) end_location: SourceLocation(pos=6013, lineno=147, colno=58) value: '=' - + location: SourceLocation(pos=6014, lineno=147, colno=59) end_location: SourceLocation(pos=6026, lineno=147, colno=71) value: '#sie_1_flags' - + location: SourceLocation(pos=6027, lineno=147, colno=72) end_location: SourceLocation(pos=6034, lineno=147, colno=79) value: 'integer' @@ -5328,11 +5328,11 @@ end_location: SourceLocation(pos=6066, lineno=148, colno=32) identifier: 'scoreboard:players:set:targets:objective:score' arguments: - + location: SourceLocation(pos=6058, lineno=148, colno=24) end_location: SourceLocation(pos=6059, lineno=148, colno=25) value: '✔' - + location: SourceLocation(pos=6060, lineno=148, colno=26) end_location: SourceLocation(pos=6063, lineno=148, colno=29) value: 'foo' diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 8bd2dbcf2..8cf3c5d8a 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -34,7 +34,7 @@ end_location: SourceLocation(pos=287, lineno=16, colno=10) identifier: 'execute:align:axes:subcommand' arguments: - + location: SourceLocation(pos=38, lineno=4, colno=11) end_location: SourceLocation(pos=41, lineno=4, colno=14) value: 'xyz' @@ -668,7 +668,7 @@ end_location: SourceLocation(pos=1082, lineno=55, colno=21) value: 'tag' value: - + location: SourceLocation(pos=1083, lineno=55, colno=22) end_location: SourceLocation(pos=1086, lineno=55, colno=25) value: 'foo' @@ -756,39 +756,39 @@ location: SourceLocation(pos=1253, lineno=69, colno=5) end_location: SourceLocation(pos=1288, lineno=73, colno=9) fragments: - + location: SourceLocation(pos=1253, lineno=69, colno=5) end_location: SourceLocation(pos=1256, lineno=69, colno=8) value: 'foo' - + location: SourceLocation(pos=1260, lineno=70, colno=4) end_location: SourceLocation(pos=1261, lineno=70, colno=5) value: ' ' - + location: SourceLocation(pos=1261, lineno=70, colno=5) end_location: SourceLocation(pos=1264, lineno=70, colno=8) value: 'bar' - + location: SourceLocation(pos=1268, lineno=71, colno=4) end_location: SourceLocation(pos=1269, lineno=71, colno=5) value: ' ' - + location: SourceLocation(pos=1269, lineno=71, colno=5) end_location: SourceLocation(pos=1274, lineno=71, colno=10) value: 'hello' - + location: SourceLocation(pos=1275, lineno=72, colno=1) end_location: SourceLocation(pos=1276, lineno=72, colno=2) value: ' ' - + location: SourceLocation(pos=1276, lineno=72, colno=2) end_location: SourceLocation(pos=1279, lineno=72, colno=5) value: 'wat' - + location: SourceLocation(pos=1283, lineno=73, colno=4) end_location: SourceLocation(pos=1284, lineno=73, colno=5) value: ' ' - + location: SourceLocation(pos=1284, lineno=73, colno=5) end_location: SourceLocation(pos=1288, lineno=73, colno=9) value: 'welp' @@ -801,23 +801,23 @@ location: SourceLocation(pos=1298, lineno=76, colno=5) end_location: SourceLocation(pos=1347, lineno=79, colno=17) fragments: - + location: SourceLocation(pos=1298, lineno=76, colno=5) end_location: SourceLocation(pos=1302, lineno=76, colno=9) value: 'this' - + location: SourceLocation(pos=1306, lineno=77, colno=4) end_location: SourceLocation(pos=1307, lineno=77, colno=5) value: ' ' - + location: SourceLocation(pos=1307, lineno=77, colno=5) end_location: SourceLocation(pos=1311, lineno=77, colno=9) value: 'is a' - + location: SourceLocation(pos=1334, lineno=79, colno=4) end_location: SourceLocation(pos=1335, lineno=79, colno=5) value: ' ' - + location: SourceLocation(pos=1335, lineno=79, colno=5) end_location: SourceLocation(pos=1347, lineno=79, colno=17) value: 'continuation' @@ -858,7 +858,7 @@ end_location: SourceLocation(pos=1611, lineno=95, colno=24) identifier: 'execute:as:targets:subcommand' arguments: - + location: SourceLocation(pos=1541, lineno=91, colno=16) end_location: SourceLocation(pos=1544, lineno=91, colno=19) value: 'foo' @@ -887,7 +887,7 @@ end_location: SourceLocation(pos=1606, lineno=95, colno=19) value: 'tag' value: - + location: SourceLocation(pos=1607, lineno=95, colno=20) end_location: SourceLocation(pos=1610, lineno=95, colno=23) value: 'bar' @@ -900,7 +900,7 @@ location: SourceLocation(pos=1629, lineno=97, colno=17) end_location: SourceLocation(pos=1634, lineno=97, colno=22) fragments: - + location: SourceLocation(pos=1629, lineno=97, colno=17) end_location: SourceLocation(pos=1634, lineno=97, colno=22) value: 'hello' @@ -934,7 +934,7 @@ location: SourceLocation(pos=1706, lineno=101, colno=17) end_location: SourceLocation(pos=1709, lineno=101, colno=20) fragments: - + location: SourceLocation(pos=1706, lineno=101, colno=17) end_location: SourceLocation(pos=1709, lineno=101, colno=20) value: 'foo' @@ -952,11 +952,11 @@ end_location: SourceLocation(pos=1809, lineno=105, colno=39) identifier: 'scoreboard:players:set:targets:objective:score' arguments: - + location: SourceLocation(pos=1794, lineno=105, colno=24) end_location: SourceLocation(pos=1800, lineno=105, colno=30) value: '#index' - + location: SourceLocation(pos=1801, lineno=105, colno=31) end_location: SourceLocation(pos=1807, lineno=105, colno=37) value: 'global' @@ -969,11 +969,11 @@ end_location: SourceLocation(pos=1848, lineno=106, colno=39) identifier: 'scoreboard:players:set:targets:objective:score' arguments: - + location: SourceLocation(pos=1833, lineno=106, colno=24) end_location: SourceLocation(pos=1839, lineno=106, colno=30) value: '$index' - + location: SourceLocation(pos=1840, lineno=106, colno=31) end_location: SourceLocation(pos=1846, lineno=106, colno=37) value: 'global' @@ -986,23 +986,23 @@ end_location: SourceLocation(pos=1927, lineno=107, colno=79) identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' arguments: - + location: SourceLocation(pos=1878, lineno=107, colno=30) end_location: SourceLocation(pos=1896, lineno=107, colno=48) value: '#sie_1_flags_delta' - + location: SourceLocation(pos=1897, lineno=107, colno=49) end_location: SourceLocation(pos=1904, lineno=107, colno=56) value: 'integer' - + location: SourceLocation(pos=1905, lineno=107, colno=57) end_location: SourceLocation(pos=1906, lineno=107, colno=58) value: '=' - + location: SourceLocation(pos=1907, lineno=107, colno=59) end_location: SourceLocation(pos=1919, lineno=107, colno=71) value: '#sie_1_flags' - + location: SourceLocation(pos=1920, lineno=107, colno=72) end_location: SourceLocation(pos=1927, lineno=107, colno=79) value: 'integer' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/scripting__parse_100__0.txt b/packages/mecha/tests/snapshots/scripting__parse_100__0.txt index 9dea9998a..3af4d1c56 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_100__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_100__0.txt @@ -13,7 +13,7 @@ say hello location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) fragments: - + location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__0.txt b/packages/mecha/tests/snapshots/scripting__parse_101__0.txt index 0c3f4f26b..e0c9ec01d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__0.txt @@ -29,7 +29,7 @@ def wat() location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt index 1ede98196..58fc4d334 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt @@ -21,7 +21,7 @@ _mecha_refs[0] location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) value: 'hello' @@ -54,7 +54,7 @@ _mecha_refs[1] location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__0.txt b/packages/mecha/tests/snapshots/scripting__parse_102__0.txt index 899a7a3eb..1c57f3c2b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__0.txt @@ -3,7 +3,7 @@ tellraw @p a --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) commands: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt index e3661d8c8..0107d6714 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt @@ -51,7 +51,7 @@ _mecha_refs[2] _mecha_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) commands: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_117__0.txt b/packages/mecha/tests/snapshots/scripting__parse_117__0.txt index 9ee052bea..0b9dabfef 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_117__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_117__0.txt @@ -40,7 +40,7 @@ if score @s tmp matches (x, None) say wat variable: 's' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=13) end_location: SourceLocation(pos=21, lineno=2, colno=16) value: 'tmp' @@ -75,7 +75,7 @@ if score @s tmp matches (x, None) say wat location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) fragments: - + location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt index 0b433f603..ff106cc85 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt @@ -37,7 +37,7 @@ _mecha_refs[1] arguments: _mecha_refs[2] - + location: SourceLocation(pos=18, lineno=2, colno=13) end_location: SourceLocation(pos=21, lineno=2, colno=16) value: 'tmp' @@ -56,7 +56,7 @@ _mecha_refs[3] location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) fragments: - + location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) value: 'wat' @@ -72,7 +72,7 @@ _mecha_refs[4] variable: 's' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=13) end_location: SourceLocation(pos=21, lineno=2, colno=16) value: 'tmp' @@ -107,7 +107,7 @@ _mecha_refs[4] location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) fragments: - + location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) value: 'wat' @@ -128,7 +128,7 @@ _mecha_refs[5] variable: 's' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=13) end_location: SourceLocation(pos=21, lineno=2, colno=16) value: 'tmp' @@ -163,7 +163,7 @@ _mecha_refs[5] location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) fragments: - + location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) value: 'wat' @@ -207,7 +207,7 @@ _mecha_refs[6] variable: 's' arguments: - + location: SourceLocation(pos=18, lineno=2, colno=13) end_location: SourceLocation(pos=21, lineno=2, colno=16) value: 'tmp' @@ -242,7 +242,7 @@ _mecha_refs[6] location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) fragments: - + location: SourceLocation(pos=44, lineno=2, colno=39) end_location: SourceLocation(pos=47, lineno=2, colno=42) value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_127__0.txt b/packages/mecha/tests/snapshots/scripting__parse_127__0.txt index 1da1c6252..ea28a813b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_127__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_127__0.txt @@ -16,7 +16,7 @@ m.sin(1) is_tag: False namespace: None path: 'math' - + location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'm' diff --git a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt index 2e3eeb621..ba29118aa 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt @@ -29,7 +29,7 @@ _mecha_refs[0] is_tag: False namespace: None path: 'math' - + location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'm' diff --git a/packages/mecha/tests/snapshots/scripting__parse_128__0.txt b/packages/mecha/tests/snapshots/scripting__parse_128__0.txt index d49ddbbe1..d8b0606e5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_128__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_128__0.txt @@ -21,7 +21,7 @@ say thing end_location: SourceLocation(pos=26, lineno=1, colno=27) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=26, lineno=1, colno=27) value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt index 8114cf6a0..52d3904a7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt @@ -58,7 +58,7 @@ _mecha_refs[2] end_location: SourceLocation(pos=26, lineno=1, colno=27) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=26, lineno=1, colno=27) value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__0.txt b/packages/mecha/tests/snapshots/scripting__parse_129__0.txt index 2a78021af..218a0351c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_129__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_129__0.txt @@ -37,7 +37,7 @@ say a end_location: SourceLocation(pos=38, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - + location: SourceLocation(pos=33, lineno=2, colno=26) end_location: SourceLocation(pos=34, lineno=2, colno=27) value: 'a' @@ -46,7 +46,7 @@ say a end_location: SourceLocation(pos=38, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - + location: SourceLocation(pos=35, lineno=2, colno=28) end_location: SourceLocation(pos=36, lineno=2, colno=29) value: 'b' @@ -55,7 +55,7 @@ say a end_location: SourceLocation(pos=38, lineno=2, colno=31) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=37, lineno=2, colno=30) end_location: SourceLocation(pos=38, lineno=2, colno=31) value: 'c' @@ -68,7 +68,7 @@ say a location: SourceLocation(pos=43, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=6) fragments: - + location: SourceLocation(pos=43, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=6) value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt index b4bc56a7a..1088b21b4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt @@ -20,7 +20,7 @@ _mecha_refs[0] location: SourceLocation(pos=43, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=6) fragments: - + location: SourceLocation(pos=43, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=6) value: 'a' @@ -60,7 +60,7 @@ _mecha_refs[1] end_location: SourceLocation(pos=38, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - + location: SourceLocation(pos=33, lineno=2, colno=26) end_location: SourceLocation(pos=34, lineno=2, colno=27) value: 'a' @@ -69,7 +69,7 @@ _mecha_refs[1] end_location: SourceLocation(pos=38, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - + location: SourceLocation(pos=35, lineno=2, colno=28) end_location: SourceLocation(pos=36, lineno=2, colno=29) value: 'b' @@ -78,7 +78,7 @@ _mecha_refs[1] end_location: SourceLocation(pos=38, lineno=2, colno=31) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=37, lineno=2, colno=30) end_location: SourceLocation(pos=38, lineno=2, colno=31) value: 'c' @@ -91,7 +91,7 @@ _mecha_refs[1] location: SourceLocation(pos=43, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=6) fragments: - + location: SourceLocation(pos=43, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=6) value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__0.txt b/packages/mecha/tests/snapshots/scripting__parse_130__0.txt index 96dd7ea19..b5fc4eff1 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_130__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_130__0.txt @@ -24,7 +24,7 @@ if score @s tmp matches 1.. if entity @p[tag=foo] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -53,7 +53,7 @@ if score @s tmp matches 1.. if entity @p[tag=foo] end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'tag' value: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' @@ -87,7 +87,7 @@ if score @s tmp matches 1.. if entity @p[tag=foo] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -109,7 +109,7 @@ if score @s tmp matches 1.. if entity @p[tag=foo] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt index 177cf445d..ce8fede20 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt @@ -25,7 +25,7 @@ _mecha_refs[0] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -43,7 +43,7 @@ _mecha_refs[1] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' @@ -74,7 +74,7 @@ _mecha_refs[2] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -96,7 +96,7 @@ _mecha_refs[2] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' @@ -131,7 +131,7 @@ _mecha_refs[3] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -153,7 +153,7 @@ _mecha_refs[3] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' @@ -173,7 +173,7 @@ _mecha_refs[4] end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'tag' value: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' @@ -198,7 +198,7 @@ _mecha_refs[5] end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'tag' value: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' @@ -232,7 +232,7 @@ _mecha_refs[5] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -254,7 +254,7 @@ _mecha_refs[5] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' @@ -266,7 +266,7 @@ _mecha_refs[6] arguments: _mecha_refs[7] - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -288,7 +288,7 @@ _mecha_refs[9] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -317,7 +317,7 @@ _mecha_refs[9] end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'tag' value: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' @@ -351,7 +351,7 @@ _mecha_refs[9] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -373,7 +373,7 @@ _mecha_refs[9] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' @@ -394,7 +394,7 @@ _mecha_refs[10] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -423,7 +423,7 @@ _mecha_refs[10] end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'tag' value: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' @@ -457,7 +457,7 @@ _mecha_refs[10] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -479,7 +479,7 @@ _mecha_refs[10] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' @@ -504,7 +504,7 @@ _mecha_refs[11] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -533,7 +533,7 @@ _mecha_refs[11] end_location: SourceLocation(pos=44, lineno=1, colno=45) value: 'tag' value: - + location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' @@ -567,7 +567,7 @@ _mecha_refs[11] location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) fragments: - + location: SourceLocation(pos=74, lineno=3, colno=13) end_location: SourceLocation(pos=76, lineno=3, colno=15) value: '42' @@ -589,7 +589,7 @@ _mecha_refs[11] location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) fragments: - + location: SourceLocation(pos=98, lineno=5, colno=13) end_location: SourceLocation(pos=100, lineno=5, colno=15) value: 'no' diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt index b613c6f21..fbdaabeed 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt @@ -31,7 +31,7 @@ else location: SourceLocation(pos=16, lineno=2, colno=9) end_location: SourceLocation(pos=21, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=16, lineno=2, colno=9) end_location: SourceLocation(pos=21, lineno=2, colno=14) value: 'hello' @@ -67,7 +67,7 @@ else location: SourceLocation(pos=49, lineno=4, colno=9) end_location: SourceLocation(pos=54, lineno=4, colno=14) fragments: - + location: SourceLocation(pos=49, lineno=4, colno=9) end_location: SourceLocation(pos=54, lineno=4, colno=14) value: 'hello' @@ -89,7 +89,7 @@ else location: SourceLocation(pos=68, lineno=6, colno=9) end_location: SourceLocation(pos=73, lineno=6, colno=14) fragments: - + location: SourceLocation(pos=68, lineno=6, colno=9) end_location: SourceLocation(pos=73, lineno=6, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt index 9ef742fd8..453b82a91 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -26,7 +26,7 @@ _mecha_refs[0] location: SourceLocation(pos=16, lineno=2, colno=9) end_location: SourceLocation(pos=21, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=16, lineno=2, colno=9) end_location: SourceLocation(pos=21, lineno=2, colno=14) value: 'hello' @@ -44,7 +44,7 @@ _mecha_refs[1] location: SourceLocation(pos=49, lineno=4, colno=9) end_location: SourceLocation(pos=54, lineno=4, colno=14) fragments: - + location: SourceLocation(pos=49, lineno=4, colno=9) end_location: SourceLocation(pos=54, lineno=4, colno=14) value: 'hello' @@ -62,7 +62,7 @@ _mecha_refs[2] location: SourceLocation(pos=68, lineno=6, colno=9) end_location: SourceLocation(pos=73, lineno=6, colno=14) fragments: - + location: SourceLocation(pos=68, lineno=6, colno=9) end_location: SourceLocation(pos=73, lineno=6, colno=14) value: 'hello' @@ -93,7 +93,7 @@ _mecha_refs[3] location: SourceLocation(pos=16, lineno=2, colno=9) end_location: SourceLocation(pos=21, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=16, lineno=2, colno=9) end_location: SourceLocation(pos=21, lineno=2, colno=14) value: 'hello' @@ -129,7 +129,7 @@ _mecha_refs[3] location: SourceLocation(pos=49, lineno=4, colno=9) end_location: SourceLocation(pos=54, lineno=4, colno=14) fragments: - + location: SourceLocation(pos=49, lineno=4, colno=9) end_location: SourceLocation(pos=54, lineno=4, colno=14) value: 'hello' @@ -151,7 +151,7 @@ _mecha_refs[3] location: SourceLocation(pos=68, lineno=6, colno=9) end_location: SourceLocation(pos=73, lineno=6, colno=14) fragments: - + location: SourceLocation(pos=68, lineno=6, colno=9) end_location: SourceLocation(pos=73, lineno=6, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt index 178afd3c1..2d124e92d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt @@ -27,7 +27,7 @@ while True location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt index 5fe96b586..e7f4a9653 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt @@ -21,7 +21,7 @@ _mecha_refs[0] location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) value: 'hello' @@ -52,7 +52,7 @@ _mecha_refs[1] location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt index f05ff1a3c..cc2b5f623 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -24,7 +24,7 @@ if score @s tmp matches 0 variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -73,7 +73,7 @@ if score @s tmp matches 0 location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -109,7 +109,7 @@ if score @s tmp matches 0 location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt index e23b1cf22..a0ae47cdc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt @@ -27,7 +27,7 @@ _mecha_refs[0] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -45,7 +45,7 @@ _mecha_refs[1] location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' @@ -86,7 +86,7 @@ _mecha_refs[2] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -122,7 +122,7 @@ _mecha_refs[2] location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' @@ -167,7 +167,7 @@ _mecha_refs[3] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -203,7 +203,7 @@ _mecha_refs[3] location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' @@ -215,7 +215,7 @@ _mecha_refs[4] arguments: _mecha_refs[5] - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -237,7 +237,7 @@ _mecha_refs[7] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -286,7 +286,7 @@ _mecha_refs[7] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -322,7 +322,7 @@ _mecha_refs[7] location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' @@ -343,7 +343,7 @@ _mecha_refs[8] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -392,7 +392,7 @@ _mecha_refs[8] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -428,7 +428,7 @@ _mecha_refs[8] location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' @@ -453,7 +453,7 @@ _mecha_refs[9] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -502,7 +502,7 @@ _mecha_refs[9] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -538,7 +538,7 @@ _mecha_refs[9] location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=104, lineno=5, colno=13) end_location: SourceLocation(pos=109, lineno=5, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt index 1242d60ac..27415024b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -22,7 +22,7 @@ if score @s tmp matches 0 variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -71,7 +71,7 @@ if score @s tmp matches 0 location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt index 46e2945bb..488569fbe 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt @@ -24,7 +24,7 @@ _mecha_refs[0] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -65,7 +65,7 @@ _mecha_refs[1] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -110,7 +110,7 @@ _mecha_refs[2] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -122,7 +122,7 @@ _mecha_refs[3] arguments: _mecha_refs[4] - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -144,7 +144,7 @@ _mecha_refs[6] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -193,7 +193,7 @@ _mecha_refs[6] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -214,7 +214,7 @@ _mecha_refs[7] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -263,7 +263,7 @@ _mecha_refs[7] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' @@ -288,7 +288,7 @@ _mecha_refs[8] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -337,7 +337,7 @@ _mecha_refs[8] location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=62, lineno=3, colno=13) end_location: SourceLocation(pos=67, lineno=3, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt index 32d399d3f..f2ce2987d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -24,7 +24,7 @@ if score @s tmp matches 0 variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -63,7 +63,7 @@ if score @s tmp matches 0 location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -89,7 +89,7 @@ if score @s tmp matches 0 location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt index 3bb7589af..c122a5deb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt @@ -25,7 +25,7 @@ _mecha_refs[0] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -43,7 +43,7 @@ _mecha_refs[1] location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' @@ -74,7 +74,7 @@ _mecha_refs[2] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -100,7 +100,7 @@ _mecha_refs[2] location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' @@ -135,7 +135,7 @@ _mecha_refs[3] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -161,7 +161,7 @@ _mecha_refs[3] location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' @@ -173,7 +173,7 @@ _mecha_refs[4] arguments: _mecha_refs[5] - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -195,7 +195,7 @@ _mecha_refs[7] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -234,7 +234,7 @@ _mecha_refs[7] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -260,7 +260,7 @@ _mecha_refs[7] location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' @@ -281,7 +281,7 @@ _mecha_refs[8] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -320,7 +320,7 @@ _mecha_refs[8] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -346,7 +346,7 @@ _mecha_refs[8] location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' @@ -371,7 +371,7 @@ _mecha_refs[9] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -410,7 +410,7 @@ _mecha_refs[9] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -436,7 +436,7 @@ _mecha_refs[9] location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) fragments: - + location: SourceLocation(pos=86, lineno=5, colno=13) end_location: SourceLocation(pos=91, lineno=5, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt index 68d3300a7..bce8173d5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -22,7 +22,7 @@ if score @s tmp matches 0 variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -61,7 +61,7 @@ if score @s tmp matches 0 location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt index 4cef23a97..2afc6ed8f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt @@ -23,7 +23,7 @@ _mecha_refs[0] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -54,7 +54,7 @@ _mecha_refs[1] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -89,7 +89,7 @@ _mecha_refs[2] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -101,7 +101,7 @@ _mecha_refs[3] arguments: _mecha_refs[4] - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -123,7 +123,7 @@ _mecha_refs[6] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -162,7 +162,7 @@ _mecha_refs[6] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -183,7 +183,7 @@ _mecha_refs[7] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -222,7 +222,7 @@ _mecha_refs[7] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' @@ -247,7 +247,7 @@ _mecha_refs[8] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -286,7 +286,7 @@ _mecha_refs[8] location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) fragments: - + location: SourceLocation(pos=53, lineno=3, colno=13) end_location: SourceLocation(pos=58, lineno=3, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index 3f2365ac0..ed8f6fec1 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -24,7 +24,7 @@ if score @s tmp matches 42 variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -92,7 +92,7 @@ if score @s tmp matches 42 location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt index 1792e220f..92ea81613 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt @@ -25,7 +25,7 @@ _mecha_refs[0] location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' @@ -85,7 +85,7 @@ _mecha_refs[1] location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' @@ -178,7 +178,7 @@ _mecha_refs[2] location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' @@ -219,7 +219,7 @@ _mecha_refs[3] arguments: _mecha_refs[4] - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -241,7 +241,7 @@ _mecha_refs[6] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -309,7 +309,7 @@ _mecha_refs[6] location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' @@ -359,7 +359,7 @@ _mecha_refs[7] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -427,7 +427,7 @@ _mecha_refs[7] location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' @@ -481,7 +481,7 @@ _mecha_refs[8] variable: 's' arguments: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' @@ -549,7 +549,7 @@ _mecha_refs[8] location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) fragments: - + location: SourceLocation(pos=74, lineno=4, colno=13) end_location: SourceLocation(pos=79, lineno=4, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt index b924c894b..b732952c7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt @@ -31,7 +31,7 @@ for c in "abc" location: SourceLocation(pos=23, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=18) fragments: - + location: SourceLocation(pos=23, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=18) value: 'something' diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt index 8368efe91..58926490d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt @@ -21,7 +21,7 @@ _mecha_refs[0] location: SourceLocation(pos=23, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=18) fragments: - + location: SourceLocation(pos=23, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=18) value: 'something' @@ -56,7 +56,7 @@ _mecha_refs[1] location: SourceLocation(pos=23, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=18) fragments: - + location: SourceLocation(pos=23, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=18) value: 'something' diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt index 3e564226d..9c32a0158 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt @@ -32,7 +32,7 @@ for i in "" location: SourceLocation(pos=20, lineno=2, colno=9) end_location: SourceLocation(pos=25, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=20, lineno=2, colno=9) end_location: SourceLocation(pos=25, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt index 6484078c1..d4fd1e286 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt @@ -18,7 +18,7 @@ _mecha_refs[0] location: SourceLocation(pos=20, lineno=2, colno=9) end_location: SourceLocation(pos=25, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=20, lineno=2, colno=9) end_location: SourceLocation(pos=25, lineno=2, colno=14) value: 'hello' @@ -53,7 +53,7 @@ _mecha_refs[1] location: SourceLocation(pos=20, lineno=2, colno=9) end_location: SourceLocation(pos=25, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=20, lineno=2, colno=9) end_location: SourceLocation(pos=25, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__0.txt b/packages/mecha/tests/snapshots/scripting__parse_70__0.txt index 1db6b5ce4..4715cdb13 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__0.txt @@ -30,7 +30,7 @@ foo() location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt index df16f8a22..d3832b124 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt @@ -24,7 +24,7 @@ _mecha_refs[0] location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) value: 'hello' @@ -57,7 +57,7 @@ _mecha_refs[1] location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) fragments: - + location: SourceLocation(pos=18, lineno=2, colno=9) end_location: SourceLocation(pos=23, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__0.txt b/packages/mecha/tests/snapshots/scripting__parse_72__0.txt index c13f2117e..7f2baeaf6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__0.txt @@ -69,7 +69,7 @@ def foo( location: SourceLocation(pos=50, lineno=6, colno=9) end_location: SourceLocation(pos=55, lineno=6, colno=14) fragments: - + location: SourceLocation(pos=50, lineno=6, colno=9) end_location: SourceLocation(pos=55, lineno=6, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt index 0c39ccbc8..795e9e261 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt @@ -32,7 +32,7 @@ _mecha_refs[0] location: SourceLocation(pos=50, lineno=6, colno=9) end_location: SourceLocation(pos=55, lineno=6, colno=14) fragments: - + location: SourceLocation(pos=50, lineno=6, colno=9) end_location: SourceLocation(pos=55, lineno=6, colno=14) value: 'hello' @@ -101,7 +101,7 @@ _mecha_refs[1] location: SourceLocation(pos=50, lineno=6, colno=9) end_location: SourceLocation(pos=55, lineno=6, colno=14) fragments: - + location: SourceLocation(pos=50, lineno=6, colno=9) end_location: SourceLocation(pos=55, lineno=6, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__0.txt b/packages/mecha/tests/snapshots/scripting__parse_77__0.txt index 93f3f7b91..97230d4f6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__0.txt @@ -62,7 +62,7 @@ def f(a, b=a) location: SourceLocation(pos=33, lineno=3, colno=9) end_location: SourceLocation(pos=36, lineno=3, colno=12) fragments: - + location: SourceLocation(pos=33, lineno=3, colno=9) end_location: SourceLocation(pos=36, lineno=3, colno=12) value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt index 1ac557cdd..48d28f1d4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt @@ -23,7 +23,7 @@ _mecha_refs[0] location: SourceLocation(pos=33, lineno=3, colno=9) end_location: SourceLocation(pos=36, lineno=3, colno=12) fragments: - + location: SourceLocation(pos=33, lineno=3, colno=9) end_location: SourceLocation(pos=36, lineno=3, colno=12) value: 'wat' @@ -88,7 +88,7 @@ _mecha_refs[1] location: SourceLocation(pos=33, lineno=3, colno=9) end_location: SourceLocation(pos=36, lineno=3, colno=12) fragments: - + location: SourceLocation(pos=33, lineno=3, colno=9) end_location: SourceLocation(pos=36, lineno=3, colno=12) value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__0.txt b/packages/mecha/tests/snapshots/scripting__parse_81__0.txt index f48929a9b..63faad507 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__0.txt @@ -60,31 +60,31 @@ def foo(something) location: SourceLocation(pos=57, lineno=4, colno=13) end_location: SourceLocation(pos=106, lineno=7, colno=16) fragments: - + location: SourceLocation(pos=57, lineno=4, colno=13) end_location: SourceLocation(pos=59, lineno=4, colno=15) value: 'yo' - + location: SourceLocation(pos=71, lineno=5, colno=12) end_location: SourceLocation(pos=72, lineno=5, colno=13) value: ' ' - + location: SourceLocation(pos=72, lineno=5, colno=13) end_location: SourceLocation(pos=75, lineno=5, colno=16) value: 'wat' - + location: SourceLocation(pos=87, lineno=6, colno=12) end_location: SourceLocation(pos=88, lineno=6, colno=13) value: ' ' - + location: SourceLocation(pos=88, lineno=6, colno=13) end_location: SourceLocation(pos=90, lineno=6, colno=15) value: 'is' - + location: SourceLocation(pos=102, lineno=7, colno=12) end_location: SourceLocation(pos=103, lineno=7, colno=13) value: ' ' - + location: SourceLocation(pos=103, lineno=7, colno=13) end_location: SourceLocation(pos=106, lineno=7, colno=16) value: 'dat' @@ -162,7 +162,7 @@ def foo(something) location: SourceLocation(pos=210, lineno=13, colno=13) end_location: SourceLocation(pos=213, lineno=13, colno=16) fragments: - + location: SourceLocation(pos=210, lineno=13, colno=13) end_location: SourceLocation(pos=213, lineno=13, colno=16) value: 'wow' diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt index aa4316f5f..a13a416cf 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt @@ -28,31 +28,31 @@ _mecha_refs[0] location: SourceLocation(pos=57, lineno=4, colno=13) end_location: SourceLocation(pos=106, lineno=7, colno=16) fragments: - + location: SourceLocation(pos=57, lineno=4, colno=13) end_location: SourceLocation(pos=59, lineno=4, colno=15) value: 'yo' - + location: SourceLocation(pos=71, lineno=5, colno=12) end_location: SourceLocation(pos=72, lineno=5, colno=13) value: ' ' - + location: SourceLocation(pos=72, lineno=5, colno=13) end_location: SourceLocation(pos=75, lineno=5, colno=16) value: 'wat' - + location: SourceLocation(pos=87, lineno=6, colno=12) end_location: SourceLocation(pos=88, lineno=6, colno=13) value: ' ' - + location: SourceLocation(pos=88, lineno=6, colno=13) end_location: SourceLocation(pos=90, lineno=6, colno=15) value: 'is' - + location: SourceLocation(pos=102, lineno=7, colno=12) end_location: SourceLocation(pos=103, lineno=7, colno=13) value: ' ' - + location: SourceLocation(pos=103, lineno=7, colno=13) end_location: SourceLocation(pos=106, lineno=7, colno=16) value: 'dat' @@ -66,7 +66,7 @@ _mecha_refs[1] location: SourceLocation(pos=210, lineno=13, colno=13) end_location: SourceLocation(pos=213, lineno=13, colno=16) fragments: - + location: SourceLocation(pos=210, lineno=13, colno=13) end_location: SourceLocation(pos=213, lineno=13, colno=16) value: 'wow' @@ -118,31 +118,31 @@ _mecha_refs[2] location: SourceLocation(pos=57, lineno=4, colno=13) end_location: SourceLocation(pos=106, lineno=7, colno=16) fragments: - + location: SourceLocation(pos=57, lineno=4, colno=13) end_location: SourceLocation(pos=59, lineno=4, colno=15) value: 'yo' - + location: SourceLocation(pos=71, lineno=5, colno=12) end_location: SourceLocation(pos=72, lineno=5, colno=13) value: ' ' - + location: SourceLocation(pos=72, lineno=5, colno=13) end_location: SourceLocation(pos=75, lineno=5, colno=16) value: 'wat' - + location: SourceLocation(pos=87, lineno=6, colno=12) end_location: SourceLocation(pos=88, lineno=6, colno=13) value: ' ' - + location: SourceLocation(pos=88, lineno=6, colno=13) end_location: SourceLocation(pos=90, lineno=6, colno=15) value: 'is' - + location: SourceLocation(pos=102, lineno=7, colno=12) end_location: SourceLocation(pos=103, lineno=7, colno=13) value: ' ' - + location: SourceLocation(pos=103, lineno=7, colno=13) end_location: SourceLocation(pos=106, lineno=7, colno=16) value: 'dat' @@ -220,7 +220,7 @@ _mecha_refs[2] location: SourceLocation(pos=210, lineno=13, colno=13) end_location: SourceLocation(pos=213, lineno=13, colno=16) fragments: - + location: SourceLocation(pos=210, lineno=13, colno=13) end_location: SourceLocation(pos=213, lineno=13, colno=16) value: 'wow' diff --git a/packages/mecha/tests/test_compile.py b/packages/mecha/tests/test_compile.py index 0b137ffbb..84509ee58 100644 --- a/packages/mecha/tests/test_compile.py +++ b/packages/mecha/tests/test_compile.py @@ -8,8 +8,8 @@ AstChildren, AstCommand, AstJsonValue, - AstLiteral, AstMessage, + AstMessageText, AstSelector, Diagnostic, DiagnosticCollection, @@ -33,7 +33,7 @@ def convert_say_to_tellraw(node: AstCommand): value="".join( f.value for f in message.fragments - if isinstance(f, AstLiteral) + if isinstance(f, AstMessageText) ) ), ], diff --git a/packages/mecha/tests/test_dispatch.py b/packages/mecha/tests/test_dispatch.py index 5c69bf433..a57308e63 100644 --- a/packages/mecha/tests/test_dispatch.py +++ b/packages/mecha/tests/test_dispatch.py @@ -4,8 +4,8 @@ AstCommand, AstCoordinate, AstDustParticleParameters, - AstLiteral, AstMessage, + AstMessageText, AstNode, AstNumber, AstParticle, @@ -100,7 +100,7 @@ def message(self, node: AstMessage) -> str: return "".join( fragment.value for fragment in node.fragments - if isinstance(fragment, AstLiteral) + if isinstance(fragment, AstMessageText) ) assert Foo().invoke(ast) == ["say:message('hello')", "say:message('world')"] From 28fe19f6cc49edae55ca7df36a0031ebd78940a7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Dec 2021 12:08:01 +0100 Subject: [PATCH 0547/1554] fix: shallow codegen snapshots --- packages/mecha/mecha/ast.py | 11 +- .../tests/snapshots/scripting__parse_0__1.txt | 8 - .../snapshots/scripting__parse_101__1.txt | 39 - .../snapshots/scripting__parse_102__1.txt | 53 - .../snapshots/scripting__parse_103__1.txt | 1024 ----------------- .../snapshots/scripting__parse_104__1.txt | 51 - .../snapshots/scripting__parse_105__1.txt | 10 - .../snapshots/scripting__parse_106__1.txt | 31 - .../snapshots/scripting__parse_107__1.txt | 31 - .../snapshots/scripting__parse_108__1.txt | 23 - .../snapshots/scripting__parse_109__1.txt | 23 - .../snapshots/scripting__parse_10__1.txt | 33 - .../snapshots/scripting__parse_110__1.txt | 13 - .../snapshots/scripting__parse_111__1.txt | 33 - .../snapshots/scripting__parse_112__1.txt | 20 - .../snapshots/scripting__parse_113__1.txt | 20 - .../snapshots/scripting__parse_114__1.txt | 20 - .../snapshots/scripting__parse_117__1.txt | 185 --- .../snapshots/scripting__parse_118__1.txt | 88 -- .../snapshots/scripting__parse_11__1.txt | 33 - .../snapshots/scripting__parse_120__1.txt | 20 - .../snapshots/scripting__parse_126__1.txt | 32 - .../snapshots/scripting__parse_127__1.txt | 36 - .../snapshots/scripting__parse_128__1.txt | 43 - .../snapshots/scripting__parse_129__1.txt | 71 -- .../snapshots/scripting__parse_12__1.txt | 43 - .../snapshots/scripting__parse_130__1.txt | 501 -------- .../snapshots/scripting__parse_13__1.txt | 38 - .../snapshots/scripting__parse_14__1.txt | 38 - .../snapshots/scripting__parse_15__1.txt | 28 - .../snapshots/scripting__parse_16__1.txt | 148 --- .../snapshots/scripting__parse_17__1.txt | 233 ---- .../tests/snapshots/scripting__parse_1__1.txt | 8 - .../snapshots/scripting__parse_20__1.txt | 28 - .../snapshots/scripting__parse_21__1.txt | 8 - .../snapshots/scripting__parse_22__1.txt | 8 - .../snapshots/scripting__parse_23__1.txt | 8 - .../snapshots/scripting__parse_24__1.txt | 8 - .../snapshots/scripting__parse_25__1.txt | 8 - .../snapshots/scripting__parse_26__1.txt | 8 - .../snapshots/scripting__parse_29__1.txt | 8 - .../tests/snapshots/scripting__parse_2__1.txt | 8 - .../snapshots/scripting__parse_32__1.txt | 26 - .../snapshots/scripting__parse_33__1.txt | 36 - .../snapshots/scripting__parse_34__1.txt | 59 - .../snapshots/scripting__parse_35__1.txt | 117 -- .../tests/snapshots/scripting__parse_3__1.txt | 8 - .../snapshots/scripting__parse_41__1.txt | 37 - .../snapshots/scripting__parse_42__1.txt | 463 -------- .../snapshots/scripting__parse_43__1.txt | 272 ----- .../snapshots/scripting__parse_44__1.txt | 363 ------ .../snapshots/scripting__parse_45__1.txt | 222 ---- .../snapshots/scripting__parse_46__1.txt | 506 -------- .../snapshots/scripting__parse_47__1.txt | 28 - .../snapshots/scripting__parse_49__1.txt | 28 - .../tests/snapshots/scripting__parse_4__1.txt | 8 - .../snapshots/scripting__parse_50__1.txt | 36 - .../snapshots/scripting__parse_51__1.txt | 41 - .../snapshots/scripting__parse_53__1.txt | 36 - .../snapshots/scripting__parse_55__1.txt | 35 - .../snapshots/scripting__parse_57__1.txt | 36 - .../tests/snapshots/scripting__parse_5__1.txt | 18 - .../snapshots/scripting__parse_62__1.txt | 42 - .../snapshots/scripting__parse_63__1.txt | 18 - .../snapshots/scripting__parse_64__1.txt | 45 - .../snapshots/scripting__parse_65__1.txt | 13 - .../snapshots/scripting__parse_66__1.txt | 18 - .../snapshots/scripting__parse_67__1.txt | 28 - .../snapshots/scripting__parse_68__1.txt | 74 -- .../snapshots/scripting__parse_69__1.txt | 25 - .../tests/snapshots/scripting__parse_6__1.txt | 18 - .../snapshots/scripting__parse_70__1.txt | 53 - .../snapshots/scripting__parse_71__1.txt | 59 - .../snapshots/scripting__parse_72__1.txt | 75 -- .../snapshots/scripting__parse_77__1.txt | 66 -- .../tests/snapshots/scripting__parse_7__1.txt | 28 - .../snapshots/scripting__parse_81__1.txt | 201 ---- .../snapshots/scripting__parse_82__1.txt | 102 -- .../snapshots/scripting__parse_84__1.txt | 20 - .../snapshots/scripting__parse_87__1.txt | 57 - .../snapshots/scripting__parse_89__1.txt | 71 -- .../tests/snapshots/scripting__parse_8__1.txt | 28 - .../snapshots/scripting__parse_91__1.txt | 21 - .../snapshots/scripting__parse_92__1.txt | 39 - .../snapshots/scripting__parse_93__1.txt | 39 - .../snapshots/scripting__parse_94__1.txt | 73 -- .../snapshots/scripting__parse_95__1.txt | 135 --- .../snapshots/scripting__parse_96__1.txt | 135 --- .../snapshots/scripting__parse_97__1.txt | 75 -- .../tests/snapshots/scripting__parse_9__1.txt | 23 - packages/mecha/tests/test_scripting.py | 2 +- 91 files changed, 9 insertions(+), 7029 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 04316e1f8..f8bb6953b 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -136,14 +136,19 @@ def walk(self) -> Iterator["AstNode"]: elif isinstance(attribute, AstNode): yield from attribute.walk() - def dump(self, prefix: str = "") -> str: + def dump(self, prefix: str = "", shallow: bool = False) -> str: """Return a pretty-printed representation of the ast.""" return f"{prefix}{self.__class__}\n" + "\n".join( f"{prefix} {f.name}:" + ( - "\n" + ("\n".join(child.dump(prefix + " ") for child in attribute) if attribute else prefix + " ") # type: ignore + "\n" + ("\n".join((f"{prefix} {type(child)}" if shallow else child.dump(prefix + " ")) for child in attribute) if attribute else prefix + " ") # type: ignore if isinstance(attribute := getattr(self, f.name), AstChildren) - else "\n" + attribute.dump(prefix + " ") + else "\n" + + ( + f"{prefix} {type(attribute)}" + if shallow + else attribute.dump(prefix + " ") + ) if isinstance(attribute, AstNode) else f" {attribute!r}" ) diff --git a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt index 824ad16e7..803dfc315 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_0__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_0__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=2, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt index 58fc4d334..6ebe62e04 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt @@ -13,48 +13,9 @@ _mecha_refs[0] end_location: SourceLocation(pos=23, lineno=2, colno=14) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=23, lineno=2, colno=14) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'wat' - arguments: - - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt index 0107d6714..13ef5c733 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_102__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_102__1.txt @@ -17,9 +17,6 @@ _mecha_refs[0] converter: 'json' value: - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - value: 'a' _mecha_refs[1] location: SourceLocation(pos=15, lineno=2, colno=9) @@ -34,61 +31,11 @@ _mecha_refs[2] identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=15, lineno=2, colno=9) - end_location: SourceLocation(pos=17, lineno=2, colno=11) - variable: 'p' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - converter: 'json' - value: - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - value: 'a' _mecha_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=2, colno=13) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: '' - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - identifier: 'tellraw:targets:message' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=9) - end_location: SourceLocation(pos=17, lineno=2, colno=11) - variable: 'p' - arguments: - - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - converter: 'json' - value: - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt index 442922616..a66e3fdbd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt @@ -17,252 +17,51 @@ _mecha_refs[0] converter: 'nbt' value: - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' _mecha_refs[1] location: SourceLocation(pos=115, lineno=4, colno=9) end_location: SourceLocation(pos=124, lineno=4, colno=18) key: - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' value: - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' _mecha_refs[2] location: SourceLocation(pos=134, lineno=5, colno=9) end_location: SourceLocation(pos=202, lineno=7, colno=10) key: - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' value: - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[3] location: SourceLocation(pos=105, lineno=3, colno=14) end_location: SourceLocation(pos=208, lineno=8, colno=6) entries: - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[4] location: SourceLocation(pos=96, lineno=3, colno=5) end_location: SourceLocation(pos=208, lineno=8, colno=6) key: - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' value: - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[5] location: SourceLocation(pos=90, lineno=2, colno=49) end_location: SourceLocation(pos=210, lineno=9, colno=2) entries: - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[6] location: SourceLocation(pos=85, lineno=2, colno=44) end_location: SourceLocation(pos=210, lineno=9, colno=2) identifier: - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' data_tags: - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[7] location: SourceLocation(pos=82, lineno=2, colno=41) @@ -277,74 +76,7 @@ _mecha_refs[8] identifier: 'give:targets:item' arguments: - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[9] location: SourceLocation(pos=77, lineno=2, colno=36) @@ -352,112 +84,22 @@ _mecha_refs[9] identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[10] location: SourceLocation(pos=63, lineno=2, colno=22) end_location: SourceLocation(pos=70, lineno=2, colno=29) x: - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 y: - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 z: - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 _mecha_refs[11] location: SourceLocation(pos=71, lineno=2, colno=30) end_location: SourceLocation(pos=76, lineno=2, colno=35) identifier: - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' block_states: data_tags: None @@ -468,118 +110,8 @@ _mecha_refs[12] identifier: 'execute:if:block:pos:block:subcommand' arguments: - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 - z: - - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' - block_states: - - data_tags: None - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[13] location: SourceLocation(pos=51, lineno=2, colno=10) @@ -594,129 +126,7 @@ _mecha_refs[14] identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=51, lineno=2, colno=10) - end_location: SourceLocation(pos=53, lineno=2, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=54, lineno=2, colno=13) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 - z: - - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' - block_states: - - data_tags: None - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[15] location: SourceLocation(pos=45, lineno=2, colno=4) @@ -731,140 +141,7 @@ _mecha_refs[16] identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=45, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=6) - variable: 'a' - arguments: - - location: SourceLocation(pos=48, lineno=2, colno=7) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:at:targets:subcommand' - arguments: - - location: SourceLocation(pos=51, lineno=2, colno=10) - end_location: SourceLocation(pos=53, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=54, lineno=2, colno=13) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 - z: - - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' - block_states: - - data_tags: None - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[17] location: SourceLocation(pos=42, lineno=2, colno=1) @@ -872,311 +149,10 @@ _mecha_refs[17] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:as:targets:subcommand' - arguments: - - location: SourceLocation(pos=45, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=6) - variable: 'a' - arguments: - - - location: SourceLocation(pos=48, lineno=2, colno=7) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:at:targets:subcommand' - arguments: - - location: SourceLocation(pos=51, lineno=2, colno=10) - end_location: SourceLocation(pos=53, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=54, lineno=2, colno=13) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 - z: - - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' - block_states: - - data_tags: None - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') _mecha_refs[18] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=211, lineno=10, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=1, colno=42) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=1, colno=42) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=41, lineno=1, colno=42) - value: '[{"text": "Hello", "bold": true}]' - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:as:targets:subcommand' - arguments: - - location: SourceLocation(pos=45, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=6) - variable: 'a' - arguments: - - - location: SourceLocation(pos=48, lineno=2, colno=7) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:at:targets:subcommand' - arguments: - - location: SourceLocation(pos=51, lineno=2, colno=10) - end_location: SourceLocation(pos=53, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=54, lineno=2, colno=13) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 - z: - - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' - block_states: - - data_tags: None - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') diff --git a/packages/mecha/tests/snapshots/scripting__parse_104__1.txt b/packages/mecha/tests/snapshots/scripting__parse_104__1.txt index d3a31f58c..589831d8c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_104__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_104__1.txt @@ -17,54 +17,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=35, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'thing' - value: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - operator: '+' - left: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: '+' - left: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - items: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 1 - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - value: 'hey' - right: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - items: - - right: - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - items: - - location: SourceLocation(pos=27, lineno=1, colno=28) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - value: 'wow' diff --git a/packages/mecha/tests/snapshots/scripting__parse_105__1.txt b/packages/mecha/tests/snapshots/scripting__parse_105__1.txt index c22c58150..6aadfad26 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_105__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_105__1.txt @@ -13,13 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=9, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - fmt: 'hello' - values: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_106__1.txt b/packages/mecha/tests/snapshots/scripting__parse_106__1.txt index e94cad974..bd26780fd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_106__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_106__1.txt @@ -15,35 +15,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=29, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'world' - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=15) - fmt: 'hello {}' - values: - - location: SourceLocation(pos=23, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=13) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_107__1.txt b/packages/mecha/tests/snapshots/scripting__parse_107__1.txt index a79b9d8ea..1a8effbb2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_107__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_107__1.txt @@ -15,35 +15,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=31, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'world' - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=30, lineno=2, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=30, lineno=2, colno=17) - fmt: 'hello {!r}' - values: - - location: SourceLocation(pos=23, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=13) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_108__1.txt b/packages/mecha/tests/snapshots/scripting__parse_108__1.txt index 81ffbd7e4..5754a3a2b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_108__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_108__1.txt @@ -14,26 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=17, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - fmt: 'hello {}' - values: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '+' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 1 - right: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_109__1.txt b/packages/mecha/tests/snapshots/scripting__parse_109__1.txt index bdaea1357..a00fad138 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_109__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_109__1.txt @@ -14,26 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=20, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - fmt: 'hello {:03}' - values: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '+' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 1 - right: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt index 9819a5afb..d754b3fbb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_10__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_10__1.txt @@ -15,36 +15,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=13, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 2 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '*' - left: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '-' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 54 - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 10 diff --git a/packages/mecha/tests/snapshots/scripting__parse_110__1.txt b/packages/mecha/tests/snapshots/scripting__parse_110__1.txt index a12404137..d88941b2b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_110__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_110__1.txt @@ -13,16 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=15, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - fmt: '{{}}nope{}' - values: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_111__1.txt b/packages/mecha/tests/snapshots/scripting__parse_111__1.txt index a0eb6ba59..13ef5c558 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_111__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_111__1.txt @@ -15,36 +15,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=37, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=1, colno=37) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=1, colno=37) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=36, lineno=1, colno=37) - fmt: '{{{}}}' - values: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - fmt: '{{{}}}' - values: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - fmt: '{{{:08}}}' - values: - - location: SourceLocation(pos=20, lineno=1, colno=21) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_112__1.txt b/packages/mecha/tests/snapshots/scripting__parse_112__1.txt index 8679c1917..06070481e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_112__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_112__1.txt @@ -13,23 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=9, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - fmt: '' - values: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_113__1.txt b/packages/mecha/tests/snapshots/scripting__parse_113__1.txt index 2ab1cb0d4..b55f422e3 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_113__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_113__1.txt @@ -13,23 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=11, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - fmt: '"' - values: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_114__1.txt b/packages/mecha/tests/snapshots/scripting__parse_114__1.txt index bc1bb7057..43e990ecc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_114__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_114__1.txt @@ -13,23 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=11, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - fmt: '\\' - values: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt index ff106cc85..53cd3c9ff 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_117__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_117__1.txt @@ -18,17 +18,6 @@ _mecha_refs[0] converter: 'range' value: - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - items: - - location: SourceLocation(pos=31, lineno=2, colno=26) - end_location: SourceLocation(pos=32, lineno=2, colno=27) - value: 'x' - - location: SourceLocation(pos=34, lineno=2, colno=29) - end_location: SourceLocation(pos=38, lineno=2, colno=33) - value: None _mecha_refs[1] location: SourceLocation(pos=15, lineno=2, colno=10) @@ -48,18 +37,6 @@ _mecha_refs[3] identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - fragments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - value: 'wat' _mecha_refs[4] location: SourceLocation(pos=6, lineno=2, colno=1) @@ -67,50 +44,9 @@ _mecha_refs[4] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=17, lineno=2, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - value: 'tmp' - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - converter: 'range' - value: - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - items: - - location: SourceLocation(pos=31, lineno=2, colno=26) - end_location: SourceLocation(pos=32, lineno=2, colno=27) - value: 'x' - - location: SourceLocation(pos=34, lineno=2, colno=29) - end_location: SourceLocation(pos=38, lineno=2, colno=33) - value: None - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - fragments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - value: 'wat' _mecha_refs[5] location: SourceLocation(pos=6, lineno=2, colno=1) @@ -118,131 +54,10 @@ _mecha_refs[5] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=17, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=18, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - value: 'tmp' - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - converter: 'range' - value: - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - items: - - location: SourceLocation(pos=31, lineno=2, colno=26) - end_location: SourceLocation(pos=32, lineno=2, colno=27) - value: 'x' - - location: SourceLocation(pos=34, lineno=2, colno=29) - end_location: SourceLocation(pos=38, lineno=2, colno=33) - value: None - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - fragments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - value: 'wat' _mecha_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=47, lineno=2, colno=42) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'x' - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 8 - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=17, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=18, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - value: 'tmp' - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - converter: 'range' - value: - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - items: - - location: SourceLocation(pos=31, lineno=2, colno=26) - end_location: SourceLocation(pos=32, lineno=2, colno=27) - value: 'x' - - location: SourceLocation(pos=34, lineno=2, colno=29) - end_location: SourceLocation(pos=38, lineno=2, colno=33) - value: None - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - fragments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt index f3f234b91..361bad115 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt @@ -23,9 +23,6 @@ _mecha_refs[0] converter: 'message' value: - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - value: 'i' _mecha_refs[1] location: SourceLocation(pos=61, lineno=6, colno=5) @@ -33,95 +30,10 @@ _mecha_refs[1] identifier: 'say:message' arguments: - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - converter: 'message' - value: - - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - value: 'i' _mecha_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=7, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=43, lineno=4, colno=12) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=43, lineno=4, colno=12) - commands: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=12) - identifier: 'yield:value' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=11) - end_location: SourceLocation(pos=19, lineno=2, colno=12) - value: 1 - - location: SourceLocation(pos=24, lineno=3, colno=5) - end_location: SourceLocation(pos=31, lineno=3, colno=12) - identifier: 'yield:value' - arguments: - - location: SourceLocation(pos=30, lineno=3, colno=11) - end_location: SourceLocation(pos=31, lineno=3, colno=12) - value: 2 - - location: SourceLocation(pos=36, lineno=4, colno=5) - end_location: SourceLocation(pos=43, lineno=4, colno=12) - identifier: 'yield:value' - arguments: - - location: SourceLocation(pos=42, lineno=4, colno=11) - end_location: SourceLocation(pos=43, lineno=4, colno=12) - value: 3 - location: SourceLocation(pos=44, lineno=5, colno=1) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=48, lineno=5, colno=5) - end_location: SourceLocation(pos=49, lineno=5, colno=6) - value: 'i' - - location: SourceLocation(pos=53, lineno=5, colno=10) - end_location: SourceLocation(pos=56, lineno=5, colno=13) - value: - - location: SourceLocation(pos=53, lineno=5, colno=10) - end_location: SourceLocation(pos=54, lineno=5, colno=11) - value: 'f' - arguments: - - - location: SourceLocation(pos=61, lineno=6, colno=5) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - commands: - - location: SourceLocation(pos=61, lineno=6, colno=5) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - converter: 'message' - value: - - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) - value: 'i' diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt index 8258b8c68..40d3ec6d5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_11__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_11__1.txt @@ -15,36 +15,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=15, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '*' - left: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '+' - left: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 2 - right: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '-' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 54 - right: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 10 diff --git a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt index d01c95d71..b26024e4c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt @@ -13,23 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=17, lineno=2, colno=10) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - identifier: 'yield' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_126__1.txt b/packages/mecha/tests/snapshots/scripting__parse_126__1.txt index 416173321..ff04642db 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_126__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_126__1.txt @@ -19,36 +19,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=24, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - identifier: 'import:module' - arguments: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - is_tag: False - namespace: None - path: 'math' - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=12) - value: - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=9) - name: 'sin' - value: - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=5) - value: 'math' - arguments: - - location: SourceLocation(pos=21, lineno=2, colno=10) - end_location: SourceLocation(pos=22, lineno=2, colno=11) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt index ba29118aa..2ede71a89 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_127__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_127__1.txt @@ -19,40 +19,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=26, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'import:module:as:alias' - arguments: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - is_tag: False - namespace: None - path: 'math' - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'm' - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=9) - value: - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=22, lineno=2, colno=6) - name: 'sin' - value: - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=18, lineno=2, colno=2) - value: 'm' - arguments: - - location: SourceLocation(pos=23, lineno=2, colno=7) - end_location: SourceLocation(pos=24, lineno=2, colno=8) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt index 52d3904a7..312c76946 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_128__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_128__1.txt @@ -19,9 +19,6 @@ _mecha_refs[0] converter: 'message' value: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'thing' _mecha_refs[1] location: SourceLocation(pos=27, lineno=2, colno=1) @@ -29,50 +26,10 @@ _mecha_refs[1] identifier: 'say:message' arguments: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - converter: 'message' - value: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'thing' _mecha_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'from:module:import:subcommand' - arguments: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - is_tag: False - namespace: 'demo' - path: 'foo' - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: 'thing' - location: SourceLocation(pos=27, lineno=2, colno=1) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - converter: 'message' - value: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt index 1088b21b4..9f797c6e0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt @@ -17,81 +17,10 @@ _mecha_refs[0] identifier: 'say:message' arguments: - location: SourceLocation(pos=43, lineno=3, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=6) - fragments: - - location: SourceLocation(pos=43, lineno=3, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=6) - value: 'a' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=44, lineno=3, colno=6) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - commands: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - identifier: 'from:module:import:subcommand' - arguments: - - location: SourceLocation(pos=17, lineno=2, colno=10) - end_location: SourceLocation(pos=25, lineno=2, colno=18) - is_tag: False - namespace: 'demo' - path: 'foo' - - location: SourceLocation(pos=33, lineno=2, colno=26) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - identifier: 'from:module:import:name:subcommand' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=26) - end_location: SourceLocation(pos=34, lineno=2, colno=27) - value: 'a' - - location: SourceLocation(pos=35, lineno=2, colno=28) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - identifier: 'from:module:import:name:subcommand' - arguments: - - location: SourceLocation(pos=35, lineno=2, colno=28) - end_location: SourceLocation(pos=36, lineno=2, colno=29) - value: 'b' - - location: SourceLocation(pos=37, lineno=2, colno=30) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=37, lineno=2, colno=30) - end_location: SourceLocation(pos=38, lineno=2, colno=31) - value: 'c' - location: SourceLocation(pos=39, lineno=3, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=6) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=43, lineno=3, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=6) - fragments: - - location: SourceLocation(pos=43, lineno=3, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=6) - value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt index 2cda732e6..9484b2d33 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_12__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_12__1.txt @@ -18,46 +18,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=11, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - value: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - value: - - location: SourceLocation(pos=2, lineno=1, colno=3) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - value: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 64 - right: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - value: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - value: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 64 diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt index ce8fede20..27d0e6b50 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt @@ -17,146 +17,25 @@ _mecha_refs[0] end_location: SourceLocation(pos=76, lineno=3, colno=15) commands: - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' _mecha_refs[1] location: SourceLocation(pos=94, lineno=5, colno=9) end_location: SourceLocation(pos=100, lineno=5, colno=15) commands: - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' _mecha_refs[2] location: SourceLocation(pos=54, lineno=2, colno=5) end_location: SourceLocation(pos=100, lineno=5, colno=15) commands: - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' _mecha_refs[3] location: SourceLocation(pos=54, lineno=2, colno=5) end_location: SourceLocation(pos=100, lineno=5, colno=15) root: - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' - - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' _mecha_refs[4] location: SourceLocation(pos=38, lineno=1, colno=39) @@ -164,19 +43,6 @@ _mecha_refs[4] variable: 'p' arguments: - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - inverted: False - key: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'tag' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'foo' _mecha_refs[5] location: SourceLocation(pos=28, lineno=1, colno=29) @@ -184,80 +50,7 @@ _mecha_refs[5] identifier: 'execute:if:entity:entities:subcommand' arguments: - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=49, lineno=1, colno=50) - variable: 'p' - arguments: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - inverted: False - key: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'tag' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'foo' - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - root: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' - - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' _mecha_refs[6] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -283,100 +76,9 @@ _mecha_refs[9] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - min: 1 - max: None - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'execute:if:entity:entities:subcommand' - arguments: - - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=49, lineno=1, colno=50) - variable: 'p' - arguments: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - inverted: False - key: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'tag' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'foo' - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - root: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' - - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' _mecha_refs[10] location: SourceLocation(pos=0, lineno=1, colno=1) @@ -384,212 +86,9 @@ _mecha_refs[10] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - min: 1 - max: None - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'execute:if:entity:entities:subcommand' - arguments: - - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=49, lineno=1, colno=50) - variable: 'p' - arguments: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - inverted: False - key: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'tag' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'foo' - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - root: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' - - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' _mecha_refs[11] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=100, lineno=5, colno=15) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - min: 1 - max: None - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'execute:if:entity:entities:subcommand' - arguments: - - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=49, lineno=1, colno=50) - variable: 'p' - arguments: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - inverted: False - key: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'tag' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'foo' - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - root: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) - value: '42' - - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - value: 'no' diff --git a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt index 5d6496692..f2f599a43 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_13__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_13__1.txt @@ -15,41 +15,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=14, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '*' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - operator: '/' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '*' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 - right: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 3 - right: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 4 diff --git a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt index b9d95c15a..4d5b33561 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_14__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_14__1.txt @@ -15,41 +15,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=16, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '/' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '*' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 - right: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '*' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 3 - right: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 4 diff --git a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt index f3b8d946f..449f2e435 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_15__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_15__1.txt @@ -14,31 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=12, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - operator: '%' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '//' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 16 - right: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 5 - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt index f14238a89..8ab1720ed 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_16__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_16__1.txt @@ -27,151 +27,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=67, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=66, lineno=1, colno=67) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=66, lineno=1, colno=67) - operator: '|' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=61, lineno=1, colno=62) - operator: '^' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=56, lineno=1, colno=57) - operator: '&' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - operator: '>>' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=45, lineno=1, colno=46) - operator: '<<' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '-' - value: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '**' - left: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 2 - right: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 3 - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - operator: '%' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: '/' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - operator: '//' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - operator: '*' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '~' - value: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 4 - right: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 5 - right: - - location: SourceLocation(pos=20, lineno=1, colno=21) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: 6 - right: - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 7 - right: - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - value: 9 - right: - - location: SourceLocation(pos=32, lineno=1, colno=33) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - value: 10 - right: - - location: SourceLocation(pos=37, lineno=1, colno=38) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - value: 11 - right: - - location: SourceLocation(pos=43, lineno=1, colno=44) - end_location: SourceLocation(pos=45, lineno=1, colno=46) - value: 12 - right: - - location: SourceLocation(pos=49, lineno=1, colno=50) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - value: 13 - right: - - location: SourceLocation(pos=54, lineno=1, colno=55) - end_location: SourceLocation(pos=56, lineno=1, colno=57) - value: 14 - right: - - location: SourceLocation(pos=59, lineno=1, colno=60) - end_location: SourceLocation(pos=61, lineno=1, colno=62) - value: 15 - right: - - location: SourceLocation(pos=64, lineno=1, colno=65) - end_location: SourceLocation(pos=66, lineno=1, colno=67) - value: 16 diff --git a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt index 2745c193a..c2550f651 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_17__1.txt @@ -35,236 +35,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=152, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - operator: 'or' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - operator: 'or' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: 'or' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: False - right: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: 'and' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: True - right: - - location: SourceLocation(pos=18, lineno=1, colno=19) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 'hello' - right: - - location: SourceLocation(pos=29, lineno=1, colno=30) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - operator: 'not' - value: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: 'foo' - right: - - location: SourceLocation(pos=42, lineno=1, colno=43) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - value: 'bar' - right: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=136, lineno=1, colno=137) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=125, lineno=1, colno=126) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=110, lineno=1, colno=111) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=99, lineno=1, colno=100) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=88, lineno=1, colno=89) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=78, lineno=1, colno=79) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - operator: '!=' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=52, lineno=1, colno=53) - value: 1 - right: - - location: SourceLocation(pos=56, lineno=1, colno=57) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - value: 2 - right: - - location: SourceLocation(pos=62, lineno=1, colno=63) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - operator: '<' - left: - - location: SourceLocation(pos=62, lineno=1, colno=63) - end_location: SourceLocation(pos=63, lineno=1, colno=64) - value: 1 - right: - - location: SourceLocation(pos=66, lineno=1, colno=67) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - value: 2 - right: - - location: SourceLocation(pos=72, lineno=1, colno=73) - end_location: SourceLocation(pos=78, lineno=1, colno=79) - operator: '<=' - left: - - location: SourceLocation(pos=72, lineno=1, colno=73) - end_location: SourceLocation(pos=73, lineno=1, colno=74) - value: 2 - right: - - location: SourceLocation(pos=77, lineno=1, colno=78) - end_location: SourceLocation(pos=78, lineno=1, colno=79) - value: 3 - right: - - location: SourceLocation(pos=83, lineno=1, colno=84) - end_location: SourceLocation(pos=88, lineno=1, colno=89) - operator: '>' - left: - - location: SourceLocation(pos=83, lineno=1, colno=84) - end_location: SourceLocation(pos=84, lineno=1, colno=85) - value: 5 - right: - - location: SourceLocation(pos=87, lineno=1, colno=88) - end_location: SourceLocation(pos=88, lineno=1, colno=89) - value: 4 - right: - - location: SourceLocation(pos=93, lineno=1, colno=94) - end_location: SourceLocation(pos=99, lineno=1, colno=100) - operator: '>=' - left: - - location: SourceLocation(pos=93, lineno=1, colno=94) - end_location: SourceLocation(pos=94, lineno=1, colno=95) - value: 6 - right: - - location: SourceLocation(pos=98, lineno=1, colno=99) - end_location: SourceLocation(pos=99, lineno=1, colno=100) - value: 5 - right: - - location: SourceLocation(pos=104, lineno=1, colno=105) - end_location: SourceLocation(pos=110, lineno=1, colno=111) - operator: 'in' - left: - - location: SourceLocation(pos=104, lineno=1, colno=105) - end_location: SourceLocation(pos=105, lineno=1, colno=106) - value: 1 - right: - - location: SourceLocation(pos=109, lineno=1, colno=110) - end_location: SourceLocation(pos=110, lineno=1, colno=111) - value: 1 - right: - - location: SourceLocation(pos=115, lineno=1, colno=116) - end_location: SourceLocation(pos=125, lineno=1, colno=126) - operator: 'not_in' - left: - - location: SourceLocation(pos=115, lineno=1, colno=116) - end_location: SourceLocation(pos=116, lineno=1, colno=117) - value: 2 - right: - - location: SourceLocation(pos=124, lineno=1, colno=125) - end_location: SourceLocation(pos=125, lineno=1, colno=126) - value: 2 - right: - - location: SourceLocation(pos=130, lineno=1, colno=131) - end_location: SourceLocation(pos=136, lineno=1, colno=137) - operator: 'is' - left: - - location: SourceLocation(pos=130, lineno=1, colno=131) - end_location: SourceLocation(pos=131, lineno=1, colno=132) - value: 3 - right: - - location: SourceLocation(pos=135, lineno=1, colno=136) - end_location: SourceLocation(pos=136, lineno=1, colno=137) - value: 3 - right: - - location: SourceLocation(pos=141, lineno=1, colno=142) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - operator: 'is_not' - left: - - location: SourceLocation(pos=141, lineno=1, colno=142) - end_location: SourceLocation(pos=142, lineno=1, colno=143) - value: 3 - right: - - location: SourceLocation(pos=150, lineno=1, colno=151) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt index fff705c63..0aaef458b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_1__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_1__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=4, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 123 diff --git a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt index fd3531626..9fa186b48 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_20__1.txt @@ -14,31 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=25, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: 'and' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: True - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: 'or' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: False - right: - - location: SourceLocation(pos=19, lineno=1, colno=20) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: True diff --git a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt index b2a112803..7985b62de 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_21__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_21__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'this' diff --git a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt index 2f991a09a..6ae4ea400 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_22__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_22__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=13, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'this\nthat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt index ce706f7e3..a99e06de5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_23__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_23__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=21, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: '"█this\nthat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt index e3c948748..ad25e64f5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_24__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_24__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=3, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: '' diff --git a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt index 489a1ce44..03ab11386 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_25__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_25__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: '"\'"' diff --git a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt index bcca85714..870ddd9e8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_26__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_26__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=27, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: "something \t\x0c\n\\'here" diff --git a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt index f5ed1e247..f3def84d7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_29__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_29__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=5, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: None diff --git a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt index e565c5bf0..cd7180d5d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_2__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_2__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=8, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 123.456 diff --git a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt index 69432b483..afd269207 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_32__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_32__1.txt @@ -14,30 +14,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=12, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt index fd4b4ed46..7a8c39746 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_33__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_33__1.txt @@ -15,40 +15,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=22, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - operator: '+' - left: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=8) - value: 'hello' - right: - - location: SourceLocation(pos=18, lineno=2, colno=11) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt index c72d582df..5afd85dd2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt @@ -16,63 +16,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=26, lineno=4, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 1 - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=9, lineno=2, colno=4) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - operator: '==' - left: - - location: SourceLocation(pos=9, lineno=2, colno=4) - end_location: SourceLocation(pos=10, lineno=2, colno=5) - value: 'a' - right: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - value: 1 - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - commands: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - operator: '=' - target: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=21, lineno=3, colno=6) - value: 'a' - value: - - location: SourceLocation(pos=24, lineno=3, colno=9) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt index 453b82a91..8d7ec9136 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -18,140 +18,23 @@ _mecha_refs[0] end_location: SourceLocation(pos=21, lineno=2, colno=14) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=45, lineno=4, colno=5) end_location: SourceLocation(pos=54, lineno=4, colno=14) commands: - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=49, lineno=4, colno=9) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - fragments: - - location: SourceLocation(pos=49, lineno=4, colno=9) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - value: 'hello' _mecha_refs[2] location: SourceLocation(pos=64, lineno=6, colno=5) end_location: SourceLocation(pos=73, lineno=6, colno=14) commands: - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=68, lineno=6, colno=9) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=68, lineno=6, colno=9) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - value: 'hello' _mecha_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=73, lineno=6, colno=14) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: True - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - value: 'hello' - location: SourceLocation(pos=22, lineno=3, colno=1) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - identifier: 'elif:condition:body' - arguments: - - location: SourceLocation(pos=27, lineno=3, colno=6) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - operator: 'or' - left: - - location: SourceLocation(pos=27, lineno=3, colno=6) - end_location: SourceLocation(pos=31, lineno=3, colno=10) - value: True - right: - - location: SourceLocation(pos=35, lineno=3, colno=14) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - value: False - - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - commands: - - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=49, lineno=4, colno=9) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - fragments: - - location: SourceLocation(pos=49, lineno=4, colno=9) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - value: 'hello' - location: SourceLocation(pos=55, lineno=5, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=68, lineno=6, colno=9) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=68, lineno=6, colno=9) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt index a542e3e62..f51818cc2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_3__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_3__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=17, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 22220.0996667 diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt index e7f4a9653..296b93c4d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt @@ -13,46 +13,9 @@ _mecha_refs[0] end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: True - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt index a0ae47cdc..c0dc28625 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt @@ -19,194 +19,25 @@ _mecha_refs[0] end_location: SourceLocation(pos=67, lineno=3, colno=18) commands: - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=100, lineno=5, colno=9) end_location: SourceLocation(pos=109, lineno=5, colno=18) commands: - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' _mecha_refs[2] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=109, lineno=5, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=86, lineno=4, colno=19) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' _mecha_refs[3] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=109, lineno=5, colno=18) root: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=86, lineno=4, colno=19) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' _mecha_refs[4] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -232,100 +63,9 @@ _mecha_refs[7] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=86, lineno=4, colno=19) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) @@ -333,212 +73,9 @@ _mecha_refs[8] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=86, lineno=4, colno=19) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' _mecha_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=109, lineno=5, colno=18) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=86, lineno=4, colno=19) - end_location: SourceLocation(pos=91, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt index 488569fbe..1c759d8a0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt @@ -16,104 +16,18 @@ _mecha_refs[0] end_location: SourceLocation(pos=67, lineno=3, colno=18) commands: - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=67, lineno=3, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' _mecha_refs[2] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=67, lineno=3, colno=18) root: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' _mecha_refs[3] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -139,64 +53,9 @@ _mecha_refs[6] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) @@ -204,140 +63,9 @@ _mecha_refs[7] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=3, colno=18) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt index c122a5deb..ab33a6d7b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt @@ -17,154 +17,25 @@ _mecha_refs[0] end_location: SourceLocation(pos=58, lineno=3, colno=18) commands: - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=82, lineno=5, colno=9) end_location: SourceLocation(pos=91, lineno=5, colno=18) commands: - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' _mecha_refs[2] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=91, lineno=5, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' _mecha_refs[3] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=91, lineno=5, colno=18) root: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' _mecha_refs[4] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -190,80 +61,9 @@ _mecha_refs[7] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) @@ -271,172 +71,9 @@ _mecha_refs[8] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' _mecha_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=91, lineno=5, colno=18) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt index 2afc6ed8f..fbea798e8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt @@ -15,84 +15,18 @@ _mecha_refs[0] end_location: SourceLocation(pos=58, lineno=3, colno=18) commands: - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' _mecha_refs[2] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=58, lineno=3, colno=18) root: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' _mecha_refs[3] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -118,54 +52,9 @@ _mecha_refs[6] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) @@ -173,120 +62,9 @@ _mecha_refs[7] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=58, lineno=3, colno=18) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - root: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt index 92ea81613..818ebb3d4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt @@ -22,195 +22,19 @@ _mecha_refs[0] identifier: 'say:message' arguments: - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=105, lineno=5, colno=26) commands: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - operator: '=' - target: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'count' - value: - - location: SourceLocation(pos=39, lineno=2, colno=13) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 42 - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - operator: '>' - left: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=60, lineno=3, colno=19) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) - value: 'count' - value: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) - value: 'count' - right: - - location: SourceLocation(pos=104, lineno=5, colno=25) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - value: 1 _mecha_refs[2] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=105, lineno=5, colno=26) root: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - operator: '=' - target: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'count' - value: - - location: SourceLocation(pos=39, lineno=2, colno=13) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 42 - - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - operator: '>' - left: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=60, lineno=3, colno=19) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) - value: 'count' - value: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) - value: 'count' - right: - - location: SourceLocation(pos=104, lineno=5, colno=25) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - value: 1 _mecha_refs[3] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -236,112 +60,9 @@ _mecha_refs[6] identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - min: 42 - max: 42 - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - root: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - operator: '=' - target: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'count' - value: - - location: SourceLocation(pos=39, lineno=2, colno=13) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 42 - - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - operator: '>' - left: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=60, lineno=3, colno=19) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) - value: 'count' - value: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) - value: 'count' - right: - - location: SourceLocation(pos=104, lineno=5, colno=25) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - value: 1 _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) @@ -349,236 +70,9 @@ _mecha_refs[7] identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - min: 42 - max: 42 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - root: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - operator: '=' - target: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'count' - value: - - location: SourceLocation(pos=39, lineno=2, colno=13) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 42 - - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - operator: '>' - left: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=60, lineno=3, colno=19) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) - value: 'count' - value: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) - value: 'count' - right: - - location: SourceLocation(pos=104, lineno=5, colno=25) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - value: 1 _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=106, lineno=6, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - min: 42 - max: 42 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - root: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - operator: '=' - target: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'count' - value: - - location: SourceLocation(pos=39, lineno=2, colno=13) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 42 - - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - operator: '>' - left: - - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=60, lineno=3, colno=19) - end_location: SourceLocation(pos=61, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) - value: 'count' - value: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) - value: 'count' - right: - - location: SourceLocation(pos=104, lineno=5, colno=25) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt index 48f78cdb5..8b9fb25d9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_47__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_47__1.txt @@ -13,31 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=32, lineno=5, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - operator: '+' - left: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - value: 'abc' - right: - - location: SourceLocation(pos=24, lineno=3, colno=7) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - value: 'def' diff --git a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt index a9e6ccb25..a4aef815f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_49__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_49__1.txt @@ -14,31 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=20, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - operator: '|' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '|' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: True - right: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: False - right: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - value: None diff --git a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt index a00d3e5fc..31639cc53 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_4__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_4__1.txt @@ -12,11 +12,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 670000.0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt index b636062fb..a3f16d6b0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_50__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_50__1.txt @@ -15,40 +15,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=17, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=9) - operator: '==' - left: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - value: 'foo' - right: - - location: SourceLocation(pos=15, lineno=2, colno=8) - end_location: SourceLocation(pos=16, lineno=2, colno=9) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt index 58926490d..b74e8e624 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt @@ -13,50 +13,9 @@ _mecha_refs[0] end_location: SourceLocation(pos=32, lineno=2, colno=18) commands: - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=23, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - fragments: - - location: SourceLocation(pos=23, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - value: 'something' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=2, colno=18) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'c' - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'abc' - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - commands: - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=23, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - fragments: - - location: SourceLocation(pos=23, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=18) - value: 'something' diff --git a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt index 50bc16f72..7958b54b5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_53__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_53__1.txt @@ -14,40 +14,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=18, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - operator: '=' - target: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=14, lineno=2, colno=7) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt index c96e2886b..05dc0208b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt @@ -14,38 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=31, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=2, colno=14) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'foo' - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'foo' - - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=30, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=30, lineno=2, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=30, lineno=2, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=8) - value: 'foo' - value: - - location: SourceLocation(pos=27, lineno=2, colno=11) - end_location: SourceLocation(pos=30, lineno=2, colno=14) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt index 757eced4c..815317922 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_57__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_57__1.txt @@ -13,40 +13,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=22, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: '' - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=13) - operator: '+=' - target: - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=16, lineno=2, colno=8) - end_location: SourceLocation(pos=21, lineno=2, colno=13) - value: 'hey' diff --git a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt index dde7191ec..d3f4e061f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_5__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_5__1.txt @@ -13,21 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=6, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt index d4fd1e286..ec2603802 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt @@ -15,51 +15,9 @@ _mecha_refs[0] identifier: 'say:message' arguments: - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=4, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=3, colno=13) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'i' - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: '' - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=13) - commands: - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - value: 'hello' - - location: SourceLocation(pos=30, lineno=3, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=13) - identifier: 'continue' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt index 1fceea782..a9761fe92 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt @@ -13,21 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=22, lineno=3, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=10) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: False - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=10) - identifier: 'break' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt index c56ebbd3b..c6ffddadc 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt @@ -16,48 +16,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=45, lineno=4, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=14) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'i' - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'abc' - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=14) - commands: - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=14) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=22, lineno=2, colno=8) - end_location: SourceLocation(pos=30, lineno=2, colno=16) - operator: '==' - left: - - location: SourceLocation(pos=22, lineno=2, colno=8) - end_location: SourceLocation(pos=23, lineno=2, colno=9) - value: 'i' - right: - - location: SourceLocation(pos=27, lineno=2, colno=13) - end_location: SourceLocation(pos=30, lineno=2, colno=16) - value: 'b' - - location: SourceLocation(pos=39, lineno=3, colno=9) - end_location: SourceLocation(pos=44, lineno=3, colno=14) - commands: - - location: SourceLocation(pos=39, lineno=3, colno=9) - end_location: SourceLocation(pos=44, lineno=3, colno=14) - identifier: 'break' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt index e1c313f78..80720494b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_65__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_65__1.txt @@ -14,16 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=10, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt index 2085ec0e6..39e9bc9f2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_66__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_66__1.txt @@ -15,21 +15,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=14, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: 'baz' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt index 636962b50..87aec7cb5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_67__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_67__1.txt @@ -16,31 +16,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=15, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' - arguments: - - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt index f2a32f680..78ccfbeb6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_68__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_68__1.txt @@ -21,77 +21,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=52, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' - arguments: - - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 0 - arguments: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - value: 'hello' - arguments: - - location: SourceLocation(pos=23, lineno=1, colno=24) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 99 - arguments: - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: 'with space' - arguments: - - location: SourceLocation(pos=39, lineno=1, colno=40) - end_location: SourceLocation(pos=50, lineno=1, colno=51) - operator: '*' - left: - - location: SourceLocation(pos=39, lineno=1, colno=40) - end_location: SourceLocation(pos=46, lineno=1, colno=47) - value: 'thing' - right: - - location: SourceLocation(pos=49, lineno=1, colno=50) - end_location: SourceLocation(pos=50, lineno=1, colno=51) - value: 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt index e465cc9b9..0b60aa623 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_69__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_69__1.txt @@ -13,28 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=30, lineno=6, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=5, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=5, colno=2) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' - arguments: - - location: SourceLocation(pos=11, lineno=2, colno=5) - end_location: SourceLocation(pos=12, lineno=2, colno=6) - value: 1 - - location: SourceLocation(pos=18, lineno=3, colno=5) - end_location: SourceLocation(pos=19, lineno=3, colno=6) - value: 2 - - location: SourceLocation(pos=25, lineno=4, colno=5) - end_location: SourceLocation(pos=26, lineno=4, colno=6) - value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt index 10c8467e6..a9f56a291 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_6__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_6__1.txt @@ -13,21 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=6, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt index d3832b124..ec860f223 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt @@ -16,63 +16,10 @@ _mecha_refs[0] end_location: SourceLocation(pos=23, lineno=2, colno=14) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=30, lineno=4, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - value: 'hello' - location: SourceLocation(pos=24, lineno=3, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=24, lineno=3, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=6) - value: - - location: SourceLocation(pos=24, lineno=3, colno=1) - end_location: SourceLocation(pos=27, lineno=3, colno=4) - value: 'foo' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt index 829616f07..37460eb72 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt @@ -19,62 +19,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=47, lineno=4, colno=10) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=4, colno=10) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=37, lineno=3, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) - name: 'bar' - arguments: - - - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=14) - commands: - - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=14) - value: - - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=35, lineno=3, colno=12) - value: 'foo' - arguments: - - - location: SourceLocation(pos=42, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=42, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=10) - value: - - location: SourceLocation(pos=42, lineno=4, colno=5) - end_location: SourceLocation(pos=45, lineno=4, colno=8) - value: 'bar' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt index 795e9e261..c730aaf44 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt @@ -24,84 +24,9 @@ _mecha_refs[0] end_location: SourceLocation(pos=55, lineno=6, colno=14) commands: - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - value: 'hello' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=55, lineno=6, colno=14) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=41, lineno=5, colno=2) - name: 'foo' - arguments: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=16, lineno=2, colno=8) - name: 'a' - default: - - location: SourceLocation(pos=15, lineno=2, colno=7) - end_location: SourceLocation(pos=16, lineno=2, colno=8) - value: 1 - - location: SourceLocation(pos=22, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=8) - name: 'b' - default: - - location: SourceLocation(pos=24, lineno=3, colno=7) - end_location: SourceLocation(pos=25, lineno=3, colno=8) - value: 'a' - - location: SourceLocation(pos=31, lineno=4, colno=5) - end_location: SourceLocation(pos=38, lineno=4, colno=12) - name: 'c' - default: - - location: SourceLocation(pos=33, lineno=4, colno=7) - end_location: SourceLocation(pos=38, lineno=4, colno=12) - operator: '+' - left: - - location: SourceLocation(pos=33, lineno=4, colno=7) - end_location: SourceLocation(pos=34, lineno=4, colno=8) - value: 'a' - right: - - location: SourceLocation(pos=37, lineno=4, colno=11) - end_location: SourceLocation(pos=38, lineno=4, colno=12) - value: 'b' - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=55, lineno=6, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt index 48d28f1d4..e1dbb0de5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt @@ -20,75 +20,9 @@ _mecha_refs[0] identifier: 'say:message' arguments: - location: SourceLocation(pos=33, lineno=3, colno=9) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - fragments: - - location: SourceLocation(pos=33, lineno=3, colno=9) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - value: 'wat' _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=36, lineno=3, colno=12) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: 'f' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'a' - default: None - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - name: 'b' - default: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'a' - - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - commands: - - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=11) - operator: '+=' - target: - - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=6) - value: 'b' - value: - - location: SourceLocation(pos=23, lineno=2, colno=10) - end_location: SourceLocation(pos=24, lineno=2, colno=11) - value: 'a' - - location: SourceLocation(pos=29, lineno=3, colno=5) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=33, lineno=3, colno=9) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - fragments: - - location: SourceLocation(pos=33, lineno=3, colno=9) - end_location: SourceLocation(pos=36, lineno=3, colno=12) - value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt index c36c5d96f..1964a4389 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_7__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_7__1.txt @@ -14,31 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=10, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 - right: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt index a13a416cf..20f6464be 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt @@ -25,37 +25,6 @@ _mecha_refs[0] identifier: 'say:message' arguments: - location: SourceLocation(pos=57, lineno=4, colno=13) - end_location: SourceLocation(pos=106, lineno=7, colno=16) - fragments: - - location: SourceLocation(pos=57, lineno=4, colno=13) - end_location: SourceLocation(pos=59, lineno=4, colno=15) - value: 'yo' - - location: SourceLocation(pos=71, lineno=5, colno=12) - end_location: SourceLocation(pos=72, lineno=5, colno=13) - value: ' ' - - location: SourceLocation(pos=72, lineno=5, colno=13) - end_location: SourceLocation(pos=75, lineno=5, colno=16) - value: 'wat' - - location: SourceLocation(pos=87, lineno=6, colno=12) - end_location: SourceLocation(pos=88, lineno=6, colno=13) - value: ' ' - - location: SourceLocation(pos=88, lineno=6, colno=13) - end_location: SourceLocation(pos=90, lineno=6, colno=15) - value: 'is' - - location: SourceLocation(pos=102, lineno=7, colno=12) - end_location: SourceLocation(pos=103, lineno=7, colno=13) - value: ' ' - - location: SourceLocation(pos=103, lineno=7, colno=13) - end_location: SourceLocation(pos=106, lineno=7, colno=16) - value: 'dat' _mecha_refs[1] location: SourceLocation(pos=206, lineno=13, colno=9) @@ -63,179 +32,9 @@ _mecha_refs[1] identifier: 'say:message' arguments: - location: SourceLocation(pos=210, lineno=13, colno=13) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - fragments: - - location: SourceLocation(pos=210, lineno=13, colno=13) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - value: 'wow' _mecha_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=223, lineno=14, colno=10) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=223, lineno=14, colno=10) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - name: 'foo' - arguments: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - name: 'something' - default: None - - location: SourceLocation(pos=23, lineno=2, colno=5) - end_location: SourceLocation(pos=223, lineno=14, colno=10) - commands: - - location: SourceLocation(pos=23, lineno=2, colno=5) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=27, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=14) - name: 'wat' - arguments: - - - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - commands: - - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=106, lineno=7, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=57, lineno=4, colno=13) - end_location: SourceLocation(pos=106, lineno=7, colno=16) - fragments: - - location: SourceLocation(pos=57, lineno=4, colno=13) - end_location: SourceLocation(pos=59, lineno=4, colno=15) - value: 'yo' - - location: SourceLocation(pos=71, lineno=5, colno=12) - end_location: SourceLocation(pos=72, lineno=5, colno=13) - value: ' ' - - location: SourceLocation(pos=72, lineno=5, colno=13) - end_location: SourceLocation(pos=75, lineno=5, colno=16) - value: 'wat' - - location: SourceLocation(pos=87, lineno=6, colno=12) - end_location: SourceLocation(pos=88, lineno=6, colno=13) - value: ' ' - - location: SourceLocation(pos=88, lineno=6, colno=13) - end_location: SourceLocation(pos=90, lineno=6, colno=15) - value: 'is' - - location: SourceLocation(pos=102, lineno=7, colno=12) - end_location: SourceLocation(pos=103, lineno=7, colno=13) - value: ' ' - - location: SourceLocation(pos=103, lineno=7, colno=13) - end_location: SourceLocation(pos=106, lineno=7, colno=16) - value: 'dat' - - location: SourceLocation(pos=135, lineno=9, colno=9) - end_location: SourceLocation(pos=146, lineno=9, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=135, lineno=9, colno=9) - end_location: SourceLocation(pos=146, lineno=9, colno=20) - operator: '=' - target: - - location: SourceLocation(pos=135, lineno=9, colno=9) - end_location: SourceLocation(pos=136, lineno=9, colno=10) - value: 'x' - value: - - location: SourceLocation(pos=139, lineno=9, colno=13) - end_location: SourceLocation(pos=146, lineno=9, colno=20) - value: 'hello' - - location: SourceLocation(pos=155, lineno=10, colno=9) - end_location: SourceLocation(pos=196, lineno=11, colno=23) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=159, lineno=10, colno=13) - end_location: SourceLocation(pos=160, lineno=10, colno=14) - value: 'i' - - location: SourceLocation(pos=164, lineno=10, colno=18) - end_location: SourceLocation(pos=173, lineno=10, colno=27) - value: 'something' - - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=196, lineno=11, colno=23) - commands: - - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=196, lineno=11, colno=23) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=196, lineno=11, colno=23) - operator: '+=' - target: - - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=187, lineno=11, colno=14) - value: 'x' - value: - - location: SourceLocation(pos=191, lineno=11, colno=18) - end_location: SourceLocation(pos=196, lineno=11, colno=23) - operator: '*' - left: - - location: SourceLocation(pos=191, lineno=11, colno=18) - end_location: SourceLocation(pos=192, lineno=11, colno=19) - value: 'i' - right: - - location: SourceLocation(pos=195, lineno=11, colno=22) - end_location: SourceLocation(pos=196, lineno=11, colno=23) - value: 3 - - location: SourceLocation(pos=206, lineno=13, colno=9) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=210, lineno=13, colno=13) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - fragments: - - location: SourceLocation(pos=210, lineno=13, colno=13) - end_location: SourceLocation(pos=213, lineno=13, colno=16) - value: 'wow' - - location: SourceLocation(pos=218, lineno=14, colno=5) - end_location: SourceLocation(pos=223, lineno=14, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=218, lineno=14, colno=5) - end_location: SourceLocation(pos=223, lineno=14, colno=10) - value: - - location: SourceLocation(pos=218, lineno=14, colno=5) - end_location: SourceLocation(pos=221, lineno=14, colno=8) - value: 'wat' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt index 8e6f1c54d..9a97b9df6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt @@ -22,107 +22,5 @@ _mecha_refs[0] end_location: SourceLocation(pos=72, lineno=6, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=19) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=28, lineno=2, colno=19) - commands: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=28, lineno=2, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=28, lineno=2, colno=19) - operator: '+=' - target: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=10) - value: 'thing' - value: - - location: SourceLocation(pos=23, lineno=2, colno=14) - end_location: SourceLocation(pos=28, lineno=2, colno=19) - value: - - location: SourceLocation(pos=23, lineno=2, colno=14) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - value: 'bar' - arguments: - - location: SourceLocation(pos=29, lineno=3, colno=1) - end_location: SourceLocation(pos=57, lineno=4, colno=19) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=33, lineno=3, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=10) - name: 'bar' - arguments: - - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=57, lineno=4, colno=19) - commands: - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=57, lineno=4, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=57, lineno=4, colno=19) - operator: '+=' - target: - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=48, lineno=4, colno=10) - value: 'thing' - value: - - location: SourceLocation(pos=52, lineno=4, colno=14) - end_location: SourceLocation(pos=57, lineno=4, colno=19) - value: - - location: SourceLocation(pos=52, lineno=4, colno=14) - end_location: SourceLocation(pos=55, lineno=4, colno=17) - value: 'foo' - arguments: - - location: SourceLocation(pos=58, lineno=5, colno=1) - end_location: SourceLocation(pos=71, lineno=5, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=58, lineno=5, colno=1) - end_location: SourceLocation(pos=71, lineno=5, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=58, lineno=5, colno=1) - end_location: SourceLocation(pos=63, lineno=5, colno=6) - value: 'thing' - value: - - location: SourceLocation(pos=66, lineno=5, colno=9) - end_location: SourceLocation(pos=71, lineno=5, colno=14) - value: - - location: SourceLocation(pos=66, lineno=5, colno=9) - end_location: SourceLocation(pos=69, lineno=5, colno=12) - value: 'bar' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt index 6a75a4db3..391a9733c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt @@ -13,23 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=20, lineno=2, colno=11) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=11) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=20, lineno=2, colno=11) - commands: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=20, lineno=2, colno=11) - identifier: 'return' - arguments: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt index 5babc72c5..6ff097f57 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt @@ -16,60 +16,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=50, lineno=4, colno=12) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=50, lineno=4, colno=12) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=50, lineno=4, colno=12) - commands: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=19) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=19, lineno=2, colno=12) - name: 'g' - arguments: - - - location: SourceLocation(pos=28, lineno=3, colno=9) - end_location: SourceLocation(pos=38, lineno=3, colno=19) - commands: - - location: SourceLocation(pos=28, lineno=3, colno=9) - end_location: SourceLocation(pos=38, lineno=3, colno=19) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=35, lineno=3, colno=16) - end_location: SourceLocation(pos=38, lineno=3, colno=19) - value: 'foo' - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=50, lineno=4, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=50, lineno=4, colno=12) - operator: '=' - target: - - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=46, lineno=4, colno=8) - value: 'foo' - value: - - location: SourceLocation(pos=49, lineno=4, colno=11) - end_location: SourceLocation(pos=50, lineno=4, colno=12) - value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt index 5a9167361..392cf2781 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt @@ -20,9 +20,6 @@ _mecha_refs[0] converter: 'json' value: - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - value: 'x' _mecha_refs[1] location: SourceLocation(pos=21, lineno=2, colno=13) @@ -37,79 +34,11 @@ _mecha_refs[2] identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=23, lineno=2, colno=15) - variable: 'a' - arguments: - - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - converter: 'json' - value: - - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - value: 'x' _mecha_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=4, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - name: 'f' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'x' - default: None - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - identifier: 'tellraw:targets:message' - arguments: - - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=23, lineno=2, colno=15) - variable: 'a' - arguments: - - - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - converter: 'json' - value: - - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) - value: 'x' - location: SourceLocation(pos=26, lineno=3, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=26, lineno=3, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=11) - value: - - location: SourceLocation(pos=26, lineno=3, colno=1) - end_location: SourceLocation(pos=27, lineno=3, colno=2) - value: 'f' - arguments: - - location: SourceLocation(pos=28, lineno=3, colno=3) - end_location: SourceLocation(pos=35, lineno=3, colno=10) - value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt index a8f8295ca..2db586f26 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_8__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_8__1.txt @@ -14,31 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=12, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - left: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 2 - right: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt index 0784fe34e..7741237de 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_91__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_91__1.txt @@ -13,24 +13,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=19, lineno=4, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=2) - items: - - location: SourceLocation(pos=6, lineno=2, colno=5) - end_location: SourceLocation(pos=16, lineno=2, colno=15) - key: - - location: SourceLocation(pos=6, lineno=2, colno=5) - end_location: SourceLocation(pos=9, lineno=2, colno=8) - value: 'foo' - value: - - location: SourceLocation(pos=11, lineno=2, colno=10) - end_location: SourceLocation(pos=16, lineno=2, colno=15) - value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt index a0f45d72d..75ad3d0e5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_92__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_92__1.txt @@ -15,43 +15,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=33, lineno=5, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'hello' - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - items: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - key: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=23, lineno=3, colno=8) - value: 'foo' - value: - - location: SourceLocation(pos=25, lineno=3, colno=10) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt index c68ad43db..b341af617 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_93__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_93__1.txt @@ -15,43 +15,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=33, lineno=5, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'hello' - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - items: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - key: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - value: 'foo' - value: - - location: SourceLocation(pos=27, lineno=3, colno=12) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt index 840027125..259c97f77 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_94__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_94__1.txt @@ -18,77 +18,4 @@ _mecha_refs[0] end_location: SourceLocation(pos=51, lineno=6, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'hello' - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=50, lineno=5, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=50, lineno=5, colno=2) - items: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=31, lineno=3, colno=16) - key: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=27, lineno=3, colno=12) - operator: '*' - left: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=23, lineno=3, colno=8) - value: 'foo' - right: - - location: SourceLocation(pos=26, lineno=3, colno=11) - end_location: SourceLocation(pos=27, lineno=3, colno=12) - value: 3 - value: - - location: SourceLocation(pos=29, lineno=3, colno=14) - end_location: SourceLocation(pos=31, lineno=3, colno=16) - value: 42 - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=15) - key: - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=43, lineno=4, colno=11) - operator: '+' - left: - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=39, lineno=4, colno=7) - value: 16 - right: - - location: SourceLocation(pos=42, lineno=4, colno=10) - end_location: SourceLocation(pos=43, lineno=4, colno=11) - value: 3 - value: - - location: SourceLocation(pos=45, lineno=4, colno=13) - end_location: SourceLocation(pos=47, lineno=4, colno=15) - items: - diff --git a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt index fab0ee8ca..c87693528 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_95__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_95__1.txt @@ -16,138 +16,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=248, lineno=15, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=247, lineno=14, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=247, lineno=14, colno=2) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'predicate' - value: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=247, lineno=14, colno=2) - items: - - location: SourceLocation(pos=16, lineno=2, colno=3) - end_location: SourceLocation(pos=54, lineno=2, colno=41) - key: - - location: SourceLocation(pos=16, lineno=2, colno=3) - end_location: SourceLocation(pos=27, lineno=2, colno=14) - value: 'condition' - value: - - location: SourceLocation(pos=29, lineno=2, colno=16) - end_location: SourceLocation(pos=54, lineno=2, colno=41) - value: 'minecraft:entity_scores' - - location: SourceLocation(pos=58, lineno=3, colno=3) - end_location: SourceLocation(pos=74, lineno=3, colno=19) - key: - - location: SourceLocation(pos=58, lineno=3, colno=3) - end_location: SourceLocation(pos=66, lineno=3, colno=11) - value: 'entity' - value: - - location: SourceLocation(pos=68, lineno=3, colno=13) - end_location: SourceLocation(pos=74, lineno=3, colno=19) - value: 'this' - - location: SourceLocation(pos=78, lineno=4, colno=3) - end_location: SourceLocation(pos=245, lineno=13, colno=4) - key: - - location: SourceLocation(pos=78, lineno=4, colno=3) - end_location: SourceLocation(pos=86, lineno=4, colno=11) - value: 'scores' - value: - - location: SourceLocation(pos=88, lineno=4, colno=13) - end_location: SourceLocation(pos=245, lineno=13, colno=4) - items: - - location: SourceLocation(pos=94, lineno=5, colno=5) - end_location: SourceLocation(pos=241, lineno=12, colno=6) - key: - - location: SourceLocation(pos=94, lineno=5, colno=5) - end_location: SourceLocation(pos=102, lineno=5, colno=13) - value: 'score1' - value: - - location: SourceLocation(pos=104, lineno=5, colno=15) - end_location: SourceLocation(pos=241, lineno=12, colno=6) - items: - - location: SourceLocation(pos=112, lineno=6, colno=7) - end_location: SourceLocation(pos=235, lineno=11, colno=8) - key: - - location: SourceLocation(pos=112, lineno=6, colno=7) - end_location: SourceLocation(pos=117, lineno=6, colno=12) - value: 'min' - value: - - location: SourceLocation(pos=119, lineno=6, colno=14) - end_location: SourceLocation(pos=235, lineno=11, colno=8) - items: - - location: SourceLocation(pos=129, lineno=7, colno=9) - end_location: SourceLocation(pos=154, lineno=7, colno=34) - key: - - location: SourceLocation(pos=129, lineno=7, colno=9) - end_location: SourceLocation(pos=135, lineno=7, colno=15) - value: 'type' - value: - - location: SourceLocation(pos=137, lineno=7, colno=17) - end_location: SourceLocation(pos=154, lineno=7, colno=34) - value: 'minecraft:score' - - location: SourceLocation(pos=164, lineno=8, colno=9) - end_location: SourceLocation(pos=180, lineno=8, colno=25) - key: - - location: SourceLocation(pos=164, lineno=8, colno=9) - end_location: SourceLocation(pos=172, lineno=8, colno=17) - value: 'target' - value: - - location: SourceLocation(pos=174, lineno=8, colno=19) - end_location: SourceLocation(pos=180, lineno=8, colno=25) - value: 'this' - - location: SourceLocation(pos=190, lineno=9, colno=9) - end_location: SourceLocation(pos=207, lineno=9, colno=26) - key: - - location: SourceLocation(pos=190, lineno=9, colno=9) - end_location: SourceLocation(pos=197, lineno=9, colno=16) - value: 'score' - value: - - location: SourceLocation(pos=199, lineno=9, colno=18) - end_location: SourceLocation(pos=207, lineno=9, colno=26) - value: 'score2' - - location: SourceLocation(pos=217, lineno=10, colno=9) - end_location: SourceLocation(pos=227, lineno=10, colno=19) - key: - - location: SourceLocation(pos=217, lineno=10, colno=9) - end_location: SourceLocation(pos=224, lineno=10, colno=16) - value: 'scale' - value: - - location: SourceLocation(pos=226, lineno=10, colno=18) - end_location: SourceLocation(pos=227, lineno=10, colno=19) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt index df02efc6f..7fd959f1a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_96__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_96__1.txt @@ -16,138 +16,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=234, lineno=15, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=233, lineno=14, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=233, lineno=14, colno=2) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'predicate' - value: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=233, lineno=14, colno=2) - items: - - location: SourceLocation(pos=16, lineno=2, colno=3) - end_location: SourceLocation(pos=52, lineno=2, colno=39) - key: - - location: SourceLocation(pos=16, lineno=2, colno=3) - end_location: SourceLocation(pos=25, lineno=2, colno=12) - value: 'condition' - value: - - location: SourceLocation(pos=27, lineno=2, colno=14) - end_location: SourceLocation(pos=52, lineno=2, colno=39) - value: 'minecraft:entity_scores' - - location: SourceLocation(pos=56, lineno=3, colno=3) - end_location: SourceLocation(pos=70, lineno=3, colno=17) - key: - - location: SourceLocation(pos=56, lineno=3, colno=3) - end_location: SourceLocation(pos=62, lineno=3, colno=9) - value: 'entity' - value: - - location: SourceLocation(pos=64, lineno=3, colno=11) - end_location: SourceLocation(pos=70, lineno=3, colno=17) - value: 'this' - - location: SourceLocation(pos=74, lineno=4, colno=3) - end_location: SourceLocation(pos=231, lineno=13, colno=4) - key: - - location: SourceLocation(pos=74, lineno=4, colno=3) - end_location: SourceLocation(pos=80, lineno=4, colno=9) - value: 'scores' - value: - - location: SourceLocation(pos=82, lineno=4, colno=11) - end_location: SourceLocation(pos=231, lineno=13, colno=4) - items: - - location: SourceLocation(pos=88, lineno=5, colno=5) - end_location: SourceLocation(pos=227, lineno=12, colno=6) - key: - - location: SourceLocation(pos=88, lineno=5, colno=5) - end_location: SourceLocation(pos=94, lineno=5, colno=11) - value: 'score1' - value: - - location: SourceLocation(pos=96, lineno=5, colno=13) - end_location: SourceLocation(pos=227, lineno=12, colno=6) - items: - - location: SourceLocation(pos=104, lineno=6, colno=7) - end_location: SourceLocation(pos=221, lineno=11, colno=8) - key: - - location: SourceLocation(pos=104, lineno=6, colno=7) - end_location: SourceLocation(pos=109, lineno=6, colno=12) - value: 'min' - value: - - location: SourceLocation(pos=111, lineno=6, colno=14) - end_location: SourceLocation(pos=221, lineno=11, colno=8) - items: - - location: SourceLocation(pos=121, lineno=7, colno=9) - end_location: SourceLocation(pos=146, lineno=7, colno=34) - key: - - location: SourceLocation(pos=121, lineno=7, colno=9) - end_location: SourceLocation(pos=127, lineno=7, colno=15) - value: 'type' - value: - - location: SourceLocation(pos=129, lineno=7, colno=17) - end_location: SourceLocation(pos=146, lineno=7, colno=34) - value: 'minecraft:score' - - location: SourceLocation(pos=156, lineno=8, colno=9) - end_location: SourceLocation(pos=170, lineno=8, colno=23) - key: - - location: SourceLocation(pos=156, lineno=8, colno=9) - end_location: SourceLocation(pos=162, lineno=8, colno=15) - value: 'target' - value: - - location: SourceLocation(pos=164, lineno=8, colno=17) - end_location: SourceLocation(pos=170, lineno=8, colno=23) - value: 'this' - - location: SourceLocation(pos=180, lineno=9, colno=9) - end_location: SourceLocation(pos=195, lineno=9, colno=24) - key: - - location: SourceLocation(pos=180, lineno=9, colno=9) - end_location: SourceLocation(pos=185, lineno=9, colno=14) - value: 'score' - value: - - location: SourceLocation(pos=187, lineno=9, colno=16) - end_location: SourceLocation(pos=195, lineno=9, colno=24) - value: 'score2' - - location: SourceLocation(pos=205, lineno=10, colno=9) - end_location: SourceLocation(pos=213, lineno=10, colno=17) - key: - - location: SourceLocation(pos=205, lineno=10, colno=9) - end_location: SourceLocation(pos=210, lineno=10, colno=14) - value: 'scale' - value: - - location: SourceLocation(pos=212, lineno=10, colno=16) - end_location: SourceLocation(pos=213, lineno=10, colno=17) - value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt index 4dd35dc79..c7f718f1b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt @@ -21,78 +21,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=53, lineno=2, colno=46) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=53, lineno=2, colno=46) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=53, lineno=2, colno=46) - commands: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=53, lineno=2, colno=46) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=12) - end_location: SourceLocation(pos=53, lineno=2, colno=46) - items: - - location: SourceLocation(pos=20, lineno=2, colno=13) - end_location: SourceLocation(pos=28, lineno=2, colno=21) - key: - - location: SourceLocation(pos=20, lineno=2, colno=13) - end_location: SourceLocation(pos=23, lineno=2, colno=16) - value: - - location: SourceLocation(pos=20, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - value: 'f' - arguments: - - value: - - location: SourceLocation(pos=25, lineno=2, colno=18) - end_location: SourceLocation(pos=28, lineno=2, colno=21) - value: - - location: SourceLocation(pos=25, lineno=2, colno=18) - end_location: SourceLocation(pos=26, lineno=2, colno=19) - value: 'f' - arguments: - - - location: SourceLocation(pos=30, lineno=2, colno=23) - end_location: SourceLocation(pos=52, lineno=2, colno=45) - key: - - location: SourceLocation(pos=30, lineno=2, colno=23) - end_location: SourceLocation(pos=35, lineno=2, colno=28) - value: 'other' - value: - - location: SourceLocation(pos=37, lineno=2, colno=30) - end_location: SourceLocation(pos=52, lineno=2, colno=45) - items: - - location: SourceLocation(pos=38, lineno=2, colno=31) - end_location: SourceLocation(pos=40, lineno=2, colno=33) - items: - - - location: SourceLocation(pos=42, lineno=2, colno=35) - end_location: SourceLocation(pos=44, lineno=2, colno=37) - items: - - - location: SourceLocation(pos=46, lineno=2, colno=39) - end_location: SourceLocation(pos=51, lineno=2, colno=44) - value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt index 44384fc20..80b6ca457 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_9__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_9__1.txt @@ -14,26 +14,3 @@ _mecha_refs[0] end_location: SourceLocation(pos=8, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 2 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '-' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 54 diff --git a/packages/mecha/tests/test_scripting.py b/packages/mecha/tests/test_scripting.py index 0fa12136f..13d4dd399 100644 --- a/packages/mecha/tests/test_scripting.py +++ b/packages/mecha/tests/test_scripting.py @@ -42,7 +42,7 @@ def test_parse(snapshot: SnapshotFixture, ctx_scripting: Context, source: Functi text, output, refs = runtime.codegen(ast) text = text or "# Nothing\n" assert snapshot() == f"{text}---\noutput = {output}\n---\n" + "".join( - f"_mecha_refs[{i}]\n{obj.dump() if isinstance(obj, AstNode) else repr(obj)}\n" + f"_mecha_refs[{i}]\n{obj.dump(shallow=True) if isinstance(obj, AstNode) else repr(obj)}\n" for i, obj in enumerate(refs) ) elif diagnostics: From 53a2a6dd99ca1f45865acb9fbdd114f616e051f1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Dec 2021 12:09:36 +0100 Subject: [PATCH 0548/1554] test: forgot to update some snapshots --- packages/mecha/tests/snapshots/parse__multiline__0.txt | 6 +++--- packages/mecha/tests/snapshots/parse__say__0.txt | 6 +++--- packages/mecha/tests/snapshots/parse__say__1.txt | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/mecha/tests/snapshots/parse__multiline__0.txt b/packages/mecha/tests/snapshots/parse__multiline__0.txt index 34f18e03c..9bd634013 100644 --- a/packages/mecha/tests/snapshots/parse__multiline__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline__0.txt @@ -34,7 +34,7 @@ end_location: SourceLocation(pos=813, lineno=15, colno=43) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=164, lineno=5, colno=22) end_location: SourceLocation(pos=168, lineno=5, colno=26) value: 'eyes' @@ -69,7 +69,7 @@ end_location: SourceLocation(pos=813, lineno=15, colno=43) identifier: 'execute:anchored:anchor:subcommand' arguments: - + location: SourceLocation(pos=307, lineno=7, colno=22) end_location: SourceLocation(pos=311, lineno=7, colno=26) value: 'feet' @@ -175,7 +175,7 @@ location: SourceLocation(pos=791, lineno=15, colno=21) end_location: SourceLocation(pos=813, lineno=15, colno=43) fragments: - + location: SourceLocation(pos=791, lineno=15, colno=21) end_location: SourceLocation(pos=813, lineno=15, colno=43) value: "I'm facing the target!" \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__say__0.txt b/packages/mecha/tests/snapshots/parse__say__0.txt index ee53f43e8..9ad924530 100644 --- a/packages/mecha/tests/snapshots/parse__say__0.txt +++ b/packages/mecha/tests/snapshots/parse__say__0.txt @@ -11,7 +11,7 @@ location: SourceLocation(pos=13, lineno=2, colno=13) end_location: SourceLocation(pos=27, lineno=2, colno=27) fragments: - + location: SourceLocation(pos=13, lineno=2, colno=13) end_location: SourceLocation(pos=19, lineno=2, colno=19) value: 'hello ' @@ -21,7 +21,7 @@ variable: 's' arguments: - + location: SourceLocation(pos=21, lineno=2, colno=21) end_location: SourceLocation(pos=27, lineno=2, colno=27) value: ' world' @@ -34,7 +34,7 @@ location: SourceLocation(pos=44, lineno=3, colno=17) end_location: SourceLocation(pos=49, lineno=3, colno=22) fragments: - + location: SourceLocation(pos=44, lineno=3, colno=17) end_location: SourceLocation(pos=49, lineno=3, colno=22) value: 'thing' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__say__1.txt b/packages/mecha/tests/snapshots/parse__say__1.txt index 056a1c5f5..481f4fd2e 100644 --- a/packages/mecha/tests/snapshots/parse__say__1.txt +++ b/packages/mecha/tests/snapshots/parse__say__1.txt @@ -11,7 +11,7 @@ location: SourceLocation(pos=13, lineno=2, colno=13) end_location: SourceLocation(pos=49, lineno=3, colno=22) fragments: - + location: SourceLocation(pos=13, lineno=2, colno=13) end_location: SourceLocation(pos=19, lineno=2, colno=19) value: 'hello ' @@ -21,15 +21,15 @@ variable: 's' arguments: - + location: SourceLocation(pos=21, lineno=2, colno=21) end_location: SourceLocation(pos=27, lineno=2, colno=27) value: ' world' - + location: SourceLocation(pos=39, lineno=3, colno=12) end_location: SourceLocation(pos=40, lineno=3, colno=13) value: ' ' - + location: SourceLocation(pos=40, lineno=3, colno=13) end_location: SourceLocation(pos=49, lineno=3, colno=22) value: 'say thing' \ No newline at end of file From 9d2b18395f6ebf3548848cbdf8e5c8c28aec8b5f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Dec 2021 12:21:56 +0100 Subject: [PATCH 0549/1554] fix: handle block_marker particles --- packages/mecha/mecha/ast.py | 8 + packages/mecha/mecha/parse.py | 5 + .../resources/command_examples.mcfunction | 1 + .../snapshots/parse__command_examples__0.txt | 151 +++++++++++++++++- .../snapshots/parse__command_examples__1.txt | 1 + 5 files changed, 164 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index f8bb6953b..2a615ea52 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -65,6 +65,7 @@ "AstFallingDustParticleParameters", "AstItemParticleParameters", "AstVibrationParticleParameters", + "AstBlockMarkerParticleParameters", "AstParticle", ] @@ -953,6 +954,13 @@ class AstVibrationParticleParameters(AstParticleParameters): duration: AstNumber = required_field() +@dataclass(frozen=True) +class AstBlockMarkerParticleParameters(AstParticleParameters): + """Ast block marker particle parameters node.""" + + block: AstBlock = required_field() + + @dataclass(frozen=True) class AstParticle(AstNode): """Ast particle node.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index d8beea201..3cb0c28e6 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -87,6 +87,7 @@ from .ast import ( AstAdvancementPredicate, AstBlock, + AstBlockMarkerParticleParameters, AstBlockParticleParameters, AstBlockState, AstBool, @@ -285,6 +286,10 @@ def get_default_parsers() -> Dict[str, Parser]: "duration": delegate("integer"), }, ), + "particle:minecraft:block_marker": AggregateParser( + type=AstBlockMarkerParticleParameters, + fields={"block": delegate("block_state")}, + ), ################################################################################ # Selector ################################################################################ diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index fc581d53f..fc84123a7 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -146,3 +146,4 @@ weather rain # other scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer scoreboard players set ✔ foo 42 +execute at @e[type=armor_stand, name="ctf", tag=!FlagBearer] run particle block_marker barrier ~ ~.8 ~ 0 0 0 0 1 force diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 5f33431d0..3a74e83ca 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6067, lineno=149, colno=1) + end_location: SourceLocation(pos=6186, lineno=150, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -5339,4 +5339,151 @@ location: SourceLocation(pos=6064, lineno=148, colno=30) end_location: SourceLocation(pos=6066, lineno=148, colno=32) - value: 42 \ No newline at end of file + value: 42 + + location: SourceLocation(pos=6067, lineno=149, colno=1) + end_location: SourceLocation(pos=6185, lineno=149, colno=119) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6075, lineno=149, colno=9) + end_location: SourceLocation(pos=6185, lineno=149, colno=119) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=6078, lineno=149, colno=12) + end_location: SourceLocation(pos=6127, lineno=149, colno=61) + variable: 'e' + arguments: + + location: SourceLocation(pos=6081, lineno=149, colno=15) + end_location: SourceLocation(pos=6097, lineno=149, colno=31) + inverted: False + key: + + location: SourceLocation(pos=6081, lineno=149, colno=15) + end_location: SourceLocation(pos=6085, lineno=149, colno=19) + value: 'type' + value: + + location: SourceLocation(pos=6086, lineno=149, colno=20) + end_location: SourceLocation(pos=6097, lineno=149, colno=31) + is_tag: False + namespace: None + path: 'armor_stand' + + location: SourceLocation(pos=6099, lineno=149, colno=33) + end_location: SourceLocation(pos=6109, lineno=149, colno=43) + inverted: False + key: + + location: SourceLocation(pos=6099, lineno=149, colno=33) + end_location: SourceLocation(pos=6103, lineno=149, colno=37) + value: 'name' + value: + + location: SourceLocation(pos=6104, lineno=149, colno=38) + end_location: SourceLocation(pos=6109, lineno=149, colno=43) + value: 'ctf' + + location: SourceLocation(pos=6111, lineno=149, colno=45) + end_location: SourceLocation(pos=6126, lineno=149, colno=60) + inverted: True + key: + + location: SourceLocation(pos=6111, lineno=149, colno=45) + end_location: SourceLocation(pos=6114, lineno=149, colno=48) + value: 'tag' + value: + + location: SourceLocation(pos=6116, lineno=149, colno=50) + end_location: SourceLocation(pos=6126, lineno=149, colno=60) + value: 'FlagBearer' + + location: SourceLocation(pos=6128, lineno=149, colno=62) + end_location: SourceLocation(pos=6185, lineno=149, colno=119) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6132, lineno=149, colno=66) + end_location: SourceLocation(pos=6185, lineno=149, colno=119) + identifier: 'particle:name:pos:delta:speed:count:force' + arguments: + + location: SourceLocation(pos=6141, lineno=149, colno=75) + end_location: SourceLocation(pos=6161, lineno=149, colno=95) + name: + + location: SourceLocation(pos=6141, lineno=149, colno=75) + end_location: SourceLocation(pos=6153, lineno=149, colno=87) + is_tag: False + namespace: None + path: 'block_marker' + parameters: + + location: SourceLocation(pos=6154, lineno=149, colno=88) + end_location: SourceLocation(pos=6161, lineno=149, colno=95) + block: + + location: SourceLocation(pos=6154, lineno=149, colno=88) + end_location: SourceLocation(pos=6161, lineno=149, colno=95) + identifier: + + location: SourceLocation(pos=6154, lineno=149, colno=88) + end_location: SourceLocation(pos=6161, lineno=149, colno=95) + is_tag: False + namespace: None + path: 'barrier' + block_states: + + data_tags: None + + location: SourceLocation(pos=6162, lineno=149, colno=96) + end_location: SourceLocation(pos=6169, lineno=149, colno=103) + x: + + location: SourceLocation(pos=6162, lineno=149, colno=96) + end_location: SourceLocation(pos=6163, lineno=149, colno=97) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6164, lineno=149, colno=98) + end_location: SourceLocation(pos=6167, lineno=149, colno=101) + type: 'relative' + value: 0.8 + z: + + location: SourceLocation(pos=6168, lineno=149, colno=102) + end_location: SourceLocation(pos=6169, lineno=149, colno=103) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6170, lineno=149, colno=104) + end_location: SourceLocation(pos=6175, lineno=149, colno=109) + x: + + location: SourceLocation(pos=6170, lineno=149, colno=104) + end_location: SourceLocation(pos=6171, lineno=149, colno=105) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=6172, lineno=149, colno=106) + end_location: SourceLocation(pos=6173, lineno=149, colno=107) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=6174, lineno=149, colno=108) + end_location: SourceLocation(pos=6175, lineno=149, colno=109) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=6176, lineno=149, colno=110) + end_location: SourceLocation(pos=6177, lineno=149, colno=111) + value: 0 + + location: SourceLocation(pos=6178, lineno=149, colno=112) + end_location: SourceLocation(pos=6179, lineno=149, colno=113) + value: 1 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index 0fb038b8f..adc542f1d 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -118,3 +118,4 @@ weather clear 1200 weather rain scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer scoreboard players set ✔ foo 42 +execute at @e[type=armor_stand, name=ctf, tag=!FlagBearer] run particle block_marker barrier ~ ~0.8 ~ 0 0 0 0 1 force From 67cdb090d679961c594c8c9de9ebaba3ffa3fab1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Dec 2021 11:26:34 +0000 Subject: [PATCH 0550/1554] 0.20.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 6 ++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 89326b841..956a9c531 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,12 @@ +## v0.20.3 (2021-12-07) +### Fix +* Handle block_marker particles ([`25bc124`](https://github.com/mcbeet/mecha/commit/25bc124ae6c9ab76ecea3204b512327e1d999bd5)) +* Shallow codegen snapshots ([`28d8696`](https://github.com/mcbeet/mecha/commit/28d8696f4946ac3da7dcf64f5644287e5057970a)) +* Use specialized nodes for literals ([`676fc54`](https://github.com/mcbeet/mecha/commit/676fc54ce3328917e50451f30ea85271e803c865)) + ## v0.20.2 (2021-12-06) ### Fix * Small optimization and update tokenstream to get sorted explanations ([`510da71`](https://github.com/mcbeet/mecha/commit/510da716aec9b393733bcb13e186e2c93da23317)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 5df139fe9..2081dc80e 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.20.2" +__version__ = "0.20.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f3758e894..35baf923a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.20.2" +version = "0.20.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 9014ca0a51f3c8d2532b51c2a2ce0a95d39606ce Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Dec 2021 12:38:32 +0100 Subject: [PATCH 0551/1554] test: add example for gathering objectives --- .../mecha/examples/gather_objectives/beet.yml | 6 ++++ .../mecha/examples/gather_objectives/demo.py | 23 +++++++++++++ .../src/data/demo/functions/foo.mcfunction | 3 ++ ...amples__build_gather_objectives__0.pack.md | 32 +++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 packages/mecha/examples/gather_objectives/beet.yml create mode 100644 packages/mecha/examples/gather_objectives/demo.py create mode 100644 packages/mecha/examples/gather_objectives/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md diff --git a/packages/mecha/examples/gather_objectives/beet.yml b/packages/mecha/examples/gather_objectives/beet.yml new file mode 100644 index 000000000..7ee8ac0e3 --- /dev/null +++ b/packages/mecha/examples/gather_objectives/beet.yml @@ -0,0 +1,6 @@ +require: + - demo +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/mecha/examples/gather_objectives/demo.py b/packages/mecha/examples/gather_objectives/demo.py new file mode 100644 index 000000000..b91555c37 --- /dev/null +++ b/packages/mecha/examples/gather_objectives/demo.py @@ -0,0 +1,23 @@ +from dataclasses import dataclass, field +from typing import Set + +from beet import Context, Function + +from mecha import AstObjective, Mecha, Reducer, rule + + +@dataclass +class ObjectiveCollector(Reducer): + objectives: Set[str] = field(default_factory=set) + + @rule(AstObjective) + def objective(self, node: AstObjective): + self.objectives.add(node.value) + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + objective_collector = ObjectiveCollector() + mc.check.extend(objective_collector) + yield + ctx.generate(Function([f"say {', '.join(sorted(objective_collector.objectives))}"])) diff --git a/packages/mecha/examples/gather_objectives/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/gather_objectives/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..1258dd802 --- /dev/null +++ b/packages/mecha/examples/gather_objectives/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,3 @@ +scoreboard players set @a foo 1 +say @a[scores={thing=..9}] +execute if score @s wat matches 7 run scoreboard players operation @s wat = @p[tag=target,scores={wow=1..},sort=nearest] wow diff --git a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md new file mode 100644 index 000000000..3db227732 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md @@ -0,0 +1,32 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 7, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +scoreboard players set @a foo 1 +say @a[scores={thing=..9}] +execute if score @s wat matches 7 run scoreboard players operation @s wat = @p[tag=target, scores={wow=1..}, sort=nearest] wow +``` + +### gather_objectives + +`@function gather_objectives:generated_0` + +```mcfunction +say foo, thing, wat, wow +``` From b2a1bd017e234127e7d03b71787d5712719b715e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 9 Dec 2021 14:11:31 +0100 Subject: [PATCH 0552/1554] feat: lower elif statements --- .../src/data/demo/functions/foo.mcfunction | 11 ++ .../mecha/mecha/contrib/scripting/codegen.py | 12 -- .../mecha/mecha/contrib/scripting/parse.py | 53 ++++- .../resources/scripting_examples.mcfunction | 42 ++++ ...examples__build_basic_scripting__0.pack.md | 12 ++ .../snapshots/scripting__parse_132__0.txt | 144 ++++++++++++++ .../snapshots/scripting__parse_132__1.txt | 49 +++++ .../snapshots/scripting__parse_133__0.txt | 158 +++++++++++++++ .../snapshots/scripting__parse_133__1.txt | 58 ++++++ .../snapshots/scripting__parse_134__0.txt | 168 ++++++++++++++++ .../snapshots/scripting__parse_134__1.txt | 57 ++++++ .../snapshots/scripting__parse_135__0.txt | 182 ++++++++++++++++++ .../snapshots/scripting__parse_135__1.txt | 66 +++++++ .../snapshots/scripting__parse_35__0.txt | 95 ++++----- .../snapshots/scripting__parse_35__1.txt | 12 +- 15 files changed, 1052 insertions(+), 67 deletions(-) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_132__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_132__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_133__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_133__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_134__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_134__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_135__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_135__1.txt diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 5d21d4c3c..7d55c7ed3 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -126,3 +126,14 @@ say do_stuff(1, math.pi) import ./thing as thing say (thing.do_stuff is do_stuff) + +for i in range(6) + if i == 1 + say 1 + elif i == 2 + say 2 + elif i == 3 + say 3 + else + say other + say done diff --git a/packages/mecha/mecha/contrib/scripting/codegen.py b/packages/mecha/mecha/contrib/scripting/codegen.py index 5095878ac..ca189d4de 100644 --- a/packages/mecha/mecha/contrib/scripting/codegen.py +++ b/packages/mecha/mecha/contrib/scripting/codegen.py @@ -431,18 +431,6 @@ def if_statement( yield from visit_body(cast(AstRoot, node.arguments[1]), acc) return [] - @rule(AstCommand, identifier="elif:condition:body") - def elif_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - condition = yield from visit_single(node.arguments[0], required=True) - acc.statement(f"elif {condition}:") - with acc.block(): - yield from visit_body(cast(AstRoot, node.arguments[1]), acc) - return [] - @rule(AstCommand, identifier="else:body") def else_statement( self, diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 1e562adde..2fbbfe8e4 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -8,7 +8,7 @@ "InterpolationParser", "parse_statement", "AssignmentTargetParser", - "IfElseConstraint", + "IfElseLoweringParser", "BreakContinueConstraint", "FlushPendingIdentifiersParser", "parse_function_signature", @@ -39,6 +39,7 @@ AlternativeParser, AstChildren, AstCommand, + AstNode, AstResourceLocation, AstRoot, Parser, @@ -265,7 +266,7 @@ def create_scripting_root_parser(parser: Parser): ReturnConstraint( YieldConstraint( BreakContinueConstraint( - parser=IfElseConstraint(parser), + parser=IfElseLoweringParser(parser), allowed_scopes={ ("while", "condition", "body"), ("for", "target", "in", "iterable", "body"), @@ -372,24 +373,64 @@ def __call__(self, stream: TokenStream) -> AstAssignmentTarget: @dataclass -class IfElseConstraint: - """Constraint that makes sure that if statements are properly formed.""" +class IfElseLoweringParser: + """Parser that turns elif statements into if statements in an else clause.""" parser: Parser def __call__(self, stream: TokenStream) -> AstRoot: node: AstRoot = self.parser(stream) + changed = False + result: List[AstCommand] = [] + + commands = iter(node.commands) previous = "" - for command in node.commands: + for command in commands: if command.identifier in ["elif:condition:body", "else:body"]: if previous not in ["if:condition:body", "elif:condition:body"]: exc = InvalidSyntax( "Conditional branch must be part of an if statement." ) raise set_location(exc, command) + + if command.identifier == "elif:condition:body": + changed = True + elif_chain = [command] + + for command in commands: + if command.identifier not in ["elif:condition:body", "else:body"]: + break + elif_chain.append(command) + else: + command = None + + if elif_chain[-1].identifier == "else:body": + last = [elif_chain.pop()] + else: + last = [] + + for stmt in reversed(elif_chain): + stmt = replace(stmt, identifier="if:condition:body") + stmt = AstRoot(commands=AstChildren([stmt, *last])) + stmt = set_location(stmt, stmt.commands[0], stmt.commands[-1]) + stmt = AstCommand( + identifier="else:body", + arguments=cast(AstChildren[AstNode], AstChildren([stmt])), + ) + last = [set_location(stmt, stmt.arguments[0])] + + result.append(last[0]) + + if not command: + break + previous = command.identifier + result.append(command) + + if changed: + node = replace(node, commands=AstChildren(result)) return node @@ -827,7 +868,7 @@ def __call__(self, stream: TokenStream) -> Any: value = int(number.value) arguments.append( - set_location(AstValue(value=value), stream.current) + set_location(AstValue(value=value), stream.current) # type: ignore ) else: diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index b06da8f74..a0dd6110a 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -453,3 +453,45 @@ if score @s tmp matches 1.. if entity @p[tag=foo] say no ### setblock = 0 +### +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +### +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +say done +### +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +else + say other +### +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +else + say other +say done diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index e4d8154e6..2ae77f332 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -89,6 +89,18 @@ say -1.0 say True say 0.0 say True +say other +say done +say 1 +say done +say 2 +say done +say 3 +say done +say other +say done +say other +say done ``` `@function(strip_final_newline) demo:thing` diff --git a/packages/mecha/tests/snapshots/scripting__parse_132__0.txt b/packages/mecha/tests/snapshots/scripting__parse_132__0.txt new file mode 100644 index 000000000..05be23822 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_132__0.txt @@ -0,0 +1,144 @@ +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=6) + end_location: SourceLocation(pos=21, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=37, lineno=5, colno=6) + end_location: SourceLocation(pos=38, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=54, lineno=7, colno=6) + end_location: SourceLocation(pos=55, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + value: '4' diff --git a/packages/mecha/tests/snapshots/scripting__parse_132__1.txt b/packages/mecha/tests/snapshots/scripting__parse_132__1.txt new file mode 100644 index 000000000..a9b40c6ef --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_132__1.txt @@ -0,0 +1,49 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + if 1: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + else: + if 2: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + else: + if 3: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + else: + if 4: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var0))--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + diff --git a/packages/mecha/tests/snapshots/scripting__parse_133__0.txt b/packages/mecha/tests/snapshots/scripting__parse_133__0.txt new file mode 100644 index 000000000..b944adf0a --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_133__0.txt @@ -0,0 +1,158 @@ +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +say done +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=74, lineno=9, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=6) + end_location: SourceLocation(pos=21, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=37, lineno=5, colno=6) + end_location: SourceLocation(pos=38, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=54, lineno=7, colno=6) + end_location: SourceLocation(pos=55, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + value: '4' + + location: SourceLocation(pos=66, lineno=9, colno=1) + end_location: SourceLocation(pos=74, lineno=9, colno=9) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=70, lineno=9, colno=5) + end_location: SourceLocation(pos=74, lineno=9, colno=9) + fragments: + + location: SourceLocation(pos=70, lineno=9, colno=5) + end_location: SourceLocation(pos=74, lineno=9, colno=9) + value: 'done' diff --git a/packages/mecha/tests/snapshots/scripting__parse_133__1.txt b/packages/mecha/tests/snapshots/scripting__parse_133__1.txt new file mode 100644 index 000000000..1c2b0185f --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_133__1.txt @@ -0,0 +1,58 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + if 1: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + else: + if 2: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + else: + if 3: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + else: + if 4: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + _mecha_runtime.commands.append(_mecha_refs[4]) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var0))--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=66, lineno=9, colno=1) + end_location: SourceLocation(pos=74, lineno=9, colno=9) + identifier: 'say:message' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=74, lineno=9, colno=9) + commands: + + + diff --git a/packages/mecha/tests/snapshots/scripting__parse_134__0.txt b/packages/mecha/tests/snapshots/scripting__parse_134__0.txt new file mode 100644 index 000000000..e263daf5e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_134__0.txt @@ -0,0 +1,168 @@ +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +else + say other +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=6) + end_location: SourceLocation(pos=21, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=37, lineno=5, colno=6) + end_location: SourceLocation(pos=38, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=54, lineno=7, colno=6) + end_location: SourceLocation(pos=55, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + value: '4' + + location: SourceLocation(pos=66, lineno=9, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=75, lineno=10, colno=5) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=75, lineno=10, colno=5) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=79, lineno=10, colno=9) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + fragments: + + location: SourceLocation(pos=79, lineno=10, colno=9) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + value: 'other' diff --git a/packages/mecha/tests/snapshots/scripting__parse_134__1.txt b/packages/mecha/tests/snapshots/scripting__parse_134__1.txt new file mode 100644 index 000000000..0f86a52eb --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_134__1.txt @@ -0,0 +1,57 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + if 1: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + else: + if 2: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + else: + if 3: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + else: + if 4: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + else: + _mecha_runtime.commands.extend(_mecha_refs[4].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var0))--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=75, lineno=10, colno=5) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + diff --git a/packages/mecha/tests/snapshots/scripting__parse_135__0.txt b/packages/mecha/tests/snapshots/scripting__parse_135__0.txt new file mode 100644 index 000000000..0976fd045 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_135__0.txt @@ -0,0 +1,182 @@ +if 1 + say 1 +elif 2 + say 2 +elif 3 + say 3 +elif 4 + say 4 +else + say other +say done +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=93, lineno=11, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=9) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=6) + end_location: SourceLocation(pos=21, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=30, lineno=4, colno=9) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=32, lineno=5, colno=1) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=37, lineno=5, colno=6) + end_location: SourceLocation(pos=38, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=47, lineno=6, colno=9) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=49, lineno=7, colno=1) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=54, lineno=7, colno=6) + end_location: SourceLocation(pos=55, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=64, lineno=8, colno=9) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + value: '4' + + location: SourceLocation(pos=66, lineno=9, colno=1) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=75, lineno=10, colno=5) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=75, lineno=10, colno=5) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=79, lineno=10, colno=9) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + fragments: + + location: SourceLocation(pos=79, lineno=10, colno=9) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + value: 'other' + + location: SourceLocation(pos=85, lineno=11, colno=1) + end_location: SourceLocation(pos=93, lineno=11, colno=9) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=89, lineno=11, colno=5) + end_location: SourceLocation(pos=93, lineno=11, colno=9) + fragments: + + location: SourceLocation(pos=89, lineno=11, colno=5) + end_location: SourceLocation(pos=93, lineno=11, colno=9) + value: 'done' diff --git a/packages/mecha/tests/snapshots/scripting__parse_135__1.txt b/packages/mecha/tests/snapshots/scripting__parse_135__1.txt new file mode 100644 index 000000000..36e9db24e --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_135__1.txt @@ -0,0 +1,66 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + if 1: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + else: + if 2: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + else: + if 3: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + else: + if 4: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + else: + _mecha_runtime.commands.extend(_mecha_refs[4].commands) + _mecha_runtime.commands.append(_mecha_refs[5]) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var0))--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=9, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=26, lineno=4, colno=5) + end_location: SourceLocation(pos=31, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=43, lineno=6, colno=5) + end_location: SourceLocation(pos=48, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=60, lineno=8, colno=5) + end_location: SourceLocation(pos=65, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=75, lineno=10, colno=5) + end_location: SourceLocation(pos=84, lineno=10, colno=14) + commands: + +_mecha_refs[5] + + location: SourceLocation(pos=85, lineno=11, colno=1) + end_location: SourceLocation(pos=93, lineno=11, colno=9) + identifier: 'say:message' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=93, lineno=11, colno=9) + commands: + + + diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt index fbdaabeed..39e680e12 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt @@ -37,59 +37,68 @@ else value: 'hello' location: SourceLocation(pos=22, lineno=3, colno=1) - end_location: SourceLocation(pos=54, lineno=4, colno=14) - identifier: 'elif:condition:body' + end_location: SourceLocation(pos=73, lineno=6, colno=14) + identifier: 'else:body' arguments: - - location: SourceLocation(pos=27, lineno=3, colno=6) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - operator: 'or' - left: - - location: SourceLocation(pos=27, lineno=3, colno=6) - end_location: SourceLocation(pos=31, lineno=3, colno=10) - value: True - right: - - location: SourceLocation(pos=35, lineno=3, colno=14) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - value: False - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=22, lineno=3, colno=1) + end_location: SourceLocation(pos=73, lineno=6, colno=14) commands: - location: SourceLocation(pos=45, lineno=4, colno=5) + location: SourceLocation(pos=22, lineno=3, colno=1) end_location: SourceLocation(pos=54, lineno=4, colno=14) - identifier: 'say:message' + identifier: 'if:condition:body' arguments: - - location: SourceLocation(pos=49, lineno=4, colno=9) + + location: SourceLocation(pos=27, lineno=3, colno=6) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + operator: 'or' + left: + + location: SourceLocation(pos=27, lineno=3, colno=6) + end_location: SourceLocation(pos=31, lineno=3, colno=10) + value: True + right: + + location: SourceLocation(pos=35, lineno=3, colno=14) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + value: False + + location: SourceLocation(pos=45, lineno=4, colno=5) end_location: SourceLocation(pos=54, lineno=4, colno=14) - fragments: - - location: SourceLocation(pos=49, lineno=4, colno=9) + commands: + + location: SourceLocation(pos=45, lineno=4, colno=5) end_location: SourceLocation(pos=54, lineno=4, colno=14) - value: 'hello' - - location: SourceLocation(pos=55, lineno=5, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) - commands: + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + fragments: + + location: SourceLocation(pos=49, lineno=4, colno=9) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + value: 'hello' - location: SourceLocation(pos=64, lineno=6, colno=5) + location: SourceLocation(pos=55, lineno=5, colno=1) end_location: SourceLocation(pos=73, lineno=6, colno=14) - identifier: 'say:message' + identifier: 'else:body' arguments: - - location: SourceLocation(pos=68, lineno=6, colno=9) + + location: SourceLocation(pos=64, lineno=6, colno=5) end_location: SourceLocation(pos=73, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=68, lineno=6, colno=9) + commands: + + location: SourceLocation(pos=64, lineno=6, colno=5) end_location: SourceLocation(pos=73, lineno=6, colno=14) - value: 'hello' + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=68, lineno=6, colno=9) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt index 8d7ec9136..26a1091cb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -1,14 +1,15 @@ -_mecha_lineno = [1, 7], [1, 3] +_mecha_lineno = [1, 8], [1, 3] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var0: if True: _mecha_runtime.commands.extend(_mecha_refs[0].commands) - elif ( -True or False): - _mecha_runtime.commands.extend(_mecha_refs[1].commands) else: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) + if ( +True or False): + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + else: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) _mecha_var1 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var0))--- output = _mecha_var1 --- @@ -37,4 +38,3 @@ _mecha_refs[3] commands: - From 1c46a43994c8ef4174c8c3f7bea56430cc7fec74 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 14 Dec 2021 01:24:04 +0100 Subject: [PATCH 0553/1554] fix: edge-case for optional resource locations --- packages/mecha/mecha/parse.py | 32 ++++++----- .../resources/command_examples.mcfunction | 1 + .../multiline_command_examples.mcfunction | 1 + .../snapshots/parse__command_examples__0.txt | 55 ++++++++++++++++++- .../snapshots/parse__command_examples__1.txt | 1 + .../parse__multiline_command_examples__0.txt | 55 ++++++++++++++++++- .../parse__multiline_command_examples__1.txt | 1 + .../snapshots/scripting__parse_103__0.txt | 2 +- .../snapshots/scripting__parse_103__1.txt | 2 +- 9 files changed, 130 insertions(+), 20 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 3cb0c28e6..0b64f3f16 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -561,7 +561,7 @@ def parse_command(stream: TokenStream) -> AstCommand: location = stream.expect().location end_location = location - while tree and tree.children: + while tree: with stream.checkpoint() as commit: literal = stream.expect("literal") @@ -577,13 +577,14 @@ def parse_command(stream: TokenStream) -> AstCommand: commit() - if commit.rollback and tree.children: - for (name, child), alternative in stream.choose( - *sorted( - tree.children.items(), - key=lambda p: p[1].type != "argument", - ) - ): + if commit.rollback: + choices = list((tree.children or {}).items()) + choices.sort(key=lambda p: p[1].type != "argument") + + if tree.executable: + choices.append(("", tree)) + + for (name, child), alternative in stream.choose(*choices): with alternative, stream.provide( scope=scope + (name,), line_indentation=level, @@ -591,7 +592,12 @@ def parse_command(stream: TokenStream) -> AstCommand: literal = None argument = None - if child.type == "literal": + if tree is child: + if stream.peek(): + stream.expect("newline", "eof") + reached_terminal = True + continue + elif child.type == "literal": literal = stream.expect(("literal", name)) elif child.type == "argument": argument = delegate("command:argument", stream) @@ -614,16 +620,14 @@ def parse_command(stream: TokenStream) -> AstCommand: break with stream.provide(line_indentation=level): - if not consume_line_continuation(stream): - if tree.executable and ( - not stream.peek() or stream.get("newline", "eof") - ): - break + consume_line_continuation(stream) target = spec.tree.get(tree.redirect) recursive = target and target.subcommand if tree.subcommand or recursive: + if tree.executable and (not stream.peek() or stream.get("newline", "eof")): + break subcommand_scope = tree.redirect if tree.redirect is not None else scope with stream.provide(scope=subcommand_scope, line_indentation=level): node = delegate("command", stream) diff --git a/packages/mecha/mecha/resources/command_examples.mcfunction b/packages/mecha/mecha/resources/command_examples.mcfunction index fc84123a7..87cedbe7d 100644 --- a/packages/mecha/mecha/resources/command_examples.mcfunction +++ b/packages/mecha/mecha/resources/command_examples.mcfunction @@ -147,3 +147,4 @@ weather rain scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer scoreboard players set ✔ foo 42 execute at @e[type=armor_stand, name="ctf", tag=!FlagBearer] run particle block_marker barrier ~ ~.8 ~ 0 0 0 0 1 force +execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 diff --git a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction index ab9d6f216..3df2fb74f 100644 --- a/packages/mecha/mecha/resources/multiline_command_examples.mcfunction +++ b/packages/mecha/mecha/resources/multiline_command_examples.mcfunction @@ -105,3 +105,4 @@ gamerule scoreboard players set #index global 3 scoreboard players set $index global 3 scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer +execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 3a74e83ca..19267aa36 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6186, lineno=150, colno=1) + end_location: SourceLocation(pos=6265, lineno=151, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -5486,4 +5486,55 @@ location: SourceLocation(pos=6178, lineno=149, colno=112) end_location: SourceLocation(pos=6179, lineno=149, colno=113) - value: 1 \ No newline at end of file + value: 1 + + location: SourceLocation(pos=6186, lineno=150, colno=1) + end_location: SourceLocation(pos=6264, lineno=150, colno=79) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6194, lineno=150, colno=9) + end_location: SourceLocation(pos=6264, lineno=150, colno=79) + identifier: 'execute:store:result:score:targets:objective:subcommand' + arguments: + + location: SourceLocation(pos=6213, lineno=150, colno=28) + end_location: SourceLocation(pos=6215, lineno=150, colno=30) + variable: 's' + arguments: + + + location: SourceLocation(pos=6216, lineno=150, colno=31) + end_location: SourceLocation(pos=6228, lineno=150, colno=43) + value: 'smithed.data' + + location: SourceLocation(pos=6229, lineno=150, colno=44) + end_location: SourceLocation(pos=6264, lineno=150, colno=79) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6233, lineno=150, colno=48) + end_location: SourceLocation(pos=6264, lineno=150, colno=79) + identifier: 'clear:targets:item:maxCount' + arguments: + + location: SourceLocation(pos=6239, lineno=150, colno=54) + end_location: SourceLocation(pos=6241, lineno=150, colno=56) + variable: 's' + arguments: + + + location: SourceLocation(pos=6242, lineno=150, colno=57) + end_location: SourceLocation(pos=6262, lineno=150, colno=77) + identifier: + + location: SourceLocation(pos=6242, lineno=150, colno=57) + end_location: SourceLocation(pos=6262, lineno=150, colno=77) + is_tag: True + namespace: 'smithed' + path: 'crafter/all' + data_tags: None + + location: SourceLocation(pos=6263, lineno=150, colno=78) + end_location: SourceLocation(pos=6264, lineno=150, colno=79) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index adc542f1d..fd35163e6 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -119,3 +119,4 @@ weather rain scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer scoreboard players set ✔ foo 42 execute at @e[type=armor_stand, name=ctf, tag=!FlagBearer] run particle block_marker barrier ~ ~0.8 ~ 0 0 0 0 1 force +execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index 8cf3c5d8a..1a6ba346a 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1928, lineno=108, colno=1) + end_location: SourceLocation(pos=2007, lineno=109, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -1005,4 +1005,55 @@ location: SourceLocation(pos=1920, lineno=107, colno=72) end_location: SourceLocation(pos=1927, lineno=107, colno=79) - value: 'integer' \ No newline at end of file + value: 'integer' + + location: SourceLocation(pos=1928, lineno=108, colno=1) + end_location: SourceLocation(pos=2006, lineno=108, colno=79) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=1936, lineno=108, colno=9) + end_location: SourceLocation(pos=2006, lineno=108, colno=79) + identifier: 'execute:store:result:score:targets:objective:subcommand' + arguments: + + location: SourceLocation(pos=1955, lineno=108, colno=28) + end_location: SourceLocation(pos=1957, lineno=108, colno=30) + variable: 's' + arguments: + + + location: SourceLocation(pos=1958, lineno=108, colno=31) + end_location: SourceLocation(pos=1970, lineno=108, colno=43) + value: 'smithed.data' + + location: SourceLocation(pos=1971, lineno=108, colno=44) + end_location: SourceLocation(pos=2006, lineno=108, colno=79) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=1975, lineno=108, colno=48) + end_location: SourceLocation(pos=2006, lineno=108, colno=79) + identifier: 'clear:targets:item:maxCount' + arguments: + + location: SourceLocation(pos=1981, lineno=108, colno=54) + end_location: SourceLocation(pos=1983, lineno=108, colno=56) + variable: 's' + arguments: + + + location: SourceLocation(pos=1984, lineno=108, colno=57) + end_location: SourceLocation(pos=2004, lineno=108, colno=77) + identifier: + + location: SourceLocation(pos=1984, lineno=108, colno=57) + end_location: SourceLocation(pos=2004, lineno=108, colno=77) + is_tag: True + namespace: 'smithed' + path: 'crafter/all' + data_tags: None + + location: SourceLocation(pos=2005, lineno=108, colno=78) + end_location: SourceLocation(pos=2006, lineno=108, colno=79) + value: 0 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt index 6f50e6167..e85b28e5b 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__1.txt @@ -22,3 +22,4 @@ gamerule doDaylightCycle false scoreboard players set #index global 3 scoreboard players set $index global 3 scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer +execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__0.txt b/packages/mecha/tests/snapshots/scripting__parse_103__0.txt index aa5c1ddaf..28c508a79 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_103__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_103__0.txt @@ -10,7 +10,7 @@ as @a at @s if block ~ ~-1 ~ #wool give @s stone{ --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=211, lineno=10, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) commands: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt index a66e3fdbd..004c61af5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_103__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_103__1.txt @@ -152,7 +152,7 @@ _mecha_refs[17] _mecha_refs[18] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=211, lineno=10, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) commands: From 7a83a1d016cccabbc5717d7f5d31619ab8c6548c Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 14 Dec 2021 00:30:27 +0000 Subject: [PATCH 0554/1554] 0.21.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 956a9c531..81d03b978 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.21.0 (2021-12-14) +### Feature +* Lower elif statements ([`c49122f`](https://github.com/mcbeet/mecha/commit/c49122fe4aa37f042d81c66e6572b3206efe62c5)) + +### Fix +* Edge-case for optional resource locations ([`a55b3d6`](https://github.com/mcbeet/mecha/commit/a55b3d60a4331eabb92fe1b2f5e6da8d51f08251)) + ## v0.20.3 (2021-12-07) ### Fix * Handle block_marker particles ([`25bc124`](https://github.com/mcbeet/mecha/commit/25bc124ae6c9ab76ecea3204b512327e1d999bd5)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 2081dc80e..d2e00b18d 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.20.3" +__version__ = "0.21.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 35baf923a..69265a369 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.20.3" +version = "0.21.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3817880f9905dcc766ae12a92f31e454fbcd41c5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Dec 2021 18:23:03 +0100 Subject: [PATCH 0555/1554] feat: add python colon --- .../src/data/demo/functions/foo.mcfunction | 20 +- .../src/data/demo/functions/foo.mcfunction | 42 ++--- .../src/data/demo/functions/thing.mcfunction | 2 +- .../data/demo/functions/nesting.mcfunction | 18 +- packages/mecha/mecha/api.py | 4 +- packages/mecha/mecha/contrib/nesting.py | 64 ++----- .../mecha/mecha/contrib/scripting/parse.py | 5 +- packages/mecha/mecha/parse.py | 15 +- .../resources/scripting_examples.mcfunction | 176 +++++++++--------- ...ment_examples_minecraft_message_1_0__0.txt | 2 +- ...ent_examples_minecraft_nbt_tag_1_11__0.txt | 2 +- ...ment_examples_minecraft_nbt_tag_1_3__0.txt | 2 +- .../snapshots/scripting__parse_101__0.txt | 22 +-- .../snapshots/scripting__parse_101__1.txt | 6 +- .../snapshots/scripting__parse_118__0.txt | 68 +++---- .../snapshots/scripting__parse_118__1.txt | 10 +- .../snapshots/scripting__parse_119__0.txt | 4 +- .../snapshots/scripting__parse_11__0.txt | 2 +- .../snapshots/scripting__parse_120__0.txt | 14 +- .../snapshots/scripting__parse_120__1.txt | 2 +- .../snapshots/scripting__parse_129__0.txt | 54 +++--- .../snapshots/scripting__parse_129__1.txt | 6 +- .../snapshots/scripting__parse_130__0.txt | 71 +++---- .../snapshots/scripting__parse_130__1.txt | 33 ++-- .../snapshots/scripting__parse_132__0.txt | 124 ++++++------ .../snapshots/scripting__parse_132__1.txt | 18 +- .../snapshots/scripting__parse_133__0.txt | 136 +++++++------- .../snapshots/scripting__parse_133__1.txt | 22 +-- .../snapshots/scripting__parse_134__0.txt | 146 +++++++-------- .../snapshots/scripting__parse_134__1.txt | 22 +-- .../snapshots/scripting__parse_135__0.txt | 158 ++++++++-------- .../snapshots/scripting__parse_135__1.txt | 26 +-- .../snapshots/scripting__parse_34__0.txt | 26 +-- .../snapshots/scripting__parse_34__1.txt | 2 +- .../snapshots/scripting__parse_35__0.txt | 86 ++++----- .../snapshots/scripting__parse_35__1.txt | 14 +- .../snapshots/scripting__parse_36__0.txt | 10 +- .../snapshots/scripting__parse_37__0.txt | 8 +- .../snapshots/scripting__parse_40__0.txt | 10 +- .../snapshots/scripting__parse_41__0.txt | 22 +-- .../snapshots/scripting__parse_41__1.txt | 6 +- .../snapshots/scripting__parse_42__0.txt | 89 ++++----- .../snapshots/scripting__parse_42__1.txt | 31 +-- .../snapshots/scripting__parse_43__0.txt | 55 +++--- .../snapshots/scripting__parse_43__1.txt | 27 +-- .../snapshots/scripting__parse_44__0.txt | 73 ++++---- .../snapshots/scripting__parse_44__1.txt | 31 +-- .../snapshots/scripting__parse_45__0.txt | 47 ++--- .../snapshots/scripting__parse_45__1.txt | 27 +-- .../snapshots/scripting__parse_46__0.txt | 95 +++++----- .../snapshots/scripting__parse_46__1.txt | 27 +-- .../snapshots/scripting__parse_51__0.txt | 22 +-- .../snapshots/scripting__parse_51__1.txt | 6 +- .../snapshots/scripting__parse_54__0.txt | 4 +- .../snapshots/scripting__parse_55__0.txt | 26 +-- .../snapshots/scripting__parse_55__1.txt | 2 +- .../snapshots/scripting__parse_61__0.txt | 4 +- .../snapshots/scripting__parse_62__0.txt | 26 +-- .../snapshots/scripting__parse_62__1.txt | 6 +- .../snapshots/scripting__parse_63__0.txt | 14 +- .../snapshots/scripting__parse_63__1.txt | 2 +- .../snapshots/scripting__parse_64__0.txt | 36 ++-- .../snapshots/scripting__parse_64__1.txt | 2 +- .../snapshots/scripting__parse_70__0.txt | 34 ++-- .../snapshots/scripting__parse_70__1.txt | 6 +- .../snapshots/scripting__parse_71__0.txt | 48 ++--- .../snapshots/scripting__parse_71__1.txt | 2 +- .../snapshots/scripting__parse_72__0.txt | 22 +-- .../snapshots/scripting__parse_72__1.txt | 6 +- .../snapshots/scripting__parse_75__0.txt | 10 +- .../snapshots/scripting__parse_76__0.txt | 4 +- .../snapshots/scripting__parse_77__0.txt | 38 ++-- .../snapshots/scripting__parse_77__1.txt | 6 +- .../snapshots/scripting__parse_78__0.txt | 4 +- .../snapshots/scripting__parse_79__0.txt | 4 +- .../snapshots/scripting__parse_80__0.txt | 8 +- .../snapshots/scripting__parse_81__0.txt | 142 +++++++------- .../snapshots/scripting__parse_81__1.txt | 10 +- .../snapshots/scripting__parse_82__0.txt | 84 ++++----- .../snapshots/scripting__parse_82__1.txt | 2 +- .../snapshots/scripting__parse_83__0.txt | 6 +- .../snapshots/scripting__parse_84__0.txt | 14 +- .../snapshots/scripting__parse_84__1.txt | 2 +- .../snapshots/scripting__parse_87__0.txt | 48 ++--- .../snapshots/scripting__parse_87__1.txt | 2 +- .../snapshots/scripting__parse_88__0.txt | 2 +- .../snapshots/scripting__parse_89__0.txt | 42 ++--- .../snapshots/scripting__parse_89__1.txt | 14 +- .../snapshots/scripting__parse_90__0.txt | 4 +- .../snapshots/scripting__parse_97__0.txt | 62 +++--- .../snapshots/scripting__parse_97__1.txt | 2 +- .../snapshots/scripting__parse_98__0.txt | 6 +- .../snapshots/scripting__parse_99__0.txt | 6 +- 93 files changed, 1381 insertions(+), 1391 deletions(-) diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction index 5c3cb4d3c..ecb73a1a3 100644 --- a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -1,43 +1,43 @@ -function demo:thing1 +function demo:thing1: say hello say world - function demo:thing2 + function demo:thing2: say this is a test function - demo:thing3 + demo:thing3: say this is a test -execute as @a at @s run function demo:thing4 +execute as @a at @s run function demo:thing4: setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone execute as @a at @s run - function demo:thing5 + function demo:thing5: setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone -execute as @a at @s +execute as @a at @s: setblock ~ ~ ~ stone_pressure_plate # Some comment setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone -execute - execute as @a - execute at @s +execute: + execute as @a: + execute at @s: setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone -execute as @a at @s expand +execute as @a at @s expand: say hello say world diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 7d55c7ed3..5c3665653 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -1,18 +1,18 @@ say hello say this is a function file augmented with mecha -if score @s tmp matches 1.. as @a +if score @s tmp matches 1.. as @a: for feature in [ "multiline", "nesting", "implicit execute", "relative location", - ] + ]: say (feature + " is automatically enabled") message = "abc" * 5 say message.upper() -def you_can_make_functions() +def you_can_make_functions(): say you_can_make_functions.__name__.replace("_", " ").capitalize() tellraw @a [ "", @@ -22,8 +22,8 @@ def you_can_make_functions() say you_can_make_functions() -def fib(n) - if n <= 1 +def fib(n): + if n <= 1: return n return fib(n - 1) + fib(n - 2) @@ -38,7 +38,7 @@ def default_params_are_neat( "number": number, "result": result, }, -) +): say Unlike in python default params are evaluated when the function is called say number say result @@ -51,9 +51,9 @@ say functions are first-class objects just like in python my_functions = [] -for i in "abc" - def functions_in_loop(value) - def yo() +for i in "abc": + def functions_in_loop(value): + def yo(): say value.upper() return yo my_functions.append(functions_in_loop(i * 3)) @@ -64,8 +64,8 @@ my_functions[2]() should_break = False -while True - if should_break +while True: + if should_break: break say just once should_break = True @@ -90,22 +90,22 @@ if score @s tmp matches (x, None) say wat if score @s tmp matches f"{x}.." say wat -def copy_items(type, count) - for i in range(count) +def copy_items(type, count): + for i in range(count): item replace entity @a f"{type}.{i}" from entity @s f"{type}.{i}" copy_items('hotbar', 9) copy_items('inventory', 26) -def f() +def f(): yield 1 yield 2 yield 3 -for i in f() +for i in f(): say i -def wow(ok) +def wow(ok): yield from ok() yield from ok() @@ -127,13 +127,13 @@ import ./thing as thing say (thing.do_stuff is do_stuff) -for i in range(6) - if i == 1 +for i in range(6): + if i == 1: say 1 - elif i == 2 + elif i == 2: say 2 - elif i == 3 + elif i == 3: say 3 - else + else: say other say done diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction index 4c1cc294d..e10ba55cc 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/thing.mcfunction @@ -1,3 +1,3 @@ -def do_stuff(a, b) +def do_stuff(a, b): import math return a + math.cos(b) diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction index 8420488dc..3bd2532f3 100644 --- a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/nesting.mcfunction @@ -1,41 +1,41 @@ -as @a at @s +as @a at @s: say hello say world as @a at @s - if score @s tmp matches 1 + if score @s tmp matches 1: say hello say world -function ./nesting/foo +function ./nesting/foo: say this is a test -as @a at @s expand +as @a at @s expand: say 1 say 2 -as @a at @s expand - if score @s tmp matches 1 expand +as @a at @s expand: + if score @s tmp matches 1 expand: say 1 say 2 -if data storage imp:temp iter.words.remaining[] function ./nesting/loop +if data storage imp:temp iter.words.remaining[] function ./nesting/loop: say wow if data storage imp:temp iter.words.remaining[] function ./nesting/loop -if score @s tmp matches 0 +if score @s tmp matches 0: at @e[type=pig] setblock ~ ~ ~ stone at @e[type=sheep] setblock ~ ~ ~ dirt if score @s tmp matches 0 - at @e[type=pig] + at @e[type=pig]: unless entity @e[type=sheep] setblock ~ ~ ~ dirt diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 2db5e1649..7e8f563ed 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -32,7 +32,7 @@ from tokenstream import InvalidSyntax, TokenStream from tokenstream.location import set_location -from .ast import AstNode, AstRoot +from .ast import AstLiteral, AstNode, AstRoot from .config import CommandTree from .database import CompilationDatabase, CompilationUnit from .diagnostic import ( @@ -191,7 +191,7 @@ def prepare_token_stream( spec=self.spec, multiline=self.spec.multiline if multiline is None else multiline, ): - with stream.reset_syntax(comment=r"#.*$", literal=r"\S+"): + with stream.reset_syntax(comment=r"#.*$", literal=AstLiteral.regex.pattern): with stream.indent(skip=["comment"]), stream.ignore("indent", "dedent"): with stream.intercept("newline", "eof"): yield stream diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 5c01bc794..927ff926d 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -2,15 +2,13 @@ __all__ = [ - "AstNestedExecute", - "NestedExecuteParser", "NestedCommandsTransformer", "parse_nested_root", ] from dataclasses import dataclass, replace -from typing import Any, List, cast +from typing import List, cast from beet import Context, Function from beet.core.utils import required_field @@ -26,11 +24,8 @@ Diagnostic, Mecha, MutatingReducer, - Parser, consume_line_continuation, delegate, - get_stream_properties, - get_stream_scope, rule, ) @@ -50,6 +45,11 @@ } }, }, + "commands": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + }, }, }, "function": { @@ -73,13 +73,6 @@ } -@dataclass(frozen=True) -class AstNestedExecute(AstNode): - """Ast nested execute node.""" - - root: AstRoot = required_field() - - def beet_default(ctx: Context): mc = ctx.inject(Mecha) @@ -88,18 +81,16 @@ def beet_default(ctx: Context): mc.spec.parsers["nested_root"] = parse_nested_root mc.spec.parsers["command:argument:mecha:nested_root"] = delegate("nested_root") - mc.spec.parsers["command"] = NestedExecuteParser(parser=mc.spec.parsers["command"]) mc.transform.extend(NestedCommandsTransformer(ctx=ctx, database=mc.database)) def parse_nested_root(stream: TokenStream) -> AstRoot: """Parse nested root.""" - properties = get_stream_properties(stream) - - if properties.get("check_nesting", True): - with stream.intercept("indent"): - stream.expect("indent") + with stream.syntax(colon=r":"), stream.intercept("newline", "indent"): + stream.expect("colon") + stream.expect("newline") + stream.expect("indent") level, command_level = stream.indentation[-2:] @@ -125,26 +116,6 @@ def parse_nested_root(stream: TokenStream) -> AstRoot: return set_location(node, commands[0], commands[-1]) -@dataclass -class NestedExecuteParser: - """Parser for nested execute.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - scope = get_stream_scope(stream) - - if scope == ("execute",): - with stream.checkpoint(), stream.intercept("indent"): - indent = stream.get("indent") - - if indent: - node = delegate("nested_root", stream) - return set_location(AstNestedExecute(root=node), node) - - return self.parser(stream) - - @dataclass class NestedCommandsTransformer(MutatingReducer): """Transformer that handles nested commands.""" @@ -178,12 +149,13 @@ def nested_function(self, node: AstCommand): return replace(node, identifier="function:name", arguments=AstChildren([name])) - @rule(AstNestedExecute) - def nested_execute(self, node: AstNestedExecute): + @rule(AstCommand, identifier="execute:commands") + def nested_execute(self, node: AstCommand): generate = self.ctx.generate["nested_execute"] + root = cast(AstRoot, node.arguments[0]) - if len(node.root.commands) == 1: - subcommand = node.root.commands[0] + if len(root.commands) == 1: + subcommand = root.commands[0] if subcommand.identifier == "execute:subcommand": return subcommand.arguments[0] @@ -194,7 +166,7 @@ def nested_execute(self, node: AstNestedExecute): else: path = generate.path() - self.emit_function(path, node.root) + self.emit_function(path, root) resource_location = AstResourceLocation.from_value(path) @@ -210,6 +182,7 @@ def nested_execute(self, node: AstNestedExecute): @rule(AstRoot) def execute_expand(self, node: AstRoot): + changed = False commands: List[AstCommand] = [] for command in node.commands: @@ -226,6 +199,7 @@ def execute_expand(self, node: AstRoot): args = subcommand.arguments if expand: + changed = True for nested_command in cast(AstRoot, expand.arguments[0]).commands: if nested_command.identifier == "execute:subcommand": expansion = cast(AstCommand, nested_command.arguments[0]) @@ -245,7 +219,7 @@ def execute_expand(self, node: AstRoot): else: commands.append(command) - if len(commands) > len(node.commands): + if changed: return replace(node, commands=AstChildren(commands)) return node diff --git a/packages/mecha/mecha/contrib/scripting/parse.py b/packages/mecha/mecha/contrib/scripting/parse.py index 2fbbfe8e4..cd69d5871 100644 --- a/packages/mecha/mecha/contrib/scripting/parse.py +++ b/packages/mecha/mecha/contrib/scripting/parse.py @@ -644,10 +644,7 @@ def __call__(self, stream: TokenStream) -> AstRoot: function_stream = function_root.stream function_stream.data["identifiers"] |= identifiers - function_stream.data.update( - properties={"check_nesting": False}, - function=True, - ) + function_stream.data["function"] = True command = replace( command, diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 0b64f3f16..fb40f2ad0 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -557,9 +557,8 @@ def parse_command(stream: TokenStream) -> AstCommand: arguments: List[AstNode] = [] reached_terminal = False - with stream.checkpoint(): - location = stream.expect().location - end_location = location + location = None + end_location = None while tree: with stream.checkpoint() as commit: @@ -571,6 +570,8 @@ def parse_command(stream: TokenStream) -> AstCommand: stream.expect("newline", "eof") reached_terminal = True + if location is None: + location = literal.location end_location = literal.end_location scope = scope + (literal.value,) tree = child @@ -597,10 +598,16 @@ def parse_command(stream: TokenStream) -> AstCommand: stream.expect("newline", "eof") reached_terminal = True continue + elif child.type == "literal": literal = stream.expect(("literal", name)) + if location is None: + location = literal.location + elif child.type == "argument": argument = delegate("command:argument", stream) + if location is None: + location = argument.location if not child.children: if stream.peek(): @@ -1642,7 +1649,7 @@ class EntityParser: def __call__(self, stream: TokenStream) -> Any: """Parse entity.""" - with stream.syntax(literal=r"\S+"): + with stream.syntax(literal=AstLiteral.regex.pattern): hint = stream.peek() if hint: diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index a0dd6110a..5d36908a3 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -69,62 +69,62 @@ foo = 1 "hello" + foo ### a = 1 -if a == 1 +if a == 1: a = 0 ### -if True +if True: say hello -elif True or False +elif True or False: say hello -else +else: say hello ### -if True +if True: say hello -elif True or False +elif True or False: say hello -else "blah" +else "blah": say hello ### -if True +if True: say hello a = 1 -else +else: say hello ### if ### if True and ### -if True +if True: say hello ### -while True +while True: say hello ### -if score @s tmp matches 0 - if "thing" == "bar" +if score @s tmp matches 0: + if "thing" == "bar": say hello - if "thing" == "foo" + if "thing" == "foo": say hello ### -if score @s tmp matches 0 - if "thing" == "foo" +if score @s tmp matches 0: + if "thing" == "foo": say hello ### -if score @s tmp matches 0 - while True +if score @s tmp matches 0: + while True: say hello - while True + while True: say hello ### -if score @s tmp matches 0 - while True +if score @s tmp matches 0: + while True: say hello ### -if score @s tmp matches 42 +if score @s tmp matches 42: count = 42 - while count > 0 + while count > 0: say hello count = count - 1 ### @@ -141,7 +141,7 @@ true | false | null foo = 1 foo == 1 ### -for c in "abc" +for c in "abc": say something ### foo = foo @@ -149,10 +149,10 @@ foo = foo foo = 1 foo = foo ### -for foo in foo +for foo in foo: foo = foo ### -for foo in "foo" +for foo in "foo": foo = foo ### foo += "hey" @@ -166,18 +166,18 @@ break ### continue ### -if true +if true: break ### -for i in "" +for i in "": say hello continue ### -while false +while false: break ### -for i in "abc" - if i == "b" +for i in "abc": + if i == "b": break ### "foo".bar @@ -194,12 +194,12 @@ for i in "abc" 3, ) ### -def foo() +def foo(): say hello foo() ### -def foo() - def bar() +def foo(): + def bar(): foo() bar() ### @@ -207,36 +207,36 @@ def foo( a=1, b=a, c=a + b, -) +): say hello ### def f ### def f() ### -def f() +def f(): say yolo ### -def f(a=a) +def f(a=a): say wat ### -def f(a, b=a) +def f(a, b=a): b += a say wat ### -def f(a, b) - def g(c) +def f(a, b): + def g(c): a + b c g() ### -def f(a, b) - def g(c) +def f(a, b): + def g(c): a + b f(c) ### -def foo(something) - def wat() +def foo(something): + def wat(): say yo wat @@ -244,14 +244,14 @@ def foo(something) dat # this is a comment x = "hello" - for i in somehng + for i in somehng: x += i * 3 say wow wat() ### -def foo(something) - def wat() +def foo(something): + def wat(): say yo wat @@ -259,45 +259,45 @@ def foo(something) dat # this is a comment x = "hello" - for i in something + for i in something: x += i * 3 say wow wat() ### -def foo() +def foo(): thing += bar() -def bar() +def bar(): thing += foo() thing = bar() ### -def foo() +def foo(): bar() + thing -def bar() +def bar(): foo() + thin thing = bar() ### -def foo() +def foo(): return ### return "hello" ### return foo ### -def f() - def g() +def f(): + def g(): return foo foo = 0 ### -def f() +def f(): foo = 0 f(foo) ### -def f(x) +def f(x): tellraw @a x f("thing") ### -def f(x) +def f(x): tellraw @a xx f("thing") ### @@ -351,18 +351,18 @@ predicate = { } } ### -def f() +def f(): return {f(): f(), other: [{}, {}, "wat"]} ### -at @s if "foo" == "bar" +at @s if "foo" == "bar": say yolo ### -at @s for i in "foo" +at @s for i in "foo": say yolo ### say hello ### -def wat() +def wat(): say hello ### a = '' @@ -409,17 +409,17 @@ yo = f'thing \e' x = 8 if score @s tmp matches (x, None) say wat ### -def f() +def f(): yield 1 yield 2 yield 3 -for i in f() +for i in f(): say i ### -if True +if True: yield ### -def f() +def f(): yield ### import demo:foo @@ -442,56 +442,56 @@ m.sin(1) from demo:foo import thing say thing ### -def f() +def f(): from demo:foo import a b c say a ### -if score @s tmp matches 1.. if entity @p[tag=foo] - if True +if score @s tmp matches 1.. if entity @p[tag=foo]: + if True: say 42 - else + else: say no ### setblock = 0 ### -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 ### -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 say done ### -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 -else +else: say other ### -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 -else +else: say other say done diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt index d9740386e..b640ef5a3 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_message_1_0__0.txt @@ -6,4 +6,4 @@ Hello @p[team=winner :) --- Reported 1 error. -line 1, column 22: Expected bracket ']' but got literal ':)'. \ No newline at end of file +line 1, column 22: Expected bracket ']' but got invalid ':)'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt index 66e8d7561..5ff26806c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 11 --- Reported 1 error. -line 1, column 2: Expected curly '}' but got literal '\\":'. \ No newline at end of file +line 1, column 2: Expected curly '}' but got literal '\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt index 31239cd10..4e2d05044 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 3 --- Reported 1 error. -line 1, column 2: Expected curly '}' but got literal '"\\":1}'. \ No newline at end of file +line 1, column 2: Expected curly '}' but got literal '"\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__0.txt b/packages/mecha/tests/snapshots/scripting__parse_101__0.txt index e0c9ec01d..81356e77a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__0.txt @@ -1,13 +1,13 @@ -def wat() +def wat(): say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=24, lineno=2, colno=14) identifier: 'def:function:body' arguments: @@ -17,19 +17,19 @@ def wat() arguments: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) fragments: - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt index 6ebe62e04..d59d149af 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_101__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_101__1.txt @@ -9,13 +9,13 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_118__0.txt b/packages/mecha/tests/snapshots/scripting__parse_118__0.txt index cd94f78ee..9110c554f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_118__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_118__0.txt @@ -1,17 +1,17 @@ -def f() +def f(): yield 1 yield 2 yield 3 -for i in f() +for i in f(): say i --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=7, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=43, lineno=4, colno=12) + end_location: SourceLocation(pos=44, lineno=4, colno=12) identifier: 'def:function:body' arguments: @@ -21,70 +21,70 @@ for i in f() arguments: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=43, lineno=4, colno=12) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=4, colno=12) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=12) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=12) identifier: 'yield:value' arguments: - location: SourceLocation(pos=18, lineno=2, colno=11) - end_location: SourceLocation(pos=19, lineno=2, colno=12) + location: SourceLocation(pos=19, lineno=2, colno=11) + end_location: SourceLocation(pos=20, lineno=2, colno=12) value: 1 - location: SourceLocation(pos=24, lineno=3, colno=5) - end_location: SourceLocation(pos=31, lineno=3, colno=12) + location: SourceLocation(pos=25, lineno=3, colno=5) + end_location: SourceLocation(pos=32, lineno=3, colno=12) identifier: 'yield:value' arguments: - location: SourceLocation(pos=30, lineno=3, colno=11) - end_location: SourceLocation(pos=31, lineno=3, colno=12) + location: SourceLocation(pos=31, lineno=3, colno=11) + end_location: SourceLocation(pos=32, lineno=3, colno=12) value: 2 - location: SourceLocation(pos=36, lineno=4, colno=5) - end_location: SourceLocation(pos=43, lineno=4, colno=12) + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=44, lineno=4, colno=12) identifier: 'yield:value' arguments: - location: SourceLocation(pos=42, lineno=4, colno=11) - end_location: SourceLocation(pos=43, lineno=4, colno=12) + location: SourceLocation(pos=43, lineno=4, colno=11) + end_location: SourceLocation(pos=44, lineno=4, colno=12) value: 3 - location: SourceLocation(pos=44, lineno=5, colno=1) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=45, lineno=5, colno=1) + end_location: SourceLocation(pos=68, lineno=6, colno=10) identifier: 'for:target:in:iterable:body' arguments: - location: SourceLocation(pos=48, lineno=5, colno=5) - end_location: SourceLocation(pos=49, lineno=5, colno=6) + location: SourceLocation(pos=49, lineno=5, colno=5) + end_location: SourceLocation(pos=50, lineno=5, colno=6) value: 'i' - location: SourceLocation(pos=53, lineno=5, colno=10) - end_location: SourceLocation(pos=56, lineno=5, colno=13) + location: SourceLocation(pos=54, lineno=5, colno=10) + end_location: SourceLocation(pos=57, lineno=5, colno=13) value: - location: SourceLocation(pos=53, lineno=5, colno=10) - end_location: SourceLocation(pos=54, lineno=5, colno=11) + location: SourceLocation(pos=54, lineno=5, colno=10) + end_location: SourceLocation(pos=55, lineno=5, colno=11) value: 'f' arguments: - location: SourceLocation(pos=61, lineno=6, colno=5) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=63, lineno=6, colno=5) + end_location: SourceLocation(pos=68, lineno=6, colno=10) commands: - location: SourceLocation(pos=61, lineno=6, colno=5) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=63, lineno=6, colno=5) + end_location: SourceLocation(pos=68, lineno=6, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=67, lineno=6, colno=9) + end_location: SourceLocation(pos=68, lineno=6, colno=10) converter: 'message' value: - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=67, lineno=6, colno=9) + end_location: SourceLocation(pos=68, lineno=6, colno=10) value: 'i' diff --git a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt index 361bad115..c8c3383d4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_118__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_118__1.txt @@ -18,22 +18,22 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=65, lineno=6, colno=9) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=67, lineno=6, colno=9) + end_location: SourceLocation(pos=68, lineno=6, colno=10) converter: 'message' value: _mecha_refs[1] - location: SourceLocation(pos=61, lineno=6, colno=5) - end_location: SourceLocation(pos=66, lineno=6, colno=10) + location: SourceLocation(pos=63, lineno=6, colno=5) + end_location: SourceLocation(pos=68, lineno=6, colno=10) identifier: 'say:message' arguments: _mecha_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=7, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_119__0.txt b/packages/mecha/tests/snapshots/scripting__parse_119__0.txt index eded6970c..566664cc2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_119__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_119__0.txt @@ -1,7 +1,7 @@ -if True +if True: #>ERROR Can only use 'yield' in functions. # line 2, column 5 -# 1 | if True +# 1 | if True: # 2 | yield # : ^^^^^ yield diff --git a/packages/mecha/tests/snapshots/scripting__parse_11__0.txt b/packages/mecha/tests/snapshots/scripting__parse_11__0.txt index 721ede5ab..2581b9000 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_11__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_11__0.txt @@ -5,7 +5,7 @@ end_location: SourceLocation(pos=15, lineno=2, colno=1) commands: - location: SourceLocation(pos=0, lineno=1, colno=1) + location: SourceLocation(pos=1, lineno=1, colno=2) end_location: SourceLocation(pos=14, lineno=1, colno=15) identifier: 'statement' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_120__0.txt b/packages/mecha/tests/snapshots/scripting__parse_120__0.txt index 5dee359b7..12f73c4bb 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_120__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_120__0.txt @@ -1,13 +1,13 @@ -def f() +def f(): yield --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) + end_location: SourceLocation(pos=18, lineno=2, colno=10) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) + end_location: SourceLocation(pos=18, lineno=2, colno=10) identifier: 'def:function:body' arguments: @@ -17,12 +17,12 @@ def f() arguments: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=10) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=10) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=10) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=10) identifier: 'yield' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt index b26024e4c..afa21d384 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_120__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_120__1.txt @@ -10,6 +10,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) + end_location: SourceLocation(pos=18, lineno=2, colno=10) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__0.txt b/packages/mecha/tests/snapshots/scripting__parse_129__0.txt index 218a0351c..89b308f79 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_129__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_129__0.txt @@ -1,14 +1,14 @@ -def f() +def f(): from demo:foo import a b c say a --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=6) + end_location: SourceLocation(pos=45, lineno=3, colno=6) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'def:function:body' arguments: @@ -18,57 +18,57 @@ say a arguments: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=2, colno=31) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:subcommand' arguments: - location: SourceLocation(pos=17, lineno=2, colno=10) - end_location: SourceLocation(pos=25, lineno=2, colno=18) + location: SourceLocation(pos=18, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=18) is_tag: False namespace: 'demo' path: 'foo' - location: SourceLocation(pos=33, lineno=2, colno=26) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + location: SourceLocation(pos=34, lineno=2, colno=26) + end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - location: SourceLocation(pos=33, lineno=2, colno=26) - end_location: SourceLocation(pos=34, lineno=2, colno=27) + location: SourceLocation(pos=34, lineno=2, colno=26) + end_location: SourceLocation(pos=35, lineno=2, colno=27) value: 'a' - location: SourceLocation(pos=35, lineno=2, colno=28) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + location: SourceLocation(pos=36, lineno=2, colno=28) + end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - location: SourceLocation(pos=35, lineno=2, colno=28) - end_location: SourceLocation(pos=36, lineno=2, colno=29) + location: SourceLocation(pos=36, lineno=2, colno=28) + end_location: SourceLocation(pos=37, lineno=2, colno=29) value: 'b' - location: SourceLocation(pos=37, lineno=2, colno=30) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + location: SourceLocation(pos=38, lineno=2, colno=30) + end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:name' arguments: - location: SourceLocation(pos=37, lineno=2, colno=30) - end_location: SourceLocation(pos=38, lineno=2, colno=31) + location: SourceLocation(pos=38, lineno=2, colno=30) + end_location: SourceLocation(pos=39, lineno=2, colno=31) value: 'c' - location: SourceLocation(pos=39, lineno=3, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=6) + location: SourceLocation(pos=40, lineno=3, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=6) identifier: 'say:message' arguments: - location: SourceLocation(pos=43, lineno=3, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=6) + location: SourceLocation(pos=44, lineno=3, colno=5) + end_location: SourceLocation(pos=45, lineno=3, colno=6) fragments: - location: SourceLocation(pos=43, lineno=3, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=6) + location: SourceLocation(pos=44, lineno=3, colno=5) + end_location: SourceLocation(pos=45, lineno=3, colno=6) value: 'a' diff --git a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt index 9f797c6e0..130c2d19c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_129__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_129__1.txt @@ -12,15 +12,15 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=39, lineno=3, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=6) + location: SourceLocation(pos=40, lineno=3, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=6) identifier: 'say:message' arguments: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=6) + end_location: SourceLocation(pos=45, lineno=3, colno=6) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__0.txt b/packages/mecha/tests/snapshots/scripting__parse_130__0.txt index b5fc4eff1..1aafae356 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_130__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_130__0.txt @@ -1,21 +1,21 @@ -if score @s tmp matches 1.. if entity @p[tag=foo] - if True +if score @s tmp matches 1.. if entity @p[tag=foo]: + if True: say 42 - else + else: say no --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -35,7 +35,7 @@ if score @s tmp matches 1.. if entity @p[tag=foo] max: None location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:if:entity:entities:subcommand' arguments: @@ -57,59 +57,60 @@ if score @s tmp matches 1.. if entity @p[tag=foo] location: SourceLocation(pos=45, lineno=1, colno=46) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'foo' - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - root: + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:commands' + arguments: - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=76, lineno=3, colno=15) + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=78, lineno=3, colno=15) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=57, lineno=2, colno=8) - end_location: SourceLocation(pos=61, lineno=2, colno=12) + location: SourceLocation(pos=58, lineno=2, colno=8) + end_location: SourceLocation(pos=62, lineno=2, colno=12) value: True - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) + location: SourceLocation(pos=72, lineno=3, colno=9) + end_location: SourceLocation(pos=78, lineno=3, colno=15) commands: - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) + location: SourceLocation(pos=72, lineno=3, colno=9) + end_location: SourceLocation(pos=78, lineno=3, colno=15) identifier: 'say:message' arguments: - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) + location: SourceLocation(pos=76, lineno=3, colno=13) + end_location: SourceLocation(pos=78, lineno=3, colno=15) fragments: - location: SourceLocation(pos=74, lineno=3, colno=13) - end_location: SourceLocation(pos=76, lineno=3, colno=15) + location: SourceLocation(pos=76, lineno=3, colno=13) + end_location: SourceLocation(pos=78, lineno=3, colno=15) value: '42' - location: SourceLocation(pos=81, lineno=4, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=83, lineno=4, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'else:body' arguments: - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=97, lineno=5, colno=9) + end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=97, lineno=5, colno=9) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'say:message' arguments: - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=101, lineno=5, colno=13) + end_location: SourceLocation(pos=103, lineno=5, colno=15) fragments: - location: SourceLocation(pos=98, lineno=5, colno=13) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=101, lineno=5, colno=13) + end_location: SourceLocation(pos=103, lineno=5, colno=15) value: 'no' diff --git a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt index 27d0e6b50..6a5a082a6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_130__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_130__1.txt @@ -7,34 +7,35 @@ with _mecha_runtime.scope() as _mecha_var1: _mecha_runtime.commands.extend(_mecha_refs[0].commands) else: _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0))]))]))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[11], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] - location: SourceLocation(pos=70, lineno=3, colno=9) - end_location: SourceLocation(pos=76, lineno=3, colno=15) + location: SourceLocation(pos=72, lineno=3, colno=9) + end_location: SourceLocation(pos=78, lineno=3, colno=15) commands: _mecha_refs[1] - location: SourceLocation(pos=94, lineno=5, colno=9) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=97, lineno=5, colno=9) + end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: _mecha_refs[2] - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: _mecha_refs[3] - - location: SourceLocation(pos=54, lineno=2, colno=5) - end_location: SourceLocation(pos=100, lineno=5, colno=15) - root: + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:commands' + arguments: _mecha_refs[4] @@ -46,11 +47,11 @@ _mecha_refs[4] _mecha_refs[5] location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:if:entity:entities:subcommand' arguments: - + _mecha_refs[6] location: SourceLocation(pos=9, lineno=1, colno=10) @@ -72,7 +73,7 @@ _mecha_refs[8] _mecha_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -82,13 +83,13 @@ _mecha_refs[9] _mecha_refs[10] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:subcommand' arguments: _mecha_refs[11] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=5, colno=15) + end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_132__0.txt b/packages/mecha/tests/snapshots/scripting__parse_132__0.txt index 05be23822..1142aae9e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_132__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_132__0.txt @@ -1,19 +1,19 @@ -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'if:condition:body' arguments: @@ -21,124 +21,124 @@ elif 4 end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 1 - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) fragments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) value: '1' - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'else:body' arguments: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=20, lineno=3, colno=6) - end_location: SourceLocation(pos=21, lineno=3, colno=7) + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) value: 2 - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) fragments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) value: '2' - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'else:body' arguments: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=37, lineno=5, colno=6) - end_location: SourceLocation(pos=38, lineno=5, colno=7) + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) value: 3 - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) fragments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) value: '3' - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'else:body' arguments: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=54, lineno=7, colno=6) - end_location: SourceLocation(pos=55, lineno=7, colno=7) + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) value: 4 - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) fragments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) value: '4' diff --git a/packages/mecha/tests/snapshots/scripting__parse_132__1.txt b/packages/mecha/tests/snapshots/scripting__parse_132__1.txt index a9b40c6ef..28301cd23 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_132__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_132__1.txt @@ -18,32 +18,32 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: _mecha_refs[1] - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: _mecha_refs[2] - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: _mecha_refs[3] - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: _mecha_refs[4] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_133__0.txt b/packages/mecha/tests/snapshots/scripting__parse_133__0.txt index b944adf0a..83b53f2e9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_133__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_133__0.txt @@ -1,20 +1,20 @@ -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 say done --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=74, lineno=9, colno=9) + end_location: SourceLocation(pos=78, lineno=9, colno=9) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'if:condition:body' arguments: @@ -22,137 +22,137 @@ say done end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 1 - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) fragments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) value: '1' - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'else:body' arguments: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=20, lineno=3, colno=6) - end_location: SourceLocation(pos=21, lineno=3, colno=7) + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) value: 2 - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) fragments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) value: '2' - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'else:body' arguments: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=37, lineno=5, colno=6) - end_location: SourceLocation(pos=38, lineno=5, colno=7) + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) value: 3 - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) fragments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) value: '3' - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'else:body' arguments: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=54, lineno=7, colno=6) - end_location: SourceLocation(pos=55, lineno=7, colno=7) + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) value: 4 - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) fragments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) value: '4' - location: SourceLocation(pos=66, lineno=9, colno=1) - end_location: SourceLocation(pos=74, lineno=9, colno=9) + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=78, lineno=9, colno=9) identifier: 'say:message' arguments: - location: SourceLocation(pos=70, lineno=9, colno=5) - end_location: SourceLocation(pos=74, lineno=9, colno=9) + location: SourceLocation(pos=74, lineno=9, colno=5) + end_location: SourceLocation(pos=78, lineno=9, colno=9) fragments: - location: SourceLocation(pos=70, lineno=9, colno=5) - end_location: SourceLocation(pos=74, lineno=9, colno=9) + location: SourceLocation(pos=74, lineno=9, colno=5) + end_location: SourceLocation(pos=78, lineno=9, colno=9) value: 'done' diff --git a/packages/mecha/tests/snapshots/scripting__parse_133__1.txt b/packages/mecha/tests/snapshots/scripting__parse_133__1.txt index 1c2b0185f..773c0751e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_133__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_133__1.txt @@ -19,39 +19,39 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: _mecha_refs[1] - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: _mecha_refs[2] - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: _mecha_refs[3] - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: _mecha_refs[4] - location: SourceLocation(pos=66, lineno=9, colno=1) - end_location: SourceLocation(pos=74, lineno=9, colno=9) + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=78, lineno=9, colno=9) identifier: 'say:message' arguments: _mecha_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=74, lineno=9, colno=9) + end_location: SourceLocation(pos=78, lineno=9, colno=9) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_134__0.txt b/packages/mecha/tests/snapshots/scripting__parse_134__0.txt index e263daf5e..4ab5d9306 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_134__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_134__0.txt @@ -1,21 +1,21 @@ -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 -else +else: say other --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'if:condition:body' arguments: @@ -23,146 +23,146 @@ else end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 1 - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) fragments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) value: '1' - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=20, lineno=3, colno=6) - end_location: SourceLocation(pos=21, lineno=3, colno=7) + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) value: 2 - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) fragments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) value: '2' - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=37, lineno=5, colno=6) - end_location: SourceLocation(pos=38, lineno=5, colno=7) + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) value: 3 - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) fragments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) value: '3' - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=54, lineno=7, colno=6) - end_location: SourceLocation(pos=55, lineno=7, colno=7) + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) value: 4 - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) fragments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) value: '4' - location: SourceLocation(pos=66, lineno=9, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=75, lineno=10, colno=5) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=75, lineno=10, colno=5) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=79, lineno=10, colno=9) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) fragments: - location: SourceLocation(pos=79, lineno=10, colno=9) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) value: 'other' diff --git a/packages/mecha/tests/snapshots/scripting__parse_134__1.txt b/packages/mecha/tests/snapshots/scripting__parse_134__1.txt index 0f86a52eb..49080e517 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_134__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_134__1.txt @@ -20,38 +20,38 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: _mecha_refs[1] - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: _mecha_refs[2] - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: _mecha_refs[3] - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: _mecha_refs[4] - location: SourceLocation(pos=75, lineno=10, colno=5) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: _mecha_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_135__0.txt b/packages/mecha/tests/snapshots/scripting__parse_135__0.txt index 0976fd045..4cbfecb60 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_135__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_135__0.txt @@ -1,22 +1,22 @@ -if 1 +if 1: say 1 -elif 2 +elif 2: say 2 -elif 3 +elif 3: say 3 -elif 4 +elif 4: say 4 -else +else: say other say done --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=93, lineno=11, colno=9) + end_location: SourceLocation(pos=98, lineno=11, colno=9) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'if:condition:body' arguments: @@ -24,159 +24,159 @@ say done end_location: SourceLocation(pos=4, lineno=1, colno=5) value: 1 - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) fragments: - location: SourceLocation(pos=13, lineno=2, colno=9) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) value: '1' - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=15, lineno=3, colno=1) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=20, lineno=3, colno=6) - end_location: SourceLocation(pos=21, lineno=3, colno=7) + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) value: 2 - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) fragments: - location: SourceLocation(pos=30, lineno=4, colno=9) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) value: '2' - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=32, lineno=5, colno=1) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=37, lineno=5, colno=6) - end_location: SourceLocation(pos=38, lineno=5, colno=7) + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) value: 3 - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) fragments: - location: SourceLocation(pos=47, lineno=6, colno=9) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) value: '3' - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=49, lineno=7, colno=1) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=54, lineno=7, colno=6) - end_location: SourceLocation(pos=55, lineno=7, colno=7) + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) value: 4 - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) identifier: 'say:message' arguments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) fragments: - location: SourceLocation(pos=64, lineno=8, colno=9) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) value: '4' - location: SourceLocation(pos=66, lineno=9, colno=1) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=75, lineno=10, colno=5) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: - location: SourceLocation(pos=75, lineno=10, colno=5) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=79, lineno=10, colno=9) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) fragments: - location: SourceLocation(pos=79, lineno=10, colno=9) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) value: 'other' - location: SourceLocation(pos=85, lineno=11, colno=1) - end_location: SourceLocation(pos=93, lineno=11, colno=9) + location: SourceLocation(pos=90, lineno=11, colno=1) + end_location: SourceLocation(pos=98, lineno=11, colno=9) identifier: 'say:message' arguments: - location: SourceLocation(pos=89, lineno=11, colno=5) - end_location: SourceLocation(pos=93, lineno=11, colno=9) + location: SourceLocation(pos=94, lineno=11, colno=5) + end_location: SourceLocation(pos=98, lineno=11, colno=9) fragments: - location: SourceLocation(pos=89, lineno=11, colno=5) - end_location: SourceLocation(pos=93, lineno=11, colno=9) + location: SourceLocation(pos=94, lineno=11, colno=5) + end_location: SourceLocation(pos=98, lineno=11, colno=9) value: 'done' diff --git a/packages/mecha/tests/snapshots/scripting__parse_135__1.txt b/packages/mecha/tests/snapshots/scripting__parse_135__1.txt index 36e9db24e..7b149e69b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_135__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_135__1.txt @@ -21,45 +21,45 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=9, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=10) + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: _mecha_refs[1] - location: SourceLocation(pos=26, lineno=4, colno=5) - end_location: SourceLocation(pos=31, lineno=4, colno=10) + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: _mecha_refs[2] - location: SourceLocation(pos=43, lineno=6, colno=5) - end_location: SourceLocation(pos=48, lineno=6, colno=10) + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: _mecha_refs[3] - location: SourceLocation(pos=60, lineno=8, colno=5) - end_location: SourceLocation(pos=65, lineno=8, colno=10) + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: _mecha_refs[4] - location: SourceLocation(pos=75, lineno=10, colno=5) - end_location: SourceLocation(pos=84, lineno=10, colno=14) + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: _mecha_refs[5] - location: SourceLocation(pos=85, lineno=11, colno=1) - end_location: SourceLocation(pos=93, lineno=11, colno=9) + location: SourceLocation(pos=90, lineno=11, colno=1) + end_location: SourceLocation(pos=98, lineno=11, colno=9) identifier: 'say:message' arguments: _mecha_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=93, lineno=11, colno=9) + end_location: SourceLocation(pos=98, lineno=11, colno=9) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt index afc879219..312c570d4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__0.txt @@ -1,10 +1,10 @@ a = 1 -if a == 1 +if a == 1: a = 0 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=4, colno=1) + end_location: SourceLocation(pos=27, lineno=4, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -27,7 +27,7 @@ if a == 1 value: 1 location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=25, lineno=3, colno=10) + end_location: SourceLocation(pos=26, lineno=3, colno=10) identifier: 'if:condition:body' arguments: @@ -45,25 +45,25 @@ if a == 1 end_location: SourceLocation(pos=15, lineno=2, colno=10) value: 1 - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=10) commands: - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=10) identifier: 'statement' arguments: - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=10) operator: '=' target: - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=21, lineno=3, colno=6) + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=22, lineno=3, colno=6) value: 'a' value: - location: SourceLocation(pos=24, lineno=3, colno=9) - end_location: SourceLocation(pos=25, lineno=3, colno=10) + location: SourceLocation(pos=25, lineno=3, colno=9) + end_location: SourceLocation(pos=26, lineno=3, colno=10) value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt index 5afd85dd2..9d7f5671a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_34__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_34__1.txt @@ -13,7 +13,7 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=4, colno=1) + end_location: SourceLocation(pos=27, lineno=4, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt index 39e680e12..bcaf714ee 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__0.txt @@ -1,17 +1,17 @@ -if True +if True: say hello -elif True or False +elif True or False: say hello -else +else: say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + end_location: SourceLocation(pos=76, lineno=6, colno=14) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + end_location: SourceLocation(pos=22, lineno=2, colno=14) identifier: 'if:condition:body' arguments: @@ -19,86 +19,86 @@ else end_location: SourceLocation(pos=7, lineno=1, colno=8) value: True - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=14) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=22, lineno=2, colno=14) fragments: - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=22, lineno=2, colno=14) value: 'hello' - location: SourceLocation(pos=22, lineno=3, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=22, lineno=3, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) commands: - location: SourceLocation(pos=22, lineno=3, colno=1) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=56, lineno=4, colno=14) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=27, lineno=3, colno=6) - end_location: SourceLocation(pos=40, lineno=3, colno=19) + location: SourceLocation(pos=28, lineno=3, colno=6) + end_location: SourceLocation(pos=41, lineno=3, colno=19) operator: 'or' left: - location: SourceLocation(pos=27, lineno=3, colno=6) - end_location: SourceLocation(pos=31, lineno=3, colno=10) + location: SourceLocation(pos=28, lineno=3, colno=6) + end_location: SourceLocation(pos=32, lineno=3, colno=10) value: True right: - location: SourceLocation(pos=35, lineno=3, colno=14) - end_location: SourceLocation(pos=40, lineno=3, colno=19) + location: SourceLocation(pos=36, lineno=3, colno=14) + end_location: SourceLocation(pos=41, lineno=3, colno=19) value: False - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=47, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=14) commands: - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=47, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=49, lineno=4, colno=9) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=51, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=14) fragments: - location: SourceLocation(pos=49, lineno=4, colno=9) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=51, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=14) value: 'hello' - location: SourceLocation(pos=55, lineno=5, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=57, lineno=5, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) identifier: 'else:body' arguments: - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=67, lineno=6, colno=5) + end_location: SourceLocation(pos=76, lineno=6, colno=14) commands: - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=67, lineno=6, colno=5) + end_location: SourceLocation(pos=76, lineno=6, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=68, lineno=6, colno=9) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=71, lineno=6, colno=9) + end_location: SourceLocation(pos=76, lineno=6, colno=14) fragments: - location: SourceLocation(pos=68, lineno=6, colno=9) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=71, lineno=6, colno=9) + end_location: SourceLocation(pos=76, lineno=6, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt index 26a1091cb..1550534e8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_35__1.txt @@ -15,26 +15,26 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=14) commands: _mecha_refs[1] - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=54, lineno=4, colno=14) + location: SourceLocation(pos=47, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=14) commands: _mecha_refs[2] - location: SourceLocation(pos=64, lineno=6, colno=5) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + location: SourceLocation(pos=67, lineno=6, colno=5) + end_location: SourceLocation(pos=76, lineno=6, colno=14) commands: _mecha_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=73, lineno=6, colno=14) + end_location: SourceLocation(pos=76, lineno=6, colno=14) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_36__0.txt b/packages/mecha/tests/snapshots/scripting__parse_36__0.txt index 219af3dc1..0c8f7208a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_36__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_36__0.txt @@ -1,12 +1,12 @@ -if True +if True: say hello -elif True or False +elif True or False: say hello -#>ERROR Expected indent but got literal '"blah"'. +#>ERROR Expected colon but got literal '"blah"'. # line 5, column 6 # 4 | say hello -# 5 | else "blah" +# 5 | else "blah": # : ^^^^^^ # 6 | say hello -else "blah" +else "blah": say hello diff --git a/packages/mecha/tests/snapshots/scripting__parse_37__0.txt b/packages/mecha/tests/snapshots/scripting__parse_37__0.txt index d68a5ed80..ae29ac574 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_37__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_37__0.txt @@ -1,13 +1,13 @@ -if True +if True: say hello a = 1 #>ERROR Conditional branch must be part of an if statement. # line 4, column 1 # 2 | say hello # 3 | a = 1 -# 4 | else -# : ^^^^ +# 4 | else: +# : ^^^^^ # 5 | say hello # : ^^^^^^^^^ -else +else: say hello diff --git a/packages/mecha/tests/snapshots/scripting__parse_40__0.txt b/packages/mecha/tests/snapshots/scripting__parse_40__0.txt index 5f45018e9..922480104 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_40__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_40__0.txt @@ -1,7 +1,7 @@ -#>ERROR Expected indent but got newline '\n'. -# line 1, column 8 -# 1 | if True +if True: +#>ERROR Expected indent but got literal 'say'. +# line 2, column 1 +# 1 | if True: # 2 | say hello -# : ^ -if True +# : ^^^ say hello diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt index 2d124e92d..92d012df5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__0.txt @@ -1,13 +1,13 @@ -while True +while True: say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + end_location: SourceLocation(pos=25, lineno=2, colno=14) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + end_location: SourceLocation(pos=25, lineno=2, colno=14) identifier: 'while:condition:body' arguments: @@ -15,19 +15,19 @@ while True end_location: SourceLocation(pos=10, lineno=1, colno=11) value: True - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) commands: - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) fragments: - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt index 296b93c4d..c7a6a9f19 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_41__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_41__1.txt @@ -9,13 +9,13 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) commands: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) + end_location: SourceLocation(pos=25, lineno=2, colno=14) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt index cc2b5f623..fd59612e1 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__0.txt @@ -1,21 +1,21 @@ -if score @s tmp matches 0 - if "thing" == "bar" +if score @s tmp matches 0: + if "thing" == "bar": say hello - if "thing" == "foo" + if "thing" == "foo": say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -33,83 +33,84 @@ if score @s tmp matches 0 end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=50, lineno=2, colno=24) operator: '==' left: - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=41, lineno=2, colno=15) value: 'thing' right: - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) + location: SourceLocation(pos=45, lineno=2, colno=19) + end_location: SourceLocation(pos=50, lineno=2, colno=24) value: 'bar' - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) fragments: - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) value: 'hello' - location: SourceLocation(pos=72, lineno=4, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=74, lineno=4, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=91, lineno=4, colno=24) + location: SourceLocation(pos=77, lineno=4, colno=8) + end_location: SourceLocation(pos=93, lineno=4, colno=24) operator: '==' left: - location: SourceLocation(pos=75, lineno=4, colno=8) - end_location: SourceLocation(pos=82, lineno=4, colno=15) + location: SourceLocation(pos=77, lineno=4, colno=8) + end_location: SourceLocation(pos=84, lineno=4, colno=15) value: 'thing' right: - location: SourceLocation(pos=86, lineno=4, colno=19) - end_location: SourceLocation(pos=91, lineno=4, colno=24) + location: SourceLocation(pos=88, lineno=4, colno=19) + end_location: SourceLocation(pos=93, lineno=4, colno=24) value: 'foo' - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=103, lineno=5, colno=9) + end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=103, lineno=5, colno=9) + end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=107, lineno=5, colno=13) + end_location: SourceLocation(pos=112, lineno=5, colno=18) fragments: - location: SourceLocation(pos=104, lineno=5, colno=13) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=107, lineno=5, colno=13) + end_location: SourceLocation(pos=112, lineno=5, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt index c0dc28625..700064d82 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_42__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_42__1.txt @@ -9,34 +9,35 @@ with _mecha_runtime.scope() as _mecha_var1: if ( 'thing' == 'foo'): _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0))]))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: _mecha_refs[1] - location: SourceLocation(pos=100, lineno=5, colno=9) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=103, lineno=5, colno=9) + end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: _mecha_refs[2] - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: _mecha_refs[3] - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=109, lineno=5, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: _mecha_refs[4] @@ -59,23 +60,23 @@ _mecha_refs[6] _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - + _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'execute:subcommand' arguments: _mecha_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=109, lineno=5, colno=18) + end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt index 27415024b..7531f5a44 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__0.txt @@ -1,19 +1,19 @@ -if score @s tmp matches 0 - if "thing" == "foo" +if score @s tmp matches 0: + if "thing" == "foo": say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -31,47 +31,48 @@ if score @s tmp matches 0 end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=49, lineno=2, colno=24) + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=50, lineno=2, colno=24) operator: '==' left: - location: SourceLocation(pos=33, lineno=2, colno=8) - end_location: SourceLocation(pos=40, lineno=2, colno=15) + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=41, lineno=2, colno=15) value: 'thing' right: - location: SourceLocation(pos=44, lineno=2, colno=19) - end_location: SourceLocation(pos=49, lineno=2, colno=24) + location: SourceLocation(pos=45, lineno=2, colno=19) + end_location: SourceLocation(pos=50, lineno=2, colno=24) value: 'foo' - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) fragments: - location: SourceLocation(pos=62, lineno=3, colno=13) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt index 1c759d8a0..30f327576 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_43__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_43__1.txt @@ -6,27 +6,28 @@ with _mecha_runtime.scope() as _mecha_var1: if ( 'thing' == 'foo'): _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))]))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] - location: SourceLocation(pos=58, lineno=3, colno=9) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: _mecha_refs[1] - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: _mecha_refs[2] - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=67, lineno=3, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: _mecha_refs[3] @@ -49,23 +50,23 @@ _mecha_refs[5] _mecha_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - + _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'execute:subcommand' arguments: _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=3, colno=18) + end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt index f2ce2987d..ca50d67e0 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__0.txt @@ -1,21 +1,21 @@ -if score @s tmp matches 0 - while True +if score @s tmp matches 0: + while True: say hello - while True + while True: say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -33,63 +33,64 @@ if score @s tmp matches 0 end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'while:condition:body' arguments: - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) + location: SourceLocation(pos=37, lineno=2, colno=11) + end_location: SourceLocation(pos=41, lineno=2, colno=15) value: True - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) fragments: - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) value: 'hello' - location: SourceLocation(pos=63, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=65, lineno=4, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'while:condition:body' arguments: - location: SourceLocation(pos=69, lineno=4, colno=11) - end_location: SourceLocation(pos=73, lineno=4, colno=15) + location: SourceLocation(pos=71, lineno=4, colno=11) + end_location: SourceLocation(pos=75, lineno=4, colno=15) value: True - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=85, lineno=5, colno=9) + end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=85, lineno=5, colno=9) + end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=89, lineno=5, colno=13) + end_location: SourceLocation(pos=94, lineno=5, colno=18) fragments: - location: SourceLocation(pos=86, lineno=5, colno=13) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=89, lineno=5, colno=13) + end_location: SourceLocation(pos=94, lineno=5, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt index ab33a6d7b..6fafbbc6e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_44__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_44__1.txt @@ -7,34 +7,35 @@ with _mecha_runtime.scope() as _mecha_var1: _mecha_runtime.commands.extend(_mecha_refs[0].commands) while True: _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], root=_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0)))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var0))]))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: _mecha_refs[1] - location: SourceLocation(pos=82, lineno=5, colno=9) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=85, lineno=5, colno=9) + end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: _mecha_refs[2] - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: _mecha_refs[3] - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=91, lineno=5, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: _mecha_refs[4] @@ -57,23 +58,23 @@ _mecha_refs[6] _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - + _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'execute:subcommand' arguments: _mecha_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=91, lineno=5, colno=18) + end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt index bce8173d5..22aca6b30 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__0.txt @@ -1,19 +1,19 @@ -if score @s tmp matches 0 - while True +if score @s tmp matches 0: + while True: say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -31,37 +31,38 @@ if score @s tmp matches 0 end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'while:condition:body' arguments: - location: SourceLocation(pos=36, lineno=2, colno=11) - end_location: SourceLocation(pos=40, lineno=2, colno=15) + location: SourceLocation(pos=37, lineno=2, colno=11) + end_location: SourceLocation(pos=41, lineno=2, colno=15) value: True - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) fragments: - location: SourceLocation(pos=53, lineno=3, colno=13) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt index fbea798e8..efcf4a5b9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_45__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_45__1.txt @@ -5,27 +5,28 @@ with _mecha_runtime.scope() as _mecha_var1: with _mecha_runtime.scope() as _mecha_var0: while True: _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))]))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] - location: SourceLocation(pos=49, lineno=3, colno=9) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: _mecha_refs[1] - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: _mecha_refs[2] - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=58, lineno=3, colno=18) - root: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: _mecha_refs[3] @@ -48,23 +49,23 @@ _mecha_refs[5] _mecha_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - + _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'execute:subcommand' arguments: _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=18) + end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt index ed8f6fec1..b44b0586b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__0.txt @@ -1,21 +1,21 @@ -if score @s tmp matches 42 +if score @s tmp matches 42: count = 42 - while count > 0 + while count > 0: say hello count = count - 1 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=106, lineno=6, colno=1) + end_location: SourceLocation(pos=108, lineno=6, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: @@ -33,95 +33,96 @@ if score @s tmp matches 42 end_location: SourceLocation(pos=26, lineno=1, colno=27) min: 42 max: 42 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - root: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:commands' + arguments: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) commands: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=42, lineno=2, colno=15) identifier: 'statement' arguments: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=15) + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=42, lineno=2, colno=15) operator: '=' target: - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=2, colno=10) value: 'count' value: - location: SourceLocation(pos=39, lineno=2, colno=13) - end_location: SourceLocation(pos=41, lineno=2, colno=15) + location: SourceLocation(pos=40, lineno=2, colno=13) + end_location: SourceLocation(pos=42, lineno=2, colno=15) value: 42 - location: SourceLocation(pos=46, lineno=3, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=47, lineno=3, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'while:condition:body' arguments: - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=61, lineno=3, colno=20) + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=62, lineno=3, colno=20) operator: '>' left: - location: SourceLocation(pos=52, lineno=3, colno=11) - end_location: SourceLocation(pos=57, lineno=3, colno=16) + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=58, lineno=3, colno=16) value: 'count' right: - location: SourceLocation(pos=60, lineno=3, colno=19) - end_location: SourceLocation(pos=61, lineno=3, colno=20) + location: SourceLocation(pos=61, lineno=3, colno=19) + end_location: SourceLocation(pos=62, lineno=3, colno=20) value: 0 - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=72, lineno=4, colno=9) + end_location: SourceLocation(pos=107, lineno=5, colno=26) commands: - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) + location: SourceLocation(pos=72, lineno=4, colno=9) + end_location: SourceLocation(pos=81, lineno=4, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) + location: SourceLocation(pos=76, lineno=4, colno=13) + end_location: SourceLocation(pos=81, lineno=4, colno=18) fragments: - location: SourceLocation(pos=74, lineno=4, colno=13) - end_location: SourceLocation(pos=79, lineno=4, colno=18) + location: SourceLocation(pos=76, lineno=4, colno=13) + end_location: SourceLocation(pos=81, lineno=4, colno=18) value: 'hello' - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=90, lineno=5, colno=9) + end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'statement' arguments: - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=90, lineno=5, colno=9) + end_location: SourceLocation(pos=107, lineno=5, colno=26) operator: '=' target: - location: SourceLocation(pos=88, lineno=5, colno=9) - end_location: SourceLocation(pos=93, lineno=5, colno=14) + location: SourceLocation(pos=90, lineno=5, colno=9) + end_location: SourceLocation(pos=95, lineno=5, colno=14) value: 'count' value: - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=98, lineno=5, colno=17) + end_location: SourceLocation(pos=107, lineno=5, colno=26) operator: '-' left: - location: SourceLocation(pos=96, lineno=5, colno=17) - end_location: SourceLocation(pos=101, lineno=5, colno=22) + location: SourceLocation(pos=98, lineno=5, colno=17) + end_location: SourceLocation(pos=103, lineno=5, colno=22) value: 'count' right: - location: SourceLocation(pos=104, lineno=5, colno=25) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=106, lineno=5, colno=25) + end_location: SourceLocation(pos=107, lineno=5, colno=26) value: 1 diff --git a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt index 818ebb3d4..b59803b32 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_46__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_46__1.txt @@ -11,29 +11,30 @@ count) > 0): count = ( ( count) - 1) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], root=_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0))]))]))]))) _mecha_var2 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var1))--- output = _mecha_var2 --- _mecha_refs[0] - location: SourceLocation(pos=70, lineno=4, colno=9) - end_location: SourceLocation(pos=79, lineno=4, colno=18) + location: SourceLocation(pos=72, lineno=4, colno=9) + end_location: SourceLocation(pos=81, lineno=4, colno=18) identifier: 'say:message' arguments: _mecha_refs[1] - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) commands: _mecha_refs[2] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=26) - root: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:commands' + arguments: _mecha_refs[3] @@ -56,23 +57,23 @@ _mecha_refs[5] _mecha_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' arguments: - + _mecha_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=105, lineno=5, colno=26) + end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'execute:subcommand' arguments: _mecha_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=106, lineno=6, colno=1) + end_location: SourceLocation(pos=108, lineno=6, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt index b732952c7..1eacf6204 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__0.txt @@ -1,13 +1,13 @@ -for c in "abc" +for c in "abc": say something --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + end_location: SourceLocation(pos=33, lineno=2, colno=18) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + end_location: SourceLocation(pos=33, lineno=2, colno=18) identifier: 'for:target:in:iterable:body' arguments: @@ -19,19 +19,19 @@ for c in "abc" end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'abc' - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=18) commands: - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=18) identifier: 'say:message' arguments: - location: SourceLocation(pos=23, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + location: SourceLocation(pos=24, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=18) fragments: - location: SourceLocation(pos=23, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + location: SourceLocation(pos=24, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=18) value: 'something' diff --git a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt index b74e8e624..8465f0517 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_51__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_51__1.txt @@ -9,13 +9,13 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=18) commands: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=2, colno=18) + end_location: SourceLocation(pos=33, lineno=2, colno=18) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_54__0.txt b/packages/mecha/tests/snapshots/scripting__parse_54__0.txt index e493bd042..9dc998ba7 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_54__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_54__0.txt @@ -1,7 +1,7 @@ #>ERROR Identifier 'foo' is not defined. # line 1, column 12 -# 1 | for foo in foo +# 1 | for foo in foo: # : ^^^ # 2 | foo = foo -for foo in foo +for foo in foo: foo = foo diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__0.txt b/packages/mecha/tests/snapshots/scripting__parse_55__0.txt index 65bc306f0..7bf525570 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_55__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_55__0.txt @@ -1,13 +1,13 @@ -for foo in "foo" +for foo in "foo": foo = foo --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=3, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=2, colno=14) + end_location: SourceLocation(pos=31, lineno=2, colno=14) identifier: 'for:target:in:iterable:body' arguments: @@ -19,25 +19,25 @@ for foo in "foo" end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'foo' - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=30, lineno=2, colno=14) + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=14) commands: - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=30, lineno=2, colno=14) + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=14) identifier: 'statement' arguments: - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=30, lineno=2, colno=14) + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=14) operator: '=' target: - location: SourceLocation(pos=21, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=8) + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=8) value: 'foo' value: - location: SourceLocation(pos=27, lineno=2, colno=11) - end_location: SourceLocation(pos=30, lineno=2, colno=14) + location: SourceLocation(pos=28, lineno=2, colno=11) + end_location: SourceLocation(pos=31, lineno=2, colno=14) value: 'foo' diff --git a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt index 05dc0208b..5870ed03f 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_55__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_55__1.txt @@ -11,6 +11,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=3, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_61__0.txt b/packages/mecha/tests/snapshots/scripting__parse_61__0.txt index 965d0e647..b4c290a84 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_61__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_61__0.txt @@ -1,7 +1,7 @@ -if true +if true: #>ERROR Can only use 'break' in loops. # line 2, column 5 -# 1 | if true +# 1 | if true: # 2 | break # : ^^^^^ break diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt index 9c32a0158..ac6fb7c6c 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__0.txt @@ -1,14 +1,14 @@ -for i in "" +for i in "": say hello continue --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=4, colno=1) + end_location: SourceLocation(pos=40, lineno=4, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=3, colno=13) + end_location: SourceLocation(pos=39, lineno=3, colno=13) identifier: 'for:target:in:iterable:body' arguments: @@ -20,25 +20,25 @@ for i in "" end_location: SourceLocation(pos=11, lineno=1, colno=12) value: '' - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=13) + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=13) commands: - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=14) + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) + location: SourceLocation(pos=21, lineno=2, colno=9) + end_location: SourceLocation(pos=26, lineno=2, colno=14) fragments: - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) + location: SourceLocation(pos=21, lineno=2, colno=9) + end_location: SourceLocation(pos=26, lineno=2, colno=14) value: 'hello' - location: SourceLocation(pos=30, lineno=3, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=13) + location: SourceLocation(pos=31, lineno=3, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=13) identifier: 'continue' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt index ec2603802..00448fec2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_62__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_62__1.txt @@ -10,14 +10,14 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=14) + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=14) identifier: 'say:message' arguments: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=4, colno=1) + end_location: SourceLocation(pos=40, lineno=4, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__0.txt b/packages/mecha/tests/snapshots/scripting__parse_63__0.txt index 0a158453e..0a0686933 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_63__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_63__0.txt @@ -1,13 +1,13 @@ -while false +while false: break --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=3, colno=1) + end_location: SourceLocation(pos=23, lineno=3, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=10) identifier: 'while:condition:body' arguments: @@ -15,12 +15,12 @@ while false end_location: SourceLocation(pos=11, lineno=1, colno=12) value: False - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=10) + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=10) commands: - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=10) + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=10) identifier: 'break' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt index a9761fe92..193f58697 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_63__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_63__1.txt @@ -10,6 +10,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=3, colno=1) + end_location: SourceLocation(pos=23, lineno=3, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__0.txt b/packages/mecha/tests/snapshots/scripting__parse_64__0.txt index 042e5b54e..3746a8ce8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_64__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_64__0.txt @@ -1,14 +1,14 @@ -for i in "abc" - if i == "b" +for i in "abc": + if i == "b": break --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=45, lineno=4, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=44, lineno=3, colno=14) + end_location: SourceLocation(pos=46, lineno=3, colno=14) identifier: 'for:target:in:iterable:body' arguments: @@ -20,35 +20,35 @@ for i in "abc" end_location: SourceLocation(pos=14, lineno=1, colno=15) value: 'abc' - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=14) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=14) commands: - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=44, lineno=3, colno=14) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=14) identifier: 'if:condition:body' arguments: - location: SourceLocation(pos=22, lineno=2, colno=8) - end_location: SourceLocation(pos=30, lineno=2, colno=16) + location: SourceLocation(pos=23, lineno=2, colno=8) + end_location: SourceLocation(pos=31, lineno=2, colno=16) operator: '==' left: - location: SourceLocation(pos=22, lineno=2, colno=8) - end_location: SourceLocation(pos=23, lineno=2, colno=9) + location: SourceLocation(pos=23, lineno=2, colno=8) + end_location: SourceLocation(pos=24, lineno=2, colno=9) value: 'i' right: - location: SourceLocation(pos=27, lineno=2, colno=13) - end_location: SourceLocation(pos=30, lineno=2, colno=16) + location: SourceLocation(pos=28, lineno=2, colno=13) + end_location: SourceLocation(pos=31, lineno=2, colno=16) value: 'b' - location: SourceLocation(pos=39, lineno=3, colno=9) - end_location: SourceLocation(pos=44, lineno=3, colno=14) + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=46, lineno=3, colno=14) commands: - location: SourceLocation(pos=39, lineno=3, colno=9) - end_location: SourceLocation(pos=44, lineno=3, colno=14) + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=46, lineno=3, colno=14) identifier: 'break' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt index c6ffddadc..b64ba3609 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_64__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_64__1.txt @@ -13,6 +13,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=45, lineno=4, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__0.txt b/packages/mecha/tests/snapshots/scripting__parse_70__0.txt index 4715cdb13..9a3b657bd 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__0.txt @@ -1,14 +1,14 @@ -def foo() +def foo(): say hello foo() --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=4, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=24, lineno=2, colno=14) identifier: 'def:function:body' arguments: @@ -18,34 +18,34 @@ foo() arguments: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) fragments: - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) value: 'hello' - location: SourceLocation(pos=24, lineno=3, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=6) + location: SourceLocation(pos=25, lineno=3, colno=1) + end_location: SourceLocation(pos=30, lineno=3, colno=6) identifier: 'statement' arguments: - location: SourceLocation(pos=24, lineno=3, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=6) + location: SourceLocation(pos=25, lineno=3, colno=1) + end_location: SourceLocation(pos=30, lineno=3, colno=6) value: - location: SourceLocation(pos=24, lineno=3, colno=1) - end_location: SourceLocation(pos=27, lineno=3, colno=4) + location: SourceLocation(pos=25, lineno=3, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=4) value: 'foo' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt index ec860f223..4777263a5 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_70__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_70__1.txt @@ -12,14 +12,14 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=4, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__0.txt b/packages/mecha/tests/snapshots/scripting__parse_71__0.txt index 3b338633c..83ee04d57 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_71__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_71__0.txt @@ -1,15 +1,15 @@ -def foo() - def bar() +def foo(): + def bar(): foo() bar() --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=4, colno=10) + end_location: SourceLocation(pos=49, lineno=4, colno=10) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=4, colno=10) + end_location: SourceLocation(pos=49, lineno=4, colno=10) identifier: 'def:function:body' arguments: @@ -19,51 +19,51 @@ def foo() arguments: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=10) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=49, lineno=4, colno=10) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=37, lineno=3, colno=14) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=14) identifier: 'def:function:body' arguments: - location: SourceLocation(pos=18, lineno=2, colno=9) - end_location: SourceLocation(pos=23, lineno=2, colno=14) + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) name: 'bar' arguments: - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=14) + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) commands: - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=14) + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) identifier: 'statement' arguments: - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=14) + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) value: - location: SourceLocation(pos=32, lineno=3, colno=9) - end_location: SourceLocation(pos=35, lineno=3, colno=12) + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) value: 'foo' arguments: - location: SourceLocation(pos=42, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=10) + location: SourceLocation(pos=44, lineno=4, colno=5) + end_location: SourceLocation(pos=49, lineno=4, colno=10) identifier: 'statement' arguments: - location: SourceLocation(pos=42, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=10) + location: SourceLocation(pos=44, lineno=4, colno=5) + end_location: SourceLocation(pos=49, lineno=4, colno=10) value: - location: SourceLocation(pos=42, lineno=4, colno=5) - end_location: SourceLocation(pos=45, lineno=4, colno=8) + location: SourceLocation(pos=44, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=8) value: 'bar' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt index 37460eb72..bccc61e25 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_71__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_71__1.txt @@ -16,6 +16,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=4, colno=10) + end_location: SourceLocation(pos=49, lineno=4, colno=10) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__0.txt b/packages/mecha/tests/snapshots/scripting__parse_72__0.txt index 7f2baeaf6..d875c1ea9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__0.txt @@ -2,16 +2,16 @@ def foo( a=1, b=a, c=a + b, -) +): say hello --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + end_location: SourceLocation(pos=56, lineno=6, colno=14) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + end_location: SourceLocation(pos=56, lineno=6, colno=14) identifier: 'def:function:body' arguments: @@ -57,19 +57,19 @@ def foo( end_location: SourceLocation(pos=38, lineno=4, colno=12) value: 'b' - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + location: SourceLocation(pos=47, lineno=6, colno=5) + end_location: SourceLocation(pos=56, lineno=6, colno=14) commands: - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + location: SourceLocation(pos=47, lineno=6, colno=5) + end_location: SourceLocation(pos=56, lineno=6, colno=14) identifier: 'say:message' arguments: - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + location: SourceLocation(pos=51, lineno=6, colno=9) + end_location: SourceLocation(pos=56, lineno=6, colno=14) fragments: - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + location: SourceLocation(pos=51, lineno=6, colno=9) + end_location: SourceLocation(pos=56, lineno=6, colno=14) value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt index c730aaf44..2bc0d7dd8 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_72__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_72__1.txt @@ -20,13 +20,13 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + location: SourceLocation(pos=47, lineno=6, colno=5) + end_location: SourceLocation(pos=56, lineno=6, colno=14) commands: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=55, lineno=6, colno=14) + end_location: SourceLocation(pos=56, lineno=6, colno=14) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_75__0.txt b/packages/mecha/tests/snapshots/scripting__parse_75__0.txt index 279d853a8..6a44e3695 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_75__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_75__0.txt @@ -1,7 +1,7 @@ -#>ERROR Expected statement but got newline '\n'. -# line 1, column 8 -# 1 | def f() +def f(): +#>ERROR Expected indent but got literal 'say'. +# line 2, column 1 +# 1 | def f(): # 2 | say yolo -# : ^ -def f() +# : ^^^ say yolo diff --git a/packages/mecha/tests/snapshots/scripting__parse_76__0.txt b/packages/mecha/tests/snapshots/scripting__parse_76__0.txt index 3074c6bd4..55fc54fed 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_76__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_76__0.txt @@ -1,7 +1,7 @@ #>ERROR Identifier 'a' is not defined. # line 1, column 9 -# 1 | def f(a=a) +# 1 | def f(a=a): # : ^ # 2 | say wat -def f(a=a) +def f(a=a): say wat diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__0.txt b/packages/mecha/tests/snapshots/scripting__parse_77__0.txt index 97230d4f6..db0a3f40d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__0.txt @@ -1,14 +1,14 @@ -def f(a, b=a) +def f(a, b=a): b += a say wat --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + end_location: SourceLocation(pos=37, lineno=3, colno=12) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + end_location: SourceLocation(pos=37, lineno=3, colno=12) identifier: 'def:function:body' arguments: @@ -31,38 +31,38 @@ def f(a, b=a) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'a' - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) commands: - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=11) + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=11) identifier: 'statement' arguments: - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=11) + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=11) operator: '+=' target: - location: SourceLocation(pos=18, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=6) + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=6) value: 'b' value: - location: SourceLocation(pos=23, lineno=2, colno=10) - end_location: SourceLocation(pos=24, lineno=2, colno=11) + location: SourceLocation(pos=24, lineno=2, colno=10) + end_location: SourceLocation(pos=25, lineno=2, colno=11) value: 'a' - location: SourceLocation(pos=29, lineno=3, colno=5) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + location: SourceLocation(pos=30, lineno=3, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) identifier: 'say:message' arguments: - location: SourceLocation(pos=33, lineno=3, colno=9) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) fragments: - location: SourceLocation(pos=33, lineno=3, colno=9) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt index e1dbb0de5..9dd9e4191 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_77__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_77__1.txt @@ -15,14 +15,14 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=29, lineno=3, colno=5) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + location: SourceLocation(pos=30, lineno=3, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) identifier: 'say:message' arguments: _mecha_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=12) + end_location: SourceLocation(pos=37, lineno=3, colno=12) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_78__0.txt b/packages/mecha/tests/snapshots/scripting__parse_78__0.txt index 5b9cbb9c8..5edddb17a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_78__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_78__0.txt @@ -1,5 +1,5 @@ -def f(a, b) - def g(c) +def f(a, b): + def g(c): a + b c #>ERROR Expected assignment but got literal '()'. diff --git a/packages/mecha/tests/snapshots/scripting__parse_79__0.txt b/packages/mecha/tests/snapshots/scripting__parse_79__0.txt index baa66bb83..18e649807 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_79__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_79__0.txt @@ -1,5 +1,5 @@ -def f(a, b) - def g(c) +def f(a, b): + def g(c): a + b #>ERROR Identifier 'c' is not defined. # line 4, column 7 diff --git a/packages/mecha/tests/snapshots/scripting__parse_80__0.txt b/packages/mecha/tests/snapshots/scripting__parse_80__0.txt index 1e92542a6..ef7d69339 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_80__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_80__0.txt @@ -1,5 +1,5 @@ -def foo(something) - def wat() +def foo(something): + def wat(): say yo wat @@ -10,10 +10,10 @@ def foo(something) #>ERROR Identifier 'somehng' is not defined. Did you mean 'something'? # line 10, column 18 # 9 | x = "hello" -# 10 | for i in somehng +# 10 | for i in somehng: # : ^^^^^^^ # 11 | x += i * 3 - for i in somehng + for i in somehng: x += i * 3 say wow diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__0.txt b/packages/mecha/tests/snapshots/scripting__parse_81__0.txt index 63faad507..2a30e836e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__0.txt @@ -1,5 +1,5 @@ -def foo(something) - def wat() +def foo(something): + def wat(): say yo wat @@ -7,7 +7,7 @@ def foo(something) dat # this is a comment x = "hello" - for i in something + for i in something: x += i * 3 say wow @@ -15,11 +15,11 @@ def foo(something) --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=223, lineno=14, colno=10) + end_location: SourceLocation(pos=226, lineno=14, colno=10) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=223, lineno=14, colno=10) + end_location: SourceLocation(pos=226, lineno=14, colno=10) identifier: 'def:function:body' arguments: @@ -33,151 +33,151 @@ def foo(something) name: 'something' default: None - location: SourceLocation(pos=23, lineno=2, colno=5) - end_location: SourceLocation(pos=223, lineno=14, colno=10) + location: SourceLocation(pos=24, lineno=2, colno=5) + end_location: SourceLocation(pos=226, lineno=14, colno=10) commands: - location: SourceLocation(pos=23, lineno=2, colno=5) - end_location: SourceLocation(pos=213, lineno=13, colno=16) + location: SourceLocation(pos=24, lineno=2, colno=5) + end_location: SourceLocation(pos=216, lineno=13, colno=16) identifier: 'def:function:body' arguments: - location: SourceLocation(pos=27, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=14) + location: SourceLocation(pos=28, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=14) name: 'wat' arguments: - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=213, lineno=13, colno=16) + location: SourceLocation(pos=43, lineno=3, colno=9) + end_location: SourceLocation(pos=216, lineno=13, colno=16) commands: - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=106, lineno=7, colno=16) + location: SourceLocation(pos=43, lineno=3, colno=9) + end_location: SourceLocation(pos=108, lineno=7, colno=16) identifier: 'say:message' arguments: - location: SourceLocation(pos=57, lineno=4, colno=13) - end_location: SourceLocation(pos=106, lineno=7, colno=16) + location: SourceLocation(pos=59, lineno=4, colno=13) + end_location: SourceLocation(pos=108, lineno=7, colno=16) fragments: - location: SourceLocation(pos=57, lineno=4, colno=13) - end_location: SourceLocation(pos=59, lineno=4, colno=15) + location: SourceLocation(pos=59, lineno=4, colno=13) + end_location: SourceLocation(pos=61, lineno=4, colno=15) value: 'yo' - location: SourceLocation(pos=71, lineno=5, colno=12) - end_location: SourceLocation(pos=72, lineno=5, colno=13) + location: SourceLocation(pos=73, lineno=5, colno=12) + end_location: SourceLocation(pos=74, lineno=5, colno=13) value: ' ' - location: SourceLocation(pos=72, lineno=5, colno=13) - end_location: SourceLocation(pos=75, lineno=5, colno=16) + location: SourceLocation(pos=74, lineno=5, colno=13) + end_location: SourceLocation(pos=77, lineno=5, colno=16) value: 'wat' - location: SourceLocation(pos=87, lineno=6, colno=12) - end_location: SourceLocation(pos=88, lineno=6, colno=13) + location: SourceLocation(pos=89, lineno=6, colno=12) + end_location: SourceLocation(pos=90, lineno=6, colno=13) value: ' ' - location: SourceLocation(pos=88, lineno=6, colno=13) - end_location: SourceLocation(pos=90, lineno=6, colno=15) + location: SourceLocation(pos=90, lineno=6, colno=13) + end_location: SourceLocation(pos=92, lineno=6, colno=15) value: 'is' - location: SourceLocation(pos=102, lineno=7, colno=12) - end_location: SourceLocation(pos=103, lineno=7, colno=13) + location: SourceLocation(pos=104, lineno=7, colno=12) + end_location: SourceLocation(pos=105, lineno=7, colno=13) value: ' ' - location: SourceLocation(pos=103, lineno=7, colno=13) - end_location: SourceLocation(pos=106, lineno=7, colno=16) + location: SourceLocation(pos=105, lineno=7, colno=13) + end_location: SourceLocation(pos=108, lineno=7, colno=16) value: 'dat' - location: SourceLocation(pos=135, lineno=9, colno=9) - end_location: SourceLocation(pos=146, lineno=9, colno=20) + location: SourceLocation(pos=137, lineno=9, colno=9) + end_location: SourceLocation(pos=148, lineno=9, colno=20) identifier: 'statement' arguments: - location: SourceLocation(pos=135, lineno=9, colno=9) - end_location: SourceLocation(pos=146, lineno=9, colno=20) + location: SourceLocation(pos=137, lineno=9, colno=9) + end_location: SourceLocation(pos=148, lineno=9, colno=20) operator: '=' target: - location: SourceLocation(pos=135, lineno=9, colno=9) - end_location: SourceLocation(pos=136, lineno=9, colno=10) + location: SourceLocation(pos=137, lineno=9, colno=9) + end_location: SourceLocation(pos=138, lineno=9, colno=10) value: 'x' value: - location: SourceLocation(pos=139, lineno=9, colno=13) - end_location: SourceLocation(pos=146, lineno=9, colno=20) + location: SourceLocation(pos=141, lineno=9, colno=13) + end_location: SourceLocation(pos=148, lineno=9, colno=20) value: 'hello' - location: SourceLocation(pos=155, lineno=10, colno=9) - end_location: SourceLocation(pos=196, lineno=11, colno=23) + location: SourceLocation(pos=157, lineno=10, colno=9) + end_location: SourceLocation(pos=199, lineno=11, colno=23) identifier: 'for:target:in:iterable:body' arguments: - location: SourceLocation(pos=159, lineno=10, colno=13) - end_location: SourceLocation(pos=160, lineno=10, colno=14) + location: SourceLocation(pos=161, lineno=10, colno=13) + end_location: SourceLocation(pos=162, lineno=10, colno=14) value: 'i' - location: SourceLocation(pos=164, lineno=10, colno=18) - end_location: SourceLocation(pos=173, lineno=10, colno=27) + location: SourceLocation(pos=166, lineno=10, colno=18) + end_location: SourceLocation(pos=175, lineno=10, colno=27) value: 'something' - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=196, lineno=11, colno=23) + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=199, lineno=11, colno=23) commands: - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=196, lineno=11, colno=23) + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=199, lineno=11, colno=23) identifier: 'statement' arguments: - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=196, lineno=11, colno=23) + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=199, lineno=11, colno=23) operator: '+=' target: - location: SourceLocation(pos=186, lineno=11, colno=13) - end_location: SourceLocation(pos=187, lineno=11, colno=14) + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=190, lineno=11, colno=14) value: 'x' value: - location: SourceLocation(pos=191, lineno=11, colno=18) - end_location: SourceLocation(pos=196, lineno=11, colno=23) + location: SourceLocation(pos=194, lineno=11, colno=18) + end_location: SourceLocation(pos=199, lineno=11, colno=23) operator: '*' left: - location: SourceLocation(pos=191, lineno=11, colno=18) - end_location: SourceLocation(pos=192, lineno=11, colno=19) + location: SourceLocation(pos=194, lineno=11, colno=18) + end_location: SourceLocation(pos=195, lineno=11, colno=19) value: 'i' right: - location: SourceLocation(pos=195, lineno=11, colno=22) - end_location: SourceLocation(pos=196, lineno=11, colno=23) + location: SourceLocation(pos=198, lineno=11, colno=22) + end_location: SourceLocation(pos=199, lineno=11, colno=23) value: 3 - location: SourceLocation(pos=206, lineno=13, colno=9) - end_location: SourceLocation(pos=213, lineno=13, colno=16) + location: SourceLocation(pos=209, lineno=13, colno=9) + end_location: SourceLocation(pos=216, lineno=13, colno=16) identifier: 'say:message' arguments: - location: SourceLocation(pos=210, lineno=13, colno=13) - end_location: SourceLocation(pos=213, lineno=13, colno=16) + location: SourceLocation(pos=213, lineno=13, colno=13) + end_location: SourceLocation(pos=216, lineno=13, colno=16) fragments: - location: SourceLocation(pos=210, lineno=13, colno=13) - end_location: SourceLocation(pos=213, lineno=13, colno=16) + location: SourceLocation(pos=213, lineno=13, colno=13) + end_location: SourceLocation(pos=216, lineno=13, colno=16) value: 'wow' - location: SourceLocation(pos=218, lineno=14, colno=5) - end_location: SourceLocation(pos=223, lineno=14, colno=10) + location: SourceLocation(pos=221, lineno=14, colno=5) + end_location: SourceLocation(pos=226, lineno=14, colno=10) identifier: 'statement' arguments: - location: SourceLocation(pos=218, lineno=14, colno=5) - end_location: SourceLocation(pos=223, lineno=14, colno=10) + location: SourceLocation(pos=221, lineno=14, colno=5) + end_location: SourceLocation(pos=226, lineno=14, colno=10) value: - location: SourceLocation(pos=218, lineno=14, colno=5) - end_location: SourceLocation(pos=221, lineno=14, colno=8) + location: SourceLocation(pos=221, lineno=14, colno=5) + end_location: SourceLocation(pos=224, lineno=14, colno=8) value: 'wat' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt index 20f6464be..d7493cb75 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_81__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_81__1.txt @@ -20,21 +20,21 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=106, lineno=7, colno=16) + location: SourceLocation(pos=43, lineno=3, colno=9) + end_location: SourceLocation(pos=108, lineno=7, colno=16) identifier: 'say:message' arguments: _mecha_refs[1] - location: SourceLocation(pos=206, lineno=13, colno=9) - end_location: SourceLocation(pos=213, lineno=13, colno=16) + location: SourceLocation(pos=209, lineno=13, colno=9) + end_location: SourceLocation(pos=216, lineno=13, colno=16) identifier: 'say:message' arguments: _mecha_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=223, lineno=14, colno=10) + end_location: SourceLocation(pos=226, lineno=14, colno=10) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__0.txt b/packages/mecha/tests/snapshots/scripting__parse_82__0.txt index c69ca071b..4f4da3ed9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_82__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_82__0.txt @@ -1,16 +1,16 @@ -def foo() +def foo(): thing += bar() -def bar() +def bar(): thing += foo() thing = bar() --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=72, lineno=6, colno=1) + end_location: SourceLocation(pos=74, lineno=6, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=19) + end_location: SourceLocation(pos=29, lineno=2, colno=19) identifier: 'def:function:body' arguments: @@ -20,96 +20,96 @@ thing = bar() arguments: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=28, lineno=2, colno=19) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=2, colno=19) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=28, lineno=2, colno=19) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=2, colno=19) identifier: 'statement' arguments: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=28, lineno=2, colno=19) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=2, colno=19) operator: '+=' target: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=10) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=10) value: 'thing' value: - location: SourceLocation(pos=23, lineno=2, colno=14) - end_location: SourceLocation(pos=28, lineno=2, colno=19) + location: SourceLocation(pos=24, lineno=2, colno=14) + end_location: SourceLocation(pos=29, lineno=2, colno=19) value: - location: SourceLocation(pos=23, lineno=2, colno=14) - end_location: SourceLocation(pos=26, lineno=2, colno=17) + location: SourceLocation(pos=24, lineno=2, colno=14) + end_location: SourceLocation(pos=27, lineno=2, colno=17) value: 'bar' arguments: - location: SourceLocation(pos=29, lineno=3, colno=1) - end_location: SourceLocation(pos=57, lineno=4, colno=19) + location: SourceLocation(pos=30, lineno=3, colno=1) + end_location: SourceLocation(pos=59, lineno=4, colno=19) identifier: 'def:function:body' arguments: - location: SourceLocation(pos=33, lineno=3, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=10) + location: SourceLocation(pos=34, lineno=3, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=10) name: 'bar' arguments: - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=57, lineno=4, colno=19) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=59, lineno=4, colno=19) commands: - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=57, lineno=4, colno=19) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=59, lineno=4, colno=19) identifier: 'statement' arguments: - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=57, lineno=4, colno=19) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=59, lineno=4, colno=19) operator: '+=' target: - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=48, lineno=4, colno=10) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=10) value: 'thing' value: - location: SourceLocation(pos=52, lineno=4, colno=14) - end_location: SourceLocation(pos=57, lineno=4, colno=19) + location: SourceLocation(pos=54, lineno=4, colno=14) + end_location: SourceLocation(pos=59, lineno=4, colno=19) value: - location: SourceLocation(pos=52, lineno=4, colno=14) - end_location: SourceLocation(pos=55, lineno=4, colno=17) + location: SourceLocation(pos=54, lineno=4, colno=14) + end_location: SourceLocation(pos=57, lineno=4, colno=17) value: 'foo' arguments: - location: SourceLocation(pos=58, lineno=5, colno=1) - end_location: SourceLocation(pos=71, lineno=5, colno=14) + location: SourceLocation(pos=60, lineno=5, colno=1) + end_location: SourceLocation(pos=73, lineno=5, colno=14) identifier: 'statement' arguments: - location: SourceLocation(pos=58, lineno=5, colno=1) - end_location: SourceLocation(pos=71, lineno=5, colno=14) + location: SourceLocation(pos=60, lineno=5, colno=1) + end_location: SourceLocation(pos=73, lineno=5, colno=14) operator: '=' target: - location: SourceLocation(pos=58, lineno=5, colno=1) - end_location: SourceLocation(pos=63, lineno=5, colno=6) + location: SourceLocation(pos=60, lineno=5, colno=1) + end_location: SourceLocation(pos=65, lineno=5, colno=6) value: 'thing' value: - location: SourceLocation(pos=66, lineno=5, colno=9) - end_location: SourceLocation(pos=71, lineno=5, colno=14) + location: SourceLocation(pos=68, lineno=5, colno=9) + end_location: SourceLocation(pos=73, lineno=5, colno=14) value: - location: SourceLocation(pos=66, lineno=5, colno=9) - end_location: SourceLocation(pos=69, lineno=5, colno=12) + location: SourceLocation(pos=68, lineno=5, colno=9) + end_location: SourceLocation(pos=71, lineno=5, colno=12) value: 'bar' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt index 9a97b9df6..f31605211 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_82__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_82__1.txt @@ -19,7 +19,7 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=72, lineno=6, colno=1) + end_location: SourceLocation(pos=74, lineno=6, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_83__0.txt b/packages/mecha/tests/snapshots/scripting__parse_83__0.txt index 379a70675..1e085b412 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_83__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_83__0.txt @@ -1,9 +1,9 @@ -def foo() +def foo(): bar() + thing -def bar() +def bar(): #>ERROR Identifier 'thin' is not defined. Did you mean 'thing'? # line 4, column 13 -# 3 | def bar() +# 3 | def bar(): # 4 | foo() + thin # : ^^^^ # 5 | thing = bar() diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__0.txt b/packages/mecha/tests/snapshots/scripting__parse_84__0.txt index 2675c1bb1..c46d274e4 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_84__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_84__0.txt @@ -1,13 +1,13 @@ -def foo() +def foo(): return --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=11) + end_location: SourceLocation(pos=21, lineno=2, colno=11) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=11) + end_location: SourceLocation(pos=21, lineno=2, colno=11) identifier: 'def:function:body' arguments: @@ -17,12 +17,12 @@ def foo() arguments: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=20, lineno=2, colno=11) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=11) commands: - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=20, lineno=2, colno=11) + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=11) identifier: 'return' arguments: diff --git a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt index 391a9733c..857f1e5f2 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_84__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_84__1.txt @@ -10,6 +10,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=11) + end_location: SourceLocation(pos=21, lineno=2, colno=11) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__0.txt b/packages/mecha/tests/snapshots/scripting__parse_87__0.txt index 6159f72d6..db945953b 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_87__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_87__0.txt @@ -1,15 +1,15 @@ -def f() - def g() +def f(): + def g(): return foo foo = 0 --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=52, lineno=4, colno=12) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=52, lineno=4, colno=12) identifier: 'def:function:body' arguments: @@ -19,49 +19,49 @@ def f() arguments: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=52, lineno=4, colno=12) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=38, lineno=3, colno=19) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=40, lineno=3, colno=19) identifier: 'def:function:body' arguments: - location: SourceLocation(pos=16, lineno=2, colno=9) - end_location: SourceLocation(pos=19, lineno=2, colno=12) + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=20, lineno=2, colno=12) name: 'g' arguments: - location: SourceLocation(pos=28, lineno=3, colno=9) - end_location: SourceLocation(pos=38, lineno=3, colno=19) + location: SourceLocation(pos=30, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=19) commands: - location: SourceLocation(pos=28, lineno=3, colno=9) - end_location: SourceLocation(pos=38, lineno=3, colno=19) + location: SourceLocation(pos=30, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=19) identifier: 'return:value' arguments: - location: SourceLocation(pos=35, lineno=3, colno=16) - end_location: SourceLocation(pos=38, lineno=3, colno=19) + location: SourceLocation(pos=37, lineno=3, colno=16) + end_location: SourceLocation(pos=40, lineno=3, colno=19) value: 'foo' - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=52, lineno=4, colno=12) identifier: 'statement' arguments: - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=52, lineno=4, colno=12) operator: '=' target: - location: SourceLocation(pos=43, lineno=4, colno=5) - end_location: SourceLocation(pos=46, lineno=4, colno=8) + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=48, lineno=4, colno=8) value: 'foo' value: - location: SourceLocation(pos=49, lineno=4, colno=11) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + location: SourceLocation(pos=51, lineno=4, colno=11) + end_location: SourceLocation(pos=52, lineno=4, colno=12) value: 0 diff --git a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt index 6ff097f57..691826186 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_87__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_87__1.txt @@ -13,6 +13,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=52, lineno=4, colno=12) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_88__0.txt b/packages/mecha/tests/snapshots/scripting__parse_88__0.txt index 5deabe7be..8c57e2750 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_88__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_88__0.txt @@ -1,4 +1,4 @@ -def f() +def f(): foo = 0 #>ERROR Identifier 'foo' is not defined. # line 3, column 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt index 0386bfdf5..a4c7d9fde 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__0.txt @@ -1,14 +1,14 @@ -def f(x) +def f(x): tellraw @a x f("thing") --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + end_location: SourceLocation(pos=26, lineno=2, colno=17) identifier: 'def:function:body' arguments: @@ -22,44 +22,44 @@ f("thing") name: 'x' default: None - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=17) commands: - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=17) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=23, lineno=2, colno=15) + location: SourceLocation(pos=22, lineno=2, colno=13) + end_location: SourceLocation(pos=24, lineno=2, colno=15) variable: 'a' arguments: - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + location: SourceLocation(pos=25, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=17) converter: 'json' value: - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + location: SourceLocation(pos=25, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=17) value: 'x' - location: SourceLocation(pos=26, lineno=3, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=11) + location: SourceLocation(pos=27, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=11) identifier: 'statement' arguments: - location: SourceLocation(pos=26, lineno=3, colno=1) - end_location: SourceLocation(pos=36, lineno=3, colno=11) + location: SourceLocation(pos=27, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=11) value: - location: SourceLocation(pos=26, lineno=3, colno=1) - end_location: SourceLocation(pos=27, lineno=3, colno=2) + location: SourceLocation(pos=27, lineno=3, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=2) value: 'f' arguments: - location: SourceLocation(pos=28, lineno=3, colno=3) - end_location: SourceLocation(pos=35, lineno=3, colno=10) + location: SourceLocation(pos=29, lineno=3, colno=3) + end_location: SourceLocation(pos=36, lineno=3, colno=10) value: 'thing' diff --git a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt index 392cf2781..b2813332d 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_89__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_89__1.txt @@ -15,22 +15,22 @@ output = _mecha_var1 --- _mecha_refs[0] - location: SourceLocation(pos=24, lineno=2, colno=16) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + location: SourceLocation(pos=25, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=17) converter: 'json' value: _mecha_refs[1] - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=23, lineno=2, colno=15) + location: SourceLocation(pos=22, lineno=2, colno=13) + end_location: SourceLocation(pos=24, lineno=2, colno=15) variable: 'a' arguments: _mecha_refs[2] - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=17) + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=17) identifier: 'tellraw:targets:message' arguments: @@ -38,7 +38,7 @@ _mecha_refs[2] _mecha_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_90__0.txt b/packages/mecha/tests/snapshots/scripting__parse_90__0.txt index cbb0f3ee9..0292421c9 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_90__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_90__0.txt @@ -1,7 +1,7 @@ -def f(x) +def f(x): #>ERROR Identifier 'xx' is not defined. Did you mean 'x'? # line 2, column 16 -# 1 | def f(x) +# 1 | def f(x): # 2 | tellraw @a xx # : ^^ # 3 | f("thing") diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__0.txt b/packages/mecha/tests/snapshots/scripting__parse_97__0.txt index 574633f33..58add3a6a 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_97__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_97__0.txt @@ -1,13 +1,13 @@ -def f() +def f(): return {f(): f(), other: [{}, {}, "wat"]} --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=53, lineno=2, colno=46) + end_location: SourceLocation(pos=54, lineno=2, colno=46) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=53, lineno=2, colno=46) + end_location: SourceLocation(pos=54, lineno=2, colno=46) identifier: 'def:function:body' arguments: @@ -17,67 +17,67 @@ def f() arguments: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=53, lineno=2, colno=46) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=54, lineno=2, colno=46) commands: - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=53, lineno=2, colno=46) + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=54, lineno=2, colno=46) identifier: 'return:value' arguments: - location: SourceLocation(pos=19, lineno=2, colno=12) - end_location: SourceLocation(pos=53, lineno=2, colno=46) + location: SourceLocation(pos=20, lineno=2, colno=12) + end_location: SourceLocation(pos=54, lineno=2, colno=46) items: - location: SourceLocation(pos=20, lineno=2, colno=13) - end_location: SourceLocation(pos=28, lineno=2, colno=21) + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=29, lineno=2, colno=21) key: - location: SourceLocation(pos=20, lineno=2, colno=13) - end_location: SourceLocation(pos=23, lineno=2, colno=16) + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=24, lineno=2, colno=16) value: - location: SourceLocation(pos=20, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=14) + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=22, lineno=2, colno=14) value: 'f' arguments: value: - location: SourceLocation(pos=25, lineno=2, colno=18) - end_location: SourceLocation(pos=28, lineno=2, colno=21) + location: SourceLocation(pos=26, lineno=2, colno=18) + end_location: SourceLocation(pos=29, lineno=2, colno=21) value: - location: SourceLocation(pos=25, lineno=2, colno=18) - end_location: SourceLocation(pos=26, lineno=2, colno=19) + location: SourceLocation(pos=26, lineno=2, colno=18) + end_location: SourceLocation(pos=27, lineno=2, colno=19) value: 'f' arguments: - location: SourceLocation(pos=30, lineno=2, colno=23) - end_location: SourceLocation(pos=52, lineno=2, colno=45) + location: SourceLocation(pos=31, lineno=2, colno=23) + end_location: SourceLocation(pos=53, lineno=2, colno=45) key: - location: SourceLocation(pos=30, lineno=2, colno=23) - end_location: SourceLocation(pos=35, lineno=2, colno=28) + location: SourceLocation(pos=31, lineno=2, colno=23) + end_location: SourceLocation(pos=36, lineno=2, colno=28) value: 'other' value: - location: SourceLocation(pos=37, lineno=2, colno=30) - end_location: SourceLocation(pos=52, lineno=2, colno=45) + location: SourceLocation(pos=38, lineno=2, colno=30) + end_location: SourceLocation(pos=53, lineno=2, colno=45) items: - location: SourceLocation(pos=38, lineno=2, colno=31) - end_location: SourceLocation(pos=40, lineno=2, colno=33) + location: SourceLocation(pos=39, lineno=2, colno=31) + end_location: SourceLocation(pos=41, lineno=2, colno=33) items: - location: SourceLocation(pos=42, lineno=2, colno=35) - end_location: SourceLocation(pos=44, lineno=2, colno=37) + location: SourceLocation(pos=43, lineno=2, colno=35) + end_location: SourceLocation(pos=45, lineno=2, colno=37) items: - location: SourceLocation(pos=46, lineno=2, colno=39) - end_location: SourceLocation(pos=51, lineno=2, colno=44) + location: SourceLocation(pos=47, lineno=2, colno=39) + end_location: SourceLocation(pos=52, lineno=2, colno=44) value: 'wat' diff --git a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt index c7f718f1b..22793e386 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_97__1.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_97__1.txt @@ -18,6 +18,6 @@ output = _mecha_var1 _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=53, lineno=2, colno=46) + end_location: SourceLocation(pos=54, lineno=2, colno=46) commands: diff --git a/packages/mecha/tests/snapshots/scripting__parse_98__0.txt b/packages/mecha/tests/snapshots/scripting__parse_98__0.txt index 3322a079e..21de2a29e 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_98__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_98__0.txt @@ -1,8 +1,8 @@ #>ERROR Can't inline conditions as execute subcommands. # line 1, column 7 -# 1 | at @s if "foo" == "bar" -# : ^^^^^^^^^^^^^^^^^ +# 1 | at @s if "foo" == "bar": +# : ^^^^^^^^^^^^^^^^^^ # 2 | say yolo # : ^^^^^^^^ -at @s if "foo" == "bar" +at @s if "foo" == "bar": say yolo diff --git a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt index cca4aba02..dc98f2df6 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt @@ -1,7 +1,7 @@ -#>ERROR Expected literal 'advancement', literal 'align', literal 'anchored', literal 'as', literal 'at', literal 'attribute' or 81 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'as', literal 'at' or 82 other tokens but got literal 'for'. # line 1, column 7 -# 1 | at @s for i in "foo" +# 1 | at @s for i in "foo": # : ^^^ # 2 | say yolo -at @s for i in "foo" +at @s for i in "foo": say yolo From 997169304834207457498e4cdb86887cc68b70f4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Dec 2021 18:38:46 +0100 Subject: [PATCH 0556/1554] test: add more tests for nesting --- .../src/data/demo/functions/foo.mcfunction | 51 +++++ .../src/data/demo/functions/foo.mcfunction | 19 ++ .../resources/scripting_examples.mcfunction | 20 ++ .../examples__build_basic_nesting__0.pack.md | 13 ++ ...examples__build_basic_scripting__0.pack.md | 16 ++ .../snapshots/scripting__parse_136__0.txt | 212 ++++++++++++++++++ .../snapshots/scripting__parse_136__1.txt | 4 + .../snapshots/scripting__parse_137__0.txt | 65 ++++++ .../snapshots/scripting__parse_137__1.txt | 4 + 9 files changed, 404 insertions(+) create mode 100644 packages/mecha/tests/snapshots/scripting__parse_136__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_136__1.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_137__0.txt create mode 100644 packages/mecha/tests/snapshots/scripting__parse_137__1.txt diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction index ecb73a1a3..6af083def 100644 --- a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -41,3 +41,54 @@ execute: execute as @a at @s expand: say hello say world + +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6]: # Check if we're close to the player's feet. + say foo + say bar + +say foo + bar +execute + as @a + run say hello + +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] # Check if we're close to the + # player's feet. + run + say I'm facing the target! + +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] # Check if we're close to the + # player's feet. + expand: + say oh wow + say this is duplicated diff --git a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction index 5c3665653..105f47b2d 100644 --- a/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_scripting/src/data/demo/functions/foo.mcfunction @@ -137,3 +137,22 @@ for i in range(6): else: say other say done + +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] function ./abc: + say foo + say bar + +baz = "demo:xyz" +if predicate foo:bar function baz: + say foo + say bar diff --git a/packages/mecha/mecha/resources/scripting_examples.mcfunction b/packages/mecha/mecha/resources/scripting_examples.mcfunction index 5d36908a3..202224442 100644 --- a/packages/mecha/mecha/resources/scripting_examples.mcfunction +++ b/packages/mecha/mecha/resources/scripting_examples.mcfunction @@ -495,3 +495,23 @@ elif 4: else: say other say done +### +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6]: + say foo + say bar +### +say foo + bar +execute + as @a + run say hello diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index e84627b36..202a8e096 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -25,6 +25,12 @@ execute as @a at @s run function demo:foo/nested_execute_0 execute as @a at @s run function demo:foo/nested_execute_1 execute as @a at @s run say hello execute as @a at @s run say world +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run function demo:foo/nested_execute_2 +say foo bar +execute as @a run say hello +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say oh wow +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say this is duplicated ``` `@function demo:thing2` @@ -79,3 +85,10 @@ setblock ~ ~ ~ stone_pressure_plate setblock ~ ~-1 ~ tnt setblock ~ ~-2 ~ stone ``` + +`@function demo:foo/nested_execute_2` + +```mcfunction +say foo +say bar +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 2ae77f332..8bad862d0 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -101,6 +101,8 @@ say other say done say other say done +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run function demo:abc +execute if predicate foo:bar run function demo:xyz ``` `@function(strip_final_newline) demo:thing` @@ -118,3 +120,17 @@ say implicit execute is automatically enabled say relative location is automatically enabled say ABCABCABCABCABC ``` + +`@function demo:abc` + +```mcfunction +say foo +say bar +``` + +`@function demo:xyz` + +```mcfunction +say foo +say bar +``` diff --git a/packages/mecha/tests/snapshots/scripting__parse_136__0.txt b/packages/mecha/tests/snapshots/scripting__parse_136__0.txt new file mode 100644 index 000000000..728253155 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_136__0.txt @@ -0,0 +1,212 @@ +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6]: + say foo + say bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=8) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + variable: 'a' + arguments: + + + location: SourceLocation(pos=66, lineno=3, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=69, lineno=3, colno=8) + end_location: SourceLocation(pos=71, lineno=3, colno=10) + variable: 's' + arguments: + + + location: SourceLocation(pos=122, lineno=4, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=131, lineno=4, colno=14) + end_location: SourceLocation(pos=135, lineno=4, colno=18) + value: 'eyes' + + location: SourceLocation(pos=185, lineno=5, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:facing:pos:subcommand' + arguments: + + location: SourceLocation(pos=192, lineno=5, colno=12) + end_location: SourceLocation(pos=197, lineno=5, colno=17) + x: + + location: SourceLocation(pos=192, lineno=5, colno=12) + end_location: SourceLocation(pos=193, lineno=5, colno=13) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=194, lineno=5, colno=14) + end_location: SourceLocation(pos=195, lineno=5, colno=15) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=196, lineno=5, colno=16) + end_location: SourceLocation(pos=197, lineno=5, colno=17) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=249, lineno=6, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=258, lineno=6, colno=14) + end_location: SourceLocation(pos=262, lineno=6, colno=18) + value: 'feet' + + location: SourceLocation(pos=306, lineno=7, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=317, lineno=7, colno=16) + end_location: SourceLocation(pos=323, lineno=7, colno=22) + x: + + location: SourceLocation(pos=317, lineno=7, colno=16) + end_location: SourceLocation(pos=318, lineno=7, colno=17) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=319, lineno=7, colno=18) + end_location: SourceLocation(pos=320, lineno=7, colno=19) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=321, lineno=7, colno=20) + end_location: SourceLocation(pos=323, lineno=7, colno=22) + type: 'local' + value: 1 + + location: SourceLocation(pos=369, lineno=8, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:rotated:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=380, lineno=8, colno=16) + end_location: SourceLocation(pos=382, lineno=8, colno=18) + variable: 's' + arguments: + + + location: SourceLocation(pos=492, lineno=10, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=503, lineno=10, colno=16) + end_location: SourceLocation(pos=510, lineno=10, colno=23) + x: + + location: SourceLocation(pos=503, lineno=10, colno=16) + end_location: SourceLocation(pos=504, lineno=10, colno=17) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=505, lineno=10, colno=18) + end_location: SourceLocation(pos=506, lineno=10, colno=19) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=507, lineno=10, colno=20) + end_location: SourceLocation(pos=510, lineno=10, colno=23) + type: 'local' + value: -1 + + location: SourceLocation(pos=552, lineno=11, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=562, lineno=11, colno=15) + end_location: SourceLocation(pos=580, lineno=11, colno=33) + variable: 's' + arguments: + + location: SourceLocation(pos=565, lineno=11, colno=18) + end_location: SourceLocation(pos=579, lineno=11, colno=32) + inverted: False + key: + + location: SourceLocation(pos=565, lineno=11, colno=18) + end_location: SourceLocation(pos=573, lineno=11, colno=26) + value: 'distance' + value: + + location: SourceLocation(pos=574, lineno=11, colno=27) + end_location: SourceLocation(pos=579, lineno=11, colno=32) + min: None + max: 0.6 + + location: SourceLocation(pos=590, lineno=12, colno=9) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=590, lineno=12, colno=9) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=590, lineno=12, colno=9) + end_location: SourceLocation(pos=597, lineno=12, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=594, lineno=12, colno=13) + end_location: SourceLocation(pos=597, lineno=12, colno=16) + fragments: + + location: SourceLocation(pos=594, lineno=12, colno=13) + end_location: SourceLocation(pos=597, lineno=12, colno=16) + value: 'foo' + + location: SourceLocation(pos=606, lineno=13, colno=9) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=610, lineno=13, colno=13) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + fragments: + + location: SourceLocation(pos=610, lineno=13, colno=13) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + value: 'bar' diff --git a/packages/mecha/tests/snapshots/scripting__parse_136__1.txt b/packages/mecha/tests/snapshots/scripting__parse_136__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_136__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/mecha/tests/snapshots/scripting__parse_137__0.txt b/packages/mecha/tests/snapshots/scripting__parse_137__0.txt new file mode 100644 index 000000000..6ddecb2a5 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_137__0.txt @@ -0,0 +1,65 @@ +say foo + bar +execute + as @a + run say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'foo' + + location: SourceLocation(pos=11, lineno=2, colno=4) + end_location: SourceLocation(pos=12, lineno=2, colno=5) + value: ' ' + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + value: 'bar' + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=31, lineno=4, colno=8) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + variable: 'a' + arguments: + + + location: SourceLocation(pos=38, lineno=5, colno=5) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=42, lineno=5, colno=9) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=46, lineno=5, colno=13) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=46, lineno=5, colno=13) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + value: 'hello' diff --git a/packages/mecha/tests/snapshots/scripting__parse_137__1.txt b/packages/mecha/tests/snapshots/scripting__parse_137__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/mecha/tests/snapshots/scripting__parse_137__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- From f400540ea0194be809189445fe76b273c7f5b157 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 16 Dec 2021 17:40:05 +0000 Subject: [PATCH 0557/1554] 0.22.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 81d03b978..66208ee8a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.22.0 (2021-12-16) +### Feature +* Add python colon ([`14fa47b`](https://github.com/mcbeet/mecha/commit/14fa47b9a7a3f2f6eaa88b6927116292f0480b8d)) + ## v0.21.0 (2021-12-14) ### Feature * Lower elif statements ([`c49122f`](https://github.com/mcbeet/mecha/commit/c49122fe4aa37f042d81c66e6572b3206efe62c5)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d2e00b18d..7518897f5 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.21.0" +__version__ = "0.22.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 69265a369..0ec97f798 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.21.0" +version = "0.22.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From cc0471146e74ee088284ee9a40d034690cd23c9a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Dec 2021 19:15:57 +0100 Subject: [PATCH 0558/1554] fix: default to 1.18 --- packages/mecha/mecha/api.py | 4 ++-- packages/mecha/mecha/cli.py | 2 +- packages/mecha/mecha/parse.py | 2 +- packages/mecha/mecha/spec.py | 2 +- packages/mecha/tests/conftest.py | 6 +++--- .../mecha/tests/snapshots/scripting__parse_48__0.txt | 2 +- .../mecha/tests/snapshots/scripting__parse_99__0.txt | 2 +- .../mecha/tests/snapshots/spec__prototypes__0.json | 2 ++ packages/mecha/tests/test_parse.py | 12 +++++------- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 7e8f563ed..801fb5dc4 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -85,7 +85,7 @@ def dump(self, node: AstRoot, f: BufferedWriter): class MechaOptions(BaseModel): """Mecha options.""" - version: VersionNumber = "1.17" + version: VersionNumber = "1.18" multiline: bool = False keep_comments: bool = False readonly: Optional[bool] = None @@ -98,7 +98,7 @@ class Mecha: """Class exposing the command api.""" ctx: InitVar[Optional[Context]] = None - version: InitVar[VersionNumber] = "1.17" + version: InitVar[VersionNumber] = "1.18" multiline: InitVar[bool] = False keep_comments: InitVar[bool] = False readonly: bool = False diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py index ac087b380..ad727e4bc 100644 --- a/packages/mecha/mecha/cli.py +++ b/packages/mecha/mecha/cli.py @@ -43,7 +43,7 @@ def validate(ctx: Context): "-m", "--minecraft", metavar="VERSION", - default="1.17", + default="1.18", help="Minecraft version.", ) @click.option( diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index fb40f2ad0..82463851f 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -431,7 +431,7 @@ def get_default_parsers() -> Dict[str, Parser]: } -def get_parsers(version: VersionNumber = "1.17") -> Dict[str, Parser]: +def get_parsers(version: VersionNumber = "1.18") -> Dict[str, Parser]: """Return parsers for a specific version.""" version = split_version(version) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 2e917c9bd..0ea4b1d6d 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -28,7 +28,7 @@ class CommandSpec: multiline: bool = False tree: CommandTree = extra_field( - default_factory=lambda: CommandTree.load_from(version="1.17") + default_factory=lambda: CommandTree.load_from(version="1.18") ) prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) diff --git a/packages/mecha/tests/conftest.py b/packages/mecha/tests/conftest.py index 720d1e492..327ddd9eb 100644 --- a/packages/mecha/tests/conftest.py +++ b/packages/mecha/tests/conftest.py @@ -9,11 +9,11 @@ def mc(): @pytest.fixture -def mc_1_18(mc: Mecha): +def mc_1_17(mc: Mecha): previous_spec = mc.spec mc.spec = CommandSpec( - tree=CommandTree.load_from(version="1.18"), - parsers=get_parsers("1.18"), + tree=CommandTree.load_from(version="1.17"), + parsers=get_parsers("1.17"), ) yield mc diff --git a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt index 688d53d30..6797cba30 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_48__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'advancement', literal 'align' or 100 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'advancement', literal 'align' or 101 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt index dc98f2df6..2ae18cbef 100644 --- a/packages/mecha/tests/snapshots/scripting__parse_99__0.txt +++ b/packages/mecha/tests/snapshots/scripting__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'as', literal 'at' or 82 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'as', literal 'at' or 83 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json index 55582d157..3c59a775c 100644 --- a/packages/mecha/tests/snapshots/spec__prototypes__0.json +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -762,6 +762,8 @@ "worldborder:get", "worldborder:warning:distance:distance", "worldborder:warning:time:time", + "jfr:start", + "jfr:stop", "ban-ip:target", "ban-ip:target:reason", "banlist", diff --git a/packages/mecha/tests/test_parse.py b/packages/mecha/tests/test_parse.py index e3b673fe1..b12e8f264 100644 --- a/packages/mecha/tests/test_parse.py +++ b/packages/mecha/tests/test_parse.py @@ -108,9 +108,9 @@ def test_say(snapshot: SnapshotFixture, mc: Mecha): assert snapshot() == mc.serialize(ast_multiline) -def test_player_name(mc: Mecha): +def test_player_name(mc_1_17: Mecha): with pytest.raises(DiagnosticError) as exc_info: - mc.parse( + mc_1_17.parse( "scoreboard players set some_really_long_name_right_here_but_its_actually_even_longer foo 42" ) assert ( @@ -119,12 +119,10 @@ def test_player_name(mc: Mecha): ) -def test_player_name_no_length_restriction(mc_1_18: Mecha): +def test_player_name_no_length_restriction(mc: Mecha): assert ( - mc_1_18.serialize( - mc_1_18.parse( - "scoreboard players set some_really_long_name_right_here foo 42" - ) + mc.serialize( + mc.parse("scoreboard players set some_really_long_name_right_here foo 42") ) == "scoreboard players set some_really_long_name_right_here foo 42\n" ) From e00f92e46de253e2f90b487d63d711b804a66684 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 16 Dec 2021 18:20:48 +0000 Subject: [PATCH 0559/1554] 0.22.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 66208ee8a..f5dcde59a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.22.1 (2021-12-16) +### Fix +* Default to 1.18 ([`4362542`](https://github.com/mcbeet/mecha/commit/4362542f116c9cdab318d248293743025e08027e)) + ## v0.22.0 (2021-12-16) ### Feature * Add python colon ([`14fa47b`](https://github.com/mcbeet/mecha/commit/14fa47b9a7a3f2f6eaa88b6927116292f0480b8d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 7518897f5..8b4cc8f95 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.22.0" +__version__ = "0.22.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0ec97f798..1f4a123f7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.22.0" +version = "0.22.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From c837716581d245982f4e9d2a6592cd8472e40d1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:19:54 +0000 Subject: [PATCH 0560/1554] chore(deps-dev): bump pyright from 1.1.193 to 1.1.196 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.193 to 1.1.196. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.196/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 70ad98ad8..99f80abae 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.193" + "pyright": "^1.1.196" } }, "node_modules/pyright": { - "version": "1.1.193", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.193.tgz", - "integrity": "sha512-01hkfhK1PYKPSWbJrYgNwwlsVH+Thp1xmkKZjxVZrGFqavkJbhETlg1RcAHMnmU8Sg7G4Ry99dW6IsSGyCdzXg==", + "version": "1.1.196", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.196.tgz", + "integrity": "sha512-63LF3JNElRU9wkCLgJLk8NMi4tJ/aB97itckp19zb4g8wXmlc90nyvA5bUk19ey10R4yAmlp8ol8Tz/mxAUmGQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.193", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.193.tgz", - "integrity": "sha512-01hkfhK1PYKPSWbJrYgNwwlsVH+Thp1xmkKZjxVZrGFqavkJbhETlg1RcAHMnmU8Sg7G4Ry99dW6IsSGyCdzXg==", + "version": "1.1.196", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.196.tgz", + "integrity": "sha512-63LF3JNElRU9wkCLgJLk8NMi4tJ/aB97itckp19zb4g8wXmlc90nyvA5bUk19ey10R4yAmlp8ol8Tz/mxAUmGQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 8774c9e3e..997c3e3cf 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.193" + "pyright": "^1.1.196" } } From 376f2700200124a3e18607786d9bcd612e62922c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Dec 2021 19:22:32 +0100 Subject: [PATCH 0561/1554] chore: update beet --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- .../tests/snapshots/examples__build_basic__0.pack.md | 2 +- .../examples__build_basic_implicit_execute__0.pack.md | 2 +- .../examples__build_basic_keep_comments__0.pack.md | 2 +- .../tests/snapshots/examples__build_basic_lint__0.pack.md | 2 +- .../snapshots/examples__build_basic_messages__0.pack.md | 2 +- .../snapshots/examples__build_basic_multiline__0.pack.md | 2 +- .../snapshots/examples__build_basic_nesting__0.pack.md | 2 +- .../snapshots/examples__build_basic_readonly__0.pack.md | 2 +- .../examples__build_basic_relative_location__0.pack.md | 2 +- .../snapshots/examples__build_basic_scripting__0.pack.md | 2 +- .../snapshots/examples__build_custom_command__0.pack.md | 2 +- .../examples__build_gather_objectives__0.pack.md | 2 +- .../snapshots/examples__build_kitchen_sink__0.pack.md | 2 +- 15 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 2ba3240ea..d785a9d1c 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -33,7 +33,7 @@ tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)" [[package]] name = "beet" -version = "0.48.0" +version = "0.48.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -799,7 +799,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "182de919bf2f14bafc3b730a0fb03b4a5a3607e8127ca7f35082d319510e14cc" +content-hash = "69c8cf6e00c25f3060e1e3dbdd9a4e4c915e8c32339966331b40b85c3a2a815a" [metadata.files] atomicwrites = [ @@ -815,8 +815,8 @@ base58 = [ {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, ] beet = [ - {file = "beet-0.48.0-py3-none-any.whl", hash = "sha256:bd06a4c3d28f9278f20e901fdbf2db9f0ed35cc5f5d185ffc4319b9990fbc6e2"}, - {file = "beet-0.48.0.tar.gz", hash = "sha256:75cbae315f9c7e3c642281a6c061feed2f0af63a174b9c4a22b1727eb9f55b28"}, + {file = "beet-0.48.2-py3-none-any.whl", hash = "sha256:7a631dafbebdc5f5be1171bfbee374919436714e9676b55929313ea440eed6cb"}, + {file = "beet-0.48.2.tar.gz", hash = "sha256:f9c0b40597c23db8ac800f0bda967d5fede1463acce09e14d605dda8d10494bc"}, ] black = [ {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1f4a123f7..7714edc01 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.48.0" +beet = ">=0.48.2" tokenstream = "^1.3.1" [tool.poetry.dev-dependencies] diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md index 51fbf35bd..e9cf30933 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md index 6e3f71756..b770799d6 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md index 0d459a5c6..eef7662fd 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_keep_comments__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index 2fb0190c9..718797887 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md index 41a66a04d..7c53d4b51 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md index f5ec1a6d1..d1aa431fd 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index 202a8e096..833ac4d39 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md index 7a4cbd277..12f60b685 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md index 591e06d7a..a4fd31254 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md index 8bad862d0..afde40005 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_scripting__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md index 737c63a99..bd112c17e 100644 --- a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md index 3db227732..50d06a7f7 100644 --- a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 2f18c172b..1c9134431 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 7, + "pack_format": 8, "description": "" } } From 7a0f93df1e8ae9fc7b4442c698396a47da6134d6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Dec 2021 19:52:07 +0100 Subject: [PATCH 0562/1554] fix: only call nestde functions behind execute --- packages/mecha/mecha/contrib/nesting.py | 49 ++++++++++++++----- .../examples__build_basic_nesting__0.pack.md | 17 +++---- .../examples__build_kitchen_sink__0.pack.md | 13 +++-- 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 927ff926d..a7a15dbf6 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -134,23 +134,34 @@ def emit_function(self, path: str, root: AstRoot): ) self.database.enqueue(function, self.database.step + 1) - @rule(AstCommand, identifier="function:name:commands") - def nested_function(self, node: AstCommand): - name, root = node.arguments + @rule(AstCommand, identifier="execute:run:subcommand") + def execute_function(self, node: AstCommand): + if ( + isinstance(command := node.arguments[0], AstCommand) + and command.identifier == "function:name:commands" + ): + name, root = command.arguments - if isinstance(name, AstResourceLocation) and isinstance(root, AstRoot): - path = name.get_canonical_value() + if isinstance(name, AstResourceLocation) and isinstance(root, AstRoot): + path = name.get_canonical_value() - if path in self.ctx.data.functions: - d = Diagnostic("error", f"Function {path!r} already exists.") - raise set_location(d, name) + if path in self.ctx.data.functions: + d = Diagnostic("error", f"Function {path!r} already exists.") + raise set_location(d, name) - self.emit_function(path, root) + self.emit_function(path, root) + + command = replace( + command, + identifier="function:name", + arguments=AstChildren([name]), + ) + return replace(node, arguments=AstChildren([command])) - return replace(node, identifier="function:name", arguments=AstChildren([name])) + return node @rule(AstCommand, identifier="execute:commands") - def nested_execute(self, node: AstCommand): + def execute_commands(self, node: AstCommand): generate = self.ctx.generate["nested_execute"] root = cast(AstRoot, node.arguments[0]) @@ -181,11 +192,25 @@ def nested_execute(self, node: AstCommand): ) @rule(AstRoot) - def execute_expand(self, node: AstRoot): + def root(self, node: AstRoot): changed = False commands: List[AstCommand] = [] for command in node.commands: + if command.identifier == "function:name:commands": + name, root = command.arguments + + if isinstance(name, AstResourceLocation) and isinstance(root, AstRoot): + path = name.get_canonical_value() + + if path in self.ctx.data.functions: + d = Diagnostic("error", f"Function {path!r} already exists.") + raise set_location(d, name) + print("emit", path) + self.emit_function(path, root) + changed = True + continue + args = command.arguments stack: List[AstCommand] = [command] diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index 833ac4d39..ac5858c56 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -18,7 +18,6 @@ `@function demo:foo` ```mcfunction -function demo:thing1 execute as @a at @s run function demo:thing4 execute as @a at @s run function demo:thing5 execute as @a at @s run function demo:foo/nested_execute_0 @@ -45,15 +44,6 @@ say this is a test say this is a test ``` -`@function demo:thing1` - -```mcfunction -say hello -say world -function demo:thing2 -function demo:thing3 -``` - `@function demo:thing4` ```mcfunction @@ -92,3 +82,10 @@ setblock ~ ~-2 ~ stone say foo say bar ``` + +`@function demo:thing1` + +```mcfunction +say hello +say world +``` diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 1c9134431..1ee11bb4b 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -34,7 +34,6 @@ data modify storage imp:io words set value ["alpha", "beta", "gamma", "delta"] ```mcfunction execute as @a at @s run function demo:nesting/nested_execute_0 execute as @a at @s if score @s tmp matches 1 run function demo:nesting/nested_execute_1 -function demo:nesting/foo execute as @a at @s run say 1 execute as @a at @s run say 2 execute as @a at @s if score @s tmp matches 1 run say 1 @@ -58,12 +57,6 @@ say hello say world ``` -`@function demo:nesting/foo` - -```mcfunction -say this is a test -``` - `@function demo:nesting/loop` ```mcfunction @@ -77,3 +70,9 @@ execute if data storage imp:temp iter.words.remaining[] run function demo:nestin execute at @e[type=pig] run setblock ~ ~ ~ stone execute at @e[type=sheep] run setblock ~ ~ ~ dirt ``` + +`@function demo:nesting/foo` + +```mcfunction +say this is a test +``` From 6ce37f2b542fd360294a320add8df48511e1cb87 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Dec 2021 20:10:11 +0100 Subject: [PATCH 0563/1554] feat: add nesting for schedule command --- .../src/data/demo/functions/foo.mcfunction | 9 +++ packages/mecha/mecha/contrib/nesting.py | 73 ++++++++++++++++++- .../examples__build_basic_nesting__0.pack.md | 21 ++++++ packages/mecha/tests/test_compile.py | 2 - 4 files changed, 102 insertions(+), 3 deletions(-) diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction index 6af083def..8ac832b10 100644 --- a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -92,3 +92,12 @@ execute expand: say oh wow say this is duplicated + +schedule function demo:schedule1 42t: + say hello1 + +execute if score global tmp matches 7 run schedule function demo:schedule2 42t append: + say hello2 + +schedule function demo:schedule3 42t replace: + say hello3 diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index a7a15dbf6..1471d6e30 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -52,6 +52,53 @@ }, }, }, + "schedule": { + "type": "literal", + "children": { + "function": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "minecraft:function", + "children": { + "time": { + "type": "argument", + "parser": "minecraft:time", + "children": { + "append": { + "type": "literal", + "children": { + "commands": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + }, + }, + }, + "replace": { + "type": "literal", + "children": { + "commands": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + }, + }, + }, + "commands": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": True, + }, + }, + } + }, + } + }, + }, + }, + }, "function": { "type": "literal", "children": { @@ -191,6 +238,30 @@ def execute_commands(self, node: AstCommand): arguments=AstChildren([cast(AstNode, subcommand)]), ) + @rule(AstCommand, identifier="schedule:function:function:time:commands") + @rule(AstCommand, identifier="schedule:function:function:time:append:commands") + @rule(AstCommand, identifier="schedule:function:function:time:replace:commands") + def schedule_function(self, node: AstCommand): + name = node.arguments[0] + root = node.arguments[-1] + + if isinstance(name, AstResourceLocation) and isinstance(root, AstRoot): + path = name.get_canonical_value() + + if path in self.ctx.data.functions: + d = Diagnostic("error", f"Function {path!r} already exists.") + raise set_location(d, name) + + self.emit_function(path, root) + + return replace( + node, + identifier=node.identifier[:-9], + arguments=AstChildren(node.arguments[:-1]), + ) + + return node + @rule(AstRoot) def root(self, node: AstRoot): changed = False @@ -206,7 +277,7 @@ def root(self, node: AstRoot): if path in self.ctx.data.functions: d = Diagnostic("error", f"Function {path!r} already exists.") raise set_location(d, name) - print("emit", path) + self.emit_function(path, root) changed = True continue diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index ac5858c56..b56cd1b01 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -30,6 +30,9 @@ execute as @a run say hello execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say I'm facing the target! execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say oh wow execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run say this is duplicated +schedule function demo:schedule1 42 +execute if score global tmp matches 7 run schedule function demo:schedule2 42 append +schedule function demo:schedule3 42 replace ``` `@function demo:thing2` @@ -83,6 +86,24 @@ say foo say bar ``` +`@function demo:schedule1` + +```mcfunction +say hello1 +``` + +`@function demo:schedule2` + +```mcfunction +say hello2 +``` + +`@function demo:schedule3` + +```mcfunction +say hello3 +``` + `@function demo:thing1` ```mcfunction diff --git a/packages/mecha/tests/test_compile.py b/packages/mecha/tests/test_compile.py index 84509ee58..e937a5126 100644 --- a/packages/mecha/tests/test_compile.py +++ b/packages/mecha/tests/test_compile.py @@ -21,7 +21,6 @@ @rule(AstCommand, identifier="say:message") def convert_say_to_tellraw(node: AstCommand): - print(node) if isinstance(message := node.arguments[0], AstMessage): return replace( node, @@ -43,7 +42,6 @@ def convert_say_to_tellraw(node: AstCommand): @pytest.fixture def dummy_transform(mc: Mecha): - print("plz") mc.transform.extend(convert_say_to_tellraw) yield mc.transform.reset() From d934422516f2bd1782cb5918d454adf27aec989a Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 16 Dec 2021 19:11:02 +0000 Subject: [PATCH 0564/1554] 0.23.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f5dcde59a..416516261 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.23.0 (2021-12-16) +### Feature +* Add nesting for schedule command ([`eeb15f6`](https://github.com/mcbeet/mecha/commit/eeb15f6c007f69e8323fabfc768bc30e80d8150c)) + +### Fix +* Only call nestde functions behind execute ([`0096cce`](https://github.com/mcbeet/mecha/commit/0096cce671b34cfa5a4774d4ae9e4ce2d92f2dff)) + ## v0.22.1 (2021-12-16) ### Fix * Default to 1.18 ([`4362542`](https://github.com/mcbeet/mecha/commit/4362542f116c9cdab318d248293743025e08027e)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 8b4cc8f95..50ba2b4e2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.22.1" +__version__ = "0.23.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 7714edc01..c4ce19f9d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.22.1" +version = "0.23.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5be48d5835680d7818da6fb27660ca8e5d4b6ea5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Dec 2021 04:15:28 +0100 Subject: [PATCH 0565/1554] feat: add mecha.contrib.statistics and --stats option --- packages/mecha/README.md | 39 +- packages/mecha/examples/basic_stats/beet.yml | 7 + packages/mecha/examples/basic_stats/demo.py | 12 + .../src/data/demo/functions/foo.mcfunction | 4 + packages/mecha/mecha/cli.py | 12 +- packages/mecha/mecha/contrib/statistics.py | 345 ++++++++++++++++++ packages/mecha/mecha/prototype.py | 6 + .../tests/resources/SmithedCore-DP-0.0.1.zip | Bin 0 -> 86588 bytes .../examples__build_basic_stats__0.pack.md | 52 +++ .../snapshots/stats__smithed_core__0.txt | 163 +++++++++ packages/mecha/tests/test_stats.py | 19 + 11 files changed, 656 insertions(+), 3 deletions(-) create mode 100644 packages/mecha/examples/basic_stats/beet.yml create mode 100644 packages/mecha/examples/basic_stats/demo.py create mode 100644 packages/mecha/examples/basic_stats/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/statistics.py create mode 100644 packages/mecha/tests/resources/SmithedCore-DP-0.0.1.zip create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md create mode 100644 packages/mecha/tests/snapshots/stats__smithed_core__0.txt create mode 100644 packages/mecha/tests/test_stats.py diff --git a/packages/mecha/README.md b/packages/mecha/README.md index c030a0f83..379830ffb 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -47,7 +47,9 @@ This package provides everything you need for working with Minecraft commands in - Command config resolver that flattens and enumerates all the valid command prototypes - Powerful rule dispatcher for processing specific ast nodes - Composable ast visitors and reducers -- Comes with useful syntactic extensions like nesting and implicit execute +- Comes with useful syntactic extensions like relative locations, nesting and implicit execute +- Compile-time scripting with a subset of python integrated into command syntax +- Rich function analyzer for keeping track of command statistics - Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python @@ -77,6 +79,7 @@ Usage: mecha [OPTIONS] [SOURCE]... Options: -m, --minecraft VERSION Minecraft version. -l, --log LEVEL Configure output verbosity. + -s, --stats Collect statistics. -v, --version Show the version and exit. -h, --help Show this message and exit. ``` @@ -85,7 +88,7 @@ You can use the command-line utility to check data packs and function files for ```bash $ mecha path/to/my_data_pack -Validating with mecha v0.13.0 +Validating with mecha vX.X.X ERROR | mecha Expected curly '}' but got bracket ']'. | path/to/my_data_pack/data/demo/functions/foo.mcfunction:5:34 @@ -96,6 +99,38 @@ ERROR | mecha Expected curly '}' but got bracket ']'. Error: Reported 1 error. ``` +The `--stats` option will output a report that shows how many commands, selectors and scoreboards were used. + +``` +INFO | stats Analyzed 1 function + | ------------------------------------------------------------------------------- + | Total commands (1 behind execute) | 4 + | ------------------------------------------------------------------------------- + | /scoreboard | 3 + | objectives add | 1 + | players set | 1 + | players operation matches ... | 1 + | as | 1 + | run | 1 + | ------------------------------------------------------------------------------- + | Total selectors | 3 + | ------------------------------------------------------------------------------- + | @e | 2 + | [tag] | 2 + | [scores] | 1 + | @s | 1 + | @e with missing or inverted type | 2 + | ------------------------------------------------------------------------------- + | Scoreboard objectives | 2 + | ------------------------------------------------------------------------------- + | my_consts (dummy) | 3 + | 10 | 2 + | foo | 3 +``` + ## Github action You can use `mecha` to check your data packs and function files for errors without having to install anything using the [`mcbeet/check-commands`](https://github.com/mcbeet/check-commands) github action. diff --git a/packages/mecha/examples/basic_stats/beet.yml b/packages/mecha/examples/basic_stats/beet.yml new file mode 100644 index 000000000..1f22f91ba --- /dev/null +++ b/packages/mecha/examples/basic_stats/beet.yml @@ -0,0 +1,7 @@ +require: + - mecha.contrib.statistics +data_pack: + load: [src] +pipeline: + - mecha + - demo diff --git a/packages/mecha/examples/basic_stats/demo.py b/packages/mecha/examples/basic_stats/demo.py new file mode 100644 index 000000000..2a48ee8c3 --- /dev/null +++ b/packages/mecha/examples/basic_stats/demo.py @@ -0,0 +1,12 @@ +from beet import Context + +from mecha import Mecha +from mecha.contrib.statistics import Analyzer, Summary + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + analyzer = ctx.inject(Analyzer) + summary = Summary(mc.spec, analyzer.stats) + header = [f"# {line}" for line in str(summary).splitlines()] + ctx.data.functions["demo:foo"].prepend(header) diff --git a/packages/mecha/examples/basic_stats/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_stats/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..c5fd38dd7 --- /dev/null +++ b/packages/mecha/examples/basic_stats/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,4 @@ +scoreboard objectives add my_consts dummy +scoreboard players set 10 my_consts 10 +scoreboard players operation @e[tag=hello,scores={foo=1..}] foo += 10 my_consts +execute if score @s foo matches 20.. as @e[tag=hello] run setblock ~ ~ ~ stone diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py index ad727e4bc..3f40971e9 100644 --- a/packages/mecha/mecha/cli.py +++ b/packages/mecha/mecha/cli.py @@ -57,6 +57,12 @@ def validate(ctx: Context): default="WARNING", help="Configure output verbosity.", ) +@click.option( + "-s", + "--stats", + is_flag=True, + help="Collect statistics.", +) @click.version_option( __version__, "-v", @@ -65,13 +71,17 @@ def validate(ctx: Context): + click.style(" v%(version)s", fg="green"), ) @error_handler(should_exit=True) -def mecha(source: Tuple[str, ...], minecraft: str, log: str): +def mecha(source: Tuple[str, ...], minecraft: str, log: str, stats: bool): """Validate data packs and .mcfunction files.""" + if stats and log != "DEBUG": + log = "INFO" + logger = logging.getLogger() logger.setLevel(log) logger.addHandler(LogHandler()) config = { + "require": stats * ["mecha.contrib.statistics"], "pipeline": ["mecha.cli.validate"], "meta": { "source": source, diff --git a/packages/mecha/mecha/contrib/statistics.py b/packages/mecha/mecha/contrib/statistics.py new file mode 100644 index 000000000..d92eff4b4 --- /dev/null +++ b/packages/mecha/mecha/contrib/statistics.py @@ -0,0 +1,345 @@ +"""Plugin that gathers statistics.""" + + +__all__ = [ + "Analyzer", + "Summary", + "Statistics", +] + + +import logging +from collections import defaultdict +from dataclasses import dataclass +from typing import DefaultDict, Dict, Iterator, List, Tuple, Union + +from beet import Context +from pydantic import BaseModel + +from mecha import ( + AstCommand, + AstObjective, + AstObjectiveCriteria, + AstPlayerName, + AstResourceLocation, + AstRoot, + AstSelector, + AstWord, + CommandSpec, + Mecha, + Reducer, + rule, +) + +logger = logging.getLogger("stats") + + +class Statistics(BaseModel): + """Class holding all the stats gathered from the analysis.""" + + function_count: int = 0 + command_count: DefaultDict[str, DefaultDict[str, int]] = defaultdict( + lambda: defaultdict(int) + ) + command_behind_execute_count: DefaultDict[str, int] = defaultdict(int) + execute_count: int = 0 + execute_clause_count: DefaultDict[str, int] = defaultdict(int) + selector_count: DefaultDict[str, int] = defaultdict(int) + selector_entity_type_count: DefaultDict[str, int] = defaultdict(int) + selector_argument_count: DefaultDict[str, DefaultDict[str, int]] = defaultdict( + lambda: defaultdict(int) + ) + scoreboard_references: DefaultDict[str, int] = defaultdict(int) + scoreboard_fake_player_references: DefaultDict[ + str, DefaultDict[str, int] + ] = defaultdict(lambda: defaultdict(int)) + scoreboard_objectives: Dict[str, str] = {} + + +def beet_default(ctx: Context): + ctx.inject(Analyzer) + + +class Analyzer(Reducer): + """Service that collects command statistics.""" + + stats: Statistics + + def __init__(self, ctx: Union[Context, Mecha, None] = None): + super().__init__() + + if isinstance(ctx, Context): + ctx.require(self.finalize) + mc = ctx.inject(Mecha) + else: + mc = ctx + + if mc: + mc.check.extend(self) + + self.stats = Statistics() + + def finalize(self, ctx: Context): + mc = ctx.inject(Mecha) + yield + logger.info(str(Summary(mc.spec, self.stats))) + + @rule(AstRoot) + def root(self, node: AstRoot): + self.stats.function_count += 1 + + for command in node.commands: + behind_execute = False + + while command.identifier.startswith("execute"): + behind_execute = True + if command.identifier == "execute:subcommand": + self.stats.execute_count += 1 + else: + self.stats.execute_clause_count[command.identifier] += 1 + if isinstance(subcommand := command.arguments[-1], AstCommand): + command = subcommand + + name = command.identifier.partition(":")[0] + self.stats.command_count[name][command.identifier] += 1 + + if behind_execute: + self.stats.command_behind_execute_count[name] += 1 + + @rule(AstSelector) + def selector(self, node: AstSelector): + self.stats.selector_count[node.variable] += 1 + + for argument in node.arguments: + if ( + node.variable == "e" + and argument.key.value == "type" + and not argument.inverted + and isinstance(entity_type := argument.value, AstResourceLocation) + ): + key = entity_type.get_canonical_value() + self.stats.selector_entity_type_count[key] += 1 + self.stats.selector_argument_count[node.variable][argument.key.value] += 1 + + @rule(AstObjective) + def objective(self, node: AstObjective): + self.stats.scoreboard_references[node.value] += 1 + + @rule(AstCommand) + def command(self, node: AstCommand): + if ( + node.identifier.startswith("scoreboard:objectives:add:objective:criteria") + and isinstance(objective := node.arguments[0], AstWord) + and isinstance(criteria := node.arguments[1], AstObjectiveCriteria) + ): + self.stats.scoreboard_references[objective.value] += 1 + self.stats.scoreboard_objectives[objective.value] = criteria.value + + ref = None + + for argument in node.arguments: + if isinstance(argument, AstPlayerName): + ref = argument.value + elif ref and isinstance(argument, AstObjective): + objective = argument.value + self.stats.scoreboard_fake_player_references[objective][ref] += 1 + ref = None + + +@dataclass +class Summary: + """Formatted statistics summary.""" + + spec: CommandSpec + stats: Statistics + + indent: str = " " * 7 + + def __str__(self) -> str: + return "\n".join(self.format()) + + def format(self) -> Iterator[str]: + plural = "s" * (self.stats.function_count > 1) + yield f"Analyzed {self.stats.function_count} function{plural}" + results = { + **self.format_commands(), + **self.format_selectors(), + **self.format_scoreboard(), + } + yield from self.format_table(results) + + def format_commands(self) -> Dict[Tuple[str, ...], List[Tuple[str, ...]]]: + command_stats = { + ( + f"/{prefix}", + sum(stats.values()), + self.stats.command_behind_execute_count[prefix], + ): [ + ( + f" {' ' * len(prefix)}{self.spec.prototypes[identifier].usage()[len(prefix):]}", + count, + 0, + ) + for identifier, count in stats.items() + ] + for prefix, stats in self.stats.command_count.items() + } + + if self.stats.execute_count: + command_stats[f"/execute", self.stats.execute_count, 0] = [ + ( + f" {self.spec.prototypes[clause].usage()}", + count, + 0, + ) + for clause, count in sorted( + self.stats.execute_clause_count.items(), key=lambda p: -p[1] + ) + ] + + total_commands = sum(total for _, total, _ in command_stats) + total_commands_behind_execute = sum(total for _, _, total in command_stats) + total_commands -= total_commands_behind_execute + + return { + ( + f"Total commands ({total_commands_behind_execute} behind execute)" + if total_commands_behind_execute + else "Total commands", + str(total_commands), + ): [ + ( + f"{label} ({behind_execute} behind execute)" + if behind_execute + else label, + str(count), + ) + for command, stats in sorted( + command_stats.items(), key=lambda p: -p[0][1] + ) + for label, count, behind_execute in [command] + + (list(sorted(stats, key=lambda p: -p[1])) if len(stats) > 1 else []) + ], + } + + def format_selectors(self) -> Dict[Tuple[str, ...], List[Tuple[str, ...]]]: + selector_types = [ + (f" [type={entity_type}]", entity_type_count) + for entity_type, entity_type_count in self.stats.selector_entity_type_count.items() + ] + + total_selector_types = sum(self.stats.selector_entity_type_count.values()) + + if total_selector_types: + selector_types.insert(0, ("@e with type", total_selector_types)) + + if no_type_count := (self.stats.selector_count["e"] - total_selector_types): + selector_types.insert( + 0, (f"@e with missing or inverted type", no_type_count) + ) + + selector_args = { + selector: [(f" [{arg}]", arg_count) for arg, arg_count in args.items()] + for selector, args in self.stats.selector_argument_count.items() + } + + return { + ("Total selectors", str(sum(self.stats.selector_count.values()))): [ + row + for selector, count in sorted( + self.stats.selector_count.items(), key=lambda p: -p[1] + ) + if count + for row in [(f"@{selector}", str(count))] + + [ + (arg, str(arg_count)) + for arg, arg_count in sorted( + selector_args.get(selector, []), key=lambda p: -p[1] + ) + ] + ] + + [ + (entity_type, str(entity_type_count)) + for entity_type, entity_type_count in sorted( + selector_types, key=lambda p: -p[1] + ) + ], + } + + def format_scoreboard(self) -> Dict[Tuple[str, ...], List[Tuple[str, ...]]]: + objectives = { + ( + f"{objective} ({criteria})" + if (criteria := self.stats.scoreboard_objectives.get(objective)) + else objective, + count, + ): [ + (f"{' ' * len(objective)} {fake_player}", fake_player_count) + for fake_player, fake_player_count in self.stats.scoreboard_fake_player_references[ + objective + ].items() + ] + for objective, count in self.stats.scoreboard_references.items() + } + + return { + ("Scoreboard objectives", str(len(self.stats.scoreboard_references))): [ + (label, str(count)) + for objective, fake_players in sorted( + objectives.items(), key=lambda p: -p[0][1] + ) + for label, count in [objective] + + list(sorted(fake_players, key=lambda p: -p[1])) + ] + } + + def format_table( + self, + sections: Dict[Tuple[str, ...], List[Tuple[str, ...]]], + ) -> Iterator[str]: + cols = self.compute_column_layout(sections) + + sep = "---".join("-" * col for col in cols) + + for header, rows in sections.items(): + yield sep + yield self.format_row(header, cols, header=True) + yield sep + + for row in rows: + yield self.format_row(row, cols) + + def format_row( + self, + row: Tuple[str, ...], + cols: List[int], + header: bool = False, + ) -> str: + row = ((not header) * self.indent + row[0],) + row[1:] + return " | ".join( + (h.rjust(col) if h.isnumeric() else h.ljust(col)) + if len(h) < col + else h[: col - 3] + "..." + for h, col in zip(row, cols) + ) + + def compute_column_layout( + self, + sections: Dict[Tuple[str, ...], List[Tuple[str, ...]]], + ) -> List[int]: + column_count = max(map(len, sections)) + cols: List[int] = [] + + for i in range(column_count): + header_size = max( + len(header[i]) if len(header) > i else 0 for header in sections + ) + row_size = max( + max(len(row[i]) if len(row) > i else 0 for row in rows) if rows else 0 + for rows in sections.values() + ) + if i == 0: + row_size += len(self.indent) + cols.append(min(max(header_size, row_size) + 5, 70)) + + return cols diff --git a/packages/mecha/mecha/prototype.py b/packages/mecha/mecha/prototype.py index 2b4a7db7c..4f6a4a78b 100644 --- a/packages/mecha/mecha/prototype.py +++ b/packages/mecha/mecha/prototype.py @@ -35,3 +35,9 @@ def get_argument(self, arg: Union[str, int]) -> CommandArgument: raise ValueError(f"No argument {arg!r}.") return self.signature[self.arguments[arg]] # type: ignore + + def usage(self) -> str: + """Return a string showing the command usage.""" + return " ".join( + arg if isinstance(arg, str) else f"<{arg.name}>" for arg in self.signature + ) diff --git a/packages/mecha/tests/resources/SmithedCore-DP-0.0.1.zip b/packages/mecha/tests/resources/SmithedCore-DP-0.0.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f5e772046fdc11294e9153d572571b377738175 GIT binary patch literal 86588 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 YmCpbsS!rk(Xc=gK?gPuWufw | 1 +# players set | 1 +# players operation matches ... | 1 +# as | 1 +# run | 1 +# ------------------------------------------------------------------------------- +# Total selectors | 3 +# ------------------------------------------------------------------------------- +# @e | 2 +# [tag] | 2 +# [scores] | 1 +# @s | 1 +# @e with missing or inverted type | 2 +# ------------------------------------------------------------------------------- +# Scoreboard objectives | 2 +# ------------------------------------------------------------------------------- +# my_consts (dummy) | 3 +# 10 | 2 +# foo | 3 +scoreboard objectives add my_consts dummy +scoreboard players set 10 my_consts 10 +scoreboard players operation @e[tag=hello, scores={foo=1..}] foo += 10 my_consts +execute if score @s foo matches 20.. as @e[tag=hello] run setblock ~ ~ ~ stone +``` diff --git a/packages/mecha/tests/snapshots/stats__smithed_core__0.txt b/packages/mecha/tests/snapshots/stats__smithed_core__0.txt new file mode 100644 index 000000000..7ff60c4ed --- /dev/null +++ b/packages/mecha/tests/snapshots/stats__smithed_core__0.txt @@ -0,0 +1,163 @@ +Analyzed 108 functions +--------------------------------------------------------------------------------- +Total commands (414 behind execute) | 689 +--------------------------------------------------------------------------------- + /execute | 414 + run | 414 + positioned | 183 + if block | 170 + if score matches ... | 117 + if data storage | 87 + store result score | 34 + unless score matches | 14 + unless data storage | 13 + if predicate | 12 + if data entity | 7 + if entity | 6 + store result storage int | 4 + if score >= > | 2 + store success score < float <... | 1 + if score = = ... | 1 + /function (257 behind execute) | 309 + /scoreboard (82 behind execute) | 219 + players set | 105 + players operation | 13 + objectives add | 9 + players get | 6 + players reset | 3 + players add | 3 + /data (34 behind execute) | 75 + get storage | 23 + modify storage set from entity <... | 14 + merge storage | 11 + modify storage merge value | 9 + remove storage | 5 + modify storage set value | 4 + modify storage set from entity <... | 3 + modify storage set from block set from block | 1 + get entity | 1 + modify storage set from storage ... | 1 + /attribute (7 behind execute) | 29 + modifier add <... | 11 + modifier remove | 11 + get | 6 + get | 1 + /item (24 behind execute) | 24 + modify entity | 12 + replace entity with | 12 + /advancement | 10 + /tag (1 behind execute) | 4 + add | 2 + remove | 2 + /schedule | 3 + clear | 1 + function

+ +### text_in_block + +- `@function text_in_block:foo` + +
+ + ```mcfunction + say foo + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md new file mode 100644 index 000000000..31a1904c1 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md @@ -0,0 +1,40 @@ +# Lectern snapshot + +## Data pack + +- `@data_pack pack.mcmeta` + +
+ + ```json + { + "pack": { + "pack_format": 9, + "description": "" + } + } + ``` + +
+ +### evst + +- `@function evst:thing1` + +
+ + ```mcfunction + @function this is invalid + ``` + +
+ +- `@function evst:thing2` + +
+ + ```mcfunction + @function this is invalid + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index b219980b0..4564e477e 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -247,3 +247,15 @@ ``` + +### text_in_block + +- `@function text_in_block:foo` + +
+ + ```mcfunction + say foo + ``` + +
diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index 8eab24cdf..ec8d2877e 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -148,3 +148,6 @@ say foo } ] } + +@function text_in_block:foo +say foo diff --git a/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt new file mode 100644 index 000000000..1de14e754 --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt @@ -0,0 +1,13 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 9, + "description": "" + } +} + +@function evst:thing1 +@@function this is invalid + +@function evst:thing2 +@@function this is invalid From d79387641bf34505d70ae0e1f9ae07566ef31c78 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 6 Apr 2022 00:31:38 +0000 Subject: [PATCH 0758/1554] 0.20.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 8 ++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 6d76a2dea..3ab342d9a 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.20.0 (2022-04-06) +### Feature +* Add format sniffer and allow regular text format in code blocks ([`85420af`](https://github.com/mcbeet/lectern/commit/85420afe3ef856f570c4583936a606d824cbff2a)) + +### Fix +* Update pyright ([`919657c`](https://github.com/mcbeet/lectern/commit/919657cbb6d10ddb80020b1dd581504ac87c3fa6)) +* Update dependencies ([`811b833`](https://github.com/mcbeet/lectern/commit/811b8337d8383a593e314e3cc68a1511386421a4)) + ## v0.19.1 (2022-03-01) ### Fix * Use compatible beet dependency specifier ([`5eb9d1b`](https://github.com/mcbeet/lectern/commit/5eb9d1bc1818e59d832943ae9caa9f4841bb3fe9)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index eae653434..dfefbf5c4 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.19.1" +__version__ = "0.20.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 3d1d14a0e..3aa9ce50e 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.19.1" +version = "0.20.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 5698133abe7df19dc7bb99a61ed1fe5c8853e0ce Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 03:04:38 +0200 Subject: [PATCH 0759/1554] feat: better errors for undefined identifiers --- packages/mecha/mecha/api.py | 4 + packages/mecha/mecha/cli.py | 2 +- packages/mecha/mecha/commands.py | 4 +- .../mecha/contrib/annotate_diagnostics.py | 3 + packages/mecha/mecha/contrib/bolt/parse.py | 26 +- .../mecha/mecha/contrib/nested_resources.py | 10 +- packages/mecha/mecha/diagnostic.py | 5 + packages/mecha/package-lock.json | 14 +- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 889 ++++++++++-------- packages/mecha/pyproject.toml | 10 +- .../tests/resources/bolt_examples.mcfunction | 3 + .../tests/snapshots/bolt__parse_125__0.txt | 8 +- .../tests/snapshots/bolt__parse_158__0.txt | 8 +- .../tests/snapshots/bolt__parse_159__0.txt | 8 +- .../tests/snapshots/bolt__parse_180__0.txt | 2 +- .../tests/snapshots/bolt__parse_195__0.txt | 9 + .../tests/snapshots/bolt__parse_30__0.txt | 7 +- .../tests/snapshots/bolt__parse_38__0.txt | 2 +- .../tests/snapshots/bolt__parse_56__0.txt | 8 +- .../tests/snapshots/bolt__parse_78__0.txt | 9 +- .../tests/snapshots/bolt__parse_79__0.txt | 8 +- .../tests/snapshots/bolt__parse_88__0.txt | 8 +- 23 files changed, 586 insertions(+), 463 deletions(-) create mode 100644 packages/mecha/tests/snapshots/bolt__parse_195__0.txt diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 38fcb9c58..29f8ce4c7 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -290,6 +290,7 @@ def parse( d = Diagnostic( level="error", message=str(exc), + notes=exc.notes, hint=resource_location, filename=str(filename) if filename else None, file=source, @@ -462,6 +463,9 @@ def finalize(self, ctx: Context): if code := diagnostic.format_code(source): message += f"\n{code}" + if diagnostic.notes: + message += f"\n{diagnostic.format_notes()}" + extra = {"annotate": diagnostic.format_location()} if diagnostic.level == "error": diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py index 1468be751..be1e24fee 100644 --- a/packages/mecha/mecha/cli.py +++ b/packages/mecha/mecha/cli.py @@ -35,7 +35,7 @@ def validate(ctx: Context): mc.compile(Function(source_path=path), report=mc.diagnostics) -@click.command( +@click.command( # type: ignore cls=BeetCommand, context_settings={"help_option_names": ("-h", "--help")}, ) diff --git a/packages/mecha/mecha/commands.py b/packages/mecha/mecha/commands.py index 1cd082421..cdd05838e 100644 --- a/packages/mecha/mecha/commands.py +++ b/packages/mecha/mecha/commands.py @@ -2,7 +2,7 @@ import click from beet import ErrorMessage, Project -from beet.toolchain.cli import beet, echo +from beet.toolchain.cli import beet from mecha import AstCacheBackend @@ -19,6 +19,6 @@ def ast(project: Project, filename: str): try: with ast_path.open("rb") as f: - echo(AstCacheBackend().load(f).dump()) + click.echo(AstCacheBackend().load(f).dump()) except FileNotFoundError as exc: raise ErrorMessage(f'No cached ast for "{filename}".') from exc diff --git a/packages/mecha/mecha/contrib/annotate_diagnostics.py b/packages/mecha/mecha/contrib/annotate_diagnostics.py index f808eb3f6..f91ad75d9 100644 --- a/packages/mecha/mecha/contrib/annotate_diagnostics.py +++ b/packages/mecha/mecha/contrib/annotate_diagnostics.py @@ -34,6 +34,9 @@ def annotate_diagnostics( if code := diagnostic.format_code(source): message += f"\n{code}" + if diagnostic.notes: + message += f"\n{diagnostic.format_notes()}" + comments = [f"# {line}" for line in message.splitlines()] comments[0] = "#>" + comments[0][2:] rendered = annotations.setdefault(diagnostic.file, []) diff --git a/packages/mecha/mecha/contrib/bolt/parse.py b/packages/mecha/mecha/contrib/bolt/parse.py index 0613def81..7c20ee675 100644 --- a/packages/mecha/mecha/contrib/bolt/parse.py +++ b/packages/mecha/mecha/contrib/bolt/parse.py @@ -33,6 +33,7 @@ "PrimaryParser", "parse_dict_item", "LiteralParser", + "UndefinedIdentifierErrorHandler", ] @@ -120,8 +121,10 @@ def get_bolt_parsers( ################################################################################ "root": create_bolt_root_parser(parsers["root"]), "nested_root": create_bolt_root_parser(parsers["nested_root"]), - "command": ImportStatementHandler( - GlobalNonlocalHandler(ExecuteIfConditionConstraint(parsers["command"])) + "command": UndefinedIdentifierErrorHandler( + ImportStatementHandler( + GlobalNonlocalHandler(ExecuteIfConditionConstraint(parsers["command"])) + ) ), "command:argument:bolt:statement": delegate("bolt:statement"), "command:argument:bolt:assignment_target": delegate("bolt:assignment_target"), @@ -1335,3 +1338,22 @@ def __call__(self, stream: TokenStream) -> Any: node = AstValue(value=value) # type: ignore return set_location(node, stream.current) + + +@dataclass +class UndefinedIdentifierErrorHandler: + """Parser that provides hints for errors involving undefined identifiers.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + try: + return self.parser(stream) + except UndefinedIdentifier: + raise + except InvalidSyntax as exc: + for alt in exc.alternatives.get(UndefinedIdentifier, []): + if alt.end_location.pos + 1 >= exc.location.pos: # kind of a cheat + alt.notes.append(str(exc)) + raise alt from None + raise diff --git a/packages/mecha/mecha/contrib/nested_resources.py b/packages/mecha/mecha/contrib/nested_resources.py index 6d4fe2ccc..95d5498b7 100644 --- a/packages/mecha/mecha/contrib/nested_resources.py +++ b/packages/mecha/mecha/contrib/nested_resources.py @@ -7,10 +7,10 @@ from dataclasses import dataclass, replace -from typing import Dict, List, Type, cast +from typing import Dict, List, Type from beet import Context, DataModelBase, NamespaceFile -from beet.core.utils import JsonDict, required_field, snake_case +from beet.core.utils import required_field, snake_case from tokenstream import set_location from mecha import ( @@ -124,13 +124,13 @@ def nested_resources(self, node: AstRoot): continue full_name = name.get_canonical_value() - file_instance = file_type( - cast(JsonDict, value), + file_instance = file_type( # type: ignore + value, original=self.database.current.original, ) if command.identifier.startswith("merge:"): - proxy.merge({full_name: file_instance}) + proxy.merge({full_name: file_instance}) # type: ignore elif full_name not in proxy: proxy[full_name] = file_instance else: diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index e256526cc..d1ececdd9 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -23,6 +23,7 @@ class Diagnostic(MechaError): level: Literal["info", "warn", "error"] message: str + notes: List[str] = field(default_factory=list) rule: Optional[str] = None hint: Optional[str] = None @@ -41,6 +42,10 @@ def format_message(self) -> str: message += f" ({self.rule})" return message + def format_notes(self) -> str: + """Return the formatted notes.""" + return "Notes:\n" + "\n".join(f" - {note}\n" for note in self.notes) + def format_location(self) -> str: """Return the formatted location of the reported message.""" if self.filename: diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 6f810f4a7..7f17aac30 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.230" + "pyright": "^1.1.236" } }, "node_modules/pyright": { - "version": "1.1.230", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.230.tgz", - "integrity": "sha512-BGxpDYuxvMd+CM2FtE6PiGaIj5lSs8b0GCWNxxfw6Jlk0wzfmJtNu7H4fejxSZpggg6fQsIdSQjf8PJD1vRswg==", + "version": "1.1.236", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.236.tgz", + "integrity": "sha512-LreWbVIFN3VGntqYFqfbyaVi9+czQSkDT9Ug4mTFeJKWF7kG3c9iSGo4hWes6jwqD/a+f/AYkXFLrKFfCYNlMw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.230", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.230.tgz", - "integrity": "sha512-BGxpDYuxvMd+CM2FtE6PiGaIj5lSs8b0GCWNxxfw6Jlk0wzfmJtNu7H4fejxSZpggg6fQsIdSQjf8PJD1vRswg==", + "version": "1.1.236", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.236.tgz", + "integrity": "sha512-LreWbVIFN3VGntqYFqfbyaVi9+czQSkDT9Ug4mTFeJKWF7kG3c9iSGo4hWes6jwqD/a+f/AYkXFLrKFfCYNlMw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 867d6c8b0..bb601c0cb 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.230" + "pyright": "^1.1.236" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 37222fdb2..5ef466b2e 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -8,35 +8,35 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "21.2.0" +version = "21.4.0" description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "beet" -version = "0.55.0" +version = "0.57.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -click = ">=8.0.1,<9.0.0" +click = ">=8.1.2,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -Jinja2 = ">=3.0.1,<4.0.0" +Jinja2 = ">=3.1.1,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" pydantic = ">=1.9.0,<2.0.0" -PyYAML = ">=5.4.1,<7.0.0" +PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" [package.extras] @@ -44,7 +44,7 @@ image = ["pillow"] [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -55,7 +55,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -66,20 +66,23 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "3.3.0" +version = "5.0.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.dependencies] -packaging = "*" six = ">=1.9.0" webencodings = "*" +[package.extras] +css = ["tinycss2 (>=1.1.0)"] +dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] + [[package]] name = "certifi" -version = "2020.12.5" +version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -87,7 +90,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.5" +version = "1.15.0" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -97,20 +100,23 @@ python-versions = "*" pycparser = "*" [[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.2" description = "Composable command line interface toolkit" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -131,7 +137,7 @@ dev = ["pytest"] [[package]] name = "click-log" -version = "0.3.2" +version = "0.4.0" description = "Logging integration for Click" category = "dev" optional = false @@ -150,7 +156,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "3.4.7" +version = "36.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -161,15 +167,15 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "docutils" -version = "0.17.1" +version = "0.18.1" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false @@ -188,49 +194,49 @@ setuptools_scm = "*" [[package]] name = "gitdb" -version = "4.0.7" +version = "4.0.9" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.4" +python-versions = ">=3.6" [package.dependencies] -smmap = ">=3.0.1,<5" +smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.15" -description = "Python Git Library" +version = "3.1.27" +description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = ">=3.7.4.0" [[package]] name = "idna" -version = "2.10" +version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.0.1" +version = "4.11.3" description = "Read metadata from Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -242,7 +248,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.5.0" +version = "1.7.0" description = "Pythonic task execution" category = "dev" optional = false @@ -264,22 +270,23 @@ plugins = ["setuptools"] [[package]] name = "jeepney" -version = "0.6.0" +version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.1" +version = "3.1.1" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -289,11 +296,11 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.0.1" +version = "23.5.0" description = "Store and access your passwords safely." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] importlib-metadata = ">=3.6" @@ -302,21 +309,21 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] name = "lectern" -version = "0.19.1" +version = "0.20.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.52.2" -click = ">=8.0.4,<9.0.0" -markdown-it-py = ">=2.0.1,<3.0.0" +beet = ">=0.55.1" +click = ">=8.1.2,<9.0.0" +markdown-it-py = ">=1.1" [[package]] name = "markdown-it-py" @@ -341,19 +348,19 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mdurl" -version = "0.1.0" +version = "0.1.1" description = "Markdown URL utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mypy-extensions" @@ -376,22 +383,22 @@ numpy = "*" [[package]] name = "numpy" -version = "1.20.1" +version = "1.22.3" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [[package]] name = "packaging" -version = "20.9" +version = "21.3" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" @@ -403,22 +410,22 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pkginfo" -version = "1.7.0" +version = "1.8.2" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false python-versions = "*" [package.extras] -testing = ["nose", "coverage"] +testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.3.0" +version = "2.5.1" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] @@ -426,26 +433,27 @@ test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycparser" -version = "2.20" +version = "2.21" description = "C parser in Python" category = "dev" optional = false @@ -468,7 +476,7 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.9.0" +version = "2.11.2" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -476,11 +484,14 @@ python-versions = ">=3.5" [[package]] name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" +version = "3.0.8" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -517,23 +528,23 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "2.7.1" +version = "3.3.0" description = "Interact with GitLab API" category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" [package.dependencies] -requests = ">=2.22.0" +requests = ">=2.25.0" requests-toolbelt = ">=0.9.1" [package.extras] -autocompletion = ["argcomplete (>=1.10.0,<2)"] +autocompletion = ["argcomplete (>=1.10.0,<3)"] yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.26.0" +version = "7.28.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -545,10 +556,10 @@ click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" invoke = ">=1.4.1,<2" -python-gitlab = ">=1.10,<3" +python-gitlab = ">=2,<4" requests = ">=2.25,<3" semver = ">=2.10,<3" -tomlkit = "0.7.0" +tomlkit = ">=0.10.0,<0.11.0" twine = ">=3,<4" [package.extras] @@ -567,46 +578,45 @@ python-versions = "*" [[package]] name = "pyyaml" -version = "5.4.1" +version = "6.0" description = "YAML parser and emitter for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "29.0" +version = "34.0" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] bleach = ">=2.1.0" docutils = ">=0.13.1" Pygments = ">=2.5.1" -six = "*" [package.extras] -md = ["cmarkgfm (>=0.5.0,<0.6.0)"] +md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.25.1" +version = "2.27.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-toolbelt" @@ -621,11 +631,11 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rfc3986" -version = "1.5.0" +version = "2.0.0" description = "Validating URI References per RFC 3986" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.extras] idna2008 = ["idna"] @@ -652,14 +662,19 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "setuptools-scm" -version = "6.0.1" +version = "6.4.2" description = "the blessed package to manage your versions by scm tags" category = "dev" optional = false python-versions = ">=3.6" +[package.dependencies] +packaging = ">=20.0" +tomli = ">=1.0.0" + [package.extras] -toml = ["toml"] +test = ["pytest (>=6.2)", "virtualenv (>20)"] +toml = ["setuptools (>=42)"] [[package]] name = "six" @@ -671,15 +686,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" -version = "4.0.0" +version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "1.3.2" +version = "1.4.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -695,36 +710,40 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.1" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.7.0" +version = "0.10.1" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6,<4.0" [[package]] name = "tqdm" -version = "4.60.0" +version = "4.64.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "twine" -version = "3.4.1" +version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -734,33 +753,34 @@ python-versions = ">=3.6" colorama = ">=0.4.3" importlib-metadata = ">=3.6" keyring = ">=15.1" -pkginfo = ">=1.4.2" +pkginfo = ">=1.8.1" readme-renderer = ">=21.0" requests = ">=2.20" requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" rfc3986 = ">=1.4.0" tqdm = ">=4.14" +urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" +version = "4.1.1" +description = "Backported and Experimental Type Hints for Python 3.6+" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "urllib3" -version = "1.26.4" +version = "1.26.9" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "webencodings" @@ -772,28 +792,28 @@ python-versions = "*" [[package]] name = "wrapt" -version = "1.12.1" +version = "1.14.0" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.4.1" +version = "3.8.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "4490c295a90ea40f067eb371cae3e64fa19b76d94e70341e55d5215e3682f6e2" +content-hash = "d8ec6f9cbe828476fefc5fd980c9e5f2df79c67488c54dd38c0e1b3df7bda88b" [metadata.files] atomicwrites = [ @@ -801,263 +821,240 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.55.0-py3-none-any.whl", hash = "sha256:ccd814fe1e8c4fd75be7364980fb265a181f13000a3364f9b05b619d78d27d68"}, - {file = "beet-0.55.0.tar.gz", hash = "sha256:fb65ae3514263c16abe7c68023dc1c6dbda800ff8566f9dbb29c522af58b1b06"}, + {file = "beet-0.57.0-py3-none-any.whl", hash = "sha256:daaf5dedfabe173935aed45cf4e7570947bac5bbe8fe069721846af52c6c3a62"}, + {file = "beet-0.57.0.tar.gz", hash = "sha256:6ef70983ae87852399e4831c1f11b10616c8911d93a14e2dc3e10814e91bd9da"}, ] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] bleach = [ - {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, - {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, + {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, + {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, ] certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, + {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, ] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, ] click-log = [ - {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, - {file = "click_log-0.3.2-py2.py3-none-any.whl", hash = "sha256:eee14dc37cdf3072158570f00406572f9e03e414accdccfccd4c538df9ae322c"}, + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, + {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, + {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, + {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, ] docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, ] dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, ] gitdb = [ - {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, - {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] gitpython = [ - {file = "GitPython-3.1.15-py3-none-any.whl", hash = "sha256:a77824e516d3298b04fb36ec7845e92747df8fcfee9cacc32dd6239f9652f867"}, - {file = "GitPython-3.1.15.tar.gz", hash = "sha256:05af150f47a5cca3f4b0af289b73aef8cf3c4fe2385015b06220cbcdee48bb6e"}, + {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, + {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, ] idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"}, - {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"}, + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, - {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, - {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, + {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, + {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] jeepney = [ - {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, - {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, + {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, + {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, ] keyring = [ - {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, - {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, + {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, + {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.19.1-py3-none-any.whl", hash = "sha256:fa30094ac25dffb78288317db056badfbf5255b56b0a781184ceff7af6665a0f"}, - {file = "lectern-0.19.1.tar.gz", hash = "sha256:77c0e132fa201eef7fb2b3ad34b12befe049537e63215c2f06b2b32327268fb2"}, + {file = "lectern-0.20.0-py3-none-any.whl", hash = "sha256:31ae3c5473dbde55b16620b9ca474519103f41497b6bc9523190071b25df60da"}, + {file = "lectern-0.20.0.tar.gz", hash = "sha256:cde89569ada5d159ee1f5aa7c07c43efd70cf8582d5bea1d6423cd1889f0f09f"}, ] markdown-it-py = [ {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] mdurl = [ - {file = "mdurl-0.1.0-py3-none-any.whl", hash = "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda"}, - {file = "mdurl-0.1.0.tar.gz", hash = "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"}, + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1068,58 +1065,54 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, - {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, - {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, - {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, - {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, - {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, - {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, - {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, - {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, - {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, - {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, - {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, - {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, - {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, + {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, + {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, + {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, + {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, + {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, + {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, + {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, + {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, + {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, + {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, ] packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pkginfo = [ - {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, - {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, + {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, + {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, ] platformdirs = [ - {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, - {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, + {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, + {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, ] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pydantic = [ {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, @@ -1159,12 +1152,12 @@ pydantic = [ {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, + {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, ] pytest = [ {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, @@ -1175,63 +1168,67 @@ pytest-insta = [ {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-2.7.1.tar.gz", hash = "sha256:e1f9234a3ee7fbcf9ab1a5cb8b935ae58fdab29af9832ae060bf74d88bac8a7c"}, - {file = "python_gitlab-2.7.1-py3-none-any.whl", hash = "sha256:b1dbb66f53ad7cf33fbdce8e9e7e6a09b18c75a9c506b099af1f6f9191542cfb"}, + {file = "python-gitlab-3.3.0.tar.gz", hash = "sha256:fef25d41a62f91da82ee20f72a728b9c69eef34cf0a3005cdbb9a0b471d5b498"}, + {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.26.0.tar.gz", hash = "sha256:9876885cf16af43d75610b4f46e27d5ad0f699c7d574dcfe0c6b62ab7d43458d"}, - {file = "python_semantic_release-7.26.0-py3-none-any.whl", hash = "sha256:ddd7e2460c526264148d534658ea35aee265d615fe110cdf4e16abc6ffc22e50"}, + {file = "python-semantic-release-7.28.0.tar.gz", hash = "sha256:3f80f6a66d195ddd2e5a43c18d42174ee038d4dd77f959c00ab1df9bb9ccf654"}, + {file = "python_semantic_release-7.28.0-py3-none-any.whl", hash = "sha256:446fdf4143648b7ef6d791233dcce01b1e46c6aa9fc9fd4b48f8ef5b49580a30"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, - {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, + {file = "readme_renderer-34.0-py3-none-any.whl", hash = "sha256:262510fe6aae81ed4e94d8b169077f325614c0b1a45916a80442c6576264a9c2"}, + {file = "readme_renderer-34.0.tar.gz", hash = "sha256:dfb4d17f21706d145f7473e0b61ca245ba58e810cf9b2209a48239677f82e5b0"}, ] requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] rfc3986 = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, ] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, @@ -1242,58 +1239,120 @@ semver = [ {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] setuptools-scm = [ - {file = "setuptools_scm-6.0.1-py3-none-any.whl", hash = "sha256:c3bd5f701c8def44a5c0bfe8d407bef3f80342217ef3492b951f3777bd2d915c"}, - {file = "setuptools_scm-6.0.1.tar.gz", hash = "sha256:d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92"}, + {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, + {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] smmap = [ - {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, - {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] tokenstream = [ - {file = "tokenstream-1.3.2-py3-none-any.whl", hash = "sha256:97aca95f5495f6a1d3e12904b020d4496755e62daae2ee9872d3bc9be684b3e6"}, - {file = "tokenstream-1.3.2.tar.gz", hash = "sha256:4726a9250c77fc32136aa0e4847b13442e6cdde729135221e9dd2b6be2d356a3"}, + {file = "tokenstream-1.4.0-py3-none-any.whl", hash = "sha256:44da76e2df70b6858f7a967612af31a1606dd5f2215fb06fe606e1acce015cdb"}, + {file = "tokenstream-1.4.0.tar.gz", hash = "sha256:64dbd9d8fd2aa19a9d81056410acb37baa46aa861d765555cf2751fe54fb00f9"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, - {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, - {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, + {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, + {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, ] tqdm = [ - {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, - {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, + {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, + {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, ] twine = [ - {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, - {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, + {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, + {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, ] urllib3 = [ - {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, - {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, + {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, + {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, + {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, + {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, + {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, + {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, + {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, + {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, + {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, + {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, + {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, + {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, + {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, + {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, + {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, + {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, + {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, + {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, + {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, + {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, + {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, + {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, ] zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, ] diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b77a68def..5f44cfed3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,16 +23,16 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.52.2" -tokenstream = "^1.3.1" +beet = ">=0.57.0" +tokenstream = "^1.4" [tool.poetry.dev-dependencies] -black = "^22.1.0" +black = "^22.3.0" pytest = "^7.1.1" isort = "^5.10.1" -python-semantic-release = "^7.26.0" +python-semantic-release = "^7.28.0" pytest-insta = "^0.1.11" -lectern = ">=0.19.1" +lectern = ">=0.20.0" [tool.poetry.scripts] mecha = "mecha.cli:main" diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction index 768c63b3f..a8d4d87b1 100644 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ b/packages/mecha/tests/resources/bolt_examples.mcfunction @@ -717,3 +717,6 @@ counter = Counter() say counter.incr() say counter.incr() say Counter(9).incr() +### +for i in range(3): + parent[i] = f"param{i}" diff --git a/packages/mecha/tests/snapshots/bolt__parse_125__0.txt b/packages/mecha/tests/snapshots/bolt__parse_125__0.txt index 1413d9f1f..c0e41819f 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_125__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_125__0.txt @@ -1,7 +1,9 @@ import math -#>ERROR Expected assignment but got literal '.sin(1)'. -# line 2, column 4 +#>ERROR Identifier 'mah' is not defined. Did you mean 'math', 'max' or 'map'? +# line 2, column 1 # 1 | import math # 2 | mah.sin(1) -# : ^^^^^^^ +# : ^^^ +# Notes: +# - Expected assignment but got literal '.sin(1)'. mah.sin(1) diff --git a/packages/mecha/tests/snapshots/bolt__parse_158__0.txt b/packages/mecha/tests/snapshots/bolt__parse_158__0.txt index b2be34477..401fcb9da 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_158__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_158__0.txt @@ -1,5 +1,7 @@ -#>ERROR Expected assignment but got literal '.bar'. -# line 1, column 4 +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 # 1 | foo.bar = 1 -# : ^^^^ +# : ^^^ +# Notes: +# - Expected assignment but got literal '.bar'. foo.bar = 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_159__0.txt b/packages/mecha/tests/snapshots/bolt__parse_159__0.txt index 2a44f5e78..2335ef90f 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_159__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_159__0.txt @@ -1,5 +1,7 @@ -#>ERROR Expected assignment but got literal '().bar'. -# line 1, column 4 +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 # 1 | foo().bar = 1 -# : ^^^^^^ +# : ^^^ +# Notes: +# - Expected assignment but got literal '().bar'. foo().bar = 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_180__0.txt b/packages/mecha/tests/snapshots/bolt__parse_180__0.txt index 26a76ef08..1e000a776 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_180__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_180__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected identifier but reached end of file. +#>ERROR Expected bracket '[', curly '{', identifier, literal 'false', literal 'null', literal 'true', number or string but reached end of file. # line 1, column 34 # 1 | merge function_tag minecraft:tick merge function_tag minecraft:tick diff --git a/packages/mecha/tests/snapshots/bolt__parse_195__0.txt b/packages/mecha/tests/snapshots/bolt__parse_195__0.txt new file mode 100644 index 000000000..2a2f36a74 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_195__0.txt @@ -0,0 +1,9 @@ +for i in range(3): +#>ERROR Identifier 'parent' is not defined. Did you mean 'print'? +# line 2, column 5 +# 1 | for i in range(3): +# 2 | parent[i] = f"param{i}" +# : ^^^^^^ +# Notes: +# - Expected assignment but got literal '[i]'. + parent[i] = f"param{i}" diff --git a/packages/mecha/tests/snapshots/bolt__parse_30__0.txt b/packages/mecha/tests/snapshots/bolt__parse_30__0.txt index a0daccf18..388d21465 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_30__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_30__0.txt @@ -1,4 +1,7 @@ -#>ERROR Expected assignment but got newline '\n'. -# line 1, column 4 +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 # 1 | foo +# : ^^^ +# Notes: +# - Expected assignment but got newline '\n'. foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_38__0.txt b/packages/mecha/tests/snapshots/bolt__parse_38__0.txt index 6ee60a116..de0aadffe 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_38__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_38__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected identifier but reached end of file. +#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'block', literal 'blocks' or 9 other tokens but reached end of file. # line 1, column 3 # 1 | if if diff --git a/packages/mecha/tests/snapshots/bolt__parse_56__0.txt b/packages/mecha/tests/snapshots/bolt__parse_56__0.txt index 0c087e88e..1d4f62438 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_56__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_56__0.txt @@ -1,5 +1,7 @@ -#>ERROR Expected assignment but got literal '+='. -# line 1, column 5 +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 # 1 | foo += "hey" -# : ^^ +# : ^^^ +# Notes: +# - Expected assignment but got literal '+='. foo += "hey" diff --git a/packages/mecha/tests/snapshots/bolt__parse_78__0.txt b/packages/mecha/tests/snapshots/bolt__parse_78__0.txt index 5edddb17a..0424f5b36 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_78__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_78__0.txt @@ -2,9 +2,12 @@ def f(a, b): def g(c): a + b c -#>ERROR Expected assignment but got literal '()'. -# line 5, column 2 +#>ERROR Identifier 'g' is not defined. +# line 5, column 1 +# 3 | a + b # 4 | c # 5 | g() -# : ^^ +# : ^ +# Notes: +# - Expected assignment but got literal '()'. g() diff --git a/packages/mecha/tests/snapshots/bolt__parse_79__0.txt b/packages/mecha/tests/snapshots/bolt__parse_79__0.txt index fb39d4bf6..e692a356f 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_79__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_79__0.txt @@ -1,9 +1,11 @@ def f(a, b): def g(c): a + b -#>ERROR Expected equal but got brace ')'. -# line 4, column 8 +#>ERROR Identifier 'c' is not defined. +# line 4, column 7 # 3 | a + b # 4 | f(c) -# : ^ +# : ^ +# Notes: +# - Expected equal but got brace ')'. f(c) diff --git a/packages/mecha/tests/snapshots/bolt__parse_88__0.txt b/packages/mecha/tests/snapshots/bolt__parse_88__0.txt index 124bda384..8959523ff 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_88__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_88__0.txt @@ -1,8 +1,10 @@ def f(): foo = 0 -#>ERROR Expected equal but got brace ')'. -# line 3, column 6 +#>ERROR Identifier 'foo' is not defined. +# line 3, column 3 # 2 | foo = 0 # 3 | f(foo) -# : ^ +# : ^^^ +# Notes: +# - Expected equal but got brace ')'. f(foo) From c408105a6adc3217e6111c0d2786bb3cab14ba65 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 04:55:01 +0200 Subject: [PATCH 0760/1554] fix: properly handle conditional branch scopes --- packages/mecha/mecha/contrib/bolt/parse.py | 72 ++++++++++- packages/mecha/mecha/resources/bolt.json | 8 +- .../tests/resources/bolt_examples.mcfunction | 15 +++ .../tests/snapshots/bolt__parse_196__0.txt | 101 +++++++++++++++ .../tests/snapshots/bolt__parse_196__1.txt | 24 ++++ .../tests/snapshots/bolt__parse_197__0.txt | 122 ++++++++++++++++++ .../tests/snapshots/bolt__parse_197__1.txt | 33 +++++ .../tests/snapshots/bolt__parse_37__0.txt | 1 - 8 files changed, 370 insertions(+), 6 deletions(-) create mode 100644 packages/mecha/tests/snapshots/bolt__parse_196__0.txt create mode 100644 packages/mecha/tests/snapshots/bolt__parse_196__1.txt create mode 100644 packages/mecha/tests/snapshots/bolt__parse_197__0.txt create mode 100644 packages/mecha/tests/snapshots/bolt__parse_197__1.txt diff --git a/packages/mecha/mecha/contrib/bolt/parse.py b/packages/mecha/mecha/contrib/bolt/parse.py index 7c20ee675..6c4723693 100644 --- a/packages/mecha/mecha/contrib/bolt/parse.py +++ b/packages/mecha/mecha/contrib/bolt/parse.py @@ -4,9 +4,11 @@ "get_stream_pending_identifiers", "get_stream_identifiers_storage", "get_stream_pending_identifiers_storage", + "get_stream_branch_scope", "UndefinedIdentifier", "create_bolt_root_parser", "ExecuteIfConditionConstraint", + "BranchScopeManager", "InterpolationParser", "parse_statement", "AssignmentTargetParser", @@ -126,6 +128,10 @@ def get_bolt_parsers( GlobalNonlocalHandler(ExecuteIfConditionConstraint(parsers["command"])) ) ), + "command:argument:bolt:if_block": delegate("bolt:if_block"), + "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), + "command:argument:bolt:elif_block": delegate("bolt:elif_block"), + "command:argument:bolt:else_block": delegate("bolt:else_block"), "command:argument:bolt:statement": delegate("bolt:statement"), "command:argument:bolt:assignment_target": delegate("bolt:assignment_target"), "command:argument:bolt:import": delegate("bolt:import"), @@ -139,6 +145,23 @@ def get_bolt_parsers( ################################################################################ # Bolt ################################################################################ + "bolt:if_block": BranchScopeManager( + parser=delegate("nested_root"), + update_before=True, + ), + "bolt:elif_condition": BranchScopeManager( + parser=delegate("bolt:expression"), + mask=True, + update_after=True, + ), + "bolt:elif_block": BranchScopeManager( + parser=delegate("nested_root"), + mask=True, + ), + "bolt:else_block": BranchScopeManager( + parser=delegate("nested_root"), + mask=True, + ), "bolt:statement": parse_statement, "bolt:assignment_target": AssignmentTargetParser( allow_undefined_identifiers=True, @@ -324,6 +347,11 @@ def get_stream_pending_identifiers_storage(stream: TokenStream) -> Dict[str, str return stream.data.setdefault("pending_identifiers_storage", {}) +def get_stream_branch_scope(stream: TokenStream) -> Set[str]: + """Return the identifiers available inside the branch.""" + return stream.data.setdefault("branch_scope", set()) + + class UndefinedIdentifier(UnexpectedToken): """Raised when an identifier is not defined.""" @@ -391,6 +419,47 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class BranchScopeManager: + """Parser that manages accessible identifiers for conditional branches.""" + + parser: Parser + mask: bool = False + update_before: bool = False + update_after: bool = False + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + branch_scope = get_stream_branch_scope(stream) + + mask = branch_scope and identifiers - branch_scope + mask_storage = { + identifier: identifiers_storage[identifier] + for identifier in set(identifiers_storage) & mask + } + + if self.mask: + identifiers -= mask + for identifier in mask_storage: + del identifiers_storage[identifier] + + if self.update_before: + branch_scope = identifiers.copy() + + try: + return self.parser(stream) + finally: + if self.update_after: + branch_scope = identifiers.copy() + + if self.mask: + identifiers.update(mask) + identifiers_storage.update(mask_storage) + + stream.data["branch_scope"] = branch_scope + + @dataclass class InterpolationParser: """Parser for interpolation.""" @@ -556,7 +625,7 @@ def __call__(self, stream: TokenStream) -> AstRoot: exc = InvalidSyntax( "Conditional branch must be part of an if statement." ) - raise set_location(exc, command) + raise set_location(exc, command, command.arguments[-1].location) if command.identifier == "elif:condition:body": changed = True @@ -706,6 +775,7 @@ def parse_function_root(stream: TokenStream) -> AstFunctionRoot: stream_copy.data["pending_identifiers"] = set() stream_copy.data["identifiers_storage"] = {} stream_copy.data["pending_identifiers_storage"] = {} + stream_copy.data["branch_scope"] = set() pending_identifiers.clear() diff --git a/packages/mecha/mecha/resources/bolt.json b/packages/mecha/mecha/resources/bolt.json index 579a12a42..89f607c1a 100644 --- a/packages/mecha/mecha/resources/bolt.json +++ b/packages/mecha/mecha/resources/bolt.json @@ -74,7 +74,7 @@ "children": { "body": { "type": "argument", - "parser": "mecha:nested_root", + "parser": "bolt:if_block", "executable": true } } @@ -86,11 +86,11 @@ "children": { "condition": { "type": "argument", - "parser": "bolt:expression", + "parser": "bolt:elif_condition", "children": { "body": { "type": "argument", - "parser": "mecha:nested_root", + "parser": "bolt:elif_block", "executable": true } } @@ -102,7 +102,7 @@ "children": { "body": { "type": "argument", - "parser": "mecha:nested_root", + "parser": "bolt:else_block", "executable": true } } diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction index a8d4d87b1..d808dc1a0 100644 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ b/packages/mecha/tests/resources/bolt_examples.mcfunction @@ -720,3 +720,18 @@ say Counter(9).incr() ### for i in range(3): parent[i] = f"param{i}" +### +def foo(value): + if value: + result = 1 + else: + result = 0 + return result +### +def foo(value): + result = "init" + if value: + result = 1 + else: + result = 0 + return result diff --git a/packages/mecha/tests/snapshots/bolt__parse_196__0.txt b/packages/mecha/tests/snapshots/bolt__parse_196__0.txt new file mode 100644 index 000000000..1a2948bc7 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_196__0.txt @@ -0,0 +1,101 @@ +def foo(value): + if value: + result = 1 + else: + result = 0 + return result +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'value' + default: None + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=8) + end_location: SourceLocation(pos=28, lineno=2, colno=13) + value: 'value' + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + commands: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=44, lineno=3, colno=15) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=47, lineno=3, colno=18) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + value: 1 + + location: SourceLocation(pos=53, lineno=4, colno=5) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + commands: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=73, lineno=5, colno=15) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=76, lineno=5, colno=18) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + value: 0 + + location: SourceLocation(pos=82, lineno=6, colno=5) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=89, lineno=6, colno=12) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + value: 'result' diff --git a/packages/mecha/tests/snapshots/bolt__parse_196__1.txt b/packages/mecha/tests/snapshots/bolt__parse_196__1.txt new file mode 100644 index 000000000..2c4dff889 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_196__1.txt @@ -0,0 +1,24 @@ +_mecha_lineno = [1, 6, 9, 12, 13], [1, 2, 3, 5, 6] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + def foo(value): + _mecha_var0 = value + if _mecha_var0: + _mecha_var1 = 1 + result = _mecha_var1 + else: + _mecha_var2 = 0 + result = _mecha_var2 + _mecha_var3 = result + return _mecha_var3 +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + commands: + diff --git a/packages/mecha/tests/snapshots/bolt__parse_197__0.txt b/packages/mecha/tests/snapshots/bolt__parse_197__0.txt new file mode 100644 index 000000000..6d15d9173 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_197__0.txt @@ -0,0 +1,122 @@ +def foo(value): + result = "init" + if value: + result = 1 + else: + result = 0 + return result +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'value' + default: None + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=35, lineno=2, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=35, lineno=2, colno=20) + operator: '=' + target: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=11) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=29, lineno=2, colno=14) + end_location: SourceLocation(pos=35, lineno=2, colno=20) + value: 'init' + + location: SourceLocation(pos=40, lineno=3, colno=5) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=43, lineno=3, colno=8) + end_location: SourceLocation(pos=48, lineno=3, colno=13) + value: 'value' + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + commands: + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=64, lineno=4, colno=15) + value: 'result' + rebind: True + value: + + location: SourceLocation(pos=67, lineno=4, colno=18) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + value: 1 + + location: SourceLocation(pos=73, lineno=5, colno=5) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + commands: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=93, lineno=6, colno=15) + value: 'result' + rebind: True + value: + + location: SourceLocation(pos=96, lineno=6, colno=18) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + value: 0 + + location: SourceLocation(pos=102, lineno=7, colno=5) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=109, lineno=7, colno=12) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + value: 'result' diff --git a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt new file mode 100644 index 000000000..77ff83bac --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt @@ -0,0 +1,33 @@ +_mecha_lineno = [1, 8, 9, 12, 18, 22], [1, 2, 3, 4, 6, 7] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + def foo(value): + _mecha_var0 = 'init' + result = _mecha_var0 + _mecha_var1 = value + if _mecha_var1: + _mecha_var2 = 1 + _mecha_rebind = _mecha_helper_get_rebind(result) + result = _mecha_var2 + if _mecha_rebind: + result = _mecha_rebind(result) + else: + _mecha_var3 = 0 + _mecha_rebind = _mecha_helper_get_rebind(result) + result = _mecha_var3 + if _mecha_rebind: + result = _mecha_rebind(result) + _mecha_var4 = result + return _mecha_var4 +_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + commands: + diff --git a/packages/mecha/tests/snapshots/bolt__parse_37__0.txt b/packages/mecha/tests/snapshots/bolt__parse_37__0.txt index ae29ac574..be30965f2 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_37__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_37__0.txt @@ -8,6 +8,5 @@ a = 1 # 4 | else: # : ^^^^^ # 5 | say hello -# : ^^^^^^^^^ else: say hello From 6682809bb6adf0a410dc56decdff93bbbe60c47d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 05:04:42 +0200 Subject: [PATCH 0761/1554] fix: allow `#` prefix when interpolating resource locations --- .../src/data/demo/functions/foo.mcfunction | 8 ++++ packages/mecha/mecha/contrib/bolt/parse.py | 2 +- .../tests/resources/bolt_examples.mcfunction | 3 ++ .../tests/snapshots/bolt__parse_198__0.txt | 42 +++++++++++++++++++ .../tests/snapshots/bolt__parse_198__1.txt | 36 ++++++++++++++++ .../examples__build_bolt_basic__0.pack.md | 11 +++++ 6 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 packages/mecha/tests/snapshots/bolt__parse_198__0.txt create mode 100644 packages/mecha/tests/snapshots/bolt__parse_198__1.txt diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 22127777a..6150c973a 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -477,3 +477,11 @@ def foo(msg): if score #temp abc matches 1..: foo("foo") + +tag_name = ./yolo_funcs + +function_tag tag_name: + values: + - "demo:foo" + +as @p function #tag_name # this runs the tag diff --git a/packages/mecha/mecha/contrib/bolt/parse.py b/packages/mecha/mecha/contrib/bolt/parse.py index 6c4723693..143ae49c5 100644 --- a/packages/mecha/mecha/contrib/bolt/parse.py +++ b/packages/mecha/mecha/contrib/bolt/parse.py @@ -292,7 +292,7 @@ def get_bolt_parsers( "range": InterpolationParser("range", parsers["range"], fallback=True), "resource_location_or_tag": CommentDisambiguation( InterpolationParser( - "resource_location", parsers["resource_location_or_tag"] + "resource_location", parsers["resource_location_or_tag"], prefix=r"#" ) ), "item_slot": InterpolationParser( diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction index d808dc1a0..3b2a500a0 100644 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ b/packages/mecha/tests/resources/bolt_examples.mcfunction @@ -735,3 +735,6 @@ def foo(value): else: result = 0 return result +### +tag_name = foo:bar +function #tag_name diff --git a/packages/mecha/tests/snapshots/bolt__parse_198__0.txt b/packages/mecha/tests/snapshots/bolt__parse_198__0.txt new file mode 100644 index 000000000..400f14d06 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_198__0.txt @@ -0,0 +1,42 @@ +tag_name = foo:bar +function #tag_name +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'tag_name' + rebind: False + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 'foo:bar' + + location: SourceLocation(pos=19, lineno=2, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + prefix: '#' + converter: 'resource_location' + value: + + location: SourceLocation(pos=29, lineno=2, colno=11) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + value: 'tag_name' diff --git a/packages/mecha/tests/snapshots/bolt__parse_198__1.txt b/packages/mecha/tests/snapshots/bolt__parse_198__1.txt new file mode 100644 index 000000000..000646f8b --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_198__1.txt @@ -0,0 +1,36 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'foo:bar' + tag_name = _mecha_var0 + _mecha_var1 = tag_name + _mecha_var1 = _mecha_helper_interpolate_resource_location(f'#{_mecha_var1}', _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + prefix: '#' + converter: 'resource_location' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=19, lineno=2, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + identifier: 'function:name' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + commands: + + diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 85a2d53f3..415713a10 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -231,6 +231,7 @@ say 1 say 2 say 10 execute if score #temp abc matches 1.. run say foo +execute as @p run function #demo:yolo_funcs ``` `@function demo:import_a` @@ -518,6 +519,16 @@ execute if score @s thingy matches 19 run say 19 say that's neat ``` +`@function_tag demo:yolo_funcs` + +```json +{ + "values": [ + "demo:foo" + ] +} +``` + ### felix `@function_tag felix:howdy` From da96f622d3ff41fa6db6e092a68b95a92c7251ee Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 13 Apr 2022 03:06:52 +0000 Subject: [PATCH 0762/1554] 0.44.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 8 ++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index b72bc1ffc..ff1c14375 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.44.0 (2022-04-13) +### Feature +* Better errors for undefined identifiers ([`7424ddf`](https://github.com/mcbeet/mecha/commit/7424ddf6748582567ab8841bf1d1f7ea97e40b45)) + +### Fix +* Allow `#` prefix when interpolating resource locations ([`3c1b7b5`](https://github.com/mcbeet/mecha/commit/3c1b7b510e721db6bc1c197d63232135392c6acf)) +* Properly handle conditional branch scopes ([`236326b`](https://github.com/mcbeet/mecha/commit/236326b25dfe2d601d64ce1b8aa7c59960f7e5d7)) + ## v0.43.3 (2022-04-02) ### Fix * Use full source path as cache key ([`f2d8944`](https://github.com/mcbeet/mecha/commit/f2d8944f8819c87b9aadfe56bc758ab1d8702e9b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 889a26558..af18bf118 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.43.3" +__version__ = "0.44.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 5f44cfed3..7a4f69ee2 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.43.3" +version = "0.44.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From a2cef89a4276c1195d42226fb14734b3f418f2cd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 20:04:22 +0200 Subject: [PATCH 0763/1554] feat: empty lookup now means full slice --- packages/mecha/mecha/contrib/bolt/parse.py | 7 ++-- .../tests/snapshots/bolt__parse_145__0.txt | 41 +++++++++++++++++-- .../tests/snapshots/bolt__parse_145__1.txt | 17 ++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 packages/mecha/tests/snapshots/bolt__parse_145__1.txt diff --git a/packages/mecha/mecha/contrib/bolt/parse.py b/packages/mecha/mecha/contrib/bolt/parse.py index 143ae49c5..3c7f90338 100644 --- a/packages/mecha/mecha/contrib/bolt/parse.py +++ b/packages/mecha/mecha/contrib/bolt/parse.py @@ -1282,10 +1282,11 @@ def __call__(self, stream: TokenStream) -> Any: if token.match("brace"): node = AstCall(value=node, arguments=AstChildren(arguments)) - elif not arguments: - exc = InvalidSyntax("Empty lookup not allowed.") - raise set_location(exc, node, stream.current) else: + if not arguments: + arguments = [ + set_location(AstSlice(), node.end_location, stream.current) + ] node = AstLookup(value=node, arguments=AstChildren(arguments)) node = set_location(node, node.value, stream.current) diff --git a/packages/mecha/tests/snapshots/bolt__parse_145__0.txt b/packages/mecha/tests/snapshots/bolt__parse_145__0.txt index 9d3f31e72..a39b4c0ec 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_145__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_145__0.txt @@ -1,5 +1,38 @@ -#>ERROR Empty lookup not allowed. -# line 1, column 5 -# 1 | a = [][] -# : ^^^^ a = [][] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + items: + + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + start: None + stop: None + step: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_145__1.txt b/packages/mecha/tests/snapshots/bolt__parse_145__1.txt new file mode 100644 index 000000000..557eac19d --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_145__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = [] + _mecha_var0 = _mecha_var0[:] + a = _mecha_var0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + From be68cc39e8aa823c9293dd5ae34571aedd094ab8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 20:51:20 +0200 Subject: [PATCH 0764/1554] feat: add not operator overloading --- .../src/data/demo/functions/foo.mcfunction | 19 ++ packages/mecha/mecha/contrib/bolt/codegen.py | 15 +- packages/mecha/mecha/contrib/bolt/helpers.py | 22 ++- .../tests/resources/bolt_examples.mcfunction | 6 + .../tests/snapshots/bolt__parse_17__1.txt | 120 +++++++------ .../tests/snapshots/bolt__parse_199__0.txt | 167 ++++++++++++++++++ .../tests/snapshots/bolt__parse_199__1.txt | 45 +++++ .../tests/snapshots/bolt__parse_20__1.txt | 14 +- .../tests/snapshots/bolt__parse_35__1.txt | 14 +- .../examples__build_bolt_basic__0.pack.md | 5 + 10 files changed, 345 insertions(+), 82 deletions(-) create mode 100644 packages/mecha/tests/snapshots/bolt__parse_199__0.txt create mode 100644 packages/mecha/tests/snapshots/bolt__parse_199__1.txt diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 6150c973a..a0ed1ac60 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -485,3 +485,22 @@ function_tag tag_name: - "demo:foo" as @p function #tag_name # this runs the tag + +def truth_table(): + for a in [False, True]: + for b in [False, True]: + for c in [False, True]: + for d in [False, True]: + yield a and b or c and not d + +say list(truth_table()) + +def not_init(self, value): + self.value = value + +def not_not(self): + say self.value + return self + +NotPrint = type("NotPrint", (), {"__init__": not_init, "__not__": not_not}) +not not not not NotPrint("hello") diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index cf492b48a..31eeb63c6 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -651,8 +651,12 @@ def binary_logical( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: left = yield from visit_single(node.left, required=True) - prefix = "not " if node.operator == "or" else "" - acc.statement(f"if {prefix}{left}:") + condition = left + if node.operator == "or": + condition = acc.make_variable() + value = acc.helper("operator_not", left) + acc.statement(f"{condition} = {value}") + acc.statement(f"if {condition}:") with acc.block(): right = yield from visit_single(node.right, required=True) acc.statement(f"{left} = {right}") @@ -675,9 +679,10 @@ def unary_logical( node: AstExpressionUnary, acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - value = yield from visit_single(node.value, required=True) - acc.statement(f"{value} = not {value}", lineno=node) - return [value] + result = yield from visit_single(node.value, required=True) + value = acc.helper("operator_not", result) + acc.statement(f"{result} = {value}", lineno=node) + return [result] @rule(AstValue) def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: diff --git a/packages/mecha/mecha/contrib/bolt/helpers.py b/packages/mecha/mecha/contrib/bolt/helpers.py index 85941b93f..12de464a9 100644 --- a/packages/mecha/mecha/contrib/bolt/helpers.py +++ b/packages/mecha/mecha/contrib/bolt/helpers.py @@ -51,6 +51,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "replace": replace, "missing": object(), "children": AstChildren, + "operator_not": operator_not, "get_rebind": get_rebind, "get_attribute": get_attribute, "import_module": python_import_module, @@ -85,6 +86,20 @@ def get_bolt_helpers() -> Dict[str, Any]: } +@internal +def operator_not(obj: Any): + if func := getattr(type(obj), "__not__", None): + return func(obj) + return not obj + + +@internal +def get_rebind(obj: Any): + if func := getattr(type(obj), "__rebind__", None): + return partial(func, obj) + return None + + @internal def get_attribute(obj: Any, attr: str): try: @@ -96,13 +111,6 @@ def get_attribute(obj: Any, attr: str): raise exc from None -@internal -def get_rebind(obj: Any): - if func := getattr(type(obj), "__rebind__", None): - return partial(func, obj) - return None - - @internal def python_import_module(name: str): try: diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction index 3b2a500a0..74ce69762 100644 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ b/packages/mecha/tests/resources/bolt_examples.mcfunction @@ -738,3 +738,9 @@ def foo(value): ### tag_name = foo:bar function #tag_name +### +for a in [False, True]: + for b in [False, True]: + for c in [False, True]: + for d in [False, True]: + print(a and b or c and not d) diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt index 66cf8eaf7..8b8307d84 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt @@ -1,68 +1,72 @@ _mecha_lineno = [1], [1] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var23: +with _mecha_runtime.scope() as _mecha_var26: _mecha_var0 = False - if not _mecha_var0: - _mecha_var1 = True - if _mecha_var1: - _mecha_var2 = 'hello' - _mecha_var1 = _mecha_var2 - _mecha_var0 = _mecha_var1 - if not _mecha_var0: - _mecha_var3 = 'foo' - _mecha_var4 = 'bar' - _mecha_var3 = _mecha_var3 == _mecha_var4 - _mecha_var3 = not _mecha_var3 - _mecha_var0 = _mecha_var3 - if not _mecha_var0: - _mecha_var5 = 1 - _mecha_var6 = 2 - _mecha_var5 = _mecha_var5 != _mecha_var6 - if _mecha_var5: - _mecha_var7 = 1 - _mecha_var8 = 2 - _mecha_var7 = _mecha_var7 < _mecha_var8 - _mecha_var5 = _mecha_var7 - if _mecha_var5: - _mecha_var9 = 2 - _mecha_var10 = 3 - _mecha_var9 = _mecha_var9 <= _mecha_var10 - _mecha_var5 = _mecha_var9 - if _mecha_var5: - _mecha_var11 = 5 - _mecha_var12 = 4 - _mecha_var11 = _mecha_var11 > _mecha_var12 - _mecha_var5 = _mecha_var11 - if _mecha_var5: - _mecha_var13 = 6 + _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) + if _mecha_var1: + _mecha_var2 = True + if _mecha_var2: + _mecha_var3 = 'hello' + _mecha_var2 = _mecha_var3 + _mecha_var0 = _mecha_var2 + _mecha_var4 = _mecha_helper_operator_not(_mecha_var0) + if _mecha_var4: + _mecha_var5 = 'foo' + _mecha_var6 = 'bar' + _mecha_var5 = _mecha_var5 == _mecha_var6 + _mecha_var5 = _mecha_helper_operator_not(_mecha_var5) + _mecha_var0 = _mecha_var5 + _mecha_var7 = _mecha_helper_operator_not(_mecha_var0) + if _mecha_var7: + _mecha_var8 = 1 + _mecha_var9 = 2 + _mecha_var8 = _mecha_var8 != _mecha_var9 + if _mecha_var8: + _mecha_var10 = 1 + _mecha_var11 = 2 + _mecha_var10 = _mecha_var10 < _mecha_var11 + _mecha_var8 = _mecha_var10 + if _mecha_var8: + _mecha_var12 = 2 + _mecha_var13 = 3 + _mecha_var12 = _mecha_var12 <= _mecha_var13 + _mecha_var8 = _mecha_var12 + if _mecha_var8: _mecha_var14 = 5 - _mecha_var13 = _mecha_var13 >= _mecha_var14 - _mecha_var5 = _mecha_var13 - if _mecha_var5: - _mecha_var15 = 1 - _mecha_var16 = 1 - _mecha_var15 = _mecha_var15 in _mecha_var16 - _mecha_var5 = _mecha_var15 - if _mecha_var5: - _mecha_var17 = 2 - _mecha_var18 = 2 - _mecha_var17 = _mecha_var17 not in _mecha_var18 - _mecha_var5 = _mecha_var17 - if _mecha_var5: - _mecha_var19 = 3 - _mecha_var20 = 3 - _mecha_var19 = _mecha_var19 is _mecha_var20 - _mecha_var5 = _mecha_var19 - if _mecha_var5: - _mecha_var21 = 3 + _mecha_var15 = 4 + _mecha_var14 = _mecha_var14 > _mecha_var15 + _mecha_var8 = _mecha_var14 + if _mecha_var8: + _mecha_var16 = 6 + _mecha_var17 = 5 + _mecha_var16 = _mecha_var16 >= _mecha_var17 + _mecha_var8 = _mecha_var16 + if _mecha_var8: + _mecha_var18 = 1 + _mecha_var19 = 1 + _mecha_var18 = _mecha_var18 in _mecha_var19 + _mecha_var8 = _mecha_var18 + if _mecha_var8: + _mecha_var20 = 2 + _mecha_var21 = 2 + _mecha_var20 = _mecha_var20 not in _mecha_var21 + _mecha_var8 = _mecha_var20 + if _mecha_var8: _mecha_var22 = 3 - _mecha_var21 = _mecha_var21 is not _mecha_var22 - _mecha_var5 = _mecha_var21 - _mecha_var0 = _mecha_var5 -_mecha_var24 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var23)) + _mecha_var23 = 3 + _mecha_var22 = _mecha_var22 is _mecha_var23 + _mecha_var8 = _mecha_var22 + if _mecha_var8: + _mecha_var24 = 3 + _mecha_var25 = 3 + _mecha_var24 = _mecha_var24 is not _mecha_var25 + _mecha_var8 = _mecha_var24 + _mecha_var0 = _mecha_var8 +_mecha_var27 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var26)) --- -output = _mecha_var24 +output = _mecha_var27 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__0.txt b/packages/mecha/tests/snapshots/bolt__parse_199__0.txt new file mode 100644 index 000000000..95a9dd6b9 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_199__0.txt @@ -0,0 +1,167 @@ +for a in [False, True]: + for b in [False, True]: + for c in [False, True]: + for d in [False, True]: + print(a and b or c and not d) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=166, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'a' + rebind: False + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + items: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: False + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: True + + location: SourceLocation(pos=28, lineno=2, colno=5) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + commands: + + location: SourceLocation(pos=28, lineno=2, colno=5) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=32, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=10) + value: 'b' + rebind: False + + location: SourceLocation(pos=37, lineno=2, colno=14) + end_location: SourceLocation(pos=50, lineno=2, colno=27) + items: + + location: SourceLocation(pos=38, lineno=2, colno=15) + end_location: SourceLocation(pos=43, lineno=2, colno=20) + value: False + + location: SourceLocation(pos=45, lineno=2, colno=22) + end_location: SourceLocation(pos=49, lineno=2, colno=26) + value: True + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + commands: + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=65, lineno=3, colno=14) + value: 'c' + rebind: False + + location: SourceLocation(pos=69, lineno=3, colno=18) + end_location: SourceLocation(pos=82, lineno=3, colno=31) + items: + + location: SourceLocation(pos=70, lineno=3, colno=19) + end_location: SourceLocation(pos=75, lineno=3, colno=24) + value: False + + location: SourceLocation(pos=77, lineno=3, colno=26) + end_location: SourceLocation(pos=81, lineno=3, colno=30) + value: True + + location: SourceLocation(pos=96, lineno=4, colno=13) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + commands: + + location: SourceLocation(pos=96, lineno=4, colno=13) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=100, lineno=4, colno=17) + end_location: SourceLocation(pos=101, lineno=4, colno=18) + value: 'd' + rebind: False + + location: SourceLocation(pos=105, lineno=4, colno=22) + end_location: SourceLocation(pos=118, lineno=4, colno=35) + items: + + location: SourceLocation(pos=106, lineno=4, colno=23) + end_location: SourceLocation(pos=111, lineno=4, colno=28) + value: False + + location: SourceLocation(pos=113, lineno=4, colno=30) + end_location: SourceLocation(pos=117, lineno=4, colno=34) + value: True + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + commands: + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + value: + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=141, lineno=5, colno=22) + value: 'print' + arguments: + + location: SourceLocation(pos=142, lineno=5, colno=23) + end_location: SourceLocation(pos=164, lineno=5, colno=45) + operator: 'or' + left: + + location: SourceLocation(pos=142, lineno=5, colno=23) + end_location: SourceLocation(pos=149, lineno=5, colno=30) + operator: 'and' + left: + + location: SourceLocation(pos=142, lineno=5, colno=23) + end_location: SourceLocation(pos=143, lineno=5, colno=24) + value: 'a' + right: + + location: SourceLocation(pos=148, lineno=5, colno=29) + end_location: SourceLocation(pos=149, lineno=5, colno=30) + value: 'b' + right: + + location: SourceLocation(pos=153, lineno=5, colno=34) + end_location: SourceLocation(pos=164, lineno=5, colno=45) + operator: 'and' + left: + + location: SourceLocation(pos=153, lineno=5, colno=34) + end_location: SourceLocation(pos=154, lineno=5, colno=35) + value: 'c' + right: + + location: SourceLocation(pos=159, lineno=5, colno=40) + end_location: SourceLocation(pos=164, lineno=5, colno=45) + operator: 'not' + value: + + location: SourceLocation(pos=163, lineno=5, colno=44) + end_location: SourceLocation(pos=164, lineno=5, colno=45) + value: 'd' diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt new file mode 100644 index 000000000..31091edcf --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt @@ -0,0 +1,45 @@ +_mecha_lineno = [1, 12, 16, 20, 22], [1, 2, 3, 4, 5] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var18: + _mecha_var0 = False + _mecha_var1 = True + _mecha_var2 = [_mecha_var0, _mecha_var1] + for a in _mecha_var2: + _mecha_var3 = False + _mecha_var4 = True + _mecha_var5 = [_mecha_var3, _mecha_var4] + for b in _mecha_var5: + _mecha_var6 = False + _mecha_var7 = True + _mecha_var8 = [_mecha_var6, _mecha_var7] + for c in _mecha_var8: + _mecha_var9 = False + _mecha_var10 = True + _mecha_var11 = [_mecha_var9, _mecha_var10] + for d in _mecha_var11: + _mecha_var12 = print + _mecha_var13 = a + if _mecha_var13: + _mecha_var14 = b + _mecha_var13 = _mecha_var14 + _mecha_var15 = _mecha_helper_operator_not(_mecha_var13) + if _mecha_var15: + _mecha_var16 = c + if _mecha_var16: + _mecha_var17 = d + _mecha_var17 = _mecha_helper_operator_not(_mecha_var17) + _mecha_var16 = _mecha_var17 + _mecha_var13 = _mecha_var16 + _mecha_var12 = _mecha_var12(_mecha_var13) +_mecha_var19 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var18)) +--- +output = _mecha_var19 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=166, lineno=6, colno=1) + commands: + diff --git a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt index 69f4f57c3..77e624b65 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt @@ -1,17 +1,19 @@ _mecha_lineno = [1], [1] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: +with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = True if _mecha_var0: _mecha_var1 = False - if not _mecha_var1: - _mecha_var2 = True - _mecha_var1 = _mecha_var2 + _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) + if _mecha_var2: + _mecha_var3 = True + _mecha_var1 = _mecha_var3 _mecha_var0 = _mecha_var1 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) --- -output = _mecha_var4 +output = _mecha_var5 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt index d62d643e9..02c8ffdaf 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt @@ -1,22 +1,24 @@ _mecha_lineno = [1], [1] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: +with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = True if _mecha_var0: _mecha_runtime.commands.extend(_mecha_refs[0].commands) else: _mecha_var1 = True - if not _mecha_var1: - _mecha_var2 = False - _mecha_var1 = _mecha_var2 + _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) + if _mecha_var2: + _mecha_var3 = False + _mecha_var1 = _mecha_var3 if _mecha_var1: _mecha_runtime.commands.extend(_mecha_refs[1].commands) else: _mecha_runtime.commands.extend(_mecha_refs[2].commands) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var4)) --- -output = _mecha_var4 +output = _mecha_var5 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 415713a10..1c62d57f1 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -232,6 +232,11 @@ say 2 say 10 execute if score #temp abc matches 1.. run say foo execute as @p run function #demo:yolo_funcs +say [False, False, True, False, False, False, True, False, False, False, True, False, True, True, True, True] +say hello +say hello +say hello +say hello ``` `@function demo:import_a` From 84c2dc455029c263436e27febe1531b210bc6cee Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 21:27:39 +0200 Subject: [PATCH 0765/1554] feat: improve in operator overloading --- .../src/data/demo/functions/foo.mcfunction | 18 ++- packages/mecha/mecha/contrib/bolt/codegen.py | 27 ++-- packages/mecha/mecha/contrib/bolt/helpers.py | 16 +++ .../tests/resources/bolt_examples.mcfunction | 2 +- .../tests/snapshots/bolt__parse_17__1.txt | 6 +- .../tests/snapshots/bolt__parse_199__0.txt | 118 +++++++++++------- .../tests/snapshots/bolt__parse_199__1.txt | 18 ++- .../examples__build_bolt_basic__0.pack.md | 6 + 8 files changed, 142 insertions(+), 69 deletions(-) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index a0ed1ac60..9ac804ba3 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -491,7 +491,7 @@ def truth_table(): for b in [False, True]: for c in [False, True]: for d in [False, True]: - yield a and b or c and not d + yield (a and b or c and not d) in [True] not in [False] say list(truth_table()) @@ -504,3 +504,19 @@ def not_not(self): NotPrint = type("NotPrint", (), {"__init__": not_init, "__not__": not_not}) not not not not NotPrint("hello") + +def thing_within(self, container): + for item in container: + say (self == item) + return self + +def thing_contains(self, item): + say (self == item) + return self + +def thing_equal(self, item): + return f"thing == {item}" + +Thing = type("Thing", (), {"__within__": thing_within, "__contains__": thing_contains, "__eq__": thing_equal}) +Thing() in [1, 2, 3] in [99] +"world" in ("hello" in Thing()) diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index 31eeb63c6..4231f8323 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -637,10 +637,14 @@ def binary( node: AstExpressionBinary, acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - op = node.operator.replace("_", " ") left = yield from visit_single(node.left, required=True) right = yield from visit_single(node.right, required=True) - acc.statement(f"{left} = {left} {op} {right}", lineno=node) + if node.operator in ["in", "not_in"]: + value = acc.helper(f"operator_{node.operator}", left, right) + acc.statement(f"{left} = {value}", lineno=node) + else: + op = node.operator.replace("_", " ") + acc.statement(f"{left} = {left} {op} {right}", lineno=node) return [left] @rule(AstExpressionBinary, operator="and") @@ -667,21 +671,14 @@ def unary( self, node: AstExpressionUnary, acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - op = node.operator.replace("_", " ") - value = yield from visit_single(node.value, required=True) - acc.statement(f"{value} = {op} {value}", lineno=node) - return [value] - - @rule(AstExpressionUnary, operator="not") - def unary_logical( - self, - node: AstExpressionUnary, - acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: result = yield from visit_single(node.value, required=True) - value = acc.helper("operator_not", result) - acc.statement(f"{result} = {value}", lineno=node) + if node.operator in ["not"]: + value = acc.helper(f"operator_{node.operator}", result) + acc.statement(f"{result} = {value}", lineno=node) + else: + op = node.operator.replace("_", " ") + acc.statement(f"{result} = {op} {result}", lineno=node) return [result] @rule(AstValue) diff --git a/packages/mecha/mecha/contrib/bolt/helpers.py b/packages/mecha/mecha/contrib/bolt/helpers.py index 12de464a9..f280b0097 100644 --- a/packages/mecha/mecha/contrib/bolt/helpers.py +++ b/packages/mecha/mecha/contrib/bolt/helpers.py @@ -52,6 +52,8 @@ def get_bolt_helpers() -> Dict[str, Any]: "missing": object(), "children": AstChildren, "operator_not": operator_not, + "operator_in": operator_in, + "operator_not_in": operator_not_in, "get_rebind": get_rebind, "get_attribute": get_attribute, "import_module": python_import_module, @@ -93,6 +95,20 @@ def operator_not(obj: Any): return not obj +@internal +def operator_in(item: Any, container: Any): + if func := getattr(type(item), "__within__", None): + return func(item, container) + if func := getattr(type(container), "__contains__", None): + return func(container, item) + return item in container + + +@internal +def operator_not_in(item: Any, container: Any): + return operator_not(operator_in(item, container)) + + @internal def get_rebind(obj: Any): if func := getattr(type(obj), "__rebind__", None): diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction index 74ce69762..0273ffb40 100644 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ b/packages/mecha/tests/resources/bolt_examples.mcfunction @@ -743,4 +743,4 @@ for a in [False, True]: for b in [False, True]: for c in [False, True]: for d in [False, True]: - print(a and b or c and not d) + print((a and b or c and not d) in [True] not in [False]) diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt index 8b8307d84..0dcef8d69 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt @@ -1,5 +1,7 @@ _mecha_lineno = [1], [1] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] +_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var26: @@ -46,12 +48,12 @@ with _mecha_runtime.scope() as _mecha_var26: if _mecha_var8: _mecha_var18 = 1 _mecha_var19 = 1 - _mecha_var18 = _mecha_var18 in _mecha_var19 + _mecha_var18 = _mecha_helper_operator_in(_mecha_var18, _mecha_var19) _mecha_var8 = _mecha_var18 if _mecha_var8: _mecha_var20 = 2 _mecha_var21 = 2 - _mecha_var20 = _mecha_var20 not in _mecha_var21 + _mecha_var20 = _mecha_helper_operator_not_in(_mecha_var20, _mecha_var21) _mecha_var8 = _mecha_var20 if _mecha_var8: _mecha_var22 = 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__0.txt b/packages/mecha/tests/snapshots/bolt__parse_199__0.txt index 95a9dd6b9..d5da3d370 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_199__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_199__0.txt @@ -2,15 +2,15 @@ for a in [False, True]: for b in [False, True]: for c in [False, True]: for d in [False, True]: - print(a and b or c and not d) + print((a and b or c and not d) in [True] not in [False]) --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=166, lineno=6, colno=1) + end_location: SourceLocation(pos=193, lineno=6, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) identifier: 'for:target:in:iterable:body' arguments: @@ -32,11 +32,11 @@ for a in [False, True]: value: True location: SourceLocation(pos=28, lineno=2, colno=5) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) commands: location: SourceLocation(pos=28, lineno=2, colno=5) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) identifier: 'for:target:in:iterable:body' arguments: @@ -58,11 +58,11 @@ for a in [False, True]: value: True location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) commands: location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) identifier: 'for:target:in:iterable:body' arguments: @@ -84,11 +84,11 @@ for a in [False, True]: value: True location: SourceLocation(pos=96, lineno=4, colno=13) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) commands: location: SourceLocation(pos=96, lineno=4, colno=13) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) identifier: 'for:target:in:iterable:body' arguments: @@ -110,16 +110,16 @@ for a in [False, True]: value: True location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) commands: location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) identifier: 'statement' arguments: location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=165, lineno=5, colno=46) + end_location: SourceLocation(pos=192, lineno=5, colno=73) value: location: SourceLocation(pos=136, lineno=5, colno=17) @@ -127,41 +127,69 @@ for a in [False, True]: value: 'print' arguments: - location: SourceLocation(pos=142, lineno=5, colno=23) - end_location: SourceLocation(pos=164, lineno=5, colno=45) - operator: 'or' + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=191, lineno=5, colno=72) + operator: 'not_in' left: - location: SourceLocation(pos=142, lineno=5, colno=23) - end_location: SourceLocation(pos=149, lineno=5, colno=30) - operator: 'and' + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=176, lineno=5, colno=57) + operator: 'in' left: - - location: SourceLocation(pos=142, lineno=5, colno=23) - end_location: SourceLocation(pos=143, lineno=5, colno=24) - value: 'a' + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + operator: 'or' + left: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=150, lineno=5, colno=31) + operator: 'and' + left: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=144, lineno=5, colno=25) + value: 'a' + right: + + location: SourceLocation(pos=149, lineno=5, colno=30) + end_location: SourceLocation(pos=150, lineno=5, colno=31) + value: 'b' + right: + + location: SourceLocation(pos=154, lineno=5, colno=35) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + operator: 'and' + left: + + location: SourceLocation(pos=154, lineno=5, colno=35) + end_location: SourceLocation(pos=155, lineno=5, colno=36) + value: 'c' + right: + + location: SourceLocation(pos=160, lineno=5, colno=41) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + operator: 'not' + value: + + location: SourceLocation(pos=164, lineno=5, colno=45) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + value: 'd' right: - - location: SourceLocation(pos=148, lineno=5, colno=29) - end_location: SourceLocation(pos=149, lineno=5, colno=30) - value: 'b' + + location: SourceLocation(pos=170, lineno=5, colno=51) + end_location: SourceLocation(pos=176, lineno=5, colno=57) + items: + + location: SourceLocation(pos=171, lineno=5, colno=52) + end_location: SourceLocation(pos=175, lineno=5, colno=56) + value: True right: - - location: SourceLocation(pos=153, lineno=5, colno=34) - end_location: SourceLocation(pos=164, lineno=5, colno=45) - operator: 'and' - left: - - location: SourceLocation(pos=153, lineno=5, colno=34) - end_location: SourceLocation(pos=154, lineno=5, colno=35) - value: 'c' - right: - - location: SourceLocation(pos=159, lineno=5, colno=40) - end_location: SourceLocation(pos=164, lineno=5, colno=45) - operator: 'not' - value: - - location: SourceLocation(pos=163, lineno=5, colno=44) - end_location: SourceLocation(pos=164, lineno=5, colno=45) - value: 'd' + + location: SourceLocation(pos=184, lineno=5, colno=65) + end_location: SourceLocation(pos=191, lineno=5, colno=72) + items: + + location: SourceLocation(pos=185, lineno=5, colno=66) + end_location: SourceLocation(pos=190, lineno=5, colno=71) + value: False diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt index 31091edcf..042052672 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt @@ -1,8 +1,10 @@ -_mecha_lineno = [1, 12, 16, 20, 22], [1, 2, 3, 4, 5] +_mecha_lineno = [1, 14, 18, 22, 24], [1, 2, 3, 4, 5] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] +_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var18: +with _mecha_runtime.scope() as _mecha_var22: _mecha_var0 = False _mecha_var1 = True _mecha_var2 = [_mecha_var0, _mecha_var1] @@ -32,14 +34,20 @@ with _mecha_runtime.scope() as _mecha_var18: _mecha_var17 = _mecha_helper_operator_not(_mecha_var17) _mecha_var16 = _mecha_var17 _mecha_var13 = _mecha_var16 + _mecha_var18 = True + _mecha_var19 = [_mecha_var18] + _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var19) + _mecha_var20 = False + _mecha_var21 = [_mecha_var20] + _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var21) _mecha_var12 = _mecha_var12(_mecha_var13) -_mecha_var19 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var18)) +_mecha_var23 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var22)) --- -output = _mecha_var19 +output = _mecha_var23 --- _mecha_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=166, lineno=6, colno=1) + end_location: SourceLocation(pos=193, lineno=6, colno=1) commands: diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 1c62d57f1..28e2b84e6 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -237,6 +237,12 @@ say hello say hello say hello say hello +say thing == 1 +say thing == 2 +say thing == 3 +say thing == 99 +say thing == hello +say thing == world ``` `@function demo:import_a` From 28d144b87f3ddd546e23c27604693165ac7f3bc7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 21:42:07 +0200 Subject: [PATCH 0766/1554] refactor: introduce if/else methods on accumulator --- packages/mecha/mecha/contrib/bolt/codegen.py | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index 4231f8323..f6b01b123 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -168,6 +168,20 @@ def statement(self, code: str, *, lineno: Any = None): self.lines.append(f"!lineno {lineno}\n") self.lines.append(f"{self.indentation}{code}\n") + @contextmanager + def if_statement(self, condition: str): + """Emit if statement.""" + self.statement(f"if {condition}:") + with self.block(): + yield + + @contextmanager + def else_statement(self): + """Emit else statement.""" + self.statement(f"else:") + with self.block(): + yield + @dataclass class ChildrenCollector: @@ -481,8 +495,7 @@ def if_statement( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: condition = yield from visit_single(node.arguments[0], required=True) - acc.statement(f"if {condition}:") - with acc.block(): + with acc.if_statement(condition): yield from visit_body(cast(AstRoot, node.arguments[1]), acc) return [] @@ -492,8 +505,7 @@ def else_statement( node: AstCommand, acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - acc.statement(f"else:") - with acc.block(): + with acc.else_statement(): yield from visit_body(cast(AstRoot, node.arguments[0]), acc) return [] @@ -660,8 +672,7 @@ def binary_logical( condition = acc.make_variable() value = acc.helper("operator_not", left) acc.statement(f"{condition} = {value}") - acc.statement(f"if {condition}:") - with acc.block(): + with acc.if_statement(condition): right = yield from visit_single(node.right, required=True) acc.statement(f"{left} = {right}") return [left] From 41a0faf924ecad35066d2857072f542979348991 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 21:55:28 +0200 Subject: [PATCH 0767/1554] refactor: strict comparison for rebind callback --- packages/mecha/mecha/contrib/bolt/codegen.py | 2 +- packages/mecha/tests/snapshots/bolt__parse_193__1.txt | 8 ++++---- packages/mecha/tests/snapshots/bolt__parse_194__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_197__1.txt | 4 ++-- packages/mecha/tests/snapshots/bolt__parse_34__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_46__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_53__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_55__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_57__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_77__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_81__1.txt | 2 +- packages/mecha/tests/snapshots/bolt__parse_82__1.txt | 4 ++-- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index f6b01b123..66ab3f78e 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -368,7 +368,7 @@ def visit_binding( rebind = acc.helper("get_rebind", target) acc.statement(f"_mecha_rebind = {rebind}", lineno=node) acc.statement(f"{target} {op} {value}") - acc.statement(f"if _mecha_rebind:") + acc.statement(f"if _mecha_rebind is not None:") with acc.block(): acc.statement(f"{target} = _mecha_rebind({target})") else: diff --git a/packages/mecha/tests/snapshots/bolt__parse_193__1.txt b/packages/mecha/tests/snapshots/bolt__parse_193__1.txt index 3d43b467e..9984b3fab 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_193__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_193__1.txt @@ -49,12 +49,12 @@ with _mecha_runtime.scope() as _mecha_var26: _mecha_var20 = 123 _mecha_rebind = _mecha_helper_get_rebind(a) a = _mecha_var20 - if _mecha_rebind: + if _mecha_rebind is not None: a = _mecha_rebind(a) _mecha_var21 = 456 _mecha_rebind = _mecha_helper_get_rebind(a) a = _mecha_var21 - if _mecha_rebind: + if _mecha_rebind is not None: a = _mecha_rebind(a) _mecha_var22 = GlobalScore _mecha_var23 = 'b' @@ -63,12 +63,12 @@ with _mecha_runtime.scope() as _mecha_var26: _mecha_var24 = 789 _mecha_rebind = _mecha_helper_get_rebind(b) b = _mecha_var24 - if _mecha_rebind: + if _mecha_rebind is not None: b = _mecha_rebind(b) _mecha_var25 = a _mecha_rebind = _mecha_helper_get_rebind(b) b = _mecha_var25 - if _mecha_rebind: + if _mecha_rebind is not None: b = _mecha_rebind(b) _mecha_var27 = _mecha_helper_replace(_mecha_refs[10], commands=_mecha_helper_children(_mecha_var26)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_194__1.txt b/packages/mecha/tests/snapshots/bolt__parse_194__1.txt index c294d89c2..026888a1f 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_194__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_194__1.txt @@ -15,7 +15,7 @@ with _mecha_runtime.scope() as _mecha_var11: _mecha_var1 = 1 _mecha_rebind = _mecha_helper_get_rebind(x) x += _mecha_var1 - if _mecha_rebind: + if _mecha_rebind is not None: x = _mecha_rebind(x) _mecha_var2 = x return _mecha_var2 diff --git a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt index 77ff83bac..8b301e001 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt @@ -11,13 +11,13 @@ with _mecha_runtime.scope() as _mecha_var5: _mecha_var2 = 1 _mecha_rebind = _mecha_helper_get_rebind(result) result = _mecha_var2 - if _mecha_rebind: + if _mecha_rebind is not None: result = _mecha_rebind(result) else: _mecha_var3 = 0 _mecha_rebind = _mecha_helper_get_rebind(result) result = _mecha_var3 - if _mecha_rebind: + if _mecha_rebind is not None: result = _mecha_rebind(result) _mecha_var4 = result return _mecha_var4 diff --git a/packages/mecha/tests/snapshots/bolt__parse_34__1.txt b/packages/mecha/tests/snapshots/bolt__parse_34__1.txt index 78203cefa..041ae9fae 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_34__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_34__1.txt @@ -12,7 +12,7 @@ with _mecha_runtime.scope() as _mecha_var4: _mecha_var3 = 0 _mecha_rebind = _mecha_helper_get_rebind(a) a = _mecha_var3 - if _mecha_rebind: + if _mecha_rebind is not None: a = _mecha_rebind(a) _mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_46__1.txt b/packages/mecha/tests/snapshots/bolt__parse_46__1.txt index c2e8cefc9..f88515afd 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_46__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_46__1.txt @@ -16,7 +16,7 @@ with _mecha_runtime.scope() as _mecha_var6: _mecha_var3 = _mecha_var3 - _mecha_var4 _mecha_rebind = _mecha_helper_get_rebind(count) count = _mecha_var3 - if _mecha_rebind: + if _mecha_rebind is not None: count = _mecha_rebind(count) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var5))]))]))]))) _mecha_var7 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var6)) diff --git a/packages/mecha/tests/snapshots/bolt__parse_53__1.txt b/packages/mecha/tests/snapshots/bolt__parse_53__1.txt index 9fff3e433..62dfab42e 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_53__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_53__1.txt @@ -8,7 +8,7 @@ with _mecha_runtime.scope() as _mecha_var2: _mecha_var1 = foo _mecha_rebind = _mecha_helper_get_rebind(foo) foo = _mecha_var1 - if _mecha_rebind: + if _mecha_rebind is not None: foo = _mecha_rebind(foo) _mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_55__1.txt b/packages/mecha/tests/snapshots/bolt__parse_55__1.txt index f856e8456..c998bf9f5 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_55__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_55__1.txt @@ -8,7 +8,7 @@ with _mecha_runtime.scope() as _mecha_var2: _mecha_var1 = foo _mecha_rebind = _mecha_helper_get_rebind(foo) foo = _mecha_var1 - if _mecha_rebind: + if _mecha_rebind is not None: foo = _mecha_rebind(foo) _mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_57__1.txt b/packages/mecha/tests/snapshots/bolt__parse_57__1.txt index 41d207357..87a71f344 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_57__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_57__1.txt @@ -8,7 +8,7 @@ with _mecha_runtime.scope() as _mecha_var2: _mecha_var1 = 'hey' _mecha_rebind = _mecha_helper_get_rebind(foo) foo += _mecha_var1 - if _mecha_rebind: + if _mecha_rebind is not None: foo = _mecha_rebind(foo) _mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_77__1.txt b/packages/mecha/tests/snapshots/bolt__parse_77__1.txt index 83dd11d0c..0b3ded24f 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_77__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_77__1.txt @@ -11,7 +11,7 @@ with _mecha_runtime.scope() as _mecha_var2: _mecha_var1 = a _mecha_rebind = _mecha_helper_get_rebind(b) b += _mecha_var1 - if _mecha_rebind: + if _mecha_rebind is not None: b = _mecha_rebind(b) _mecha_runtime.commands.append(_mecha_refs[0]) _mecha_var3 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2)) diff --git a/packages/mecha/tests/snapshots/bolt__parse_81__1.txt b/packages/mecha/tests/snapshots/bolt__parse_81__1.txt index f6dda2d4d..01a709a95 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_81__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_81__1.txt @@ -15,7 +15,7 @@ with _mecha_runtime.scope() as _mecha_var5: _mecha_var2 = _mecha_var2 * _mecha_var3 _mecha_rebind = _mecha_helper_get_rebind(x) x += _mecha_var2 - if _mecha_rebind: + if _mecha_rebind is not None: x = _mecha_rebind(x) _mecha_runtime.commands.append(_mecha_refs[1]) _mecha_var4 = wat diff --git a/packages/mecha/tests/snapshots/bolt__parse_82__1.txt b/packages/mecha/tests/snapshots/bolt__parse_82__1.txt index 286c22aeb..2147efbec 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_82__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_82__1.txt @@ -9,7 +9,7 @@ with _mecha_runtime.scope() as _mecha_var3: _mecha_var0 = _mecha_var0() _mecha_rebind = _mecha_helper_get_rebind(thing) thing += _mecha_var0 - if _mecha_rebind: + if _mecha_rebind is not None: thing = _mecha_rebind(thing) def bar(): global thing @@ -17,7 +17,7 @@ with _mecha_runtime.scope() as _mecha_var3: _mecha_var1 = _mecha_var1() _mecha_rebind = _mecha_helper_get_rebind(thing) thing += _mecha_var1 - if _mecha_rebind: + if _mecha_rebind is not None: thing = _mecha_rebind(thing) _mecha_var2 = bar _mecha_var2 = _mecha_var2() From 1cf7d95ef22fbe175e3c8de8c1bd82e008678bb7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Apr 2022 22:09:23 +0200 Subject: [PATCH 0768/1554] refactor: require non-reused temporary variable for if_statement() --- packages/mecha/mecha/contrib/bolt/codegen.py | 8 +- .../tests/snapshots/bolt__parse_17__1.txt | 127 ++++++++++-------- .../tests/snapshots/bolt__parse_199__1.txt | 40 +++--- .../tests/snapshots/bolt__parse_20__1.txt | 21 +-- 4 files changed, 103 insertions(+), 93 deletions(-) diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index 66ab3f78e..189d8fd71 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -667,11 +667,9 @@ def binary_logical( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: left = yield from visit_single(node.left, required=True) - condition = left - if node.operator == "or": - condition = acc.make_variable() - value = acc.helper("operator_not", left) - acc.statement(f"{condition} = {value}") + condition = acc.make_variable() + value = acc.helper("operator_not", left) if node.operator == "or" else left + acc.statement(f"{condition} = {value}") with acc.if_statement(condition): right = yield from visit_single(node.right, required=True) acc.statement(f"{left} = {right}") diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt index 0dcef8d69..8847e1185 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt @@ -4,71 +4,80 @@ _mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] _mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var26: +with _mecha_runtime.scope() as _mecha_var35: _mecha_var0 = False _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) if _mecha_var1: _mecha_var2 = True - if _mecha_var2: - _mecha_var3 = 'hello' - _mecha_var2 = _mecha_var3 + _mecha_var3 = _mecha_var2 + if _mecha_var3: + _mecha_var4 = 'hello' + _mecha_var2 = _mecha_var4 _mecha_var0 = _mecha_var2 - _mecha_var4 = _mecha_helper_operator_not(_mecha_var0) - if _mecha_var4: - _mecha_var5 = 'foo' - _mecha_var6 = 'bar' - _mecha_var5 = _mecha_var5 == _mecha_var6 - _mecha_var5 = _mecha_helper_operator_not(_mecha_var5) - _mecha_var0 = _mecha_var5 - _mecha_var7 = _mecha_helper_operator_not(_mecha_var0) - if _mecha_var7: - _mecha_var8 = 1 - _mecha_var9 = 2 - _mecha_var8 = _mecha_var8 != _mecha_var9 - if _mecha_var8: - _mecha_var10 = 1 - _mecha_var11 = 2 - _mecha_var10 = _mecha_var10 < _mecha_var11 - _mecha_var8 = _mecha_var10 - if _mecha_var8: - _mecha_var12 = 2 - _mecha_var13 = 3 - _mecha_var12 = _mecha_var12 <= _mecha_var13 - _mecha_var8 = _mecha_var12 - if _mecha_var8: - _mecha_var14 = 5 - _mecha_var15 = 4 - _mecha_var14 = _mecha_var14 > _mecha_var15 - _mecha_var8 = _mecha_var14 - if _mecha_var8: - _mecha_var16 = 6 - _mecha_var17 = 5 - _mecha_var16 = _mecha_var16 >= _mecha_var17 - _mecha_var8 = _mecha_var16 - if _mecha_var8: - _mecha_var18 = 1 - _mecha_var19 = 1 - _mecha_var18 = _mecha_helper_operator_in(_mecha_var18, _mecha_var19) - _mecha_var8 = _mecha_var18 - if _mecha_var8: - _mecha_var20 = 2 - _mecha_var21 = 2 - _mecha_var20 = _mecha_helper_operator_not_in(_mecha_var20, _mecha_var21) - _mecha_var8 = _mecha_var20 - if _mecha_var8: - _mecha_var22 = 3 - _mecha_var23 = 3 - _mecha_var22 = _mecha_var22 is _mecha_var23 - _mecha_var8 = _mecha_var22 - if _mecha_var8: - _mecha_var24 = 3 - _mecha_var25 = 3 - _mecha_var24 = _mecha_var24 is not _mecha_var25 - _mecha_var8 = _mecha_var24 - _mecha_var0 = _mecha_var8 -_mecha_var27 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var26)) + _mecha_var5 = _mecha_helper_operator_not(_mecha_var0) + if _mecha_var5: + _mecha_var6 = 'foo' + _mecha_var7 = 'bar' + _mecha_var6 = _mecha_var6 == _mecha_var7 + _mecha_var6 = _mecha_helper_operator_not(_mecha_var6) + _mecha_var0 = _mecha_var6 + _mecha_var8 = _mecha_helper_operator_not(_mecha_var0) + if _mecha_var8: + _mecha_var9 = 1 + _mecha_var10 = 2 + _mecha_var9 = _mecha_var9 != _mecha_var10 + _mecha_var11 = _mecha_var9 + if _mecha_var11: + _mecha_var12 = 1 + _mecha_var13 = 2 + _mecha_var12 = _mecha_var12 < _mecha_var13 + _mecha_var9 = _mecha_var12 + _mecha_var14 = _mecha_var9 + if _mecha_var14: + _mecha_var15 = 2 + _mecha_var16 = 3 + _mecha_var15 = _mecha_var15 <= _mecha_var16 + _mecha_var9 = _mecha_var15 + _mecha_var17 = _mecha_var9 + if _mecha_var17: + _mecha_var18 = 5 + _mecha_var19 = 4 + _mecha_var18 = _mecha_var18 > _mecha_var19 + _mecha_var9 = _mecha_var18 + _mecha_var20 = _mecha_var9 + if _mecha_var20: + _mecha_var21 = 6 + _mecha_var22 = 5 + _mecha_var21 = _mecha_var21 >= _mecha_var22 + _mecha_var9 = _mecha_var21 + _mecha_var23 = _mecha_var9 + if _mecha_var23: + _mecha_var24 = 1 + _mecha_var25 = 1 + _mecha_var24 = _mecha_helper_operator_in(_mecha_var24, _mecha_var25) + _mecha_var9 = _mecha_var24 + _mecha_var26 = _mecha_var9 + if _mecha_var26: + _mecha_var27 = 2 + _mecha_var28 = 2 + _mecha_var27 = _mecha_helper_operator_not_in(_mecha_var27, _mecha_var28) + _mecha_var9 = _mecha_var27 + _mecha_var29 = _mecha_var9 + if _mecha_var29: + _mecha_var30 = 3 + _mecha_var31 = 3 + _mecha_var30 = _mecha_var30 is _mecha_var31 + _mecha_var9 = _mecha_var30 + _mecha_var32 = _mecha_var9 + if _mecha_var32: + _mecha_var33 = 3 + _mecha_var34 = 3 + _mecha_var33 = _mecha_var33 is not _mecha_var34 + _mecha_var9 = _mecha_var33 + _mecha_var0 = _mecha_var9 +_mecha_var36 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var35)) --- -output = _mecha_var27 +output = _mecha_var36 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt index 042052672..dabdbf6b4 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt @@ -4,7 +4,7 @@ _mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] _mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var22: +with _mecha_runtime.scope() as _mecha_var24: _mecha_var0 = False _mecha_var1 = True _mecha_var2 = [_mecha_var0, _mecha_var1] @@ -23,27 +23,29 @@ with _mecha_runtime.scope() as _mecha_var22: for d in _mecha_var11: _mecha_var12 = print _mecha_var13 = a - if _mecha_var13: - _mecha_var14 = b - _mecha_var13 = _mecha_var14 - _mecha_var15 = _mecha_helper_operator_not(_mecha_var13) - if _mecha_var15: - _mecha_var16 = c - if _mecha_var16: - _mecha_var17 = d - _mecha_var17 = _mecha_helper_operator_not(_mecha_var17) - _mecha_var16 = _mecha_var17 - _mecha_var13 = _mecha_var16 - _mecha_var18 = True - _mecha_var19 = [_mecha_var18] - _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var19) - _mecha_var20 = False + _mecha_var14 = _mecha_var13 + if _mecha_var14: + _mecha_var15 = b + _mecha_var13 = _mecha_var15 + _mecha_var16 = _mecha_helper_operator_not(_mecha_var13) + if _mecha_var16: + _mecha_var17 = c + _mecha_var18 = _mecha_var17 + if _mecha_var18: + _mecha_var19 = d + _mecha_var19 = _mecha_helper_operator_not(_mecha_var19) + _mecha_var17 = _mecha_var19 + _mecha_var13 = _mecha_var17 + _mecha_var20 = True _mecha_var21 = [_mecha_var20] - _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var21) + _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var21) + _mecha_var22 = False + _mecha_var23 = [_mecha_var22] + _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var23) _mecha_var12 = _mecha_var12(_mecha_var13) -_mecha_var23 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var22)) +_mecha_var25 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var24)) --- -output = _mecha_var23 +output = _mecha_var25 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt index 77e624b65..546f3afa7 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt @@ -2,18 +2,19 @@ _mecha_lineno = [1], [1] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: +with _mecha_runtime.scope() as _mecha_var5: _mecha_var0 = True - if _mecha_var0: - _mecha_var1 = False - _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) - if _mecha_var2: - _mecha_var3 = True - _mecha_var1 = _mecha_var3 - _mecha_var0 = _mecha_var1 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) + _mecha_var1 = _mecha_var0 + if _mecha_var1: + _mecha_var2 = False + _mecha_var3 = _mecha_helper_operator_not(_mecha_var2) + if _mecha_var3: + _mecha_var4 = True + _mecha_var2 = _mecha_var4 + _mecha_var0 = _mecha_var2 +_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) --- -output = _mecha_var5 +output = _mecha_var6 --- _mecha_refs[0] From d80e850fd6c950df806c9d2ab42f8c9d1a6a2832 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 14 Apr 2022 00:11:56 +0200 Subject: [PATCH 0769/1554] feat: add branch overloading --- .../src/data/demo/functions/foo.mcfunction | 22 +++ packages/mecha/mecha/contrib/bolt/codegen.py | 15 +- packages/mecha/mecha/contrib/bolt/helpers.py | 32 +++- .../tests/snapshots/bolt__parse_130__1.txt | 13 +- .../tests/snapshots/bolt__parse_132__1.txt | 40 +++-- .../tests/snapshots/bolt__parse_133__1.txt | 40 +++-- .../tests/snapshots/bolt__parse_134__1.txt | 46 ++++-- .../tests/snapshots/bolt__parse_135__1.txt | 46 ++++-- .../tests/snapshots/bolt__parse_138__1.txt | 13 +- .../tests/snapshots/bolt__parse_139__1.txt | 39 +++-- .../tests/snapshots/bolt__parse_17__1.txt | 145 ++++++++++-------- .../tests/snapshots/bolt__parse_193__1.txt | 37 +++-- .../tests/snapshots/bolt__parse_196__1.txt | 19 ++- .../tests/snapshots/bolt__parse_197__1.txt | 31 ++-- .../tests/snapshots/bolt__parse_199__1.txt | 28 ++-- .../tests/snapshots/bolt__parse_20__1.txt | 17 +- .../tests/snapshots/bolt__parse_34__1.txt | 16 +- .../tests/snapshots/bolt__parse_35__1.txt | 32 ++-- .../tests/snapshots/bolt__parse_42__1.txt | 13 +- .../tests/snapshots/bolt__parse_43__1.txt | 8 +- .../tests/snapshots/bolt__parse_64__1.txt | 8 +- .../examples__build_bolt_basic__0.pack.md | 9 ++ 22 files changed, 428 insertions(+), 241 deletions(-) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 9ac804ba3..fd9dee866 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -520,3 +520,25 @@ def thing_equal(self, item): Thing = type("Thing", (), {"__within__": thing_within, "__contains__": thing_contains, "__eq__": thing_equal}) Thing() in [1, 2, 3] in [99] "world" in ("hello" in Thing()) + +from contextlib import contextmanager + +def dsl_init(self, score, inverted=False): + self.score = score + self.inverted = inverted + +def dsl_not(self): + return DSL(self.score, not self.inverted) + +def dsl_branch(self): + if score @s self.score matches int(not self.inverted): + yield True + +DSL = type("DSL", (), {"__init__": dsl_init, "__not__": dsl_not, "__branch__": contextmanager(dsl_branch)}) + +if DSL("foo"): + say yes + if DSL("bar"): + say with bar +else: + say no diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index 189d8fd71..485fbc9b6 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -77,6 +77,8 @@ class Accumulator: counter: int = 0 header: Dict[str, str] = field(default_factory=dict) + last_condition: str = "_mecha_error_last_condition" + def get_source(self) -> str: """Return the source code.""" header = "".join( @@ -171,15 +173,20 @@ def statement(self, code: str, *, lineno: Any = None): @contextmanager def if_statement(self, condition: str): """Emit if statement.""" - self.statement(f"if {condition}:") + branch = self.helper("branch", condition) + self.statement(f"with {branch} as _mecha_condition:") with self.block(): - yield + self.statement(f"if _mecha_condition:") + with self.block(): + yield + self.last_condition = condition @contextmanager def else_statement(self): """Emit else statement.""" - self.statement(f"else:") - with self.block(): + negated_value = self.helper("operator_not", self.last_condition) + self.statement(f"{self.last_condition} = {negated_value}") + with self.if_statement(self.last_condition): yield diff --git a/packages/mecha/mecha/contrib/bolt/helpers.py b/packages/mecha/mecha/contrib/bolt/helpers.py index f280b0097..04f1311ad 100644 --- a/packages/mecha/mecha/contrib/bolt/helpers.py +++ b/packages/mecha/mecha/contrib/bolt/helpers.py @@ -6,7 +6,8 @@ from dataclasses import dataclass, replace from functools import partial, wraps from importlib import import_module -from typing import Any, Callable, Dict +from types import TracebackType +from typing import Any, Callable, ContextManager, Dict, Optional, Type from uuid import UUID from tokenstream import set_location @@ -54,6 +55,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "operator_not": operator_not, "operator_in": operator_in, "operator_not_in": operator_not_in, + "branch": BranchDriver, "get_rebind": get_rebind, "get_attribute": get_attribute, "import_module": python_import_module, @@ -109,6 +111,34 @@ def operator_not_in(item: Any, container: Any): return operator_not(operator_in(item, container)) +class BranchDriver: + obj: Any + context_manager: Optional[ContextManager[Any]] + + @internal + def __init__(self, obj: Any): + self.obj = obj + self.context_manager = None + if func := getattr(type(obj), "__branch__", None): + self.context_manager = func(obj) + + @internal + def __enter__(self) -> Any: + if self.context_manager is not None: + return self.context_manager.__enter__() + return self.obj + + @internal + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> Optional[bool]: + if self.context_manager is not None: + return self.context_manager.__exit__(exc_type, exc, traceback) + + @internal def get_rebind(obj: Any): if func := getattr(type(obj), "__rebind__", None): diff --git a/packages/mecha/tests/snapshots/bolt__parse_130__1.txt b/packages/mecha/tests/snapshots/bolt__parse_130__1.txt index fb7d400f2..db07ead93 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_130__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_130__1.txt @@ -1,13 +1,18 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var2: with _mecha_runtime.scope() as _mecha_var1: _mecha_var0 = True - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - else: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1))]))]))]))]))) _mecha_var3 = _mecha_helper_replace(_mecha_refs[11], commands=_mecha_helper_children(_mecha_var2)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_132__1.txt b/packages/mecha/tests/snapshots/bolt__parse_132__1.txt index b4380c714..c97de844b 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_132__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_132__1.txt @@ -1,22 +1,34 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = 1 - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - else: - _mecha_var1 = 2 - if _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - else: - _mecha_var2 = 3 - if _mecha_var2: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - else: - _mecha_var3 = 4 - if _mecha_var3: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) _mecha_var5 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var4)) --- output = _mecha_var5 diff --git a/packages/mecha/tests/snapshots/bolt__parse_133__1.txt b/packages/mecha/tests/snapshots/bolt__parse_133__1.txt index 1fc8d7803..29692703a 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_133__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_133__1.txt @@ -1,22 +1,34 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = 1 - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - else: - _mecha_var1 = 2 - if _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - else: - _mecha_var2 = 3 - if _mecha_var2: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - else: - _mecha_var3 = 4 - if _mecha_var3: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) _mecha_runtime.commands.append(_mecha_refs[4]) _mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_134__1.txt b/packages/mecha/tests/snapshots/bolt__parse_134__1.txt index a19c8aef7..998a03f66 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_134__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_134__1.txt @@ -1,24 +1,38 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = 1 - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - else: - _mecha_var1 = 2 - if _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - else: - _mecha_var2 = 3 - if _mecha_var2: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - else: - _mecha_var3 = 4 - if _mecha_var3: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - else: - _mecha_runtime.commands.extend(_mecha_refs[4].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[4].commands) _mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) --- output = _mecha_var5 diff --git a/packages/mecha/tests/snapshots/bolt__parse_135__1.txt b/packages/mecha/tests/snapshots/bolt__parse_135__1.txt index 72b723ea3..ba16caa66 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_135__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_135__1.txt @@ -1,24 +1,38 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = 1 - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - else: - _mecha_var1 = 2 - if _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - else: - _mecha_var2 = 3 - if _mecha_var2: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - else: - _mecha_var3 = 4 - if _mecha_var3: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - else: - _mecha_runtime.commands.extend(_mecha_refs[4].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[4].commands) _mecha_runtime.commands.append(_mecha_refs[5]) _mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_138__1.txt b/packages/mecha/tests/snapshots/bolt__parse_138__1.txt index f2e9c378a..c91df75e6 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_138__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_138__1.txt @@ -1,14 +1,19 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var2: _mecha_var0 = True while _mecha_var0: _mecha_var1 = 'hello' - if _mecha_var1: - pass - else: - break + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + pass + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + break _mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) --- output = _mecha_var3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_139__1.txt b/packages/mecha/tests/snapshots/bolt__parse_139__1.txt index a4ba52aa9..6f034dc8f 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_139__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_139__1.txt @@ -1,9 +1,11 @@ -_mecha_lineno = [1, 13, 17, 22, 30], [1, 2, 3, 4, 6] +_mecha_lineno = [1, 15, 19, 25, 35], [1, 2, 3, 4, 6] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] with _mecha_runtime.scope() as _mecha_var10: _mecha_var0 = generate_tree @@ -18,22 +20,25 @@ with _mecha_runtime.scope() as _mecha_var10: _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'partition') _mecha_var4 = 5 _mecha_var3 = _mecha_var3(_mecha_var4) - if _mecha_var3: - _mecha_var5 = node - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'range') - _mecha_var5 = _mecha_helper_interpolate_range(_mecha_var5, _mecha_refs[1]) - _mecha_var6 = node - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'children') - _mecha_var6 = _mecha_helper_interpolate_resource_location(_mecha_var6, _mecha_refs[4]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[2], _mecha_refs[3], _mecha_var5, _mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var6]))]))]))]))) - else: - _mecha_var7 = node - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'range') - _mecha_var7 = _mecha_helper_interpolate_range(_mecha_var7, _mecha_refs[9]) - _mecha_var8 = node - _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'value') - _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[12]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[15], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_var7, _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[13], arguments=_mecha_helper_children([_mecha_var8]))]))]))]))) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_var5 = node + _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'range') + _mecha_var5 = _mecha_helper_interpolate_range(_mecha_var5, _mecha_refs[1]) + _mecha_var6 = node + _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'children') + _mecha_var6 = _mecha_helper_interpolate_resource_location(_mecha_var6, _mecha_refs[4]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[2], _mecha_refs[3], _mecha_var5, _mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var6]))]))]))]))) + _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_var7 = node + _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'range') + _mecha_var7 = _mecha_helper_interpolate_range(_mecha_var7, _mecha_refs[9]) + _mecha_var8 = node + _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'value') + _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[12]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[15], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_var7, _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[13], arguments=_mecha_helper_children([_mecha_var8]))]))]))]))) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[18], arguments=_mecha_helper_children([_mecha_var2, _mecha_helper_replace(_mecha_refs[17], commands=_mecha_helper_children(_mecha_var9))]))) _mecha_var11 = _mecha_helper_replace(_mecha_refs[19], commands=_mecha_helper_children(_mecha_var10)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt index 8847e1185..c7e5ad77e 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt @@ -1,5 +1,6 @@ _mecha_lineno = [1], [1] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] _mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] @@ -7,74 +8,86 @@ _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var35: _mecha_var0 = False _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) - if _mecha_var1: - _mecha_var2 = True - _mecha_var3 = _mecha_var2 - if _mecha_var3: - _mecha_var4 = 'hello' - _mecha_var2 = _mecha_var4 - _mecha_var0 = _mecha_var2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = True + _mecha_var3 = _mecha_var2 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_var4 = 'hello' + _mecha_var2 = _mecha_var4 + _mecha_var0 = _mecha_var2 _mecha_var5 = _mecha_helper_operator_not(_mecha_var0) - if _mecha_var5: - _mecha_var6 = 'foo' - _mecha_var7 = 'bar' - _mecha_var6 = _mecha_var6 == _mecha_var7 - _mecha_var6 = _mecha_helper_operator_not(_mecha_var6) - _mecha_var0 = _mecha_var6 + with _mecha_helper_branch(_mecha_var5) as _mecha_condition: + if _mecha_condition: + _mecha_var6 = 'foo' + _mecha_var7 = 'bar' + _mecha_var6 = _mecha_var6 == _mecha_var7 + _mecha_var6 = _mecha_helper_operator_not(_mecha_var6) + _mecha_var0 = _mecha_var6 _mecha_var8 = _mecha_helper_operator_not(_mecha_var0) - if _mecha_var8: - _mecha_var9 = 1 - _mecha_var10 = 2 - _mecha_var9 = _mecha_var9 != _mecha_var10 - _mecha_var11 = _mecha_var9 - if _mecha_var11: - _mecha_var12 = 1 - _mecha_var13 = 2 - _mecha_var12 = _mecha_var12 < _mecha_var13 - _mecha_var9 = _mecha_var12 - _mecha_var14 = _mecha_var9 - if _mecha_var14: - _mecha_var15 = 2 - _mecha_var16 = 3 - _mecha_var15 = _mecha_var15 <= _mecha_var16 - _mecha_var9 = _mecha_var15 - _mecha_var17 = _mecha_var9 - if _mecha_var17: - _mecha_var18 = 5 - _mecha_var19 = 4 - _mecha_var18 = _mecha_var18 > _mecha_var19 - _mecha_var9 = _mecha_var18 - _mecha_var20 = _mecha_var9 - if _mecha_var20: - _mecha_var21 = 6 - _mecha_var22 = 5 - _mecha_var21 = _mecha_var21 >= _mecha_var22 - _mecha_var9 = _mecha_var21 - _mecha_var23 = _mecha_var9 - if _mecha_var23: - _mecha_var24 = 1 - _mecha_var25 = 1 - _mecha_var24 = _mecha_helper_operator_in(_mecha_var24, _mecha_var25) - _mecha_var9 = _mecha_var24 - _mecha_var26 = _mecha_var9 - if _mecha_var26: - _mecha_var27 = 2 - _mecha_var28 = 2 - _mecha_var27 = _mecha_helper_operator_not_in(_mecha_var27, _mecha_var28) - _mecha_var9 = _mecha_var27 - _mecha_var29 = _mecha_var9 - if _mecha_var29: - _mecha_var30 = 3 - _mecha_var31 = 3 - _mecha_var30 = _mecha_var30 is _mecha_var31 - _mecha_var9 = _mecha_var30 - _mecha_var32 = _mecha_var9 - if _mecha_var32: - _mecha_var33 = 3 - _mecha_var34 = 3 - _mecha_var33 = _mecha_var33 is not _mecha_var34 - _mecha_var9 = _mecha_var33 - _mecha_var0 = _mecha_var9 + with _mecha_helper_branch(_mecha_var8) as _mecha_condition: + if _mecha_condition: + _mecha_var9 = 1 + _mecha_var10 = 2 + _mecha_var9 = _mecha_var9 != _mecha_var10 + _mecha_var11 = _mecha_var9 + with _mecha_helper_branch(_mecha_var11) as _mecha_condition: + if _mecha_condition: + _mecha_var12 = 1 + _mecha_var13 = 2 + _mecha_var12 = _mecha_var12 < _mecha_var13 + _mecha_var9 = _mecha_var12 + _mecha_var14 = _mecha_var9 + with _mecha_helper_branch(_mecha_var14) as _mecha_condition: + if _mecha_condition: + _mecha_var15 = 2 + _mecha_var16 = 3 + _mecha_var15 = _mecha_var15 <= _mecha_var16 + _mecha_var9 = _mecha_var15 + _mecha_var17 = _mecha_var9 + with _mecha_helper_branch(_mecha_var17) as _mecha_condition: + if _mecha_condition: + _mecha_var18 = 5 + _mecha_var19 = 4 + _mecha_var18 = _mecha_var18 > _mecha_var19 + _mecha_var9 = _mecha_var18 + _mecha_var20 = _mecha_var9 + with _mecha_helper_branch(_mecha_var20) as _mecha_condition: + if _mecha_condition: + _mecha_var21 = 6 + _mecha_var22 = 5 + _mecha_var21 = _mecha_var21 >= _mecha_var22 + _mecha_var9 = _mecha_var21 + _mecha_var23 = _mecha_var9 + with _mecha_helper_branch(_mecha_var23) as _mecha_condition: + if _mecha_condition: + _mecha_var24 = 1 + _mecha_var25 = 1 + _mecha_var24 = _mecha_helper_operator_in(_mecha_var24, _mecha_var25) + _mecha_var9 = _mecha_var24 + _mecha_var26 = _mecha_var9 + with _mecha_helper_branch(_mecha_var26) as _mecha_condition: + if _mecha_condition: + _mecha_var27 = 2 + _mecha_var28 = 2 + _mecha_var27 = _mecha_helper_operator_not_in(_mecha_var27, _mecha_var28) + _mecha_var9 = _mecha_var27 + _mecha_var29 = _mecha_var9 + with _mecha_helper_branch(_mecha_var29) as _mecha_condition: + if _mecha_condition: + _mecha_var30 = 3 + _mecha_var31 = 3 + _mecha_var30 = _mecha_var30 is _mecha_var31 + _mecha_var9 = _mecha_var30 + _mecha_var32 = _mecha_var9 + with _mecha_helper_branch(_mecha_var32) as _mecha_condition: + if _mecha_condition: + _mecha_var33 = 3 + _mecha_var34 = 3 + _mecha_var33 = _mecha_var33 is not _mecha_var34 + _mecha_var9 = _mecha_var33 + _mecha_var0 = _mecha_var9 _mecha_var36 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var35)) --- output = _mecha_var36 diff --git a/packages/mecha/tests/snapshots/bolt__parse_193__1.txt b/packages/mecha/tests/snapshots/bolt__parse_193__1.txt index 9984b3fab..d3831e70e 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_193__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_193__1.txt @@ -1,8 +1,10 @@ -_mecha_lineno = [1, 10, 14, 19, 27, 33, 35, 45, 50, 55, 59, 64, 68], [1, 2, 5, 6, 8, 9, 11, 13, 14, 15, 17, 18, 19] +_mecha_lineno = [1, 12, 16, 22, 32, 38, 40, 50, 55, 60, 64, 69, 73], [1, 2, 5, 6, 8, 9, 11, 13, 14, 15, 17, 18, 19] _mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] _mecha_helper_interpolate_entity = _mecha_runtime.helpers['interpolate_entity'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_interpolate_numeric = _mecha_runtime.helpers['interpolate_numeric'] _mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] with _mecha_runtime.scope() as _mecha_var26: @@ -15,21 +17,24 @@ with _mecha_runtime.scope() as _mecha_var26: _mecha_var3 = rhs _mecha_var4 = GlobalScore _mecha_var2 = _mecha_var2(_mecha_var3, _mecha_var4) - if _mecha_var2: - _mecha_var5 = self - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'name') - _mecha_var5 = _mecha_helper_interpolate_entity(_mecha_var5, _mecha_refs[0]) - _mecha_var6 = rhs - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'name') - _mecha_var6 = _mecha_helper_interpolate_entity(_mecha_var6, _mecha_refs[1]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var5, _mecha_refs[2], _mecha_refs[3], _mecha_var6, _mecha_refs[4]]))) - else: - _mecha_var7 = self - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'name') - _mecha_var7 = _mecha_helper_interpolate_entity(_mecha_var7, _mecha_refs[6]) - _mecha_var8 = rhs - _mecha_var8 = _mecha_helper_interpolate_numeric(_mecha_var8, _mecha_refs[7]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_var7, _mecha_refs[8], _mecha_var8]))) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var5 = self + _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'name') + _mecha_var5 = _mecha_helper_interpolate_entity(_mecha_var5, _mecha_refs[0]) + _mecha_var6 = rhs + _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'name') + _mecha_var6 = _mecha_helper_interpolate_entity(_mecha_var6, _mecha_refs[1]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var5, _mecha_refs[2], _mecha_refs[3], _mecha_var6, _mecha_refs[4]]))) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var7 = self + _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'name') + _mecha_var7 = _mecha_helper_interpolate_entity(_mecha_var7, _mecha_refs[6]) + _mecha_var8 = rhs + _mecha_var8 = _mecha_helper_interpolate_numeric(_mecha_var8, _mecha_refs[7]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_var7, _mecha_refs[8], _mecha_var8]))) _mecha_var9 = self return _mecha_var9 _mecha_var10 = type diff --git a/packages/mecha/tests/snapshots/bolt__parse_196__1.txt b/packages/mecha/tests/snapshots/bolt__parse_196__1.txt index 2c4dff889..4cfbb56a7 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_196__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_196__1.txt @@ -1,15 +1,20 @@ -_mecha_lineno = [1, 6, 9, 12, 13], [1, 2, 3, 5, 6] +_mecha_lineno = [1, 8, 12, 17, 18], [1, 2, 3, 5, 6] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var4: def foo(value): _mecha_var0 = value - if _mecha_var0: - _mecha_var1 = 1 - result = _mecha_var1 - else: - _mecha_var2 = 0 - result = _mecha_var2 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 1 + result = _mecha_var1 + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 0 + result = _mecha_var2 _mecha_var3 = result return _mecha_var3 _mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) diff --git a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt index 8b301e001..e6af3f78c 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt @@ -1,24 +1,29 @@ -_mecha_lineno = [1, 8, 9, 12, 18, 22], [1, 2, 3, 4, 6, 7] +_mecha_lineno = [1, 10, 11, 15, 23, 27], [1, 2, 3, 4, 6, 7] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] _mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var5: def foo(value): _mecha_var0 = 'init' result = _mecha_var0 _mecha_var1 = value - if _mecha_var1: - _mecha_var2 = 1 - _mecha_rebind = _mecha_helper_get_rebind(result) - result = _mecha_var2 - if _mecha_rebind is not None: - result = _mecha_rebind(result) - else: - _mecha_var3 = 0 - _mecha_rebind = _mecha_helper_get_rebind(result) - result = _mecha_var3 - if _mecha_rebind is not None: - result = _mecha_rebind(result) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 1 + _mecha_rebind = _mecha_helper_get_rebind(result) + result = _mecha_var2 + if _mecha_rebind is not None: + result = _mecha_rebind(result) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 0 + _mecha_rebind = _mecha_helper_get_rebind(result) + result = _mecha_var3 + if _mecha_rebind is not None: + result = _mecha_rebind(result) _mecha_var4 = result return _mecha_var4 _mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt index dabdbf6b4..9259152fc 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt @@ -1,4 +1,5 @@ -_mecha_lineno = [1, 14, 18, 22, 24], [1, 2, 3, 4, 5] +_mecha_lineno = [1, 15, 19, 23, 25], [1, 2, 3, 4, 5] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] _mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] @@ -24,18 +25,21 @@ with _mecha_runtime.scope() as _mecha_var24: _mecha_var12 = print _mecha_var13 = a _mecha_var14 = _mecha_var13 - if _mecha_var14: - _mecha_var15 = b - _mecha_var13 = _mecha_var15 + with _mecha_helper_branch(_mecha_var14) as _mecha_condition: + if _mecha_condition: + _mecha_var15 = b + _mecha_var13 = _mecha_var15 _mecha_var16 = _mecha_helper_operator_not(_mecha_var13) - if _mecha_var16: - _mecha_var17 = c - _mecha_var18 = _mecha_var17 - if _mecha_var18: - _mecha_var19 = d - _mecha_var19 = _mecha_helper_operator_not(_mecha_var19) - _mecha_var17 = _mecha_var19 - _mecha_var13 = _mecha_var17 + with _mecha_helper_branch(_mecha_var16) as _mecha_condition: + if _mecha_condition: + _mecha_var17 = c + _mecha_var18 = _mecha_var17 + with _mecha_helper_branch(_mecha_var18) as _mecha_condition: + if _mecha_condition: + _mecha_var19 = d + _mecha_var19 = _mecha_helper_operator_not(_mecha_var19) + _mecha_var17 = _mecha_var19 + _mecha_var13 = _mecha_var17 _mecha_var20 = True _mecha_var21 = [_mecha_var20] _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var21) diff --git a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt index 546f3afa7..4b5690a4a 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt @@ -1,17 +1,20 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var5: _mecha_var0 = True _mecha_var1 = _mecha_var0 - if _mecha_var1: - _mecha_var2 = False - _mecha_var3 = _mecha_helper_operator_not(_mecha_var2) - if _mecha_var3: - _mecha_var4 = True - _mecha_var2 = _mecha_var4 - _mecha_var0 = _mecha_var2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = False + _mecha_var3 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_var4 = True + _mecha_var2 = _mecha_var4 + _mecha_var0 = _mecha_var2 _mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) --- output = _mecha_var6 diff --git a/packages/mecha/tests/snapshots/bolt__parse_34__1.txt b/packages/mecha/tests/snapshots/bolt__parse_34__1.txt index 041ae9fae..566977c24 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_34__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_34__1.txt @@ -1,4 +1,5 @@ -_mecha_lineno = [1, 8, 13], [1, 2, 3] +_mecha_lineno = [1, 9, 15], [1, 2, 3] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] @@ -8,12 +9,13 @@ with _mecha_runtime.scope() as _mecha_var4: _mecha_var1 = a _mecha_var2 = 1 _mecha_var1 = _mecha_var1 == _mecha_var2 - if _mecha_var1: - _mecha_var3 = 0 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var3 - if _mecha_rebind is not None: - a = _mecha_rebind(a) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 0 + _mecha_rebind = _mecha_helper_get_rebind(a) + a = _mecha_var3 + if _mecha_rebind is not None: + a = _mecha_rebind(a) _mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) --- output = _mecha_var5 diff --git a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt index 02c8ffdaf..ea3012fc9 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt @@ -1,21 +1,29 @@ _mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var4: _mecha_var0 = True - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - else: - _mecha_var1 = True - _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) - if _mecha_var2: - _mecha_var3 = False - _mecha_var1 = _mecha_var3 - if _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - else: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = True + _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = False + _mecha_var1 = _mecha_var3 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) _mecha_var5 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var4)) --- output = _mecha_var5 diff --git a/packages/mecha/tests/snapshots/bolt__parse_42__1.txt b/packages/mecha/tests/snapshots/bolt__parse_42__1.txt index c276da694..004265c21 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_42__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_42__1.txt @@ -1,4 +1,5 @@ -_mecha_lineno = [1, 8, 13], [1, 2, 4] +_mecha_lineno = [1, 9, 15], [1, 2, 4] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var5: @@ -6,13 +7,15 @@ with _mecha_runtime.scope() as _mecha_var5: _mecha_var0 = 'thing' _mecha_var1 = 'bar' _mecha_var0 = _mecha_var0 == _mecha_var1 - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) _mecha_var2 = 'thing' _mecha_var3 = 'foo' _mecha_var2 = _mecha_var2 == _mecha_var3 - if _mecha_var2: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var4))]))]))]))) _mecha_var6 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var5)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_43__1.txt b/packages/mecha/tests/snapshots/bolt__parse_43__1.txt index 9f9bd2871..3a4e67e61 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_43__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_43__1.txt @@ -1,4 +1,5 @@ -_mecha_lineno = [1, 8], [1, 2] +_mecha_lineno = [1, 9], [1, 2] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var3: @@ -6,8 +7,9 @@ with _mecha_runtime.scope() as _mecha_var3: _mecha_var0 = 'thing' _mecha_var1 = 'foo' _mecha_var0 = _mecha_var0 == _mecha_var1 - if _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2))]))]))]))) _mecha_var4 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var3)) --- diff --git a/packages/mecha/tests/snapshots/bolt__parse_64__1.txt b/packages/mecha/tests/snapshots/bolt__parse_64__1.txt index 43fa829c8..8f72edbe3 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_64__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_64__1.txt @@ -1,4 +1,5 @@ -_mecha_lineno = [1, 7], [1, 2] +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] with _mecha_runtime.scope() as _mecha_var3: @@ -7,8 +8,9 @@ with _mecha_runtime.scope() as _mecha_var3: _mecha_var1 = i _mecha_var2 = 'b' _mecha_var1 = _mecha_var1 == _mecha_var2 - if _mecha_var1: - break + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + break _mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) --- output = _mecha_var4 diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 28e2b84e6..50435afe0 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -243,6 +243,8 @@ say thing == 3 say thing == 99 say thing == hello say thing == world +execute if score @s foo matches 1 run function demo:foo/nested_execute_1 +execute if score @s foo matches 0 run say no ``` `@function demo:import_a` @@ -299,6 +301,13 @@ say 1 say 2 ``` +`@function demo:foo/nested_execute_1` + +```mcfunction +say yes +execute if score @s bar matches 1 run say with bar +``` + `@function demo:foo/tree_0/0_7` ```mcfunction From 54d5c82e3e5c0854caeed7b197f1a6644d946a88 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 13 Apr 2022 22:15:54 +0000 Subject: [PATCH 0770/1554] 0.45.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index ff1c14375..2cd2f523e 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.45.0 (2022-04-13) +### Feature +* Add branch overloading ([`2a7f821`](https://github.com/mcbeet/mecha/commit/2a7f821a39e1e11afdb4f509f4189fd081f5999e)) +* Improve in operator overloading ([`bb706b0`](https://github.com/mcbeet/mecha/commit/bb706b08e8228dfeeb5da01a0d8a198c02f29f98)) +* Add not operator overloading ([`7a6a387`](https://github.com/mcbeet/mecha/commit/7a6a38791154edbb31b40287e7ff5140bd3c1359)) +* Empty lookup now means full slice ([`1567e9d`](https://github.com/mcbeet/mecha/commit/1567e9d8e298136b111569f1e5e04d5d6bd1d767)) + ## v0.44.0 (2022-04-13) ### Feature * Better errors for undefined identifiers ([`7424ddf`](https://github.com/mcbeet/mecha/commit/7424ddf6748582567ab8841bf1d1f7ea97e40b45)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index af18bf118..45e3efafd 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.44.0" +__version__ = "0.45.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 7a4f69ee2..fda073633 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.44.0" +version = "0.45.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 491a2c0a6fe1a28fe40eec6e37f60567ae18879b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 14 Apr 2022 23:58:47 +0200 Subject: [PATCH 0771/1554] fix: remove unnecessary isinstance check since AstJson.evaluate() always returns a json value --- .../src/data/demo/functions/foo.mcfunction | 17 +++++++++++++++ .../mecha/mecha/contrib/nested_resources.py | 10 +-------- .../examples__build_bolt_basic__0.pack.md | 21 +++++++++++++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index fd9dee866..f01190639 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -542,3 +542,20 @@ if DSL("foo"): say with bar else: say no + +predicate ./check_scores [ + { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "foo": 1 + } + }, + { + "condition": "minecraft:entity_scores", + "entity": "killer_player", + "scores": { + "bar": 1 + } + } +] diff --git a/packages/mecha/mecha/contrib/nested_resources.py b/packages/mecha/mecha/contrib/nested_resources.py index 95d5498b7..492458d28 100644 --- a/packages/mecha/mecha/contrib/nested_resources.py +++ b/packages/mecha/mecha/contrib/nested_resources.py @@ -115,17 +115,9 @@ def nested_resources(self, node: AstRoot): else: proxy = data[file_type] - if not isinstance(value := content.evaluate(), dict): - d = Diagnostic( - level="error", - message=f"Invalid json object of type {type(value)}.", - ) - diagnostics.add(set_location(d, content)) - continue - full_name = name.get_canonical_value() file_instance = file_type( # type: ignore - value, + content.evaluate(), original=self.database.current.original, ) diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 50435afe0..6441348c7 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -549,6 +549,27 @@ say that's neat } ``` +`@predicate demo:check_scores` + +```json +[ + { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "foo": 1 + } + }, + { + "condition": "minecraft:entity_scores", + "entity": "killer_player", + "scores": { + "bar": 1 + } + } +] +``` + ### felix `@function_tag felix:howdy` From 93a12dd4e1af7df02c2057095fdfa7ac563d7624 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 15 Apr 2022 02:42:42 +0200 Subject: [PATCH 0772/1554] fix: better error when mutating free variable --- packages/mecha/mecha/contrib/bolt/parse.py | 37 ++++++++++++------- packages/mecha/mecha/diagnostic.py | 2 +- .../tests/resources/bolt_examples.mcfunction | 4 ++ .../tests/snapshots/bolt__parse_125__0.txt | 2 +- .../tests/snapshots/bolt__parse_195__0.txt | 2 +- .../tests/snapshots/bolt__parse_200__0.txt | 11 ++++++ 6 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 packages/mecha/tests/snapshots/bolt__parse_200__0.txt diff --git a/packages/mecha/mecha/contrib/bolt/parse.py b/packages/mecha/mecha/contrib/bolt/parse.py index 3c7f90338..cc9efe99c 100644 --- a/packages/mecha/mecha/contrib/bolt/parse.py +++ b/packages/mecha/mecha/contrib/bolt/parse.py @@ -43,10 +43,10 @@ import re from dataclasses import dataclass, field, replace from difflib import get_close_matches -from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, cast +from typing import Any, Dict, List, Optional, Set, Tuple, cast from beet.core.utils import required_field -from tokenstream import InvalidSyntax, Token, TokenStream, UnexpectedToken, set_location +from tokenstream import InvalidSyntax, Token, TokenStream, set_location from mecha import ( AlternativeParser, @@ -352,14 +352,16 @@ def get_stream_branch_scope(stream: TokenStream) -> Set[str]: return stream.data.setdefault("branch_scope", set()) -class UndefinedIdentifier(UnexpectedToken): +class UndefinedIdentifier(InvalidSyntax): """Raised when an identifier is not defined.""" - identifiers: Tuple[str, ...] + token: Token + identifiers: Set[str] - def __init__(self, token: Token, identifiers: Iterable[str]): - super().__init__(token) - self.identifiers = tuple(identifiers) + def __init__(self, token: Token, identifiers: Set[str]): + super().__init__(token, identifiers) + self.token = token + self.identifiers = identifiers def __str__(self) -> str: msg = f"Identifier {self.token.value!r} is not defined." @@ -558,6 +560,11 @@ def parse_statement(stream: TokenStream) -> Any: ) node = set_location(node, node.target, node.value) + # Make sure that the statement is not followed by anything. + current_index = stream.index + stream.expect("newline", "eof") + stream.index = current_index + return node @@ -579,16 +586,20 @@ def __call__(self, stream: TokenStream) -> AstTarget: with stream.syntax(identifier=IDENTIFIER_PATTERN, comma=r","): while True: token = stream.expect("identifier") - rebind = ( - token.value in identifiers and token.value in identifiers_storage - ) + is_defined = token.value in identifiers + with_storage = token.value in identifiers_storage + rebind = is_defined and with_storage if self.allow_undefined_identifiers: pending_identifiers.add(token.value) - if token.value not in identifiers_storage: + if not with_storage: pending_identifiers_storage[token.value] = "local" elif not rebind: - exc = UndefinedIdentifier(token, identifiers) + exc = UndefinedIdentifier(token, set(identifiers_storage)) + if is_defined and not with_storage: + exc.notes.append( + f"Use 'global {token.value}' or 'nonlocal {token.value}' to mutate the variable defined in outer scope." + ) raise set_location(exc, token) target = AstTargetIdentifier(value=token.value, rebind=rebind) @@ -812,7 +823,7 @@ def parse_identifier(stream: TokenStream) -> AstIdentifier: token = stream.expect("identifier") if token.value not in identifiers: - exc = UndefinedIdentifier(token, identifiers) + exc = UndefinedIdentifier(token, set(identifiers)) raise set_location(exc, token) return set_location(AstIdentifier(value=token.value), token) diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index d1ececdd9..3337ba4aa 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -44,7 +44,7 @@ def format_message(self) -> str: def format_notes(self) -> str: """Return the formatted notes.""" - return "Notes:\n" + "\n".join(f" - {note}\n" for note in self.notes) + return "Notes:\n" + "\n".join(f" - {note}" for note in self.notes) def format_location(self) -> str: """Return the formatted location of the reported message.""" diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction index 0273ffb40..474bebef0 100644 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ b/packages/mecha/tests/resources/bolt_examples.mcfunction @@ -744,3 +744,7 @@ for a in [False, True]: for c in [False, True]: for d in [False, True]: print((a and b or c and not d) in [True] not in [False]) +### +a = 1 +def f(): + a += 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_125__0.txt b/packages/mecha/tests/snapshots/bolt__parse_125__0.txt index c0e41819f..2a9b6d942 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_125__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_125__0.txt @@ -1,5 +1,5 @@ import math -#>ERROR Identifier 'mah' is not defined. Did you mean 'math', 'max' or 'map'? +#>ERROR Identifier 'mah' is not defined. # line 2, column 1 # 1 | import math # 2 | mah.sin(1) diff --git a/packages/mecha/tests/snapshots/bolt__parse_195__0.txt b/packages/mecha/tests/snapshots/bolt__parse_195__0.txt index 2a2f36a74..47b76fd5c 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_195__0.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_195__0.txt @@ -1,5 +1,5 @@ for i in range(3): -#>ERROR Identifier 'parent' is not defined. Did you mean 'print'? +#>ERROR Identifier 'parent' is not defined. # line 2, column 5 # 1 | for i in range(3): # 2 | parent[i] = f"param{i}" diff --git a/packages/mecha/tests/snapshots/bolt__parse_200__0.txt b/packages/mecha/tests/snapshots/bolt__parse_200__0.txt new file mode 100644 index 000000000..7d6270463 --- /dev/null +++ b/packages/mecha/tests/snapshots/bolt__parse_200__0.txt @@ -0,0 +1,11 @@ +a = 1 +def f(): +#>ERROR Identifier 'a' is not defined. +# line 3, column 5 +# 2 | def f(): +# 3 | a += 1 +# : ^ +# Notes: +# - Use 'global a' or 'nonlocal a' to mutate the variable defined in outer scope. +# - Expected assignment, eof or newline but got literal '+='. + a += 1 From 2f7f34f416f095766219fe29a76f0f0cf819cfa0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 15 Apr 2022 00:43:59 +0000 Subject: [PATCH 0773/1554] 0.45.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 2cd2f523e..887033173 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.45.1 (2022-04-15) +### Fix +* Better error when mutating free variable ([`09330b8`](https://github.com/mcbeet/mecha/commit/09330b872afbb99c1b14285d271c6d5b9462466d)) +* Remove unnecessary isinstance check since AstJson.evaluate() always returns a json value ([`e31f1ae`](https://github.com/mcbeet/mecha/commit/e31f1aee6508b6c5958f8ea0a321a69c3ad5ab6a)) + ## v0.45.0 (2022-04-13) ### Feature * Add branch overloading ([`2a7f821`](https://github.com/mcbeet/mecha/commit/2a7f821a39e1e11afdb4f509f4189fd081f5999e)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 45e3efafd..bd4b8352b 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.45.0" +__version__ = "0.45.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index fda073633..e86eecaaf 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.45.0" +version = "0.45.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From de7b6019d242d9e45c2073fee80429c84c3f3495 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 16 Apr 2022 23:50:40 +0200 Subject: [PATCH 0774/1554] feat: make it possible to overload logical expressions --- .../src/data/demo/functions/foo.mcfunction | 44 +++ packages/mecha/mecha/contrib/bolt/codegen.py | 26 +- packages/mecha/mecha/contrib/bolt/helpers.py | 8 + .../tests/snapshots/bolt__parse_17__1.txt | 250 +++++++++++++----- .../tests/snapshots/bolt__parse_199__1.txt | 71 +++-- .../tests/snapshots/bolt__parse_20__1.txt | 38 ++- .../tests/snapshots/bolt__parse_35__1.txt | 23 +- .../examples__build_bolt_basic__0.pack.md | 8 + 8 files changed, 360 insertions(+), 108 deletions(-) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index f01190639..d008abe84 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -559,3 +559,47 @@ predicate ./check_scores [ } } ] + +def cond_init(self, name=generate_id("tmp{incr}")): + self.name = name + +def cond_str(self): + return self.name + +def cond_not(self): + result = Cond() + result = 1 + unless score global self matches 0: + result = 0 + return result + +def cond_dup(self): + result = Cond() + result = self + return result + +def cond_rebind(self, rhs): + if isinstance(rhs, Cond): + scoreboard players operation global self = global rhs + else: + scoreboard players set global self rhs + return self + +def cond_branch(self): + unless score global self matches 0: + yield True + +Cond = type("Cond", (), { + "__init__": cond_init, + "__str__": cond_str, + "__not__": cond_not, + "__dup__": cond_dup, + "__rebind__": cond_rebind, + "__branch__": contextmanager(cond_branch), +}) + +is_awesome = Cond("is_awesome") +is_awesome = Cond("is_cool") and Cond("is_nice") + +if is_awesome or Cond("force_awesomeness"): + say hello diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py index 485fbc9b6..6f08a2d87 100644 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ b/packages/mecha/mecha/contrib/bolt/codegen.py @@ -674,12 +674,34 @@ def binary_logical( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: left = yield from visit_single(node.left, required=True) + condition = acc.make_variable() value = acc.helper("operator_not", left) if node.operator == "or" else left - acc.statement(f"{condition} = {value}") + acc.statement(f"{condition} = {value}", lineno=node.left) + + dup = acc.make_variable() + value = acc.helper("get_dup", left) + acc.statement(f"{dup} = {value}") + acc.statement(f"if {dup} is not None:") + with acc.block(): + acc.statement(f"{left} = {dup}()") + with acc.if_statement(condition): right = yield from visit_single(node.right, required=True) - acc.statement(f"{left} = {right}") + + acc.statement(f"if {dup} is not None:") + with acc.block(): + rebind = acc.helper("get_rebind", left) + acc.statement(f"_mecha_rebind = {rebind}", lineno=node.right) + acc.statement(f"{left} = {right}") + acc.statement(f"if _mecha_rebind is not None:") + with acc.block(): + acc.statement(f"{left} = _mecha_rebind({left})") + + acc.statement("else:") + with acc.block(): + acc.statement(f"{left} = {right}") + return [left] @rule(AstExpressionUnary) diff --git a/packages/mecha/mecha/contrib/bolt/helpers.py b/packages/mecha/mecha/contrib/bolt/helpers.py index 04f1311ad..939a8431c 100644 --- a/packages/mecha/mecha/contrib/bolt/helpers.py +++ b/packages/mecha/mecha/contrib/bolt/helpers.py @@ -56,6 +56,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "operator_in": operator_in, "operator_not_in": operator_not_in, "branch": BranchDriver, + "get_dup": get_dup, "get_rebind": get_rebind, "get_attribute": get_attribute, "import_module": python_import_module, @@ -139,6 +140,13 @@ def __exit__( return self.context_manager.__exit__(exc_type, exc, traceback) +@internal +def get_dup(obj: Any): + if func := getattr(type(obj), "__dup__", None): + return partial(func, obj) + return None + + @internal def get_rebind(obj: Any): if func := getattr(type(obj), "__rebind__", None): diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt index c7e5ad77e..837eca3a9 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt @@ -1,96 +1,206 @@ _mecha_lineno = [1], [1] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] _mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] _mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] _mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var35: +with _mecha_runtime.scope() as _mecha_var47: _mecha_var0 = False _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) + _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var2 is not None: + _mecha_var0 = _mecha_var2() with _mecha_helper_branch(_mecha_var1) as _mecha_condition: if _mecha_condition: - _mecha_var2 = True - _mecha_var3 = _mecha_var2 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + _mecha_var3 = True + _mecha_var4 = _mecha_var3 + _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) + if _mecha_var5 is not None: + _mecha_var3 = _mecha_var5() + with _mecha_helper_branch(_mecha_var4) as _mecha_condition: if _mecha_condition: - _mecha_var4 = 'hello' - _mecha_var2 = _mecha_var4 - _mecha_var0 = _mecha_var2 - _mecha_var5 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var5) as _mecha_condition: + _mecha_var6 = 'hello' + if _mecha_var5 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) + _mecha_var3 = _mecha_var6 + if _mecha_rebind is not None: + _mecha_var3 = _mecha_rebind(_mecha_var3) + else: + _mecha_var3 = _mecha_var6 + if _mecha_var2 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var3 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var3 + _mecha_var7 = _mecha_helper_operator_not(_mecha_var0) + _mecha_var8 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var8 is not None: + _mecha_var0 = _mecha_var8() + with _mecha_helper_branch(_mecha_var7) as _mecha_condition: if _mecha_condition: - _mecha_var6 = 'foo' - _mecha_var7 = 'bar' - _mecha_var6 = _mecha_var6 == _mecha_var7 - _mecha_var6 = _mecha_helper_operator_not(_mecha_var6) - _mecha_var0 = _mecha_var6 - _mecha_var8 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var8) as _mecha_condition: + _mecha_var9 = 'foo' + _mecha_var10 = 'bar' + _mecha_var9 = _mecha_var9 == _mecha_var10 + _mecha_var9 = _mecha_helper_operator_not(_mecha_var9) + if _mecha_var8 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var9 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var9 + _mecha_var11 = _mecha_helper_operator_not(_mecha_var0) + _mecha_var12 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var12 is not None: + _mecha_var0 = _mecha_var12() + with _mecha_helper_branch(_mecha_var11) as _mecha_condition: if _mecha_condition: - _mecha_var9 = 1 - _mecha_var10 = 2 - _mecha_var9 = _mecha_var9 != _mecha_var10 - _mecha_var11 = _mecha_var9 - with _mecha_helper_branch(_mecha_var11) as _mecha_condition: + _mecha_var13 = 1 + _mecha_var14 = 2 + _mecha_var13 = _mecha_var13 != _mecha_var14 + _mecha_var15 = _mecha_var13 + _mecha_var16 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var16 is not None: + _mecha_var13 = _mecha_var16() + with _mecha_helper_branch(_mecha_var15) as _mecha_condition: if _mecha_condition: - _mecha_var12 = 1 - _mecha_var13 = 2 - _mecha_var12 = _mecha_var12 < _mecha_var13 - _mecha_var9 = _mecha_var12 - _mecha_var14 = _mecha_var9 - with _mecha_helper_branch(_mecha_var14) as _mecha_condition: + _mecha_var17 = 1 + _mecha_var18 = 2 + _mecha_var17 = _mecha_var17 < _mecha_var18 + if _mecha_var16 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var17 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var17 + _mecha_var19 = _mecha_var13 + _mecha_var20 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var20 is not None: + _mecha_var13 = _mecha_var20() + with _mecha_helper_branch(_mecha_var19) as _mecha_condition: if _mecha_condition: - _mecha_var15 = 2 - _mecha_var16 = 3 - _mecha_var15 = _mecha_var15 <= _mecha_var16 - _mecha_var9 = _mecha_var15 - _mecha_var17 = _mecha_var9 - with _mecha_helper_branch(_mecha_var17) as _mecha_condition: + _mecha_var21 = 2 + _mecha_var22 = 3 + _mecha_var21 = _mecha_var21 <= _mecha_var22 + if _mecha_var20 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var21 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var21 + _mecha_var23 = _mecha_var13 + _mecha_var24 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var24 is not None: + _mecha_var13 = _mecha_var24() + with _mecha_helper_branch(_mecha_var23) as _mecha_condition: if _mecha_condition: - _mecha_var18 = 5 - _mecha_var19 = 4 - _mecha_var18 = _mecha_var18 > _mecha_var19 - _mecha_var9 = _mecha_var18 - _mecha_var20 = _mecha_var9 - with _mecha_helper_branch(_mecha_var20) as _mecha_condition: + _mecha_var25 = 5 + _mecha_var26 = 4 + _mecha_var25 = _mecha_var25 > _mecha_var26 + if _mecha_var24 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var25 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var25 + _mecha_var27 = _mecha_var13 + _mecha_var28 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var28 is not None: + _mecha_var13 = _mecha_var28() + with _mecha_helper_branch(_mecha_var27) as _mecha_condition: if _mecha_condition: - _mecha_var21 = 6 - _mecha_var22 = 5 - _mecha_var21 = _mecha_var21 >= _mecha_var22 - _mecha_var9 = _mecha_var21 - _mecha_var23 = _mecha_var9 - with _mecha_helper_branch(_mecha_var23) as _mecha_condition: + _mecha_var29 = 6 + _mecha_var30 = 5 + _mecha_var29 = _mecha_var29 >= _mecha_var30 + if _mecha_var28 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var29 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var29 + _mecha_var31 = _mecha_var13 + _mecha_var32 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var32 is not None: + _mecha_var13 = _mecha_var32() + with _mecha_helper_branch(_mecha_var31) as _mecha_condition: if _mecha_condition: - _mecha_var24 = 1 - _mecha_var25 = 1 - _mecha_var24 = _mecha_helper_operator_in(_mecha_var24, _mecha_var25) - _mecha_var9 = _mecha_var24 - _mecha_var26 = _mecha_var9 - with _mecha_helper_branch(_mecha_var26) as _mecha_condition: + _mecha_var33 = 1 + _mecha_var34 = 1 + _mecha_var33 = _mecha_helper_operator_in(_mecha_var33, _mecha_var34) + if _mecha_var32 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var33 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var33 + _mecha_var35 = _mecha_var13 + _mecha_var36 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var36 is not None: + _mecha_var13 = _mecha_var36() + with _mecha_helper_branch(_mecha_var35) as _mecha_condition: if _mecha_condition: - _mecha_var27 = 2 - _mecha_var28 = 2 - _mecha_var27 = _mecha_helper_operator_not_in(_mecha_var27, _mecha_var28) - _mecha_var9 = _mecha_var27 - _mecha_var29 = _mecha_var9 - with _mecha_helper_branch(_mecha_var29) as _mecha_condition: + _mecha_var37 = 2 + _mecha_var38 = 2 + _mecha_var37 = _mecha_helper_operator_not_in(_mecha_var37, _mecha_var38) + if _mecha_var36 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var37 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var37 + _mecha_var39 = _mecha_var13 + _mecha_var40 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var40 is not None: + _mecha_var13 = _mecha_var40() + with _mecha_helper_branch(_mecha_var39) as _mecha_condition: if _mecha_condition: - _mecha_var30 = 3 - _mecha_var31 = 3 - _mecha_var30 = _mecha_var30 is _mecha_var31 - _mecha_var9 = _mecha_var30 - _mecha_var32 = _mecha_var9 - with _mecha_helper_branch(_mecha_var32) as _mecha_condition: + _mecha_var41 = 3 + _mecha_var42 = 3 + _mecha_var41 = _mecha_var41 is _mecha_var42 + if _mecha_var40 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var41 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var41 + _mecha_var43 = _mecha_var13 + _mecha_var44 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var44 is not None: + _mecha_var13 = _mecha_var44() + with _mecha_helper_branch(_mecha_var43) as _mecha_condition: if _mecha_condition: - _mecha_var33 = 3 - _mecha_var34 = 3 - _mecha_var33 = _mecha_var33 is not _mecha_var34 - _mecha_var9 = _mecha_var33 - _mecha_var0 = _mecha_var9 -_mecha_var36 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var35)) + _mecha_var45 = 3 + _mecha_var46 = 3 + _mecha_var45 = _mecha_var45 is not _mecha_var46 + if _mecha_var44 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var45 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var45 + if _mecha_var12 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var13 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var13 +_mecha_var48 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var47)) --- -output = _mecha_var36 +output = _mecha_var48 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt index 9259152fc..514ace72a 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt @@ -1,11 +1,13 @@ -_mecha_lineno = [1, 15, 19, 23, 25], [1, 2, 3, 4, 5] +_mecha_lineno = [1, 17, 21, 25, 27], [1, 2, 3, 4, 5] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] _mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] _mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] _mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var24: +with _mecha_runtime.scope() as _mecha_var27: _mecha_var0 = False _mecha_var1 = True _mecha_var2 = [_mecha_var0, _mecha_var1] @@ -25,31 +27,58 @@ with _mecha_runtime.scope() as _mecha_var24: _mecha_var12 = print _mecha_var13 = a _mecha_var14 = _mecha_var13 + _mecha_var15 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var15 is not None: + _mecha_var13 = _mecha_var15() with _mecha_helper_branch(_mecha_var14) as _mecha_condition: if _mecha_condition: - _mecha_var15 = b - _mecha_var13 = _mecha_var15 - _mecha_var16 = _mecha_helper_operator_not(_mecha_var13) - with _mecha_helper_branch(_mecha_var16) as _mecha_condition: + _mecha_var16 = b + if _mecha_var15 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var16 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var16 + _mecha_var17 = _mecha_helper_operator_not(_mecha_var13) + _mecha_var18 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var18 is not None: + _mecha_var13 = _mecha_var18() + with _mecha_helper_branch(_mecha_var17) as _mecha_condition: if _mecha_condition: - _mecha_var17 = c - _mecha_var18 = _mecha_var17 - with _mecha_helper_branch(_mecha_var18) as _mecha_condition: + _mecha_var19 = c + _mecha_var20 = _mecha_var19 + _mecha_var21 = _mecha_helper_get_dup(_mecha_var19) + if _mecha_var21 is not None: + _mecha_var19 = _mecha_var21() + with _mecha_helper_branch(_mecha_var20) as _mecha_condition: if _mecha_condition: - _mecha_var19 = d - _mecha_var19 = _mecha_helper_operator_not(_mecha_var19) - _mecha_var17 = _mecha_var19 - _mecha_var13 = _mecha_var17 - _mecha_var20 = True - _mecha_var21 = [_mecha_var20] - _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var21) - _mecha_var22 = False - _mecha_var23 = [_mecha_var22] - _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var23) + _mecha_var22 = d + _mecha_var22 = _mecha_helper_operator_not(_mecha_var22) + if _mecha_var21 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var19) + _mecha_var19 = _mecha_var22 + if _mecha_rebind is not None: + _mecha_var19 = _mecha_rebind(_mecha_var19) + else: + _mecha_var19 = _mecha_var22 + if _mecha_var18 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var19 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var19 + _mecha_var23 = True + _mecha_var24 = [_mecha_var23] + _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var24) + _mecha_var25 = False + _mecha_var26 = [_mecha_var25] + _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var26) _mecha_var12 = _mecha_var12(_mecha_var13) -_mecha_var25 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var24)) +_mecha_var28 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var27)) --- -output = _mecha_var25 +output = _mecha_var28 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt index 4b5690a4a..441752d1a 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt @@ -1,23 +1,43 @@ _mecha_lineno = [1], [1] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] _mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: +with _mecha_runtime.scope() as _mecha_var7: _mecha_var0 = True _mecha_var1 = _mecha_var0 + _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var2 is not None: + _mecha_var0 = _mecha_var2() with _mecha_helper_branch(_mecha_var1) as _mecha_condition: if _mecha_condition: - _mecha_var2 = False - _mecha_var3 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + _mecha_var3 = False + _mecha_var4 = _mecha_helper_operator_not(_mecha_var3) + _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) + if _mecha_var5 is not None: + _mecha_var3 = _mecha_var5() + with _mecha_helper_branch(_mecha_var4) as _mecha_condition: if _mecha_condition: - _mecha_var4 = True - _mecha_var2 = _mecha_var4 - _mecha_var0 = _mecha_var2 -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) + _mecha_var6 = True + if _mecha_var5 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) + _mecha_var3 = _mecha_var6 + if _mecha_rebind is not None: + _mecha_var3 = _mecha_rebind(_mecha_var3) + else: + _mecha_var3 = _mecha_var6 + if _mecha_var2 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var3 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var3 +_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) --- -output = _mecha_var6 +output = _mecha_var8 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt index ea3012fc9..79aefa85a 100644 --- a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt +++ b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt @@ -1,9 +1,11 @@ -_mecha_lineno = [1], [1] +_mecha_lineno = [1, 17], [1, 3] _mecha_helper_branch = _mecha_runtime.helpers['branch'] _mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] _mecha_helper_children = _mecha_runtime.helpers['children'] _mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: +with _mecha_runtime.scope() as _mecha_var5: _mecha_var0 = True with _mecha_helper_branch(_mecha_var0) as _mecha_condition: if _mecha_condition: @@ -13,10 +15,19 @@ with _mecha_runtime.scope() as _mecha_var4: if _mecha_condition: _mecha_var1 = True _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) + _mecha_var3 = _mecha_helper_get_dup(_mecha_var1) + if _mecha_var3 is not None: + _mecha_var1 = _mecha_var3() with _mecha_helper_branch(_mecha_var2) as _mecha_condition: if _mecha_condition: - _mecha_var3 = False - _mecha_var1 = _mecha_var3 + _mecha_var4 = False + if _mecha_var3 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var1) + _mecha_var1 = _mecha_var4 + if _mecha_rebind is not None: + _mecha_var1 = _mecha_rebind(_mecha_var1) + else: + _mecha_var1 = _mecha_var4 with _mecha_helper_branch(_mecha_var1) as _mecha_condition: if _mecha_condition: _mecha_runtime.commands.extend(_mecha_refs[1].commands) @@ -24,9 +35,9 @@ with _mecha_runtime.scope() as _mecha_var4: with _mecha_helper_branch(_mecha_var1) as _mecha_condition: if _mecha_condition: _mecha_runtime.commands.extend(_mecha_refs[2].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var4)) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var5)) --- -output = _mecha_var5 +output = _mecha_var6 --- _mecha_refs[0] diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 6441348c7..13d88c21f 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -245,6 +245,14 @@ say thing == hello say thing == world execute if score @s foo matches 1 run function demo:foo/nested_execute_1 execute if score @s foo matches 0 run say no +scoreboard players operation global bolt_basic.tmp0 = global is_cool +execute unless score global is_cool matches 0 run scoreboard players operation global bolt_basic.tmp0 = global is_nice +scoreboard players operation global is_awesome = global bolt_basic.tmp0 +scoreboard players set global bolt_basic.tmp1 1 +execute unless score global is_awesome matches 0 run scoreboard players set global bolt_basic.tmp1 0 +scoreboard players operation global bolt_basic.tmp2 = global is_awesome +execute unless score global bolt_basic.tmp1 matches 0 run scoreboard players operation global bolt_basic.tmp2 = global force_awesomeness +execute unless score global bolt_basic.tmp2 matches 0 run say hello ``` `@function demo:import_a` From 18486ef02a36353ec80cc013f24632b2d8fcbd2f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 16 Apr 2022 21:51:29 +0000 Subject: [PATCH 0775/1554] 0.46.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 887033173..56ffee093 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.46.0 (2022-04-16) +### Feature +* Make it possible to overload logical expressions ([`12c6946`](https://github.com/mcbeet/mecha/commit/12c6946bd0e7481941d50f52d4d1fa926ecac638)) + ## v0.45.1 (2022-04-15) ### Fix * Better error when mutating free variable ([`09330b8`](https://github.com/mcbeet/mecha/commit/09330b872afbb99c1b14285d271c6d5b9462466d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index bd4b8352b..447db7b3f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.45.1" +__version__ = "0.46.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e86eecaaf..ac4e94d3a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.45.1" +version = "0.46.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From e54d0effbb6d05d0ef89d014e4b80657925fded5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 19 Apr 2022 21:27:32 +0200 Subject: [PATCH 0776/1554] feat: introduce customizable source providers --- packages/mecha/mecha/api.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 29f8ce4c7..d6bcd36a5 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -26,7 +26,7 @@ overload, ) -from beet import Cache, Context, DataPack, Function, TextFileBase +from beet import Cache, Context, DataPack, Function, NamespaceFile, TextFileBase from beet.core.utils import FileSystemPath, JsonDict, extra_field, import_from_string from pydantic import BaseModel from tokenstream import InvalidSyntax, TokenStream @@ -111,6 +111,10 @@ class Mecha: spec: CommandSpec = extra_field(default=None) + providers: List[Type[NamespaceFile]] = extra_field( + default_factory=lambda: [Function] + ) + lint: Dispatcher[AstRoot] = extra_field(init=False) transform: Dispatcher[AstRoot] = extra_field(init=False) optimize: Dispatcher[AstRoot] = extra_field(init=False) @@ -371,17 +375,20 @@ def compile( if match is None: match = self.match - for key in source.functions.match(*match or ["*"]): - value = source.functions[key] - self.database[value] = CompilationUnit( - resource_location=key, - filename=( - os.path.relpath(value.source_path, self.directory) - if value.source_path - else None - ), - ) - self.database.enqueue(value) + for file_type in self.providers: + if not issubclass(file_type, TextFileBase): + continue + for key in source[file_type].match(*match or ["*"]): + value = source[file_type][key] + self.database[value] = CompilationUnit( + resource_location=key, + filename=( + os.path.relpath(value.source_path, self.directory) + if value.source_path + else None + ), + ) + self.database.enqueue(value) else: if isinstance(source, (list, str)): source = Function(source) From ec8939ed8858b9476a3808309d54b52448f9d0cf Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 19 Apr 2022 21:52:30 +0200 Subject: [PATCH 0777/1554] feat: add bolt modules in data packs --- .../src/data/demo/functions/foo.mcfunction | 3 + .../src/data/demo/functions/utils.mcfunction | 1 + .../src/data/demo/modules/utils.bolt | 2 + packages/mecha/mecha/contrib/bolt/ast.py | 8 +- packages/mecha/mecha/contrib/bolt/runtime.py | 114 ++++++++++++++---- packages/mecha/mecha/database.py | 16 ++- .../examples__build_bolt_basic__0.pack.md | 7 ++ 7 files changed, 119 insertions(+), 32 deletions(-) create mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction create mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index d008abe84..8bd9bf620 100644 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -603,3 +603,6 @@ is_awesome = Cond("is_cool") and Cond("is_nice") if is_awesome or Cond("force_awesomeness"): say hello + +from ./utils import something +something() diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction new file mode 100644 index 000000000..ed8bb9ae4 --- /dev/null +++ b/packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction @@ -0,0 +1 @@ +say this doesn't conflict with the demo:utils module diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt b/packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt new file mode 100644 index 000000000..8143a1168 --- /dev/null +++ b/packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt @@ -0,0 +1,2 @@ +def something(): + say f"this is from {__name__}" diff --git a/packages/mecha/mecha/contrib/bolt/ast.py b/packages/mecha/mecha/contrib/bolt/ast.py index 32b22618a..a153d535d 100644 --- a/packages/mecha/mecha/contrib/bolt/ast.py +++ b/packages/mecha/mecha/contrib/bolt/ast.py @@ -1,4 +1,5 @@ __all__ = [ + "AstModuleRoot", "AstExpression", "AstExpressionBinary", "AstExpressionUnary", @@ -35,7 +36,12 @@ from beet.core.utils import required_field from tokenstream import TokenStream -from mecha import AstChildren, AstNode +from mecha import AstChildren, AstNode, AstRoot + + +@dataclass(frozen=True) +class AstModuleRoot(AstRoot): + """Module root ast node.""" @dataclass(frozen=True) diff --git a/packages/mecha/mecha/contrib/bolt/runtime.py b/packages/mecha/mecha/contrib/bolt/runtime.py index 065db821d..85bc571ab 100644 --- a/packages/mecha/mecha/contrib/bolt/runtime.py +++ b/packages/mecha/mecha/contrib/bolt/runtime.py @@ -1,9 +1,12 @@ __all__ = [ "Runtime", "Module", + "CompiledModule", "ModuleCacheBackend", - "Evaluator", "GlobalsInjection", + "ModuleRootParser", + "Evaluator", + "ModuleRootSerializer", "UnusableCompilationUnit", ] @@ -18,9 +21,15 @@ from types import CodeType from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union -from beet import Context, PipelineFallthroughException, TextFileBase, generate_tree +from beet import ( + Context, + PipelineFallthroughException, + TextFile, + TextFileBase, + generate_tree, +) from beet.core.utils import JsonDict, required_field -from tokenstream import TokenStream +from tokenstream import TokenStream, set_location from mecha import ( AstCacheBackend, @@ -30,6 +39,7 @@ CompilationDatabase, CompilationError, CompilationUnit, + Diagnostic, DiagnosticCollection, Dispatcher, Mecha, @@ -39,6 +49,7 @@ rule, ) +from .ast import AstModuleRoot from .codegen import Codegen from .helpers import get_bolt_helpers from .loop_info import loop_info @@ -63,8 +74,15 @@ def __str__(self) -> str: return self.message +class Module(TextFile): + """Class representing a bolt module.""" + + scope = ("modules",) + extension = ".bolt" + + @dataclass -class Module: +class CompiledModule: """Class holding the state of a compiled module.""" ast: AstRoot @@ -80,8 +98,8 @@ class Module: class Runtime: """The bolt runtime.""" - modules: Dict[TextFileBase[Any], Module] - stack: List[Module] + modules: Dict[TextFileBase[Any], CompiledModule] + stack: List[CompiledModule] commands: List[AstCommand] helpers: Dict[str, Any] globals: JsonDict @@ -108,8 +126,11 @@ def __init__(self, ctx: Union[Context, Mecha]): "mecha.contrib.nested_resources", "mecha.contrib.nested_yaml", "mecha.contrib.implicit_execute", + self.finalize, ) + ctx.data.extend_namespace.append(Module) + self.globals["ctx"] = ctx self.expose("generate_path", ctx.generate.path) @@ -135,10 +156,17 @@ def __init__(self, ctx: Union[Context, Mecha]): else: mc = ctx + mc.cache_backend = ModuleCacheBackend(runtime=self) + commands_json = read_text("mecha.resources", "bolt.json") mc.spec.add_commands(CommandTree.parse_raw(commands_json)) mc.spec.parsers.update(get_bolt_parsers(mc.spec.parsers, mc.database)) - mc.spec.parsers["root"] = GlobalsInjection(self, mc.spec.parsers["root"]) + mc.spec.parsers["root"] = GlobalsInjection( + runtime=self, + parser=ModuleRootParser(mc.database, mc.spec.parsers["root"]), + ) + + mc.providers.append(Module) self.directory = mc.directory self.database = mc.database @@ -147,7 +175,7 @@ def __init__(self, ctx: Union[Context, Mecha]): self.evaluate = Evaluator(runtime=self) mc.steps.insert(0, self.evaluate) - mc.cache_backend = ModuleCacheBackend(runtime=self) + mc.serialize.extend(ModuleRootSerializer()) def get_path(self) -> str: """Return the current path.""" @@ -165,7 +193,7 @@ def get_module( self, target: Optional[Union[AstRoot, str]] = None, current: Optional[TextFileBase[Any]] = None, - ) -> Module: + ) -> CompiledModule: """Retrieve an executable module.""" if self.stack and not target and not current: return self.stack[-1] @@ -207,7 +235,7 @@ def get_module( else: code = None - module = Module( + module = CompiledModule( target, code, refs, @@ -219,7 +247,7 @@ def get_module( return module - def get_output(self, module: Module) -> AstRoot: + def get_output(self, module: CompiledModule) -> AstRoot: """Run the module and return the output ast.""" if not module.code or not module.output: return module.ast @@ -275,7 +303,7 @@ def error_handler(self): raise rewrite_traceback(exc) from None @internal - def import_module(self, resource_location: str) -> Module: + def import_module(self, resource_location: str) -> CompiledModule: """Import module.""" try: module = self.get_module(resource_location) @@ -297,6 +325,11 @@ def from_module_import(self, resource_location: str, *args: str) -> Any: raise ImportError(msg) from None return values[0] if len(values) == 1 else values + def finalize(self, ctx: Context): + """Plugin that removes modules at the end of the build.""" + yield + ctx.data[Module].clear() + @dataclass class ModuleCacheBackend(AstCacheBackend): @@ -311,7 +344,7 @@ def load(self, f: BufferedReader) -> AstRoot: if data["globals"] != set(self.runtime.globals): raise ValueError("Globals mismatch.") - self.runtime.modules[self.runtime.database.current] = Module( + self.runtime.modules[self.runtime.database.current] = CompiledModule( ast=ast, code=marshal.load(f), refs=data["refs"], @@ -339,6 +372,36 @@ def dump(self, node: AstRoot, f: BufferedWriter): marshal.dump(module.code, f) +@dataclass +class GlobalsInjection: + """Inject global identifiers.""" + + runtime: Runtime + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide( + identifiers=set(self.runtime.globals) + | self.runtime.builtins + | {"__name__"}, + ): + return self.parser(stream) + + +@dataclass +class ModuleRootParser: + """Parser for module root.""" + + database: CompilationDatabase + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + if isinstance(node, AstRoot) and isinstance(self.database.current, Module): + node = set_location(AstModuleRoot(commands=node.commands), node) + return node + + @dataclass class Evaluator(Visitor): """Visitor that evaluates modules.""" @@ -364,17 +427,16 @@ def root(self, node: AstRoot) -> AstRoot: raise CompilationError(msg) from exc.with_traceback(tb) -@dataclass -class GlobalsInjection: - """Inject global identifiers.""" - - runtime: Runtime - parser: Parser +class ModuleRootSerializer(Visitor): + """Serializer for checking that modules don't emit any commands.""" - def __call__(self, stream: TokenStream) -> Any: - with stream.provide( - identifiers=set(self.runtime.globals) - | self.runtime.builtins - | {"__name__"}, - ): - return self.parser(stream) + @rule(AstModuleRoot) + def module_root(self, node: AstModuleRoot, result: List[str]): + if node.commands: + command = node.commands[0] + name = command.identifier.partition(":")[0] + raise set_location( + Diagnostic("warn", f"Standalone {name!r} command in module."), + command, + command.arguments[0] if command.arguments else command, + ) diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 09dc29016..6b3948102 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -37,19 +37,21 @@ class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): """Compilation database.""" index: Dict[str, TextFileBase[Any]] - queue: List[Tuple[int, str, TextFileBase[Any]]] session: Set[TextFileBase[Any]] + queue: List[Tuple[int, str, int, TextFileBase[Any]]] step: int current: TextFileBase[Any] + count: int def __init__(self): super().__init__() self.index = {} - self.queue = [] self.session = set() + self.queue = [] self.step = -1 self.current = TextFile() self[self.current] = CompilationUnit() + self.count = 0 def process( self, @@ -70,17 +72,21 @@ def __delitem__(self, key: TextFileBase[Any]): def setup_compilation(self): """Setup database for compilation.""" - self.queue.clear() self.session.clear() + self.queue.clear() def enqueue(self, key: TextFileBase[Any], step: int = -1): """Enqueue a file and schedule it to be processed with the given step.""" - heappush(self.queue, (step, self[key].resource_location or "", key)) self.session.add(key) + self.count += 1 + heappush( + self.queue, + (step, self[key].resource_location or "", self.count, key), + ) def dequeue(self) -> Tuple[int, TextFileBase[Any]]: """Dequeue the next file that needs to be processed.""" - step, _, key = heappop(self.queue) + step, _, _, key = heappop(self.queue) return step, key def process_queue(self) -> Iterator[Tuple[int, TextFileBase[Any]]]: diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md index 13d88c21f..1be3cb6a3 100644 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -253,6 +253,7 @@ execute unless score global is_awesome matches 0 run scoreboard players set glob scoreboard players operation global bolt_basic.tmp2 = global is_awesome execute unless score global bolt_basic.tmp1 matches 0 run scoreboard players operation global bolt_basic.tmp2 = global force_awesomeness execute unless score global bolt_basic.tmp2 matches 0 run say hello +say this is from demo:utils ``` `@function demo:import_a` @@ -277,6 +278,12 @@ say 14 ``` +`@function demo:utils` + +```mcfunction +say this doesn't conflict with the demo:utils module +``` + `@function demo:foo/nested_execute_0` ```mcfunction From aa8bc0c89dd13b0c719fa2199fee6a12180ff6e1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 19 Apr 2022 19:53:56 +0000 Subject: [PATCH 0778/1554] 0.47.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 56ffee093..a8bf41c8c 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.47.0 (2022-04-19) +### Feature +* Add bolt modules in data packs ([`1ad6291`](https://github.com/mcbeet/mecha/commit/1ad6291c3bba002c6e159f74bd57c8c0c614b70d)) +* Introduce customizable source providers ([`909ed80`](https://github.com/mcbeet/mecha/commit/909ed808d36f83e26d2a34257abe159b22b40212)) + ## v0.46.0 (2022-04-16) ### Feature * Make it possible to overload logical expressions ([`12c6946`](https://github.com/mcbeet/mecha/commit/12c6946bd0e7481941d50f52d4d1fa926ecac638)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 447db7b3f..9e7d96cce 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.46.0" +__version__ = "0.47.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ac4e94d3a..2e2beaaee 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.46.0" +version = "0.47.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From ba67f5c4068f5386e11103e6a94c5a1e45920512 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Apr 2022 00:37:30 +0200 Subject: [PATCH 0779/1554] Initial commit --- packages/bolt/.gitignore | 129 +++++++++++++++++++++++++++++++++++++++ packages/bolt/LICENSE | 21 +++++++ packages/bolt/README.md | 2 + 3 files changed, 152 insertions(+) create mode 100644 packages/bolt/.gitignore create mode 100644 packages/bolt/LICENSE create mode 100644 packages/bolt/README.md diff --git a/packages/bolt/.gitignore b/packages/bolt/.gitignore new file mode 100644 index 000000000..b6e47617d --- /dev/null +++ b/packages/bolt/.gitignore @@ -0,0 +1,129 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/packages/bolt/LICENSE b/packages/bolt/LICENSE new file mode 100644 index 000000000..d74fc840b --- /dev/null +++ b/packages/bolt/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Beet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/bolt/README.md b/packages/bolt/README.md new file mode 100644 index 000000000..c303c347a --- /dev/null +++ b/packages/bolt/README.md @@ -0,0 +1,2 @@ +# bolt +Supercharge Minecraft commands with Python. From d237409d4df050f18a747a41ed3197868cf06960 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Apr 2022 02:46:59 +0200 Subject: [PATCH 0780/1554] feat: remove bolt --- packages/mecha/README.md | 2 +- packages/mecha/examples/bolt_basic/beet.yml | 6 - .../src/data/demo/functions/foo.mcfunction | 608 ------- .../data/demo/functions/import_a.mcfunction | 18 - .../data/demo/functions/import_b.mcfunction | 18 - .../src/data/demo/functions/thing.mcfunction | 15 - .../src/data/demo/functions/utils.mcfunction | 1 - .../src/data/demo/modules/utils.bolt | 2 - .../mecha/examples/bolt_generated/beet.yml | 7 - .../mecha/examples/bolt_generated/demo.py | 11 - .../src/data/demo/functions/foo.mcfunction | 2 - packages/mecha/examples/bolt_merge/beet.yml | 8 - .../data/pack_1/functions/bob.mcfunction | 2 - .../data/pack_1/functions/utils.mcfunction | 3 - .../data/pack_2/functions/carol.mcfunction | 2 - .../examples/bolt_shadow_global/beet.yml | 7 - .../mecha/examples/bolt_shadow_global/demo.py | 8 - .../src/data/demo/functions/foo.mcfunction | 1 - packages/mecha/mecha/contrib/bolt/__init__.py | 7 - packages/mecha/mecha/contrib/bolt/ast.py | 252 --- packages/mecha/mecha/contrib/bolt/codegen.py | 956 ----------- packages/mecha/mecha/contrib/bolt/helpers.py | 206 --- .../mecha/mecha/contrib/bolt/loop_info.py | 100 -- packages/mecha/mecha/contrib/bolt/parse.py | 1441 ----------------- packages/mecha/mecha/contrib/bolt/plugin.py | 12 - packages/mecha/mecha/contrib/bolt/runtime.py | 442 ----- packages/mecha/mecha/contrib/bolt/utils.py | 121 -- packages/mecha/mecha/contrib/bolt_sandbox.py | 164 -- packages/mecha/mecha/resources/bolt.json | 232 --- .../tests/resources/bolt_examples.mcfunction | 750 --------- .../resources/sandbox_examples.mcfunction | 19 - .../tests/snapshots/bolt__parse_0__0.txt | 15 - .../tests/snapshots/bolt__parse_0__1.txt | 15 - .../tests/snapshots/bolt__parse_100__0.txt | 19 - .../tests/snapshots/bolt__parse_100__1.txt | 4 - .../tests/snapshots/bolt__parse_101__0.txt | 35 - .../tests/snapshots/bolt__parse_101__1.txt | 22 - .../tests/snapshots/bolt__parse_102__0.txt | 48 - .../tests/snapshots/bolt__parse_102__1.txt | 44 - .../tests/snapshots/bolt__parse_103__0.txt | 180 -- .../tests/snapshots/bolt__parse_103__1.txt | 161 -- .../tests/snapshots/bolt__parse_104__0.txt | 59 - .../tests/snapshots/bolt__parse_104__1.txt | 23 - .../tests/snapshots/bolt__parse_105__0.txt | 17 - .../tests/snapshots/bolt__parse_105__1.txt | 15 - .../tests/snapshots/bolt__parse_106__0.txt | 41 - .../tests/snapshots/bolt__parse_106__1.txt | 19 - .../tests/snapshots/bolt__parse_107__0.txt | 41 - .../tests/snapshots/bolt__parse_107__1.txt | 19 - .../tests/snapshots/bolt__parse_108__0.txt | 30 - .../tests/snapshots/bolt__parse_108__1.txt | 18 - .../tests/snapshots/bolt__parse_109__0.txt | 30 - .../tests/snapshots/bolt__parse_109__1.txt | 18 - .../tests/snapshots/bolt__parse_10__0.txt | 40 - .../tests/snapshots/bolt__parse_10__1.txt | 20 - .../tests/snapshots/bolt__parse_110__0.txt | 20 - .../tests/snapshots/bolt__parse_110__1.txt | 16 - .../tests/snapshots/bolt__parse_111__0.txt | 41 - .../tests/snapshots/bolt__parse_111__1.txt | 19 - .../tests/snapshots/bolt__parse_112__0.txt | 28 - .../tests/snapshots/bolt__parse_112__1.txt | 16 - .../tests/snapshots/bolt__parse_113__0.txt | 28 - .../tests/snapshots/bolt__parse_113__1.txt | 16 - .../tests/snapshots/bolt__parse_114__0.txt | 28 - .../tests/snapshots/bolt__parse_114__1.txt | 16 - .../tests/snapshots/bolt__parse_115__0.txt | 5 - .../tests/snapshots/bolt__parse_116__0.txt | 5 - .../tests/snapshots/bolt__parse_117__0.txt | 83 - .../tests/snapshots/bolt__parse_117__1.txt | 67 - .../tests/snapshots/bolt__parse_118__0.txt | 92 -- .../tests/snapshots/bolt__parse_118__1.txt | 44 - .../tests/snapshots/bolt__parse_119__0.txt | 7 - .../tests/snapshots/bolt__parse_11__0.txt | 40 - .../tests/snapshots/bolt__parse_11__1.txt | 20 - .../tests/snapshots/bolt__parse_120__0.txt | 28 - .../tests/snapshots/bolt__parse_120__1.txt | 16 - .../tests/snapshots/bolt__parse_121__0.txt | 5 - .../tests/snapshots/bolt__parse_122__0.txt | 5 - .../tests/snapshots/bolt__parse_123__0.txt | 5 - .../tests/snapshots/bolt__parse_124__0.txt | 5 - .../tests/snapshots/bolt__parse_125__0.txt | 9 - .../tests/snapshots/bolt__parse_126__0.txt | 41 - .../tests/snapshots/bolt__parse_126__1.txt | 22 - .../tests/snapshots/bolt__parse_127__0.txt | 45 - .../tests/snapshots/bolt__parse_127__1.txt | 22 - .../tests/snapshots/bolt__parse_128__0.txt | 42 - .../tests/snapshots/bolt__parse_128__1.txt | 35 - .../tests/snapshots/bolt__parse_129__0.txt | 74 - .../tests/snapshots/bolt__parse_129__1.txt | 25 - .../tests/snapshots/bolt__parse_12__0.txt | 50 - .../tests/snapshots/bolt__parse_12__1.txt | 22 - .../tests/snapshots/bolt__parse_130__0.txt | 116 -- .../tests/snapshots/bolt__parse_130__1.txt | 102 -- .../tests/snapshots/bolt__parse_131__0.txt | 5 - .../tests/snapshots/bolt__parse_132__0.txt | 144 -- .../tests/snapshots/bolt__parse_132__1.txt | 66 - .../tests/snapshots/bolt__parse_133__0.txt | 158 -- .../tests/snapshots/bolt__parse_133__1.txt | 75 - .../tests/snapshots/bolt__parse_134__0.txt | 168 -- .../tests/snapshots/bolt__parse_134__1.txt | 76 - .../tests/snapshots/bolt__parse_135__0.txt | 182 --- .../tests/snapshots/bolt__parse_135__1.txt | 85 - .../tests/snapshots/bolt__parse_136__0.txt | 212 --- .../tests/snapshots/bolt__parse_136__1.txt | 4 - .../tests/snapshots/bolt__parse_137__0.txt | 65 - .../tests/snapshots/bolt__parse_137__1.txt | 4 - .../tests/snapshots/bolt__parse_138__0.txt | 57 - .../tests/snapshots/bolt__parse_138__1.txt | 26 - .../tests/snapshots/bolt__parse_139__0.txt | 218 --- .../tests/snapshots/bolt__parse_139__1.txt | 193 --- .../tests/snapshots/bolt__parse_13__0.txt | 45 - .../tests/snapshots/bolt__parse_13__1.txt | 21 - .../tests/snapshots/bolt__parse_140__0.txt | 33 - .../tests/snapshots/bolt__parse_140__1.txt | 20 - .../tests/snapshots/bolt__parse_141__0.txt | 71 - .../tests/snapshots/bolt__parse_141__1.txt | 56 - .../tests/snapshots/bolt__parse_142__0.txt | 55 - .../tests/snapshots/bolt__parse_142__1.txt | 46 - .../tests/snapshots/bolt__parse_143__0.txt | 99 -- .../tests/snapshots/bolt__parse_143__1.txt | 72 - .../tests/snapshots/bolt__parse_144__0.txt | 69 - .../tests/snapshots/bolt__parse_144__1.txt | 61 - .../tests/snapshots/bolt__parse_145__0.txt | 38 - .../tests/snapshots/bolt__parse_145__1.txt | 17 - .../tests/snapshots/bolt__parse_146__0.txt | 8 - .../tests/snapshots/bolt__parse_147__0.txt | 8 - .../tests/snapshots/bolt__parse_148__0.txt | 8 - .../tests/snapshots/bolt__parse_149__0.txt | 8 - .../tests/snapshots/bolt__parse_14__0.txt | 45 - .../tests/snapshots/bolt__parse_14__1.txt | 21 - .../tests/snapshots/bolt__parse_150__0.txt | 60 - .../tests/snapshots/bolt__parse_150__1.txt | 22 - .../tests/snapshots/bolt__parse_151__0.txt | 73 - .../tests/snapshots/bolt__parse_151__1.txt | 24 - .../tests/snapshots/bolt__parse_152__0.txt | 73 - .../tests/snapshots/bolt__parse_152__1.txt | 24 - .../tests/snapshots/bolt__parse_153__0.txt | 86 - .../tests/snapshots/bolt__parse_153__1.txt | 26 - .../tests/snapshots/bolt__parse_154__0.txt | 24 - .../tests/snapshots/bolt__parse_154__1.txt | 16 - .../tests/snapshots/bolt__parse_155__0.txt | 5 - .../tests/snapshots/bolt__parse_156__0.txt | 37 - .../tests/snapshots/bolt__parse_156__1.txt | 18 - .../tests/snapshots/bolt__parse_157__0.txt | 5 - .../tests/snapshots/bolt__parse_158__0.txt | 7 - .../tests/snapshots/bolt__parse_159__0.txt | 7 - .../tests/snapshots/bolt__parse_15__0.txt | 35 - .../tests/snapshots/bolt__parse_15__1.txt | 19 - .../tests/snapshots/bolt__parse_160__0.txt | 47 - .../tests/snapshots/bolt__parse_160__1.txt | 18 - .../tests/snapshots/bolt__parse_161__0.txt | 95 -- .../tests/snapshots/bolt__parse_161__1.txt | 28 - .../tests/snapshots/bolt__parse_162__0.txt | 64 - .../tests/snapshots/bolt__parse_162__1.txt | 22 - .../tests/snapshots/bolt__parse_163__0.txt | 19 - .../tests/snapshots/bolt__parse_163__1.txt | 4 - .../tests/snapshots/bolt__parse_164__0.txt | 51 - .../tests/snapshots/bolt__parse_164__1.txt | 43 - .../tests/snapshots/bolt__parse_165__0.txt | 46 - .../tests/snapshots/bolt__parse_165__1.txt | 42 - .../tests/snapshots/bolt__parse_166__0.txt | 51 - .../tests/snapshots/bolt__parse_166__1.txt | 4 - .../tests/snapshots/bolt__parse_167__0.txt | 52 - .../tests/snapshots/bolt__parse_167__1.txt | 28 - .../tests/snapshots/bolt__parse_168__0.txt | 100 -- .../tests/snapshots/bolt__parse_168__1.txt | 70 - .../tests/snapshots/bolt__parse_169__0.txt | 75 - .../tests/snapshots/bolt__parse_169__1.txt | 42 - .../tests/snapshots/bolt__parse_16__0.txt | 155 -- .../tests/snapshots/bolt__parse_16__1.txt | 43 - .../tests/snapshots/bolt__parse_170__0.txt | 80 - .../tests/snapshots/bolt__parse_170__1.txt | 25 - .../tests/snapshots/bolt__parse_171__0.txt | 69 - .../tests/snapshots/bolt__parse_171__1.txt | 24 - .../tests/snapshots/bolt__parse_172__0.txt | 5 - .../tests/snapshots/bolt__parse_173__0.txt | 5 - .../tests/snapshots/bolt__parse_174__0.txt | 76 - .../tests/snapshots/bolt__parse_174__1.txt | 60 - .../tests/snapshots/bolt__parse_175__0.txt | 71 - .../tests/snapshots/bolt__parse_175__1.txt | 59 - .../tests/snapshots/bolt__parse_176__0.txt | 78 - .../tests/snapshots/bolt__parse_176__1.txt | 67 - .../tests/snapshots/bolt__parse_177__0.txt | 4 - .../tests/snapshots/bolt__parse_178__0.txt | 4 - .../tests/snapshots/bolt__parse_179__0.txt | 4 - .../tests/snapshots/bolt__parse_17__0.txt | 240 --- .../tests/snapshots/bolt__parse_17__1.txt | 210 --- .../tests/snapshots/bolt__parse_180__0.txt | 4 - .../tests/snapshots/bolt__parse_181__0.txt | 15 - .../tests/snapshots/bolt__parse_181__1.txt | 15 - .../tests/snapshots/bolt__parse_182__0.txt | 26 - .../tests/snapshots/bolt__parse_182__1.txt | 16 - .../tests/snapshots/bolt__parse_183__0.txt | 7 - .../tests/snapshots/bolt__parse_184__0.txt | 79 - .../tests/snapshots/bolt__parse_184__1.txt | 61 - .../tests/snapshots/bolt__parse_185__0.txt | 35 - .../tests/snapshots/bolt__parse_185__1.txt | 18 - .../tests/snapshots/bolt__parse_186__0.txt | 67 - .../tests/snapshots/bolt__parse_186__1.txt | 39 - .../tests/snapshots/bolt__parse_187__0.txt | 5 - .../tests/snapshots/bolt__parse_188__0.txt | 7 - .../tests/snapshots/bolt__parse_189__0.txt | 8 - .../tests/snapshots/bolt__parse_18__0.txt | 5 - .../tests/snapshots/bolt__parse_190__0.txt | 7 - .../tests/snapshots/bolt__parse_191__0.txt | 9 - .../tests/snapshots/bolt__parse_192__0.txt | 131 -- .../tests/snapshots/bolt__parse_192__1.txt | 67 - .../tests/snapshots/bolt__parse_193__0.txt | 423 ----- .../tests/snapshots/bolt__parse_193__1.txt | 167 -- .../tests/snapshots/bolt__parse_194__0.txt | 232 --- .../tests/snapshots/bolt__parse_194__1.txt | 104 -- .../tests/snapshots/bolt__parse_195__0.txt | 9 - .../tests/snapshots/bolt__parse_196__0.txt | 101 -- .../tests/snapshots/bolt__parse_196__1.txt | 29 - .../tests/snapshots/bolt__parse_197__0.txt | 122 -- .../tests/snapshots/bolt__parse_197__1.txt | 38 - .../tests/snapshots/bolt__parse_198__0.txt | 42 - .../tests/snapshots/bolt__parse_198__1.txt | 36 - .../tests/snapshots/bolt__parse_199__0.txt | 195 --- .../tests/snapshots/bolt__parse_199__1.txt | 88 - .../tests/snapshots/bolt__parse_19__0.txt | 5 - .../tests/snapshots/bolt__parse_1__0.txt | 15 - .../tests/snapshots/bolt__parse_1__1.txt | 15 - .../tests/snapshots/bolt__parse_200__0.txt | 11 - .../tests/snapshots/bolt__parse_20__0.txt | 35 - .../tests/snapshots/bolt__parse_20__1.txt | 47 - .../tests/snapshots/bolt__parse_21__0.txt | 15 - .../tests/snapshots/bolt__parse_21__1.txt | 15 - .../tests/snapshots/bolt__parse_22__0.txt | 15 - .../tests/snapshots/bolt__parse_22__1.txt | 15 - .../tests/snapshots/bolt__parse_23__0.txt | 15 - .../tests/snapshots/bolt__parse_23__1.txt | 15 - .../tests/snapshots/bolt__parse_24__0.txt | 15 - .../tests/snapshots/bolt__parse_24__1.txt | 15 - .../tests/snapshots/bolt__parse_25__0.txt | 15 - .../tests/snapshots/bolt__parse_25__1.txt | 15 - .../tests/snapshots/bolt__parse_26__0.txt | 15 - .../tests/snapshots/bolt__parse_26__1.txt | 15 - .../tests/snapshots/bolt__parse_27__0.txt | 5 - .../tests/snapshots/bolt__parse_28__0.txt | 5 - .../tests/snapshots/bolt__parse_29__0.txt | 15 - .../tests/snapshots/bolt__parse_29__1.txt | 15 - .../tests/snapshots/bolt__parse_2__0.txt | 15 - .../tests/snapshots/bolt__parse_2__1.txt | 15 - .../tests/snapshots/bolt__parse_30__0.txt | 7 - .../tests/snapshots/bolt__parse_31__0.txt | 5 - .../tests/snapshots/bolt__parse_32__0.txt | 36 - .../tests/snapshots/bolt__parse_32__1.txt | 18 - .../tests/snapshots/bolt__parse_33__0.txt | 46 - .../tests/snapshots/bolt__parse_33__1.txt | 20 - .../tests/snapshots/bolt__parse_34__0.txt | 71 - .../tests/snapshots/bolt__parse_34__1.txt | 29 - .../tests/snapshots/bolt__parse_35__0.txt | 104 -- .../tests/snapshots/bolt__parse_35__1.txt | 66 - .../tests/snapshots/bolt__parse_36__0.txt | 12 - .../tests/snapshots/bolt__parse_37__0.txt | 12 - .../tests/snapshots/bolt__parse_38__0.txt | 4 - .../tests/snapshots/bolt__parse_39__0.txt | 4 - .../tests/snapshots/bolt__parse_3__0.txt | 15 - .../tests/snapshots/bolt__parse_3__1.txt | 15 - .../tests/snapshots/bolt__parse_40__0.txt | 7 - .../tests/snapshots/bolt__parse_41__0.txt | 33 - .../tests/snapshots/bolt__parse_41__1.txt | 23 - .../tests/snapshots/bolt__parse_42__0.txt | 116 -- .../tests/snapshots/bolt__parse_42__1.txt | 90 - .../tests/snapshots/bolt__parse_43__0.txt | 78 - .../tests/snapshots/bolt__parse_43__1.txt | 77 - .../tests/snapshots/bolt__parse_44__0.txt | 96 -- .../tests/snapshots/bolt__parse_44__1.txt | 83 - .../tests/snapshots/bolt__parse_45__0.txt | 68 - .../tests/snapshots/bolt__parse_45__1.txt | 73 - .../tests/snapshots/bolt__parse_46__0.txt | 130 -- .../tests/snapshots/bolt__parse_46__1.txt | 87 - .../tests/snapshots/bolt__parse_47__0.txt | 39 - .../tests/snapshots/bolt__parse_47__1.txt | 18 - .../tests/snapshots/bolt__parse_48__0.txt | 7 - .../tests/snapshots/bolt__parse_49__0.txt | 35 - .../tests/snapshots/bolt__parse_49__1.txt | 19 - .../tests/snapshots/bolt__parse_4__0.txt | 15 - .../tests/snapshots/bolt__parse_4__1.txt | 15 - .../tests/snapshots/bolt__parse_50__0.txt | 46 - .../tests/snapshots/bolt__parse_50__1.txt | 20 - .../tests/snapshots/bolt__parse_51__0.txt | 38 - .../tests/snapshots/bolt__parse_51__1.txt | 23 - .../tests/snapshots/bolt__parse_52__0.txt | 5 - .../tests/snapshots/bolt__parse_53__0.txt | 47 - .../tests/snapshots/bolt__parse_53__1.txt | 23 - .../tests/snapshots/bolt__parse_54__0.txt | 7 - .../tests/snapshots/bolt__parse_55__0.txt | 45 - .../tests/snapshots/bolt__parse_55__1.txt | 22 - .../tests/snapshots/bolt__parse_56__0.txt | 7 - .../tests/snapshots/bolt__parse_57__0.txt | 47 - .../tests/snapshots/bolt__parse_57__1.txt | 23 - .../tests/snapshots/bolt__parse_58__0.txt | 5 - .../tests/snapshots/bolt__parse_59__0.txt | 5 - .../tests/snapshots/bolt__parse_5__0.txt | 25 - .../tests/snapshots/bolt__parse_5__1.txt | 17 - .../tests/snapshots/bolt__parse_60__0.txt | 5 - .../tests/snapshots/bolt__parse_61__0.txt | 7 - .../tests/snapshots/bolt__parse_62__0.txt | 45 - .../tests/snapshots/bolt__parse_62__1.txt | 25 - .../tests/snapshots/bolt__parse_63__0.txt | 26 - .../tests/snapshots/bolt__parse_63__1.txt | 17 - .../tests/snapshots/bolt__parse_64__0.txt | 55 - .../tests/snapshots/bolt__parse_64__1.txt | 23 - .../tests/snapshots/bolt__parse_65__0.txt | 20 - .../tests/snapshots/bolt__parse_65__1.txt | 17 - .../tests/snapshots/bolt__parse_66__0.txt | 25 - .../tests/snapshots/bolt__parse_66__1.txt | 18 - .../tests/snapshots/bolt__parse_67__0.txt | 35 - .../tests/snapshots/bolt__parse_67__1.txt | 20 - .../tests/snapshots/bolt__parse_68__0.txt | 81 - .../tests/snapshots/bolt__parse_68__1.txt | 30 - .../tests/snapshots/bolt__parse_69__0.txt | 36 - .../tests/snapshots/bolt__parse_69__1.txt | 19 - .../tests/snapshots/bolt__parse_6__0.txt | 25 - .../tests/snapshots/bolt__parse_6__1.txt | 17 - .../tests/snapshots/bolt__parse_70__0.txt | 51 - .../tests/snapshots/bolt__parse_70__1.txt | 25 - .../tests/snapshots/bolt__parse_71__0.txt | 69 - .../tests/snapshots/bolt__parse_71__1.txt | 20 - .../tests/snapshots/bolt__parse_72__0.txt | 75 - .../tests/snapshots/bolt__parse_72__1.txt | 34 - .../tests/snapshots/bolt__parse_73__0.txt | 4 - .../tests/snapshots/bolt__parse_74__0.txt | 4 - .../tests/snapshots/bolt__parse_75__0.txt | 7 - .../tests/snapshots/bolt__parse_76__0.txt | 7 - .../tests/snapshots/bolt__parse_77__0.txt | 69 - .../tests/snapshots/bolt__parse_77__1.txt | 33 - .../tests/snapshots/bolt__parse_78__0.txt | 13 - .../tests/snapshots/bolt__parse_79__0.txt | 11 - .../tests/snapshots/bolt__parse_7__0.txt | 35 - .../tests/snapshots/bolt__parse_7__1.txt | 19 - .../tests/snapshots/bolt__parse_80__0.txt | 20 - .../tests/snapshots/bolt__parse_81__0.txt | 186 --- .../tests/snapshots/bolt__parse_81__1.txt | 46 - .../tests/snapshots/bolt__parse_82__0.txt | 148 -- .../tests/snapshots/bolt__parse_82__1.txt | 36 - .../tests/snapshots/bolt__parse_83__0.txt | 11 - .../tests/snapshots/bolt__parse_84__0.txt | 28 - .../tests/snapshots/bolt__parse_84__1.txt | 16 - .../tests/snapshots/bolt__parse_85__0.txt | 5 - .../tests/snapshots/bolt__parse_86__0.txt | 5 - .../tests/snapshots/bolt__parse_87__0.txt | 68 - .../tests/snapshots/bolt__parse_87__1.txt | 20 - .../tests/snapshots/bolt__parse_88__0.txt | 10 - .../tests/snapshots/bolt__parse_89__0.txt | 66 - .../tests/snapshots/bolt__parse_89__1.txt | 46 - .../tests/snapshots/bolt__parse_8__0.txt | 35 - .../tests/snapshots/bolt__parse_8__1.txt | 19 - .../tests/snapshots/bolt__parse_90__0.txt | 9 - .../tests/snapshots/bolt__parse_91__0.txt | 30 - .../tests/snapshots/bolt__parse_91__1.txt | 17 - .../tests/snapshots/bolt__parse_92__0.txt | 51 - .../tests/snapshots/bolt__parse_92__1.txt | 20 - .../tests/snapshots/bolt__parse_93__0.txt | 51 - .../tests/snapshots/bolt__parse_93__1.txt | 20 - .../tests/snapshots/bolt__parse_94__0.txt | 86 - .../tests/snapshots/bolt__parse_94__1.txt | 26 - .../tests/snapshots/bolt__parse_95__0.txt | 156 -- .../tests/snapshots/bolt__parse_95__1.txt | 34 - .../tests/snapshots/bolt__parse_96__0.txt | 156 -- .../tests/snapshots/bolt__parse_96__1.txt | 34 - .../tests/snapshots/bolt__parse_97__0.txt | 83 - .../tests/snapshots/bolt__parse_97__1.txt | 26 - .../tests/snapshots/bolt__parse_98__0.txt | 8 - .../tests/snapshots/bolt__parse_99__0.txt | 7 - .../tests/snapshots/bolt__parse_9__0.txt | 30 - .../tests/snapshots/bolt__parse_9__1.txt | 18 - .../examples__build_bolt_basic__0.pack.md | 642 -------- .../examples__build_bolt_generated__0.pack.md | 35 - .../examples__build_bolt_merge__0.pack.md | 36 - ...mples__build_bolt_shadow_global__0.pack.md | 22 - .../tests/snapshots/sandbox__run_0__0.txt | 5 - .../tests/snapshots/sandbox__run_1__0.txt | 7 - .../tests/snapshots/sandbox__run_2__0.txt | 7 - .../tests/snapshots/sandbox__run_3__0.txt | 5 - .../tests/snapshots/sandbox__run_4__0.txt | 5 - .../tests/snapshots/sandbox__run_5__0.txt | 5 - .../tests/snapshots/sandbox__run_6__0.txt | 5 - .../tests/snapshots/sandbox__run_7__0.txt | 5 - packages/mecha/tests/test_bolt.py | 54 - packages/mecha/tests/test_sandbox.py | 35 - 383 files changed, 1 insertion(+), 20975 deletions(-) delete mode 100644 packages/mecha/examples/bolt_basic/beet.yml delete mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction delete mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction delete mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction delete mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/functions/thing.mcfunction delete mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction delete mode 100644 packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt delete mode 100644 packages/mecha/examples/bolt_generated/beet.yml delete mode 100644 packages/mecha/examples/bolt_generated/demo.py delete mode 100644 packages/mecha/examples/bolt_generated/src/data/demo/functions/foo.mcfunction delete mode 100644 packages/mecha/examples/bolt_merge/beet.yml delete mode 100644 packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction delete mode 100644 packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction delete mode 100644 packages/mecha/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction delete mode 100644 packages/mecha/examples/bolt_shadow_global/beet.yml delete mode 100644 packages/mecha/examples/bolt_shadow_global/demo.py delete mode 100644 packages/mecha/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction delete mode 100644 packages/mecha/mecha/contrib/bolt/__init__.py delete mode 100644 packages/mecha/mecha/contrib/bolt/ast.py delete mode 100644 packages/mecha/mecha/contrib/bolt/codegen.py delete mode 100644 packages/mecha/mecha/contrib/bolt/helpers.py delete mode 100644 packages/mecha/mecha/contrib/bolt/loop_info.py delete mode 100644 packages/mecha/mecha/contrib/bolt/parse.py delete mode 100644 packages/mecha/mecha/contrib/bolt/plugin.py delete mode 100644 packages/mecha/mecha/contrib/bolt/runtime.py delete mode 100644 packages/mecha/mecha/contrib/bolt/utils.py delete mode 100644 packages/mecha/mecha/contrib/bolt_sandbox.py delete mode 100644 packages/mecha/mecha/resources/bolt.json delete mode 100644 packages/mecha/tests/resources/bolt_examples.mcfunction delete mode 100644 packages/mecha/tests/resources/sandbox_examples.mcfunction delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_0__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_0__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_100__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_100__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_101__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_101__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_102__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_102__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_103__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_103__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_104__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_104__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_105__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_105__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_106__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_106__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_107__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_107__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_108__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_108__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_109__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_109__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_10__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_10__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_110__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_110__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_111__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_111__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_112__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_112__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_113__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_113__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_114__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_114__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_115__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_116__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_117__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_117__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_118__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_118__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_119__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_11__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_11__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_120__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_120__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_121__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_122__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_123__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_124__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_125__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_126__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_126__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_127__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_127__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_128__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_128__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_129__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_129__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_12__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_12__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_130__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_130__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_131__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_132__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_132__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_133__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_133__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_134__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_134__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_135__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_135__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_136__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_136__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_137__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_137__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_138__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_138__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_139__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_139__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_13__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_13__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_140__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_140__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_141__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_141__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_142__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_142__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_143__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_143__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_144__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_144__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_145__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_145__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_146__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_147__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_148__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_149__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_14__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_14__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_150__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_150__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_151__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_151__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_152__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_152__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_153__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_153__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_154__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_154__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_155__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_156__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_156__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_157__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_158__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_159__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_15__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_15__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_160__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_160__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_161__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_161__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_162__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_162__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_163__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_163__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_164__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_164__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_165__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_165__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_166__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_166__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_167__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_167__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_168__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_168__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_169__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_169__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_16__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_16__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_170__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_170__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_171__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_171__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_172__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_173__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_174__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_174__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_175__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_175__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_176__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_176__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_177__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_178__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_179__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_17__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_17__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_180__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_181__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_181__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_182__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_182__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_183__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_184__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_184__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_185__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_185__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_186__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_186__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_187__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_188__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_189__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_18__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_190__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_191__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_192__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_192__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_193__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_193__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_194__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_194__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_195__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_196__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_196__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_197__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_197__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_198__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_198__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_199__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_199__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_19__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_1__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_1__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_200__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_20__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_20__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_21__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_21__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_22__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_22__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_23__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_23__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_24__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_24__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_25__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_25__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_26__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_26__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_27__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_28__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_29__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_29__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_2__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_2__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_30__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_31__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_32__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_32__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_33__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_33__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_34__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_34__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_35__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_35__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_36__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_37__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_38__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_39__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_3__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_3__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_40__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_41__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_41__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_42__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_42__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_43__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_43__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_44__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_44__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_45__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_45__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_46__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_46__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_47__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_47__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_48__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_49__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_49__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_4__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_4__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_50__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_50__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_51__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_51__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_52__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_53__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_53__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_54__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_55__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_55__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_56__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_57__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_57__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_58__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_59__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_5__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_5__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_60__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_61__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_62__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_62__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_63__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_63__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_64__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_64__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_65__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_65__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_66__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_66__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_67__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_67__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_68__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_68__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_69__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_69__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_6__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_6__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_70__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_70__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_71__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_71__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_72__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_72__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_73__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_74__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_75__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_76__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_77__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_77__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_78__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_79__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_7__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_7__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_80__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_81__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_81__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_82__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_82__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_83__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_84__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_84__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_85__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_86__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_87__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_87__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_88__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_89__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_89__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_8__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_8__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_90__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_91__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_91__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_92__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_92__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_93__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_93__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_94__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_94__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_95__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_95__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_96__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_96__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_97__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_97__1.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_98__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_99__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_9__0.txt delete mode 100644 packages/mecha/tests/snapshots/bolt__parse_9__1.txt delete mode 100644 packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_bolt_generated__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_bolt_merge__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_0__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_1__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_2__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_3__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_4__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_5__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_6__0.txt delete mode 100644 packages/mecha/tests/snapshots/sandbox__run_7__0.txt delete mode 100644 packages/mecha/tests/test_bolt.py delete mode 100644 packages/mecha/tests/test_sandbox.py diff --git a/packages/mecha/README.md b/packages/mecha/README.md index dd5ca41aa..7c69817a9 100644 --- a/packages/mecha/README.md +++ b/packages/mecha/README.md @@ -48,7 +48,7 @@ This package provides everything you need for working with Minecraft commands in - Powerful rule dispatcher for processing specific ast nodes - Composable ast visitors and reducers - Comes with useful syntactic extensions like relative locations, nesting and implicit execute -- Compile-time scripting with Bolt, a subset of Python integrated into command syntax +- Compile-time scripting with [Bolt](https://github.com/mcbeet/bolt), a subset of Python integrated into command syntax - Rich function analyzer for keeping track of command statistics - Execute arbitrary compilation passes in your [`beet`](https://github.com/mcbeet/beet) pipeline - _(soon)_ Expressive command API for writing commands in Python diff --git a/packages/mecha/examples/bolt_basic/beet.yml b/packages/mecha/examples/bolt_basic/beet.yml deleted file mode 100644 index c9ed0aae8..000000000 --- a/packages/mecha/examples/bolt_basic/beet.yml +++ /dev/null @@ -1,6 +0,0 @@ -require: - - mecha.contrib.bolt -data_pack: - load: [src] -pipeline: - - mecha diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction deleted file mode 100644 index 8bd9bf620..000000000 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ /dev/null @@ -1,608 +0,0 @@ -say hello -say this is a function file augmented with mecha - -if score @s tmp matches 1.. as @a: - for feature in [ - "multiline", - "nesting", - "implicit execute", - "relative location", - ]: - say (feature + " is automatically enabled") - message = "abc" * 5 - say message.upper() - -def you_can_make_functions(): - say you_can_make_functions.__name__.replace("_", " ").capitalize() - tellraw @a [ - "", - {"text": "yep"}, - ] - return "and return values" - -say you_can_make_functions() - -def fib(n): - if n <= 1: - return n - return fib(n - 1) + fib(n - 2) - -say fib(7) -say fib(8) -say fib(9) - -def default_params_are_neat( - number, - result=fib(number), - thing={ - "number": number, - "result": result, - }, -): - say Unlike in python default params are evaluated when the function is called - say number - say result - say thing - -default_params_are_neat(12) - -say this is basically a custom subset of python -say functions are first-class objects just like in python - -my_functions = [] - -for i in "abc": - def functions_in_loop(value): - def yo(): - say value.upper() - return yo - my_functions.append(functions_in_loop(i * 3)) - -my_functions[0]() -my_functions[1]() -my_functions[2]() - -should_break = False - -while True: - if should_break: - break - say just once - should_break = True - -something = '{"text": "Hello", "bold": true}' -as @a at @s if block ~ ~-1 ~ #wool give @s stone{ - display: { - Name: something - } -} - -with_tuples = ((((())))) + (1,2,3) + (4,) -say with_tuples -say (with_tuples) -say (with_tuples,) -a = f'\\' -say f"f-strings {"work".upper()!r} too {a}" -say f"{{{f"{{{f"{{{7:08}}}\\"}}}\""}}}" - -x = 8 -if score @s tmp matches (x, None) say wat -if score @s tmp matches f"{x}.." say wat - - -def copy_items(type, count): - for i in range(count): - item replace entity @a f"{type}.{i}" from entity @s f"{type}.{i}" - -copy_items('hotbar', 9) -copy_items('inventory', 26) - -def f(): - yield 1 - yield 2 - yield 3 - -for i in f(): - say i - -def wow(ok): - yield from ok() - yield from ok() - -say list(wow(f)) - -say ctx.generate.id("hello") - -import math -say math.cos(math.pi) - -import math as m -say (math is m) - -from ./thing import do_stuff - -say do_stuff(1, math.pi) - -import ./thing as thing - -say (thing.do_stuff is do_stuff) - -for i in range(6): - if i == 1: - say 1 - elif i == 2: - say 2 - elif i == 3: - say 3 - else: - say other - say done - -execute - as @a # For each "player", - at @s # start at their feet. - anchored eyes # Looking through their eyes, - facing 0 0 0 # face perfectly at the target - anchored feet # (go back to the feet) - positioned ^ ^ ^1 # and move one block forward. - rotated as @s # Face the direction the player - # is actually facing, - positioned ^ ^ ^-1 # and move one block back. - if entity @s[distance=..0.6] function ./abc: - say foo - say bar - -baz = "demo:xyz" -if predicate foo:bar function baz: - say foo - say bar - -for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): - append function node.parent: - if node.partition(5): - if score @s thingy matches node.range function node.children - else: - if score @s thingy matches node.range say node.value - -data modify entity @e[type=armor_stand,limit=1] NoBasePlate set value 1b - -from ./thing import call_recursive -call_recursive() - -def try_coordinates(): - a = 1 - setblock a 2 3 stone - a = "1 2 3" - setblock a stone - a = 1 - if block ^ f"^{a}" ^ #planks say 42 - if block ("~", "~", "~") #planks say 42 - -try_coordinates() - -keyword_arguments = dict(foo=1, bar=2, **{"thing": 42}) -say keyword_arguments - -for node in generate_tree(range(8), name="small_tree"): - append function node.parent: - if node.partition(): - if score @s thingy matches node.range function node.children - else: - if score @s thingy matches node.range say node.value - -def try_unpacking(): - a = [1, *"abc", 2] - b = dict(zip(a, a)) - c = {**b, "b": "thing"} - say c - -try_unpacking() - -def try_set_item(): - try_set_item.data = {} - try_set_item.data[1] = {} - try_set_item.data[1][2] = "foo" - say try_set_item.data - -try_set_item() - -for node in generate_tree(range(10, 20), key=int): - append function node.parent: - if node.partition(): - if score @s thingy matches node.range function node.children - else: - if score @s thingy matches node.range say node.value - -scoreboard objectives setdisplay list some_score_name -color = "red" -scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name - -weapon = {1: "weapon.offhand", 2: "weapon.mainhand"} -item replace entity @s weapon.offhand from entity @s weapon.mainhand -my_weapon = weapon -item replace entity @s my_weapon.1 from entity @s my_weapon.2 - -numbers = list(range(12)) -say numbers[:] -say numbers[3:] -say numbers[:9] -say numbers[3:9] -say numbers[::] -say numbers[3::] -say numbers[:9:] -say numbers[3:9:] -say numbers[::-1] -say numbers[9::-1] -say numbers[:3:-1] -say numbers[9:3:-1] - -execute at @s if block ~ ~ ~ #minecraft:beds: - teleport @s ~ ~0.56250 ~ - -del numbers[3:] -say numbers - -for loop, value in loop_info("abcd"): - say f"==[{loop.current}]==" - say (value == loop.current) - say loop.before - say loop.after - say loop.first - say loop.last - say loop.cycle("foo", "bar") - -from ./thing import raw - -raw(f"say hello{'!' * 5}") - -execute function demo:bbb: - say 1 -append function demo:bbb: - say 2 -prepend function demo:bbb: - say 0 - -mykey1 = "foo" - -if data storage some:path/to/storage f"some.{mykey1}.path" -if data storage some:path/to/storage f"some.{mykey1}.path" run say hi -if data storage some:path/to/storage f'some.{mykey1}.path{{my: "compound"}}' -if data storage some:path/to/storage f'some.{mykey1}.path{{my: "compound"}}' run say hi - -mykey2 = "bar" - -mypath1 = f"some.{mykey2}.path" -if data storage some:path/to/storage (mypath1) -if data storage some:path/to/storage (mypath1) run say hi - -mypath2 = f'some.{mykey2}.path{{my: "compound"}}' -if data storage some:path/to/storage (mypath2) -if data storage some:path/to/storage (mypath2) run say hi - -mypath3 = f'some.{mykey2}.path[{{my: "subscript"}}]' -if data storage some:path/to/storage (mypath3) -if data storage some:path/to/storage (mypath3) run say hi - -myindex = 42 - -if data storage some:path/to/storage f'some.{mykey1}.path{{my: "compound"}}.stuff[{myindex}].beep.{mykey2}[{{my: "subscript"}}].boop' run say hi - -mypath4 = "foo.bar" -if data storage some:path/to/storage mypath4 - -if data storage some:path/to/storage "some.foo.path" - -import nbtlib -mypath5 = nbtlib.Path().something.cool[3].foo -if data storage some:path/to/storage mypath5 - -from uuid import UUID - -def try_entity_interpolation(x): - if score x some_objective matches 0 say yes - -try_entity_interpolation("some_fake_player") -try_entity_interpolation("0-0-0-0-1") -try_entity_interpolation(UUID("12345678-1234-5678-1234-567812345678")) - -entity_type = "creeper" -at @e[type=entity_type] summon lightning_bolt - -language minecraft:aaaa { - "menu.singleplayer": "AAAA" -} - -some_translation = "bonjour" - -merge language minecraft:aaaa { - "something.else": some_translation -} - -merge language minecraft:aaaa: - yaml.key1: some_translation.upper() - yaml.key2: some_translation.title() - -x = 0 -y = 1 -z = 2 - -data merge storage demo:foo: - custom_data1: [x, y, z] - custom_data2: - - x - - y - - z - -def set_at_origin(block): - setblock 0 0 0 block - -set_at_origin(minecraft:stone) - -some_name = ./useless/../no_quotes_lol -function some_name: - say that's neat - -if ./a/b/c == ./x/../a/b/x/../c: - say same thing - -tellraw @a: - text: 'hello world' - -function_tag felix:howdy: - values: ['demo:foo', __name__] - -execute at @s run particle minecraft:dust 0 1 1 0.9 ~ ~1 ~ 0 0 0 0.01 1 force -execute at @s run particle minecraft:block yellow_concrete ~ ~1.62 ~ 0 0.4 0 0 30 force -execute at @s run particle minecraft:block minecraft:light_blue_concrete ~ ~1 ~ 0.05 0.1 0.05 0 3 - -particle_file minecraft:end_rod { - "textures": [ - "minecraft:glitter_7", - "minecraft:glitter_6", - "minecraft:glitter_5", - "minecraft:glitter_4", - "minecraft:glitter_3", - "minecraft:glitter_2", - "minecraft:glitter_1", - "minecraft:glitter_0" - ] -} - -for obj in ["foo", "bar"]: - as @a[scores={obj=1..}] scoreboard players remove @s obj 1 - -x = 8 -scoreboard players set @p tmp -x - -x = 12 -y = 23 -z = 34 - -tp @s f"~{x} ~{y} ~{z}" -tp @s f"~{x}" y f"~{z}" - -tp @s x y z -tp @s ~x ~y ~z -tp @s ^x ^y ^z -tp @s -x -y -z -tp @s ~-x ~-y ~-z -tp @s ^-x ^-y ^-z - -for i, x in enumerate("abc"): - say f"{i} {x}" - -major, minor, patch = "1.2.3".split(".") -say major -say minor -say patch - -def check_above(n): - if n > 0: - if block ~ ~n ~ air: - check_above(n - 1) - else: - say nothing above! - -check_above(6) - -math = 0 -say math -def wat(): - global math - import math -wat() -say math.ceil(0.1) - -say bolt implements a __rebind__(rhs) magic method that gets called when you reassign a value to a variable -say let's try it out by manually building a class - -def init_global_score(self, name): - self.name = name - -def add_global_score(self, rhs): - tmp = GlobalScore(generate_id("tmp.{incr}")) - scoreboard players operation tmp.name global = self.name global - tmp += rhs - return tmp - -def iadd_global_score(self, rhs): - if isinstance(rhs, GlobalScore): - scoreboard players operation self.name global += rhs.name global - else: - scoreboard players add self.name global rhs - return self - -def rebind_global_score(self, rhs): - if self is not rhs: - if isinstance(rhs, GlobalScore): - scoreboard players operation self.name global = rhs.name global - else: - scoreboard players set self.name global rhs - return self - -GlobalScore = type("GlobalScore", (), { - "__init__": init_global_score, - "__add__": add_global_score, - "__iadd__": iadd_global_score, - "__rebind__": rebind_global_score, -}) - -a = GlobalScore("a") -a = 123 -a = 456 - -b = GlobalScore("b") -b = 789 -b = a - -a += b + 6 + a -b += 1 - -say you can use nonlocal to create fake classes - -def Counter(x=0): - def incr(): - nonlocal x - x += 1 - return x - return {"incr": incr} - -counter = Counter() -say counter.incr() -say counter.incr() -say Counter(9).incr() - -def foo(msg): - say msg - -if score #temp abc matches 1..: - foo("foo") - -tag_name = ./yolo_funcs - -function_tag tag_name: - values: - - "demo:foo" - -as @p function #tag_name # this runs the tag - -def truth_table(): - for a in [False, True]: - for b in [False, True]: - for c in [False, True]: - for d in [False, True]: - yield (a and b or c and not d) in [True] not in [False] - -say list(truth_table()) - -def not_init(self, value): - self.value = value - -def not_not(self): - say self.value - return self - -NotPrint = type("NotPrint", (), {"__init__": not_init, "__not__": not_not}) -not not not not NotPrint("hello") - -def thing_within(self, container): - for item in container: - say (self == item) - return self - -def thing_contains(self, item): - say (self == item) - return self - -def thing_equal(self, item): - return f"thing == {item}" - -Thing = type("Thing", (), {"__within__": thing_within, "__contains__": thing_contains, "__eq__": thing_equal}) -Thing() in [1, 2, 3] in [99] -"world" in ("hello" in Thing()) - -from contextlib import contextmanager - -def dsl_init(self, score, inverted=False): - self.score = score - self.inverted = inverted - -def dsl_not(self): - return DSL(self.score, not self.inverted) - -def dsl_branch(self): - if score @s self.score matches int(not self.inverted): - yield True - -DSL = type("DSL", (), {"__init__": dsl_init, "__not__": dsl_not, "__branch__": contextmanager(dsl_branch)}) - -if DSL("foo"): - say yes - if DSL("bar"): - say with bar -else: - say no - -predicate ./check_scores [ - { - "condition": "minecraft:entity_scores", - "entity": "this", - "scores": { - "foo": 1 - } - }, - { - "condition": "minecraft:entity_scores", - "entity": "killer_player", - "scores": { - "bar": 1 - } - } -] - -def cond_init(self, name=generate_id("tmp{incr}")): - self.name = name - -def cond_str(self): - return self.name - -def cond_not(self): - result = Cond() - result = 1 - unless score global self matches 0: - result = 0 - return result - -def cond_dup(self): - result = Cond() - result = self - return result - -def cond_rebind(self, rhs): - if isinstance(rhs, Cond): - scoreboard players operation global self = global rhs - else: - scoreboard players set global self rhs - return self - -def cond_branch(self): - unless score global self matches 0: - yield True - -Cond = type("Cond", (), { - "__init__": cond_init, - "__str__": cond_str, - "__not__": cond_not, - "__dup__": cond_dup, - "__rebind__": cond_rebind, - "__branch__": contextmanager(cond_branch), -}) - -is_awesome = Cond("is_awesome") -is_awesome = Cond("is_cool") and Cond("is_nice") - -if is_awesome or Cond("force_awesomeness"): - say hello - -from ./utils import something -something() diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction deleted file mode 100644 index 8580b051b..000000000 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction +++ /dev/null @@ -1,18 +0,0 @@ -from mecha.contrib.bolt import Runtime - -runtime = ctx.inject(Runtime) - -foo = 42 - -def callback(): - return foo - -def loga(f): - runtime.get_module().namespace["bar"] *= 2 - say __name__ - say runtime.get_path() - say f() - -from ./import_b import logb - -logb(callback) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction deleted file mode 100644 index d608aad46..000000000 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction +++ /dev/null @@ -1,18 +0,0 @@ -from mecha.contrib.bolt import Runtime - -runtime = ctx.inject(Runtime) - -bar = 7 - -def callback(): - return bar - -def logb(f): - runtime.get_module().namespace["foo"] *= 2 - say __name__ - say runtime.get_path() - say f() - -from ./import_a import loga - -loga(callback) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/thing.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/thing.mcfunction deleted file mode 100644 index 0572fcf45..000000000 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/thing.mcfunction +++ /dev/null @@ -1,15 +0,0 @@ -from mecha import Mecha -from mecha.contrib.bolt import Runtime - -mc = ctx.inject(Mecha) -runtime = ctx.inject(Runtime) - -def do_stuff(a, b): - import math - return a + math.cos(b) - -def call_recursive(): - if score @s loop_again matches 1 function runtime.get_path() - -def raw(cmd): - runtime.commands.append(mc.parse(cmd, using="command")) diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction b/packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction deleted file mode 100644 index ed8bb9ae4..000000000 --- a/packages/mecha/examples/bolt_basic/src/data/demo/functions/utils.mcfunction +++ /dev/null @@ -1 +0,0 @@ -say this doesn't conflict with the demo:utils module diff --git a/packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt b/packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt deleted file mode 100644 index 8143a1168..000000000 --- a/packages/mecha/examples/bolt_basic/src/data/demo/modules/utils.bolt +++ /dev/null @@ -1,2 +0,0 @@ -def something(): - say f"this is from {__name__}" diff --git a/packages/mecha/examples/bolt_generated/beet.yml b/packages/mecha/examples/bolt_generated/beet.yml deleted file mode 100644 index 899b9c7d5..000000000 --- a/packages/mecha/examples/bolt_generated/beet.yml +++ /dev/null @@ -1,7 +0,0 @@ -require: - - mecha.contrib.bolt -data_pack: - load: [src] -pipeline: - - demo - - mecha diff --git a/packages/mecha/examples/bolt_generated/demo.py b/packages/mecha/examples/bolt_generated/demo.py deleted file mode 100644 index 513680caa..000000000 --- a/packages/mecha/examples/bolt_generated/demo.py +++ /dev/null @@ -1,11 +0,0 @@ -from beet import Context, Function - -generated_code = """ -execute if score #smithed.core load.status matches 1 function ./0: - data merge storage smithed:log {message:'["Could not find ",{"text":"#smithed.prevent_aggression 0.0.1","color":"red"}]',type:'ERROR'} - function #smithed:core/pub/technical/tools/log -""" - - -def beet_default(ctx: Context): - ctx.data["demo:generated"] = Function(generated_code) diff --git a/packages/mecha/examples/bolt_generated/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_generated/src/data/demo/functions/foo.mcfunction deleted file mode 100644 index 4f5df804d..000000000 --- a/packages/mecha/examples/bolt_generated/src/data/demo/functions/foo.mcfunction +++ /dev/null @@ -1,2 +0,0 @@ -a = 123 -say a diff --git a/packages/mecha/examples/bolt_merge/beet.yml b/packages/mecha/examples/bolt_merge/beet.yml deleted file mode 100644 index 4275307e7..000000000 --- a/packages/mecha/examples/bolt_merge/beet.yml +++ /dev/null @@ -1,8 +0,0 @@ -data_pack: - load: ["pack_1", "pack_2"] -require: - - mecha.contrib.bolt - - mecha.contrib.messages - - beet.contrib.auto_yaml -pipeline: - - mecha diff --git a/packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction b/packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction deleted file mode 100644 index 6ba9cd6d2..000000000 --- a/packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction +++ /dev/null @@ -1,2 +0,0 @@ -from pack_1:utils import hello -hello("Bob") diff --git a/packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction b/packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction deleted file mode 100644 index 277812f17..000000000 --- a/packages/mecha/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction +++ /dev/null @@ -1,3 +0,0 @@ -def hello(name): - say f"Hello, {name}!" -hello("Alice") diff --git a/packages/mecha/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction b/packages/mecha/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction deleted file mode 100644 index 6ecf74efb..000000000 --- a/packages/mecha/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction +++ /dev/null @@ -1,2 +0,0 @@ -from pack_1:utils import hello -hello("Carol") diff --git a/packages/mecha/examples/bolt_shadow_global/beet.yml b/packages/mecha/examples/bolt_shadow_global/beet.yml deleted file mode 100644 index 6ffb23164..000000000 --- a/packages/mecha/examples/bolt_shadow_global/beet.yml +++ /dev/null @@ -1,7 +0,0 @@ -require: - - mecha.contrib.bolt - - demo -data_pack: - load: [src] -pipeline: - - mecha diff --git a/packages/mecha/examples/bolt_shadow_global/demo.py b/packages/mecha/examples/bolt_shadow_global/demo.py deleted file mode 100644 index ca7ec20ba..000000000 --- a/packages/mecha/examples/bolt_shadow_global/demo.py +++ /dev/null @@ -1,8 +0,0 @@ -from beet import Context - -from mecha.contrib.bolt import Runtime - - -def beet_default(ctx: Context): - runtime = ctx.inject(Runtime) - runtime.expose("max", lambda *args: args) diff --git a/packages/mecha/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction deleted file mode 100644 index 1cce0ac31..000000000 --- a/packages/mecha/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction +++ /dev/null @@ -1 +0,0 @@ -say max(1, 2, 3) diff --git a/packages/mecha/mecha/contrib/bolt/__init__.py b/packages/mecha/mecha/contrib/bolt/__init__.py deleted file mode 100644 index 0c3539897..000000000 --- a/packages/mecha/mecha/contrib/bolt/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .ast import * -from .codegen import * -from .helpers import * -from .loop_info import * -from .parse import * -from .plugin import * -from .runtime import * diff --git a/packages/mecha/mecha/contrib/bolt/ast.py b/packages/mecha/mecha/contrib/bolt/ast.py deleted file mode 100644 index a153d535d..000000000 --- a/packages/mecha/mecha/contrib/bolt/ast.py +++ /dev/null @@ -1,252 +0,0 @@ -__all__ = [ - "AstModuleRoot", - "AstExpression", - "AstExpressionBinary", - "AstExpressionUnary", - "AstValue", - "AstIdentifier", - "AstFormatString", - "AstTuple", - "AstList", - "AstDictItem", - "AstDict", - "AstSlice", - "AstUnpack", - "AstKeyword", - "AstAttribute", - "AstLookup", - "AstCall", - "AstTarget", - "AstTargetIdentifier", - "AstTargetUnpack", - "AstTargetAttribute", - "AstTargetItem", - "AstAssignment", - "AstFunctionSignature", - "AstFunctionSignatureArgument", - "AstFunctionRoot", - "AstInterpolation", - "AstImportedIdentifier", -] - - -from dataclasses import dataclass -from typing import Any, Optional, Union - -from beet.core.utils import required_field -from tokenstream import TokenStream - -from mecha import AstChildren, AstNode, AstRoot - - -@dataclass(frozen=True) -class AstModuleRoot(AstRoot): - """Module root ast node.""" - - -@dataclass(frozen=True) -class AstExpression(AstNode): - """Base ast node for expressions.""" - - -@dataclass(frozen=True) -class AstExpressionBinary(AstExpression): - """Ast expression binary node.""" - - operator: str = required_field() - left: AstExpression = required_field() - right: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstExpressionUnary(AstExpression): - """Ast expression unary node.""" - - operator: str = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstValue(AstExpression): - """Ast value node.""" - - value: Any = required_field() - - -@dataclass(frozen=True) -class AstIdentifier(AstExpression): - """Ast identifier node.""" - - value: str = required_field() - - -@dataclass(frozen=True) -class AstFormatString(AstExpression): - """Ast format string node.""" - - fmt: str = required_field() - values: AstChildren[AstExpression] = required_field() - - -@dataclass(frozen=True) -class AstTuple(AstExpression): - """Ast tuple node.""" - - items: AstChildren[AstExpression] = required_field() - - -@dataclass(frozen=True) -class AstList(AstExpression): - """Ast list node.""" - - items: AstChildren[AstExpression] = required_field() - - -@dataclass(frozen=True) -class AstDictItem(AstNode): - """Ast dict item node.""" - - key: AstExpression = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstDict(AstExpression): - """Ast dict node.""" - - items: AstChildren[AstDictItem] = required_field() - - -@dataclass(frozen=True) -class AstSlice(AstNode): - """Ast slice node.""" - - start: Optional[AstExpression] = None - stop: Optional[AstExpression] = None - step: Optional[AstExpression] = None - - -@dataclass(frozen=True) -class AstUnpack(AstNode): - """Ast unpack node.""" - - type: str = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstKeyword(AstNode): - """Ast keyword node.""" - - name: str = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstAttribute(AstExpression): - """Ast attribute node.""" - - name: str = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstLookup(AstExpression): - """Ast lookup node.""" - - value: AstExpression = required_field() - arguments: AstChildren[Union[AstExpression, AstSlice]] = required_field() - - -@dataclass(frozen=True) -class AstCall(AstExpression): - """Ast call node.""" - - value: AstExpression = required_field() - arguments: AstChildren[ - Union[AstExpression, AstUnpack, AstKeyword] - ] = required_field() - - -@dataclass(frozen=True) -class AstTarget(AstNode): - """Base node for targets.""" - - -@dataclass(frozen=True) -class AstTargetIdentifier(AstTarget): - """Ast target identifier node.""" - - value: str = required_field() - rebind: bool = False - - -@dataclass(frozen=True) -class AstTargetUnpack(AstTarget): - """Ast target unpack node.""" - - targets: AstChildren[AstTarget] = required_field() - - -@dataclass(frozen=True) -class AstTargetAttribute(AstTarget): - """Ast target attribute node.""" - - name: str = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstTargetItem(AstTarget): - """Ast target item node.""" - - value: AstExpression = required_field() - arguments: AstChildren[Union[AstExpression, AstSlice]] = required_field() - - -@dataclass(frozen=True) -class AstAssignment(AstNode): - """Ast assignment node.""" - - operator: str = required_field() - target: AstTarget = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstFunctionSignatureArgument(AstNode): - """Ast function signature argument node.""" - - name: str = required_field() - default: Optional[AstExpression] = None - - -@dataclass(frozen=True) -class AstFunctionSignature(AstNode): - """Ast function signature node.""" - - name: str = required_field() - arguments: AstChildren[AstFunctionSignatureArgument] = required_field() - - -@dataclass(frozen=True) -class AstFunctionRoot(AstNode): - """Ast function root node.""" - - stream: TokenStream = required_field() - - -@dataclass(frozen=True) -class AstInterpolation(AstNode): - """Ast interpolation node.""" - - prefix: Optional[str] = None - converter: str = required_field() - value: AstExpression = required_field() - - -@dataclass(frozen=True) -class AstImportedIdentifier(AstNode): - """Ast imported identifier node.""" - - value: str = required_field() diff --git a/packages/mecha/mecha/contrib/bolt/codegen.py b/packages/mecha/mecha/contrib/bolt/codegen.py deleted file mode 100644 index 6f08a2d87..000000000 --- a/packages/mecha/mecha/contrib/bolt/codegen.py +++ /dev/null @@ -1,956 +0,0 @@ -__all__ = [ - "Codegen", - "Accumulator", - "ChildrenCollector", - "CommandCollector", - "RootCommandCollector", - "visit_single", - "visit_multiple", - "visit_generic", - "visit_body", - "visit_binding", -] - - -from contextlib import contextmanager -from dataclasses import dataclass, field, fields -from typing import ( - Any, - Dict, - Generator, - Iterable, - List, - Literal, - Optional, - Tuple, - Type, - cast, - overload, -) - -from beet.core.utils import normalize_string - -from mecha import ( - AstChildren, - AstCommand, - AstNode, - AstResourceLocation, - AstRoot, - Visitor, - rule, -) - -from .ast import ( - AstAssignment, - AstAttribute, - AstCall, - AstDict, - AstDictItem, - AstExpressionBinary, - AstExpressionUnary, - AstFormatString, - AstFunctionSignature, - AstIdentifier, - AstImportedIdentifier, - AstInterpolation, - AstKeyword, - AstList, - AstLookup, - AstSlice, - AstTargetAttribute, - AstTargetIdentifier, - AstTargetItem, - AstTargetUnpack, - AstTuple, - AstUnpack, - AstValue, -) - - -@dataclass -class Accumulator: - """Utility for generating python code.""" - - indentation: str = "" - refs: List[Any] = field(default_factory=list) - lines: List[str] = field(default_factory=list) - counter: int = 0 - header: Dict[str, str] = field(default_factory=dict) - - last_condition: str = "_mecha_error_last_condition" - - def get_source(self) -> str: - """Return the source code.""" - header = "".join( - f"{variable} = {expression}\n" - for expression, variable in self.header.items() - ) - - lines: List[str] = ["_mecha_lineno = "] - numbers1: List[int] = [1] - numbers2: List[int] = [1] - - for line in (header + "".join(self.lines)).splitlines(): - if line.startswith("!lineno "): - current_line = int(line[8:]) - if numbers2[-1] != current_line: - numbers1.append(len(lines) + 1) - numbers2.append(current_line) - else: - lines.append(line) - - lines[0] += f"{numbers1}, {numbers2}" - - return "\n".join(lines) + "\n" - - def helper(self, name: str, *args: Any) -> str: - """Emit helper.""" - helper = f"_mecha_runtime.helpers[{name!r}]" - - if helper not in self.header: - self.header[helper] = f"_mecha_helper_{normalize_string(name)}" - - return f"{self.header[helper]}({', '.join(map(str, args))})" - - def replace(self, node: str, **kwargs: str) -> str: - """Emit replace helper.""" - return self.helper("replace", node, *(f"{k}={v}" for k, v in kwargs.items())) - - def missing(self) -> str: - """Emit missing sentinel.""" - self.header["_mecha_runtime.helpers['missing']"] = f"_mecha_helper_missing" - return f"_mecha_helper_missing" - - def children(self, nodes: Iterable[str]) -> str: - """Emit children helper.""" - return self.helper("children", f"[{', '.join(nodes)}]") - - def get_attribute(self, obj: str, name: str) -> str: - """Emit get_attribute helper.""" - return self.helper("get_attribute", obj, repr(name)) - - def import_module(self, name: str) -> str: - """Emit import_module helper.""" - return self.helper("import_module", repr(name)) - - def make_ref(self, obj: Any) -> str: - """Register ref.""" - index = len(self.refs) - self.refs.append(obj) - return f"_mecha_refs[{index}]" - - def make_ref_slice(self, objs: Iterable[Any]) -> str: - """Register ref slice.""" - start = len(self.refs) - self.refs.extend(objs) - stop = len(self.refs) - return f"_mecha_refs[{start}:{stop}]" - - def make_variable(self) -> str: - """Create a unique variable name.""" - name = f"_mecha_var{self.counter}" - self.counter += 1 - return name - - @contextmanager - def block(self): - """Wrap statements in an indented block.""" - previous_indentation = self.indentation - self.indentation += " " - try: - yield - finally: - self.indentation = previous_indentation - - def statement(self, code: str, *, lineno: Any = None): - """Emit statement.""" - if isinstance(lineno, AstNode) and not lineno.location.unknown: - lineno = lineno.location.lineno - if isinstance(lineno, int): - self.lines.append(f"!lineno {lineno}\n") - self.lines.append(f"{self.indentation}{code}\n") - - @contextmanager - def if_statement(self, condition: str): - """Emit if statement.""" - branch = self.helper("branch", condition) - self.statement(f"with {branch} as _mecha_condition:") - with self.block(): - self.statement(f"if _mecha_condition:") - with self.block(): - yield - self.last_condition = condition - - @contextmanager - def else_statement(self): - """Emit else statement.""" - negated_value = self.helper("operator_not", self.last_condition) - self.statement(f"{self.last_condition} = {negated_value}") - with self.if_statement(self.last_condition): - yield - - -@dataclass -class ChildrenCollector: - """Generic children collector.""" - - acc: Accumulator - start_index: int - children: List[str] = field(default_factory=list) - - def add_static(self, *args: AstNode): - self.children.extend(self.acc.make_ref(node) for node in args) - - def add_dynamic(self, *args: str): - self.children.extend(args) - - def flush(self) -> str: - return self.acc.children(self.children) - - -class CommandCollector(ChildrenCollector): - """Collector for commands.""" - - def add_static(self, *args: AstNode): - if len(args) > 1: - self.acc.statement( - f"_mecha_runtime.commands.extend({self.acc.make_ref_slice(args)})" - ) - elif args: - self.acc.statement( - f"_mecha_runtime.commands.append({self.acc.make_ref(args[0])})" - ) - - def add_dynamic(self, *args: str): - for arg in args: - self.acc.statement(f"_mecha_runtime.commands.append({arg})") - - -class RootCommandCollector(CommandCollector): - """Collector for commands in a standalone root node.""" - - def flush(self) -> str: - commands = self.acc.make_variable() - self.acc.lines[self.start_index :] = [ - line if line.startswith("!") else f" {line}" - for line in self.acc.lines[self.start_index :] - ] - self.acc.lines.insert( - self.start_index, - f"{self.acc.indentation}with _mecha_runtime.scope() as {commands}:\n", - ) - return self.acc.helper("children", commands) - - -@overload -def visit_single( - node: AstNode, -) -> Generator[AstNode, Optional[List[str]], Optional[str]]: - ... - - -@overload -def visit_single( - node: AstNode, - required: Literal[True], -) -> Generator[AstNode, Optional[List[str]], str]: - ... - - -def visit_single( - node: AstNode, - required: bool = False, -) -> Generator[AstNode, Optional[List[str]], Optional[str]]: - """Yield the node and make sure that it returns a single result.""" - result = yield node - - if result is None: - if required: - raise ValueError( - f"Result required for {node.__class__.__name__} {result!r}." - ) - return None - - if len(result) != 1: - raise ValueError( - f"Expected single result for {node.__class__.__name__} {result!r}." - ) - - return result[0] - - -def visit_multiple( - children: AstChildren[AstNode], - acc: Accumulator, - children_collector: Type[ChildrenCollector] = ChildrenCollector, -) -> Generator[AstNode, Optional[List[str]], Optional[str]]: - """Yield all the nodes and return a single result pointing to the new children.""" - current_count = 0 - collector = None - index = len(acc.lines) - - for i, child in enumerate(children): - result = yield child - if result is None: - continue - if not collector: - collector = children_collector(acc, index) - - lines = acc.lines[index:] - del acc.lines[index:] - collector.add_static(*children[current_count:i]) - acc.lines.extend(lines) - collector.add_dynamic(*result) - - current_count = i + 1 - index = len(acc.lines) - - if collector: - collector.add_static(*children[current_count:]) - return collector.flush() - - return None - - -def visit_generic( - node: AstNode, - acc: Accumulator, - children_collector: Type[ChildrenCollector] = ChildrenCollector, -) -> Generator[AstNode, Optional[List[str]], Optional[str]]: - """Recursively yield all the fields and return a result pointing to the updated node.""" - to_replace: Dict[str, str] = {} - - for f in fields(node): - attribute = getattr(node, f.name) - result = None - - if isinstance(attribute, AstChildren): - attribute = cast(AstChildren[AstNode], attribute) - result = yield from visit_multiple(attribute, acc, children_collector) - - elif isinstance(attribute, AstNode): - result = yield from visit_single(attribute) - - if result is not None: - to_replace[f.name] = result - - if not to_replace: - return None - - return acc.replace(acc.make_ref(node), **to_replace) - - -def visit_body( - node: AstRoot, - acc: Accumulator, -) -> Generator[AstNode, Optional[List[str]], None]: - """Emit each individual command in the current scope.""" - result = yield from visit_multiple(node.commands, acc, CommandCollector) - if result is None: - acc.statement(f"_mecha_runtime.commands.extend({acc.make_ref(node)}.commands)") - - -def visit_binding( - target_node: AstNode, - op: str, - value: str, - acc: Accumulator, -) -> Generator[AstNode, Optional[List[str]], None]: - """Emit variable binding.""" - targets = yield target_node - - if not targets: - return - - if len(targets) > 1 and isinstance(target_node, AstTargetUnpack): - nodes = target_node.targets - values = [f"_mecha_unpack{i}" for i in range(len(targets))] - acc.statement(f"{', '.join(values)} = {value}", lineno=target_node) - else: - nodes = [target_node] - values = [value] - - for node, target, value in zip(nodes, targets, values): - if isinstance(node, AstTargetIdentifier) and node.rebind: - rebind = acc.helper("get_rebind", target) - acc.statement(f"_mecha_rebind = {rebind}", lineno=node) - acc.statement(f"{target} {op} {value}") - acc.statement(f"if _mecha_rebind is not None:") - with acc.block(): - acc.statement(f"{target} = _mecha_rebind({target})") - else: - acc.statement(f"{target} {op} {value}", lineno=node) - - -class Codegen(Visitor): - """Code generator.""" - - def __call__(self, node: AstRoot) -> Tuple[Optional[str], Optional[str], List[Any]]: # type: ignore - acc = Accumulator() - result = self.invoke(node, acc) - if result is None: - return None, None, acc.refs - elif len(result) != 1: - raise ValueError( - f"Expected single result for {node.__class__.__name__} {result!r}." - ) - output = acc.make_variable() - acc.statement(f"{output} = {result[0]}") - return acc.get_source(), output, acc.refs - - @rule(AstNode) - def fallback( - self, - node: AstNode, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_generic(node, acc) - if result is None: - return None - return [result] - - @rule(AstRoot) - def root( - self, - node: AstRoot, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_generic(node, acc, RootCommandCollector) - if result is None: - return None - return [result] - - @rule(AstCommand, identifier="statement") - def statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - yield node.arguments[0] - return [] - - @rule(AstCommand, identifier="def:function:body") - def function( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - signature = cast(AstFunctionSignature, node.arguments[0]) - arguments: List[str] = [ - f"{arg.name}={acc.missing()}" if arg.default else arg.name - for arg in signature.arguments - ] - - acc.statement(f"def {signature.name}({', '.join(arguments)}):") - - with acc.block(): - for arg in signature.arguments: - if arg.default: - acc.statement(f"if {arg.name} is {acc.missing()}:") - with acc.block(): - value = yield from visit_single(arg.default, required=True) - acc.statement(f"{arg.name} = {value}") - - yield from visit_body(cast(AstRoot, node.arguments[1]), acc) - - return [] - - @rule(AstCommand, identifier="return") - @rule(AstCommand, identifier="return:value") - def return_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - statement = "return" - if node.arguments: - value = yield from visit_single(node.arguments[0], required=True) - statement += f" {value}" - acc.statement(statement) - return [] - - @rule(AstCommand, identifier="yield") - @rule(AstCommand, identifier="yield:value") - @rule(AstCommand, identifier="yield:from:value") - def yield_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - statement = "yield from" if node.identifier == "yield:from:value" else "yield" - if node.arguments: - value = yield from visit_single(node.arguments[0], required=True) - statement += f" {value}" - acc.statement(statement) - return [] - - @rule(AstCommand, identifier="del:target") - def del_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - targets = yield node.arguments[0] - for target in targets or []: - acc.statement(f"del {target}") - return [] - - @rule(AstCommand, identifier="if:condition:body") - def if_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - condition = yield from visit_single(node.arguments[0], required=True) - with acc.if_statement(condition): - yield from visit_body(cast(AstRoot, node.arguments[1]), acc) - return [] - - @rule(AstCommand, identifier="else:body") - def else_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - with acc.else_statement(): - yield from visit_body(cast(AstRoot, node.arguments[0]), acc) - return [] - - @rule(AstCommand, identifier="while:condition:body") - def while_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - condition = yield from visit_single(node.arguments[0], required=True) - acc.statement(f"while {condition}:") - with acc.block(): - yield from visit_body(cast(AstRoot, node.arguments[1]), acc) - return [] - - @rule(AstCommand, identifier="for:target:in:iterable:body") - def for_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - iterable = yield from visit_single(node.arguments[1], required=True) - targets = yield node.arguments[0] - acc.statement(f"for {', '.join(targets or ['_'])} in {iterable}:") - with acc.block(): - yield from visit_body(cast(AstRoot, node.arguments[2]), acc) - return [] - - @rule(AstCommand, identifier="break") - def break_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Optional[List[str]]: - acc.statement("break") - return [] - - @rule(AstCommand, identifier="continue") - def continue_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Optional[List[str]]: - acc.statement("continue") - return [] - - @rule(AstCommand, identifier="import:module") - @rule(AstCommand, identifier="import:module:as:alias") - @rule(AstCommand, identifier="from:module:import:subcommand") - def import_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Optional[List[str]]: - module = cast(AstResourceLocation, node.arguments[0]) - - if node.identifier == "from:module:import:subcommand": - names: List[str] = [] - subcommand = cast(AstCommand, node.arguments[1]) - - while True: - if isinstance(name := subcommand.arguments[0], AstImportedIdentifier): - names.append(name.value) - if subcommand.identifier == "from:module:import:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break - - if module.namespace: - acc.statement( - f"{', '.join(names)} = _mecha_runtime.from_module_import({module.get_value()!r}, {', '.join(map(repr, names))})", - lineno=node, - ) - else: - for name in names: - rhs = acc.get_attribute(acc.import_module(module.path), name) - acc.statement(f"{name} = {rhs}", lineno=node) - - elif node.identifier == "import:module:as:alias": - alias = cast(AstImportedIdentifier, node.arguments[1]).value - - if module.namespace: - acc.statement( - f"{alias} = _mecha_runtime.import_module({module.get_value()!r}).namespace", - lineno=node, - ) - else: - rhs = acc.import_module(module.path) - acc.statement(f"{alias} = {rhs}", lineno=node) - - else: - name = module.path.partition(".")[0] - rhs = acc.import_module(module.path) - if name == module.path: - acc.statement(f"{name} = {rhs}", lineno=node) - else: - acc.statement(rhs, lineno=node) - acc.statement(f"{name} = {acc.import_module(name)}") - - return [] - - @rule(AstCommand, identifier="global:subcommand") - @rule(AstCommand, identifier="nonlocal:subcommand") - def global_nonlocal_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Optional[List[str]]: - storage, _, _ = node.identifier.partition(":") - - names: List[str] = [] - subcommand = cast(AstCommand, node.arguments[0]) - - while True: - if isinstance(name := subcommand.arguments[0], AstIdentifier): - names.append(name.value) - if subcommand.identifier == f"{storage}:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break - - acc.statement(f"{storage} {', '.join(names)}", lineno=node) - - return [] - - @rule(AstInterpolation) - def interpolation( - self, - node: AstInterpolation, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_single(node.value, required=True) - value = "f" + repr(node.prefix + "{" + result + "}") if node.prefix else result - rhs = acc.helper(f"interpolate_{node.converter}", value, acc.make_ref(node)) - acc.statement(f"{result} = {rhs}", lineno=node) - return [result] - - @rule(AstExpressionBinary) - def binary( - self, - node: AstExpressionBinary, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - left = yield from visit_single(node.left, required=True) - right = yield from visit_single(node.right, required=True) - if node.operator in ["in", "not_in"]: - value = acc.helper(f"operator_{node.operator}", left, right) - acc.statement(f"{left} = {value}", lineno=node) - else: - op = node.operator.replace("_", " ") - acc.statement(f"{left} = {left} {op} {right}", lineno=node) - return [left] - - @rule(AstExpressionBinary, operator="and") - @rule(AstExpressionBinary, operator="or") - def binary_logical( - self, - node: AstExpressionBinary, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - left = yield from visit_single(node.left, required=True) - - condition = acc.make_variable() - value = acc.helper("operator_not", left) if node.operator == "or" else left - acc.statement(f"{condition} = {value}", lineno=node.left) - - dup = acc.make_variable() - value = acc.helper("get_dup", left) - acc.statement(f"{dup} = {value}") - acc.statement(f"if {dup} is not None:") - with acc.block(): - acc.statement(f"{left} = {dup}()") - - with acc.if_statement(condition): - right = yield from visit_single(node.right, required=True) - - acc.statement(f"if {dup} is not None:") - with acc.block(): - rebind = acc.helper("get_rebind", left) - acc.statement(f"_mecha_rebind = {rebind}", lineno=node.right) - acc.statement(f"{left} = {right}") - acc.statement(f"if _mecha_rebind is not None:") - with acc.block(): - acc.statement(f"{left} = _mecha_rebind({left})") - - acc.statement("else:") - with acc.block(): - acc.statement(f"{left} = {right}") - - return [left] - - @rule(AstExpressionUnary) - def unary( - self, - node: AstExpressionUnary, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_single(node.value, required=True) - if node.operator in ["not"]: - value = acc.helper(f"operator_{node.operator}", result) - acc.statement(f"{result} = {value}", lineno=node) - else: - op = node.operator.replace("_", " ") - acc.statement(f"{result} = {op} {result}", lineno=node) - return [result] - - @rule(AstValue) - def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: - result = acc.make_variable() - acc.statement(f"{result} = {node.value!r}") - return [result] - - @rule(AstIdentifier) - def identifier(self, node: AstIdentifier, acc: Accumulator) -> Optional[List[str]]: - result = acc.make_variable() - acc.statement(f"{result} = {node.value}", lineno=node) - return [result] - - @rule(AstFormatString) - def format_string( - self, - node: AstFormatString, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - values: List[str] = [] - - for value in node.values: - result = yield from visit_single(value, required=True) - values.append(result) - - result = acc.make_variable() - acc.statement( - f"{result} = {node.fmt!r}.format({', '.join(values)})", lineno=node - ) - return [result] - - @rule(AstTuple) - def tuple( - self, - node: AstTuple, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - items: List[str] = [] - - for item in node.items: - value = yield from visit_single(item, required=True) - items.append(f"{value},") - - result = acc.make_variable() - acc.statement(f"{result} = ({''.join(items)})", lineno=node) - return [result] - - @rule(AstList) - def list( - self, - node: AstList, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - items: List[str] = [] - - for item in node.items: - value = yield from visit_single(item, required=True) - items.append(value) - - result = acc.make_variable() - acc.statement(f"{result} = [{', '.join(items)}]", lineno=node) - return [result] - - @rule(AstDict) - def dict( - self, - node: AstDict, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - items: List[str] = [] - - for item in node.items: - value = yield from visit_single(item, required=True) - items.append(value) - - result = acc.make_variable() - acc.statement(f"{result} = {{{', '.join(items)}}}", lineno=node) - return [result] - - @rule(AstDictItem) - def dict_item( - self, - node: AstDictItem, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - key = yield from visit_single(node.key, required=True) - value = yield from visit_single(node.value, required=True) - return [f"{key}: {value}"] - - @rule(AstSlice) - def slice( - self, - node: AstSlice, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - start = "" - stop = "" - step = "" - - if node.start: - start = yield from visit_single(node.start, required=True) - if node.stop: - stop = yield from visit_single(node.stop, required=True) - if node.step: - step = yield from visit_single(node.step, required=True) - - result = f"{start}:{stop}" - if step: - result += f":{step}" - - return [result] - - @rule(AstUnpack) - def unpack( - self, - node: AstUnpack, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - value = yield from visit_single(node.value, required=True) - prefix = "**" if node.type == "dict" else "*" - return [f"{prefix}{value}"] - - @rule(AstKeyword) - def keyword( - self, - node: AstKeyword, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - value = yield from visit_single(node.value, required=True) - return [f"{node.name}={value}"] - - @rule(AstAttribute) - def attribute( - self, - node: AstAttribute, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - value = yield from visit_single(node.value, required=True) - rhs = acc.get_attribute(value, node.name) - acc.statement(f"{value} = {rhs}", lineno=node) - return [value] - - @rule(AstLookup) - def lookup( - self, - node: AstLookup, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_single(node.value, required=True) - arguments: List[str] = [] - - for arg in node.arguments: - value = yield from visit_single(arg, required=True) - arguments.append(value) - - acc.statement(f"{result} = {result}[{', '.join(arguments)}]", lineno=node) - return [result] - - @rule(AstCall) - def call( - self, - node: AstCall, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_single(node.value, required=True) - arguments: List[str] = [] - - for arg in node.arguments: - value = yield from visit_single(arg, required=True) - arguments.append(value) - - acc.statement(f"{result} = {result}({', '.join(arguments)})", lineno=node) - return [result] - - @rule(AstAssignment) - def assignment( - self, - node: AstAssignment, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - value = yield from visit_single(node.value, required=True) - yield from visit_binding(node.target, node.operator, value, acc) - return [] - - @rule(AstTargetIdentifier) - def target_identifier( - self, - node: AstTargetIdentifier, - acc: Accumulator, - ) -> Optional[List[str]]: - return [node.value] - - @rule(AstTargetUnpack) - def target_destructure( - self, - node: AstTargetUnpack, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - targets: List[str] = [] - for target in node.targets: - result = yield from visit_single(target, required=True) - targets.append(result) - return targets - - @rule(AstTargetAttribute) - def target_attribute( - self, - node: AstTargetAttribute, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - value = yield from visit_single(node.value, required=True) - return [f"{value}.{node.name}"] - - @rule(AstTargetItem) - def target_item( - self, - node: AstTargetItem, - acc: Accumulator, - ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - result = yield from visit_single(node.value, required=True) - arguments: List[str] = [] - - for arg in node.arguments: - value = yield from visit_single(arg, required=True) - arguments.append(value) - - return [f"{result}[{', '.join(arguments)}]"] - - @rule(AstCommand, identifier="pass") - def pass_statement( - self, - node: AstCommand, - acc: Accumulator, - ) -> Optional[List[str]]: - acc.statement("pass") - return [] diff --git a/packages/mecha/mecha/contrib/bolt/helpers.py b/packages/mecha/mecha/contrib/bolt/helpers.py deleted file mode 100644 index 939a8431c..000000000 --- a/packages/mecha/mecha/contrib/bolt/helpers.py +++ /dev/null @@ -1,206 +0,0 @@ -__all__ = [ - "get_bolt_helpers", -] - - -from dataclasses import dataclass, replace -from functools import partial, wraps -from importlib import import_module -from types import TracebackType -from typing import Any, Callable, ContextManager, Dict, Optional, Type -from uuid import UUID - -from tokenstream import set_location - -from mecha import ( - AstBool, - AstChildren, - AstColor, - AstCoordinate, - AstGamemode, - AstGreedy, - AstItemSlot, - AstJson, - AstMessage, - AstNbt, - AstNbtPath, - AstNode, - AstNumber, - AstObjective, - AstObjectiveCriteria, - AstPlayerName, - AstRange, - AstResourceLocation, - AstScoreboardSlot, - AstSortOrder, - AstString, - AstSwizzle, - AstTeam, - AstTime, - AstUUID, - AstVector2, - AstVector3, - AstWord, -) - -from .utils import internal - - -def get_bolt_helpers() -> Dict[str, Any]: - """Return a collection of helpers used by the generated code.""" - return { - "replace": replace, - "missing": object(), - "children": AstChildren, - "operator_not": operator_not, - "operator_in": operator_in, - "operator_not_in": operator_not_in, - "branch": BranchDriver, - "get_dup": get_dup, - "get_rebind": get_rebind, - "get_attribute": get_attribute, - "import_module": python_import_module, - "interpolate_bool": converter(AstBool.from_value), - "interpolate_numeric": converter(AstNumber.from_value), - "interpolate_coordinate": converter(AstCoordinate.from_value), - "interpolate_time": converter(AstTime.from_value), - "interpolate_word": converter(AstWord.from_value), - "interpolate_phrase": converter(AstString.from_value), - "interpolate_greedy": converter(AstGreedy.from_value), - "interpolate_json": converter(AstJson.from_value), - "interpolate_nbt": converter(AstNbt.from_value), - "interpolate_nbt_path": converter(AstNbtPath.from_value), - "interpolate_range": converter(AstRange.from_value), - "interpolate_resource_location": converter(AstResourceLocation.from_value), - "interpolate_item_slot": converter(AstItemSlot.from_value), - "interpolate_objective": converter(AstObjective.from_value), - "interpolate_objective_criteria": converter(AstObjectiveCriteria.from_value), - "interpolate_scoreboard_slot": converter(AstScoreboardSlot.from_value), - "interpolate_swizzle": converter(AstSwizzle.from_value), - "interpolate_team": converter(AstTeam.from_value), - "interpolate_color": converter(AstColor.from_value), - "interpolate_sort_order": converter(AstSortOrder.from_value), - "interpolate_gamemode": converter(AstGamemode.from_value), - "interpolate_message": converter(AstMessage.from_value), - "interpolate_vec2": converter(AstVector2.from_value), - "interpolate_vec3": converter(AstVector3.from_value), - "interpolate_entity": EntityConverter( - uuid_converter=converter(AstUUID.from_value), - player_name_converter=converter(AstPlayerName.from_value), - ), - } - - -@internal -def operator_not(obj: Any): - if func := getattr(type(obj), "__not__", None): - return func(obj) - return not obj - - -@internal -def operator_in(item: Any, container: Any): - if func := getattr(type(item), "__within__", None): - return func(item, container) - if func := getattr(type(container), "__contains__", None): - return func(container, item) - return item in container - - -@internal -def operator_not_in(item: Any, container: Any): - return operator_not(operator_in(item, container)) - - -class BranchDriver: - obj: Any - context_manager: Optional[ContextManager[Any]] - - @internal - def __init__(self, obj: Any): - self.obj = obj - self.context_manager = None - if func := getattr(type(obj), "__branch__", None): - self.context_manager = func(obj) - - @internal - def __enter__(self) -> Any: - if self.context_manager is not None: - return self.context_manager.__enter__() - return self.obj - - @internal - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> Optional[bool]: - if self.context_manager is not None: - return self.context_manager.__exit__(exc_type, exc, traceback) - - -@internal -def get_dup(obj: Any): - if func := getattr(type(obj), "__dup__", None): - return partial(func, obj) - return None - - -@internal -def get_rebind(obj: Any): - if func := getattr(type(obj), "__rebind__", None): - return partial(func, obj) - return None - - -@internal -def get_attribute(obj: Any, attr: str): - try: - return getattr(obj, attr) - except AttributeError as exc: - try: - return obj[attr] - except (TypeError, LookupError): - raise exc from None - - -@internal -def python_import_module(name: str): - try: - return import_module(name) - except Exception as exc: - tb = exc.__traceback__ - tb = tb.tb_next.tb_next # type: ignore - while tb and tb.tb_frame.f_code.co_filename.startswith(" Callable[[Any, AstNode], AstNode]: - internal(f) - - @internal - @wraps(f) - def wrapper(obj: Any, node: AstNode) -> AstNode: - return set_location(f(obj), node) - - return wrapper - - -@dataclass -class EntityConverter: - """Converter for entities.""" - - uuid_converter: Callable[[Any, AstNode], AstNode] - player_name_converter: Callable[[Any, AstNode], AstNode] - - @internal - def __call__(self, obj: Any, node: AstNode) -> AstNode: - if isinstance(obj, str): - if obj.count("-") == 4: - return self.uuid_converter(obj, node) - return self.player_name_converter(obj, node) - if isinstance(obj, UUID): - return self.uuid_converter(obj, node) - raise ValueError(f"Invalid entity value of type {type(obj)!r}.") diff --git a/packages/mecha/mecha/contrib/bolt/loop_info.py b/packages/mecha/mecha/contrib/bolt/loop_info.py deleted file mode 100644 index d5923f792..000000000 --- a/packages/mecha/mecha/contrib/bolt/loop_info.py +++ /dev/null @@ -1,100 +0,0 @@ -__all__ = [ - "LoopInfo", - "loop_info", -] - - -from dataclasses import dataclass, field -from typing import ( - Any, - Generic, - Iterable, - Iterator, - List, - Optional, - Tuple, - TypeVar, - Union, - overload, -) - -from beet.core.utils import SENTINEL_OBJ, Sentinel - -T = TypeVar("T") -U = TypeVar("U") - - -def loop_info(iterable: Iterable[T]) -> "LoopInfo[T]": - return LoopInfo(iterable, iter(iterable)) - - -@dataclass -class LoopInfo(Generic[T]): - iterable: Iterable[T] - iterator: Iterator[T] - - index: int = -1 - accumulator: List[T] = field(default_factory=list) - - def __iter__(self) -> "LoopInfo[T]": - return self - - def __next__(self) -> Tuple["LoopInfo[T]", T]: - while self.index + 1 >= len(self.accumulator): - self.accumulator.append(next(self.iterator)) - self.index += 1 - return self, self.current - - @overload - def peek(self, offset: int) -> Optional[T]: - ... - - @overload - def peek(self, offset: int, default: U) -> Union[T, U]: - ... - - def peek(self, offset: int, default: Any = None) -> Any: - index = self.index + offset - - if index < 0: - return default - - try: - while index >= len(self.accumulator): - self.accumulator.append(next(self.iterator)) - except StopIteration: - return default - - return self.accumulator[index] - - @property - def before(self) -> Optional[T]: - return self.peek(-1) - - @property - def current(self) -> T: - return self.accumulator[self.index] - - @property - def after(self) -> Optional[T]: - return self.peek(1) - - @property - def count(self) -> int: - try: - return len(self.iterable) # type: ignore - except TypeError: - self.accumulator.extend(self.iterator) - return len(self.accumulator) - - @property - def first(self) -> bool: - return self.index == 0 - - @property - def last(self) -> bool: - return isinstance(self.peek(1, SENTINEL_OBJ), Sentinel) - - def cycle(self, arg: U, *args: U) -> U: - args = (arg,) + args - return args[self.index % len(args)] diff --git a/packages/mecha/mecha/contrib/bolt/parse.py b/packages/mecha/mecha/contrib/bolt/parse.py deleted file mode 100644 index cc9efe99c..000000000 --- a/packages/mecha/mecha/contrib/bolt/parse.py +++ /dev/null @@ -1,1441 +0,0 @@ -__all__ = [ - "get_bolt_parsers", - "get_stream_identifiers", - "get_stream_pending_identifiers", - "get_stream_identifiers_storage", - "get_stream_pending_identifiers_storage", - "get_stream_branch_scope", - "UndefinedIdentifier", - "create_bolt_root_parser", - "ExecuteIfConditionConstraint", - "BranchScopeManager", - "InterpolationParser", - "parse_statement", - "AssignmentTargetParser", - "IfElseLoweringParser", - "BreakContinueConstraint", - "FlushPendingIdentifiersParser", - "parse_function_signature", - "parse_function_root", - "parse_del_target", - "parse_identifier", - "ImportLocationConstraint", - "ImportStatementHandler", - "parse_import_name", - "GlobalNonlocalHandler", - "parse_name_list", - "FunctionRootBacktracker", - "FunctionConstraint", - "BinaryParser", - "UnaryParser", - "UnpackParser", - "UnpackConstraint", - "KeywordParser", - "LookupParser", - "PrimaryParser", - "parse_dict_item", - "LiteralParser", - "UndefinedIdentifierErrorHandler", -] - - -import keyword -import re -from dataclasses import dataclass, field, replace -from difflib import get_close_matches -from typing import Any, Dict, List, Optional, Set, Tuple, cast - -from beet.core.utils import required_field -from tokenstream import InvalidSyntax, Token, TokenStream, set_location - -from mecha import ( - AlternativeParser, - AstChildren, - AstCommand, - AstResourceLocation, - AstRoot, - CommentDisambiguation, - CompilationDatabase, - Parser, - consume_line_continuation, - delegate, - get_stream_scope, -) -from mecha.contrib.relative_location import resolve_using_database -from mecha.utils import ( - JsonQuoteHelper, - QuoteHelper, - normalize_whitespace, - string_to_number, -) - -from .ast import ( - AstAssignment, - AstAttribute, - AstCall, - AstDict, - AstDictItem, - AstExpression, - AstExpressionBinary, - AstExpressionUnary, - AstFormatString, - AstFunctionRoot, - AstFunctionSignature, - AstFunctionSignatureArgument, - AstIdentifier, - AstImportedIdentifier, - AstInterpolation, - AstKeyword, - AstList, - AstLookup, - AstSlice, - AstTarget, - AstTargetAttribute, - AstTargetIdentifier, - AstTargetItem, - AstTargetUnpack, - AstTuple, - AstUnpack, - AstValue, -) - -KEYWORD_PATTERN: str = "|".join(rf"\b{kw}\b" for kw in keyword.kwlist) - -TRUE_PATTERN: str = r"\b[tT]rue\b" -FALSE_PATTERN: str = r"\b[fF]alse\b" -NULL_PATTERN: str = r"\b(?:null|None)\b" -IDENTIFIER_PATTERN: str = rf"(?!_mecha_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" -STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" -NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" -RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" - -IMPORT_REGEX = re.compile(rf"^{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*$") - - -def get_bolt_parsers( - parsers: Dict[str, Parser], - database: CompilationDatabase, -) -> Dict[str, Parser]: - """Return the bolt parsers.""" - return { - ################################################################################ - # Command - ################################################################################ - "root": create_bolt_root_parser(parsers["root"]), - "nested_root": create_bolt_root_parser(parsers["nested_root"]), - "command": UndefinedIdentifierErrorHandler( - ImportStatementHandler( - GlobalNonlocalHandler(ExecuteIfConditionConstraint(parsers["command"])) - ) - ), - "command:argument:bolt:if_block": delegate("bolt:if_block"), - "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), - "command:argument:bolt:elif_block": delegate("bolt:elif_block"), - "command:argument:bolt:else_block": delegate("bolt:else_block"), - "command:argument:bolt:statement": delegate("bolt:statement"), - "command:argument:bolt:assignment_target": delegate("bolt:assignment_target"), - "command:argument:bolt:import": delegate("bolt:import"), - "command:argument:bolt:import_name": delegate("bolt:import_name"), - "command:argument:bolt:global_name": delegate("bolt:global_name"), - "command:argument:bolt:nonlocal_name": delegate("bolt:nonlocal_name"), - "command:argument:bolt:expression": delegate("bolt:expression"), - "command:argument:bolt:function_signature": delegate("bolt:function_signature"), - "command:argument:bolt:function_root": delegate("bolt:function_root"), - "command:argument:bolt:del_target": delegate("bolt:del_target"), - ################################################################################ - # Bolt - ################################################################################ - "bolt:if_block": BranchScopeManager( - parser=delegate("nested_root"), - update_before=True, - ), - "bolt:elif_condition": BranchScopeManager( - parser=delegate("bolt:expression"), - mask=True, - update_after=True, - ), - "bolt:elif_block": BranchScopeManager( - parser=delegate("nested_root"), - mask=True, - ), - "bolt:else_block": BranchScopeManager( - parser=delegate("nested_root"), - mask=True, - ), - "bolt:statement": parse_statement, - "bolt:assignment_target": AssignmentTargetParser( - allow_undefined_identifiers=True, - allow_multiple=True, - ), - "bolt:augmented_assignment_target": AssignmentTargetParser(), - "bolt:function_signature": parse_function_signature, - "bolt:function_root": parse_function_root, - "bolt:del_target": parse_del_target, - "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), - "bolt:identifier": parse_identifier, - "bolt:import": ImportLocationConstraint(parsers["resource_location_or_tag"]), - "bolt:import_name": parse_import_name, - "bolt:global_name": parse_name_list, - "bolt:nonlocal_name": parse_name_list, - "bolt:expression": delegate("bolt:disjunction"), - "bolt:disjunction": BinaryParser( - operators=[r"\bor\b"], - parser=delegate("bolt:conjunction"), - ), - "bolt:conjunction": BinaryParser( - operators=[r"\band\b"], - parser=delegate("bolt:inversion"), - ), - "bolt:inversion": UnaryParser( - operators=[r"\bnot\b"], - parser=delegate("bolt:comparison"), - ), - "bolt:comparison": BinaryParser( - operators=[ - "==", - "!=", - "<=", - "<", - ">=", - ">", - r"\bnot\s+in\b", - r"\bin\b", - r"\bis\s+not\b", - r"\bis\b", - ], - parser=delegate("bolt:bitwise_or"), - ), - "bolt:bitwise_or": BinaryParser( - operators=[r"\|(?!=)"], - parser=delegate("bolt:bitwise_xor"), - ), - "bolt:bitwise_xor": BinaryParser( - operators=[r"\^(?!=)"], - parser=delegate("bolt:bitwise_and"), - ), - "bolt:bitwise_and": BinaryParser( - operators=[r"&(?!=)"], - parser=delegate("bolt:shift_expr"), - ), - "bolt:shift_expr": BinaryParser( - operators=[r"<<(?!=)", r">>(?!=)"], - parser=delegate("bolt:sum"), - ), - "bolt:sum": BinaryParser( - operators=[r"\+(?!=)", r"-(?!=)"], - parser=delegate("bolt:term"), - ), - "bolt:term": BinaryParser( - operators=[r"\*(?!=)", r"//(?!=)", r"/(?!=)", r"%(?!=)"], - parser=delegate("bolt:factor"), - ), - "bolt:factor": UnaryParser( - operators=[r"\+", "-"], - parser=delegate("bolt:power"), - ), - "bolt:power": BinaryParser( - operators=[r"\*\*(?!=)"], - parser=delegate("bolt:primary"), - right_associative=True, - ), - "bolt:lookup_argument": LookupParser(delegate("bolt:expression")), - "bolt:call_argument": AlternativeParser( - [ - KeywordParser(delegate("bolt:expression")), - UnpackParser(delegate("bolt:expression")), - delegate("bolt:expression"), - ] - ), - "bolt:primary": PrimaryParser(delegate("bolt:atom")), - "bolt:atom": AlternativeParser( - [ - delegate("bolt:identifier"), - delegate("bolt:literal"), - ] - ), - "bolt:list_item": AlternativeParser( - [ - UnpackConstraint( - type="list", - parser=UnpackParser(delegate("bolt:expression")), - ), - delegate("bolt:expression"), - ] - ), - "bolt:dict_item": AlternativeParser( - [ - UnpackConstraint( - type="dict", - parser=UnpackParser(delegate("bolt:expression")), - ), - parse_dict_item, - ] - ), - "bolt:literal": LiteralParser(database), - ################################################################################ - # Interpolation - ################################################################################ - "bool": InterpolationParser("bool", parsers["bool"], fallback=True), - "numeric": InterpolationParser( - "numeric", parsers["numeric"], prefix="-", fallback=True - ), - "coordinate": InterpolationParser( - "coordinate", parsers["coordinate"], prefix="[~^]-?|-", fallback=True - ), - "time": InterpolationParser("time", parsers["time"], fallback=True), - "word": InterpolationParser("word", parsers["word"]), - "phrase": InterpolationParser("phrase", parsers["phrase"]), - "greedy": InterpolationParser("greedy", parsers["greedy"]), - "json": InterpolationParser("json", parsers["json"]), - "nbt": InterpolationParser("nbt", parsers["nbt"]), - "nbt_path": InterpolationParser("nbt_path", parsers["nbt_path"]), - "range": InterpolationParser("range", parsers["range"], fallback=True), - "resource_location_or_tag": CommentDisambiguation( - InterpolationParser( - "resource_location", parsers["resource_location_or_tag"], prefix=r"#" - ) - ), - "item_slot": InterpolationParser( - "item_slot", parsers["item_slot"], fallback=True - ), - "objective": InterpolationParser("objective", parsers["objective"]), - "objective_criteria": InterpolationParser( - "objective_criteria", parsers["objective_criteria"] - ), - "scoreboard_slot": InterpolationParser( - "scoreboard_slot", parsers["scoreboard_slot"], fallback=True - ), - "swizzle": InterpolationParser("swizzle", parsers["swizzle"], fallback=True), - "team": InterpolationParser("team", parsers["team"]), - "color": InterpolationParser("color", parsers["color"]), - "sort_order": InterpolationParser( - "sort_order", parsers["sort_order"], fallback=True - ), - "gamemode": InterpolationParser("gamemode", parsers["gamemode"], fallback=True), - "message": InterpolationParser("message", parsers["message"]), - "block_pos": InterpolationParser("vec3", parsers["block_pos"], fallback=True), - "column_pos": InterpolationParser("vec2", parsers["column_pos"], fallback=True), - "rotation": InterpolationParser("vec2", parsers["rotation"], fallback=True), - "vec2": InterpolationParser("vec2", parsers["vec2"], fallback=True), - "vec3": InterpolationParser("vec3", parsers["vec3"], fallback=True), - "entity": CommentDisambiguation( - InterpolationParser("entity", parsers["entity"]) - ), - "score_holder": CommentDisambiguation( - InterpolationParser("entity", parsers["score_holder"]) - ), - } - - -def get_stream_identifiers(stream: TokenStream) -> Set[str]: - """Return the set of accessible identifiers currently associated with the token stream.""" - return stream.data.setdefault("identifiers", set()) - - -def get_stream_pending_identifiers(stream: TokenStream) -> Set[str]: - """Return the set of pending identifiers currently associated with the token stream.""" - return stream.data.setdefault("pending_identifiers", set()) - - -def get_stream_identifiers_storage(stream: TokenStream) -> Dict[str, str]: - """Return a dict that associates storage type to identifiers.""" - return stream.data.setdefault("identifiers_storage", {}) - - -def get_stream_pending_identifiers_storage(stream: TokenStream) -> Dict[str, str]: - """Return a dict that associates pending storage type to identifiers.""" - return stream.data.setdefault("pending_identifiers_storage", {}) - - -def get_stream_branch_scope(stream: TokenStream) -> Set[str]: - """Return the identifiers available inside the branch.""" - return stream.data.setdefault("branch_scope", set()) - - -class UndefinedIdentifier(InvalidSyntax): - """Raised when an identifier is not defined.""" - - token: Token - identifiers: Set[str] - - def __init__(self, token: Token, identifiers: Set[str]): - super().__init__(token, identifiers) - self.token = token - self.identifiers = identifiers - - def __str__(self) -> str: - msg = f"Identifier {self.token.value!r} is not defined." - - if matches := get_close_matches(self.token.value, self.identifiers): - matches = [repr(m) for m in matches] - - if len(matches) == 1: - suggestion = f"{matches[0]}" - else: - *head, before_last, last = matches - suggestion = ", ".join(head + [f"{before_last} or {last}"]) - - msg += f" Did you mean {suggestion}?" - - return msg - - -def create_bolt_root_parser(parser: Parser): - """Return parser for the root node for bolt.""" - return FunctionRootBacktracker( - FlushPendingIdentifiersParser( - FunctionConstraint( - BreakContinueConstraint( - parser=IfElseLoweringParser(parser), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), - }, - ), - command_identifiers={ - "return", - "return:value", - "yield", - "yield:value", - "yield:from:value", - "global:subcommand", - "nonlocal:subcommand", - }, - ) - ) - ) - - -@dataclass -class ExecuteIfConditionConstraint: - """Constraint that prevents inlining if conditions as execute subcommands.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - if isinstance(node := self.parser(stream), AstCommand): - if node.identifier == "execute:if:condition:body": - exc = InvalidSyntax("Can't inline conditions as execute subcommands.") - raise set_location(exc, node) - - return node - - -@dataclass -class BranchScopeManager: - """Parser that manages accessible identifiers for conditional branches.""" - - parser: Parser - mask: bool = False - update_before: bool = False - update_after: bool = False - - def __call__(self, stream: TokenStream) -> Any: - identifiers = get_stream_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - branch_scope = get_stream_branch_scope(stream) - - mask = branch_scope and identifiers - branch_scope - mask_storage = { - identifier: identifiers_storage[identifier] - for identifier in set(identifiers_storage) & mask - } - - if self.mask: - identifiers -= mask - for identifier in mask_storage: - del identifiers_storage[identifier] - - if self.update_before: - branch_scope = identifiers.copy() - - try: - return self.parser(stream) - finally: - if self.update_after: - branch_scope = identifiers.copy() - - if self.mask: - identifiers.update(mask) - identifiers_storage.update(mask_storage) - - stream.data["branch_scope"] = branch_scope - - -@dataclass -class InterpolationParser: - """Parser for interpolation.""" - - converter: str - parser: Parser - prefix: Optional[str] = None - fallback: bool = False - - def __call__(self, stream: TokenStream) -> Any: - order = ["interpolation", "original"] - if self.fallback: - order.reverse() - for parser, alternative in stream.choose(*order): - with alternative: - if parser == "interpolation": - with stream.syntax(prefix=self.prefix): - prefix = stream.get("prefix") - node = delegate("bolt:interpolation", stream) - node = AstInterpolation( - prefix=prefix.value if prefix else None, - converter=self.converter, - value=node, - ) - return set_location(node, prefix or node.value, node.value) - elif parser == "original": - return self.parser(stream) - - -def parse_statement(stream: TokenStream) -> Any: - """Parse statement.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) - - for parser, alternative in stream.choose( - "bolt:augmented_assignment_target", - "bolt:assignment_target", - "bolt:expression", - ): - with alternative: - pending_identifiers.clear() - pending_identifiers_storage.clear() - node = delegate(parser, stream) - - pattern = r"=(?!=)|\+=|-=|\*=|//=|/=|%=|&=|\|=|\^=|<<=|>>=|\*\*=" - - if isinstance(node, AstTarget): - if parser == "bolt:assignment_target": - pattern = r"=(?!=)" - with stream.syntax(assignment=pattern): - op = stream.expect("assignment") - - expression = delegate("bolt:expression", stream) - - identifiers |= pending_identifiers - pending_identifiers.clear() - identifiers_storage.update(pending_identifiers_storage) - pending_identifiers_storage.clear() - - node = AstAssignment(operator=op.value, target=node, value=expression) - node = set_location(node, node.target, node.value) - - elif isinstance(node, AstAttribute): - with stream.syntax(assignment=pattern): - op = stream.get("assignment") - - if op: - expression = delegate("bolt:expression", stream) - target = AstTargetAttribute( - name=node.name, - value=node.value, - ) - node = AstAssignment( - operator=op.value, - target=set_location(target, node), - value=expression, - ) - node = set_location(node, node.target, node.value) - - elif isinstance(node, AstLookup): - with stream.syntax(assignment=pattern): - op = stream.get("assignment") - - if op: - expression = delegate("bolt:expression", stream) - target = AstTargetItem( - value=node.value, - arguments=node.arguments, - ) - node = AstAssignment( - operator=op.value, - target=set_location(target, node), - value=expression, - ) - node = set_location(node, node.target, node.value) - - # Make sure that the statement is not followed by anything. - current_index = stream.index - stream.expect("newline", "eof") - stream.index = current_index - - return node - - -@dataclass -class AssignmentTargetParser: - """Parser for assignment targets.""" - - allow_undefined_identifiers: bool = False - allow_multiple: bool = False - - def __call__(self, stream: TokenStream) -> AstTarget: - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) - - nodes: List[AstTarget] = [] - - with stream.syntax(identifier=IDENTIFIER_PATTERN, comma=r","): - while True: - token = stream.expect("identifier") - is_defined = token.value in identifiers - with_storage = token.value in identifiers_storage - rebind = is_defined and with_storage - - if self.allow_undefined_identifiers: - pending_identifiers.add(token.value) - if not with_storage: - pending_identifiers_storage[token.value] = "local" - elif not rebind: - exc = UndefinedIdentifier(token, set(identifiers_storage)) - if is_defined and not with_storage: - exc.notes.append( - f"Use 'global {token.value}' or 'nonlocal {token.value}' to mutate the variable defined in outer scope." - ) - raise set_location(exc, token) - - target = AstTargetIdentifier(value=token.value, rebind=rebind) - nodes.append(set_location(target, token)) - - if not self.allow_multiple or not stream.get("comma"): - break - - if len(nodes) == 1: - return nodes[0] - - node = AstTargetUnpack(targets=AstChildren(nodes)) - return set_location(node, nodes[0], nodes[-1]) - - -@dataclass -class IfElseLoweringParser: - """Parser that turns elif statements into if statements in an else clause.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> AstRoot: - node: AstRoot = self.parser(stream) - - changed = False - result: List[AstCommand] = [] - - commands = iter(node.commands) - previous = "" - - for command in commands: - if command.identifier in ["elif:condition:body", "else:body"]: - if previous not in ["if:condition:body", "elif:condition:body"]: - exc = InvalidSyntax( - "Conditional branch must be part of an if statement." - ) - raise set_location(exc, command, command.arguments[-1].location) - - if command.identifier == "elif:condition:body": - changed = True - elif_chain = [command] - - for command in commands: - if command.identifier not in ["elif:condition:body", "else:body"]: - break - elif_chain.append(command) - else: - command = None - - if elif_chain[-1].identifier == "else:body": - last = [elif_chain.pop()] - else: - last = [] - - for stmt in reversed(elif_chain): - stmt = replace(stmt, identifier="if:condition:body") - stmt = AstRoot(commands=AstChildren([stmt, *last])) - stmt = set_location(stmt, stmt.commands[0], stmt.commands[-1]) - stmt = AstCommand( - identifier="else:body", - arguments=AstChildren([stmt]), - ) - last = [set_location(stmt, stmt.arguments[0])] - - result.append(last[0]) - - if not command: - break - - previous = command.identifier - result.append(command) - - if changed: - node = replace(node, commands=AstChildren(result)) - - return node - - -@dataclass -class BreakContinueConstraint: - """Constraint that makes sure that break and continue statements only occur in loops.""" - - parser: Parser - allowed_scopes: Set[Tuple[str, ...]] - - def __call__(self, stream: TokenStream) -> AstRoot: - scope = get_stream_scope(stream) - loop = stream.data.get("loop") or scope in self.allowed_scopes - - with stream.provide(loop=loop): - node: AstRoot = self.parser(stream) - - if not loop: - for command in node.commands: - if command.identifier in ["break", "continue"]: - exc = InvalidSyntax( - f"Can only use {command.identifier!r} in loops." - ) - raise set_location(exc, command) - - return node - - -@dataclass -class FlushPendingIdentifiersParser: - """Parser that flushes pending identifiers.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) - - identifiers |= pending_identifiers - pending_identifiers.clear() - identifiers_storage.update(pending_identifiers_storage) - pending_identifiers_storage.clear() - - return self.parser(stream) - - -def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: - """Parse function signature.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - scoped_identifiers = set(identifiers) - - arguments: List[AstFunctionSignatureArgument] = [] - - with stream.syntax( - comma=r",", - equal=r"=(?!=)", - brace=r"\(|\)", - identifier=IDENTIFIER_PATTERN, - ): - identifier = stream.expect("identifier") - stream.expect(("brace", "(")) - - scoped_identifiers.add(identifier.value) - - with stream.ignore("newline"): - for _ in stream.peek_until(("brace", ")")): - name = stream.expect("identifier") - - default = None - if stream.get("equal"): - with stream.provide( - identifiers=scoped_identifiers | {arg.name for arg in arguments} - ): - default = delegate("bolt:expression", stream) - - argument = AstFunctionSignatureArgument( - name=name.value, - default=default, - ) - arguments.append(set_location(argument, name, stream.current)) - - if not stream.get("comma"): - stream.expect(("brace", ")")) - break - - identifiers.add(identifier.value) - pending_identifiers |= {arg.name for arg in arguments} - - node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) - return set_location(node, identifier, stream.current) - - -def parse_function_root(stream: TokenStream) -> AstFunctionRoot: - """Parse function root.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - - stream_copy = stream.copy() - - with stream.syntax(statement=r"[^\s#].*"): - token = stream.expect("statement") - while consume_line_continuation(stream): - stream.expect("statement") - - stream_copy.data["identifiers"] = identifiers | pending_identifiers - stream_copy.data["pending_identifiers"] = set() - stream_copy.data["identifiers_storage"] = {} - stream_copy.data["pending_identifiers_storage"] = {} - stream_copy.data["branch_scope"] = set() - - pending_identifiers.clear() - - node = AstFunctionRoot(stream=stream_copy) - return set_location(node, token, stream.current) - - -def parse_del_target(stream: TokenStream) -> AstTarget: - node = delegate("bolt:expression", stream) - - if isinstance(node, AstIdentifier): - return set_location(AstTargetIdentifier(value=node.value), node) - elif isinstance(node, AstAttribute): - return set_location(AstTargetAttribute(name=node.name, value=node.value), node) - elif isinstance(node, AstLookup): - return set_location( - AstTargetItem(value=node.value, arguments=node.arguments), node - ) - - exc = InvalidSyntax("Can only delete variables, attributes, or subscripted items.") - raise set_location(exc, node) - - -def parse_identifier(stream: TokenStream) -> AstIdentifier: - """Parse identifier.""" - identifiers = get_stream_identifiers(stream) - - with stream.syntax( - true=TRUE_PATTERN, - false=FALSE_PATTERN, - null=NULL_PATTERN, - identifier=IDENTIFIER_PATTERN, - ): - token = stream.expect("identifier") - - if token.value not in identifiers: - exc = UndefinedIdentifier(token, set(identifiers)) - raise set_location(exc, token) - - return set_location(AstIdentifier(value=token.value), token) - - -@dataclass -class ImportLocationConstraint: - """Constraint for import location.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - node: AstResourceLocation = self.parser(stream) - - if node.is_tag or node.namespace is None and not IMPORT_REGEX.match(node.path): - exc = InvalidSyntax(f"Invalid module location {node.get_value()!r}.") - raise set_location(exc, node) - - return node - - -@dataclass -class ImportStatementHandler: - """Handle import statements.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - identifiers = get_stream_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - - if isinstance(node := self.parser(stream), AstCommand): - if node.identifier == "import:module": - if isinstance(module := node.arguments[0], AstResourceLocation): - if module.namespace: - exc = InvalidSyntax( - f"Can't import {module.get_value()!r} without alias." - ) - raise set_location(exc, module) - else: - identifiers.add(module.path.partition(".")[0]) - elif node.identifier == "import:module:as:alias": - if isinstance(alias := node.arguments[1], AstImportedIdentifier): - identifiers.add(alias.value) - identifiers_storage.setdefault(alias.value, "local") - elif node.identifier == "from:module:import:subcommand": - subcommand = cast(AstCommand, node.arguments[1]) - while True: - if isinstance( - name := subcommand.arguments[0], AstImportedIdentifier - ): - identifiers.add(name.value) - identifiers_storage.setdefault(name.value, "local") - if subcommand.identifier == "from:module:import:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break - - return node - - -def parse_import_name(stream: TokenStream) -> AstImportedIdentifier: - """Parse import name.""" - with stream.syntax(name=IDENTIFIER_PATTERN, comma=r","): - token = stream.expect("name") - stream.get("comma") - return set_location(AstImportedIdentifier(value=token.value), token) - - -@dataclass -class GlobalNonlocalHandler: - """Handle global and nonlocal declarations.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - identifiers_storage = get_stream_identifiers_storage(stream) - - if isinstance(node := self.parser(stream), AstCommand): - if node.identifier in ["global:subcommand", "nonlocal:subcommand"]: - storage, _, _ = node.identifier.partition(":") - subcommand = cast(AstCommand, node.arguments[0]) - while True: - if isinstance(name := subcommand.arguments[0], AstIdentifier): - s = identifiers_storage.setdefault(name.value, storage) - if s != storage: - exc = InvalidSyntax(f"Can't make {s} identifier {storage}.") - raise set_location(exc, name) - if subcommand.identifier == f"{storage}:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break - - return node - - -def parse_name_list(stream: TokenStream) -> AstIdentifier: - """Parse name list.""" - node = delegate("bolt:identifier", stream) - with stream.syntax(comma=r","): - stream.get("comma") - return node - - -@dataclass -class FunctionRootBacktracker: - """Parser for backtracking over function root nodes.""" - - parser: Parser = required_field() - - def __call__(self, stream: TokenStream) -> AstRoot: - should_replace = False - commands: List[AstCommand] = [] - - node: AstRoot = self.parser(stream) - - identifiers = get_stream_identifiers(stream) - - for command in node.commands: - if command.identifier == "def:function:body": - if isinstance(function_root := command.arguments[-1], AstFunctionRoot): - should_replace = True - - function_stream = function_root.stream - function_stream.data["identifiers"] |= identifiers - function_stream.data["function"] = True - - if isinstance(s := command.arguments[0], AstFunctionSignature): - function_stream.data["identifiers_storage"].update( - {arg.name: "local" for arg in s.arguments} - ) - - command = replace( - command, - arguments=AstChildren( - [ - *command.arguments[:-1], - delegate("nested_root", function_root.stream), - ] - ), - ) - - commands.append(command) - - if should_replace: - return replace(node, commands=AstChildren(commands)) - - return node - - -@dataclass -class FunctionConstraint: - """Constraint that makes sure that the given statements only occur in functions.""" - - parser: Parser - command_identifiers: Set[str] - - def __call__(self, stream: TokenStream) -> AstRoot: - node = self.parser(stream) - - if stream.data.get("function"): - return node - - if isinstance(node, AstRoot): - for command in node.commands: - if command.identifier in self.command_identifiers: - name, _, _ = command.identifier.partition(":") - exc = InvalidSyntax(f"Can only use {name!r} in functions.") - raise set_location(exc, command) - - return node - - -@dataclass -class BinaryParser: - """Parser for binary expressions.""" - - operators: List[str] - parser: Parser - right_associative: bool = False - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(operator="|".join(self.operators)): - nodes = [self.parser(stream)] - operations: List[str] = [] - - for op in stream.collect("operator"): - nodes.append(self.parser(stream)) - operations.append(normalize_whitespace(op.value)) - - if self.right_associative: - result = nodes[-1] - nodes = nodes[-2::-1] - operations = operations[::-1] - else: - result = nodes[0] - nodes = nodes[1:] - - for op, node in zip(operations, nodes): - if self.right_associative: - result, node = node, result - result = AstExpressionBinary(operator=op, left=result, right=node) - result = set_location(result, result.left, result.right) - - return result - - -@dataclass -class UnaryParser: - """Parser for unary expressions.""" - - operators: List[str] - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(operator="|".join(self.operators)): - if op := stream.get("operator"): - operator = normalize_whitespace(op.value) - node = AstExpressionUnary(operator=operator, value=self(stream)) - return set_location(node, op, node.value) - return self.parser(stream) - - -@dataclass -class UnpackParser: - """Parser for unpacking.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(prefix=r"\*\*|\*"): - prefix = stream.expect("prefix") - - node = self.parser(stream) - - node = AstUnpack(type="dict" if prefix.value == "**" else "list", value=node) - return set_location(node, prefix, node.value) - - -@dataclass -class UnpackConstraint: - """Constraint for unpacking.""" - - type: str - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - if isinstance(node := self.parser(stream), AstUnpack): - if node.type != self.type: - exc = InvalidSyntax(f"{node.type.capitalize()} unpacking not allowed.") - raise node.emit_error(exc) - return node - - -@dataclass -class KeywordParser: - """Parser for keywords.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(name=IDENTIFIER_PATTERN, equal=r"=(?!=)"): - name = stream.expect("name") - stream.expect("equal") - - node = self.parser(stream) - - node = AstKeyword(name=name.value, value=node) - return set_location(node, name, node.value) - - -@dataclass -class LookupParser: - """Parser for lookups.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - start = None - stop = None - step = None - - with stream.provide(bolt_lookup=True), stream.syntax( - colon=r":", - comma=r",", - bracket=r"\]", - ): - colon1 = stream.get("colon") - - if not colon1: - start = self.parser(stream) - location = start.location - colon1 = stream.get("colon") - else: - location = colon1.location - - if not colon1: - return start - - colon2 = stream.get("colon") - - if not colon2: - with stream.checkpoint(): - sep = stream.get("comma", "bracket") - if not sep: - stop = self.parser(stream) - colon2 = stream.get("colon") - - if colon2: - with stream.checkpoint(): - sep = stream.get("comma", "bracket") - if not sep: - step = self.parser(stream) - - node = AstSlice(start=start, stop=stop, step=step) - return set_location(node, location, stream.location) - - -@dataclass -class PrimaryParser: - """Parser for primary expressions.""" - - parser: Parser - quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(brace=r"\(|\)", comma=r",", format_string=r"f['\"]"): - token = stream.get(("brace", "("), "format_string") - - if token and token.match("brace"): - with stream.ignore("newline"): - comma = None - items: List[AstExpression] = [] - - for _ in stream.peek_until(("brace", ")")): - items.append(delegate("bolt:expression", stream)) - - if not (comma := stream.get("comma")): - stream.expect(("brace", ")")) - break - - if len(items) == 1 and not comma: - node = items[0] - else: - node = AstTuple(items=AstChildren(items)) - node = set_location(node, token, stream.current) - - elif token and token.match("format_string"): - quote = token.value[-1] - - with stream.provide(bolt_format_string=True), stream.syntax( - escape=rf"\\.", - double_brace=r"\{\{|\}\}", - brace=r"\{|\}", - quote=quote, - text=r"[^\\]+?", - ): - fmt = quote - values: List[AstExpression] = [] - - for escape, double_brace, brace, text in stream.collect( - "escape", - "double_brace", - ("brace", "{"), - "text", - ): - if escape: - fmt += escape.value - elif double_brace: - fmt += double_brace.value - elif brace: - fmt += "{" - with stream.syntax(text=None): - values.append(delegate("bolt:expression", stream)) - with stream.syntax(spec=r"[:!][^\}]+", double_brace=None): - if spec := stream.get("spec"): - fmt += spec.value - stream.expect(("brace", "}")) - fmt += "}" - elif text: - fmt += text.value - - end_quote = stream.expect("quote") - fmt += end_quote.value - - fmt = self.quote_helper.unquote_string( - Token( - "format_string", - fmt, - token.location.with_horizontal_offset(1), - end_quote.end_location, - ) - ) - - node = AstFormatString(fmt=fmt, values=AstChildren(values)) - node = set_location(node, token, end_quote) - - else: - node = self.parser(stream) - - with stream.syntax( - dot=r"\.", - comma=r",", - brace=r"\(|\)", - bracket=r"\[|\]", - identifier=IDENTIFIER_PATTERN, - string=STRING_PATTERN, - number=r"(?:0|[1-9][0-9]*)", - ): - while token := stream.get("dot", ("brace", "("), ("bracket", "[")): - arguments: List[Any] = [] - - if token.match("dot"): - identifier, string, number = stream.expect( - "identifier", - "string", - "number", - ) - - if identifier: - node = AstAttribute(value=node, name=identifier.value) - node = set_location(node, node.value, identifier) - continue - - if string: - value = self.quote_helper.unquote_string(string) - elif number: - value = int(number.value) - - arguments.append(set_location(AstValue(value=value), stream.current)) # type: ignore - - else: - if token.match("brace"): - close = ("brace", ")") - argument_parser = delegate("bolt:call_argument") - else: - close = ("bracket", "]") - argument_parser = delegate("bolt:lookup_argument") - - allow_positional = True - - with stream.ignore("newline"): - for _ in stream.peek_until(close): - argument = argument_parser(stream) - - if isinstance(argument, AstKeyword): - allow_positional = False - elif isinstance(argument, AstUnpack): - if argument.type == "dict": - allow_positional = False - elif not allow_positional: - exc = InvalidSyntax( - "List unpacking not allowed after keyword arguments." - ) - raise argument.emit_error(exc) - elif not allow_positional: - exc = InvalidSyntax( - "Positional argument not allowed after keyword arguments." - ) - raise argument.emit_error(exc) - - arguments.append(argument) - - if not stream.get("comma"): - stream.expect(close) - break - - if token.match("brace"): - node = AstCall(value=node, arguments=AstChildren(arguments)) - else: - if not arguments: - arguments = [ - set_location(AstSlice(), node.end_location, stream.current) - ] - node = AstLookup(value=node, arguments=AstChildren(arguments)) - - node = set_location(node, node.value, stream.current) - - return node - - -def parse_dict_item(stream: TokenStream) -> Any: - """Parse dict item node.""" - identifiers = get_stream_identifiers(stream) - - with stream.syntax(colon=r":", identifier=IDENTIFIER_PATTERN): - with stream.checkpoint() as commit: - identifier = stream.expect("identifier") - stream.expect("colon") - commit() - - if identifier.value in identifiers: - key = AstIdentifier(value=identifier.value) - else: - key = AstValue(value=identifier.value) - - key = set_location(key, identifier) - - if commit.rollback: - key = delegate("bolt:expression", stream) - stream.expect("colon") - - value = delegate("bolt:expression", stream) - - item = AstDictItem(key=key, value=value) - return set_location(item, key, value) - - -@dataclass -class LiteralParser: - """Parser for literals.""" - - database: CompilationDatabase - quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) - - def __call__(self, stream: TokenStream) -> Any: - with stream.syntax( - curly=r"\{|\}", - bracket=r"\[|\]", - comma=r",", - true=TRUE_PATTERN, - false=FALSE_PATTERN, - null=NULL_PATTERN, - string=STRING_PATTERN, - resource=( - None - if stream.data.get("bolt_lookup") - or stream.data.get("bolt_format_string") - else RESOURCE_LOCATION_PATTERN - ), - number=NUMBER_PATTERN, - ): - curly, bracket, true, false, null, string, resource, number = stream.expect( - ("curly", "{"), - ("bracket", "["), - "true", - "false", - "null", - "string", - "resource", - "number", - ) - - if curly: - items: List[Any] = [] - - with stream.ignore("newline"): - for _ in stream.peek_until(("curly", "}")): - items.append(delegate("bolt:dict_item", stream)) - - if not stream.get("comma"): - stream.expect(("curly", "}")) - break - - node = AstDict(items=AstChildren(items)) - return set_location(node, curly, stream.current) - - if bracket: - elements: List[Any] = [] - - with stream.ignore("newline"): - for _ in stream.peek_until(("bracket", "]")): - elements.append(delegate("bolt:list_item", stream)) - - if not stream.get("comma"): - stream.expect(("bracket", "]")) - break - - node = AstList(items=AstChildren(elements)) - return set_location(node, bracket, stream.current) - - if true: - value = True - elif false: - value = False - elif null: - value = None - elif string: - value = self.quote_helper.unquote_string(string) - elif resource: - if resource.value.startswith(("./", "../")): - value = ":".join( - resolve_using_database( - relative_path=resource.value, - database=self.database, - location=resource.location, - end_location=resource.end_location, - ) - ) - else: - value = resource.value - elif number: - value = string_to_number(number.value) - - node = AstValue(value=value) # type: ignore - return set_location(node, stream.current) - - -@dataclass -class UndefinedIdentifierErrorHandler: - """Parser that provides hints for errors involving undefined identifiers.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - try: - return self.parser(stream) - except UndefinedIdentifier: - raise - except InvalidSyntax as exc: - for alt in exc.alternatives.get(UndefinedIdentifier, []): - if alt.end_location.pos + 1 >= exc.location.pos: # kind of a cheat - alt.notes.append(str(exc)) - raise alt from None - raise diff --git a/packages/mecha/mecha/contrib/bolt/plugin.py b/packages/mecha/mecha/contrib/bolt/plugin.py deleted file mode 100644 index d66a11ff4..000000000 --- a/packages/mecha/mecha/contrib/bolt/plugin.py +++ /dev/null @@ -1,12 +0,0 @@ -__all__ = [ - "beet_default", -] - - -from beet import Context - -from .runtime import Runtime - - -def beet_default(ctx: Context): - ctx.inject(Runtime) diff --git a/packages/mecha/mecha/contrib/bolt/runtime.py b/packages/mecha/mecha/contrib/bolt/runtime.py deleted file mode 100644 index 85bc571ab..000000000 --- a/packages/mecha/mecha/contrib/bolt/runtime.py +++ /dev/null @@ -1,442 +0,0 @@ -__all__ = [ - "Runtime", - "Module", - "CompiledModule", - "ModuleCacheBackend", - "GlobalsInjection", - "ModuleRootParser", - "Evaluator", - "ModuleRootSerializer", - "UnusableCompilationUnit", -] - - -import logging -import marshal -from contextlib import contextmanager -from dataclasses import dataclass, field -from importlib.resources import read_text -from io import BufferedReader, BufferedWriter -from pathlib import Path -from types import CodeType -from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union - -from beet import ( - Context, - PipelineFallthroughException, - TextFile, - TextFileBase, - generate_tree, -) -from beet.core.utils import JsonDict, required_field -from tokenstream import TokenStream, set_location - -from mecha import ( - AstCacheBackend, - AstCommand, - AstRoot, - CommandTree, - CompilationDatabase, - CompilationError, - CompilationUnit, - Diagnostic, - DiagnosticCollection, - Dispatcher, - Mecha, - MechaError, - Parser, - Visitor, - rule, -) - -from .ast import AstModuleRoot -from .codegen import Codegen -from .helpers import get_bolt_helpers -from .loop_info import loop_info -from .parse import get_bolt_parsers -from .utils import SAFE_BUILTINS, internal, rewrite_traceback - -logger = logging.getLogger("mecha") - - -class UnusableCompilationUnit(MechaError): - """Raised when a compilation unit lacks the necessary information to instantiate a module.""" - - message: str - compilation_unit: CompilationUnit - - def __init__(self, message: str, compilation_unit: CompilationUnit) -> None: - super().__init__(message, compilation_unit) - self.message = message - self.compilation_unit = compilation_unit - - def __str__(self) -> str: - return self.message - - -class Module(TextFile): - """Class representing a bolt module.""" - - scope = ("modules",) - extension = ".bolt" - - -@dataclass -class CompiledModule: - """Class holding the state of a compiled module.""" - - ast: AstRoot - code: Optional[CodeType] - refs: List[Any] - output: Optional[str] - resource_location: Optional[str] - globals: Set[str] - namespace: JsonDict = field(default_factory=dict) - executing: bool = False - - -class Runtime: - """The bolt runtime.""" - - modules: Dict[TextFileBase[Any], CompiledModule] - stack: List[CompiledModule] - commands: List[AstCommand] - helpers: Dict[str, Any] - globals: JsonDict - builtins: Set[str] - - directory: Path - database: CompilationDatabase - codegen: Codegen - evaluate: Dispatcher[AstRoot] - - def __init__(self, ctx: Union[Context, Mecha]): - self.modules = {} - self.stack = [] - self.commands = [] - self.helpers = get_bolt_helpers() - self.globals = {"ctx": None, "loop_info": loop_info} - self.builtins = set(SAFE_BUILTINS) - - if isinstance(ctx, Context): - ctx.require( - "mecha.contrib.relative_location", - "mecha.contrib.inline_function_tag", - "mecha.contrib.nesting", - "mecha.contrib.nested_resources", - "mecha.contrib.nested_yaml", - "mecha.contrib.implicit_execute", - self.finalize, - ) - - ctx.data.extend_namespace.append(Module) - - self.globals["ctx"] = ctx - - self.expose("generate_path", ctx.generate.path) - self.expose("generate_id", ctx.generate.id) - self.expose("generate_hash", ctx.generate.hash) - self.expose("generate_objective", ctx.generate.objective) - self.expose( - "generate_tree", - lambda *args, **kwargs: generate_tree( - kwargs.pop("root") if "root" in kwargs else self.get_path(), - *args, - name=( - kwargs.pop("name") - if "name" in kwargs - else ctx.generate["tree"][self.get_path()].format("tree_{incr}") - ), - **kwargs, - ), - ) - - mc = ctx.inject(Mecha) - - else: - mc = ctx - - mc.cache_backend = ModuleCacheBackend(runtime=self) - - commands_json = read_text("mecha.resources", "bolt.json") - mc.spec.add_commands(CommandTree.parse_raw(commands_json)) - mc.spec.parsers.update(get_bolt_parsers(mc.spec.parsers, mc.database)) - mc.spec.parsers["root"] = GlobalsInjection( - runtime=self, - parser=ModuleRootParser(mc.database, mc.spec.parsers["root"]), - ) - - mc.providers.append(Module) - - self.directory = mc.directory - self.database = mc.database - self.codegen = Codegen() - - self.evaluate = Evaluator(runtime=self) - mc.steps.insert(0, self.evaluate) - - mc.serialize.extend(ModuleRootSerializer()) - - def get_path(self) -> str: - """Return the current path.""" - if not self.stack: - raise ValueError("No module currently executing.") - if path := self.stack[-1].resource_location: - return path - raise ValueError("No resource location corresponding to the current module.") - - def expose(self, name: str, function: Callable[..., Any]): - """Expose a utility function.""" - self.globals[name] = lambda *args, **kwargs: function(*args, **kwargs) # type: ignore - - def get_module( - self, - target: Optional[Union[AstRoot, str]] = None, - current: Optional[TextFileBase[Any]] = None, - ) -> CompiledModule: - """Retrieve an executable module.""" - if self.stack and not target and not current: - return self.stack[-1] - - if isinstance(target, str): - current = self.database.index[target] - elif current is None: - current = self.database.current - - module = self.modules.get(current) - compilation_unit = self.database[current] - name = compilation_unit.resource_location or "" - - if module: - if isinstance(target, AstRoot) and module.ast is not target: - logger.debug("Code generation due to ast update for module %s.", name) - else: - return module - else: - if not isinstance(target, AstRoot): - target = compilation_unit.ast - if not target: - raise UnusableCompilationUnit( - f"No ast for module {name}.", compilation_unit - ) - logger.debug("Code generation for module %s.", name) - - source, output, refs = self.codegen(target) - - if source and output: - filename = ( - str(self.directory / compilation_unit.filename) - if compilation_unit.filename - else name - ) - - code = compile(source, filename, "exec") - - else: - code = None - - module = CompiledModule( - target, - code, - refs, - output, - compilation_unit.resource_location, - set(self.globals), - ) - self.modules[current] = module - - return module - - def get_output(self, module: CompiledModule) -> AstRoot: - """Run the module and return the output ast.""" - if not module.code or not module.output: - return module.ast - if module.output in module.namespace: - return module.namespace[module.output] - - if module.executing: - raise ValueError("Import cycle detected.") - - logger.debug("Evaluate module %s.", module.resource_location or "") - - module.namespace.update(self.globals) - module.namespace["_mecha_runtime"] = self - module.namespace["_mecha_refs"] = module.refs - module.namespace["__name__"] = module.resource_location - module.namespace["__file__"] = module.code.co_filename - - self.stack.append(module) - module.executing = True - - try: - with self.error_handler(): - exec(module.code, module.namespace) - finally: - module.executing = False - self.stack.pop() - - return module.namespace[module.output] - - @contextmanager - def scope( - self, - commands: Optional[List[AstCommand]] = None, - ) -> Iterator[List[AstCommand]]: - """Create a new scope to gather commands.""" - if commands is None: - commands = [] - - previous_commands = self.commands - self.commands = commands - - try: - yield commands - finally: - self.commands = previous_commands - - @contextmanager - def error_handler(self): - """Handle errors coming from compiled modules.""" - try: - yield - except Exception as exc: - raise rewrite_traceback(exc) from None - - @internal - def import_module(self, resource_location: str) -> CompiledModule: - """Import module.""" - try: - module = self.get_module(resource_location) - except KeyError: - msg = f"Couldn't import {resource_location!r}." - raise ImportError(msg) from None - if not module.executing: - self.get_output(module) - return module - - @internal - def from_module_import(self, resource_location: str, *args: str) -> Any: - """Import a specific name from a module.""" - module = self.import_module(resource_location) - try: - values = [module.namespace[name] for name in args] - except KeyError as exc: - msg = f"Couldn't import {exc} from {resource_location!r}." - raise ImportError(msg) from None - return values[0] if len(values) == 1 else values - - def finalize(self, ctx: Context): - """Plugin that removes modules at the end of the build.""" - yield - ctx.data[Module].clear() - - -@dataclass -class ModuleCacheBackend(AstCacheBackend): - """Cache backend that also restores the generated modules.""" - - runtime: Runtime = required_field() - - def load(self, f: BufferedReader) -> AstRoot: - data = self.load_data(f) - ast = data["ast"] - - if data["globals"] != set(self.runtime.globals): - raise ValueError("Globals mismatch.") - - self.runtime.modules[self.runtime.database.current] = CompiledModule( - ast=ast, - code=marshal.load(f), - refs=data["refs"], - output=data["output"], - resource_location=data["resource_location"], - globals=data["globals"], - ) - - return ast - - def dump(self, node: AstRoot, f: BufferedWriter): - module = self.runtime.get_module(node) - - self.dump_data( - { - "ast": module.ast, - "refs": module.refs, - "output": module.output, - "resource_location": module.resource_location, - "globals": module.globals, - }, - f, - ) - - marshal.dump(module.code, f) - - -@dataclass -class GlobalsInjection: - """Inject global identifiers.""" - - runtime: Runtime - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.provide( - identifiers=set(self.runtime.globals) - | self.runtime.builtins - | {"__name__"}, - ): - return self.parser(stream) - - -@dataclass -class ModuleRootParser: - """Parser for module root.""" - - database: CompilationDatabase - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - node = self.parser(stream) - if isinstance(node, AstRoot) and isinstance(self.database.current, Module): - node = set_location(AstModuleRoot(commands=node.commands), node) - return node - - -@dataclass -class Evaluator(Visitor): - """Visitor that evaluates modules.""" - - runtime: Runtime = required_field() - - @rule(AstRoot) - def root(self, node: AstRoot) -> AstRoot: - module = self.runtime.get_module(node) - try: - return self.runtime.get_output(module) - except PipelineFallthroughException: - raise - except UnusableCompilationUnit as exc: - if not exc.compilation_unit.diagnostics.error: - raise - raise DiagnosticCollection() - except Exception as exc: - msg = "Top-level statement raised an exception." - if module.resource_location: - msg += f" ({module.resource_location})" - tb = exc.__traceback__.tb_next.tb_next # type: ignore - raise CompilationError(msg) from exc.with_traceback(tb) - - -class ModuleRootSerializer(Visitor): - """Serializer for checking that modules don't emit any commands.""" - - @rule(AstModuleRoot) - def module_root(self, node: AstModuleRoot, result: List[str]): - if node.commands: - command = node.commands[0] - name = command.identifier.partition(":")[0] - raise set_location( - Diagnostic("warn", f"Standalone {name!r} command in module."), - command, - command.arguments[0] if command.arguments else command, - ) diff --git a/packages/mecha/mecha/contrib/bolt/utils.py b/packages/mecha/mecha/contrib/bolt/utils.py deleted file mode 100644 index e0817069e..000000000 --- a/packages/mecha/mecha/contrib/bolt/utils.py +++ /dev/null @@ -1,121 +0,0 @@ -__all__ = [ - "rewrite_traceback", - "fake_traceback", - "internal", - "INTERNAL_CODE", - "SAFE_BUILTINS", -] - - -from bisect import bisect -from types import CodeType, TracebackType -from typing import List, Set, TypeVar - -from mecha.utils import string_to_number - -T = TypeVar("T") - - -INTERNAL_CODE: Set[CodeType] = {string_to_number.__code__} - - -def internal(f: T) -> T: - INTERNAL_CODE.add(f.__code__) # type: ignore - return f - - -SAFE_BUILTINS: List[str] = [ - "abs", - "all", - "any", - "ascii", - "bin", - "bool", - "callable", - "chr", - "dict", - "divmod", - "enumerate", - "filter", - "float", - "frozenset", - "hasattr", - "hash", - "hex", - "id", - "int", - "isinstance", - "issubclass", - "iter", - "len", - "list", - "map", - "max", - "min", - "next", - "object", - "oct", - "ord", - "pow", - "print", - "range", - "repr", - "reversed", - "round", - "set", - "slice", - "sorted", - "str", - "sum", - "tuple", - "type", - "zip", -] - - -def rewrite_traceback(exc: Exception) -> Exception: - tb = exc.__traceback__ and exc.__traceback__.tb_next - - stack: List[TracebackType] = [] - - while tb is not None: - if tb.tb_frame.f_code in INTERNAL_CODE: - tb = tb.tb_next - continue - - line_numbers = tb.tb_frame.f_globals.get("_mecha_lineno") - - if line_numbers: - n1, n2 = line_numbers - lineno = n2[bisect(n1, tb.tb_lineno) - 1] - stack.append(fake_traceback(exc, tb, lineno)) - else: - stack.append(tb) - - tb = tb.tb_next - - tb_next = None - - for tb in reversed(stack): - tb.tb_next = tb_next - tb_next = tb - - return exc.with_traceback(tb) - - -def fake_traceback(exc: Exception, tb: TracebackType, lineno: int) -> TracebackType: # type: ignore - name = tb.tb_frame.f_code.co_name - filename = tb.tb_frame.f_globals["__file__"] - - if name == "": - name = tb.tb_frame.f_globals.get("__name__") - - code = compile("\n" * (lineno - 1) + "raise _mecha_exc", filename, "exec") - - if name: - code = code.replace(co_name=name) - - try: - exec(code, {"_mecha_exc": exc}) - except Exception as exc: - return exc.__traceback__.tb_next # type: ignore diff --git a/packages/mecha/mecha/contrib/bolt_sandbox.py b/packages/mecha/mecha/contrib/bolt_sandbox.py deleted file mode 100644 index 86d5290ef..000000000 --- a/packages/mecha/mecha/contrib/bolt_sandbox.py +++ /dev/null @@ -1,164 +0,0 @@ -"""Plugin that sandboxes the bolt runtime.""" - - -__all__ = [ - "Sandbox", - "SandboxedGetAttribute", - "SandboxedImportModule", - "SecurityError", - "public_attrs", -] - - -import bisect -import collections -import copy -import heapq -import itertools -import json -import math -import random -from collections import defaultdict, deque -from dataclasses import dataclass, fields, is_dataclass -from typing import Any, Callable, Dict, Set, Type, Union - -from beet import Context, TreeData, TreeNode - -from mecha import MechaError -from mecha.contrib.bolt import LoopInfo, Runtime -from mecha.contrib.bolt.utils import internal - - -class SecurityError(MechaError): - """Raised when the sandboxed runtime attempts to perform a forbidden operation.""" - - -def beet_default(ctx: Context): - ctx.inject(Sandbox).activate() - - -def public_attrs(obj: Any) -> Set[str]: - """List public object attributes.""" - attrs = dir(obj) - if is_dataclass(obj): - attrs.extend(f.name for f in fields(obj)) - return {name for name in attrs if not name.startswith("_")} - - -class Sandbox: - """Bolt sandbox.""" - - runtime: Runtime - active: bool - - allowed_imports: Set[str] - allowed_obj_attrs: Dict[Any, Set[str]] - allowed_type_attrs: Dict[Type[Any], Set[str]] - - def __init__(self, ctx: Union[Context, Runtime]): - if isinstance(ctx, Context): - self.runtime = ctx.inject(Runtime) - else: - self.runtime = ctx - - self.active = False - - self.allowed_imports = { - "json", - "math", - "collections", - "itertools", - "bisect", - "heapq", - "copy", - "random", - } - self.allowed_obj_attrs = { - dict: {"fromkeys"}, - defaultdict: {"fromkeys"}, - json: {"loads", "dumps"}, - math: public_attrs(math), - collections: {"deque", "defaultdict"}, - itertools: public_attrs(itertools), - bisect: public_attrs(bisect), - heapq: public_attrs(heapq), - copy: {"copy", "deepcopy"}, - random: public_attrs(random), - } - self.allowed_type_attrs = { - str: public_attrs(str) - ^ { - "maketrans", - "translate", - "encode", - "format", - "format_map", - }, - tuple: public_attrs(tuple), - list: public_attrs(list), - dict: public_attrs(dict), - set: public_attrs(set), - TreeNode: public_attrs(TreeNode), - TreeData: public_attrs(TreeData), - LoopInfo: public_attrs(LoopInfo), - deque: public_attrs(deque), - defaultdict: public_attrs(defaultdict), - } - - def activate(self): - """Activate the sandbox.""" - if self.active: - return - self.active = True - self.runtime.globals["ctx"] = None - self.runtime.helpers.update( - get_attribute=SandboxedGetAttribute( - sandbox=self, - get_attribute=self.runtime.helpers["get_attribute"], - ), - import_module=SandboxedImportModule( - sandbox=self, - import_module=self.runtime.helpers["import_module"], - ), - ) - - -@dataclass -class SandboxedGetAttribute: - """Sandboxed get_attribute helper.""" - - sandbox: Sandbox - get_attribute: Callable[[Any, str], Any] - - @internal - def __call__(self, obj: Any, attr: str) -> Any: - if not hasattr(obj, attr): - return self.get_attribute(obj, attr) - - try: - if allowed := self.sandbox.allowed_obj_attrs.get(obj): - if attr in allowed: - return self.get_attribute(obj, attr) - except TypeError: - pass - - for cls in type.mro(type(obj)): - if allowed := self.sandbox.allowed_type_attrs.get(cls): - if attr in allowed: - return self.get_attribute(obj, attr) - - raise SecurityError(f"Access forbidden attribute {attr!r} of {type(obj)}.") - - -@dataclass -class SandboxedImportModule: - """Sandboxed import_module helper.""" - - sandbox: Sandbox - import_module: Callable[[str], Any] - - @internal - def __call__(self, name: str) -> Any: - if name in self.sandbox.allowed_imports: - return self.import_module(name) - raise SecurityError(f"Access forbidden module {name!r}.") diff --git a/packages/mecha/mecha/resources/bolt.json b/packages/mecha/mecha/resources/bolt.json deleted file mode 100644 index 89f607c1a..000000000 --- a/packages/mecha/mecha/resources/bolt.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "type": "root", - "children": { - "statement": { - "type": "argument", - "parser": "bolt:statement", - "executable": true - }, - "def": { - "type": "literal", - "children": { - "function": { - "type": "argument", - "parser": "bolt:function_signature", - "children": { - "body": { - "type": "argument", - "parser": "bolt:function_root", - "executable": true - } - } - } - } - }, - "return": { - "type": "literal", - "executable": true, - "children": { - "value": { - "type": "argument", - "parser": "bolt:expression", - "executable": true - } - } - }, - "yield": { - "type": "literal", - "executable": true, - "children": { - "from": { - "type": "literal", - "children": { - "value": { - "type": "argument", - "parser": "bolt:expression", - "executable": true - } - } - }, - "value": { - "type": "argument", - "parser": "bolt:expression", - "executable": true - } - } - }, - "del": { - "type": "literal", - "executable": true, - "children": { - "target": { - "type": "argument", - "parser": "bolt:del_target", - "executable": true - } - } - }, - "if": { - "type": "literal", - "children": { - "condition": { - "type": "argument", - "parser": "bolt:expression", - "children": { - "body": { - "type": "argument", - "parser": "bolt:if_block", - "executable": true - } - } - } - } - }, - "elif": { - "type": "literal", - "children": { - "condition": { - "type": "argument", - "parser": "bolt:elif_condition", - "children": { - "body": { - "type": "argument", - "parser": "bolt:elif_block", - "executable": true - } - } - } - } - }, - "else": { - "type": "literal", - "children": { - "body": { - "type": "argument", - "parser": "bolt:else_block", - "executable": true - } - } - }, - "while": { - "type": "literal", - "children": { - "condition": { - "type": "argument", - "parser": "bolt:expression", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": true - } - } - } - } - }, - "for": { - "type": "literal", - "children": { - "target": { - "type": "argument", - "parser": "bolt:assignment_target", - "children": { - "in": { - "type": "literal", - "children": { - "iterable": { - "type": "argument", - "parser": "bolt:expression", - "children": { - "body": { - "type": "argument", - "parser": "mecha:nested_root", - "executable": true - } - } - } - } - } - } - } - } - }, - "break": { - "type": "literal", - "executable": true - }, - "continue": { - "type": "literal", - "executable": true - }, - "import": { - "type": "literal", - "children": { - "module": { - "type": "argument", - "parser": "bolt:import", - "executable": true, - "children": { - "as": { - "type": "literal", - "children": { - "alias": { - "type": "argument", - "parser": "bolt:import_name", - "executable": true - } - } - } - } - } - } - }, - "from": { - "type": "literal", - "children": { - "module": { - "type": "argument", - "parser": "bolt:import", - "children": { - "import": { - "type": "literal", - "children": { - "name": { - "type": "argument", - "parser": "bolt:import_name", - "executable": true, - "redirect": ["from", "module", "import"] - } - } - } - } - } - } - }, - "global": { - "type": "literal", - "children": { - "name": { - "type": "argument", - "parser": "bolt:global_name", - "executable": true, - "redirect": ["global"] - } - } - }, - "nonlocal": { - "type": "literal", - "children": { - "name": { - "type": "argument", - "parser": "bolt:nonlocal_name", - "executable": true, - "redirect": ["nonlocal"] - } - } - }, - "pass": { - "type": "literal", - "executable": true - } - } -} diff --git a/packages/mecha/tests/resources/bolt_examples.mcfunction b/packages/mecha/tests/resources/bolt_examples.mcfunction deleted file mode 100644 index 474bebef0..000000000 --- a/packages/mecha/tests/resources/bolt_examples.mcfunction +++ /dev/null @@ -1,750 +0,0 @@ -0 -### -123 -### -123.456 -### -22220099.6667e-3 -### -0.67e6 -### -1 + 2 -### -1 - 2 -### -1 - 2 + 3 -### -1 - (2 + 3) -### -2 + -54 -### -2 + -54 * 10 -### -(2 + -54) * 10 -### ----64+++64 -### -1 * 2 / 3 * 4 -### -1 * 2 / (3 * 4) -### -16 // 5 % 7 -### --2 ** 3 + +4 * 5 // 6 / 7 % 9 + 10 - 11 << 12 >> 13 & 14 ^ 15 | 16 -### -False or True and "hello" or not "foo" == "bar" or 1 != 2 and 1 < 2 and 2 <= 3 and 5 > 4 and 6 >= 5 and 1 in 1 and 2 not in 2 and 3 is 3 and 3 is not 3 -### -64 §§§ -### -17 % %3 -### -True and (False or True) -### -"this" -### -"this\nthat" -### -"\"\u2588this\nthat" -### -'' -### -'"\'"' -### -'something \t\f\n\\\'here' -### -'abc\"' -### -"hey" "hey" -### -None -### -foo -### -"hello" + foo -### -foo = 1 -foo -### -foo = 1 -"hello" + foo -### -a = 1 -if a == 1: - a = 0 -### -if True: - say hello -elif True or False: - say hello -else: - say hello -### -if True: - say hello -elif True or False: - say hello -else "blah": - say hello -### -if True: - say hello -a = 1 -else: - say hello -### -if -### -if True and -### -if True: -say hello -### -while True: - say hello -### -if score @s tmp matches 0: - if "thing" == "bar": - say hello - if "thing" == "foo": - say hello -### -if score @s tmp matches 0: - if "thing" == "foo": - say hello -### -if score @s tmp matches 0: - while True: - say hello - while True: - say hello -### -if score @s tmp matches 0: - while True: - say hello -### -if score @s tmp matches 42: - count = 42 - while count > 0: - say hello - count = count - 1 -### -foo = ( - "abc" - + "def" -) -### -1 * 2 -* 3 -### -true | false | null -### -foo = 1 -foo == 1 -### -for c in "abc": - say something -### -foo = foo -### -foo = 1 -foo = foo -### -for foo in foo: - foo = foo -### -for foo in "foo": - foo = foo -### -foo += "hey" -### -foo = "" -foo += "hey" -### -wat = the = "f" -### -break -### -continue -### -if true: - break -### -for i in "": - say hello - continue -### -while false: - break -### -for i in "abc": - if i == "b": - break -### -"foo".bar -### -"foo".bar.baz -### -"foo".bar()[0] -### -"foo".bar()[0]."hello".99."with space"("thing" * 7) -### -"foo"( - 1, - 2, - 3, -) -### -def foo(): - say hello -foo() -### -def foo(): - def bar(): - foo() - bar() -### -def foo( - a=1, - b=a, - c=a + b, -): - say hello -### -def f -### -def f() -### -def f(): -say yolo -### -def f(a=a): - say wat -### -def f(a, b=a): - b += a - say wat -### -def f(a, b): - def g(c): - a + b - c -g() -### -def f(a, b): - def g(c): - a + b - f(c) -### -def foo(something): - def wat(): - say - yo - wat - is - dat -# this is a comment - x = "hello" - for i in somehng: - x += i * 3 - - say wow - wat() -### -def foo(something): - def wat(): - say - yo - wat - is - dat -# this is a comment - x = "hello" - for i in something: - x += i * 3 - - say wow - wat() -### -def foo(): - global thing - thing += bar() -def bar(): - global thing - thing += foo() -thing = bar() -### -def foo(): - bar() + thing -def bar(): - foo() + thin -thing = bar() -### -def foo(): - return -### -return "hello" -### -return foo -### -def f(): - def g(): - return foo - foo = 0 -### -def f(): - foo = 0 -f(foo) -### -def f(x): - tellraw @a x -f("thing") -### -def f(x): - tellraw @a xx -f("thing") -### -{ - foo: "bar" -} -### -foo = "hello" -{ - foo: "bar" -} -### -foo = "hello" -{ - "foo": foo -} -### -foo = "hello" -{ - foo * 3: 42, - 16 + 3: [], -} -### -my_predicate = { - "condition": "minecraft:entity_scores", - "entity": "this", - "scores": { - "score1": { - "min": { - "type": "minecraft:score", - "target": "this", - "score": "score2", - "scale": 1 - } - } - } -} -### -my_predicate = { - condition: "minecraft:entity_scores", - entity: "this", - scores: { - score1: { - "min": { - "type": "minecraft:score", - target: "this", - score: "score2", - scale: 1 - } - } - } -} -### -def f(): - return {f(): f(), other: [{}, {}, "wat"]} -### -at @s if "foo" == "bar": - say yolo -### -at @s for i in "foo": - say yolo -### -say hello -### -def wat(): - say hello -### -a = '' -tellraw @p a -### -foo = '[{"text": "Hello", "bold": true}]' -as @a at @s if block ~ ~-1 ~ #wool give @s stone{ - display: { - Name: foo, - Lore: [ - '[{ "text": "Something else here" }]', - ] - } -} -### -thing = (1, 'hey') + () + ("wow",) -### -f"hello" -### -foo = "world" -f"hello {foo}" -### -foo = "world" -f"hello {foo!r}" -### -f"hello {1 + 1}" -### -f"hello {1 + 1:03}" -### -f'{{}}nope{1}' -### -yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" -### -yo = f"" -### -yo = f"\"" -### -yo = f"\\" -### -yo = f"}" -### -yo = f'thing \e' -### -x = 8 -if score @s tmp matches (x, None) say wat -### -def f(): - yield 1 - yield 2 - yield 3 -for i in f(): - say i -### -if True: - yield -### -def f(): - yield -### -import demo:foo -### -import ./thing -### -import wat/is/that -### -from wat/is/that import foo -### -import math -mah.sin(1) -### -import math -math.sin(1) -### -import math as m -m.sin(1) -### -from demo:foo import thing -say thing -### -def f(): - from demo:foo import a b c -say a -### -if score @s tmp matches 1.. if entity @p[tag=foo]: - if True: - say 42 - else: - say no -### -setblock = 0 -### -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -### -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -say done -### -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -else: - say other -### -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -else: - say other -say done -### -execute - as @a # For each "player", - at @s # start at their feet. - anchored eyes # Looking through their eyes, - facing 0 0 0 # face perfectly at the target - anchored feet # (go back to the feet) - positioned ^ ^ ^1 # and move one block forward. - rotated as @s # Face the direction the player - # is actually facing, - positioned ^ ^ ^-1 # and move one block back. - if entity @s[distance=..0.6]: - say foo - say bar -### -say foo - bar -execute - as @a - run say hello -### -while True: - if "hello": - pass - else: - break -### -for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): - append function node.parent: - if node.partition(5): - if score @s thingy matches node.range function node.children - else: - if score @s thingy matches node.range say node.value -### -print(ctx.directory, __name__) -### -a = 1 -setblock a 2 3 stone -### -a = "1 2 3" -setblock a stone -### -a = 1 -if block ^ f"^{a}" ^ #planks say 42 -### -if block ("~", "~", "~") #planks say 42 -### -a = [][] -### -def f(): - pass -f(1, 2, thing=3, 4) -### -def f(): - pass -f(1, 2, **{"thing": 3}, 4) -### -def f(): - pass -f(1, 2, thing=3, *[4]) -### -def f(): - pass -f(1, 2, **{"thing": 3}, *[4]) -### -def f(): - pass -f(1, 2, thing=3) -### -def f(): - pass -f(1, 2, **{"thing": 3}) -### -def f(): - pass -f(1, *[4], 2, thing=3) -### -def f(): - pass -f(1, *[4], 2, **{"thing": 3}) -### -[*"abc"] -### -[**"abc"] -### -{**{1: 1}} -### -{*{1: 1}} -### -foo.bar = 1 -### -foo().bar = 1 -### -def f(): - f.data = {} -### -d = {} -d[1] = {} -d[1][2] = "foo" -### -d = {foo: 1} -d.foo += 1 -### -scoreboard objectives setdisplay list some_score_name -### -color = "red" -scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name -### -my_team = "sidebar.team.red" -scoreboard objectives setdisplay my_team some_score_name -### -item replace block ~ ~2 ~ container.26 with minecraft:spruce_sapling 4 -### -weapon = "thing" -item replace entity @s weapon.offhand from entity @s weapon.mainhand -### -my_weapon = {offhand: "weapon.offhand", mainhand: "weapon.mainhand"} -item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand -### -numbers = list(range(12)) -say numbers[3:] -### -numbers = list(range(12)) -numbers[3:] = [] -### -numbers = list(range(12)) -del numbers[3:] -### -del 1 + 1 -### -execute function demo:foo: -### -mykey = "aaa" -if data storage some:path/to/storage f'some.{mykey}.path{{my: "compound"}}' run say hi -### -mypath = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' -if data storage some:path/to/storage (mypath) run say hi -### -entity_type = "creeper" -at @e[type=entity_type] summon lightning_bolt -### -append function demo:foo -### -function_tag -### -merge function_tag -### -merge function_tag minecraft:tick -### -demo:foo -### -a = demo:foo/bar -### -for class in "abc": - scoreboard objectives add class dummy -### -a = 1 -positioned ~ ~a ~ function demo:foo -### -a, b = "ab" -### -for i, value in enumerate("abc"): - say f"{i}: {value}" -### -global x -### -x = 1 -global x -### -x = 1 -def f(): - global xx -### -def f(x): - global x -### -x = 1 -def f(): - global x - nonlocal x -### -math = 0 -say math -def wat(): - global math - import math -wat() -say math.ceil(0.1) -### -def init_global_score(self, name): - self.name = name - -def rebind_global_score(self, rhs): - if isinstance(rhs, GlobalScore): - scoreboard players operation self.name global = rhs.name global - else: - scoreboard players set self.name global rhs - return self - -GlobalScore = type("GlobalScore", (), {"__init__": init_global_score, "__rebind__": rebind_global_score}) - -a = GlobalScore("a") -a = 123 -a = 456 - -b = GlobalScore("b") -b = 789 -b = a -### -def Counter(x=0): - def incr(): - nonlocal x - x += 1 - return x - return {"incr": incr} - -counter = Counter() -say counter.incr() -say counter.incr() -say Counter(9).incr() -### -for i in range(3): - parent[i] = f"param{i}" -### -def foo(value): - if value: - result = 1 - else: - result = 0 - return result -### -def foo(value): - result = "init" - if value: - result = 1 - else: - result = 0 - return result -### -tag_name = foo:bar -function #tag_name -### -for a in [False, True]: - for b in [False, True]: - for c in [False, True]: - for d in [False, True]: - print((a and b or c and not d) in [True] not in [False]) -### -a = 1 -def f(): - a += 1 diff --git a/packages/mecha/tests/resources/sandbox_examples.mcfunction b/packages/mecha/tests/resources/sandbox_examples.mcfunction deleted file mode 100644 index 86a571a18..000000000 --- a/packages/mecha/tests/resources/sandbox_examples.mcfunction +++ /dev/null @@ -1,19 +0,0 @@ -import sys -### -def f(): - pass -f.__code__ -### -def hello(): - return "world" -say hello.__name__.capitalize() -### -say ctx.project_id -### -print(f'foo {str.__name__} bar') -### -"a{0.__class__}b".format(42) -### -foo = "a{x.__class__}b".format_map({"x":42}) -### -say __name__.format() diff --git a/packages/mecha/tests/snapshots/bolt__parse_0__0.txt b/packages/mecha/tests/snapshots/bolt__parse_0__0.txt deleted file mode 100644 index 518aed9ff..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_0__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -0 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 0 diff --git a/packages/mecha/tests/snapshots/bolt__parse_0__1.txt b/packages/mecha/tests/snapshots/bolt__parse_0__1.txt deleted file mode 100644 index 92bf806ef..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_0__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_100__0.txt b/packages/mecha/tests/snapshots/bolt__parse_100__0.txt deleted file mode 100644 index 3af4d1c56..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_100__0.txt +++ /dev/null @@ -1,19 +0,0 @@ -say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - fragments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_100__1.txt b/packages/mecha/tests/snapshots/bolt__parse_100__1.txt deleted file mode 100644 index b7d106222..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_100__1.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Nothing ---- -output = None ---- diff --git a/packages/mecha/tests/snapshots/bolt__parse_101__0.txt b/packages/mecha/tests/snapshots/bolt__parse_101__0.txt deleted file mode 100644 index 7c4f027d7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_101__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -def wat(): - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'wat' - arguments: - - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_101__1.txt b/packages/mecha/tests/snapshots/bolt__parse_101__1.txt deleted file mode 100644 index 79943169f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_101__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: - def wat(): - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- -output = _mecha_var1 ---- -_mecha_refs[0] - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_102__0.txt b/packages/mecha/tests/snapshots/bolt__parse_102__0.txt deleted file mode 100644 index f47cd4001..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_102__0.txt +++ /dev/null @@ -1,48 +0,0 @@ -a = '' -tellraw @p a ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: '' - - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - identifier: 'tellraw:targets:message' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=9) - end_location: SourceLocation(pos=17, lineno=2, colno=11) - variable: 'p' - arguments: - - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - prefix: None - converter: 'json' - value: - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - value: 'a' diff --git a/packages/mecha/tests/snapshots/bolt__parse_102__1.txt b/packages/mecha/tests/snapshots/bolt__parse_102__1.txt deleted file mode 100644 index bd196963a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_102__1.txt +++ /dev/null @@ -1,44 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '' - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_json(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var1]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=18, lineno=2, colno=12) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - prefix: None - converter: 'json' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=15, lineno=2, colno=9) - end_location: SourceLocation(pos=17, lineno=2, colno=11) - variable: 'p' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - identifier: 'tellraw:targets:message' - arguments: - - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=2, colno=13) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_103__0.txt b/packages/mecha/tests/snapshots/bolt__parse_103__0.txt deleted file mode 100644 index 82d0415c3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_103__0.txt +++ /dev/null @@ -1,180 +0,0 @@ -foo = '[{"text": "Hello", "bold": true}]' -as @a at @s if block ~ ~-1 ~ #wool give @s stone{ - display: { - Name: foo, - Lore: [ - '[{ "text": "Something else here" }]', - ] - } -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=1, colno=42) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=1, colno=42) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=41, lineno=1, colno=42) - value: '[{"text": "Hello", "bold": true}]' - - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:as:targets:subcommand' - arguments: - - location: SourceLocation(pos=45, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=6) - variable: 'a' - arguments: - - - location: SourceLocation(pos=48, lineno=2, colno=7) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:at:targets:subcommand' - arguments: - - location: SourceLocation(pos=51, lineno=2, colno=10) - end_location: SourceLocation(pos=53, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=54, lineno=2, colno=13) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=64, lineno=2, colno=23) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=65, lineno=2, colno=24) - end_location: SourceLocation(pos=68, lineno=2, colno=27) - type: 'relative' - value: -1 - z: - - location: SourceLocation(pos=69, lineno=2, colno=28) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - type: 'relative' - value: 0 - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - is_tag: True - namespace: None - path: 'wool' - block_states: - - data_tags: None - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=90, lineno=2, colno=49) - is_tag: False - namespace: None - path: 'stone' - data_tags: - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=103, lineno=3, colno=12) - value: 'display' - value: - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=119, lineno=4, colno=13) - value: 'Name' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - prefix: None - converter: 'nbt' - value: - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - value: 'foo' - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=138, lineno=5, colno=13) - value: 'Lore' - value: - - location: SourceLocation(pos=140, lineno=5, colno=15) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - elements: - - location: SourceLocation(pos=154, lineno=6, colno=13) - end_location: SourceLocation(pos=191, lineno=6, colno=50) - value: String('[{ "text": "Something else here" }]') diff --git a/packages/mecha/tests/snapshots/bolt__parse_103__1.txt b/packages/mecha/tests/snapshots/bolt__parse_103__1.txt deleted file mode 100644 index dbb7392fd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_103__1.txt +++ /dev/null @@ -1,161 +0,0 @@ -_mecha_lineno = [1, 8], [1, 4] -_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '[{"text": "Hello", "bold": true}]' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var1 = _mecha_helper_interpolate_nbt(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_var1), _mecha_refs[2]])))])))]))]))]))]))]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=121, lineno=4, colno=15) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - prefix: None - converter: 'nbt' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=115, lineno=4, colno=9) - end_location: SourceLocation(pos=124, lineno=4, colno=18) - key: - - value: - -_mecha_refs[2] - - location: SourceLocation(pos=134, lineno=5, colno=9) - end_location: SourceLocation(pos=202, lineno=7, colno=10) - key: - - value: - -_mecha_refs[3] - - location: SourceLocation(pos=105, lineno=3, colno=14) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - entries: - - -_mecha_refs[4] - - location: SourceLocation(pos=96, lineno=3, colno=5) - end_location: SourceLocation(pos=208, lineno=8, colno=6) - key: - - value: - -_mecha_refs[5] - - location: SourceLocation(pos=90, lineno=2, colno=49) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - entries: - -_mecha_refs[6] - - location: SourceLocation(pos=85, lineno=2, colno=44) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: - - data_tags: - -_mecha_refs[7] - - location: SourceLocation(pos=82, lineno=2, colno=41) - end_location: SourceLocation(pos=84, lineno=2, colno=43) - variable: 's' - arguments: - -_mecha_refs[8] - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'give:targets:item' - arguments: - - -_mecha_refs[9] - - location: SourceLocation(pos=77, lineno=2, colno=36) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[10] - - location: SourceLocation(pos=63, lineno=2, colno=22) - end_location: SourceLocation(pos=70, lineno=2, colno=29) - x: - - y: - - z: - -_mecha_refs[11] - - location: SourceLocation(pos=71, lineno=2, colno=30) - end_location: SourceLocation(pos=76, lineno=2, colno=35) - identifier: - - block_states: - - data_tags: None -_mecha_refs[12] - - location: SourceLocation(pos=54, lineno=2, colno=13) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - - -_mecha_refs[13] - - location: SourceLocation(pos=51, lineno=2, colno=10) - end_location: SourceLocation(pos=53, lineno=2, colno=12) - variable: 's' - arguments: - -_mecha_refs[14] - - location: SourceLocation(pos=48, lineno=2, colno=7) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:at:targets:subcommand' - arguments: - - -_mecha_refs[15] - - location: SourceLocation(pos=45, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=6) - variable: 'a' - arguments: - -_mecha_refs[16] - - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:as:targets:subcommand' - arguments: - - -_mecha_refs[17] - - location: SourceLocation(pos=42, lineno=2, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[18] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=210, lineno=9, colno=2) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_104__0.txt b/packages/mecha/tests/snapshots/bolt__parse_104__0.txt deleted file mode 100644 index 204978829..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_104__0.txt +++ /dev/null @@ -1,59 +0,0 @@ -thing = (1, 'hey') + () + ("wow",) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=35, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'thing' - rebind: False - value: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - operator: '+' - left: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: '+' - left: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - items: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 1 - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - value: 'hey' - right: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - items: - - right: - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - items: - - location: SourceLocation(pos=27, lineno=1, colno=28) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - value: 'wow' diff --git a/packages/mecha/tests/snapshots/bolt__parse_104__1.txt b/packages/mecha/tests/snapshots/bolt__parse_104__1.txt deleted file mode 100644 index 9f5c3edf4..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_104__1.txt +++ /dev/null @@ -1,23 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - _mecha_var0 = 1 - _mecha_var1 = 'hey' - _mecha_var2 = (_mecha_var0,_mecha_var1,) - _mecha_var3 = () - _mecha_var2 = _mecha_var2 + _mecha_var3 - _mecha_var4 = 'wow' - _mecha_var5 = (_mecha_var4,) - _mecha_var2 = _mecha_var2 + _mecha_var5 - thing = _mecha_var2 -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) ---- -output = _mecha_var7 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=35, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_105__0.txt b/packages/mecha/tests/snapshots/bolt__parse_105__0.txt deleted file mode 100644 index ad97d9176..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_105__0.txt +++ /dev/null @@ -1,17 +0,0 @@ -f"hello" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - fmt: 'hello' - values: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_105__1.txt b/packages/mecha/tests/snapshots/bolt__parse_105__1.txt deleted file mode 100644 index d78006888..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_105__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'hello'.format() -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_106__0.txt b/packages/mecha/tests/snapshots/bolt__parse_106__0.txt deleted file mode 100644 index c326d4ae9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_106__0.txt +++ /dev/null @@ -1,41 +0,0 @@ -foo = "world" -f"hello {foo}" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'world' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=15) - fmt: 'hello {}' - values: - - location: SourceLocation(pos=23, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=13) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_106__1.txt b/packages/mecha/tests/snapshots/bolt__parse_106__1.txt deleted file mode 100644 index 90c8d4eb5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_106__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'world' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 'hello {}'.format(_mecha_var1) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_107__0.txt b/packages/mecha/tests/snapshots/bolt__parse_107__0.txt deleted file mode 100644 index d34879799..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_107__0.txt +++ /dev/null @@ -1,41 +0,0 @@ -foo = "world" -f"hello {foo!r}" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'world' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=30, lineno=2, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=30, lineno=2, colno=17) - fmt: 'hello {!r}' - values: - - location: SourceLocation(pos=23, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=13) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_107__1.txt b/packages/mecha/tests/snapshots/bolt__parse_107__1.txt deleted file mode 100644 index 09066c304..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_107__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'world' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 'hello {!r}'.format(_mecha_var1) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_108__0.txt b/packages/mecha/tests/snapshots/bolt__parse_108__0.txt deleted file mode 100644 index f93be2f05..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_108__0.txt +++ /dev/null @@ -1,30 +0,0 @@ -f"hello {1 + 1}" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - fmt: 'hello {}' - values: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '+' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 1 - right: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_108__1.txt b/packages/mecha/tests/snapshots/bolt__parse_108__1.txt deleted file mode 100644 index 664d24330..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_108__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0 + _mecha_var1 - _mecha_var2 = 'hello {}'.format(_mecha_var0) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_109__0.txt b/packages/mecha/tests/snapshots/bolt__parse_109__0.txt deleted file mode 100644 index b1c793d0f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_109__0.txt +++ /dev/null @@ -1,30 +0,0 @@ -f"hello {1 + 1:03}" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - fmt: 'hello {:03}' - values: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '+' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 1 - right: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_109__1.txt b/packages/mecha/tests/snapshots/bolt__parse_109__1.txt deleted file mode 100644 index b352262ea..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_109__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0 + _mecha_var1 - _mecha_var2 = 'hello {:03}'.format(_mecha_var0) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_10__0.txt b/packages/mecha/tests/snapshots/bolt__parse_10__0.txt deleted file mode 100644 index d959e5469..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_10__0.txt +++ /dev/null @@ -1,40 +0,0 @@ -2 + -54 * 10 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 2 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '*' - left: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '-' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 54 - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 10 diff --git a/packages/mecha/tests/snapshots/bolt__parse_10__1.txt b/packages/mecha/tests/snapshots/bolt__parse_10__1.txt deleted file mode 100644 index 019e03060..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_10__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 2 - _mecha_var1 = 54 - _mecha_var1 = - _mecha_var1 - _mecha_var2 = 10 - _mecha_var1 = _mecha_var1 * _mecha_var2 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_110__0.txt b/packages/mecha/tests/snapshots/bolt__parse_110__0.txt deleted file mode 100644 index d25663bba..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_110__0.txt +++ /dev/null @@ -1,20 +0,0 @@ -f'{{}}nope{1}' ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - fmt: '{{}}nope{}' - values: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_110__1.txt b/packages/mecha/tests/snapshots/bolt__parse_110__1.txt deleted file mode 100644 index 3a8d82aa6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_110__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - _mecha_var1 = '{{}}nope{}'.format(_mecha_var0) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_111__0.txt b/packages/mecha/tests/snapshots/bolt__parse_111__0.txt deleted file mode 100644 index 964a0d040..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_111__0.txt +++ /dev/null @@ -1,41 +0,0 @@ -yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=1, colno=37) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=36, lineno=1, colno=37) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - rebind: False - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=36, lineno=1, colno=37) - fmt: '{{{}}}' - values: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - fmt: '{{{}}}' - values: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - fmt: '{{{:08}}}' - values: - - location: SourceLocation(pos=20, lineno=1, colno=21) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: 7 diff --git a/packages/mecha/tests/snapshots/bolt__parse_111__1.txt b/packages/mecha/tests/snapshots/bolt__parse_111__1.txt deleted file mode 100644 index c82b3c7ed..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_111__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 7 - _mecha_var1 = '{{{:08}}}'.format(_mecha_var0) - _mecha_var2 = '{{{}}}'.format(_mecha_var1) - _mecha_var3 = '{{{}}}'.format(_mecha_var2) - yo = _mecha_var3 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_112__0.txt b/packages/mecha/tests/snapshots/bolt__parse_112__0.txt deleted file mode 100644 index 5a4515d6f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_112__0.txt +++ /dev/null @@ -1,28 +0,0 @@ -yo = f"" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - rebind: False - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - fmt: '' - values: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_112__1.txt b/packages/mecha/tests/snapshots/bolt__parse_112__1.txt deleted file mode 100644 index 1cd364bb8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_112__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = ''.format() - yo = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_113__0.txt b/packages/mecha/tests/snapshots/bolt__parse_113__0.txt deleted file mode 100644 index dff0b539d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_113__0.txt +++ /dev/null @@ -1,28 +0,0 @@ -yo = f"\"" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - rebind: False - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - fmt: '"' - values: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_113__1.txt b/packages/mecha/tests/snapshots/bolt__parse_113__1.txt deleted file mode 100644 index 2712ec24a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_113__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '"'.format() - yo = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_114__0.txt b/packages/mecha/tests/snapshots/bolt__parse_114__0.txt deleted file mode 100644 index 9d84cfb6e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_114__0.txt +++ /dev/null @@ -1,28 +0,0 @@ -yo = f"\\" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 'yo' - rebind: False - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - fmt: '\\' - values: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_114__1.txt b/packages/mecha/tests/snapshots/bolt__parse_114__1.txt deleted file mode 100644 index 0f2a4d713..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_114__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '\\'.format() - yo = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_115__0.txt b/packages/mecha/tests/snapshots/bolt__parse_115__0.txt deleted file mode 100644 index d448a7276..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_115__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Expected quote but got brace '}'. -# line 1, column 8 -# 1 | yo = f"}" -# : ^ -yo = f"}" diff --git a/packages/mecha/tests/snapshots/bolt__parse_116__0.txt b/packages/mecha/tests/snapshots/bolt__parse_116__0.txt deleted file mode 100644 index 8bb2a7b3c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_116__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Invalid escape sequence \e. -# line 1, column 14 -# 1 | yo = f'thing \e' -# : ^^ -yo = f'thing \e' diff --git a/packages/mecha/tests/snapshots/bolt__parse_117__0.txt b/packages/mecha/tests/snapshots/bolt__parse_117__0.txt deleted file mode 100644 index 961b8513e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_117__0.txt +++ /dev/null @@ -1,83 +0,0 @@ -x = 8 -if score @s tmp matches (x, None) say wat ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'x' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 8 - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=17, lineno=2, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=18, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - value: 'tmp' - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - prefix: None - converter: 'range' - value: - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - items: - - location: SourceLocation(pos=31, lineno=2, colno=26) - end_location: SourceLocation(pos=32, lineno=2, colno=27) - value: 'x' - - location: SourceLocation(pos=34, lineno=2, colno=29) - end_location: SourceLocation(pos=38, lineno=2, colno=33) - value: None - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - fragments: - - location: SourceLocation(pos=44, lineno=2, colno=39) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - value: 'wat' diff --git a/packages/mecha/tests/snapshots/bolt__parse_117__1.txt b/packages/mecha/tests/snapshots/bolt__parse_117__1.txt deleted file mode 100644 index edc509894..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_117__1.txt +++ /dev/null @@ -1,67 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 8 - x = _mecha_var0 - _mecha_var1 = x - _mecha_var2 = None - _mecha_var3 = (_mecha_var1,_mecha_var2,) - _mecha_var3 = _mecha_helper_interpolate_range(_mecha_var3, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_refs[2], _mecha_var3, _mecha_refs[3]]))]))) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=30, lineno=2, colno=25) - end_location: SourceLocation(pos=39, lineno=2, colno=34) - prefix: None - converter: 'range' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=17, lineno=2, colno=12) - variable: 's' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=18, lineno=2, colno=13) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - value: 'tmp' -_mecha_refs[3] - - location: SourceLocation(pos=40, lineno=2, colno=35) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[5] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=2, colno=42) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_118__0.txt b/packages/mecha/tests/snapshots/bolt__parse_118__0.txt deleted file mode 100644 index 336df7f4a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_118__0.txt +++ /dev/null @@ -1,92 +0,0 @@ -def f(): - yield 1 - yield 2 - yield 3 -for i in f(): - say i ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=7, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=44, lineno=4, colno=12) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=44, lineno=4, colno=12) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=20, lineno=2, colno=12) - identifier: 'yield:value' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=11) - end_location: SourceLocation(pos=20, lineno=2, colno=12) - value: 1 - - location: SourceLocation(pos=25, lineno=3, colno=5) - end_location: SourceLocation(pos=32, lineno=3, colno=12) - identifier: 'yield:value' - arguments: - - location: SourceLocation(pos=31, lineno=3, colno=11) - end_location: SourceLocation(pos=32, lineno=3, colno=12) - value: 2 - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=44, lineno=4, colno=12) - identifier: 'yield:value' - arguments: - - location: SourceLocation(pos=43, lineno=4, colno=11) - end_location: SourceLocation(pos=44, lineno=4, colno=12) - value: 3 - - location: SourceLocation(pos=45, lineno=5, colno=1) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=49, lineno=5, colno=5) - end_location: SourceLocation(pos=50, lineno=5, colno=6) - value: 'i' - rebind: False - - location: SourceLocation(pos=54, lineno=5, colno=10) - end_location: SourceLocation(pos=57, lineno=5, colno=13) - value: - - location: SourceLocation(pos=54, lineno=5, colno=10) - end_location: SourceLocation(pos=55, lineno=5, colno=11) - value: 'f' - arguments: - - - location: SourceLocation(pos=63, lineno=6, colno=5) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - commands: - - location: SourceLocation(pos=63, lineno=6, colno=5) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=67, lineno=6, colno=9) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=67, lineno=6, colno=9) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - value: 'i' diff --git a/packages/mecha/tests/snapshots/bolt__parse_118__1.txt b/packages/mecha/tests/snapshots/bolt__parse_118__1.txt deleted file mode 100644 index 27d635425..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_118__1.txt +++ /dev/null @@ -1,44 +0,0 @@ -_mecha_lineno = [1, 13, 16], [1, 5, 6] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - def f(): - _mecha_var0 = 1 - yield _mecha_var0 - _mecha_var1 = 2 - yield _mecha_var1 - _mecha_var2 = 3 - yield _mecha_var2 - _mecha_var3 = f - _mecha_var3 = _mecha_var3() - for i in _mecha_var3: - _mecha_var4 = i - _mecha_var4 = _mecha_helper_interpolate_message(_mecha_var4, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var4]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=67, lineno=6, colno=9) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - prefix: None - converter: 'message' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=63, lineno=6, colno=5) - end_location: SourceLocation(pos=68, lineno=6, colno=10) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=7, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_119__0.txt b/packages/mecha/tests/snapshots/bolt__parse_119__0.txt deleted file mode 100644 index 566664cc2..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_119__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -if True: -#>ERROR Can only use 'yield' in functions. -# line 2, column 5 -# 1 | if True: -# 2 | yield -# : ^^^^^ - yield diff --git a/packages/mecha/tests/snapshots/bolt__parse_11__0.txt b/packages/mecha/tests/snapshots/bolt__parse_11__0.txt deleted file mode 100644 index dec9309d6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_11__0.txt +++ /dev/null @@ -1,40 +0,0 @@ -(2 + -54) * 10 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '*' - left: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '+' - left: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 2 - right: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '-' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 54 - right: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 10 diff --git a/packages/mecha/tests/snapshots/bolt__parse_11__1.txt b/packages/mecha/tests/snapshots/bolt__parse_11__1.txt deleted file mode 100644 index 5c482d291..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_11__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 2 - _mecha_var1 = 54 - _mecha_var1 = - _mecha_var1 - _mecha_var0 = _mecha_var0 + _mecha_var1 - _mecha_var2 = 10 - _mecha_var0 = _mecha_var0 * _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_120__0.txt b/packages/mecha/tests/snapshots/bolt__parse_120__0.txt deleted file mode 100644 index db707d7e9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_120__0.txt +++ /dev/null @@ -1,28 +0,0 @@ -def f(): - yield ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=2, colno=10) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=18, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=18, lineno=2, colno=10) - identifier: 'yield' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_120__1.txt b/packages/mecha/tests/snapshots/bolt__parse_120__1.txt deleted file mode 100644 index 1226c5c97..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_120__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: - def f(): - yield -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- -output = _mecha_var1 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=2, colno=10) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_121__0.txt b/packages/mecha/tests/snapshots/bolt__parse_121__0.txt deleted file mode 100644 index 078fdc525..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_121__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Can't import 'demo:foo' without alias. -# line 1, column 8 -# 1 | import demo:foo -# : ^^^^^^^^ -import demo:foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_122__0.txt b/packages/mecha/tests/snapshots/bolt__parse_122__0.txt deleted file mode 100644 index 48755d502..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_122__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Can't resolve relative resource location './thing'. -# line 1, column 8 -# 1 | import ./thing -# : ^^^^^^^ -import ./thing diff --git a/packages/mecha/tests/snapshots/bolt__parse_123__0.txt b/packages/mecha/tests/snapshots/bolt__parse_123__0.txt deleted file mode 100644 index 0f6473b28..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_123__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Invalid module location 'wat/is/that'. -# line 1, column 8 -# 1 | import wat/is/that -# : ^^^^^^^^^^^ -import wat/is/that diff --git a/packages/mecha/tests/snapshots/bolt__parse_124__0.txt b/packages/mecha/tests/snapshots/bolt__parse_124__0.txt deleted file mode 100644 index 846353f25..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_124__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Invalid module location 'wat/is/that'. -# line 1, column 6 -# 1 | from wat/is/that import foo -# : ^^^^^^^^^^^ -from wat/is/that import foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_125__0.txt b/packages/mecha/tests/snapshots/bolt__parse_125__0.txt deleted file mode 100644 index 2a9b6d942..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_125__0.txt +++ /dev/null @@ -1,9 +0,0 @@ -import math -#>ERROR Identifier 'mah' is not defined. -# line 2, column 1 -# 1 | import math -# 2 | mah.sin(1) -# : ^^^ -# Notes: -# - Expected assignment but got literal '.sin(1)'. -mah.sin(1) diff --git a/packages/mecha/tests/snapshots/bolt__parse_126__0.txt b/packages/mecha/tests/snapshots/bolt__parse_126__0.txt deleted file mode 100644 index b74d3c4cc..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_126__0.txt +++ /dev/null @@ -1,41 +0,0 @@ -import math -math.sin(1) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - identifier: 'import:module' - arguments: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - is_tag: False - namespace: None - path: 'math' - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=12) - value: - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=9) - name: 'sin' - value: - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=5) - value: 'math' - arguments: - - location: SourceLocation(pos=21, lineno=2, colno=10) - end_location: SourceLocation(pos=22, lineno=2, colno=11) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_126__1.txt b/packages/mecha/tests/snapshots/bolt__parse_126__1.txt deleted file mode 100644 index b3fd73816..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_126__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - math = _mecha_helper_import_module('math') - _mecha_var0 = math - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'sin') - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0(_mecha_var1) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_127__0.txt b/packages/mecha/tests/snapshots/bolt__parse_127__0.txt deleted file mode 100644 index b0706dbbe..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_127__0.txt +++ /dev/null @@ -1,45 +0,0 @@ -import math as m -m.sin(1) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'import:module:as:alias' - arguments: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - is_tag: False - namespace: None - path: 'math' - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'm' - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=9) - value: - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=22, lineno=2, colno=6) - name: 'sin' - value: - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=18, lineno=2, colno=2) - value: 'm' - arguments: - - location: SourceLocation(pos=23, lineno=2, colno=7) - end_location: SourceLocation(pos=24, lineno=2, colno=8) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_127__1.txt b/packages/mecha/tests/snapshots/bolt__parse_127__1.txt deleted file mode 100644 index c3764c8d4..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_127__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - m = _mecha_helper_import_module('math') - _mecha_var0 = m - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'sin') - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0(_mecha_var1) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_128__0.txt b/packages/mecha/tests/snapshots/bolt__parse_128__0.txt deleted file mode 100644 index 28ffdf2a5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_128__0.txt +++ /dev/null @@ -1,42 +0,0 @@ -from demo:foo import thing -say thing ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'from:module:import:subcommand' - arguments: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - is_tag: False - namespace: 'demo' - path: 'foo' - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: 'thing' - - location: SourceLocation(pos=27, lineno=2, colno=1) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - value: 'thing' diff --git a/packages/mecha/tests/snapshots/bolt__parse_128__1.txt b/packages/mecha/tests/snapshots/bolt__parse_128__1.txt deleted file mode 100644 index 86f6bda62..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_128__1.txt +++ /dev/null @@ -1,35 +0,0 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - thing = _mecha_runtime.from_module_import('demo:foo', 'thing') - _mecha_var0 = thing - _mecha_var0 = _mecha_helper_interpolate_message(_mecha_var0, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var0]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - prefix: None - converter: 'message' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=27, lineno=2, colno=1) - end_location: SourceLocation(pos=36, lineno=2, colno=10) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_129__0.txt b/packages/mecha/tests/snapshots/bolt__parse_129__0.txt deleted file mode 100644 index 1a183bd03..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_129__0.txt +++ /dev/null @@ -1,74 +0,0 @@ -def f(): - from demo:foo import a b c -say a ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=45, lineno=3, colno=6) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:subcommand' - arguments: - - location: SourceLocation(pos=18, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=18) - is_tag: False - namespace: 'demo' - path: 'foo' - - location: SourceLocation(pos=34, lineno=2, colno=26) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:name:subcommand' - arguments: - - location: SourceLocation(pos=34, lineno=2, colno=26) - end_location: SourceLocation(pos=35, lineno=2, colno=27) - value: 'a' - - location: SourceLocation(pos=36, lineno=2, colno=28) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:name:subcommand' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=28) - end_location: SourceLocation(pos=37, lineno=2, colno=29) - value: 'b' - - location: SourceLocation(pos=38, lineno=2, colno=30) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=38, lineno=2, colno=30) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - value: 'c' - - location: SourceLocation(pos=40, lineno=3, colno=1) - end_location: SourceLocation(pos=45, lineno=3, colno=6) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=44, lineno=3, colno=5) - end_location: SourceLocation(pos=45, lineno=3, colno=6) - fragments: - - location: SourceLocation(pos=44, lineno=3, colno=5) - end_location: SourceLocation(pos=45, lineno=3, colno=6) - value: 'a' diff --git a/packages/mecha/tests/snapshots/bolt__parse_129__1.txt b/packages/mecha/tests/snapshots/bolt__parse_129__1.txt deleted file mode 100644 index 60a562a65..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_129__1.txt +++ /dev/null @@ -1,25 +0,0 @@ -_mecha_lineno = [1, 6], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: - def f(): - a, b, c = _mecha_runtime.from_module_import('demo:foo', 'a', 'b', 'c') - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) ---- -output = _mecha_var1 ---- -_mecha_refs[0] - - location: SourceLocation(pos=40, lineno=3, colno=1) - end_location: SourceLocation(pos=45, lineno=3, colno=6) - identifier: 'say:message' - arguments: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=45, lineno=3, colno=6) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_12__0.txt b/packages/mecha/tests/snapshots/bolt__parse_12__0.txt deleted file mode 100644 index 08b37b8bd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_12__0.txt +++ /dev/null @@ -1,50 +0,0 @@ ----64+++64 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - value: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - value: - - location: SourceLocation(pos=2, lineno=1, colno=3) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - value: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 64 - right: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - value: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - value: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 64 diff --git a/packages/mecha/tests/snapshots/bolt__parse_12__1.txt b/packages/mecha/tests/snapshots/bolt__parse_12__1.txt deleted file mode 100644 index 8e049fb3d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_12__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 64 - _mecha_var0 = - _mecha_var0 - _mecha_var0 = - _mecha_var0 - _mecha_var0 = - _mecha_var0 - _mecha_var1 = 64 - _mecha_var1 = + _mecha_var1 - _mecha_var1 = + _mecha_var1 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_130__0.txt b/packages/mecha/tests/snapshots/bolt__parse_130__0.txt deleted file mode 100644 index b78d2412d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_130__0.txt +++ /dev/null @@ -1,116 +0,0 @@ -if score @s tmp matches 1.. if entity @p[tag=foo]: - if True: - say 42 - else: - say no ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - min: 1 - max: None - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:if:entity:entities:subcommand' - arguments: - - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=49, lineno=1, colno=50) - variable: 'p' - arguments: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - inverted: False - key: - - location: SourceLocation(pos=41, lineno=1, colno=42) - end_location: SourceLocation(pos=44, lineno=1, colno=45) - value: 'tag' - value: - - location: SourceLocation(pos=45, lineno=1, colno=46) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'foo' - - location: SourceLocation(pos=55, lineno=2, colno=5) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=55, lineno=2, colno=5) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=55, lineno=2, colno=5) - end_location: SourceLocation(pos=78, lineno=3, colno=15) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=58, lineno=2, colno=8) - end_location: SourceLocation(pos=62, lineno=2, colno=12) - value: True - - location: SourceLocation(pos=72, lineno=3, colno=9) - end_location: SourceLocation(pos=78, lineno=3, colno=15) - commands: - - location: SourceLocation(pos=72, lineno=3, colno=9) - end_location: SourceLocation(pos=78, lineno=3, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=76, lineno=3, colno=13) - end_location: SourceLocation(pos=78, lineno=3, colno=15) - fragments: - - location: SourceLocation(pos=76, lineno=3, colno=13) - end_location: SourceLocation(pos=78, lineno=3, colno=15) - value: '42' - - location: SourceLocation(pos=83, lineno=4, colno=5) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=97, lineno=5, colno=9) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - commands: - - location: SourceLocation(pos=97, lineno=5, colno=9) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=101, lineno=5, colno=13) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - fragments: - - location: SourceLocation(pos=101, lineno=5, colno=13) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - value: 'no' diff --git a/packages/mecha/tests/snapshots/bolt__parse_130__1.txt b/packages/mecha/tests/snapshots/bolt__parse_130__1.txt deleted file mode 100644 index db07ead93..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_130__1.txt +++ /dev/null @@ -1,102 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = True - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1))]))]))]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[11], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=72, lineno=3, colno=9) - end_location: SourceLocation(pos=78, lineno=3, colno=15) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=97, lineno=5, colno=9) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=55, lineno=2, colno=5) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - commands: - - -_mecha_refs[3] - - location: SourceLocation(pos=55, lineno=2, colno=5) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:commands' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=49, lineno=1, colno=50) - variable: 'p' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:if:entity:entities:subcommand' - arguments: - - -_mecha_refs[6] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - -_mecha_refs[7] - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' -_mecha_refs[8] - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - min: 1 - max: None -_mecha_refs[9] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[10] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[11] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=103, lineno=5, colno=15) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_131__0.txt b/packages/mecha/tests/snapshots/bolt__parse_131__0.txt deleted file mode 100644 index fc34b84e9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_131__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Expected coordinate or identifier but got literal '='. -# line 1, column 10 -# 1 | setblock = 0 -# : ^ -setblock = 0 diff --git a/packages/mecha/tests/snapshots/bolt__parse_132__0.txt b/packages/mecha/tests/snapshots/bolt__parse_132__0.txt deleted file mode 100644 index ee685fe5d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_132__0.txt +++ /dev/null @@ -1,144 +0,0 @@ -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 1 - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - fragments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - value: '1' - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=21, lineno=3, colno=6) - end_location: SourceLocation(pos=22, lineno=3, colno=7) - value: 2 - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - fragments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - value: '2' - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=39, lineno=5, colno=6) - end_location: SourceLocation(pos=40, lineno=5, colno=7) - value: 3 - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - fragments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - value: '3' - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=7, colno=6) - end_location: SourceLocation(pos=58, lineno=7, colno=7) - value: 4 - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - fragments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - value: '4' diff --git a/packages/mecha/tests/snapshots/bolt__parse_132__1.txt b/packages/mecha/tests/snapshots/bolt__parse_132__1.txt deleted file mode 100644 index c97de844b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_132__1.txt +++ /dev/null @@ -1,66 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - -_mecha_refs[3] - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - -_mecha_refs[4] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_133__0.txt b/packages/mecha/tests/snapshots/bolt__parse_133__0.txt deleted file mode 100644 index 7b3a583f3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_133__0.txt +++ /dev/null @@ -1,158 +0,0 @@ -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -say done ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=78, lineno=9, colno=9) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 1 - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - fragments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - value: '1' - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=21, lineno=3, colno=6) - end_location: SourceLocation(pos=22, lineno=3, colno=7) - value: 2 - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - fragments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - value: '2' - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=39, lineno=5, colno=6) - end_location: SourceLocation(pos=40, lineno=5, colno=7) - value: 3 - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - fragments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - value: '3' - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=7, colno=6) - end_location: SourceLocation(pos=58, lineno=7, colno=7) - value: 4 - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - fragments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - value: '4' - - location: SourceLocation(pos=70, lineno=9, colno=1) - end_location: SourceLocation(pos=78, lineno=9, colno=9) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=74, lineno=9, colno=5) - end_location: SourceLocation(pos=78, lineno=9, colno=9) - fragments: - - location: SourceLocation(pos=74, lineno=9, colno=5) - end_location: SourceLocation(pos=78, lineno=9, colno=9) - value: 'done' diff --git a/packages/mecha/tests/snapshots/bolt__parse_133__1.txt b/packages/mecha/tests/snapshots/bolt__parse_133__1.txt deleted file mode 100644 index 29692703a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_133__1.txt +++ /dev/null @@ -1,75 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - _mecha_runtime.commands.append(_mecha_refs[4]) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - -_mecha_refs[3] - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - -_mecha_refs[4] - - location: SourceLocation(pos=70, lineno=9, colno=1) - end_location: SourceLocation(pos=78, lineno=9, colno=9) - identifier: 'say:message' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=78, lineno=9, colno=9) - commands: - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_134__0.txt b/packages/mecha/tests/snapshots/bolt__parse_134__0.txt deleted file mode 100644 index 7bd8f6017..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_134__0.txt +++ /dev/null @@ -1,168 +0,0 @@ -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -else: - say other ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 1 - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - fragments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - value: '1' - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=21, lineno=3, colno=6) - end_location: SourceLocation(pos=22, lineno=3, colno=7) - value: 2 - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - fragments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - value: '2' - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=39, lineno=5, colno=6) - end_location: SourceLocation(pos=40, lineno=5, colno=7) - value: 3 - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - fragments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - value: '3' - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=7, colno=6) - end_location: SourceLocation(pos=58, lineno=7, colno=7) - value: 4 - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - fragments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - value: '4' - - location: SourceLocation(pos=70, lineno=9, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=80, lineno=10, colno=5) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=80, lineno=10, colno=5) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=84, lineno=10, colno=9) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - fragments: - - location: SourceLocation(pos=84, lineno=10, colno=9) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - value: 'other' diff --git a/packages/mecha/tests/snapshots/bolt__parse_134__1.txt b/packages/mecha/tests/snapshots/bolt__parse_134__1.txt deleted file mode 100644 index 998a03f66..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_134__1.txt +++ /dev/null @@ -1,76 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[4].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - -_mecha_refs[3] - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - -_mecha_refs[4] - - location: SourceLocation(pos=80, lineno=10, colno=5) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_135__0.txt b/packages/mecha/tests/snapshots/bolt__parse_135__0.txt deleted file mode 100644 index 2045b6de6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_135__0.txt +++ /dev/null @@ -1,182 +0,0 @@ -if 1: - say 1 -elif 2: - say 2 -elif 3: - say 3 -elif 4: - say 4 -else: - say other -say done ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=98, lineno=11, colno=9) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 1 - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - fragments: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - value: '1' - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=21, lineno=3, colno=6) - end_location: SourceLocation(pos=22, lineno=3, colno=7) - value: 2 - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - fragments: - - location: SourceLocation(pos=32, lineno=4, colno=9) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - value: '2' - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=34, lineno=5, colno=1) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=39, lineno=5, colno=6) - end_location: SourceLocation(pos=40, lineno=5, colno=7) - value: 3 - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - fragments: - - location: SourceLocation(pos=50, lineno=6, colno=9) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - value: '3' - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=52, lineno=7, colno=1) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=57, lineno=7, colno=6) - end_location: SourceLocation(pos=58, lineno=7, colno=7) - value: 4 - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - fragments: - - location: SourceLocation(pos=68, lineno=8, colno=9) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - value: '4' - - location: SourceLocation(pos=70, lineno=9, colno=1) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=80, lineno=10, colno=5) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - - location: SourceLocation(pos=80, lineno=10, colno=5) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=84, lineno=10, colno=9) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - fragments: - - location: SourceLocation(pos=84, lineno=10, colno=9) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - value: 'other' - - location: SourceLocation(pos=90, lineno=11, colno=1) - end_location: SourceLocation(pos=98, lineno=11, colno=9) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=94, lineno=11, colno=5) - end_location: SourceLocation(pos=98, lineno=11, colno=9) - fragments: - - location: SourceLocation(pos=94, lineno=11, colno=5) - end_location: SourceLocation(pos=98, lineno=11, colno=9) - value: 'done' diff --git a/packages/mecha/tests/snapshots/bolt__parse_135__1.txt b/packages/mecha/tests/snapshots/bolt__parse_135__1.txt deleted file mode 100644 index ba16caa66..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_135__1.txt +++ /dev/null @@ -1,85 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[4].commands) - _mecha_runtime.commands.append(_mecha_refs[5]) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=10, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=46, lineno=6, colno=5) - end_location: SourceLocation(pos=51, lineno=6, colno=10) - commands: - -_mecha_refs[3] - - location: SourceLocation(pos=64, lineno=8, colno=5) - end_location: SourceLocation(pos=69, lineno=8, colno=10) - commands: - -_mecha_refs[4] - - location: SourceLocation(pos=80, lineno=10, colno=5) - end_location: SourceLocation(pos=89, lineno=10, colno=14) - commands: - -_mecha_refs[5] - - location: SourceLocation(pos=90, lineno=11, colno=1) - end_location: SourceLocation(pos=98, lineno=11, colno=9) - identifier: 'say:message' - arguments: - -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=98, lineno=11, colno=9) - commands: - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_136__0.txt b/packages/mecha/tests/snapshots/bolt__parse_136__0.txt deleted file mode 100644 index 728253155..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_136__0.txt +++ /dev/null @@ -1,212 +0,0 @@ -execute - as @a # For each "player", - at @s # start at their feet. - anchored eyes # Looking through their eyes, - facing 0 0 0 # face perfectly at the target - anchored feet # (go back to the feet) - positioned ^ ^ ^1 # and move one block forward. - rotated as @s # Face the direction the player - # is actually facing, - positioned ^ ^ ^-1 # and move one block back. - if entity @s[distance=..0.6]: - say foo - say bar ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:as:targets:subcommand' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=8) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - variable: 'a' - arguments: - - - location: SourceLocation(pos=66, lineno=3, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:at:targets:subcommand' - arguments: - - location: SourceLocation(pos=69, lineno=3, colno=8) - end_location: SourceLocation(pos=71, lineno=3, colno=10) - variable: 's' - arguments: - - - location: SourceLocation(pos=122, lineno=4, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:anchored:anchor:subcommand' - arguments: - - location: SourceLocation(pos=131, lineno=4, colno=14) - end_location: SourceLocation(pos=135, lineno=4, colno=18) - value: 'eyes' - - location: SourceLocation(pos=185, lineno=5, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:facing:pos:subcommand' - arguments: - - location: SourceLocation(pos=192, lineno=5, colno=12) - end_location: SourceLocation(pos=197, lineno=5, colno=17) - x: - - location: SourceLocation(pos=192, lineno=5, colno=12) - end_location: SourceLocation(pos=193, lineno=5, colno=13) - type: 'absolute' - value: 0 - y: - - location: SourceLocation(pos=194, lineno=5, colno=14) - end_location: SourceLocation(pos=195, lineno=5, colno=15) - type: 'absolute' - value: 0 - z: - - location: SourceLocation(pos=196, lineno=5, colno=16) - end_location: SourceLocation(pos=197, lineno=5, colno=17) - type: 'absolute' - value: 0 - - location: SourceLocation(pos=249, lineno=6, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:anchored:anchor:subcommand' - arguments: - - location: SourceLocation(pos=258, lineno=6, colno=14) - end_location: SourceLocation(pos=262, lineno=6, colno=18) - value: 'feet' - - location: SourceLocation(pos=306, lineno=7, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:positioned:pos:subcommand' - arguments: - - location: SourceLocation(pos=317, lineno=7, colno=16) - end_location: SourceLocation(pos=323, lineno=7, colno=22) - x: - - location: SourceLocation(pos=317, lineno=7, colno=16) - end_location: SourceLocation(pos=318, lineno=7, colno=17) - type: 'local' - value: 0 - y: - - location: SourceLocation(pos=319, lineno=7, colno=18) - end_location: SourceLocation(pos=320, lineno=7, colno=19) - type: 'local' - value: 0 - z: - - location: SourceLocation(pos=321, lineno=7, colno=20) - end_location: SourceLocation(pos=323, lineno=7, colno=22) - type: 'local' - value: 1 - - location: SourceLocation(pos=369, lineno=8, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:rotated:as:targets:subcommand' - arguments: - - location: SourceLocation(pos=380, lineno=8, colno=16) - end_location: SourceLocation(pos=382, lineno=8, colno=18) - variable: 's' - arguments: - - - location: SourceLocation(pos=492, lineno=10, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:positioned:pos:subcommand' - arguments: - - location: SourceLocation(pos=503, lineno=10, colno=16) - end_location: SourceLocation(pos=510, lineno=10, colno=23) - x: - - location: SourceLocation(pos=503, lineno=10, colno=16) - end_location: SourceLocation(pos=504, lineno=10, colno=17) - type: 'local' - value: 0 - y: - - location: SourceLocation(pos=505, lineno=10, colno=18) - end_location: SourceLocation(pos=506, lineno=10, colno=19) - type: 'local' - value: 0 - z: - - location: SourceLocation(pos=507, lineno=10, colno=20) - end_location: SourceLocation(pos=510, lineno=10, colno=23) - type: 'local' - value: -1 - - location: SourceLocation(pos=552, lineno=11, colno=5) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:if:entity:entities:subcommand' - arguments: - - location: SourceLocation(pos=562, lineno=11, colno=15) - end_location: SourceLocation(pos=580, lineno=11, colno=33) - variable: 's' - arguments: - - location: SourceLocation(pos=565, lineno=11, colno=18) - end_location: SourceLocation(pos=579, lineno=11, colno=32) - inverted: False - key: - - location: SourceLocation(pos=565, lineno=11, colno=18) - end_location: SourceLocation(pos=573, lineno=11, colno=26) - value: 'distance' - value: - - location: SourceLocation(pos=574, lineno=11, colno=27) - end_location: SourceLocation(pos=579, lineno=11, colno=32) - min: None - max: 0.6 - - location: SourceLocation(pos=590, lineno=12, colno=9) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=590, lineno=12, colno=9) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - commands: - - location: SourceLocation(pos=590, lineno=12, colno=9) - end_location: SourceLocation(pos=597, lineno=12, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=594, lineno=12, colno=13) - end_location: SourceLocation(pos=597, lineno=12, colno=16) - fragments: - - location: SourceLocation(pos=594, lineno=12, colno=13) - end_location: SourceLocation(pos=597, lineno=12, colno=16) - value: 'foo' - - location: SourceLocation(pos=606, lineno=13, colno=9) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=610, lineno=13, colno=13) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - fragments: - - location: SourceLocation(pos=610, lineno=13, colno=13) - end_location: SourceLocation(pos=613, lineno=13, colno=16) - value: 'bar' diff --git a/packages/mecha/tests/snapshots/bolt__parse_136__1.txt b/packages/mecha/tests/snapshots/bolt__parse_136__1.txt deleted file mode 100644 index b7d106222..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_136__1.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Nothing ---- -output = None ---- diff --git a/packages/mecha/tests/snapshots/bolt__parse_137__0.txt b/packages/mecha/tests/snapshots/bolt__parse_137__0.txt deleted file mode 100644 index 6ddecb2a5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_137__0.txt +++ /dev/null @@ -1,65 +0,0 @@ -say foo - bar -execute - as @a - run say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=8) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=8) - fragments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'foo' - - location: SourceLocation(pos=11, lineno=2, colno=4) - end_location: SourceLocation(pos=12, lineno=2, colno=5) - value: ' ' - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=15, lineno=2, colno=8) - value: 'bar' - - location: SourceLocation(pos=16, lineno=3, colno=1) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=28, lineno=4, colno=5) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - identifier: 'execute:as:targets:subcommand' - arguments: - - location: SourceLocation(pos=31, lineno=4, colno=8) - end_location: SourceLocation(pos=33, lineno=4, colno=10) - variable: 'a' - arguments: - - - location: SourceLocation(pos=38, lineno=5, colno=5) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=42, lineno=5, colno=9) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=46, lineno=5, colno=13) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=46, lineno=5, colno=13) - end_location: SourceLocation(pos=51, lineno=5, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_137__1.txt b/packages/mecha/tests/snapshots/bolt__parse_137__1.txt deleted file mode 100644 index b7d106222..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_137__1.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Nothing ---- -output = None ---- diff --git a/packages/mecha/tests/snapshots/bolt__parse_138__0.txt b/packages/mecha/tests/snapshots/bolt__parse_138__0.txt deleted file mode 100644 index 019056734..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_138__0.txt +++ /dev/null @@ -1,57 +0,0 @@ -while True: - if "hello": - pass - else: - break ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=65, lineno=6, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=64, lineno=5, colno=14) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: True - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=64, lineno=5, colno=14) - commands: - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=40, lineno=3, colno=13) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=8) - end_location: SourceLocation(pos=26, lineno=2, colno=15) - value: 'hello' - - location: SourceLocation(pos=36, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=13) - commands: - - location: SourceLocation(pos=36, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=13) - identifier: 'pass' - arguments: - - - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=64, lineno=5, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=59, lineno=5, colno=9) - end_location: SourceLocation(pos=64, lineno=5, colno=14) - commands: - - location: SourceLocation(pos=59, lineno=5, colno=9) - end_location: SourceLocation(pos=64, lineno=5, colno=14) - identifier: 'break' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_138__1.txt b/packages/mecha/tests/snapshots/bolt__parse_138__1.txt deleted file mode 100644 index c91df75e6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_138__1.txt +++ /dev/null @@ -1,26 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = True - while _mecha_var0: - _mecha_var1 = 'hello' - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - pass - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - break -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=65, lineno=6, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_139__0.txt b/packages/mecha/tests/snapshots/bolt__parse_139__0.txt deleted file mode 100644 index 3c44673c6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_139__0.txt +++ /dev/null @@ -1,218 +0,0 @@ -for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): - append function node.parent: - if node.partition(5): - if score @s thingy matches node.range function node.children - else: - if score @s thingy matches node.range say node.value ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=282, lineno=7, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 'node' - rebind: False - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=65, lineno=1, colno=66) - value: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 'generate_tree' - arguments: - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=64, lineno=1, colno=65) - value: 'abcdefghijklmnopqrstuvwxyz0123456789' - - location: SourceLocation(pos=71, lineno=2, colno=5) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - commands: - - location: SourceLocation(pos=71, lineno=2, colno=5) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'append:function:name:commands' - arguments: - - location: SourceLocation(pos=87, lineno=2, colno=21) - end_location: SourceLocation(pos=98, lineno=2, colno=32) - prefix: None - converter: 'resource_location' - value: - - location: SourceLocation(pos=87, lineno=2, colno=21) - end_location: SourceLocation(pos=98, lineno=2, colno=32) - name: 'parent' - value: - - location: SourceLocation(pos=87, lineno=2, colno=21) - end_location: SourceLocation(pos=91, lineno=2, colno=25) - value: 'node' - - location: SourceLocation(pos=108, lineno=3, colno=9) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - commands: - - location: SourceLocation(pos=108, lineno=3, colno=9) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=111, lineno=3, colno=12) - end_location: SourceLocation(pos=128, lineno=3, colno=29) - value: - - location: SourceLocation(pos=111, lineno=3, colno=12) - end_location: SourceLocation(pos=125, lineno=3, colno=26) - name: 'partition' - value: - - location: SourceLocation(pos=111, lineno=3, colno=12) - end_location: SourceLocation(pos=115, lineno=3, colno=16) - value: 'node' - arguments: - - location: SourceLocation(pos=126, lineno=3, colno=27) - end_location: SourceLocation(pos=127, lineno=3, colno=28) - value: 5 - - location: SourceLocation(pos=142, lineno=4, colno=13) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - commands: - - location: SourceLocation(pos=142, lineno=4, colno=13) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=142, lineno=4, colno=13) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=151, lineno=4, colno=22) - end_location: SourceLocation(pos=153, lineno=4, colno=24) - variable: 's' - arguments: - - - location: SourceLocation(pos=154, lineno=4, colno=25) - end_location: SourceLocation(pos=160, lineno=4, colno=31) - value: 'thingy' - - location: SourceLocation(pos=169, lineno=4, colno=40) - end_location: SourceLocation(pos=179, lineno=4, colno=50) - prefix: None - converter: 'range' - value: - - location: SourceLocation(pos=169, lineno=4, colno=40) - end_location: SourceLocation(pos=179, lineno=4, colno=50) - name: 'range' - value: - - location: SourceLocation(pos=169, lineno=4, colno=40) - end_location: SourceLocation(pos=173, lineno=4, colno=44) - value: 'node' - - location: SourceLocation(pos=180, lineno=4, colno=51) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=180, lineno=4, colno=51) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'function:name' - arguments: - - location: SourceLocation(pos=189, lineno=4, colno=60) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - prefix: None - converter: 'resource_location' - value: - - location: SourceLocation(pos=189, lineno=4, colno=60) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - name: 'children' - value: - - location: SourceLocation(pos=189, lineno=4, colno=60) - end_location: SourceLocation(pos=193, lineno=4, colno=64) - value: 'node' - - location: SourceLocation(pos=211, lineno=5, colno=9) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=229, lineno=6, colno=13) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - commands: - - location: SourceLocation(pos=229, lineno=6, colno=13) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=229, lineno=6, colno=13) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=238, lineno=6, colno=22) - end_location: SourceLocation(pos=240, lineno=6, colno=24) - variable: 's' - arguments: - - - location: SourceLocation(pos=241, lineno=6, colno=25) - end_location: SourceLocation(pos=247, lineno=6, colno=31) - value: 'thingy' - - location: SourceLocation(pos=256, lineno=6, colno=40) - end_location: SourceLocation(pos=266, lineno=6, colno=50) - prefix: None - converter: 'range' - value: - - location: SourceLocation(pos=256, lineno=6, colno=40) - end_location: SourceLocation(pos=266, lineno=6, colno=50) - name: 'range' - value: - - location: SourceLocation(pos=256, lineno=6, colno=40) - end_location: SourceLocation(pos=260, lineno=6, colno=44) - value: 'node' - - location: SourceLocation(pos=267, lineno=6, colno=51) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=267, lineno=6, colno=51) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=271, lineno=6, colno=55) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=271, lineno=6, colno=55) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - name: 'value' - value: - - location: SourceLocation(pos=271, lineno=6, colno=55) - end_location: SourceLocation(pos=275, lineno=6, colno=59) - value: 'node' diff --git a/packages/mecha/tests/snapshots/bolt__parse_139__1.txt b/packages/mecha/tests/snapshots/bolt__parse_139__1.txt deleted file mode 100644 index 6f034dc8f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_139__1.txt +++ /dev/null @@ -1,193 +0,0 @@ -_mecha_lineno = [1, 15, 19, 25, 35], [1, 2, 3, 4, 6] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -with _mecha_runtime.scope() as _mecha_var10: - _mecha_var0 = generate_tree - _mecha_var1 = 'abcdefghijklmnopqrstuvwxyz0123456789' - _mecha_var0 = _mecha_var0(_mecha_var1) - for node in _mecha_var0: - _mecha_var2 = node - _mecha_var2 = _mecha_helper_get_attribute(_mecha_var2, 'parent') - _mecha_var2 = _mecha_helper_interpolate_resource_location(_mecha_var2, _mecha_refs[0]) - with _mecha_runtime.scope() as _mecha_var9: - _mecha_var3 = node - _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'partition') - _mecha_var4 = 5 - _mecha_var3 = _mecha_var3(_mecha_var4) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_var5 = node - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'range') - _mecha_var5 = _mecha_helper_interpolate_range(_mecha_var5, _mecha_refs[1]) - _mecha_var6 = node - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'children') - _mecha_var6 = _mecha_helper_interpolate_resource_location(_mecha_var6, _mecha_refs[4]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[2], _mecha_refs[3], _mecha_var5, _mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var6]))]))]))]))) - _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_var7 = node - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'range') - _mecha_var7 = _mecha_helper_interpolate_range(_mecha_var7, _mecha_refs[9]) - _mecha_var8 = node - _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'value') - _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[12]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[15], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_var7, _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[13], arguments=_mecha_helper_children([_mecha_var8]))]))]))]))) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[18], arguments=_mecha_helper_children([_mecha_var2, _mecha_helper_replace(_mecha_refs[17], commands=_mecha_helper_children(_mecha_var9))]))) -_mecha_var11 = _mecha_helper_replace(_mecha_refs[19], commands=_mecha_helper_children(_mecha_var10)) ---- -output = _mecha_var11 ---- -_mecha_refs[0] - - location: SourceLocation(pos=87, lineno=2, colno=21) - end_location: SourceLocation(pos=98, lineno=2, colno=32) - prefix: None - converter: 'resource_location' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=169, lineno=4, colno=40) - end_location: SourceLocation(pos=179, lineno=4, colno=50) - prefix: None - converter: 'range' - value: - -_mecha_refs[2] - - location: SourceLocation(pos=151, lineno=4, colno=22) - end_location: SourceLocation(pos=153, lineno=4, colno=24) - variable: 's' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=154, lineno=4, colno=25) - end_location: SourceLocation(pos=160, lineno=4, colno=31) - value: 'thingy' -_mecha_refs[4] - - location: SourceLocation(pos=189, lineno=4, colno=60) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - prefix: None - converter: 'resource_location' - value: - -_mecha_refs[5] - - location: SourceLocation(pos=180, lineno=4, colno=51) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'function:name' - arguments: - -_mecha_refs[6] - - location: SourceLocation(pos=180, lineno=4, colno=51) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[7] - - location: SourceLocation(pos=142, lineno=4, colno=13) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[8] - - location: SourceLocation(pos=142, lineno=4, colno=13) - end_location: SourceLocation(pos=202, lineno=4, colno=73) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[9] - - location: SourceLocation(pos=256, lineno=6, colno=40) - end_location: SourceLocation(pos=266, lineno=6, colno=50) - prefix: None - converter: 'range' - value: - -_mecha_refs[10] - - location: SourceLocation(pos=238, lineno=6, colno=22) - end_location: SourceLocation(pos=240, lineno=6, colno=24) - variable: 's' - arguments: - -_mecha_refs[11] - - location: SourceLocation(pos=241, lineno=6, colno=25) - end_location: SourceLocation(pos=247, lineno=6, colno=31) - value: 'thingy' -_mecha_refs[12] - - location: SourceLocation(pos=271, lineno=6, colno=55) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - prefix: None - converter: 'message' - value: - -_mecha_refs[13] - - location: SourceLocation(pos=267, lineno=6, colno=51) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'say:message' - arguments: - -_mecha_refs[14] - - location: SourceLocation(pos=267, lineno=6, colno=51) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[15] - - location: SourceLocation(pos=229, lineno=6, colno=13) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[16] - - location: SourceLocation(pos=229, lineno=6, colno=13) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[17] - - location: SourceLocation(pos=108, lineno=3, colno=9) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - commands: - - -_mecha_refs[18] - - location: SourceLocation(pos=71, lineno=2, colno=5) - end_location: SourceLocation(pos=281, lineno=6, colno=65) - identifier: 'append:function:name:commands' - arguments: - - -_mecha_refs[19] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=282, lineno=7, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_13__0.txt b/packages/mecha/tests/snapshots/bolt__parse_13__0.txt deleted file mode 100644 index 332bd7a00..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_13__0.txt +++ /dev/null @@ -1,45 +0,0 @@ -1 * 2 / 3 * 4 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '*' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - operator: '/' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '*' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 - right: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 3 - right: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 4 diff --git a/packages/mecha/tests/snapshots/bolt__parse_13__1.txt b/packages/mecha/tests/snapshots/bolt__parse_13__1.txt deleted file mode 100644 index f7a6a242b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_13__1.txt +++ /dev/null @@ -1,21 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 * _mecha_var1 - _mecha_var2 = 3 - _mecha_var0 = _mecha_var0 / _mecha_var2 - _mecha_var3 = 4 - _mecha_var0 = _mecha_var0 * _mecha_var3 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_140__0.txt b/packages/mecha/tests/snapshots/bolt__parse_140__0.txt deleted file mode 100644 index fa8628949..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_140__0.txt +++ /dev/null @@ -1,33 +0,0 @@ -print(ctx.directory, __name__) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=1, colno=31) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=1, colno=31) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'print' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - name: 'directory' - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'ctx' - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - value: '__name__' diff --git a/packages/mecha/tests/snapshots/bolt__parse_140__1.txt b/packages/mecha/tests/snapshots/bolt__parse_140__1.txt deleted file mode 100644 index c401e17d6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_140__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = print - _mecha_var1 = ctx - _mecha_var1 = _mecha_helper_get_attribute(_mecha_var1, 'directory') - _mecha_var2 = __name__ - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_141__0.txt b/packages/mecha/tests/snapshots/bolt__parse_141__0.txt deleted file mode 100644 index 7b45bec4f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_141__0.txt +++ /dev/null @@ -1,71 +0,0 @@ -a = 1 -setblock a 2 3 stone ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 1 - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - identifier: 'setblock:pos:block' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=20, lineno=2, colno=15) - x: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=16, lineno=2, colno=11) - prefix: None - converter: 'coordinate' - value: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=16, lineno=2, colno=11) - value: 'a' - y: - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=18, lineno=2, colno=13) - type: 'absolute' - value: 2 - z: - - location: SourceLocation(pos=19, lineno=2, colno=14) - end_location: SourceLocation(pos=20, lineno=2, colno=15) - type: 'absolute' - value: 3 - - location: SourceLocation(pos=21, lineno=2, colno=16) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - identifier: - - location: SourceLocation(pos=21, lineno=2, colno=16) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - is_tag: False - namespace: None - path: 'stone' - block_states: - - data_tags: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_141__1.txt b/packages/mecha/tests/snapshots/bolt__parse_141__1.txt deleted file mode 100644 index 5aeeb3431..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_141__1.txt +++ /dev/null @@ -1,56 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_coordinate(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], x=_mecha_var1), _mecha_refs[2]]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=16, lineno=2, colno=11) - prefix: None - converter: 'coordinate' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=20, lineno=2, colno=15) - x: - - y: - - z: - -_mecha_refs[2] - - location: SourceLocation(pos=21, lineno=2, colno=16) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - identifier: - - block_states: - - data_tags: None -_mecha_refs[3] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - identifier: 'setblock:pos:block' - arguments: - - -_mecha_refs[4] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_142__0.txt b/packages/mecha/tests/snapshots/bolt__parse_142__0.txt deleted file mode 100644 index ec3daa7ff..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_142__0.txt +++ /dev/null @@ -1,55 +0,0 @@ -a = "1 2 3" -setblock a stone ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: '1 2 3' - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - identifier: 'setblock:pos:block' - arguments: - - location: SourceLocation(pos=21, lineno=2, colno=10) - end_location: SourceLocation(pos=22, lineno=2, colno=11) - prefix: None - converter: 'vec3' - value: - - location: SourceLocation(pos=21, lineno=2, colno=10) - end_location: SourceLocation(pos=22, lineno=2, colno=11) - value: 'a' - - location: SourceLocation(pos=23, lineno=2, colno=12) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - identifier: - - location: SourceLocation(pos=23, lineno=2, colno=12) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - is_tag: False - namespace: None - path: 'stone' - block_states: - - data_tags: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_142__1.txt b/packages/mecha/tests/snapshots/bolt__parse_142__1.txt deleted file mode 100644 index 24f0f750e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_142__1.txt +++ /dev/null @@ -1,46 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_vec3 = _mecha_runtime.helpers['interpolate_vec3'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '1 2 3' - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_vec3(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var1, _mecha_refs[1]]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=21, lineno=2, colno=10) - end_location: SourceLocation(pos=22, lineno=2, colno=11) - prefix: None - converter: 'vec3' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=23, lineno=2, colno=12) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - identifier: - - block_states: - - data_tags: None -_mecha_refs[2] - - location: SourceLocation(pos=12, lineno=2, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - identifier: 'setblock:pos:block' - arguments: - - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=28, lineno=2, colno=17) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_143__0.txt b/packages/mecha/tests/snapshots/bolt__parse_143__0.txt deleted file mode 100644 index 39185aa87..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_143__0.txt +++ /dev/null @@ -1,99 +0,0 @@ -a = 1 -if block ^ f"^{a}" ^ #planks say 42 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 1 - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - x: - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=16, lineno=2, colno=11) - type: 'local' - value: 0 - y: - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=24, lineno=2, colno=19) - prefix: None - converter: 'coordinate' - value: - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=24, lineno=2, colno=19) - fmt: '^{}' - values: - - location: SourceLocation(pos=21, lineno=2, colno=16) - end_location: SourceLocation(pos=22, lineno=2, colno=17) - value: 'a' - z: - - location: SourceLocation(pos=25, lineno=2, colno=20) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - type: 'local' - value: 0 - - location: SourceLocation(pos=27, lineno=2, colno=22) - end_location: SourceLocation(pos=34, lineno=2, colno=29) - identifier: - - location: SourceLocation(pos=27, lineno=2, colno=22) - end_location: SourceLocation(pos=34, lineno=2, colno=29) - is_tag: True - namespace: None - path: 'planks' - block_states: - - data_tags: None - - location: SourceLocation(pos=35, lineno=2, colno=30) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=35, lineno=2, colno=30) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=39, lineno=2, colno=34) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - fragments: - - location: SourceLocation(pos=39, lineno=2, colno=34) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - value: '42' diff --git a/packages/mecha/tests/snapshots/bolt__parse_143__1.txt b/packages/mecha/tests/snapshots/bolt__parse_143__1.txt deleted file mode 100644 index 2ba1cbbdb..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_143__1.txt +++ /dev/null @@ -1,72 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var2 = '^{}'.format(_mecha_var1) - _mecha_var2 = _mecha_helper_interpolate_coordinate(_mecha_var2, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], y=_mecha_var2), _mecha_refs[2], _mecha_refs[3]]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=24, lineno=2, colno=19) - prefix: None - converter: 'coordinate' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=15, lineno=2, colno=10) - end_location: SourceLocation(pos=26, lineno=2, colno=21) - x: - - y: - - z: - -_mecha_refs[2] - - location: SourceLocation(pos=27, lineno=2, colno=22) - end_location: SourceLocation(pos=34, lineno=2, colno=29) - identifier: - - block_states: - - data_tags: None -_mecha_refs[3] - - location: SourceLocation(pos=35, lineno=2, colno=30) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - - -_mecha_refs[5] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_144__0.txt b/packages/mecha/tests/snapshots/bolt__parse_144__0.txt deleted file mode 100644 index 31b8ea2e0..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_144__0.txt +++ /dev/null @@ -1,69 +0,0 @@ -if block ("~", "~", "~") #planks say 42 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - prefix: None - converter: 'vec3' - value: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - items: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: '~' - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - value: '~' - - location: SourceLocation(pos=20, lineno=1, colno=21) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: '~' - - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - identifier: - - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - is_tag: True - namespace: None - path: 'planks' - block_states: - - data_tags: None - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=37, lineno=1, colno=38) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - fragments: - - location: SourceLocation(pos=37, lineno=1, colno=38) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - value: '42' diff --git a/packages/mecha/tests/snapshots/bolt__parse_144__1.txt b/packages/mecha/tests/snapshots/bolt__parse_144__1.txt deleted file mode 100644 index f3818d39f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_144__1.txt +++ /dev/null @@ -1,61 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_interpolate_vec3 = _mecha_runtime.helpers['interpolate_vec3'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = '~' - _mecha_var1 = '~' - _mecha_var2 = '~' - _mecha_var3 = (_mecha_var0,_mecha_var1,_mecha_var2,) - _mecha_var3 = _mecha_helper_interpolate_vec3(_mecha_var3, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var3, _mecha_refs[1], _mecha_refs[2]]))]))) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - prefix: None - converter: 'vec3' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=25, lineno=1, colno=26) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - identifier: - - block_states: - - data_tags: None -_mecha_refs[2] - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'execute:if:block:pos:block:subcommand' - arguments: - - - -_mecha_refs[4] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_145__0.txt b/packages/mecha/tests/snapshots/bolt__parse_145__0.txt deleted file mode 100644 index a39b4c0ec..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_145__0.txt +++ /dev/null @@ -1,38 +0,0 @@ -a = [][] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - items: - - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - start: None - stop: None - step: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_145__1.txt b/packages/mecha/tests/snapshots/bolt__parse_145__1.txt deleted file mode 100644 index 557eac19d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_145__1.txt +++ /dev/null @@ -1,17 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = [] - _mecha_var0 = _mecha_var0[:] - a = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_146__0.txt b/packages/mecha/tests/snapshots/bolt__parse_146__0.txt deleted file mode 100644 index ba0d8395f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_146__0.txt +++ /dev/null @@ -1,8 +0,0 @@ -def f(): - pass -#>ERROR Positional argument not allowed after keyword arguments. -# line 3, column 18 -# 2 | pass -# 3 | f(1, 2, thing=3, 4) -# : ^ -f(1, 2, thing=3, 4) diff --git a/packages/mecha/tests/snapshots/bolt__parse_147__0.txt b/packages/mecha/tests/snapshots/bolt__parse_147__0.txt deleted file mode 100644 index 1318f25d6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_147__0.txt +++ /dev/null @@ -1,8 +0,0 @@ -def f(): - pass -#>ERROR Positional argument not allowed after keyword arguments. -# line 3, column 25 -# 2 | pass -# 3 | f(1, 2, **{"thing": 3}, 4) -# : ^ -f(1, 2, **{"thing": 3}, 4) diff --git a/packages/mecha/tests/snapshots/bolt__parse_148__0.txt b/packages/mecha/tests/snapshots/bolt__parse_148__0.txt deleted file mode 100644 index 7773bcb10..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_148__0.txt +++ /dev/null @@ -1,8 +0,0 @@ -def f(): - pass -#>ERROR List unpacking not allowed after keyword arguments. -# line 3, column 18 -# 2 | pass -# 3 | f(1, 2, thing=3, *[4]) -# : ^^^^ -f(1, 2, thing=3, *[4]) diff --git a/packages/mecha/tests/snapshots/bolt__parse_149__0.txt b/packages/mecha/tests/snapshots/bolt__parse_149__0.txt deleted file mode 100644 index c92c0885d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_149__0.txt +++ /dev/null @@ -1,8 +0,0 @@ -def f(): - pass -#>ERROR List unpacking not allowed after keyword arguments. -# line 3, column 25 -# 2 | pass -# 3 | f(1, 2, **{"thing": 3}, *[4]) -# : ^^^^ -f(1, 2, **{"thing": 3}, *[4]) diff --git a/packages/mecha/tests/snapshots/bolt__parse_14__0.txt b/packages/mecha/tests/snapshots/bolt__parse_14__0.txt deleted file mode 100644 index 1f398b5e8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_14__0.txt +++ /dev/null @@ -1,45 +0,0 @@ -1 * 2 / (3 * 4) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '/' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '*' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 - right: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - operator: '*' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 3 - right: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 4 diff --git a/packages/mecha/tests/snapshots/bolt__parse_14__1.txt b/packages/mecha/tests/snapshots/bolt__parse_14__1.txt deleted file mode 100644 index 021b75428..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_14__1.txt +++ /dev/null @@ -1,21 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 * _mecha_var1 - _mecha_var2 = 3 - _mecha_var3 = 4 - _mecha_var2 = _mecha_var2 * _mecha_var3 - _mecha_var0 = _mecha_var0 / _mecha_var2 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_150__0.txt b/packages/mecha/tests/snapshots/bolt__parse_150__0.txt deleted file mode 100644 index 91d4f2f7e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_150__0.txt +++ /dev/null @@ -1,60 +0,0 @@ -def f(): - pass -f(1, 2, thing=3) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=35, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'pass' - arguments: - - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=34, lineno=3, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=34, lineno=3, colno=17) - value: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=19, lineno=3, colno=2) - value: 'f' - arguments: - - location: SourceLocation(pos=20, lineno=3, colno=3) - end_location: SourceLocation(pos=21, lineno=3, colno=4) - value: 1 - - location: SourceLocation(pos=23, lineno=3, colno=6) - end_location: SourceLocation(pos=24, lineno=3, colno=7) - value: 2 - - location: SourceLocation(pos=26, lineno=3, colno=9) - end_location: SourceLocation(pos=33, lineno=3, colno=16) - name: 'thing' - value: - - location: SourceLocation(pos=32, lineno=3, colno=15) - end_location: SourceLocation(pos=33, lineno=3, colno=16) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_150__1.txt b/packages/mecha/tests/snapshots/bolt__parse_150__1.txt deleted file mode 100644 index 8b48fe72c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_150__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - def f(): - pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 2 - _mecha_var3 = 3 - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, thing=_mecha_var3) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=35, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_151__0.txt b/packages/mecha/tests/snapshots/bolt__parse_151__0.txt deleted file mode 100644 index 9c24045ab..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_151__0.txt +++ /dev/null @@ -1,73 +0,0 @@ -def f(): - pass -f(1, 2, **{"thing": 3}) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=42, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'pass' - arguments: - - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=41, lineno=3, colno=24) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=41, lineno=3, colno=24) - value: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=19, lineno=3, colno=2) - value: 'f' - arguments: - - location: SourceLocation(pos=20, lineno=3, colno=3) - end_location: SourceLocation(pos=21, lineno=3, colno=4) - value: 1 - - location: SourceLocation(pos=23, lineno=3, colno=6) - end_location: SourceLocation(pos=24, lineno=3, colno=7) - value: 2 - - location: SourceLocation(pos=26, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=23) - type: 'dict' - value: - - location: SourceLocation(pos=28, lineno=3, colno=11) - end_location: SourceLocation(pos=40, lineno=3, colno=23) - items: - - location: SourceLocation(pos=29, lineno=3, colno=12) - end_location: SourceLocation(pos=39, lineno=3, colno=22) - key: - - location: SourceLocation(pos=29, lineno=3, colno=12) - end_location: SourceLocation(pos=36, lineno=3, colno=19) - value: 'thing' - value: - - location: SourceLocation(pos=38, lineno=3, colno=21) - end_location: SourceLocation(pos=39, lineno=3, colno=22) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_151__1.txt b/packages/mecha/tests/snapshots/bolt__parse_151__1.txt deleted file mode 100644 index d1a201631..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_151__1.txt +++ /dev/null @@ -1,24 +0,0 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - def f(): - pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 2 - _mecha_var3 = 'thing' - _mecha_var4 = 3 - _mecha_var5 = {_mecha_var3: _mecha_var4} - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, **_mecha_var5) -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) ---- -output = _mecha_var7 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=42, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_152__0.txt b/packages/mecha/tests/snapshots/bolt__parse_152__0.txt deleted file mode 100644 index b3019b589..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_152__0.txt +++ /dev/null @@ -1,73 +0,0 @@ -def f(): - pass -f(1, *[4], 2, thing=3) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'pass' - arguments: - - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=40, lineno=3, colno=23) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=40, lineno=3, colno=23) - value: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=19, lineno=3, colno=2) - value: 'f' - arguments: - - location: SourceLocation(pos=20, lineno=3, colno=3) - end_location: SourceLocation(pos=21, lineno=3, colno=4) - value: 1 - - location: SourceLocation(pos=23, lineno=3, colno=6) - end_location: SourceLocation(pos=27, lineno=3, colno=10) - type: 'list' - value: - - location: SourceLocation(pos=24, lineno=3, colno=7) - end_location: SourceLocation(pos=27, lineno=3, colno=10) - items: - - location: SourceLocation(pos=25, lineno=3, colno=8) - end_location: SourceLocation(pos=26, lineno=3, colno=9) - value: 4 - - location: SourceLocation(pos=29, lineno=3, colno=12) - end_location: SourceLocation(pos=30, lineno=3, colno=13) - value: 2 - - location: SourceLocation(pos=32, lineno=3, colno=15) - end_location: SourceLocation(pos=39, lineno=3, colno=22) - name: 'thing' - value: - - location: SourceLocation(pos=38, lineno=3, colno=21) - end_location: SourceLocation(pos=39, lineno=3, colno=22) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_152__1.txt b/packages/mecha/tests/snapshots/bolt__parse_152__1.txt deleted file mode 100644 index 2b1e101d1..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_152__1.txt +++ /dev/null @@ -1,24 +0,0 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - def f(): - pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 4 - _mecha_var3 = [_mecha_var2] - _mecha_var4 = 2 - _mecha_var5 = 3 - _mecha_var0 = _mecha_var0(_mecha_var1, *_mecha_var3, _mecha_var4, thing=_mecha_var5) -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) ---- -output = _mecha_var7 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_153__0.txt b/packages/mecha/tests/snapshots/bolt__parse_153__0.txt deleted file mode 100644 index 9ff670551..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_153__0.txt +++ /dev/null @@ -1,86 +0,0 @@ -def f(): - pass -f(1, *[4], 2, **{"thing": 3}) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=48, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'pass' - arguments: - - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=47, lineno=3, colno=30) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=47, lineno=3, colno=30) - value: - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=19, lineno=3, colno=2) - value: 'f' - arguments: - - location: SourceLocation(pos=20, lineno=3, colno=3) - end_location: SourceLocation(pos=21, lineno=3, colno=4) - value: 1 - - location: SourceLocation(pos=23, lineno=3, colno=6) - end_location: SourceLocation(pos=27, lineno=3, colno=10) - type: 'list' - value: - - location: SourceLocation(pos=24, lineno=3, colno=7) - end_location: SourceLocation(pos=27, lineno=3, colno=10) - items: - - location: SourceLocation(pos=25, lineno=3, colno=8) - end_location: SourceLocation(pos=26, lineno=3, colno=9) - value: 4 - - location: SourceLocation(pos=29, lineno=3, colno=12) - end_location: SourceLocation(pos=30, lineno=3, colno=13) - value: 2 - - location: SourceLocation(pos=32, lineno=3, colno=15) - end_location: SourceLocation(pos=46, lineno=3, colno=29) - type: 'dict' - value: - - location: SourceLocation(pos=34, lineno=3, colno=17) - end_location: SourceLocation(pos=46, lineno=3, colno=29) - items: - - location: SourceLocation(pos=35, lineno=3, colno=18) - end_location: SourceLocation(pos=45, lineno=3, colno=28) - key: - - location: SourceLocation(pos=35, lineno=3, colno=18) - end_location: SourceLocation(pos=42, lineno=3, colno=25) - value: 'thing' - value: - - location: SourceLocation(pos=44, lineno=3, colno=27) - end_location: SourceLocation(pos=45, lineno=3, colno=28) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_153__1.txt b/packages/mecha/tests/snapshots/bolt__parse_153__1.txt deleted file mode 100644 index 1ebbd0fb6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_153__1.txt +++ /dev/null @@ -1,26 +0,0 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: - def f(): - pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 4 - _mecha_var3 = [_mecha_var2] - _mecha_var4 = 2 - _mecha_var5 = 'thing' - _mecha_var6 = 3 - _mecha_var7 = {_mecha_var5: _mecha_var6} - _mecha_var0 = _mecha_var0(_mecha_var1, *_mecha_var3, _mecha_var4, **_mecha_var7) -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) ---- -output = _mecha_var9 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=48, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_154__0.txt b/packages/mecha/tests/snapshots/bolt__parse_154__0.txt deleted file mode 100644 index 4b49a4993..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_154__0.txt +++ /dev/null @@ -1,24 +0,0 @@ -[*"abc"] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - items: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - type: 'list' - value: - - location: SourceLocation(pos=2, lineno=1, colno=3) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'abc' diff --git a/packages/mecha/tests/snapshots/bolt__parse_154__1.txt b/packages/mecha/tests/snapshots/bolt__parse_154__1.txt deleted file mode 100644 index 7970ac5c7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_154__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'abc' - _mecha_var1 = [*_mecha_var0] -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_155__0.txt b/packages/mecha/tests/snapshots/bolt__parse_155__0.txt deleted file mode 100644 index 6c81ec838..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_155__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Dict unpacking not allowed. -# line 1, column 2 -# 1 | [**"abc"] -# : ^^^^^^^ -[**"abc"] diff --git a/packages/mecha/tests/snapshots/bolt__parse_156__0.txt b/packages/mecha/tests/snapshots/bolt__parse_156__0.txt deleted file mode 100644 index e98056243..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_156__0.txt +++ /dev/null @@ -1,37 +0,0 @@ -{**{1: 1}} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - items: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - type: 'dict' - value: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - items: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - key: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 1 - value: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_156__1.txt b/packages/mecha/tests/snapshots/bolt__parse_156__1.txt deleted file mode 100644 index db993d543..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_156__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - _mecha_var1 = 1 - _mecha_var2 = {_mecha_var0: _mecha_var1} - _mecha_var3 = {**_mecha_var2} -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_157__0.txt b/packages/mecha/tests/snapshots/bolt__parse_157__0.txt deleted file mode 100644 index 427d92275..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_157__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR List unpacking not allowed. -# line 1, column 2 -# 1 | {*{1: 1}} -# : ^^^^^^^ -{*{1: 1}} diff --git a/packages/mecha/tests/snapshots/bolt__parse_158__0.txt b/packages/mecha/tests/snapshots/bolt__parse_158__0.txt deleted file mode 100644 index 401fcb9da..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_158__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 1 -# 1 | foo.bar = 1 -# : ^^^ -# Notes: -# - Expected assignment but got literal '.bar'. -foo.bar = 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_159__0.txt b/packages/mecha/tests/snapshots/bolt__parse_159__0.txt deleted file mode 100644 index 2335ef90f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_159__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 1 -# 1 | foo().bar = 1 -# : ^^^ -# Notes: -# - Expected assignment but got literal '().bar'. -foo().bar = 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_15__0.txt b/packages/mecha/tests/snapshots/bolt__parse_15__0.txt deleted file mode 100644 index 313c11193..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_15__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -16 // 5 % 7 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - operator: '%' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '//' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 16 - right: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 5 - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 7 diff --git a/packages/mecha/tests/snapshots/bolt__parse_15__1.txt b/packages/mecha/tests/snapshots/bolt__parse_15__1.txt deleted file mode 100644 index 93ed1347a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_15__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 16 - _mecha_var1 = 5 - _mecha_var0 = _mecha_var0 // _mecha_var1 - _mecha_var2 = 7 - _mecha_var0 = _mecha_var0 % _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_160__0.txt b/packages/mecha/tests/snapshots/bolt__parse_160__0.txt deleted file mode 100644 index 81fbe00dd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_160__0.txt +++ /dev/null @@ -1,47 +0,0 @@ -def f(): - f.data = {} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - operator: '=' - target: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=19, lineno=2, colno=11) - name: 'data' - value: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=14, lineno=2, colno=6) - value: 'f' - value: - - location: SourceLocation(pos=22, lineno=2, colno=14) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - items: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_160__1.txt b/packages/mecha/tests/snapshots/bolt__parse_160__1.txt deleted file mode 100644 index dc1bc0ceb..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_160__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1, 6], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - def f(): - _mecha_var0 = {} - _mecha_var1 = f - _mecha_var1.data = _mecha_var0 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_161__0.txt b/packages/mecha/tests/snapshots/bolt__parse_161__0.txt deleted file mode 100644 index d9981d327..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_161__0.txt +++ /dev/null @@ -1,95 +0,0 @@ -d = {} -d[1] = {} -d[1][2] = "foo" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'd' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - items: - - - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=10) - operator: '=' - target: - - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=5) - value: - - location: SourceLocation(pos=7, lineno=2, colno=1) - end_location: SourceLocation(pos=8, lineno=2, colno=2) - value: 'd' - arguments: - - location: SourceLocation(pos=9, lineno=2, colno=3) - end_location: SourceLocation(pos=10, lineno=2, colno=4) - value: 1 - value: - - location: SourceLocation(pos=14, lineno=2, colno=8) - end_location: SourceLocation(pos=16, lineno=2, colno=10) - items: - - - location: SourceLocation(pos=17, lineno=3, colno=1) - end_location: SourceLocation(pos=32, lineno=3, colno=16) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=17, lineno=3, colno=1) - end_location: SourceLocation(pos=32, lineno=3, colno=16) - operator: '=' - target: - - location: SourceLocation(pos=17, lineno=3, colno=1) - end_location: SourceLocation(pos=24, lineno=3, colno=8) - value: - - location: SourceLocation(pos=17, lineno=3, colno=1) - end_location: SourceLocation(pos=21, lineno=3, colno=5) - value: - - location: SourceLocation(pos=17, lineno=3, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=2) - value: 'd' - arguments: - - location: SourceLocation(pos=19, lineno=3, colno=3) - end_location: SourceLocation(pos=20, lineno=3, colno=4) - value: 1 - arguments: - - location: SourceLocation(pos=22, lineno=3, colno=6) - end_location: SourceLocation(pos=23, lineno=3, colno=7) - value: 2 - value: - - location: SourceLocation(pos=27, lineno=3, colno=11) - end_location: SourceLocation(pos=32, lineno=3, colno=16) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_161__1.txt b/packages/mecha/tests/snapshots/bolt__parse_161__1.txt deleted file mode 100644 index d23ae66aa..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_161__1.txt +++ /dev/null @@ -1,28 +0,0 @@ -_mecha_lineno = [1, 7, 12], [1, 2, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: - _mecha_var0 = {} - d = _mecha_var0 - _mecha_var1 = {} - _mecha_var2 = d - _mecha_var3 = 1 - _mecha_var2[_mecha_var3] = _mecha_var1 - _mecha_var4 = 'foo' - _mecha_var5 = d - _mecha_var6 = 1 - _mecha_var5 = _mecha_var5[_mecha_var6] - _mecha_var7 = 2 - _mecha_var5[_mecha_var7] = _mecha_var4 -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) ---- -output = _mecha_var9 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=4, colno=1) - commands: - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_162__0.txt b/packages/mecha/tests/snapshots/bolt__parse_162__0.txt deleted file mode 100644 index b1c403e56..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_162__0.txt +++ /dev/null @@ -1,64 +0,0 @@ -d = {foo: 1} -d.foo += 1 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'd' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - items: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - key: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 'foo' - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 1 - - location: SourceLocation(pos=13, lineno=2, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=13, lineno=2, colno=1) - end_location: SourceLocation(pos=23, lineno=2, colno=11) - operator: '+=' - target: - - location: SourceLocation(pos=13, lineno=2, colno=1) - end_location: SourceLocation(pos=18, lineno=2, colno=6) - name: 'foo' - value: - - location: SourceLocation(pos=13, lineno=2, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=2) - value: 'd' - value: - - location: SourceLocation(pos=22, lineno=2, colno=10) - end_location: SourceLocation(pos=23, lineno=2, colno=11) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_162__1.txt b/packages/mecha/tests/snapshots/bolt__parse_162__1.txt deleted file mode 100644 index 227aa1ac1..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_162__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1, 10], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 'foo' - _mecha_var1 = 1 - _mecha_var2 = {_mecha_var0: _mecha_var1} - d = _mecha_var2 - _mecha_var3 = 1 - _mecha_var4 = d - _mecha_var4.foo += _mecha_var3 -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_163__0.txt b/packages/mecha/tests/snapshots/bolt__parse_163__0.txt deleted file mode 100644 index 510c7204b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_163__0.txt +++ /dev/null @@ -1,19 +0,0 @@ -scoreboard objectives setdisplay list some_score_name ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=53, lineno=1, colno=54) - identifier: 'scoreboard:objectives:setdisplay:slot:objective' - arguments: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=37, lineno=1, colno=38) - value: 'list' - - location: SourceLocation(pos=38, lineno=1, colno=39) - end_location: SourceLocation(pos=53, lineno=1, colno=54) - value: 'some_score_name' diff --git a/packages/mecha/tests/snapshots/bolt__parse_163__1.txt b/packages/mecha/tests/snapshots/bolt__parse_163__1.txt deleted file mode 100644 index b7d106222..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_163__1.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Nothing ---- -output = None ---- diff --git a/packages/mecha/tests/snapshots/bolt__parse_164__0.txt b/packages/mecha/tests/snapshots/bolt__parse_164__0.txt deleted file mode 100644 index bdc9b2e4c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_164__0.txt +++ /dev/null @@ -1,51 +0,0 @@ -color = "red" -scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=87, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'color' - rebind: False - value: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'red' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=86, lineno=2, colno=73) - identifier: 'scoreboard:objectives:setdisplay:slot:objective' - arguments: - - location: SourceLocation(pos=47, lineno=2, colno=34) - end_location: SourceLocation(pos=70, lineno=2, colno=57) - prefix: None - converter: 'scoreboard_slot' - value: - - location: SourceLocation(pos=47, lineno=2, colno=34) - end_location: SourceLocation(pos=70, lineno=2, colno=57) - fmt: 'sidebar.team.{}' - values: - - location: SourceLocation(pos=63, lineno=2, colno=50) - end_location: SourceLocation(pos=68, lineno=2, colno=55) - value: 'color' - - location: SourceLocation(pos=71, lineno=2, colno=58) - end_location: SourceLocation(pos=86, lineno=2, colno=73) - value: 'some_score_name' diff --git a/packages/mecha/tests/snapshots/bolt__parse_164__1.txt b/packages/mecha/tests/snapshots/bolt__parse_164__1.txt deleted file mode 100644 index bda2e02dc..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_164__1.txt +++ /dev/null @@ -1,43 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_scoreboard_slot = _mecha_runtime.helpers['interpolate_scoreboard_slot'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'red' - color = _mecha_var0 - _mecha_var1 = color - _mecha_var2 = 'sidebar.team.{}'.format(_mecha_var1) - _mecha_var2 = _mecha_helper_interpolate_scoreboard_slot(_mecha_var2, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var2, _mecha_refs[1]]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=47, lineno=2, colno=34) - end_location: SourceLocation(pos=70, lineno=2, colno=57) - prefix: None - converter: 'scoreboard_slot' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=71, lineno=2, colno=58) - end_location: SourceLocation(pos=86, lineno=2, colno=73) - value: 'some_score_name' -_mecha_refs[2] - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=86, lineno=2, colno=73) - identifier: 'scoreboard:objectives:setdisplay:slot:objective' - arguments: - - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=87, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_165__0.txt b/packages/mecha/tests/snapshots/bolt__parse_165__0.txt deleted file mode 100644 index 22ba42b24..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_165__0.txt +++ /dev/null @@ -1,46 +0,0 @@ -my_team = "sidebar.team.red" -scoreboard objectives setdisplay my_team some_score_name ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=86, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'my_team' - rebind: False - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=28, lineno=1, colno=29) - value: 'sidebar.team.red' - - location: SourceLocation(pos=29, lineno=2, colno=1) - end_location: SourceLocation(pos=85, lineno=2, colno=57) - identifier: 'scoreboard:objectives:setdisplay:slot:objective' - arguments: - - location: SourceLocation(pos=62, lineno=2, colno=34) - end_location: SourceLocation(pos=69, lineno=2, colno=41) - prefix: None - converter: 'scoreboard_slot' - value: - - location: SourceLocation(pos=62, lineno=2, colno=34) - end_location: SourceLocation(pos=69, lineno=2, colno=41) - value: 'my_team' - - location: SourceLocation(pos=70, lineno=2, colno=42) - end_location: SourceLocation(pos=85, lineno=2, colno=57) - value: 'some_score_name' diff --git a/packages/mecha/tests/snapshots/bolt__parse_165__1.txt b/packages/mecha/tests/snapshots/bolt__parse_165__1.txt deleted file mode 100644 index 89bada7ca..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_165__1.txt +++ /dev/null @@ -1,42 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_scoreboard_slot = _mecha_runtime.helpers['interpolate_scoreboard_slot'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'sidebar.team.red' - my_team = _mecha_var0 - _mecha_var1 = my_team - _mecha_var1 = _mecha_helper_interpolate_scoreboard_slot(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var1, _mecha_refs[1]]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=62, lineno=2, colno=34) - end_location: SourceLocation(pos=69, lineno=2, colno=41) - prefix: None - converter: 'scoreboard_slot' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=70, lineno=2, colno=42) - end_location: SourceLocation(pos=85, lineno=2, colno=57) - value: 'some_score_name' -_mecha_refs[2] - - location: SourceLocation(pos=29, lineno=2, colno=1) - end_location: SourceLocation(pos=85, lineno=2, colno=57) - identifier: 'scoreboard:objectives:setdisplay:slot:objective' - arguments: - - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=86, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_166__0.txt b/packages/mecha/tests/snapshots/bolt__parse_166__0.txt deleted file mode 100644 index 0278af8fe..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_166__0.txt +++ /dev/null @@ -1,51 +0,0 @@ -item replace block ~ ~2 ~ container.26 with minecraft:spruce_sapling 4 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=71, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=70, lineno=1, colno=71) - identifier: 'item:replace:block:pos:slot:with:item:count' - arguments: - - location: SourceLocation(pos=19, lineno=1, colno=20) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - x: - - location: SourceLocation(pos=19, lineno=1, colno=20) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - type: 'relative' - value: 2 - z: - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - type: 'relative' - value: 0 - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: 'container.26' - - location: SourceLocation(pos=44, lineno=1, colno=45) - end_location: SourceLocation(pos=68, lineno=1, colno=69) - identifier: - - location: SourceLocation(pos=44, lineno=1, colno=45) - end_location: SourceLocation(pos=68, lineno=1, colno=69) - is_tag: False - namespace: 'minecraft' - path: 'spruce_sapling' - data_tags: None - - location: SourceLocation(pos=69, lineno=1, colno=70) - end_location: SourceLocation(pos=70, lineno=1, colno=71) - value: 4 diff --git a/packages/mecha/tests/snapshots/bolt__parse_166__1.txt b/packages/mecha/tests/snapshots/bolt__parse_166__1.txt deleted file mode 100644 index b7d106222..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_166__1.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Nothing ---- -output = None ---- diff --git a/packages/mecha/tests/snapshots/bolt__parse_167__0.txt b/packages/mecha/tests/snapshots/bolt__parse_167__0.txt deleted file mode 100644 index 022677e76..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_167__0.txt +++ /dev/null @@ -1,52 +0,0 @@ -weapon = "thing" -item replace entity @s weapon.offhand from entity @s weapon.mainhand ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=86, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'weapon' - rebind: False - value: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'thing' - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=85, lineno=2, colno=69) - identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' - arguments: - - location: SourceLocation(pos=37, lineno=2, colno=21) - end_location: SourceLocation(pos=39, lineno=2, colno=23) - variable: 's' - arguments: - - - location: SourceLocation(pos=40, lineno=2, colno=24) - end_location: SourceLocation(pos=54, lineno=2, colno=38) - value: 'weapon.offhand' - - location: SourceLocation(pos=67, lineno=2, colno=51) - end_location: SourceLocation(pos=69, lineno=2, colno=53) - variable: 's' - arguments: - - - location: SourceLocation(pos=70, lineno=2, colno=54) - end_location: SourceLocation(pos=85, lineno=2, colno=69) - value: 'weapon.mainhand' diff --git a/packages/mecha/tests/snapshots/bolt__parse_167__1.txt b/packages/mecha/tests/snapshots/bolt__parse_167__1.txt deleted file mode 100644 index 03b6eae7b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_167__1.txt +++ /dev/null @@ -1,28 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'thing' - weapon = _mecha_var0 - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=17, lineno=2, colno=1) - end_location: SourceLocation(pos=85, lineno=2, colno=69) - identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' - arguments: - - - - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=86, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_168__0.txt b/packages/mecha/tests/snapshots/bolt__parse_168__0.txt deleted file mode 100644 index e7512709c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_168__0.txt +++ /dev/null @@ -1,100 +0,0 @@ -my_weapon = {offhand: "weapon.offhand", mainhand: "weapon.mainhand"} -item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=144, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=68, lineno=1, colno=69) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=68, lineno=1, colno=69) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 'my_weapon' - rebind: False - value: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=68, lineno=1, colno=69) - items: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - key: - - location: SourceLocation(pos=13, lineno=1, colno=14) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'offhand' - value: - - location: SourceLocation(pos=22, lineno=1, colno=23) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: 'weapon.offhand' - - location: SourceLocation(pos=40, lineno=1, colno=41) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - key: - - location: SourceLocation(pos=40, lineno=1, colno=41) - end_location: SourceLocation(pos=48, lineno=1, colno=49) - value: 'mainhand' - value: - - location: SourceLocation(pos=50, lineno=1, colno=51) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - value: 'weapon.mainhand' - - location: SourceLocation(pos=69, lineno=2, colno=1) - end_location: SourceLocation(pos=143, lineno=2, colno=75) - identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' - arguments: - - location: SourceLocation(pos=89, lineno=2, colno=21) - end_location: SourceLocation(pos=91, lineno=2, colno=23) - variable: 's' - arguments: - - - location: SourceLocation(pos=92, lineno=2, colno=24) - end_location: SourceLocation(pos=109, lineno=2, colno=41) - prefix: None - converter: 'item_slot' - value: - - location: SourceLocation(pos=92, lineno=2, colno=24) - end_location: SourceLocation(pos=109, lineno=2, colno=41) - name: 'offhand' - value: - - location: SourceLocation(pos=92, lineno=2, colno=24) - end_location: SourceLocation(pos=101, lineno=2, colno=33) - value: 'my_weapon' - - location: SourceLocation(pos=122, lineno=2, colno=54) - end_location: SourceLocation(pos=124, lineno=2, colno=56) - variable: 's' - arguments: - - - location: SourceLocation(pos=125, lineno=2, colno=57) - end_location: SourceLocation(pos=143, lineno=2, colno=75) - prefix: None - converter: 'item_slot' - value: - - location: SourceLocation(pos=125, lineno=2, colno=57) - end_location: SourceLocation(pos=143, lineno=2, colno=75) - name: 'mainhand' - value: - - location: SourceLocation(pos=125, lineno=2, colno=57) - end_location: SourceLocation(pos=134, lineno=2, colno=66) - value: 'my_weapon' diff --git a/packages/mecha/tests/snapshots/bolt__parse_168__1.txt b/packages/mecha/tests/snapshots/bolt__parse_168__1.txt deleted file mode 100644 index 0eb71565d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_168__1.txt +++ /dev/null @@ -1,70 +0,0 @@ -_mecha_lineno = [1, 13], [1, 2] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_item_slot = _mecha_runtime.helpers['interpolate_item_slot'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = 'offhand' - _mecha_var1 = 'weapon.offhand' - _mecha_var2 = 'mainhand' - _mecha_var3 = 'weapon.mainhand' - _mecha_var4 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3} - my_weapon = _mecha_var4 - _mecha_var5 = my_weapon - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'offhand') - _mecha_var5 = _mecha_helper_interpolate_item_slot(_mecha_var5, _mecha_refs[0]) - _mecha_var6 = my_weapon - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'mainhand') - _mecha_var6 = _mecha_helper_interpolate_item_slot(_mecha_var6, _mecha_refs[2]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var5, _mecha_refs[3], _mecha_var6]))) -_mecha_var8 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var7)) ---- -output = _mecha_var8 ---- -_mecha_refs[0] - - location: SourceLocation(pos=92, lineno=2, colno=24) - end_location: SourceLocation(pos=109, lineno=2, colno=41) - prefix: None - converter: 'item_slot' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=89, lineno=2, colno=21) - end_location: SourceLocation(pos=91, lineno=2, colno=23) - variable: 's' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=125, lineno=2, colno=57) - end_location: SourceLocation(pos=143, lineno=2, colno=75) - prefix: None - converter: 'item_slot' - value: - -_mecha_refs[3] - - location: SourceLocation(pos=122, lineno=2, colno=54) - end_location: SourceLocation(pos=124, lineno=2, colno=56) - variable: 's' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=69, lineno=2, colno=1) - end_location: SourceLocation(pos=143, lineno=2, colno=75) - identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' - arguments: - - - - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=144, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_169__0.txt b/packages/mecha/tests/snapshots/bolt__parse_169__0.txt deleted file mode 100644 index 745400331..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_169__0.txt +++ /dev/null @@ -1,75 +0,0 @@ -numbers = list(range(12)) -say numbers[3:] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=42, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'numbers' - rebind: False - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'list' - arguments: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'range' - arguments: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: 12 - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - value: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=37, lineno=2, colno=12) - value: 'numbers' - arguments: - - location: SourceLocation(pos=38, lineno=2, colno=13) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - start: - - location: SourceLocation(pos=38, lineno=2, colno=13) - end_location: SourceLocation(pos=39, lineno=2, colno=14) - value: 3 - stop: None - step: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_169__1.txt b/packages/mecha/tests/snapshots/bolt__parse_169__1.txt deleted file mode 100644 index 42dd1f1df..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_169__1.txt +++ /dev/null @@ -1,42 +0,0 @@ -_mecha_lineno = [1, 12], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = list - _mecha_var1 = range - _mecha_var2 = 12 - _mecha_var1 = _mecha_var1(_mecha_var2) - _mecha_var0 = _mecha_var0(_mecha_var1) - numbers = _mecha_var0 - _mecha_var3 = numbers - _mecha_var4 = 3 - _mecha_var3 = _mecha_var3[_mecha_var4:] - _mecha_var3 = _mecha_helper_interpolate_message(_mecha_var3, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var3]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - prefix: None - converter: 'message' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=42, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_16__0.txt b/packages/mecha/tests/snapshots/bolt__parse_16__0.txt deleted file mode 100644 index 62f19a240..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_16__0.txt +++ /dev/null @@ -1,155 +0,0 @@ --2 ** 3 + +4 * 5 // 6 / 7 % 9 + 10 - 11 << 12 >> 13 & 14 ^ 15 | 16 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=66, lineno=1, colno=67) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=66, lineno=1, colno=67) - operator: '|' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=61, lineno=1, colno=62) - operator: '^' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=56, lineno=1, colno=57) - operator: '&' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - operator: '>>' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=45, lineno=1, colno=46) - operator: '<<' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '-' - value: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '**' - left: - - location: SourceLocation(pos=1, lineno=1, colno=2) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: 2 - right: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 3 - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - operator: '%' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: '/' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - operator: '//' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - operator: '*' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '+' - value: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 4 - right: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 5 - right: - - location: SourceLocation(pos=20, lineno=1, colno=21) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: 6 - right: - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 7 - right: - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=29, lineno=1, colno=30) - value: 9 - right: - - location: SourceLocation(pos=32, lineno=1, colno=33) - end_location: SourceLocation(pos=34, lineno=1, colno=35) - value: 10 - right: - - location: SourceLocation(pos=37, lineno=1, colno=38) - end_location: SourceLocation(pos=39, lineno=1, colno=40) - value: 11 - right: - - location: SourceLocation(pos=43, lineno=1, colno=44) - end_location: SourceLocation(pos=45, lineno=1, colno=46) - value: 12 - right: - - location: SourceLocation(pos=49, lineno=1, colno=50) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - value: 13 - right: - - location: SourceLocation(pos=54, lineno=1, colno=55) - end_location: SourceLocation(pos=56, lineno=1, colno=57) - value: 14 - right: - - location: SourceLocation(pos=59, lineno=1, colno=60) - end_location: SourceLocation(pos=61, lineno=1, colno=62) - value: 15 - right: - - location: SourceLocation(pos=64, lineno=1, colno=65) - end_location: SourceLocation(pos=66, lineno=1, colno=67) - value: 16 diff --git a/packages/mecha/tests/snapshots/bolt__parse_16__1.txt b/packages/mecha/tests/snapshots/bolt__parse_16__1.txt deleted file mode 100644 index a8770c60b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_16__1.txt +++ /dev/null @@ -1,43 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var14: - _mecha_var0 = 2 - _mecha_var1 = 3 - _mecha_var0 = _mecha_var0 ** _mecha_var1 - _mecha_var0 = - _mecha_var0 - _mecha_var2 = 4 - _mecha_var2 = + _mecha_var2 - _mecha_var3 = 5 - _mecha_var2 = _mecha_var2 * _mecha_var3 - _mecha_var4 = 6 - _mecha_var2 = _mecha_var2 // _mecha_var4 - _mecha_var5 = 7 - _mecha_var2 = _mecha_var2 / _mecha_var5 - _mecha_var6 = 9 - _mecha_var2 = _mecha_var2 % _mecha_var6 - _mecha_var0 = _mecha_var0 + _mecha_var2 - _mecha_var7 = 10 - _mecha_var0 = _mecha_var0 + _mecha_var7 - _mecha_var8 = 11 - _mecha_var0 = _mecha_var0 - _mecha_var8 - _mecha_var9 = 12 - _mecha_var0 = _mecha_var0 << _mecha_var9 - _mecha_var10 = 13 - _mecha_var0 = _mecha_var0 >> _mecha_var10 - _mecha_var11 = 14 - _mecha_var0 = _mecha_var0 & _mecha_var11 - _mecha_var12 = 15 - _mecha_var0 = _mecha_var0 ^ _mecha_var12 - _mecha_var13 = 16 - _mecha_var0 = _mecha_var0 | _mecha_var13 -_mecha_var15 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var14)) ---- -output = _mecha_var15 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=67, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_170__0.txt b/packages/mecha/tests/snapshots/bolt__parse_170__0.txt deleted file mode 100644 index c98ba5760..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_170__0.txt +++ /dev/null @@ -1,80 +0,0 @@ -numbers = list(range(12)) -numbers[3:] = [] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=43, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'numbers' - rebind: False - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'list' - arguments: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'range' - arguments: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: 12 - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=42, lineno=2, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=42, lineno=2, colno=17) - operator: '=' - target: - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=12) - value: - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=33, lineno=2, colno=8) - value: 'numbers' - arguments: - - location: SourceLocation(pos=34, lineno=2, colno=9) - end_location: SourceLocation(pos=36, lineno=2, colno=11) - start: - - location: SourceLocation(pos=34, lineno=2, colno=9) - end_location: SourceLocation(pos=35, lineno=2, colno=10) - value: 3 - stop: None - step: None - value: - - location: SourceLocation(pos=40, lineno=2, colno=15) - end_location: SourceLocation(pos=42, lineno=2, colno=17) - items: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_170__1.txt b/packages/mecha/tests/snapshots/bolt__parse_170__1.txt deleted file mode 100644 index 43206102d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_170__1.txt +++ /dev/null @@ -1,25 +0,0 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - _mecha_var0 = list - _mecha_var1 = range - _mecha_var2 = 12 - _mecha_var1 = _mecha_var1(_mecha_var2) - _mecha_var0 = _mecha_var0(_mecha_var1) - numbers = _mecha_var0 - _mecha_var3 = [] - _mecha_var4 = numbers - _mecha_var5 = 3 - _mecha_var4[_mecha_var5:] = _mecha_var3 -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) ---- -output = _mecha_var7 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=43, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_171__0.txt b/packages/mecha/tests/snapshots/bolt__parse_171__0.txt deleted file mode 100644 index 4e3deec3c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_171__0.txt +++ /dev/null @@ -1,69 +0,0 @@ -numbers = list(range(12)) -del numbers[3:] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=42, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'numbers' - rebind: False - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'list' - arguments: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=24, lineno=1, colno=25) - value: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: 'range' - arguments: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: 12 - - location: SourceLocation(pos=26, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - identifier: 'del:target' - arguments: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=41, lineno=2, colno=16) - value: - - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=37, lineno=2, colno=12) - value: 'numbers' - arguments: - - location: SourceLocation(pos=38, lineno=2, colno=13) - end_location: SourceLocation(pos=40, lineno=2, colno=15) - start: - - location: SourceLocation(pos=38, lineno=2, colno=13) - end_location: SourceLocation(pos=39, lineno=2, colno=14) - value: 3 - stop: None - step: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_171__1.txt b/packages/mecha/tests/snapshots/bolt__parse_171__1.txt deleted file mode 100644 index b5a9924e9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_171__1.txt +++ /dev/null @@ -1,24 +0,0 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = list - _mecha_var1 = range - _mecha_var2 = 12 - _mecha_var1 = _mecha_var1(_mecha_var2) - _mecha_var0 = _mecha_var0(_mecha_var1) - numbers = _mecha_var0 - _mecha_var3 = numbers - _mecha_var4 = 3 - del _mecha_var3[_mecha_var4:] -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=42, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_172__0.txt b/packages/mecha/tests/snapshots/bolt__parse_172__0.txt deleted file mode 100644 index 5121f6321..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_172__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Can only delete variables, attributes, or subscripted items. -# line 1, column 5 -# 1 | del 1 + 1 -# : ^^^^^ -del 1 + 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_173__0.txt b/packages/mecha/tests/snapshots/bolt__parse_173__0.txt deleted file mode 100644 index 8aa6a1b8d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_173__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Expected non-empty block. -# line 1, column 26 -# 1 | execute function demo:foo: -# : ^ -execute function demo:foo: diff --git a/packages/mecha/tests/snapshots/bolt__parse_174__0.txt b/packages/mecha/tests/snapshots/bolt__parse_174__0.txt deleted file mode 100644 index 98ec56252..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_174__0.txt +++ /dev/null @@ -1,76 +0,0 @@ -mykey = "aaa" -if data storage some:path/to/storage f'some.{mykey}.path{{my: "compound"}}' run say hi ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'mykey' - rebind: False - value: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'aaa' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'execute:if:data:storage:source:path:subcommand' - arguments: - - location: SourceLocation(pos=30, lineno=2, colno=17) - end_location: SourceLocation(pos=50, lineno=2, colno=37) - is_tag: False - namespace: 'some' - path: 'path/to/storage' - - location: SourceLocation(pos=51, lineno=2, colno=38) - end_location: SourceLocation(pos=89, lineno=2, colno=76) - prefix: None - converter: 'nbt_path' - value: - - location: SourceLocation(pos=51, lineno=2, colno=38) - end_location: SourceLocation(pos=89, lineno=2, colno=76) - fmt: 'some.{}.path{{my: "compound"}}' - values: - - location: SourceLocation(pos=59, lineno=2, colno=46) - end_location: SourceLocation(pos=64, lineno=2, colno=51) - value: 'mykey' - - location: SourceLocation(pos=90, lineno=2, colno=77) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=94, lineno=2, colno=81) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=98, lineno=2, colno=85) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - fragments: - - location: SourceLocation(pos=98, lineno=2, colno=85) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - value: 'hi' diff --git a/packages/mecha/tests/snapshots/bolt__parse_174__1.txt b/packages/mecha/tests/snapshots/bolt__parse_174__1.txt deleted file mode 100644 index f2b0ecfa6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_174__1.txt +++ /dev/null @@ -1,60 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_nbt_path = _mecha_runtime.helpers['interpolate_nbt_path'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'aaa' - mykey = _mecha_var0 - _mecha_var1 = mykey - _mecha_var2 = 'some.{}.path{{my: "compound"}}'.format(_mecha_var1) - _mecha_var2 = _mecha_helper_interpolate_nbt_path(_mecha_var2, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var2, _mecha_refs[2]]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=51, lineno=2, colno=38) - end_location: SourceLocation(pos=89, lineno=2, colno=76) - prefix: None - converter: 'nbt_path' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=30, lineno=2, colno=17) - end_location: SourceLocation(pos=50, lineno=2, colno=37) - is_tag: False - namespace: 'some' - path: 'path/to/storage' -_mecha_refs[2] - - location: SourceLocation(pos=90, lineno=2, colno=77) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'execute:if:data:storage:source:path:subcommand' - arguments: - - - -_mecha_refs[4] - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=100, lineno=2, colno=87) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_175__0.txt b/packages/mecha/tests/snapshots/bolt__parse_175__0.txt deleted file mode 100644 index b5e196191..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_175__0.txt +++ /dev/null @@ -1,71 +0,0 @@ -mypath = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' -if data storage some:path/to/storage (mypath) run say hi ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=75, lineno=1, colno=76) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=75, lineno=1, colno=76) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'mypath' - rebind: False - value: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=75, lineno=1, colno=76) - value: 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' - - location: SourceLocation(pos=76, lineno=2, colno=1) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=76, lineno=2, colno=1) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'execute:if:data:storage:source:path:subcommand' - arguments: - - location: SourceLocation(pos=92, lineno=2, colno=17) - end_location: SourceLocation(pos=112, lineno=2, colno=37) - is_tag: False - namespace: 'some' - path: 'path/to/storage' - - location: SourceLocation(pos=114, lineno=2, colno=39) - end_location: SourceLocation(pos=120, lineno=2, colno=45) - prefix: None - converter: 'nbt_path' - value: - - location: SourceLocation(pos=114, lineno=2, colno=39) - end_location: SourceLocation(pos=120, lineno=2, colno=45) - value: 'mypath' - - location: SourceLocation(pos=122, lineno=2, colno=47) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=126, lineno=2, colno=51) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=130, lineno=2, colno=55) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - fragments: - - location: SourceLocation(pos=130, lineno=2, colno=55) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - value: 'hi' diff --git a/packages/mecha/tests/snapshots/bolt__parse_175__1.txt b/packages/mecha/tests/snapshots/bolt__parse_175__1.txt deleted file mode 100644 index 141b841e1..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_175__1.txt +++ /dev/null @@ -1,59 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_nbt_path = _mecha_runtime.helpers['interpolate_nbt_path'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' - mypath = _mecha_var0 - _mecha_var1 = mypath - _mecha_var1 = _mecha_helper_interpolate_nbt_path(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var1, _mecha_refs[2]]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=114, lineno=2, colno=39) - end_location: SourceLocation(pos=120, lineno=2, colno=45) - prefix: None - converter: 'nbt_path' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=92, lineno=2, colno=17) - end_location: SourceLocation(pos=112, lineno=2, colno=37) - is_tag: False - namespace: 'some' - path: 'path/to/storage' -_mecha_refs[2] - - location: SourceLocation(pos=122, lineno=2, colno=47) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=76, lineno=2, colno=1) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'execute:if:data:storage:source:path:subcommand' - arguments: - - - -_mecha_refs[4] - - location: SourceLocation(pos=76, lineno=2, colno=1) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=132, lineno=2, colno=57) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_176__0.txt b/packages/mecha/tests/snapshots/bolt__parse_176__0.txt deleted file mode 100644 index 1cb31174a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_176__0.txt +++ /dev/null @@ -1,78 +0,0 @@ -entity_type = "creeper" -at @e[type=entity_type] summon lightning_bolt ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 'entity_type' - rebind: False - value: - - location: SourceLocation(pos=14, lineno=1, colno=15) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: 'creeper' - - location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'execute:at:targets:subcommand' - arguments: - - location: SourceLocation(pos=27, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=24) - variable: 'e' - arguments: - - location: SourceLocation(pos=30, lineno=2, colno=7) - end_location: SourceLocation(pos=46, lineno=2, colno=23) - inverted: False - key: - - location: SourceLocation(pos=30, lineno=2, colno=7) - end_location: SourceLocation(pos=34, lineno=2, colno=11) - value: 'type' - value: - - location: SourceLocation(pos=35, lineno=2, colno=12) - end_location: SourceLocation(pos=46, lineno=2, colno=23) - prefix: None - converter: 'resource_location' - value: - - location: SourceLocation(pos=35, lineno=2, colno=12) - end_location: SourceLocation(pos=46, lineno=2, colno=23) - value: 'entity_type' - - location: SourceLocation(pos=48, lineno=2, colno=25) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=48, lineno=2, colno=25) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'summon:entity' - arguments: - - location: SourceLocation(pos=55, lineno=2, colno=32) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - is_tag: False - namespace: None - path: 'lightning_bolt' diff --git a/packages/mecha/tests/snapshots/bolt__parse_176__1.txt b/packages/mecha/tests/snapshots/bolt__parse_176__1.txt deleted file mode 100644 index 21be5bfe3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_176__1.txt +++ /dev/null @@ -1,67 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'creeper' - entity_type = _mecha_var0 - _mecha_var1 = entity_type - _mecha_var1 = _mecha_helper_interpolate_resource_location(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_var1)])), _mecha_refs[3]]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=35, lineno=2, colno=12) - end_location: SourceLocation(pos=46, lineno=2, colno=23) - prefix: None - converter: 'resource_location' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=30, lineno=2, colno=7) - end_location: SourceLocation(pos=46, lineno=2, colno=23) - inverted: False - key: - - value: - -_mecha_refs[2] - - location: SourceLocation(pos=27, lineno=2, colno=4) - end_location: SourceLocation(pos=47, lineno=2, colno=24) - variable: 'e' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=48, lineno=2, colno=25) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'execute:at:targets:subcommand' - arguments: - - -_mecha_refs[5] - - location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_177__0.txt b/packages/mecha/tests/snapshots/bolt__parse_177__0.txt deleted file mode 100644 index 2ba9b9985..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_177__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected colon but reached end of file. -# line 1, column 25 -# 1 | append function demo:foo -append function demo:foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_178__0.txt b/packages/mecha/tests/snapshots/bolt__parse_178__0.txt deleted file mode 100644 index 7ecab4a6a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_178__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected identifier or resource_location but got newline '\n'. -# line 1, column 13 -# 1 | function_tag -function_tag diff --git a/packages/mecha/tests/snapshots/bolt__parse_179__0.txt b/packages/mecha/tests/snapshots/bolt__parse_179__0.txt deleted file mode 100644 index 76745c41a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_179__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected identifier or resource_location but got newline '\n'. -# line 1, column 19 -# 1 | merge function_tag -merge function_tag diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__0.txt b/packages/mecha/tests/snapshots/bolt__parse_17__0.txt deleted file mode 100644 index 5fae3f463..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_17__0.txt +++ /dev/null @@ -1,240 +0,0 @@ -False or True and "hello" or not "foo" == "bar" or 1 != 2 and 1 < 2 and 2 <= 3 and 5 > 4 and 6 >= 5 and 1 in 1 and 2 not in 2 and 3 is 3 and 3 is not 3 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=152, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - operator: 'or' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - operator: 'or' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: 'or' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: False - right: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - operator: 'and' - left: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: True - right: - - location: SourceLocation(pos=18, lineno=1, colno=19) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 'hello' - right: - - location: SourceLocation(pos=29, lineno=1, colno=30) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - operator: 'not' - value: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - operator: '==' - left: - - location: SourceLocation(pos=33, lineno=1, colno=34) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: 'foo' - right: - - location: SourceLocation(pos=42, lineno=1, colno=43) - end_location: SourceLocation(pos=47, lineno=1, colno=48) - value: 'bar' - right: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=136, lineno=1, colno=137) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=125, lineno=1, colno=126) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=110, lineno=1, colno=111) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=99, lineno=1, colno=100) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=88, lineno=1, colno=89) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=78, lineno=1, colno=79) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - operator: 'and' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - operator: '!=' - left: - - location: SourceLocation(pos=51, lineno=1, colno=52) - end_location: SourceLocation(pos=52, lineno=1, colno=53) - value: 1 - right: - - location: SourceLocation(pos=56, lineno=1, colno=57) - end_location: SourceLocation(pos=57, lineno=1, colno=58) - value: 2 - right: - - location: SourceLocation(pos=62, lineno=1, colno=63) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - operator: '<' - left: - - location: SourceLocation(pos=62, lineno=1, colno=63) - end_location: SourceLocation(pos=63, lineno=1, colno=64) - value: 1 - right: - - location: SourceLocation(pos=66, lineno=1, colno=67) - end_location: SourceLocation(pos=67, lineno=1, colno=68) - value: 2 - right: - - location: SourceLocation(pos=72, lineno=1, colno=73) - end_location: SourceLocation(pos=78, lineno=1, colno=79) - operator: '<=' - left: - - location: SourceLocation(pos=72, lineno=1, colno=73) - end_location: SourceLocation(pos=73, lineno=1, colno=74) - value: 2 - right: - - location: SourceLocation(pos=77, lineno=1, colno=78) - end_location: SourceLocation(pos=78, lineno=1, colno=79) - value: 3 - right: - - location: SourceLocation(pos=83, lineno=1, colno=84) - end_location: SourceLocation(pos=88, lineno=1, colno=89) - operator: '>' - left: - - location: SourceLocation(pos=83, lineno=1, colno=84) - end_location: SourceLocation(pos=84, lineno=1, colno=85) - value: 5 - right: - - location: SourceLocation(pos=87, lineno=1, colno=88) - end_location: SourceLocation(pos=88, lineno=1, colno=89) - value: 4 - right: - - location: SourceLocation(pos=93, lineno=1, colno=94) - end_location: SourceLocation(pos=99, lineno=1, colno=100) - operator: '>=' - left: - - location: SourceLocation(pos=93, lineno=1, colno=94) - end_location: SourceLocation(pos=94, lineno=1, colno=95) - value: 6 - right: - - location: SourceLocation(pos=98, lineno=1, colno=99) - end_location: SourceLocation(pos=99, lineno=1, colno=100) - value: 5 - right: - - location: SourceLocation(pos=104, lineno=1, colno=105) - end_location: SourceLocation(pos=110, lineno=1, colno=111) - operator: 'in' - left: - - location: SourceLocation(pos=104, lineno=1, colno=105) - end_location: SourceLocation(pos=105, lineno=1, colno=106) - value: 1 - right: - - location: SourceLocation(pos=109, lineno=1, colno=110) - end_location: SourceLocation(pos=110, lineno=1, colno=111) - value: 1 - right: - - location: SourceLocation(pos=115, lineno=1, colno=116) - end_location: SourceLocation(pos=125, lineno=1, colno=126) - operator: 'not_in' - left: - - location: SourceLocation(pos=115, lineno=1, colno=116) - end_location: SourceLocation(pos=116, lineno=1, colno=117) - value: 2 - right: - - location: SourceLocation(pos=124, lineno=1, colno=125) - end_location: SourceLocation(pos=125, lineno=1, colno=126) - value: 2 - right: - - location: SourceLocation(pos=130, lineno=1, colno=131) - end_location: SourceLocation(pos=136, lineno=1, colno=137) - operator: 'is' - left: - - location: SourceLocation(pos=130, lineno=1, colno=131) - end_location: SourceLocation(pos=131, lineno=1, colno=132) - value: 3 - right: - - location: SourceLocation(pos=135, lineno=1, colno=136) - end_location: SourceLocation(pos=136, lineno=1, colno=137) - value: 3 - right: - - location: SourceLocation(pos=141, lineno=1, colno=142) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - operator: 'is_not' - left: - - location: SourceLocation(pos=141, lineno=1, colno=142) - end_location: SourceLocation(pos=142, lineno=1, colno=143) - value: 3 - right: - - location: SourceLocation(pos=150, lineno=1, colno=151) - end_location: SourceLocation(pos=151, lineno=1, colno=152) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt b/packages/mecha/tests/snapshots/bolt__parse_17__1.txt deleted file mode 100644 index 837eca3a9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_17__1.txt +++ /dev/null @@ -1,210 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] -_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var47: - _mecha_var0 = False - _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) - _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var2 is not None: - _mecha_var0 = _mecha_var2() - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = True - _mecha_var4 = _mecha_var3 - _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) - if _mecha_var5 is not None: - _mecha_var3 = _mecha_var5() - with _mecha_helper_branch(_mecha_var4) as _mecha_condition: - if _mecha_condition: - _mecha_var6 = 'hello' - if _mecha_var5 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) - _mecha_var3 = _mecha_var6 - if _mecha_rebind is not None: - _mecha_var3 = _mecha_rebind(_mecha_var3) - else: - _mecha_var3 = _mecha_var6 - if _mecha_var2 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var3 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) - else: - _mecha_var0 = _mecha_var3 - _mecha_var7 = _mecha_helper_operator_not(_mecha_var0) - _mecha_var8 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var8 is not None: - _mecha_var0 = _mecha_var8() - with _mecha_helper_branch(_mecha_var7) as _mecha_condition: - if _mecha_condition: - _mecha_var9 = 'foo' - _mecha_var10 = 'bar' - _mecha_var9 = _mecha_var9 == _mecha_var10 - _mecha_var9 = _mecha_helper_operator_not(_mecha_var9) - if _mecha_var8 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var9 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) - else: - _mecha_var0 = _mecha_var9 - _mecha_var11 = _mecha_helper_operator_not(_mecha_var0) - _mecha_var12 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var12 is not None: - _mecha_var0 = _mecha_var12() - with _mecha_helper_branch(_mecha_var11) as _mecha_condition: - if _mecha_condition: - _mecha_var13 = 1 - _mecha_var14 = 2 - _mecha_var13 = _mecha_var13 != _mecha_var14 - _mecha_var15 = _mecha_var13 - _mecha_var16 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var16 is not None: - _mecha_var13 = _mecha_var16() - with _mecha_helper_branch(_mecha_var15) as _mecha_condition: - if _mecha_condition: - _mecha_var17 = 1 - _mecha_var18 = 2 - _mecha_var17 = _mecha_var17 < _mecha_var18 - if _mecha_var16 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var17 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var17 - _mecha_var19 = _mecha_var13 - _mecha_var20 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var20 is not None: - _mecha_var13 = _mecha_var20() - with _mecha_helper_branch(_mecha_var19) as _mecha_condition: - if _mecha_condition: - _mecha_var21 = 2 - _mecha_var22 = 3 - _mecha_var21 = _mecha_var21 <= _mecha_var22 - if _mecha_var20 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var21 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var21 - _mecha_var23 = _mecha_var13 - _mecha_var24 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var24 is not None: - _mecha_var13 = _mecha_var24() - with _mecha_helper_branch(_mecha_var23) as _mecha_condition: - if _mecha_condition: - _mecha_var25 = 5 - _mecha_var26 = 4 - _mecha_var25 = _mecha_var25 > _mecha_var26 - if _mecha_var24 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var25 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var25 - _mecha_var27 = _mecha_var13 - _mecha_var28 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var28 is not None: - _mecha_var13 = _mecha_var28() - with _mecha_helper_branch(_mecha_var27) as _mecha_condition: - if _mecha_condition: - _mecha_var29 = 6 - _mecha_var30 = 5 - _mecha_var29 = _mecha_var29 >= _mecha_var30 - if _mecha_var28 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var29 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var29 - _mecha_var31 = _mecha_var13 - _mecha_var32 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var32 is not None: - _mecha_var13 = _mecha_var32() - with _mecha_helper_branch(_mecha_var31) as _mecha_condition: - if _mecha_condition: - _mecha_var33 = 1 - _mecha_var34 = 1 - _mecha_var33 = _mecha_helper_operator_in(_mecha_var33, _mecha_var34) - if _mecha_var32 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var33 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var33 - _mecha_var35 = _mecha_var13 - _mecha_var36 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var36 is not None: - _mecha_var13 = _mecha_var36() - with _mecha_helper_branch(_mecha_var35) as _mecha_condition: - if _mecha_condition: - _mecha_var37 = 2 - _mecha_var38 = 2 - _mecha_var37 = _mecha_helper_operator_not_in(_mecha_var37, _mecha_var38) - if _mecha_var36 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var37 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var37 - _mecha_var39 = _mecha_var13 - _mecha_var40 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var40 is not None: - _mecha_var13 = _mecha_var40() - with _mecha_helper_branch(_mecha_var39) as _mecha_condition: - if _mecha_condition: - _mecha_var41 = 3 - _mecha_var42 = 3 - _mecha_var41 = _mecha_var41 is _mecha_var42 - if _mecha_var40 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var41 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var41 - _mecha_var43 = _mecha_var13 - _mecha_var44 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var44 is not None: - _mecha_var13 = _mecha_var44() - with _mecha_helper_branch(_mecha_var43) as _mecha_condition: - if _mecha_condition: - _mecha_var45 = 3 - _mecha_var46 = 3 - _mecha_var45 = _mecha_var45 is not _mecha_var46 - if _mecha_var44 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var45 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var45 - if _mecha_var12 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var13 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) - else: - _mecha_var0 = _mecha_var13 -_mecha_var48 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var47)) ---- -output = _mecha_var48 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=152, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_180__0.txt b/packages/mecha/tests/snapshots/bolt__parse_180__0.txt deleted file mode 100644 index 1e000a776..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_180__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected bracket '[', curly '{', identifier, literal 'false', literal 'null', literal 'true', number or string but reached end of file. -# line 1, column 34 -# 1 | merge function_tag minecraft:tick -merge function_tag minecraft:tick diff --git a/packages/mecha/tests/snapshots/bolt__parse_181__0.txt b/packages/mecha/tests/snapshots/bolt__parse_181__0.txt deleted file mode 100644 index 34d6d3fdc..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_181__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -demo:foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 'demo:foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_181__1.txt b/packages/mecha/tests/snapshots/bolt__parse_181__1.txt deleted file mode 100644 index 43a0076c6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_181__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'demo:foo' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_182__0.txt b/packages/mecha/tests/snapshots/bolt__parse_182__0.txt deleted file mode 100644 index 12d31bcc8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_182__0.txt +++ /dev/null @@ -1,26 +0,0 @@ -a = demo:foo/bar ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'demo:foo/bar' diff --git a/packages/mecha/tests/snapshots/bolt__parse_182__1.txt b/packages/mecha/tests/snapshots/bolt__parse_182__1.txt deleted file mode 100644 index 3237b20cf..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_182__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'demo:foo/bar' - a = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_183__0.txt b/packages/mecha/tests/snapshots/bolt__parse_183__0.txt deleted file mode 100644 index bf32d1ef6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_183__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Expected identifier but got literal 'class'. -# line 1, column 5 -# 1 | for class in "abc": -# : ^^^^^ -# 2 | scoreboard objectives add class dummy -for class in "abc": - scoreboard objectives add class dummy diff --git a/packages/mecha/tests/snapshots/bolt__parse_184__0.txt b/packages/mecha/tests/snapshots/bolt__parse_184__0.txt deleted file mode 100644 index ebc043101..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_184__0.txt +++ /dev/null @@ -1,79 +0,0 @@ -a = 1 -positioned ~ ~a ~ function demo:foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 1 - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:positioned:pos:subcommand' - arguments: - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=23, lineno=2, colno=18) - x: - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=18, lineno=2, colno=13) - type: 'relative' - value: 0 - y: - - location: SourceLocation(pos=19, lineno=2, colno=14) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - prefix: '~' - converter: 'coordinate' - value: - - location: SourceLocation(pos=20, lineno=2, colno=15) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - value: 'a' - z: - - location: SourceLocation(pos=22, lineno=2, colno=17) - end_location: SourceLocation(pos=23, lineno=2, colno=18) - type: 'relative' - value: 0 - - location: SourceLocation(pos=24, lineno=2, colno=19) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:run:subcommand' - arguments: - - location: SourceLocation(pos=24, lineno=2, colno=19) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'function:name' - arguments: - - location: SourceLocation(pos=33, lineno=2, colno=28) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - is_tag: False - namespace: 'demo' - path: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_184__1.txt b/packages/mecha/tests/snapshots/bolt__parse_184__1.txt deleted file mode 100644 index 9ad35a87f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_184__1.txt +++ /dev/null @@ -1,61 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_coordinate(f'~{_mecha_var1}', _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], y=_mecha_var1), _mecha_refs[2]]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=19, lineno=2, colno=14) - end_location: SourceLocation(pos=21, lineno=2, colno=16) - prefix: '~' - converter: 'coordinate' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=17, lineno=2, colno=12) - end_location: SourceLocation(pos=23, lineno=2, colno=18) - x: - - y: - - z: - -_mecha_refs[2] - - location: SourceLocation(pos=24, lineno=2, colno=19) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:run:subcommand' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:positioned:pos:subcommand' - arguments: - - -_mecha_refs[4] - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_185__0.txt b/packages/mecha/tests/snapshots/bolt__parse_185__0.txt deleted file mode 100644 index 7d45a034e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_185__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -a, b = "ab" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - targets: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'b' - rebind: False - value: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: 'ab' diff --git a/packages/mecha/tests/snapshots/bolt__parse_185__1.txt b/packages/mecha/tests/snapshots/bolt__parse_185__1.txt deleted file mode 100644 index 5d220c518..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_185__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'ab' - _mecha_unpack0, _mecha_unpack1 = _mecha_var0 - a = _mecha_unpack0 - b = _mecha_unpack1 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_186__0.txt b/packages/mecha/tests/snapshots/bolt__parse_186__0.txt deleted file mode 100644 index c158267db..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_186__0.txt +++ /dev/null @@ -1,67 +0,0 @@ -for i, value in enumerate("abc"): - say f"{i}: {value}" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - targets: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'i' - rebind: False - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'value' - rebind: False - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - value: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 'enumerate' - arguments: - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=31, lineno=1, colno=32) - value: 'abc' - - location: SourceLocation(pos=38, lineno=2, colno=5) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - commands: - - location: SourceLocation(pos=38, lineno=2, colno=5) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=42, lineno=2, colno=9) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=42, lineno=2, colno=9) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - fmt: '{}: {}' - values: - - location: SourceLocation(pos=45, lineno=2, colno=12) - end_location: SourceLocation(pos=46, lineno=2, colno=13) - value: 'i' - - location: SourceLocation(pos=50, lineno=2, colno=17) - end_location: SourceLocation(pos=55, lineno=2, colno=22) - value: 'value' diff --git a/packages/mecha/tests/snapshots/bolt__parse_186__1.txt b/packages/mecha/tests/snapshots/bolt__parse_186__1.txt deleted file mode 100644 index 3cd661df5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_186__1.txt +++ /dev/null @@ -1,39 +0,0 @@ -_mecha_lineno = [1, 10], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = enumerate - _mecha_var1 = 'abc' - _mecha_var0 = _mecha_var0(_mecha_var1) - for i, value in _mecha_var0: - _mecha_var2 = i - _mecha_var3 = value - _mecha_var4 = '{}: {}'.format(_mecha_var2, _mecha_var3) - _mecha_var4 = _mecha_helper_interpolate_message(_mecha_var4, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var4]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=42, lineno=2, colno=9) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - prefix: None - converter: 'message' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=38, lineno=2, colno=5) - end_location: SourceLocation(pos=57, lineno=2, colno=24) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=58, lineno=3, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_187__0.txt b/packages/mecha/tests/snapshots/bolt__parse_187__0.txt deleted file mode 100644 index 4e7539714..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_187__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Identifier 'x' is not defined. -# line 1, column 8 -# 1 | global x -# : ^ -global x diff --git a/packages/mecha/tests/snapshots/bolt__parse_188__0.txt b/packages/mecha/tests/snapshots/bolt__parse_188__0.txt deleted file mode 100644 index e5b5e93ff..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_188__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -x = 1 -#>ERROR Can't make local identifier global. -# line 2, column 8 -# 1 | x = 1 -# 2 | global x -# : ^ -global x diff --git a/packages/mecha/tests/snapshots/bolt__parse_189__0.txt b/packages/mecha/tests/snapshots/bolt__parse_189__0.txt deleted file mode 100644 index ae12658e3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_189__0.txt +++ /dev/null @@ -1,8 +0,0 @@ -x = 1 -def f(): -#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? -# line 3, column 12 -# 2 | def f(): -# 3 | global xx -# : ^^ - global xx diff --git a/packages/mecha/tests/snapshots/bolt__parse_18__0.txt b/packages/mecha/tests/snapshots/bolt__parse_18__0.txt deleted file mode 100644 index 361818698..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_18__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Expected eof or newline but got literal '§§§'. -# line 1, column 4 -# 1 | 64 §§§ -# : ^^^ -64 §§§ diff --git a/packages/mecha/tests/snapshots/bolt__parse_190__0.txt b/packages/mecha/tests/snapshots/bolt__parse_190__0.txt deleted file mode 100644 index 3ce10b1b6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_190__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -def f(x): -#>ERROR Can't make local identifier global. -# line 2, column 12 -# 1 | def f(x): -# 2 | global x -# : ^ - global x diff --git a/packages/mecha/tests/snapshots/bolt__parse_191__0.txt b/packages/mecha/tests/snapshots/bolt__parse_191__0.txt deleted file mode 100644 index 742aaf027..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_191__0.txt +++ /dev/null @@ -1,9 +0,0 @@ -x = 1 -def f(): - global x -#>ERROR Can't make global identifier nonlocal. -# line 4, column 14 -# 3 | global x -# 4 | nonlocal x -# : ^ - nonlocal x diff --git a/packages/mecha/tests/snapshots/bolt__parse_192__0.txt b/packages/mecha/tests/snapshots/bolt__parse_192__0.txt deleted file mode 100644 index d3b9c0b4c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_192__0.txt +++ /dev/null @@ -1,131 +0,0 @@ -math = 0 -say math -def wat(): - global math - import math -wat() -say math.ceil(0.1) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=86, lineno=8, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: 'math' - rebind: False - value: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 0 - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - value: 'math' - - location: SourceLocation(pos=18, lineno=3, colno=1) - end_location: SourceLocation(pos=60, lineno=5, colno=16) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=22, lineno=3, colno=5) - end_location: SourceLocation(pos=27, lineno=3, colno=10) - name: 'wat' - arguments: - - - location: SourceLocation(pos=33, lineno=4, colno=5) - end_location: SourceLocation(pos=60, lineno=5, colno=16) - commands: - - location: SourceLocation(pos=33, lineno=4, colno=5) - end_location: SourceLocation(pos=44, lineno=4, colno=16) - identifier: 'global:subcommand' - arguments: - - location: SourceLocation(pos=40, lineno=4, colno=12) - end_location: SourceLocation(pos=44, lineno=4, colno=16) - identifier: 'global:name' - arguments: - - location: SourceLocation(pos=40, lineno=4, colno=12) - end_location: SourceLocation(pos=44, lineno=4, colno=16) - value: 'math' - - location: SourceLocation(pos=49, lineno=5, colno=5) - end_location: SourceLocation(pos=60, lineno=5, colno=16) - identifier: 'import:module' - arguments: - - location: SourceLocation(pos=56, lineno=5, colno=12) - end_location: SourceLocation(pos=60, lineno=5, colno=16) - is_tag: False - namespace: None - path: 'math' - - location: SourceLocation(pos=61, lineno=6, colno=1) - end_location: SourceLocation(pos=66, lineno=6, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=61, lineno=6, colno=1) - end_location: SourceLocation(pos=66, lineno=6, colno=6) - value: - - location: SourceLocation(pos=61, lineno=6, colno=1) - end_location: SourceLocation(pos=64, lineno=6, colno=4) - value: 'wat' - arguments: - - - location: SourceLocation(pos=67, lineno=7, colno=1) - end_location: SourceLocation(pos=85, lineno=7, colno=19) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=71, lineno=7, colno=5) - end_location: SourceLocation(pos=85, lineno=7, colno=19) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=71, lineno=7, colno=5) - end_location: SourceLocation(pos=85, lineno=7, colno=19) - value: - - location: SourceLocation(pos=71, lineno=7, colno=5) - end_location: SourceLocation(pos=80, lineno=7, colno=14) - name: 'ceil' - value: - - location: SourceLocation(pos=71, lineno=7, colno=5) - end_location: SourceLocation(pos=75, lineno=7, colno=9) - value: 'math' - arguments: - - location: SourceLocation(pos=81, lineno=7, colno=15) - end_location: SourceLocation(pos=84, lineno=7, colno=18) - value: 0.1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_192__1.txt b/packages/mecha/tests/snapshots/bolt__parse_192__1.txt deleted file mode 100644 index ef29b5238..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_192__1.txt +++ /dev/null @@ -1,67 +0,0 @@ -_mecha_lineno = [1, 10, 14, 15, 16, 18], [1, 2, 4, 5, 6, 7] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 0 - math = _mecha_var0 - _mecha_var1 = math - _mecha_var1 = _mecha_helper_interpolate_message(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) - def wat(): - global math - math = _mecha_helper_import_module('math') - _mecha_var2 = wat - _mecha_var2 = _mecha_var2() - _mecha_var3 = math - _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'ceil') - _mecha_var4 = 0.1 - _mecha_var3 = _mecha_var3(_mecha_var4) - _mecha_var3 = _mecha_helper_interpolate_message(_mecha_var3, _mecha_refs[2]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var3]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - prefix: None - converter: 'message' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=9) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=71, lineno=7, colno=5) - end_location: SourceLocation(pos=85, lineno=7, colno=19) - prefix: None - converter: 'message' - value: - -_mecha_refs[3] - - location: SourceLocation(pos=67, lineno=7, colno=1) - end_location: SourceLocation(pos=85, lineno=7, colno=19) - identifier: 'say:message' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=86, lineno=8, colno=1) - commands: - - - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_193__0.txt b/packages/mecha/tests/snapshots/bolt__parse_193__0.txt deleted file mode 100644 index 97868a3ed..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_193__0.txt +++ /dev/null @@ -1,423 +0,0 @@ -def init_global_score(self, name): - self.name = name - -def rebind_global_score(self, rhs): - if isinstance(rhs, GlobalScore): - scoreboard players operation self.name global = rhs.name global - else: - scoreboard players set self.name global rhs - return self - -GlobalScore = type("GlobalScore", (), {"__init__": init_global_score, "__rebind__": rebind_global_score}) - -a = GlobalScore("a") -a = 123 -a = 456 - -b = GlobalScore("b") -b = 789 -b = a ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=461, lineno=20, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=55, lineno=2, colno=21) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=33, lineno=1, colno=34) - name: 'init_global_score' - arguments: - - location: SourceLocation(pos=22, lineno=1, colno=23) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - name: 'self' - default: None - - location: SourceLocation(pos=28, lineno=1, colno=29) - end_location: SourceLocation(pos=32, lineno=1, colno=33) - name: 'name' - default: None - - location: SourceLocation(pos=39, lineno=2, colno=5) - end_location: SourceLocation(pos=55, lineno=2, colno=21) - commands: - - location: SourceLocation(pos=39, lineno=2, colno=5) - end_location: SourceLocation(pos=55, lineno=2, colno=21) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=39, lineno=2, colno=5) - end_location: SourceLocation(pos=55, lineno=2, colno=21) - operator: '=' - target: - - location: SourceLocation(pos=39, lineno=2, colno=5) - end_location: SourceLocation(pos=48, lineno=2, colno=14) - name: 'name' - value: - - location: SourceLocation(pos=39, lineno=2, colno=5) - end_location: SourceLocation(pos=43, lineno=2, colno=9) - value: 'self' - value: - - location: SourceLocation(pos=51, lineno=2, colno=17) - end_location: SourceLocation(pos=55, lineno=2, colno=21) - value: 'name' - - location: SourceLocation(pos=57, lineno=4, colno=1) - end_location: SourceLocation(pos=279, lineno=9, colno=16) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=61, lineno=4, colno=5) - end_location: SourceLocation(pos=91, lineno=4, colno=35) - name: 'rebind_global_score' - arguments: - - location: SourceLocation(pos=81, lineno=4, colno=25) - end_location: SourceLocation(pos=85, lineno=4, colno=29) - name: 'self' - default: None - - location: SourceLocation(pos=87, lineno=4, colno=31) - end_location: SourceLocation(pos=90, lineno=4, colno=34) - name: 'rhs' - default: None - - location: SourceLocation(pos=97, lineno=5, colno=5) - end_location: SourceLocation(pos=279, lineno=9, colno=16) - commands: - - location: SourceLocation(pos=97, lineno=5, colno=5) - end_location: SourceLocation(pos=201, lineno=6, colno=72) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=100, lineno=5, colno=8) - end_location: SourceLocation(pos=128, lineno=5, colno=36) - value: - - location: SourceLocation(pos=100, lineno=5, colno=8) - end_location: SourceLocation(pos=110, lineno=5, colno=18) - value: 'isinstance' - arguments: - - location: SourceLocation(pos=111, lineno=5, colno=19) - end_location: SourceLocation(pos=114, lineno=5, colno=22) - value: 'rhs' - - location: SourceLocation(pos=116, lineno=5, colno=24) - end_location: SourceLocation(pos=127, lineno=5, colno=35) - value: 'GlobalScore' - - location: SourceLocation(pos=138, lineno=6, colno=9) - end_location: SourceLocation(pos=201, lineno=6, colno=72) - commands: - - location: SourceLocation(pos=138, lineno=6, colno=9) - end_location: SourceLocation(pos=201, lineno=6, colno=72) - identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' - arguments: - - location: SourceLocation(pos=167, lineno=6, colno=38) - end_location: SourceLocation(pos=176, lineno=6, colno=47) - prefix: None - converter: 'entity' - value: - - location: SourceLocation(pos=167, lineno=6, colno=38) - end_location: SourceLocation(pos=176, lineno=6, colno=47) - name: 'name' - value: - - location: SourceLocation(pos=167, lineno=6, colno=38) - end_location: SourceLocation(pos=171, lineno=6, colno=42) - value: 'self' - - location: SourceLocation(pos=177, lineno=6, colno=48) - end_location: SourceLocation(pos=183, lineno=6, colno=54) - value: 'global' - - location: SourceLocation(pos=184, lineno=6, colno=55) - end_location: SourceLocation(pos=185, lineno=6, colno=56) - value: '=' - - location: SourceLocation(pos=186, lineno=6, colno=57) - end_location: SourceLocation(pos=194, lineno=6, colno=65) - prefix: None - converter: 'entity' - value: - - location: SourceLocation(pos=186, lineno=6, colno=57) - end_location: SourceLocation(pos=194, lineno=6, colno=65) - name: 'name' - value: - - location: SourceLocation(pos=186, lineno=6, colno=57) - end_location: SourceLocation(pos=189, lineno=6, colno=60) - value: 'rhs' - - location: SourceLocation(pos=195, lineno=6, colno=66) - end_location: SourceLocation(pos=201, lineno=6, colno=72) - value: 'global' - - location: SourceLocation(pos=206, lineno=7, colno=5) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=220, lineno=8, colno=9) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - commands: - - location: SourceLocation(pos=220, lineno=8, colno=9) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - identifier: 'scoreboard:players:set:targets:objective:score' - arguments: - - location: SourceLocation(pos=243, lineno=8, colno=32) - end_location: SourceLocation(pos=252, lineno=8, colno=41) - prefix: None - converter: 'entity' - value: - - location: SourceLocation(pos=243, lineno=8, colno=32) - end_location: SourceLocation(pos=252, lineno=8, colno=41) - name: 'name' - value: - - location: SourceLocation(pos=243, lineno=8, colno=32) - end_location: SourceLocation(pos=247, lineno=8, colno=36) - value: 'self' - - location: SourceLocation(pos=253, lineno=8, colno=42) - end_location: SourceLocation(pos=259, lineno=8, colno=48) - value: 'global' - - location: SourceLocation(pos=260, lineno=8, colno=49) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - prefix: None - converter: 'numeric' - value: - - location: SourceLocation(pos=260, lineno=8, colno=49) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - value: 'rhs' - - location: SourceLocation(pos=268, lineno=9, colno=5) - end_location: SourceLocation(pos=279, lineno=9, colno=16) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=275, lineno=9, colno=12) - end_location: SourceLocation(pos=279, lineno=9, colno=16) - value: 'self' - - location: SourceLocation(pos=281, lineno=11, colno=1) - end_location: SourceLocation(pos=386, lineno=11, colno=106) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=281, lineno=11, colno=1) - end_location: SourceLocation(pos=386, lineno=11, colno=106) - operator: '=' - target: - - location: SourceLocation(pos=281, lineno=11, colno=1) - end_location: SourceLocation(pos=292, lineno=11, colno=12) - value: 'GlobalScore' - rebind: False - value: - - location: SourceLocation(pos=295, lineno=11, colno=15) - end_location: SourceLocation(pos=386, lineno=11, colno=106) - value: - - location: SourceLocation(pos=295, lineno=11, colno=15) - end_location: SourceLocation(pos=299, lineno=11, colno=19) - value: 'type' - arguments: - - location: SourceLocation(pos=300, lineno=11, colno=20) - end_location: SourceLocation(pos=313, lineno=11, colno=33) - value: 'GlobalScore' - - location: SourceLocation(pos=315, lineno=11, colno=35) - end_location: SourceLocation(pos=317, lineno=11, colno=37) - items: - - - location: SourceLocation(pos=319, lineno=11, colno=39) - end_location: SourceLocation(pos=385, lineno=11, colno=105) - items: - - location: SourceLocation(pos=320, lineno=11, colno=40) - end_location: SourceLocation(pos=349, lineno=11, colno=69) - key: - - location: SourceLocation(pos=320, lineno=11, colno=40) - end_location: SourceLocation(pos=330, lineno=11, colno=50) - value: '__init__' - value: - - location: SourceLocation(pos=332, lineno=11, colno=52) - end_location: SourceLocation(pos=349, lineno=11, colno=69) - value: 'init_global_score' - - location: SourceLocation(pos=351, lineno=11, colno=71) - end_location: SourceLocation(pos=384, lineno=11, colno=104) - key: - - location: SourceLocation(pos=351, lineno=11, colno=71) - end_location: SourceLocation(pos=363, lineno=11, colno=83) - value: '__rebind__' - value: - - location: SourceLocation(pos=365, lineno=11, colno=85) - end_location: SourceLocation(pos=384, lineno=11, colno=104) - value: 'rebind_global_score' - - location: SourceLocation(pos=388, lineno=13, colno=1) - end_location: SourceLocation(pos=408, lineno=13, colno=21) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=388, lineno=13, colno=1) - end_location: SourceLocation(pos=408, lineno=13, colno=21) - operator: '=' - target: - - location: SourceLocation(pos=388, lineno=13, colno=1) - end_location: SourceLocation(pos=389, lineno=13, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=392, lineno=13, colno=5) - end_location: SourceLocation(pos=408, lineno=13, colno=21) - value: - - location: SourceLocation(pos=392, lineno=13, colno=5) - end_location: SourceLocation(pos=403, lineno=13, colno=16) - value: 'GlobalScore' - arguments: - - location: SourceLocation(pos=404, lineno=13, colno=17) - end_location: SourceLocation(pos=407, lineno=13, colno=20) - value: 'a' - - location: SourceLocation(pos=409, lineno=14, colno=1) - end_location: SourceLocation(pos=416, lineno=14, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=409, lineno=14, colno=1) - end_location: SourceLocation(pos=416, lineno=14, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=409, lineno=14, colno=1) - end_location: SourceLocation(pos=410, lineno=14, colno=2) - value: 'a' - rebind: True - value: - - location: SourceLocation(pos=413, lineno=14, colno=5) - end_location: SourceLocation(pos=416, lineno=14, colno=8) - value: 123 - - location: SourceLocation(pos=417, lineno=15, colno=1) - end_location: SourceLocation(pos=424, lineno=15, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=417, lineno=15, colno=1) - end_location: SourceLocation(pos=424, lineno=15, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=417, lineno=15, colno=1) - end_location: SourceLocation(pos=418, lineno=15, colno=2) - value: 'a' - rebind: True - value: - - location: SourceLocation(pos=421, lineno=15, colno=5) - end_location: SourceLocation(pos=424, lineno=15, colno=8) - value: 456 - - location: SourceLocation(pos=426, lineno=17, colno=1) - end_location: SourceLocation(pos=446, lineno=17, colno=21) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=426, lineno=17, colno=1) - end_location: SourceLocation(pos=446, lineno=17, colno=21) - operator: '=' - target: - - location: SourceLocation(pos=426, lineno=17, colno=1) - end_location: SourceLocation(pos=427, lineno=17, colno=2) - value: 'b' - rebind: False - value: - - location: SourceLocation(pos=430, lineno=17, colno=5) - end_location: SourceLocation(pos=446, lineno=17, colno=21) - value: - - location: SourceLocation(pos=430, lineno=17, colno=5) - end_location: SourceLocation(pos=441, lineno=17, colno=16) - value: 'GlobalScore' - arguments: - - location: SourceLocation(pos=442, lineno=17, colno=17) - end_location: SourceLocation(pos=445, lineno=17, colno=20) - value: 'b' - - location: SourceLocation(pos=447, lineno=18, colno=1) - end_location: SourceLocation(pos=454, lineno=18, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=447, lineno=18, colno=1) - end_location: SourceLocation(pos=454, lineno=18, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=447, lineno=18, colno=1) - end_location: SourceLocation(pos=448, lineno=18, colno=2) - value: 'b' - rebind: True - value: - - location: SourceLocation(pos=451, lineno=18, colno=5) - end_location: SourceLocation(pos=454, lineno=18, colno=8) - value: 789 - - location: SourceLocation(pos=455, lineno=19, colno=1) - end_location: SourceLocation(pos=460, lineno=19, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=455, lineno=19, colno=1) - end_location: SourceLocation(pos=460, lineno=19, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=455, lineno=19, colno=1) - end_location: SourceLocation(pos=456, lineno=19, colno=2) - value: 'b' - rebind: True - value: - - location: SourceLocation(pos=459, lineno=19, colno=5) - end_location: SourceLocation(pos=460, lineno=19, colno=6) - value: 'a' diff --git a/packages/mecha/tests/snapshots/bolt__parse_193__1.txt b/packages/mecha/tests/snapshots/bolt__parse_193__1.txt deleted file mode 100644 index d3831e70e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_193__1.txt +++ /dev/null @@ -1,167 +0,0 @@ -_mecha_lineno = [1, 12, 16, 22, 32, 38, 40, 50, 55, 60, 64, 69, 73], [1, 2, 5, 6, 8, 9, 11, 13, 14, 15, 17, 18, 19] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_entity = _mecha_runtime.helpers['interpolate_entity'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_interpolate_numeric = _mecha_runtime.helpers['interpolate_numeric'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -with _mecha_runtime.scope() as _mecha_var26: - def init_global_score(self, name): - _mecha_var0 = name - _mecha_var1 = self - _mecha_var1.name = _mecha_var0 - def rebind_global_score(self, rhs): - _mecha_var2 = isinstance - _mecha_var3 = rhs - _mecha_var4 = GlobalScore - _mecha_var2 = _mecha_var2(_mecha_var3, _mecha_var4) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var5 = self - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'name') - _mecha_var5 = _mecha_helper_interpolate_entity(_mecha_var5, _mecha_refs[0]) - _mecha_var6 = rhs - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'name') - _mecha_var6 = _mecha_helper_interpolate_entity(_mecha_var6, _mecha_refs[1]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var5, _mecha_refs[2], _mecha_refs[3], _mecha_var6, _mecha_refs[4]]))) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var7 = self - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'name') - _mecha_var7 = _mecha_helper_interpolate_entity(_mecha_var7, _mecha_refs[6]) - _mecha_var8 = rhs - _mecha_var8 = _mecha_helper_interpolate_numeric(_mecha_var8, _mecha_refs[7]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_var7, _mecha_refs[8], _mecha_var8]))) - _mecha_var9 = self - return _mecha_var9 - _mecha_var10 = type - _mecha_var11 = 'GlobalScore' - _mecha_var12 = () - _mecha_var13 = '__init__' - _mecha_var14 = init_global_score - _mecha_var15 = '__rebind__' - _mecha_var16 = rebind_global_score - _mecha_var17 = {_mecha_var13: _mecha_var14, _mecha_var15: _mecha_var16} - _mecha_var10 = _mecha_var10(_mecha_var11, _mecha_var12, _mecha_var17) - GlobalScore = _mecha_var10 - _mecha_var18 = GlobalScore - _mecha_var19 = 'a' - _mecha_var18 = _mecha_var18(_mecha_var19) - a = _mecha_var18 - _mecha_var20 = 123 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var20 - if _mecha_rebind is not None: - a = _mecha_rebind(a) - _mecha_var21 = 456 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var21 - if _mecha_rebind is not None: - a = _mecha_rebind(a) - _mecha_var22 = GlobalScore - _mecha_var23 = 'b' - _mecha_var22 = _mecha_var22(_mecha_var23) - b = _mecha_var22 - _mecha_var24 = 789 - _mecha_rebind = _mecha_helper_get_rebind(b) - b = _mecha_var24 - if _mecha_rebind is not None: - b = _mecha_rebind(b) - _mecha_var25 = a - _mecha_rebind = _mecha_helper_get_rebind(b) - b = _mecha_var25 - if _mecha_rebind is not None: - b = _mecha_rebind(b) -_mecha_var27 = _mecha_helper_replace(_mecha_refs[10], commands=_mecha_helper_children(_mecha_var26)) ---- -output = _mecha_var27 ---- -_mecha_refs[0] - - location: SourceLocation(pos=167, lineno=6, colno=38) - end_location: SourceLocation(pos=176, lineno=6, colno=47) - prefix: None - converter: 'entity' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=186, lineno=6, colno=57) - end_location: SourceLocation(pos=194, lineno=6, colno=65) - prefix: None - converter: 'entity' - value: - -_mecha_refs[2] - - location: SourceLocation(pos=177, lineno=6, colno=48) - end_location: SourceLocation(pos=183, lineno=6, colno=54) - value: 'global' -_mecha_refs[3] - - location: SourceLocation(pos=184, lineno=6, colno=55) - end_location: SourceLocation(pos=185, lineno=6, colno=56) - value: '=' -_mecha_refs[4] - - location: SourceLocation(pos=195, lineno=6, colno=66) - end_location: SourceLocation(pos=201, lineno=6, colno=72) - value: 'global' -_mecha_refs[5] - - location: SourceLocation(pos=138, lineno=6, colno=9) - end_location: SourceLocation(pos=201, lineno=6, colno=72) - identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' - arguments: - - - - - -_mecha_refs[6] - - location: SourceLocation(pos=243, lineno=8, colno=32) - end_location: SourceLocation(pos=252, lineno=8, colno=41) - prefix: None - converter: 'entity' - value: - -_mecha_refs[7] - - location: SourceLocation(pos=260, lineno=8, colno=49) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - prefix: None - converter: 'numeric' - value: - -_mecha_refs[8] - - location: SourceLocation(pos=253, lineno=8, colno=42) - end_location: SourceLocation(pos=259, lineno=8, colno=48) - value: 'global' -_mecha_refs[9] - - location: SourceLocation(pos=220, lineno=8, colno=9) - end_location: SourceLocation(pos=263, lineno=8, colno=52) - identifier: 'scoreboard:players:set:targets:objective:score' - arguments: - - - -_mecha_refs[10] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=461, lineno=20, colno=1) - commands: - - - - - - - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_194__0.txt b/packages/mecha/tests/snapshots/bolt__parse_194__0.txt deleted file mode 100644 index cf9d91d31..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_194__0.txt +++ /dev/null @@ -1,232 +0,0 @@ -def Counter(x=0): - def incr(): - nonlocal x - x += 1 - return x - return {"incr": incr} - -counter = Counter() -say counter.incr() -say counter.incr() -say Counter(9).incr() ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=192, lineno=12, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=110, lineno=6, colno=26) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - name: 'Counter' - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - name: 'x' - default: - - location: SourceLocation(pos=14, lineno=1, colno=15) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 0 - - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=110, lineno=6, colno=26) - commands: - - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=84, lineno=5, colno=17) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=26, lineno=2, colno=9) - end_location: SourceLocation(pos=32, lineno=2, colno=15) - name: 'incr' - arguments: - - - location: SourceLocation(pos=42, lineno=3, colno=9) - end_location: SourceLocation(pos=84, lineno=5, colno=17) - commands: - - location: SourceLocation(pos=42, lineno=3, colno=9) - end_location: SourceLocation(pos=52, lineno=3, colno=19) - identifier: 'nonlocal:subcommand' - arguments: - - location: SourceLocation(pos=51, lineno=3, colno=18) - end_location: SourceLocation(pos=52, lineno=3, colno=19) - identifier: 'nonlocal:name' - arguments: - - location: SourceLocation(pos=51, lineno=3, colno=18) - end_location: SourceLocation(pos=52, lineno=3, colno=19) - value: 'x' - - location: SourceLocation(pos=61, lineno=4, colno=9) - end_location: SourceLocation(pos=67, lineno=4, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=61, lineno=4, colno=9) - end_location: SourceLocation(pos=67, lineno=4, colno=15) - operator: '+=' - target: - - location: SourceLocation(pos=61, lineno=4, colno=9) - end_location: SourceLocation(pos=62, lineno=4, colno=10) - value: 'x' - rebind: True - value: - - location: SourceLocation(pos=66, lineno=4, colno=14) - end_location: SourceLocation(pos=67, lineno=4, colno=15) - value: 1 - - location: SourceLocation(pos=76, lineno=5, colno=9) - end_location: SourceLocation(pos=84, lineno=5, colno=17) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=83, lineno=5, colno=16) - end_location: SourceLocation(pos=84, lineno=5, colno=17) - value: 'x' - - location: SourceLocation(pos=89, lineno=6, colno=5) - end_location: SourceLocation(pos=110, lineno=6, colno=26) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=96, lineno=6, colno=12) - end_location: SourceLocation(pos=110, lineno=6, colno=26) - items: - - location: SourceLocation(pos=97, lineno=6, colno=13) - end_location: SourceLocation(pos=109, lineno=6, colno=25) - key: - - location: SourceLocation(pos=97, lineno=6, colno=13) - end_location: SourceLocation(pos=103, lineno=6, colno=19) - value: 'incr' - value: - - location: SourceLocation(pos=105, lineno=6, colno=21) - end_location: SourceLocation(pos=109, lineno=6, colno=25) - value: 'incr' - - location: SourceLocation(pos=112, lineno=8, colno=1) - end_location: SourceLocation(pos=131, lineno=8, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=112, lineno=8, colno=1) - end_location: SourceLocation(pos=131, lineno=8, colno=20) - operator: '=' - target: - - location: SourceLocation(pos=112, lineno=8, colno=1) - end_location: SourceLocation(pos=119, lineno=8, colno=8) - value: 'counter' - rebind: False - value: - - location: SourceLocation(pos=122, lineno=8, colno=11) - end_location: SourceLocation(pos=131, lineno=8, colno=20) - value: - - location: SourceLocation(pos=122, lineno=8, colno=11) - end_location: SourceLocation(pos=129, lineno=8, colno=18) - value: 'Counter' - arguments: - - - location: SourceLocation(pos=132, lineno=9, colno=1) - end_location: SourceLocation(pos=150, lineno=9, colno=19) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=136, lineno=9, colno=5) - end_location: SourceLocation(pos=150, lineno=9, colno=19) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=136, lineno=9, colno=5) - end_location: SourceLocation(pos=150, lineno=9, colno=19) - value: - - location: SourceLocation(pos=136, lineno=9, colno=5) - end_location: SourceLocation(pos=148, lineno=9, colno=17) - name: 'incr' - value: - - location: SourceLocation(pos=136, lineno=9, colno=5) - end_location: SourceLocation(pos=143, lineno=9, colno=12) - value: 'counter' - arguments: - - - location: SourceLocation(pos=151, lineno=10, colno=1) - end_location: SourceLocation(pos=169, lineno=10, colno=19) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=155, lineno=10, colno=5) - end_location: SourceLocation(pos=169, lineno=10, colno=19) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=155, lineno=10, colno=5) - end_location: SourceLocation(pos=169, lineno=10, colno=19) - value: - - location: SourceLocation(pos=155, lineno=10, colno=5) - end_location: SourceLocation(pos=167, lineno=10, colno=17) - name: 'incr' - value: - - location: SourceLocation(pos=155, lineno=10, colno=5) - end_location: SourceLocation(pos=162, lineno=10, colno=12) - value: 'counter' - arguments: - - - location: SourceLocation(pos=170, lineno=11, colno=1) - end_location: SourceLocation(pos=191, lineno=11, colno=22) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=174, lineno=11, colno=5) - end_location: SourceLocation(pos=191, lineno=11, colno=22) - prefix: None - converter: 'message' - value: - - location: SourceLocation(pos=174, lineno=11, colno=5) - end_location: SourceLocation(pos=191, lineno=11, colno=22) - value: - - location: SourceLocation(pos=174, lineno=11, colno=5) - end_location: SourceLocation(pos=189, lineno=11, colno=20) - name: 'incr' - value: - - location: SourceLocation(pos=174, lineno=11, colno=5) - end_location: SourceLocation(pos=184, lineno=11, colno=15) - value: - - location: SourceLocation(pos=174, lineno=11, colno=5) - end_location: SourceLocation(pos=181, lineno=11, colno=12) - value: 'Counter' - arguments: - - location: SourceLocation(pos=182, lineno=11, colno=13) - end_location: SourceLocation(pos=183, lineno=11, colno=14) - value: 9 - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_194__1.txt b/packages/mecha/tests/snapshots/bolt__parse_194__1.txt deleted file mode 100644 index 026888a1f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_194__1.txt +++ /dev/null @@ -1,104 +0,0 @@ -_mecha_lineno = [1, 14, 16, 20, 23, 26, 29, 34, 39], [1, 3, 4, 5, 6, 8, 9, 10, 11] -_mecha_helper_missing = _mecha_runtime.helpers['missing'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var11: - def Counter(x=_mecha_helper_missing): - if x is _mecha_helper_missing: - _mecha_var0 = 0 - x = _mecha_var0 - def incr(): - nonlocal x - _mecha_var1 = 1 - _mecha_rebind = _mecha_helper_get_rebind(x) - x += _mecha_var1 - if _mecha_rebind is not None: - x = _mecha_rebind(x) - _mecha_var2 = x - return _mecha_var2 - _mecha_var3 = 'incr' - _mecha_var4 = incr - _mecha_var5 = {_mecha_var3: _mecha_var4} - return _mecha_var5 - _mecha_var6 = Counter - _mecha_var6 = _mecha_var6() - counter = _mecha_var6 - _mecha_var7 = counter - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'incr') - _mecha_var7 = _mecha_var7() - _mecha_var7 = _mecha_helper_interpolate_message(_mecha_var7, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var7]))) - _mecha_var8 = counter - _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'incr') - _mecha_var8 = _mecha_var8() - _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[2]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var8]))) - _mecha_var9 = Counter - _mecha_var10 = 9 - _mecha_var9 = _mecha_var9(_mecha_var10) - _mecha_var9 = _mecha_helper_get_attribute(_mecha_var9, 'incr') - _mecha_var9 = _mecha_var9() - _mecha_var9 = _mecha_helper_interpolate_message(_mecha_var9, _mecha_refs[4]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var9]))) -_mecha_var12 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var11)) ---- -output = _mecha_var12 ---- -_mecha_refs[0] - - location: SourceLocation(pos=136, lineno=9, colno=5) - end_location: SourceLocation(pos=150, lineno=9, colno=19) - prefix: None - converter: 'message' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=132, lineno=9, colno=1) - end_location: SourceLocation(pos=150, lineno=9, colno=19) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=155, lineno=10, colno=5) - end_location: SourceLocation(pos=169, lineno=10, colno=19) - prefix: None - converter: 'message' - value: - -_mecha_refs[3] - - location: SourceLocation(pos=151, lineno=10, colno=1) - end_location: SourceLocation(pos=169, lineno=10, colno=19) - identifier: 'say:message' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=174, lineno=11, colno=5) - end_location: SourceLocation(pos=191, lineno=11, colno=22) - prefix: None - converter: 'message' - value: - -_mecha_refs[5] - - location: SourceLocation(pos=170, lineno=11, colno=1) - end_location: SourceLocation(pos=191, lineno=11, colno=22) - identifier: 'say:message' - arguments: - -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=192, lineno=12, colno=1) - commands: - - - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_195__0.txt b/packages/mecha/tests/snapshots/bolt__parse_195__0.txt deleted file mode 100644 index 47b76fd5c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_195__0.txt +++ /dev/null @@ -1,9 +0,0 @@ -for i in range(3): -#>ERROR Identifier 'parent' is not defined. -# line 2, column 5 -# 1 | for i in range(3): -# 2 | parent[i] = f"param{i}" -# : ^^^^^^ -# Notes: -# - Expected assignment but got literal '[i]'. - parent[i] = f"param{i}" diff --git a/packages/mecha/tests/snapshots/bolt__parse_196__0.txt b/packages/mecha/tests/snapshots/bolt__parse_196__0.txt deleted file mode 100644 index 1a2948bc7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_196__0.txt +++ /dev/null @@ -1,101 +0,0 @@ -def foo(value): - if value: - result = 1 - else: - result = 0 - return result ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=95, lineno=6, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=95, lineno=6, colno=18) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - name: 'foo' - arguments: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: 'value' - default: None - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=95, lineno=6, colno=18) - commands: - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=48, lineno=3, colno=19) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=23, lineno=2, colno=8) - end_location: SourceLocation(pos=28, lineno=2, colno=13) - value: 'value' - - location: SourceLocation(pos=38, lineno=3, colno=9) - end_location: SourceLocation(pos=48, lineno=3, colno=19) - commands: - - location: SourceLocation(pos=38, lineno=3, colno=9) - end_location: SourceLocation(pos=48, lineno=3, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=38, lineno=3, colno=9) - end_location: SourceLocation(pos=48, lineno=3, colno=19) - operator: '=' - target: - - location: SourceLocation(pos=38, lineno=3, colno=9) - end_location: SourceLocation(pos=44, lineno=3, colno=15) - value: 'result' - rebind: False - value: - - location: SourceLocation(pos=47, lineno=3, colno=18) - end_location: SourceLocation(pos=48, lineno=3, colno=19) - value: 1 - - location: SourceLocation(pos=53, lineno=4, colno=5) - end_location: SourceLocation(pos=77, lineno=5, colno=19) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=67, lineno=5, colno=9) - end_location: SourceLocation(pos=77, lineno=5, colno=19) - commands: - - location: SourceLocation(pos=67, lineno=5, colno=9) - end_location: SourceLocation(pos=77, lineno=5, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=67, lineno=5, colno=9) - end_location: SourceLocation(pos=77, lineno=5, colno=19) - operator: '=' - target: - - location: SourceLocation(pos=67, lineno=5, colno=9) - end_location: SourceLocation(pos=73, lineno=5, colno=15) - value: 'result' - rebind: False - value: - - location: SourceLocation(pos=76, lineno=5, colno=18) - end_location: SourceLocation(pos=77, lineno=5, colno=19) - value: 0 - - location: SourceLocation(pos=82, lineno=6, colno=5) - end_location: SourceLocation(pos=95, lineno=6, colno=18) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=89, lineno=6, colno=12) - end_location: SourceLocation(pos=95, lineno=6, colno=18) - value: 'result' diff --git a/packages/mecha/tests/snapshots/bolt__parse_196__1.txt b/packages/mecha/tests/snapshots/bolt__parse_196__1.txt deleted file mode 100644 index 4cfbb56a7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_196__1.txt +++ /dev/null @@ -1,29 +0,0 @@ -_mecha_lineno = [1, 8, 12, 17, 18], [1, 2, 3, 5, 6] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - def foo(value): - _mecha_var0 = value - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 1 - result = _mecha_var1 - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 0 - result = _mecha_var2 - _mecha_var3 = result - return _mecha_var3 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=95, lineno=6, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_197__0.txt b/packages/mecha/tests/snapshots/bolt__parse_197__0.txt deleted file mode 100644 index 6d15d9173..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_197__0.txt +++ /dev/null @@ -1,122 +0,0 @@ -def foo(value): - result = "init" - if value: - result = 1 - else: - result = 0 - return result ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=115, lineno=7, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=115, lineno=7, colno=18) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - name: 'foo' - arguments: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: 'value' - default: None - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=115, lineno=7, colno=18) - commands: - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=35, lineno=2, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=35, lineno=2, colno=20) - operator: '=' - target: - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=11) - value: 'result' - rebind: False - value: - - location: SourceLocation(pos=29, lineno=2, colno=14) - end_location: SourceLocation(pos=35, lineno=2, colno=20) - value: 'init' - - location: SourceLocation(pos=40, lineno=3, colno=5) - end_location: SourceLocation(pos=68, lineno=4, colno=19) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=43, lineno=3, colno=8) - end_location: SourceLocation(pos=48, lineno=3, colno=13) - value: 'value' - - location: SourceLocation(pos=58, lineno=4, colno=9) - end_location: SourceLocation(pos=68, lineno=4, colno=19) - commands: - - location: SourceLocation(pos=58, lineno=4, colno=9) - end_location: SourceLocation(pos=68, lineno=4, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=58, lineno=4, colno=9) - end_location: SourceLocation(pos=68, lineno=4, colno=19) - operator: '=' - target: - - location: SourceLocation(pos=58, lineno=4, colno=9) - end_location: SourceLocation(pos=64, lineno=4, colno=15) - value: 'result' - rebind: True - value: - - location: SourceLocation(pos=67, lineno=4, colno=18) - end_location: SourceLocation(pos=68, lineno=4, colno=19) - value: 1 - - location: SourceLocation(pos=73, lineno=5, colno=5) - end_location: SourceLocation(pos=97, lineno=6, colno=19) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=87, lineno=6, colno=9) - end_location: SourceLocation(pos=97, lineno=6, colno=19) - commands: - - location: SourceLocation(pos=87, lineno=6, colno=9) - end_location: SourceLocation(pos=97, lineno=6, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=87, lineno=6, colno=9) - end_location: SourceLocation(pos=97, lineno=6, colno=19) - operator: '=' - target: - - location: SourceLocation(pos=87, lineno=6, colno=9) - end_location: SourceLocation(pos=93, lineno=6, colno=15) - value: 'result' - rebind: True - value: - - location: SourceLocation(pos=96, lineno=6, colno=18) - end_location: SourceLocation(pos=97, lineno=6, colno=19) - value: 0 - - location: SourceLocation(pos=102, lineno=7, colno=5) - end_location: SourceLocation(pos=115, lineno=7, colno=18) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=109, lineno=7, colno=12) - end_location: SourceLocation(pos=115, lineno=7, colno=18) - value: 'result' diff --git a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt b/packages/mecha/tests/snapshots/bolt__parse_197__1.txt deleted file mode 100644 index e6af3f78c..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_197__1.txt +++ /dev/null @@ -1,38 +0,0 @@ -_mecha_lineno = [1, 10, 11, 15, 23, 27], [1, 2, 3, 4, 6, 7] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - def foo(value): - _mecha_var0 = 'init' - result = _mecha_var0 - _mecha_var1 = value - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 1 - _mecha_rebind = _mecha_helper_get_rebind(result) - result = _mecha_var2 - if _mecha_rebind is not None: - result = _mecha_rebind(result) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 0 - _mecha_rebind = _mecha_helper_get_rebind(result) - result = _mecha_var3 - if _mecha_rebind is not None: - result = _mecha_rebind(result) - _mecha_var4 = result - return _mecha_var4 -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=115, lineno=7, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_198__0.txt b/packages/mecha/tests/snapshots/bolt__parse_198__0.txt deleted file mode 100644 index 400f14d06..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_198__0.txt +++ /dev/null @@ -1,42 +0,0 @@ -tag_name = foo:bar -function #tag_name ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: 'tag_name' - rebind: False - value: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - value: 'foo:bar' - - location: SourceLocation(pos=19, lineno=2, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - identifier: 'function:name' - arguments: - - location: SourceLocation(pos=28, lineno=2, colno=10) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - prefix: '#' - converter: 'resource_location' - value: - - location: SourceLocation(pos=29, lineno=2, colno=11) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - value: 'tag_name' diff --git a/packages/mecha/tests/snapshots/bolt__parse_198__1.txt b/packages/mecha/tests/snapshots/bolt__parse_198__1.txt deleted file mode 100644 index 000646f8b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_198__1.txt +++ /dev/null @@ -1,36 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'foo:bar' - tag_name = _mecha_var0 - _mecha_var1 = tag_name - _mecha_var1 = _mecha_helper_interpolate_resource_location(f'#{_mecha_var1}', _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=28, lineno=2, colno=10) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - prefix: '#' - converter: 'resource_location' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=19, lineno=2, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - identifier: 'function:name' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=19) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__0.txt b/packages/mecha/tests/snapshots/bolt__parse_199__0.txt deleted file mode 100644 index d5da3d370..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_199__0.txt +++ /dev/null @@ -1,195 +0,0 @@ -for a in [False, True]: - for b in [False, True]: - for c in [False, True]: - for d in [False, True]: - print((a and b or c and not d) in [True] not in [False]) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=193, lineno=6, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'a' - rebind: False - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - items: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: False - - location: SourceLocation(pos=17, lineno=1, colno=18) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: True - - location: SourceLocation(pos=28, lineno=2, colno=5) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - commands: - - location: SourceLocation(pos=28, lineno=2, colno=5) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=32, lineno=2, colno=9) - end_location: SourceLocation(pos=33, lineno=2, colno=10) - value: 'b' - rebind: False - - location: SourceLocation(pos=37, lineno=2, colno=14) - end_location: SourceLocation(pos=50, lineno=2, colno=27) - items: - - location: SourceLocation(pos=38, lineno=2, colno=15) - end_location: SourceLocation(pos=43, lineno=2, colno=20) - value: False - - location: SourceLocation(pos=45, lineno=2, colno=22) - end_location: SourceLocation(pos=49, lineno=2, colno=26) - value: True - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - commands: - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=64, lineno=3, colno=13) - end_location: SourceLocation(pos=65, lineno=3, colno=14) - value: 'c' - rebind: False - - location: SourceLocation(pos=69, lineno=3, colno=18) - end_location: SourceLocation(pos=82, lineno=3, colno=31) - items: - - location: SourceLocation(pos=70, lineno=3, colno=19) - end_location: SourceLocation(pos=75, lineno=3, colno=24) - value: False - - location: SourceLocation(pos=77, lineno=3, colno=26) - end_location: SourceLocation(pos=81, lineno=3, colno=30) - value: True - - location: SourceLocation(pos=96, lineno=4, colno=13) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - commands: - - location: SourceLocation(pos=96, lineno=4, colno=13) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=100, lineno=4, colno=17) - end_location: SourceLocation(pos=101, lineno=4, colno=18) - value: 'd' - rebind: False - - location: SourceLocation(pos=105, lineno=4, colno=22) - end_location: SourceLocation(pos=118, lineno=4, colno=35) - items: - - location: SourceLocation(pos=106, lineno=4, colno=23) - end_location: SourceLocation(pos=111, lineno=4, colno=28) - value: False - - location: SourceLocation(pos=113, lineno=4, colno=30) - end_location: SourceLocation(pos=117, lineno=4, colno=34) - value: True - - location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - commands: - - location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=192, lineno=5, colno=73) - value: - - location: SourceLocation(pos=136, lineno=5, colno=17) - end_location: SourceLocation(pos=141, lineno=5, colno=22) - value: 'print' - arguments: - - location: SourceLocation(pos=143, lineno=5, colno=24) - end_location: SourceLocation(pos=191, lineno=5, colno=72) - operator: 'not_in' - left: - - location: SourceLocation(pos=143, lineno=5, colno=24) - end_location: SourceLocation(pos=176, lineno=5, colno=57) - operator: 'in' - left: - - location: SourceLocation(pos=143, lineno=5, colno=24) - end_location: SourceLocation(pos=165, lineno=5, colno=46) - operator: 'or' - left: - - location: SourceLocation(pos=143, lineno=5, colno=24) - end_location: SourceLocation(pos=150, lineno=5, colno=31) - operator: 'and' - left: - - location: SourceLocation(pos=143, lineno=5, colno=24) - end_location: SourceLocation(pos=144, lineno=5, colno=25) - value: 'a' - right: - - location: SourceLocation(pos=149, lineno=5, colno=30) - end_location: SourceLocation(pos=150, lineno=5, colno=31) - value: 'b' - right: - - location: SourceLocation(pos=154, lineno=5, colno=35) - end_location: SourceLocation(pos=165, lineno=5, colno=46) - operator: 'and' - left: - - location: SourceLocation(pos=154, lineno=5, colno=35) - end_location: SourceLocation(pos=155, lineno=5, colno=36) - value: 'c' - right: - - location: SourceLocation(pos=160, lineno=5, colno=41) - end_location: SourceLocation(pos=165, lineno=5, colno=46) - operator: 'not' - value: - - location: SourceLocation(pos=164, lineno=5, colno=45) - end_location: SourceLocation(pos=165, lineno=5, colno=46) - value: 'd' - right: - - location: SourceLocation(pos=170, lineno=5, colno=51) - end_location: SourceLocation(pos=176, lineno=5, colno=57) - items: - - location: SourceLocation(pos=171, lineno=5, colno=52) - end_location: SourceLocation(pos=175, lineno=5, colno=56) - value: True - right: - - location: SourceLocation(pos=184, lineno=5, colno=65) - end_location: SourceLocation(pos=191, lineno=5, colno=72) - items: - - location: SourceLocation(pos=185, lineno=5, colno=66) - end_location: SourceLocation(pos=190, lineno=5, colno=71) - value: False diff --git a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt b/packages/mecha/tests/snapshots/bolt__parse_199__1.txt deleted file mode 100644 index 514ace72a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_199__1.txt +++ /dev/null @@ -1,88 +0,0 @@ -_mecha_lineno = [1, 17, 21, 25, 27], [1, 2, 3, 4, 5] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] -_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var27: - _mecha_var0 = False - _mecha_var1 = True - _mecha_var2 = [_mecha_var0, _mecha_var1] - for a in _mecha_var2: - _mecha_var3 = False - _mecha_var4 = True - _mecha_var5 = [_mecha_var3, _mecha_var4] - for b in _mecha_var5: - _mecha_var6 = False - _mecha_var7 = True - _mecha_var8 = [_mecha_var6, _mecha_var7] - for c in _mecha_var8: - _mecha_var9 = False - _mecha_var10 = True - _mecha_var11 = [_mecha_var9, _mecha_var10] - for d in _mecha_var11: - _mecha_var12 = print - _mecha_var13 = a - _mecha_var14 = _mecha_var13 - _mecha_var15 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var15 is not None: - _mecha_var13 = _mecha_var15() - with _mecha_helper_branch(_mecha_var14) as _mecha_condition: - if _mecha_condition: - _mecha_var16 = b - if _mecha_var15 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var16 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var16 - _mecha_var17 = _mecha_helper_operator_not(_mecha_var13) - _mecha_var18 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var18 is not None: - _mecha_var13 = _mecha_var18() - with _mecha_helper_branch(_mecha_var17) as _mecha_condition: - if _mecha_condition: - _mecha_var19 = c - _mecha_var20 = _mecha_var19 - _mecha_var21 = _mecha_helper_get_dup(_mecha_var19) - if _mecha_var21 is not None: - _mecha_var19 = _mecha_var21() - with _mecha_helper_branch(_mecha_var20) as _mecha_condition: - if _mecha_condition: - _mecha_var22 = d - _mecha_var22 = _mecha_helper_operator_not(_mecha_var22) - if _mecha_var21 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var19) - _mecha_var19 = _mecha_var22 - if _mecha_rebind is not None: - _mecha_var19 = _mecha_rebind(_mecha_var19) - else: - _mecha_var19 = _mecha_var22 - if _mecha_var18 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var19 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) - else: - _mecha_var13 = _mecha_var19 - _mecha_var23 = True - _mecha_var24 = [_mecha_var23] - _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var24) - _mecha_var25 = False - _mecha_var26 = [_mecha_var25] - _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var26) - _mecha_var12 = _mecha_var12(_mecha_var13) -_mecha_var28 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var27)) ---- -output = _mecha_var28 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=193, lineno=6, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_19__0.txt b/packages/mecha/tests/snapshots/bolt__parse_19__0.txt deleted file mode 100644 index d580f0754..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_19__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got literal '%3'. -# line 1, column 6 -# 1 | 17 % %3 -# : ^^ -17 % %3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_1__0.txt b/packages/mecha/tests/snapshots/bolt__parse_1__0.txt deleted file mode 100644 index 2571fd227..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_1__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -123 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 123 diff --git a/packages/mecha/tests/snapshots/bolt__parse_1__1.txt b/packages/mecha/tests/snapshots/bolt__parse_1__1.txt deleted file mode 100644 index d99c0bbb0..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_1__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 123 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_200__0.txt b/packages/mecha/tests/snapshots/bolt__parse_200__0.txt deleted file mode 100644 index 7d6270463..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_200__0.txt +++ /dev/null @@ -1,11 +0,0 @@ -a = 1 -def f(): -#>ERROR Identifier 'a' is not defined. -# line 3, column 5 -# 2 | def f(): -# 3 | a += 1 -# : ^ -# Notes: -# - Use 'global a' or 'nonlocal a' to mutate the variable defined in outer scope. -# - Expected assignment, eof or newline but got literal '+='. - a += 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_20__0.txt b/packages/mecha/tests/snapshots/bolt__parse_20__0.txt deleted file mode 100644 index cc146d7b3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_20__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -True and (False or True) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: 'and' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: True - right: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - operator: 'or' - left: - - location: SourceLocation(pos=10, lineno=1, colno=11) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: False - right: - - location: SourceLocation(pos=19, lineno=1, colno=20) - end_location: SourceLocation(pos=23, lineno=1, colno=24) - value: True diff --git a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt b/packages/mecha/tests/snapshots/bolt__parse_20__1.txt deleted file mode 100644 index 441752d1a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_20__1.txt +++ /dev/null @@ -1,47 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = True - _mecha_var1 = _mecha_var0 - _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var2 is not None: - _mecha_var0 = _mecha_var2() - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = False - _mecha_var4 = _mecha_helper_operator_not(_mecha_var3) - _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) - if _mecha_var5 is not None: - _mecha_var3 = _mecha_var5() - with _mecha_helper_branch(_mecha_var4) as _mecha_condition: - if _mecha_condition: - _mecha_var6 = True - if _mecha_var5 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) - _mecha_var3 = _mecha_var6 - if _mecha_rebind is not None: - _mecha_var3 = _mecha_rebind(_mecha_var3) - else: - _mecha_var3 = _mecha_var6 - if _mecha_var2 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var3 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) - else: - _mecha_var0 = _mecha_var3 -_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) ---- -output = _mecha_var8 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_21__0.txt b/packages/mecha/tests/snapshots/bolt__parse_21__0.txt deleted file mode 100644 index a802c32dc..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_21__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -"this" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 'this' diff --git a/packages/mecha/tests/snapshots/bolt__parse_21__1.txt b/packages/mecha/tests/snapshots/bolt__parse_21__1.txt deleted file mode 100644 index cc5b6faac..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_21__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'this' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_22__0.txt b/packages/mecha/tests/snapshots/bolt__parse_22__0.txt deleted file mode 100644 index 31031342b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_22__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -"this\nthat" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'this\nthat' diff --git a/packages/mecha/tests/snapshots/bolt__parse_22__1.txt b/packages/mecha/tests/snapshots/bolt__parse_22__1.txt deleted file mode 100644 index 7e41941ab..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_22__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'this\nthat' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_23__0.txt b/packages/mecha/tests/snapshots/bolt__parse_23__0.txt deleted file mode 100644 index f376e039b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_23__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -"\"\u2588this\nthat" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=1, colno=21) - value: '"█this\nthat' diff --git a/packages/mecha/tests/snapshots/bolt__parse_23__1.txt b/packages/mecha/tests/snapshots/bolt__parse_23__1.txt deleted file mode 100644 index 778b55ec5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_23__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '"█this\nthat' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_24__0.txt b/packages/mecha/tests/snapshots/bolt__parse_24__0.txt deleted file mode 100644 index e2a148ef8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_24__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -'' ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=2, lineno=1, colno=3) - value: '' diff --git a/packages/mecha/tests/snapshots/bolt__parse_24__1.txt b/packages/mecha/tests/snapshots/bolt__parse_24__1.txt deleted file mode 100644 index 41fde0c90..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_24__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_25__0.txt b/packages/mecha/tests/snapshots/bolt__parse_25__0.txt deleted file mode 100644 index 638628bdd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_25__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -'"\'"' ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: '"\'"' diff --git a/packages/mecha/tests/snapshots/bolt__parse_25__1.txt b/packages/mecha/tests/snapshots/bolt__parse_25__1.txt deleted file mode 100644 index 93429b164..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_25__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '"\'"' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_26__0.txt b/packages/mecha/tests/snapshots/bolt__parse_26__0.txt deleted file mode 100644 index 830f977b9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_26__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -'something \t\f\n\\\'here' ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=27, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: "something \t\x0c\n\\'here" diff --git a/packages/mecha/tests/snapshots/bolt__parse_26__1.txt b/packages/mecha/tests/snapshots/bolt__parse_26__1.txt deleted file mode 100644 index 15778dfaf..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_26__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = "something \t\x0c\n\\'here" -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=27, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_27__0.txt b/packages/mecha/tests/snapshots/bolt__parse_27__0.txt deleted file mode 100644 index c8a617445..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_27__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Invalid escape sequence \". -# line 1, column 5 -# 1 | 'abc\"' -# : ^^ -'abc\"' diff --git a/packages/mecha/tests/snapshots/bolt__parse_28__0.txt b/packages/mecha/tests/snapshots/bolt__parse_28__0.txt deleted file mode 100644 index dddee99be..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_28__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Expected eof or newline but got literal '"hey"'. -# line 1, column 7 -# 1 | "hey" "hey" -# : ^^^^^ -"hey" "hey" diff --git a/packages/mecha/tests/snapshots/bolt__parse_29__0.txt b/packages/mecha/tests/snapshots/bolt__parse_29__0.txt deleted file mode 100644 index 1bc29362b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_29__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -None ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_29__1.txt b/packages/mecha/tests/snapshots/bolt__parse_29__1.txt deleted file mode 100644 index ec5e89c25..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_29__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = None -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_2__0.txt b/packages/mecha/tests/snapshots/bolt__parse_2__0.txt deleted file mode 100644 index 3c50a66f2..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_2__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -123.456 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 123.456 diff --git a/packages/mecha/tests/snapshots/bolt__parse_2__1.txt b/packages/mecha/tests/snapshots/bolt__parse_2__1.txt deleted file mode 100644 index 3bda36983..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_2__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 123.456 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_30__0.txt b/packages/mecha/tests/snapshots/bolt__parse_30__0.txt deleted file mode 100644 index 388d21465..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_30__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 1 -# 1 | foo -# : ^^^ -# Notes: -# - Expected assignment but got newline '\n'. -foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_31__0.txt b/packages/mecha/tests/snapshots/bolt__parse_31__0.txt deleted file mode 100644 index a9a51d480..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_31__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 11 -# 1 | "hello" + foo -# : ^^^ -"hello" + foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_32__0.txt b/packages/mecha/tests/snapshots/bolt__parse_32__0.txt deleted file mode 100644 index 0bb2f5d82..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_32__0.txt +++ /dev/null @@ -1,36 +0,0 @@ -foo = 1 -foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_32__1.txt b/packages/mecha/tests/snapshots/bolt__parse_32__1.txt deleted file mode 100644 index 0485fcdbb..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_32__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = foo -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_33__0.txt b/packages/mecha/tests/snapshots/bolt__parse_33__0.txt deleted file mode 100644 index 2d06f6c37..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_33__0.txt +++ /dev/null @@ -1,46 +0,0 @@ -foo = 1 -"hello" + foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - operator: '+' - left: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=8) - value: 'hello' - right: - - location: SourceLocation(pos=18, lineno=2, colno=11) - end_location: SourceLocation(pos=21, lineno=2, colno=14) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_33__1.txt b/packages/mecha/tests/snapshots/bolt__parse_33__1.txt deleted file mode 100644 index d563e36eb..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_33__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = 'hello' - _mecha_var2 = foo - _mecha_var1 = _mecha_var1 + _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_34__0.txt b/packages/mecha/tests/snapshots/bolt__parse_34__0.txt deleted file mode 100644 index 9faa67767..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_34__0.txt +++ /dev/null @@ -1,71 +0,0 @@ -a = 1 -if a == 1: - a = 0 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=27, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 'a' - rebind: False - value: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 1 - - location: SourceLocation(pos=6, lineno=2, colno=1) - end_location: SourceLocation(pos=26, lineno=3, colno=10) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=9, lineno=2, colno=4) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - operator: '==' - left: - - location: SourceLocation(pos=9, lineno=2, colno=4) - end_location: SourceLocation(pos=10, lineno=2, colno=5) - value: 'a' - right: - - location: SourceLocation(pos=14, lineno=2, colno=9) - end_location: SourceLocation(pos=15, lineno=2, colno=10) - value: 1 - - location: SourceLocation(pos=21, lineno=3, colno=5) - end_location: SourceLocation(pos=26, lineno=3, colno=10) - commands: - - location: SourceLocation(pos=21, lineno=3, colno=5) - end_location: SourceLocation(pos=26, lineno=3, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=21, lineno=3, colno=5) - end_location: SourceLocation(pos=26, lineno=3, colno=10) - operator: '=' - target: - - location: SourceLocation(pos=21, lineno=3, colno=5) - end_location: SourceLocation(pos=22, lineno=3, colno=6) - value: 'a' - rebind: True - value: - - location: SourceLocation(pos=25, lineno=3, colno=9) - end_location: SourceLocation(pos=26, lineno=3, colno=10) - value: 0 diff --git a/packages/mecha/tests/snapshots/bolt__parse_34__1.txt b/packages/mecha/tests/snapshots/bolt__parse_34__1.txt deleted file mode 100644 index 566977c24..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_34__1.txt +++ /dev/null @@ -1,29 +0,0 @@ -_mecha_lineno = [1, 9, 15], [1, 2, 3] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var2 = 1 - _mecha_var1 = _mecha_var1 == _mecha_var2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 0 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var3 - if _mecha_rebind is not None: - a = _mecha_rebind(a) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=27, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_35__0.txt b/packages/mecha/tests/snapshots/bolt__parse_35__0.txt deleted file mode 100644 index 47f46bc03..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_35__0.txt +++ /dev/null @@ -1,104 +0,0 @@ -if True: - say hello -elif True or False: - say hello -else: - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=3, lineno=1, colno=4) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: True - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=17, lineno=2, colno=9) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=17, lineno=2, colno=9) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - value: 'hello' - - location: SourceLocation(pos=23, lineno=3, colno=1) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=23, lineno=3, colno=1) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=23, lineno=3, colno=1) - end_location: SourceLocation(pos=56, lineno=4, colno=14) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=28, lineno=3, colno=6) - end_location: SourceLocation(pos=41, lineno=3, colno=19) - operator: 'or' - left: - - location: SourceLocation(pos=28, lineno=3, colno=6) - end_location: SourceLocation(pos=32, lineno=3, colno=10) - value: True - right: - - location: SourceLocation(pos=36, lineno=3, colno=14) - end_location: SourceLocation(pos=41, lineno=3, colno=19) - value: False - - location: SourceLocation(pos=47, lineno=4, colno=5) - end_location: SourceLocation(pos=56, lineno=4, colno=14) - commands: - - location: SourceLocation(pos=47, lineno=4, colno=5) - end_location: SourceLocation(pos=56, lineno=4, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=51, lineno=4, colno=9) - end_location: SourceLocation(pos=56, lineno=4, colno=14) - fragments: - - location: SourceLocation(pos=51, lineno=4, colno=9) - end_location: SourceLocation(pos=56, lineno=4, colno=14) - value: 'hello' - - location: SourceLocation(pos=57, lineno=5, colno=1) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - identifier: 'else:body' - arguments: - - location: SourceLocation(pos=67, lineno=6, colno=5) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=67, lineno=6, colno=5) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=71, lineno=6, colno=9) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=71, lineno=6, colno=9) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt b/packages/mecha/tests/snapshots/bolt__parse_35__1.txt deleted file mode 100644 index 79aefa85a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_35__1.txt +++ /dev/null @@ -1,66 +0,0 @@ -_mecha_lineno = [1, 17], [1, 3] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = True - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = True - _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) - _mecha_var3 = _mecha_helper_get_dup(_mecha_var1) - if _mecha_var3 is not None: - _mecha_var1 = _mecha_var3() - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var4 = False - if _mecha_var3 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var1) - _mecha_var1 = _mecha_var4 - if _mecha_rebind is not None: - _mecha_var1 = _mecha_rebind(_mecha_var1) - else: - _mecha_var1 = _mecha_var4 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=47, lineno=4, colno=5) - end_location: SourceLocation(pos=56, lineno=4, colno=14) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=67, lineno=6, colno=5) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - commands: - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=76, lineno=6, colno=14) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_36__0.txt b/packages/mecha/tests/snapshots/bolt__parse_36__0.txt deleted file mode 100644 index 0c8f7208a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_36__0.txt +++ /dev/null @@ -1,12 +0,0 @@ -if True: - say hello -elif True or False: - say hello -#>ERROR Expected colon but got literal '"blah"'. -# line 5, column 6 -# 4 | say hello -# 5 | else "blah": -# : ^^^^^^ -# 6 | say hello -else "blah": - say hello diff --git a/packages/mecha/tests/snapshots/bolt__parse_37__0.txt b/packages/mecha/tests/snapshots/bolt__parse_37__0.txt deleted file mode 100644 index be30965f2..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_37__0.txt +++ /dev/null @@ -1,12 +0,0 @@ -if True: - say hello -a = 1 -#>ERROR Conditional branch must be part of an if statement. -# line 4, column 1 -# 2 | say hello -# 3 | a = 1 -# 4 | else: -# : ^^^^^ -# 5 | say hello -else: - say hello diff --git a/packages/mecha/tests/snapshots/bolt__parse_38__0.txt b/packages/mecha/tests/snapshots/bolt__parse_38__0.txt deleted file mode 100644 index de0aadffe..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_38__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'block', literal 'blocks' or 9 other tokens but reached end of file. -# line 1, column 3 -# 1 | if -if diff --git a/packages/mecha/tests/snapshots/bolt__parse_39__0.txt b/packages/mecha/tests/snapshots/bolt__parse_39__0.txt deleted file mode 100644 index d8c36d818..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_39__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got newline '\n'. -# line 1, column 12 -# 1 | if True and -if True and diff --git a/packages/mecha/tests/snapshots/bolt__parse_3__0.txt b/packages/mecha/tests/snapshots/bolt__parse_3__0.txt deleted file mode 100644 index b74a0a626..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_3__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -22220099.6667e-3 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 22220.0996667 diff --git a/packages/mecha/tests/snapshots/bolt__parse_3__1.txt b/packages/mecha/tests/snapshots/bolt__parse_3__1.txt deleted file mode 100644 index e3e800c33..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_3__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 22220.0996667 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_40__0.txt b/packages/mecha/tests/snapshots/bolt__parse_40__0.txt deleted file mode 100644 index ab601f22f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_40__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Expected non-empty block. -# line 1, column 8 -# 1 | if True: -# : ^ -# 2 | say hello -if True: -say hello diff --git a/packages/mecha/tests/snapshots/bolt__parse_41__0.txt b/packages/mecha/tests/snapshots/bolt__parse_41__0.txt deleted file mode 100644 index 62b3c6ee8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_41__0.txt +++ /dev/null @@ -1,33 +0,0 @@ -while True: - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: True - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=20, lineno=2, colno=9) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_41__1.txt b/packages/mecha/tests/snapshots/bolt__parse_41__1.txt deleted file mode 100644 index 14b1dee42..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_41__1.txt +++ /dev/null @@ -1,23 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = True - while _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=16, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=2, colno=14) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_42__0.txt b/packages/mecha/tests/snapshots/bolt__parse_42__0.txt deleted file mode 100644 index 1f532829a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_42__0.txt +++ /dev/null @@ -1,116 +0,0 @@ -if score @s tmp matches 0: - if "thing" == "bar": - say hello - if "thing" == "foo": - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=34, lineno=2, colno=8) - end_location: SourceLocation(pos=50, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=34, lineno=2, colno=8) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=45, lineno=2, colno=19) - end_location: SourceLocation(pos=50, lineno=2, colno=24) - value: 'bar' - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=64, lineno=3, colno=13) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=64, lineno=3, colno=13) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=74, lineno=4, colno=5) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=77, lineno=4, colno=8) - end_location: SourceLocation(pos=93, lineno=4, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=77, lineno=4, colno=8) - end_location: SourceLocation(pos=84, lineno=4, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=88, lineno=4, colno=19) - end_location: SourceLocation(pos=93, lineno=4, colno=24) - value: 'foo' - - location: SourceLocation(pos=103, lineno=5, colno=9) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=103, lineno=5, colno=9) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=107, lineno=5, colno=13) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=107, lineno=5, colno=13) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_42__1.txt b/packages/mecha/tests/snapshots/bolt__parse_42__1.txt deleted file mode 100644 index 004265c21..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_42__1.txt +++ /dev/null @@ -1,90 +0,0 @@ -_mecha_lineno = [1, 9, 15], [1, 2, 4] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'thing' - _mecha_var1 = 'bar' - _mecha_var0 = _mecha_var0 == _mecha_var1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var2 = 'thing' - _mecha_var3 = 'foo' - _mecha_var2 = _mecha_var2 == _mecha_var3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var4))]))]))]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=103, lineno=5, colno=9) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - commands: - - -_mecha_refs[3] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'execute:commands' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' -_mecha_refs[6] - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 -_mecha_refs[7] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[8] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[9] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=112, lineno=5, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_43__0.txt b/packages/mecha/tests/snapshots/bolt__parse_43__0.txt deleted file mode 100644 index 4de62ceb2..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_43__0.txt +++ /dev/null @@ -1,78 +0,0 @@ -if score @s tmp matches 0: - if "thing" == "foo": - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=34, lineno=2, colno=8) - end_location: SourceLocation(pos=50, lineno=2, colno=24) - operator: '==' - left: - - location: SourceLocation(pos=34, lineno=2, colno=8) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: 'thing' - right: - - location: SourceLocation(pos=45, lineno=2, colno=19) - end_location: SourceLocation(pos=50, lineno=2, colno=24) - value: 'foo' - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=64, lineno=3, colno=13) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=64, lineno=3, colno=13) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_43__1.txt b/packages/mecha/tests/snapshots/bolt__parse_43__1.txt deleted file mode 100644 index 3a4e67e61..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_43__1.txt +++ /dev/null @@ -1,77 +0,0 @@ -_mecha_lineno = [1, 9], [1, 2] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'thing' - _mecha_var1 = 'foo' - _mecha_var0 = _mecha_var0 == _mecha_var1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2))]))]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=60, lineno=3, colno=9) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'execute:commands' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' -_mecha_refs[5] - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[7] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[8] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=3, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_44__0.txt b/packages/mecha/tests/snapshots/bolt__parse_44__0.txt deleted file mode 100644 index 0ae07c284..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_44__0.txt +++ /dev/null @@ -1,96 +0,0 @@ -if score @s tmp matches 0: - while True: - say hello - while True: - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=37, lineno=2, colno=11) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=51, lineno=3, colno=9) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=51, lineno=3, colno=9) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=55, lineno=3, colno=13) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=55, lineno=3, colno=13) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - value: 'hello' - - location: SourceLocation(pos=65, lineno=4, colno=5) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=71, lineno=4, colno=11) - end_location: SourceLocation(pos=75, lineno=4, colno=15) - value: True - - location: SourceLocation(pos=85, lineno=5, colno=9) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - commands: - - location: SourceLocation(pos=85, lineno=5, colno=9) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=89, lineno=5, colno=13) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - fragments: - - location: SourceLocation(pos=89, lineno=5, colno=13) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_44__1.txt b/packages/mecha/tests/snapshots/bolt__parse_44__1.txt deleted file mode 100644 index 046b9e0da..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_44__1.txt +++ /dev/null @@ -1,83 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = True - while _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var1 = True - while _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2))]))]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=51, lineno=3, colno=9) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=85, lineno=5, colno=9) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - commands: - - -_mecha_refs[3] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'execute:commands' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - -_mecha_refs[5] - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' -_mecha_refs[6] - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 -_mecha_refs[7] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[8] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[9] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=94, lineno=5, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_45__0.txt b/packages/mecha/tests/snapshots/bolt__parse_45__0.txt deleted file mode 100644 index 566c9504f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_45__0.txt +++ /dev/null @@ -1,68 +0,0 @@ -if score @s tmp matches 0: - while True: - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=37, lineno=2, colno=11) - end_location: SourceLocation(pos=41, lineno=2, colno=15) - value: True - - location: SourceLocation(pos=51, lineno=3, colno=9) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - - location: SourceLocation(pos=51, lineno=3, colno=9) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=55, lineno=3, colno=13) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - fragments: - - location: SourceLocation(pos=55, lineno=3, colno=13) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_45__1.txt b/packages/mecha/tests/snapshots/bolt__parse_45__1.txt deleted file mode 100644 index 0fc43d4dd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_45__1.txt +++ /dev/null @@ -1,73 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = True - while _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1))]))]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=51, lineno=3, colno=9) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - -_mecha_refs[2] - - location: SourceLocation(pos=31, lineno=2, colno=5) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'execute:commands' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' -_mecha_refs[5] - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - min: 0 - max: 0 -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[7] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[8] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=60, lineno=3, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_46__0.txt b/packages/mecha/tests/snapshots/bolt__parse_46__0.txt deleted file mode 100644 index e85d51f43..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_46__0.txt +++ /dev/null @@ -1,130 +0,0 @@ -if score @s tmp matches 42: - count = 42 - while count > 0: - say hello - count = count - 1 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=108, lineno=6, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'execute:subcommand' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - min: 42 - max: 42 - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'execute:commands' - arguments: - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=42, lineno=2, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=42, lineno=2, colno=15) - operator: '=' - target: - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=37, lineno=2, colno=10) - value: 'count' - rebind: False - value: - - location: SourceLocation(pos=40, lineno=2, colno=13) - end_location: SourceLocation(pos=42, lineno=2, colno=15) - value: 42 - - location: SourceLocation(pos=47, lineno=3, colno=5) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=53, lineno=3, colno=11) - end_location: SourceLocation(pos=62, lineno=3, colno=20) - operator: '>' - left: - - location: SourceLocation(pos=53, lineno=3, colno=11) - end_location: SourceLocation(pos=58, lineno=3, colno=16) - value: 'count' - right: - - location: SourceLocation(pos=61, lineno=3, colno=19) - end_location: SourceLocation(pos=62, lineno=3, colno=20) - value: 0 - - location: SourceLocation(pos=72, lineno=4, colno=9) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - commands: - - location: SourceLocation(pos=72, lineno=4, colno=9) - end_location: SourceLocation(pos=81, lineno=4, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=76, lineno=4, colno=13) - end_location: SourceLocation(pos=81, lineno=4, colno=18) - fragments: - - location: SourceLocation(pos=76, lineno=4, colno=13) - end_location: SourceLocation(pos=81, lineno=4, colno=18) - value: 'hello' - - location: SourceLocation(pos=90, lineno=5, colno=9) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=90, lineno=5, colno=9) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - operator: '=' - target: - - location: SourceLocation(pos=90, lineno=5, colno=9) - end_location: SourceLocation(pos=95, lineno=5, colno=14) - value: 'count' - rebind: True - value: - - location: SourceLocation(pos=98, lineno=5, colno=17) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - operator: '-' - left: - - location: SourceLocation(pos=98, lineno=5, colno=17) - end_location: SourceLocation(pos=103, lineno=5, colno=22) - value: 'count' - right: - - location: SourceLocation(pos=106, lineno=5, colno=25) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_46__1.txt b/packages/mecha/tests/snapshots/bolt__parse_46__1.txt deleted file mode 100644 index f88515afd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_46__1.txt +++ /dev/null @@ -1,87 +0,0 @@ -_mecha_lineno = [1, 8, 9, 14], [1, 2, 3, 5] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 42 - count = _mecha_var0 - _mecha_var1 = count - _mecha_var2 = 0 - _mecha_var1 = _mecha_var1 > _mecha_var2 - while _mecha_var1: - _mecha_runtime.commands.append(_mecha_refs[0]) - _mecha_var3 = count - _mecha_var4 = 1 - _mecha_var3 = _mecha_var3 - _mecha_var4 - _mecha_rebind = _mecha_helper_get_rebind(count) - count = _mecha_var3 - if _mecha_rebind is not None: - count = _mecha_rebind(count) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var5))]))]))]))) -_mecha_var7 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var6)) ---- -output = _mecha_var7 ---- -_mecha_refs[0] - - location: SourceLocation(pos=72, lineno=4, colno=9) - end_location: SourceLocation(pos=81, lineno=4, colno=18) - identifier: 'say:message' - arguments: - -_mecha_refs[1] - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - commands: - - -_mecha_refs[2] - - location: SourceLocation(pos=32, lineno=2, colno=5) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'execute:commands' - arguments: - -_mecha_refs[3] - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - variable: 's' - arguments: - -_mecha_refs[4] - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=15, lineno=1, colno=16) - value: 'tmp' -_mecha_refs[5] - - location: SourceLocation(pos=24, lineno=1, colno=25) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - min: 42 - max: 42 -_mecha_refs[6] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' - arguments: - - - - -_mecha_refs[7] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=107, lineno=5, colno=26) - identifier: 'execute:subcommand' - arguments: - -_mecha_refs[8] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=108, lineno=6, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_47__0.txt b/packages/mecha/tests/snapshots/bolt__parse_47__0.txt deleted file mode 100644 index 7c54c6eea..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_47__0.txt +++ /dev/null @@ -1,39 +0,0 @@ -foo = ( - "abc" - + "def" -) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=5, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - operator: '+' - left: - - location: SourceLocation(pos=12, lineno=2, colno=5) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - value: 'abc' - right: - - location: SourceLocation(pos=24, lineno=3, colno=7) - end_location: SourceLocation(pos=29, lineno=3, colno=12) - value: 'def' diff --git a/packages/mecha/tests/snapshots/bolt__parse_47__1.txt b/packages/mecha/tests/snapshots/bolt__parse_47__1.txt deleted file mode 100644 index b026a0719..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_47__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1, 7, 8], [1, 2, 1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'abc' - _mecha_var1 = 'def' - _mecha_var0 = _mecha_var0 + _mecha_var1 - foo = _mecha_var0 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=5, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_48__0.txt b/packages/mecha/tests/snapshots/bolt__parse_48__0.txt deleted file mode 100644 index 01c0fa3f3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_48__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -1 * 2 -#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'advancement', literal 'align' or 146 other tokens but got literal '*'. -# line 2, column 1 -# 1 | 1 * 2 -# 2 | * 3 -# : ^ -* 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_49__0.txt b/packages/mecha/tests/snapshots/bolt__parse_49__0.txt deleted file mode 100644 index 6e5681c4a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_49__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -true | false | null ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - operator: '|' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - operator: '|' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=4, lineno=1, colno=5) - value: True - right: - - location: SourceLocation(pos=7, lineno=1, colno=8) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: False - right: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=19, lineno=1, colno=20) - value: None diff --git a/packages/mecha/tests/snapshots/bolt__parse_49__1.txt b/packages/mecha/tests/snapshots/bolt__parse_49__1.txt deleted file mode 100644 index 360708453..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_49__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = True - _mecha_var1 = False - _mecha_var0 = _mecha_var0 | _mecha_var1 - _mecha_var2 = None - _mecha_var0 = _mecha_var0 | _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=20, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_4__0.txt b/packages/mecha/tests/snapshots/bolt__parse_4__0.txt deleted file mode 100644 index 89ba4ba53..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_4__0.txt +++ /dev/null @@ -1,15 +0,0 @@ -0.67e6 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 670000.0 diff --git a/packages/mecha/tests/snapshots/bolt__parse_4__1.txt b/packages/mecha/tests/snapshots/bolt__parse_4__1.txt deleted file mode 100644 index c1e4a6981..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_4__1.txt +++ /dev/null @@ -1,15 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 670000.0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_50__0.txt b/packages/mecha/tests/snapshots/bolt__parse_50__0.txt deleted file mode 100644 index 84c6adcca..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_50__0.txt +++ /dev/null @@ -1,46 +0,0 @@ -foo = 1 -foo == 1 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=16, lineno=2, colno=9) - operator: '==' - left: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - value: 'foo' - right: - - location: SourceLocation(pos=15, lineno=2, colno=8) - end_location: SourceLocation(pos=16, lineno=2, colno=9) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_50__1.txt b/packages/mecha/tests/snapshots/bolt__parse_50__1.txt deleted file mode 100644 index ece8b868d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_50__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 1 - _mecha_var1 = _mecha_var1 == _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=17, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_51__0.txt b/packages/mecha/tests/snapshots/bolt__parse_51__0.txt deleted file mode 100644 index f4b87be30..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_51__0.txt +++ /dev/null @@ -1,38 +0,0 @@ -for c in "abc": - say something ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'c' - rebind: False - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'abc' - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - commands: - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=24, lineno=2, colno=9) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - fragments: - - location: SourceLocation(pos=24, lineno=2, colno=9) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - value: 'something' diff --git a/packages/mecha/tests/snapshots/bolt__parse_51__1.txt b/packages/mecha/tests/snapshots/bolt__parse_51__1.txt deleted file mode 100644 index d92f20983..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_51__1.txt +++ /dev/null @@ -1,23 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'abc' - for c in _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=2, colno=18) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_52__0.txt b/packages/mecha/tests/snapshots/bolt__parse_52__0.txt deleted file mode 100644 index 27f7819c1..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_52__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 7 -# 1 | foo = foo -# : ^^^ -foo = foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_53__0.txt b/packages/mecha/tests/snapshots/bolt__parse_53__0.txt deleted file mode 100644 index e505aecc3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_53__0.txt +++ /dev/null @@ -1,47 +0,0 @@ -foo = 1 -foo = foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 1 - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - operator: '=' - target: - - location: SourceLocation(pos=8, lineno=2, colno=1) - end_location: SourceLocation(pos=11, lineno=2, colno=4) - value: 'foo' - rebind: True - value: - - location: SourceLocation(pos=14, lineno=2, colno=7) - end_location: SourceLocation(pos=17, lineno=2, colno=10) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_53__1.txt b/packages/mecha/tests/snapshots/bolt__parse_53__1.txt deleted file mode 100644 index 62dfab42e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_53__1.txt +++ /dev/null @@ -1,23 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_rebind = _mecha_helper_get_rebind(foo) - foo = _mecha_var1 - if _mecha_rebind is not None: - foo = _mecha_rebind(foo) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_54__0.txt b/packages/mecha/tests/snapshots/bolt__parse_54__0.txt deleted file mode 100644 index 9dc998ba7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_54__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 12 -# 1 | for foo in foo: -# : ^^^ -# 2 | foo = foo -for foo in foo: - foo = foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_55__0.txt b/packages/mecha/tests/snapshots/bolt__parse_55__0.txt deleted file mode 100644 index 4fcacd51d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_55__0.txt +++ /dev/null @@ -1,45 +0,0 @@ -for foo in "foo": - foo = foo ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=2, colno=14) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 'foo' - rebind: False - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'foo' - - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=31, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=31, lineno=2, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=31, lineno=2, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=8) - value: 'foo' - rebind: True - value: - - location: SourceLocation(pos=28, lineno=2, colno=11) - end_location: SourceLocation(pos=31, lineno=2, colno=14) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_55__1.txt b/packages/mecha/tests/snapshots/bolt__parse_55__1.txt deleted file mode 100644 index c998bf9f5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_55__1.txt +++ /dev/null @@ -1,22 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'foo' - for foo in _mecha_var0: - _mecha_var1 = foo - _mecha_rebind = _mecha_helper_get_rebind(foo) - foo = _mecha_var1 - if _mecha_rebind is not None: - foo = _mecha_rebind(foo) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=32, lineno=3, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_56__0.txt b/packages/mecha/tests/snapshots/bolt__parse_56__0.txt deleted file mode 100644 index 1d4f62438..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_56__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 1 -# 1 | foo += "hey" -# : ^^^ -# Notes: -# - Expected assignment but got literal '+='. -foo += "hey" diff --git a/packages/mecha/tests/snapshots/bolt__parse_57__0.txt b/packages/mecha/tests/snapshots/bolt__parse_57__0.txt deleted file mode 100644 index ae9678b68..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_57__0.txt +++ /dev/null @@ -1,47 +0,0 @@ -foo = "" -foo += "hey" ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - value: '' - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=13) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=13) - operator: '+=' - target: - - location: SourceLocation(pos=9, lineno=2, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=4) - value: 'foo' - rebind: True - value: - - location: SourceLocation(pos=16, lineno=2, colno=8) - end_location: SourceLocation(pos=21, lineno=2, colno=13) - value: 'hey' diff --git a/packages/mecha/tests/snapshots/bolt__parse_57__1.txt b/packages/mecha/tests/snapshots/bolt__parse_57__1.txt deleted file mode 100644 index 87a71f344..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_57__1.txt +++ /dev/null @@ -1,23 +0,0 @@ -_mecha_lineno = [1, 9], [1, 2] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '' - foo = _mecha_var0 - _mecha_var1 = 'hey' - _mecha_rebind = _mecha_helper_get_rebind(foo) - foo += _mecha_var1 - if _mecha_rebind is not None: - foo = _mecha_rebind(foo) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=3, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_58__0.txt b/packages/mecha/tests/snapshots/bolt__parse_58__0.txt deleted file mode 100644 index 428e86669..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_58__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Identifier 'the' is not defined. Did you mean 'hex'? -# line 1, column 7 -# 1 | wat = the = "f" -# : ^^^ -wat = the = "f" diff --git a/packages/mecha/tests/snapshots/bolt__parse_59__0.txt b/packages/mecha/tests/snapshots/bolt__parse_59__0.txt deleted file mode 100644 index 881a78c30..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_59__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Can only use 'break' in loops. -# line 1, column 1 -# 1 | break -# : ^^^^^ -break diff --git a/packages/mecha/tests/snapshots/bolt__parse_5__0.txt b/packages/mecha/tests/snapshots/bolt__parse_5__0.txt deleted file mode 100644 index a1b8814fa..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_5__0.txt +++ /dev/null @@ -1,25 +0,0 @@ -1 + 2 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 diff --git a/packages/mecha/tests/snapshots/bolt__parse_5__1.txt b/packages/mecha/tests/snapshots/bolt__parse_5__1.txt deleted file mode 100644 index 1a685ec51..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_5__1.txt +++ /dev/null @@ -1,17 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_60__0.txt b/packages/mecha/tests/snapshots/bolt__parse_60__0.txt deleted file mode 100644 index a2e2bba79..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_60__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Can only use 'continue' in loops. -# line 1, column 1 -# 1 | continue -# : ^^^^^^^^ -continue diff --git a/packages/mecha/tests/snapshots/bolt__parse_61__0.txt b/packages/mecha/tests/snapshots/bolt__parse_61__0.txt deleted file mode 100644 index b4c290a84..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_61__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -if true: -#>ERROR Can only use 'break' in loops. -# line 2, column 5 -# 1 | if true: -# 2 | break -# : ^^^^^ - break diff --git a/packages/mecha/tests/snapshots/bolt__parse_62__0.txt b/packages/mecha/tests/snapshots/bolt__parse_62__0.txt deleted file mode 100644 index 62ed596bc..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_62__0.txt +++ /dev/null @@ -1,45 +0,0 @@ -for i in "": - say hello - continue ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=40, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=39, lineno=3, colno=13) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'i' - rebind: False - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: '' - - location: SourceLocation(pos=17, lineno=2, colno=5) - end_location: SourceLocation(pos=39, lineno=3, colno=13) - commands: - - location: SourceLocation(pos=17, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=21, lineno=2, colno=9) - end_location: SourceLocation(pos=26, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=21, lineno=2, colno=9) - end_location: SourceLocation(pos=26, lineno=2, colno=14) - value: 'hello' - - location: SourceLocation(pos=31, lineno=3, colno=5) - end_location: SourceLocation(pos=39, lineno=3, colno=13) - identifier: 'continue' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_62__1.txt b/packages/mecha/tests/snapshots/bolt__parse_62__1.txt deleted file mode 100644 index f7a132010..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_62__1.txt +++ /dev/null @@ -1,25 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '' - for i in _mecha_var0: - _mecha_runtime.commands.append(_mecha_refs[0]) - continue -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=17, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=14) - identifier: 'say:message' - arguments: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=40, lineno=4, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_63__0.txt b/packages/mecha/tests/snapshots/bolt__parse_63__0.txt deleted file mode 100644 index 570a247bd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_63__0.txt +++ /dev/null @@ -1,26 +0,0 @@ -while false: - break ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=3, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=2, colno=10) - identifier: 'while:condition:body' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: False - - location: SourceLocation(pos=17, lineno=2, colno=5) - end_location: SourceLocation(pos=22, lineno=2, colno=10) - commands: - - location: SourceLocation(pos=17, lineno=2, colno=5) - end_location: SourceLocation(pos=22, lineno=2, colno=10) - identifier: 'break' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_63__1.txt b/packages/mecha/tests/snapshots/bolt__parse_63__1.txt deleted file mode 100644 index 9b13ae4c7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_63__1.txt +++ /dev/null @@ -1,17 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = False - while _mecha_var0: - break -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=23, lineno=3, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_64__0.txt b/packages/mecha/tests/snapshots/bolt__parse_64__0.txt deleted file mode 100644 index 6936a36d4..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_64__0.txt +++ /dev/null @@ -1,55 +0,0 @@ -for i in "abc": - if i == "b": - break ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=46, lineno=3, colno=14) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'i' - rebind: False - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: 'abc' - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=46, lineno=3, colno=14) - commands: - - location: SourceLocation(pos=20, lineno=2, colno=5) - end_location: SourceLocation(pos=46, lineno=3, colno=14) - identifier: 'if:condition:body' - arguments: - - location: SourceLocation(pos=23, lineno=2, colno=8) - end_location: SourceLocation(pos=31, lineno=2, colno=16) - operator: '==' - left: - - location: SourceLocation(pos=23, lineno=2, colno=8) - end_location: SourceLocation(pos=24, lineno=2, colno=9) - value: 'i' - right: - - location: SourceLocation(pos=28, lineno=2, colno=13) - end_location: SourceLocation(pos=31, lineno=2, colno=16) - value: 'b' - - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=46, lineno=3, colno=14) - commands: - - location: SourceLocation(pos=41, lineno=3, colno=9) - end_location: SourceLocation(pos=46, lineno=3, colno=14) - identifier: 'break' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_64__1.txt b/packages/mecha/tests/snapshots/bolt__parse_64__1.txt deleted file mode 100644 index 8f72edbe3..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_64__1.txt +++ /dev/null @@ -1,23 +0,0 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'abc' - for i in _mecha_var0: - _mecha_var1 = i - _mecha_var2 = 'b' - _mecha_var1 = _mecha_var1 == _mecha_var2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - break -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=47, lineno=4, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_65__0.txt b/packages/mecha/tests/snapshots/bolt__parse_65__0.txt deleted file mode 100644 index 2472cfd93..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_65__0.txt +++ /dev/null @@ -1,20 +0,0 @@ -"foo".bar ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_65__1.txt b/packages/mecha/tests/snapshots/bolt__parse_65__1.txt deleted file mode 100644 index c6ee9a489..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_65__1.txt +++ /dev/null @@ -1,17 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_66__0.txt b/packages/mecha/tests/snapshots/bolt__parse_66__0.txt deleted file mode 100644 index 426593a54..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_66__0.txt +++ /dev/null @@ -1,25 +0,0 @@ -"foo".bar.baz ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: 'baz' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_66__1.txt b/packages/mecha/tests/snapshots/bolt__parse_66__1.txt deleted file mode 100644 index 0b38aa117..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_66__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'baz') -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_67__0.txt b/packages/mecha/tests/snapshots/bolt__parse_67__0.txt deleted file mode 100644 index b84c56127..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_67__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -"foo".bar()[0] ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' - arguments: - - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 0 diff --git a/packages/mecha/tests/snapshots/bolt__parse_67__1.txt b/packages/mecha/tests/snapshots/bolt__parse_67__1.txt deleted file mode 100644 index b9357601a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_67__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') - _mecha_var0 = _mecha_var0() - _mecha_var1 = 0 - _mecha_var0 = _mecha_var0[_mecha_var1] -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=15, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_68__0.txt b/packages/mecha/tests/snapshots/bolt__parse_68__0.txt deleted file mode 100644 index e38a8f54d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_68__0.txt +++ /dev/null @@ -1,81 +0,0 @@ -"foo".bar()[0]."hello".99."with space"("thing" * 7) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=52, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=1, colno=52) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=14, lineno=1, colno=15) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=11, lineno=1, colno=12) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'bar' - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' - arguments: - - arguments: - - location: SourceLocation(pos=12, lineno=1, colno=13) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 0 - arguments: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=22, lineno=1, colno=23) - value: 'hello' - arguments: - - location: SourceLocation(pos=23, lineno=1, colno=24) - end_location: SourceLocation(pos=25, lineno=1, colno=26) - value: 99 - arguments: - - location: SourceLocation(pos=26, lineno=1, colno=27) - end_location: SourceLocation(pos=38, lineno=1, colno=39) - value: 'with space' - arguments: - - location: SourceLocation(pos=39, lineno=1, colno=40) - end_location: SourceLocation(pos=50, lineno=1, colno=51) - operator: '*' - left: - - location: SourceLocation(pos=39, lineno=1, colno=40) - end_location: SourceLocation(pos=46, lineno=1, colno=47) - value: 'thing' - right: - - location: SourceLocation(pos=49, lineno=1, colno=50) - end_location: SourceLocation(pos=50, lineno=1, colno=51) - value: 7 diff --git a/packages/mecha/tests/snapshots/bolt__parse_68__1.txt b/packages/mecha/tests/snapshots/bolt__parse_68__1.txt deleted file mode 100644 index e2da64bbe..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_68__1.txt +++ /dev/null @@ -1,30 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') - _mecha_var0 = _mecha_var0() - _mecha_var1 = 0 - _mecha_var0 = _mecha_var0[_mecha_var1] - _mecha_var2 = 'hello' - _mecha_var0 = _mecha_var0[_mecha_var2] - _mecha_var3 = 99 - _mecha_var0 = _mecha_var0[_mecha_var3] - _mecha_var4 = 'with space' - _mecha_var0 = _mecha_var0[_mecha_var4] - _mecha_var5 = 'thing' - _mecha_var6 = 7 - _mecha_var5 = _mecha_var5 * _mecha_var6 - _mecha_var0 = _mecha_var0(_mecha_var5) -_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) ---- -output = _mecha_var8 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=52, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_69__0.txt b/packages/mecha/tests/snapshots/bolt__parse_69__0.txt deleted file mode 100644 index 493b83bea..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_69__0.txt +++ /dev/null @@ -1,36 +0,0 @@ -"foo"( - 1, - 2, - 3, -) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=6, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=5, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=29, lineno=5, colno=2) - value: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 'foo' - arguments: - - location: SourceLocation(pos=11, lineno=2, colno=5) - end_location: SourceLocation(pos=12, lineno=2, colno=6) - value: 1 - - location: SourceLocation(pos=18, lineno=3, colno=5) - end_location: SourceLocation(pos=19, lineno=3, colno=6) - value: 2 - - location: SourceLocation(pos=25, lineno=4, colno=5) - end_location: SourceLocation(pos=26, lineno=4, colno=6) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_69__1.txt b/packages/mecha/tests/snapshots/bolt__parse_69__1.txt deleted file mode 100644 index 018dc965a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_69__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'foo' - _mecha_var1 = 1 - _mecha_var2 = 2 - _mecha_var3 = 3 - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, _mecha_var3) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=30, lineno=6, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_6__0.txt b/packages/mecha/tests/snapshots/bolt__parse_6__0.txt deleted file mode 100644 index 2fed0b401..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_6__0.txt +++ /dev/null @@ -1,25 +0,0 @@ -1 - 2 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 diff --git a/packages/mecha/tests/snapshots/bolt__parse_6__1.txt b/packages/mecha/tests/snapshots/bolt__parse_6__1.txt deleted file mode 100644 index 79fbfaabf..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_6__1.txt +++ /dev/null @@ -1,17 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 - _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_70__0.txt b/packages/mecha/tests/snapshots/bolt__parse_70__0.txt deleted file mode 100644 index 92899e349..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_70__0.txt +++ /dev/null @@ -1,51 +0,0 @@ -def foo(): - say hello -foo() ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - fragments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - value: 'hello' - - location: SourceLocation(pos=25, lineno=3, colno=1) - end_location: SourceLocation(pos=30, lineno=3, colno=6) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=25, lineno=3, colno=1) - end_location: SourceLocation(pos=30, lineno=3, colno=6) - value: - - location: SourceLocation(pos=25, lineno=3, colno=1) - end_location: SourceLocation(pos=28, lineno=3, colno=4) - value: 'foo' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_70__1.txt b/packages/mecha/tests/snapshots/bolt__parse_70__1.txt deleted file mode 100644 index ab7c43942..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_70__1.txt +++ /dev/null @@ -1,25 +0,0 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - def foo(): - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = foo - _mecha_var0 = _mecha_var0() -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) ---- -output = _mecha_var2 ---- -_mecha_refs[0] - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=31, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_71__0.txt b/packages/mecha/tests/snapshots/bolt__parse_71__0.txt deleted file mode 100644 index fa90b0973..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_71__0.txt +++ /dev/null @@ -1,69 +0,0 @@ -def foo(): - def bar(): - foo() - bar() ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=49, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=49, lineno=4, colno=10) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=49, lineno=4, colno=10) - commands: - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=39, lineno=3, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=9) - end_location: SourceLocation(pos=24, lineno=2, colno=14) - name: 'bar' - arguments: - - - location: SourceLocation(pos=34, lineno=3, colno=9) - end_location: SourceLocation(pos=39, lineno=3, colno=14) - commands: - - location: SourceLocation(pos=34, lineno=3, colno=9) - end_location: SourceLocation(pos=39, lineno=3, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=34, lineno=3, colno=9) - end_location: SourceLocation(pos=39, lineno=3, colno=14) - value: - - location: SourceLocation(pos=34, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - value: 'foo' - arguments: - - - location: SourceLocation(pos=44, lineno=4, colno=5) - end_location: SourceLocation(pos=49, lineno=4, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=44, lineno=4, colno=5) - end_location: SourceLocation(pos=49, lineno=4, colno=10) - value: - - location: SourceLocation(pos=44, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=8) - value: 'bar' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_71__1.txt b/packages/mecha/tests/snapshots/bolt__parse_71__1.txt deleted file mode 100644 index e5b1bd7c6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_71__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1, 7, 9], [1, 3, 4] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - def foo(): - def bar(): - _mecha_var0 = foo - _mecha_var0 = _mecha_var0() - _mecha_var1 = bar - _mecha_var1 = _mecha_var1() -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=49, lineno=4, colno=10) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_72__0.txt b/packages/mecha/tests/snapshots/bolt__parse_72__0.txt deleted file mode 100644 index 7ceba905f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_72__0.txt +++ /dev/null @@ -1,75 +0,0 @@ -def foo( - a=1, - b=a, - c=a + b, -): - say hello ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=41, lineno=5, colno=2) - name: 'foo' - arguments: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=16, lineno=2, colno=8) - name: 'a' - default: - - location: SourceLocation(pos=15, lineno=2, colno=7) - end_location: SourceLocation(pos=16, lineno=2, colno=8) - value: 1 - - location: SourceLocation(pos=22, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=8) - name: 'b' - default: - - location: SourceLocation(pos=24, lineno=3, colno=7) - end_location: SourceLocation(pos=25, lineno=3, colno=8) - value: 'a' - - location: SourceLocation(pos=31, lineno=4, colno=5) - end_location: SourceLocation(pos=38, lineno=4, colno=12) - name: 'c' - default: - - location: SourceLocation(pos=33, lineno=4, colno=7) - end_location: SourceLocation(pos=38, lineno=4, colno=12) - operator: '+' - left: - - location: SourceLocation(pos=33, lineno=4, colno=7) - end_location: SourceLocation(pos=34, lineno=4, colno=8) - value: 'a' - right: - - location: SourceLocation(pos=37, lineno=4, colno=11) - end_location: SourceLocation(pos=38, lineno=4, colno=12) - value: 'b' - - location: SourceLocation(pos=47, lineno=6, colno=5) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - commands: - - location: SourceLocation(pos=47, lineno=6, colno=5) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=51, lineno=6, colno=9) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - fragments: - - location: SourceLocation(pos=51, lineno=6, colno=9) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - value: 'hello' diff --git a/packages/mecha/tests/snapshots/bolt__parse_72__1.txt b/packages/mecha/tests/snapshots/bolt__parse_72__1.txt deleted file mode 100644 index 890b880d8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_72__1.txt +++ /dev/null @@ -1,34 +0,0 @@ -_mecha_lineno = [1, 11, 14], [1, 3, 4] -_mecha_helper_missing = _mecha_runtime.helpers['missing'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - def foo(a=_mecha_helper_missing, b=_mecha_helper_missing, c=_mecha_helper_missing): - if a is _mecha_helper_missing: - _mecha_var0 = 1 - a = _mecha_var0 - if b is _mecha_helper_missing: - _mecha_var1 = a - b = _mecha_var1 - if c is _mecha_helper_missing: - _mecha_var2 = a - _mecha_var3 = b - _mecha_var2 = _mecha_var2 + _mecha_var3 - c = _mecha_var2 - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=47, lineno=6, colno=5) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - commands: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=56, lineno=6, colno=14) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_73__0.txt b/packages/mecha/tests/snapshots/bolt__parse_73__0.txt deleted file mode 100644 index 03a27def6..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_73__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected brace '(' but got newline '\n'. -# line 1, column 6 -# 1 | def f -def f diff --git a/packages/mecha/tests/snapshots/bolt__parse_74__0.txt b/packages/mecha/tests/snapshots/bolt__parse_74__0.txt deleted file mode 100644 index c1b3ae5bb..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_74__0.txt +++ /dev/null @@ -1,4 +0,0 @@ -#>ERROR Expected statement but reached end of file. -# line 1, column 8 -# 1 | def f() -def f() diff --git a/packages/mecha/tests/snapshots/bolt__parse_75__0.txt b/packages/mecha/tests/snapshots/bolt__parse_75__0.txt deleted file mode 100644 index 295df0b8d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_75__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Expected non-empty block. -# line 1, column 8 -# 1 | def f(): -# : ^ -# 2 | say yolo -def f(): -say yolo diff --git a/packages/mecha/tests/snapshots/bolt__parse_76__0.txt b/packages/mecha/tests/snapshots/bolt__parse_76__0.txt deleted file mode 100644 index 55fc54fed..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_76__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Identifier 'a' is not defined. -# line 1, column 9 -# 1 | def f(a=a): -# : ^ -# 2 | say wat -def f(a=a): - say wat diff --git a/packages/mecha/tests/snapshots/bolt__parse_77__0.txt b/packages/mecha/tests/snapshots/bolt__parse_77__0.txt deleted file mode 100644 index 678914ab2..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_77__0.txt +++ /dev/null @@ -1,69 +0,0 @@ -def f(a, b=a): - b += a - say wat ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - name: 'f' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'a' - default: None - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - name: 'b' - default: - - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'a' - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - commands: - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=25, lineno=2, colno=11) - operator: '+=' - target: - - location: SourceLocation(pos=19, lineno=2, colno=5) - end_location: SourceLocation(pos=20, lineno=2, colno=6) - value: 'b' - rebind: True - value: - - location: SourceLocation(pos=24, lineno=2, colno=10) - end_location: SourceLocation(pos=25, lineno=2, colno=11) - value: 'a' - - location: SourceLocation(pos=30, lineno=3, colno=5) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=34, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - fragments: - - location: SourceLocation(pos=34, lineno=3, colno=9) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - value: 'wat' diff --git a/packages/mecha/tests/snapshots/bolt__parse_77__1.txt b/packages/mecha/tests/snapshots/bolt__parse_77__1.txt deleted file mode 100644 index 0b3ded24f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_77__1.txt +++ /dev/null @@ -1,33 +0,0 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_missing = _mecha_runtime.helpers['missing'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - def f(a, b=_mecha_helper_missing): - if b is _mecha_helper_missing: - _mecha_var0 = a - b = _mecha_var0 - _mecha_var1 = a - _mecha_rebind = _mecha_helper_get_rebind(b) - b += _mecha_var1 - if _mecha_rebind is not None: - b = _mecha_rebind(b) - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=30, lineno=3, colno=5) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - identifier: 'say:message' - arguments: - -_mecha_refs[1] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=12) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_78__0.txt b/packages/mecha/tests/snapshots/bolt__parse_78__0.txt deleted file mode 100644 index 0424f5b36..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_78__0.txt +++ /dev/null @@ -1,13 +0,0 @@ -def f(a, b): - def g(c): - a + b - c -#>ERROR Identifier 'g' is not defined. -# line 5, column 1 -# 3 | a + b -# 4 | c -# 5 | g() -# : ^ -# Notes: -# - Expected assignment but got literal '()'. -g() diff --git a/packages/mecha/tests/snapshots/bolt__parse_79__0.txt b/packages/mecha/tests/snapshots/bolt__parse_79__0.txt deleted file mode 100644 index e692a356f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_79__0.txt +++ /dev/null @@ -1,11 +0,0 @@ -def f(a, b): - def g(c): - a + b -#>ERROR Identifier 'c' is not defined. -# line 4, column 7 -# 3 | a + b -# 4 | f(c) -# : ^ -# Notes: -# - Expected equal but got brace ')'. - f(c) diff --git a/packages/mecha/tests/snapshots/bolt__parse_7__0.txt b/packages/mecha/tests/snapshots/bolt__parse_7__0.txt deleted file mode 100644 index a26959fb7..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_7__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 - 2 + 3 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=5, lineno=1, colno=6) - value: 2 - right: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_7__1.txt b/packages/mecha/tests/snapshots/bolt__parse_7__1.txt deleted file mode 100644 index 9d342764a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_7__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 - _mecha_var1 - _mecha_var2 = 3 - _mecha_var0 = _mecha_var0 + _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_80__0.txt b/packages/mecha/tests/snapshots/bolt__parse_80__0.txt deleted file mode 100644 index ef7d69339..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_80__0.txt +++ /dev/null @@ -1,20 +0,0 @@ -def foo(something): - def wat(): - say - yo - wat - is - dat -# this is a comment - x = "hello" -#>ERROR Identifier 'somehng' is not defined. Did you mean 'something'? -# line 10, column 18 -# 9 | x = "hello" -# 10 | for i in somehng: -# : ^^^^^^^ -# 11 | x += i * 3 - for i in somehng: - x += i * 3 - - say wow - wat() diff --git a/packages/mecha/tests/snapshots/bolt__parse_81__0.txt b/packages/mecha/tests/snapshots/bolt__parse_81__0.txt deleted file mode 100644 index f8b500c58..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_81__0.txt +++ /dev/null @@ -1,186 +0,0 @@ -def foo(something): - def wat(): - say - yo - wat - is - dat -# this is a comment - x = "hello" - for i in something: - x += i * 3 - - say wow - wat() ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=226, lineno=14, colno=10) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=226, lineno=14, colno=10) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=18, lineno=1, colno=19) - name: 'foo' - arguments: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - name: 'something' - default: None - - location: SourceLocation(pos=24, lineno=2, colno=5) - end_location: SourceLocation(pos=226, lineno=14, colno=10) - commands: - - location: SourceLocation(pos=24, lineno=2, colno=5) - end_location: SourceLocation(pos=216, lineno=13, colno=16) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=28, lineno=2, colno=9) - end_location: SourceLocation(pos=33, lineno=2, colno=14) - name: 'wat' - arguments: - - - location: SourceLocation(pos=43, lineno=3, colno=9) - end_location: SourceLocation(pos=216, lineno=13, colno=16) - commands: - - location: SourceLocation(pos=43, lineno=3, colno=9) - end_location: SourceLocation(pos=108, lineno=7, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=59, lineno=4, colno=13) - end_location: SourceLocation(pos=108, lineno=7, colno=16) - fragments: - - location: SourceLocation(pos=59, lineno=4, colno=13) - end_location: SourceLocation(pos=61, lineno=4, colno=15) - value: 'yo' - - location: SourceLocation(pos=73, lineno=5, colno=12) - end_location: SourceLocation(pos=74, lineno=5, colno=13) - value: ' ' - - location: SourceLocation(pos=74, lineno=5, colno=13) - end_location: SourceLocation(pos=77, lineno=5, colno=16) - value: 'wat' - - location: SourceLocation(pos=89, lineno=6, colno=12) - end_location: SourceLocation(pos=90, lineno=6, colno=13) - value: ' ' - - location: SourceLocation(pos=90, lineno=6, colno=13) - end_location: SourceLocation(pos=92, lineno=6, colno=15) - value: 'is' - - location: SourceLocation(pos=104, lineno=7, colno=12) - end_location: SourceLocation(pos=105, lineno=7, colno=13) - value: ' ' - - location: SourceLocation(pos=105, lineno=7, colno=13) - end_location: SourceLocation(pos=108, lineno=7, colno=16) - value: 'dat' - - location: SourceLocation(pos=137, lineno=9, colno=9) - end_location: SourceLocation(pos=148, lineno=9, colno=20) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=137, lineno=9, colno=9) - end_location: SourceLocation(pos=148, lineno=9, colno=20) - operator: '=' - target: - - location: SourceLocation(pos=137, lineno=9, colno=9) - end_location: SourceLocation(pos=138, lineno=9, colno=10) - value: 'x' - rebind: False - value: - - location: SourceLocation(pos=141, lineno=9, colno=13) - end_location: SourceLocation(pos=148, lineno=9, colno=20) - value: 'hello' - - location: SourceLocation(pos=157, lineno=10, colno=9) - end_location: SourceLocation(pos=199, lineno=11, colno=23) - identifier: 'for:target:in:iterable:body' - arguments: - - location: SourceLocation(pos=161, lineno=10, colno=13) - end_location: SourceLocation(pos=162, lineno=10, colno=14) - value: 'i' - rebind: False - - location: SourceLocation(pos=166, lineno=10, colno=18) - end_location: SourceLocation(pos=175, lineno=10, colno=27) - value: 'something' - - location: SourceLocation(pos=189, lineno=11, colno=13) - end_location: SourceLocation(pos=199, lineno=11, colno=23) - commands: - - location: SourceLocation(pos=189, lineno=11, colno=13) - end_location: SourceLocation(pos=199, lineno=11, colno=23) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=189, lineno=11, colno=13) - end_location: SourceLocation(pos=199, lineno=11, colno=23) - operator: '+=' - target: - - location: SourceLocation(pos=189, lineno=11, colno=13) - end_location: SourceLocation(pos=190, lineno=11, colno=14) - value: 'x' - rebind: True - value: - - location: SourceLocation(pos=194, lineno=11, colno=18) - end_location: SourceLocation(pos=199, lineno=11, colno=23) - operator: '*' - left: - - location: SourceLocation(pos=194, lineno=11, colno=18) - end_location: SourceLocation(pos=195, lineno=11, colno=19) - value: 'i' - right: - - location: SourceLocation(pos=198, lineno=11, colno=22) - end_location: SourceLocation(pos=199, lineno=11, colno=23) - value: 3 - - location: SourceLocation(pos=209, lineno=13, colno=9) - end_location: SourceLocation(pos=216, lineno=13, colno=16) - identifier: 'say:message' - arguments: - - location: SourceLocation(pos=213, lineno=13, colno=13) - end_location: SourceLocation(pos=216, lineno=13, colno=16) - fragments: - - location: SourceLocation(pos=213, lineno=13, colno=13) - end_location: SourceLocation(pos=216, lineno=13, colno=16) - value: 'wow' - - location: SourceLocation(pos=221, lineno=14, colno=5) - end_location: SourceLocation(pos=226, lineno=14, colno=10) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=221, lineno=14, colno=5) - end_location: SourceLocation(pos=226, lineno=14, colno=10) - value: - - location: SourceLocation(pos=221, lineno=14, colno=5) - end_location: SourceLocation(pos=224, lineno=14, colno=8) - value: 'wat' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_81__1.txt b/packages/mecha/tests/snapshots/bolt__parse_81__1.txt deleted file mode 100644 index 01a709a95..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_81__1.txt +++ /dev/null @@ -1,46 +0,0 @@ -_mecha_lineno = [1, 10, 11, 13, 21], [1, 9, 10, 11, 14] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - def foo(something): - def wat(): - _mecha_runtime.commands.append(_mecha_refs[0]) - _mecha_var0 = 'hello' - x = _mecha_var0 - _mecha_var1 = something - for i in _mecha_var1: - _mecha_var2 = i - _mecha_var3 = 3 - _mecha_var2 = _mecha_var2 * _mecha_var3 - _mecha_rebind = _mecha_helper_get_rebind(x) - x += _mecha_var2 - if _mecha_rebind is not None: - x = _mecha_rebind(x) - _mecha_runtime.commands.append(_mecha_refs[1]) - _mecha_var4 = wat - _mecha_var4 = _mecha_var4() -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) ---- -output = _mecha_var6 ---- -_mecha_refs[0] - - location: SourceLocation(pos=43, lineno=3, colno=9) - end_location: SourceLocation(pos=108, lineno=7, colno=16) - identifier: 'say:message' - arguments: - -_mecha_refs[1] - - location: SourceLocation(pos=209, lineno=13, colno=9) - end_location: SourceLocation(pos=216, lineno=13, colno=16) - identifier: 'say:message' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=226, lineno=14, colno=10) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_82__0.txt b/packages/mecha/tests/snapshots/bolt__parse_82__0.txt deleted file mode 100644 index 0cb33dbec..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_82__0.txt +++ /dev/null @@ -1,148 +0,0 @@ -def foo(): - global thing - thing += bar() -def bar(): - global thing - thing += foo() -thing = bar() ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=108, lineno=8, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=46, lineno=3, colno=19) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=46, lineno=3, colno=19) - commands: - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=27, lineno=2, colno=17) - identifier: 'global:subcommand' - arguments: - - location: SourceLocation(pos=22, lineno=2, colno=12) - end_location: SourceLocation(pos=27, lineno=2, colno=17) - identifier: 'global:name' - arguments: - - location: SourceLocation(pos=22, lineno=2, colno=12) - end_location: SourceLocation(pos=27, lineno=2, colno=17) - value: 'thing' - - location: SourceLocation(pos=32, lineno=3, colno=5) - end_location: SourceLocation(pos=46, lineno=3, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=32, lineno=3, colno=5) - end_location: SourceLocation(pos=46, lineno=3, colno=19) - operator: '+=' - target: - - location: SourceLocation(pos=32, lineno=3, colno=5) - end_location: SourceLocation(pos=37, lineno=3, colno=10) - value: 'thing' - rebind: True - value: - - location: SourceLocation(pos=41, lineno=3, colno=14) - end_location: SourceLocation(pos=46, lineno=3, colno=19) - value: - - location: SourceLocation(pos=41, lineno=3, colno=14) - end_location: SourceLocation(pos=44, lineno=3, colno=17) - value: 'bar' - arguments: - - - location: SourceLocation(pos=47, lineno=4, colno=1) - end_location: SourceLocation(pos=93, lineno=6, colno=19) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=51, lineno=4, colno=5) - end_location: SourceLocation(pos=56, lineno=4, colno=10) - name: 'bar' - arguments: - - - location: SourceLocation(pos=62, lineno=5, colno=5) - end_location: SourceLocation(pos=93, lineno=6, colno=19) - commands: - - location: SourceLocation(pos=62, lineno=5, colno=5) - end_location: SourceLocation(pos=74, lineno=5, colno=17) - identifier: 'global:subcommand' - arguments: - - location: SourceLocation(pos=69, lineno=5, colno=12) - end_location: SourceLocation(pos=74, lineno=5, colno=17) - identifier: 'global:name' - arguments: - - location: SourceLocation(pos=69, lineno=5, colno=12) - end_location: SourceLocation(pos=74, lineno=5, colno=17) - value: 'thing' - - location: SourceLocation(pos=79, lineno=6, colno=5) - end_location: SourceLocation(pos=93, lineno=6, colno=19) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=79, lineno=6, colno=5) - end_location: SourceLocation(pos=93, lineno=6, colno=19) - operator: '+=' - target: - - location: SourceLocation(pos=79, lineno=6, colno=5) - end_location: SourceLocation(pos=84, lineno=6, colno=10) - value: 'thing' - rebind: True - value: - - location: SourceLocation(pos=88, lineno=6, colno=14) - end_location: SourceLocation(pos=93, lineno=6, colno=19) - value: - - location: SourceLocation(pos=88, lineno=6, colno=14) - end_location: SourceLocation(pos=91, lineno=6, colno=17) - value: 'foo' - arguments: - - - location: SourceLocation(pos=94, lineno=7, colno=1) - end_location: SourceLocation(pos=107, lineno=7, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=94, lineno=7, colno=1) - end_location: SourceLocation(pos=107, lineno=7, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=94, lineno=7, colno=1) - end_location: SourceLocation(pos=99, lineno=7, colno=6) - value: 'thing' - rebind: False - value: - - location: SourceLocation(pos=102, lineno=7, colno=9) - end_location: SourceLocation(pos=107, lineno=7, colno=14) - value: - - location: SourceLocation(pos=102, lineno=7, colno=9) - end_location: SourceLocation(pos=105, lineno=7, colno=12) - value: 'bar' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_82__1.txt b/packages/mecha/tests/snapshots/bolt__parse_82__1.txt deleted file mode 100644 index 2147efbec..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_82__1.txt +++ /dev/null @@ -1,36 +0,0 @@ -_mecha_lineno = [1, 7, 8, 15, 16, 22], [1, 2, 3, 5, 6, 7] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - def foo(): - global thing - _mecha_var0 = bar - _mecha_var0 = _mecha_var0() - _mecha_rebind = _mecha_helper_get_rebind(thing) - thing += _mecha_var0 - if _mecha_rebind is not None: - thing = _mecha_rebind(thing) - def bar(): - global thing - _mecha_var1 = foo - _mecha_var1 = _mecha_var1() - _mecha_rebind = _mecha_helper_get_rebind(thing) - thing += _mecha_var1 - if _mecha_rebind is not None: - thing = _mecha_rebind(thing) - _mecha_var2 = bar - _mecha_var2 = _mecha_var2() - thing = _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=108, lineno=8, colno=1) - commands: - - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_83__0.txt b/packages/mecha/tests/snapshots/bolt__parse_83__0.txt deleted file mode 100644 index 1e085b412..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_83__0.txt +++ /dev/null @@ -1,11 +0,0 @@ -def foo(): - bar() + thing -def bar(): -#>ERROR Identifier 'thin' is not defined. Did you mean 'thing'? -# line 4, column 13 -# 3 | def bar(): -# 4 | foo() + thin -# : ^^^^ -# 5 | thing = bar() - foo() + thin -thing = bar() diff --git a/packages/mecha/tests/snapshots/bolt__parse_84__0.txt b/packages/mecha/tests/snapshots/bolt__parse_84__0.txt deleted file mode 100644 index a5e473ff4..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_84__0.txt +++ /dev/null @@ -1,28 +0,0 @@ -def foo(): - return ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=11) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=11) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - name: 'foo' - arguments: - - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=11) - commands: - - location: SourceLocation(pos=15, lineno=2, colno=5) - end_location: SourceLocation(pos=21, lineno=2, colno=11) - identifier: 'return' - arguments: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_84__1.txt b/packages/mecha/tests/snapshots/bolt__parse_84__1.txt deleted file mode 100644 index 584da111f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_84__1.txt +++ /dev/null @@ -1,16 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: - def foo(): - return -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) ---- -output = _mecha_var1 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=21, lineno=2, colno=11) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_85__0.txt b/packages/mecha/tests/snapshots/bolt__parse_85__0.txt deleted file mode 100644 index 7ae67654b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_85__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Can only use 'return' in functions. -# line 1, column 1 -# 1 | return "hello" -# : ^^^^^^^^^^^^^^ -return "hello" diff --git a/packages/mecha/tests/snapshots/bolt__parse_86__0.txt b/packages/mecha/tests/snapshots/bolt__parse_86__0.txt deleted file mode 100644 index 773e7171f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_86__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -#>ERROR Identifier 'foo' is not defined. -# line 1, column 8 -# 1 | return foo -# : ^^^ -return foo diff --git a/packages/mecha/tests/snapshots/bolt__parse_87__0.txt b/packages/mecha/tests/snapshots/bolt__parse_87__0.txt deleted file mode 100644 index 875bbf236..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_87__0.txt +++ /dev/null @@ -1,68 +0,0 @@ -def f(): - def g(): - return foo - foo = 0 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=17, lineno=2, colno=9) - end_location: SourceLocation(pos=20, lineno=2, colno=12) - name: 'g' - arguments: - - - location: SourceLocation(pos=30, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - commands: - - location: SourceLocation(pos=30, lineno=3, colno=9) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=37, lineno=3, colno=16) - end_location: SourceLocation(pos=40, lineno=3, colno=19) - value: 'foo' - - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - operator: '=' - target: - - location: SourceLocation(pos=45, lineno=4, colno=5) - end_location: SourceLocation(pos=48, lineno=4, colno=8) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=51, lineno=4, colno=11) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - value: 0 diff --git a/packages/mecha/tests/snapshots/bolt__parse_87__1.txt b/packages/mecha/tests/snapshots/bolt__parse_87__1.txt deleted file mode 100644 index b30492ae5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_87__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1, 7, 10], [1, 3, 4] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - def f(): - def g(): - _mecha_var0 = foo - return _mecha_var0 - _mecha_var1 = 0 - foo = _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=52, lineno=4, colno=12) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_88__0.txt b/packages/mecha/tests/snapshots/bolt__parse_88__0.txt deleted file mode 100644 index 8959523ff..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_88__0.txt +++ /dev/null @@ -1,10 +0,0 @@ -def f(): - foo = 0 -#>ERROR Identifier 'foo' is not defined. -# line 3, column 3 -# 2 | foo = 0 -# 3 | f(foo) -# : ^^^ -# Notes: -# - Expected equal but got brace ')'. -f(foo) diff --git a/packages/mecha/tests/snapshots/bolt__parse_89__0.txt b/packages/mecha/tests/snapshots/bolt__parse_89__0.txt deleted file mode 100644 index 3fe958445..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_89__0.txt +++ /dev/null @@ -1,66 +0,0 @@ -def f(x): - tellraw @a x -f("thing") ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=8, lineno=1, colno=9) - name: 'f' - arguments: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'x' - default: None - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - commands: - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - identifier: 'tellraw:targets:message' - arguments: - - location: SourceLocation(pos=22, lineno=2, colno=13) - end_location: SourceLocation(pos=24, lineno=2, colno=15) - variable: 'a' - arguments: - - - location: SourceLocation(pos=25, lineno=2, colno=16) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - prefix: None - converter: 'json' - value: - - location: SourceLocation(pos=25, lineno=2, colno=16) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - value: 'x' - - location: SourceLocation(pos=27, lineno=3, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=27, lineno=3, colno=1) - end_location: SourceLocation(pos=37, lineno=3, colno=11) - value: - - location: SourceLocation(pos=27, lineno=3, colno=1) - end_location: SourceLocation(pos=28, lineno=3, colno=2) - value: 'f' - arguments: - - location: SourceLocation(pos=29, lineno=3, colno=3) - end_location: SourceLocation(pos=36, lineno=3, colno=10) - value: 'thing' diff --git a/packages/mecha/tests/snapshots/bolt__parse_89__1.txt b/packages/mecha/tests/snapshots/bolt__parse_89__1.txt deleted file mode 100644 index 84f48e325..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_89__1.txt +++ /dev/null @@ -1,46 +0,0 @@ -_mecha_lineno = [1, 7, 10], [1, 2, 3] -_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - def f(x): - _mecha_var0 = x - _mecha_var0 = _mecha_helper_interpolate_json(_mecha_var0, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var0]))) - _mecha_var1 = f - _mecha_var2 = 'thing' - _mecha_var1 = _mecha_var1(_mecha_var2) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=25, lineno=2, colno=16) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - prefix: None - converter: 'json' - value: - -_mecha_refs[1] - - location: SourceLocation(pos=22, lineno=2, colno=13) - end_location: SourceLocation(pos=24, lineno=2, colno=15) - variable: 'a' - arguments: - -_mecha_refs[2] - - location: SourceLocation(pos=14, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=17) - identifier: 'tellraw:targets:message' - arguments: - - -_mecha_refs[3] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=38, lineno=4, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_8__0.txt b/packages/mecha/tests/snapshots/bolt__parse_8__0.txt deleted file mode 100644 index c1072ad5b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_8__0.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 - (2 + 3) ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '-' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 1 - right: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - operator: '+' - left: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=6, lineno=1, colno=7) - value: 2 - right: - - location: SourceLocation(pos=9, lineno=1, colno=10) - end_location: SourceLocation(pos=10, lineno=1, colno=11) - value: 3 diff --git a/packages/mecha/tests/snapshots/bolt__parse_8__1.txt b/packages/mecha/tests/snapshots/bolt__parse_8__1.txt deleted file mode 100644 index efd974dc5..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_8__1.txt +++ /dev/null @@ -1,19 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var2 = 3 - _mecha_var1 = _mecha_var1 + _mecha_var2 - _mecha_var0 = _mecha_var0 - _mecha_var1 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_90__0.txt b/packages/mecha/tests/snapshots/bolt__parse_90__0.txt deleted file mode 100644 index 0292421c9..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_90__0.txt +++ /dev/null @@ -1,9 +0,0 @@ -def f(x): -#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? -# line 2, column 16 -# 1 | def f(x): -# 2 | tellraw @a xx -# : ^^ -# 3 | f("thing") - tellraw @a xx -f("thing") diff --git a/packages/mecha/tests/snapshots/bolt__parse_91__0.txt b/packages/mecha/tests/snapshots/bolt__parse_91__0.txt deleted file mode 100644 index ff19b7e9d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_91__0.txt +++ /dev/null @@ -1,30 +0,0 @@ -{ - foo: "bar" -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=4, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=18, lineno=3, colno=2) - items: - - location: SourceLocation(pos=6, lineno=2, colno=5) - end_location: SourceLocation(pos=16, lineno=2, colno=15) - key: - - location: SourceLocation(pos=6, lineno=2, colno=5) - end_location: SourceLocation(pos=9, lineno=2, colno=8) - value: 'foo' - value: - - location: SourceLocation(pos=11, lineno=2, colno=10) - end_location: SourceLocation(pos=16, lineno=2, colno=15) - value: 'bar' diff --git a/packages/mecha/tests/snapshots/bolt__parse_91__1.txt b/packages/mecha/tests/snapshots/bolt__parse_91__1.txt deleted file mode 100644 index e6e4d1233..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_91__1.txt +++ /dev/null @@ -1,17 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'foo' - _mecha_var1 = 'bar' - _mecha_var2 = {_mecha_var0: _mecha_var1} -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) ---- -output = _mecha_var4 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=19, lineno=4, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_92__0.txt b/packages/mecha/tests/snapshots/bolt__parse_92__0.txt deleted file mode 100644 index e57bf3234..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_92__0.txt +++ /dev/null @@ -1,51 +0,0 @@ -foo = "hello" -{ - foo: "bar" -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=5, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'hello' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - items: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - key: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=23, lineno=3, colno=8) - value: 'foo' - value: - - location: SourceLocation(pos=25, lineno=3, colno=10) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - value: 'bar' diff --git a/packages/mecha/tests/snapshots/bolt__parse_92__1.txt b/packages/mecha/tests/snapshots/bolt__parse_92__1.txt deleted file mode 100644 index bbf0a2433..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_92__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1, 7, 9], [1, 3, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'hello' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 'bar' - _mecha_var3 = {_mecha_var1: _mecha_var2} -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=5, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_93__0.txt b/packages/mecha/tests/snapshots/bolt__parse_93__0.txt deleted file mode 100644 index 9342a0574..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_93__0.txt +++ /dev/null @@ -1,51 +0,0 @@ -foo = "hello" -{ - "foo": foo -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=5, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'hello' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=32, lineno=4, colno=2) - items: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - key: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=25, lineno=3, colno=10) - value: 'foo' - value: - - location: SourceLocation(pos=27, lineno=3, colno=12) - end_location: SourceLocation(pos=30, lineno=3, colno=15) - value: 'foo' diff --git a/packages/mecha/tests/snapshots/bolt__parse_93__1.txt b/packages/mecha/tests/snapshots/bolt__parse_93__1.txt deleted file mode 100644 index 548458ea4..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_93__1.txt +++ /dev/null @@ -1,20 +0,0 @@ -_mecha_lineno = [1, 8, 9], [1, 3, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'hello' - foo = _mecha_var0 - _mecha_var1 = 'foo' - _mecha_var2 = foo - _mecha_var3 = {_mecha_var1: _mecha_var2} -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) ---- -output = _mecha_var5 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=33, lineno=5, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_94__0.txt b/packages/mecha/tests/snapshots/bolt__parse_94__0.txt deleted file mode 100644 index f87ef2add..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_94__0.txt +++ /dev/null @@ -1,86 +0,0 @@ -foo = "hello" -{ - foo * 3: 42, - 16 + 3: [], -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=6, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=3, lineno=1, colno=4) - value: 'foo' - rebind: False - value: - - location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=13, lineno=1, colno=14) - value: 'hello' - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=50, lineno=5, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=14, lineno=2, colno=1) - end_location: SourceLocation(pos=50, lineno=5, colno=2) - items: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=31, lineno=3, colno=16) - key: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=27, lineno=3, colno=12) - operator: '*' - left: - - location: SourceLocation(pos=20, lineno=3, colno=5) - end_location: SourceLocation(pos=23, lineno=3, colno=8) - value: 'foo' - right: - - location: SourceLocation(pos=26, lineno=3, colno=11) - end_location: SourceLocation(pos=27, lineno=3, colno=12) - value: 3 - value: - - location: SourceLocation(pos=29, lineno=3, colno=14) - end_location: SourceLocation(pos=31, lineno=3, colno=16) - value: 42 - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=47, lineno=4, colno=15) - key: - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=43, lineno=4, colno=11) - operator: '+' - left: - - location: SourceLocation(pos=37, lineno=4, colno=5) - end_location: SourceLocation(pos=39, lineno=4, colno=7) - value: 16 - right: - - location: SourceLocation(pos=42, lineno=4, colno=10) - end_location: SourceLocation(pos=43, lineno=4, colno=11) - value: 3 - value: - - location: SourceLocation(pos=45, lineno=4, colno=13) - end_location: SourceLocation(pos=47, lineno=4, colno=15) - items: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_94__1.txt b/packages/mecha/tests/snapshots/bolt__parse_94__1.txt deleted file mode 100644 index d87e0678d..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_94__1.txt +++ /dev/null @@ -1,26 +0,0 @@ -_mecha_lineno = [1, 7, 13, 15], [1, 3, 4, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: - _mecha_var0 = 'hello' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 3 - _mecha_var1 = _mecha_var1 * _mecha_var2 - _mecha_var3 = 42 - _mecha_var4 = 16 - _mecha_var5 = 3 - _mecha_var4 = _mecha_var4 + _mecha_var5 - _mecha_var6 = [] - _mecha_var7 = {_mecha_var1: _mecha_var3, _mecha_var4: _mecha_var6} -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) ---- -output = _mecha_var9 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=51, lineno=6, colno=1) - commands: - - diff --git a/packages/mecha/tests/snapshots/bolt__parse_95__0.txt b/packages/mecha/tests/snapshots/bolt__parse_95__0.txt deleted file mode 100644 index 2725da5fc..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_95__0.txt +++ /dev/null @@ -1,156 +0,0 @@ -my_predicate = { - "condition": "minecraft:entity_scores", - "entity": "this", - "scores": { - "score1": { - "min": { - "type": "minecraft:score", - "target": "this", - "score": "score2", - "scale": 1 - } - } - } -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=251, lineno=15, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=250, lineno=14, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=250, lineno=14, colno=2) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'my_predicate' - rebind: False - value: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=250, lineno=14, colno=2) - items: - - location: SourceLocation(pos=19, lineno=2, colno=3) - end_location: SourceLocation(pos=57, lineno=2, colno=41) - key: - - location: SourceLocation(pos=19, lineno=2, colno=3) - end_location: SourceLocation(pos=30, lineno=2, colno=14) - value: 'condition' - value: - - location: SourceLocation(pos=32, lineno=2, colno=16) - end_location: SourceLocation(pos=57, lineno=2, colno=41) - value: 'minecraft:entity_scores' - - location: SourceLocation(pos=61, lineno=3, colno=3) - end_location: SourceLocation(pos=77, lineno=3, colno=19) - key: - - location: SourceLocation(pos=61, lineno=3, colno=3) - end_location: SourceLocation(pos=69, lineno=3, colno=11) - value: 'entity' - value: - - location: SourceLocation(pos=71, lineno=3, colno=13) - end_location: SourceLocation(pos=77, lineno=3, colno=19) - value: 'this' - - location: SourceLocation(pos=81, lineno=4, colno=3) - end_location: SourceLocation(pos=248, lineno=13, colno=4) - key: - - location: SourceLocation(pos=81, lineno=4, colno=3) - end_location: SourceLocation(pos=89, lineno=4, colno=11) - value: 'scores' - value: - - location: SourceLocation(pos=91, lineno=4, colno=13) - end_location: SourceLocation(pos=248, lineno=13, colno=4) - items: - - location: SourceLocation(pos=97, lineno=5, colno=5) - end_location: SourceLocation(pos=244, lineno=12, colno=6) - key: - - location: SourceLocation(pos=97, lineno=5, colno=5) - end_location: SourceLocation(pos=105, lineno=5, colno=13) - value: 'score1' - value: - - location: SourceLocation(pos=107, lineno=5, colno=15) - end_location: SourceLocation(pos=244, lineno=12, colno=6) - items: - - location: SourceLocation(pos=115, lineno=6, colno=7) - end_location: SourceLocation(pos=238, lineno=11, colno=8) - key: - - location: SourceLocation(pos=115, lineno=6, colno=7) - end_location: SourceLocation(pos=120, lineno=6, colno=12) - value: 'min' - value: - - location: SourceLocation(pos=122, lineno=6, colno=14) - end_location: SourceLocation(pos=238, lineno=11, colno=8) - items: - - location: SourceLocation(pos=132, lineno=7, colno=9) - end_location: SourceLocation(pos=157, lineno=7, colno=34) - key: - - location: SourceLocation(pos=132, lineno=7, colno=9) - end_location: SourceLocation(pos=138, lineno=7, colno=15) - value: 'type' - value: - - location: SourceLocation(pos=140, lineno=7, colno=17) - end_location: SourceLocation(pos=157, lineno=7, colno=34) - value: 'minecraft:score' - - location: SourceLocation(pos=167, lineno=8, colno=9) - end_location: SourceLocation(pos=183, lineno=8, colno=25) - key: - - location: SourceLocation(pos=167, lineno=8, colno=9) - end_location: SourceLocation(pos=175, lineno=8, colno=17) - value: 'target' - value: - - location: SourceLocation(pos=177, lineno=8, colno=19) - end_location: SourceLocation(pos=183, lineno=8, colno=25) - value: 'this' - - location: SourceLocation(pos=193, lineno=9, colno=9) - end_location: SourceLocation(pos=210, lineno=9, colno=26) - key: - - location: SourceLocation(pos=193, lineno=9, colno=9) - end_location: SourceLocation(pos=200, lineno=9, colno=16) - value: 'score' - value: - - location: SourceLocation(pos=202, lineno=9, colno=18) - end_location: SourceLocation(pos=210, lineno=9, colno=26) - value: 'score2' - - location: SourceLocation(pos=220, lineno=10, colno=9) - end_location: SourceLocation(pos=230, lineno=10, colno=19) - key: - - location: SourceLocation(pos=220, lineno=10, colno=9) - end_location: SourceLocation(pos=227, lineno=10, colno=16) - value: 'scale' - value: - - location: SourceLocation(pos=229, lineno=10, colno=18) - end_location: SourceLocation(pos=230, lineno=10, colno=19) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_95__1.txt b/packages/mecha/tests/snapshots/bolt__parse_95__1.txt deleted file mode 100644 index 9cd4b2b6f..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_95__1.txt +++ /dev/null @@ -1,34 +0,0 @@ -_mecha_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var19: - _mecha_var0 = 'condition' - _mecha_var1 = 'minecraft:entity_scores' - _mecha_var2 = 'entity' - _mecha_var3 = 'this' - _mecha_var4 = 'scores' - _mecha_var5 = 'score1' - _mecha_var6 = 'min' - _mecha_var7 = 'type' - _mecha_var8 = 'minecraft:score' - _mecha_var9 = 'target' - _mecha_var10 = 'this' - _mecha_var11 = 'score' - _mecha_var12 = 'score2' - _mecha_var13 = 'scale' - _mecha_var14 = 1 - _mecha_var15 = {_mecha_var7: _mecha_var8, _mecha_var9: _mecha_var10, _mecha_var11: _mecha_var12, _mecha_var13: _mecha_var14} - _mecha_var16 = {_mecha_var6: _mecha_var15} - _mecha_var17 = {_mecha_var5: _mecha_var16} - _mecha_var18 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3, _mecha_var4: _mecha_var17} - my_predicate = _mecha_var18 -_mecha_var20 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var19)) ---- -output = _mecha_var20 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=251, lineno=15, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_96__0.txt b/packages/mecha/tests/snapshots/bolt__parse_96__0.txt deleted file mode 100644 index 1f145fc30..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_96__0.txt +++ /dev/null @@ -1,156 +0,0 @@ -my_predicate = { - condition: "minecraft:entity_scores", - entity: "this", - scores: { - score1: { - "min": { - "type": "minecraft:score", - target: "this", - score: "score2", - scale: 1 - } - } - } -} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=237, lineno=15, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=236, lineno=14, colno=2) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=236, lineno=14, colno=2) - operator: '=' - target: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=12, lineno=1, colno=13) - value: 'my_predicate' - rebind: False - value: - - location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=236, lineno=14, colno=2) - items: - - location: SourceLocation(pos=19, lineno=2, colno=3) - end_location: SourceLocation(pos=55, lineno=2, colno=39) - key: - - location: SourceLocation(pos=19, lineno=2, colno=3) - end_location: SourceLocation(pos=28, lineno=2, colno=12) - value: 'condition' - value: - - location: SourceLocation(pos=30, lineno=2, colno=14) - end_location: SourceLocation(pos=55, lineno=2, colno=39) - value: 'minecraft:entity_scores' - - location: SourceLocation(pos=59, lineno=3, colno=3) - end_location: SourceLocation(pos=73, lineno=3, colno=17) - key: - - location: SourceLocation(pos=59, lineno=3, colno=3) - end_location: SourceLocation(pos=65, lineno=3, colno=9) - value: 'entity' - value: - - location: SourceLocation(pos=67, lineno=3, colno=11) - end_location: SourceLocation(pos=73, lineno=3, colno=17) - value: 'this' - - location: SourceLocation(pos=77, lineno=4, colno=3) - end_location: SourceLocation(pos=234, lineno=13, colno=4) - key: - - location: SourceLocation(pos=77, lineno=4, colno=3) - end_location: SourceLocation(pos=83, lineno=4, colno=9) - value: 'scores' - value: - - location: SourceLocation(pos=85, lineno=4, colno=11) - end_location: SourceLocation(pos=234, lineno=13, colno=4) - items: - - location: SourceLocation(pos=91, lineno=5, colno=5) - end_location: SourceLocation(pos=230, lineno=12, colno=6) - key: - - location: SourceLocation(pos=91, lineno=5, colno=5) - end_location: SourceLocation(pos=97, lineno=5, colno=11) - value: 'score1' - value: - - location: SourceLocation(pos=99, lineno=5, colno=13) - end_location: SourceLocation(pos=230, lineno=12, colno=6) - items: - - location: SourceLocation(pos=107, lineno=6, colno=7) - end_location: SourceLocation(pos=224, lineno=11, colno=8) - key: - - location: SourceLocation(pos=107, lineno=6, colno=7) - end_location: SourceLocation(pos=112, lineno=6, colno=12) - value: 'min' - value: - - location: SourceLocation(pos=114, lineno=6, colno=14) - end_location: SourceLocation(pos=224, lineno=11, colno=8) - items: - - location: SourceLocation(pos=124, lineno=7, colno=9) - end_location: SourceLocation(pos=149, lineno=7, colno=34) - key: - - location: SourceLocation(pos=124, lineno=7, colno=9) - end_location: SourceLocation(pos=130, lineno=7, colno=15) - value: 'type' - value: - - location: SourceLocation(pos=132, lineno=7, colno=17) - end_location: SourceLocation(pos=149, lineno=7, colno=34) - value: 'minecraft:score' - - location: SourceLocation(pos=159, lineno=8, colno=9) - end_location: SourceLocation(pos=173, lineno=8, colno=23) - key: - - location: SourceLocation(pos=159, lineno=8, colno=9) - end_location: SourceLocation(pos=165, lineno=8, colno=15) - value: 'target' - value: - - location: SourceLocation(pos=167, lineno=8, colno=17) - end_location: SourceLocation(pos=173, lineno=8, colno=23) - value: 'this' - - location: SourceLocation(pos=183, lineno=9, colno=9) - end_location: SourceLocation(pos=198, lineno=9, colno=24) - key: - - location: SourceLocation(pos=183, lineno=9, colno=9) - end_location: SourceLocation(pos=188, lineno=9, colno=14) - value: 'score' - value: - - location: SourceLocation(pos=190, lineno=9, colno=16) - end_location: SourceLocation(pos=198, lineno=9, colno=24) - value: 'score2' - - location: SourceLocation(pos=208, lineno=10, colno=9) - end_location: SourceLocation(pos=216, lineno=10, colno=17) - key: - - location: SourceLocation(pos=208, lineno=10, colno=9) - end_location: SourceLocation(pos=213, lineno=10, colno=14) - value: 'scale' - value: - - location: SourceLocation(pos=215, lineno=10, colno=16) - end_location: SourceLocation(pos=216, lineno=10, colno=17) - value: 1 diff --git a/packages/mecha/tests/snapshots/bolt__parse_96__1.txt b/packages/mecha/tests/snapshots/bolt__parse_96__1.txt deleted file mode 100644 index 0dad714c1..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_96__1.txt +++ /dev/null @@ -1,34 +0,0 @@ -_mecha_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var19: - _mecha_var0 = 'condition' - _mecha_var1 = 'minecraft:entity_scores' - _mecha_var2 = 'entity' - _mecha_var3 = 'this' - _mecha_var4 = 'scores' - _mecha_var5 = 'score1' - _mecha_var6 = 'min' - _mecha_var7 = 'type' - _mecha_var8 = 'minecraft:score' - _mecha_var9 = 'target' - _mecha_var10 = 'this' - _mecha_var11 = 'score' - _mecha_var12 = 'score2' - _mecha_var13 = 'scale' - _mecha_var14 = 1 - _mecha_var15 = {_mecha_var7: _mecha_var8, _mecha_var9: _mecha_var10, _mecha_var11: _mecha_var12, _mecha_var13: _mecha_var14} - _mecha_var16 = {_mecha_var6: _mecha_var15} - _mecha_var17 = {_mecha_var5: _mecha_var16} - _mecha_var18 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3, _mecha_var4: _mecha_var17} - my_predicate = _mecha_var18 -_mecha_var20 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var19)) ---- -output = _mecha_var20 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=237, lineno=15, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_97__0.txt b/packages/mecha/tests/snapshots/bolt__parse_97__0.txt deleted file mode 100644 index 89ca9f2bd..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_97__0.txt +++ /dev/null @@ -1,83 +0,0 @@ -def f(): - return {f(): f(), other: [{}, {}, "wat"]} ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=46) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=46) - identifier: 'def:function:body' - arguments: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - name: 'f' - arguments: - - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=54, lineno=2, colno=46) - commands: - - location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=54, lineno=2, colno=46) - identifier: 'return:value' - arguments: - - location: SourceLocation(pos=20, lineno=2, colno=12) - end_location: SourceLocation(pos=54, lineno=2, colno=46) - items: - - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=29, lineno=2, colno=21) - key: - - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=24, lineno=2, colno=16) - value: - - location: SourceLocation(pos=21, lineno=2, colno=13) - end_location: SourceLocation(pos=22, lineno=2, colno=14) - value: 'f' - arguments: - - value: - - location: SourceLocation(pos=26, lineno=2, colno=18) - end_location: SourceLocation(pos=29, lineno=2, colno=21) - value: - - location: SourceLocation(pos=26, lineno=2, colno=18) - end_location: SourceLocation(pos=27, lineno=2, colno=19) - value: 'f' - arguments: - - - location: SourceLocation(pos=31, lineno=2, colno=23) - end_location: SourceLocation(pos=53, lineno=2, colno=45) - key: - - location: SourceLocation(pos=31, lineno=2, colno=23) - end_location: SourceLocation(pos=36, lineno=2, colno=28) - value: 'other' - value: - - location: SourceLocation(pos=38, lineno=2, colno=30) - end_location: SourceLocation(pos=53, lineno=2, colno=45) - items: - - location: SourceLocation(pos=39, lineno=2, colno=31) - end_location: SourceLocation(pos=41, lineno=2, colno=33) - items: - - - location: SourceLocation(pos=43, lineno=2, colno=35) - end_location: SourceLocation(pos=45, lineno=2, colno=37) - items: - - - location: SourceLocation(pos=47, lineno=2, colno=39) - end_location: SourceLocation(pos=52, lineno=2, colno=44) - value: 'wat' diff --git a/packages/mecha/tests/snapshots/bolt__parse_97__1.txt b/packages/mecha/tests/snapshots/bolt__parse_97__1.txt deleted file mode 100644 index 5fd46d00b..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_97__1.txt +++ /dev/null @@ -1,26 +0,0 @@ -_mecha_lineno = [1, 6], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: - def f(): - _mecha_var0 = f - _mecha_var0 = _mecha_var0() - _mecha_var1 = f - _mecha_var1 = _mecha_var1() - _mecha_var2 = 'other' - _mecha_var3 = {} - _mecha_var4 = {} - _mecha_var5 = 'wat' - _mecha_var6 = [_mecha_var3, _mecha_var4, _mecha_var5] - _mecha_var7 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var6} - return _mecha_var7 -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) ---- -output = _mecha_var9 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=46) - commands: - diff --git a/packages/mecha/tests/snapshots/bolt__parse_98__0.txt b/packages/mecha/tests/snapshots/bolt__parse_98__0.txt deleted file mode 100644 index 21de2a29e..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_98__0.txt +++ /dev/null @@ -1,8 +0,0 @@ -#>ERROR Can't inline conditions as execute subcommands. -# line 1, column 7 -# 1 | at @s if "foo" == "bar": -# : ^^^^^^^^^^^^^^^^^^ -# 2 | say yolo -# : ^^^^^^^^ -at @s if "foo" == "bar": - say yolo diff --git a/packages/mecha/tests/snapshots/bolt__parse_99__0.txt b/packages/mecha/tests/snapshots/bolt__parse_99__0.txt deleted file mode 100644 index fc6c39b78..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_99__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'for'. -# line 1, column 7 -# 1 | at @s for i in "foo": -# : ^^^ -# 2 | say yolo -at @s for i in "foo": - say yolo diff --git a/packages/mecha/tests/snapshots/bolt__parse_9__0.txt b/packages/mecha/tests/snapshots/bolt__parse_9__0.txt deleted file mode 100644 index 3171b1f0a..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_9__0.txt +++ /dev/null @@ -1,30 +0,0 @@ -2 + -54 ---- - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=2, colno=1) - commands: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - identifier: 'statement' - arguments: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '+' - left: - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=1, lineno=1, colno=2) - value: 2 - right: - - location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - operator: '-' - value: - - location: SourceLocation(pos=5, lineno=1, colno=6) - end_location: SourceLocation(pos=7, lineno=1, colno=8) - value: 54 diff --git a/packages/mecha/tests/snapshots/bolt__parse_9__1.txt b/packages/mecha/tests/snapshots/bolt__parse_9__1.txt deleted file mode 100644 index a9d6a0af8..000000000 --- a/packages/mecha/tests/snapshots/bolt__parse_9__1.txt +++ /dev/null @@ -1,18 +0,0 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 2 - _mecha_var1 = 54 - _mecha_var1 = - _mecha_var1 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) ---- -output = _mecha_var3 ---- -_mecha_refs[0] - - location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8, lineno=2, colno=1) - commands: - diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md deleted file mode 100644 index 1be3cb6a3..000000000 --- a/packages/mecha/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ /dev/null @@ -1,642 +0,0 @@ -# Lectern snapshot - -## Data pack - -`@data_pack pack.mcmeta` - -```json -{ - "pack": { - "pack_format": 9, - "description": "" - } -} -``` - -### demo - -`@function demo:foo` - -```mcfunction -say hello -say this is a function file augmented with mecha -execute if score @s tmp matches 1.. as @a run function demo:foo/nested_execute_0 -say You can make functions -tellraw @a ["", {"text": "yep"}] -say and return values -say 13 -say 21 -say 34 -say Unlike in python default params are evaluated when the function is called -say 12 -say 144 -say {'number': 12, 'result': 144} -say this is basically a custom subset of python -say functions are first-class objects just like in python -say AAA -say BBB -say CCC -say just once -execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '{"text": "Hello", "bold": true}'}} -say (1, 2, 3, 4) -say (1, 2, 3, 4) -say ((1, 2, 3, 4),) -say f-strings 'WORK' too \ -say {{{00000007}\}"} -execute if score @s tmp matches 8.. run say wat -execute if score @s tmp matches 8.. run say wat -item replace entity @a hotbar.0 from entity @s hotbar.0 -item replace entity @a hotbar.1 from entity @s hotbar.1 -item replace entity @a hotbar.2 from entity @s hotbar.2 -item replace entity @a hotbar.3 from entity @s hotbar.3 -item replace entity @a hotbar.4 from entity @s hotbar.4 -item replace entity @a hotbar.5 from entity @s hotbar.5 -item replace entity @a hotbar.6 from entity @s hotbar.6 -item replace entity @a hotbar.7 from entity @s hotbar.7 -item replace entity @a hotbar.8 from entity @s hotbar.8 -item replace entity @a inventory.0 from entity @s inventory.0 -item replace entity @a inventory.1 from entity @s inventory.1 -item replace entity @a inventory.2 from entity @s inventory.2 -item replace entity @a inventory.3 from entity @s inventory.3 -item replace entity @a inventory.4 from entity @s inventory.4 -item replace entity @a inventory.5 from entity @s inventory.5 -item replace entity @a inventory.6 from entity @s inventory.6 -item replace entity @a inventory.7 from entity @s inventory.7 -item replace entity @a inventory.8 from entity @s inventory.8 -item replace entity @a inventory.9 from entity @s inventory.9 -item replace entity @a inventory.10 from entity @s inventory.10 -item replace entity @a inventory.11 from entity @s inventory.11 -item replace entity @a inventory.12 from entity @s inventory.12 -item replace entity @a inventory.13 from entity @s inventory.13 -item replace entity @a inventory.14 from entity @s inventory.14 -item replace entity @a inventory.15 from entity @s inventory.15 -item replace entity @a inventory.16 from entity @s inventory.16 -item replace entity @a inventory.17 from entity @s inventory.17 -item replace entity @a inventory.18 from entity @s inventory.18 -item replace entity @a inventory.19 from entity @s inventory.19 -item replace entity @a inventory.20 from entity @s inventory.20 -item replace entity @a inventory.21 from entity @s inventory.21 -item replace entity @a inventory.22 from entity @s inventory.22 -item replace entity @a inventory.23 from entity @s inventory.23 -item replace entity @a inventory.24 from entity @s inventory.24 -item replace entity @a inventory.25 from entity @s inventory.25 -say 1 -say 2 -say 3 -say [1, 2, 3, 1, 2, 3] -say bolt_basic.hello -say -1.0 -say True -say 0.0 -say True -say other -say done -say 1 -say done -say 2 -say done -say 3 -say done -say other -say done -say other -say done -execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run function demo:abc -execute if predicate foo:bar run function demo:xyz -execute if score @s thingy matches 0..7 run function demo:foo/tree_0/0_7 -execute if score @s thingy matches 8..14 run function demo:foo/tree_0/8_14 -execute if score @s thingy matches 15..21 run function demo:foo/tree_0/15_21 -execute if score @s thingy matches 22..28 run function demo:foo/tree_0/22_28 -execute if score @s thingy matches 29..35 run function demo:foo/tree_0/29_35 -data modify entity @e[type=armor_stand, limit=1] NoBasePlate set value 1b -execute if score @s loop_again matches 1 run function demo:foo -setblock 1 2 3 stone -setblock 1 2 3 stone -execute if block ^ ^1 ^ #planks run say 42 -execute if block ~ ~ ~ #planks run say 42 -say {'foo': 1, 'bar': 2, 'thing': 42} -execute if score @s thingy matches 0..3 run function demo:foo/small_tree/0_3 -execute if score @s thingy matches 4..7 run function demo:foo/small_tree/4_7 -say {1: 1, 'a': 'a', 'b': 'thing', 'c': 'c', 2: 2} -say {1: {2: 'foo'}} -execute if score @s thingy matches 10..14 run function demo:foo/tree_1/10_14 -execute if score @s thingy matches 15..19 run function demo:foo/tree_1/15_19 -scoreboard objectives setdisplay list some_score_name -scoreboard objectives setdisplay sidebar.team.red some_score_name -item replace entity @s weapon.offhand from entity @s weapon.mainhand -item replace entity @s weapon.offhand from entity @s weapon.mainhand -say [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] -say [3, 4, 5, 6, 7, 8, 9, 10, 11] -say [0, 1, 2, 3, 4, 5, 6, 7, 8] -say [3, 4, 5, 6, 7, 8] -say [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] -say [3, 4, 5, 6, 7, 8, 9, 10, 11] -say [0, 1, 2, 3, 4, 5, 6, 7, 8] -say [3, 4, 5, 6, 7, 8] -say [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] -say [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] -say [11, 10, 9, 8, 7, 6, 5, 4] -say [9, 8, 7, 6, 5, 4] -execute at @s if block ~ ~ ~ #minecraft:beds run teleport @s ~ ~0.5625 ~ -say [0, 1, 2] -say ==[a]== -say True -say None -say b -say True -say False -say foo -say ==[b]== -say True -say a -say c -say False -say False -say bar -say ==[c]== -say True -say b -say d -say False -say False -say foo -say ==[d]== -say True -say c -say None -say False -say True -say bar -say hello!!!!! -function demo:bbb -execute if data storage some:path/to/storage some.foo.path -execute if data storage some:path/to/storage some.foo.path run say hi -execute if data storage some:path/to/storage some.foo.path{my: "compound"} -execute if data storage some:path/to/storage some.foo.path{my: "compound"} run say hi -execute if data storage some:path/to/storage some.bar.path -execute if data storage some:path/to/storage some.bar.path run say hi -execute if data storage some:path/to/storage some.bar.path{my: "compound"} -execute if data storage some:path/to/storage some.bar.path{my: "compound"} run say hi -execute if data storage some:path/to/storage some.bar.path[{my: "subscript"}] -execute if data storage some:path/to/storage some.bar.path[{my: "subscript"}] run say hi -execute if data storage some:path/to/storage some.foo.path{my: "compound"}.stuff[42].beep.bar[{my: "subscript"}].boop run say hi -execute if data storage some:path/to/storage foo.bar -execute if data storage some:path/to/storage "some.foo.path" -execute if data storage some:path/to/storage something.cool[3].foo -execute if score some_fake_player some_objective matches 0 run say yes -execute if score 00000000-0000-0000-0000-000000000001 some_objective matches 0 run say yes -execute if score 12345678-1234-5678-1234-567812345678 some_objective matches 0 run say yes -execute at @e[type=creeper] run summon lightning_bolt -data merge storage demo:foo {custom_data1: [0, 1, 2], custom_data2: [0, 1, 2]} -setblock 0 0 0 minecraft:stone -say same thing -tellraw @a {"text": "hello world"} -execute at @s run particle minecraft:dust 0 1 1 0.9 ~ ~1 ~ 0 0 0 0.01 1 force -execute at @s run particle minecraft:block yellow_concrete ~ ~1.62 ~ 0 0.4 0 0 30 force -execute at @s run particle minecraft:block minecraft:light_blue_concrete ~ ~1 ~ 0.05 0.1 0.05 0 3 -execute as @a[scores={foo=1..}] run scoreboard players remove @s foo 1 -execute as @a[scores={bar=1..}] run scoreboard players remove @s bar 1 -scoreboard players set @p tmp -8 -tp @s ~12 ~23 ~34 -tp @s ~12 23 ~34 -tp @s 12 23 34 -tp @s ~12 ~23 ~34 -tp @s ^12 ^23 ^34 -tp @s -12 -23 -34 -tp @s ~-12 ~-23 ~-34 -tp @s ^-12 ^-23 ^-34 -say 0 a -say 1 b -say 2 c -say 1 -say 2 -say 3 -execute if block ~ ~6 ~ air if block ~ ~5 ~ air if block ~ ~4 ~ air if block ~ ~3 ~ air if block ~ ~2 ~ air if block ~ ~1 ~ air run say nothing above! -say 0 -say 1 -say bolt implements a __rebind__(rhs) magic method that gets called when you reassign a value to a variable -say let's try it out by manually building a class -scoreboard players set a global 123 -scoreboard players set a global 456 -scoreboard players set b global 789 -scoreboard players operation b global = a global -scoreboard players operation bolt_basic.tmp.0 global = b global -scoreboard players add bolt_basic.tmp.0 global 6 -scoreboard players operation bolt_basic.tmp.1 global = bolt_basic.tmp.0 global -scoreboard players operation bolt_basic.tmp.1 global += a global -scoreboard players operation a global += bolt_basic.tmp.1 global -scoreboard players add b global 1 -say you can use nonlocal to create fake classes -say 1 -say 2 -say 10 -execute if score #temp abc matches 1.. run say foo -execute as @p run function #demo:yolo_funcs -say [False, False, True, False, False, False, True, False, False, False, True, False, True, True, True, True] -say hello -say hello -say hello -say hello -say thing == 1 -say thing == 2 -say thing == 3 -say thing == 99 -say thing == hello -say thing == world -execute if score @s foo matches 1 run function demo:foo/nested_execute_1 -execute if score @s foo matches 0 run say no -scoreboard players operation global bolt_basic.tmp0 = global is_cool -execute unless score global is_cool matches 0 run scoreboard players operation global bolt_basic.tmp0 = global is_nice -scoreboard players operation global is_awesome = global bolt_basic.tmp0 -scoreboard players set global bolt_basic.tmp1 1 -execute unless score global is_awesome matches 0 run scoreboard players set global bolt_basic.tmp1 0 -scoreboard players operation global bolt_basic.tmp2 = global is_awesome -execute unless score global bolt_basic.tmp1 matches 0 run scoreboard players operation global bolt_basic.tmp2 = global force_awesomeness -execute unless score global bolt_basic.tmp2 matches 0 run say hello -say this is from demo:utils -``` - -`@function demo:import_a` - -```mcfunction -say demo:import_b -say demo:import_a -say 84 -``` - -`@function demo:import_b` - -```mcfunction -say demo:import_a -say demo:import_b -say 14 -``` - -`@function(strip_final_newline) demo:thing` - -```mcfunction - -``` - -`@function demo:utils` - -```mcfunction -say this doesn't conflict with the demo:utils module -``` - -`@function demo:foo/nested_execute_0` - -```mcfunction -say multiline is automatically enabled -say nesting is automatically enabled -say implicit execute is automatically enabled -say relative location is automatically enabled -say ABCABCABCABCABC -``` - -`@function demo:abc` - -```mcfunction -say foo -say bar -``` - -`@function demo:xyz` - -```mcfunction -say foo -say bar -``` - -`@function demo:bbb` - -```mcfunction -say 0 -say 1 -say 2 -``` - -`@function demo:foo/nested_execute_1` - -```mcfunction -say yes -execute if score @s bar matches 1 run say with bar -``` - -`@function demo:foo/tree_0/0_7` - -```mcfunction -execute if score @s thingy matches ..1 run function demo:foo/tree_0/0_1 -execute if score @s thingy matches 2..3 run function demo:foo/tree_0/2_3 -execute if score @s thingy matches 4..5 run function demo:foo/tree_0/4_5 -execute if score @s thingy matches 6 run say g -execute if score @s thingy matches 7 run say h -``` - -`@function demo:foo/tree_0/0_1` - -```mcfunction -execute if score @s thingy matches 0 run say a -execute if score @s thingy matches 1 run say b -``` - -`@function demo:foo/tree_0/2_3` - -```mcfunction -execute if score @s thingy matches 2 run say c -execute if score @s thingy matches 3 run say d -``` - -`@function demo:foo/tree_0/4_5` - -```mcfunction -execute if score @s thingy matches 4 run say e -execute if score @s thingy matches 5 run say f -``` - -`@function demo:foo/tree_0/8_14` - -```mcfunction -execute if score @s thingy matches ..9 run function demo:foo/tree_0/8_9 -execute if score @s thingy matches 10..11 run function demo:foo/tree_0/10_11 -execute if score @s thingy matches 12 run say m -execute if score @s thingy matches 13 run say n -execute if score @s thingy matches 14 run say o -``` - -`@function demo:foo/tree_0/8_9` - -```mcfunction -execute if score @s thingy matches 8 run say i -execute if score @s thingy matches 9 run say j -``` - -`@function demo:foo/tree_0/10_11` - -```mcfunction -execute if score @s thingy matches 10 run say k -execute if score @s thingy matches 11 run say l -``` - -`@function demo:foo/tree_0/15_21` - -```mcfunction -execute if score @s thingy matches ..16 run function demo:foo/tree_0/15_16 -execute if score @s thingy matches 17..18 run function demo:foo/tree_0/17_18 -execute if score @s thingy matches 19 run say t -execute if score @s thingy matches 20 run say u -execute if score @s thingy matches 21 run say v -``` - -`@function demo:foo/tree_0/15_16` - -```mcfunction -execute if score @s thingy matches 15 run say p -execute if score @s thingy matches 16 run say q -``` - -`@function demo:foo/tree_0/17_18` - -```mcfunction -execute if score @s thingy matches 17 run say r -execute if score @s thingy matches 18 run say s -``` - -`@function demo:foo/tree_0/22_28` - -```mcfunction -execute if score @s thingy matches ..23 run function demo:foo/tree_0/22_23 -execute if score @s thingy matches 24..25 run function demo:foo/tree_0/24_25 -execute if score @s thingy matches 26 run say 0 -execute if score @s thingy matches 27 run say 1 -execute if score @s thingy matches 28 run say 2 -``` - -`@function demo:foo/tree_0/22_23` - -```mcfunction -execute if score @s thingy matches 22 run say w -execute if score @s thingy matches 23 run say x -``` - -`@function demo:foo/tree_0/24_25` - -```mcfunction -execute if score @s thingy matches 24 run say y -execute if score @s thingy matches 25 run say z -``` - -`@function demo:foo/tree_0/29_35` - -```mcfunction -execute if score @s thingy matches ..30 run function demo:foo/tree_0/29_30 -execute if score @s thingy matches 31..32 run function demo:foo/tree_0/31_32 -execute if score @s thingy matches 33 run say 7 -execute if score @s thingy matches 34 run say 8 -execute if score @s thingy matches 35 run say 9 -``` - -`@function demo:foo/tree_0/29_30` - -```mcfunction -execute if score @s thingy matches 29 run say 3 -execute if score @s thingy matches 30 run say 4 -``` - -`@function demo:foo/tree_0/31_32` - -```mcfunction -execute if score @s thingy matches 31 run say 5 -execute if score @s thingy matches 32 run say 6 -``` - -`@function demo:foo/small_tree/0_3` - -```mcfunction -execute if score @s thingy matches ..1 run function demo:foo/small_tree/0_1 -execute if score @s thingy matches 2.. run function demo:foo/small_tree/2_3 -``` - -`@function demo:foo/small_tree/0_1` - -```mcfunction -execute if score @s thingy matches 0 run say 0 -execute if score @s thingy matches 1 run say 1 -``` - -`@function demo:foo/small_tree/2_3` - -```mcfunction -execute if score @s thingy matches 2 run say 2 -execute if score @s thingy matches 3 run say 3 -``` - -`@function demo:foo/small_tree/4_7` - -```mcfunction -execute if score @s thingy matches ..5 run function demo:foo/small_tree/4_5 -execute if score @s thingy matches 6.. run function demo:foo/small_tree/6_7 -``` - -`@function demo:foo/small_tree/4_5` - -```mcfunction -execute if score @s thingy matches 4 run say 4 -execute if score @s thingy matches 5 run say 5 -``` - -`@function demo:foo/small_tree/6_7` - -```mcfunction -execute if score @s thingy matches 6 run say 6 -execute if score @s thingy matches 7 run say 7 -``` - -`@function demo:foo/tree_1/10_14` - -```mcfunction -execute if score @s thingy matches ..12 run function demo:foo/tree_1/10_12 -execute if score @s thingy matches 13.. run function demo:foo/tree_1/13_14 -``` - -`@function demo:foo/tree_1/10_12` - -```mcfunction -execute if score @s thingy matches ..11 run function demo:foo/tree_1/10_11 -execute if score @s thingy matches 12 run say 12 -``` - -`@function demo:foo/tree_1/10_11` - -```mcfunction -execute if score @s thingy matches 10 run say 10 -execute if score @s thingy matches 11 run say 11 -``` - -`@function demo:foo/tree_1/13_14` - -```mcfunction -execute if score @s thingy matches 13 run say 13 -execute if score @s thingy matches 14 run say 14 -``` - -`@function demo:foo/tree_1/15_19` - -```mcfunction -execute if score @s thingy matches ..17 run function demo:foo/tree_1/15_17 -execute if score @s thingy matches 18.. run function demo:foo/tree_1/18_19 -``` - -`@function demo:foo/tree_1/15_17` - -```mcfunction -execute if score @s thingy matches ..16 run function demo:foo/tree_1/15_16 -execute if score @s thingy matches 17 run say 17 -``` - -`@function demo:foo/tree_1/15_16` - -```mcfunction -execute if score @s thingy matches 15 run say 15 -execute if score @s thingy matches 16 run say 16 -``` - -`@function demo:foo/tree_1/18_19` - -```mcfunction -execute if score @s thingy matches 18 run say 18 -execute if score @s thingy matches 19 run say 19 -``` - -`@function demo:no_quotes_lol` - -```mcfunction -say that's neat -``` - -`@function_tag demo:yolo_funcs` - -```json -{ - "values": [ - "demo:foo" - ] -} -``` - -`@predicate demo:check_scores` - -```json -[ - { - "condition": "minecraft:entity_scores", - "entity": "this", - "scores": { - "foo": 1 - } - }, - { - "condition": "minecraft:entity_scores", - "entity": "killer_player", - "scores": { - "bar": 1 - } - } -] -``` - -### felix - -`@function_tag felix:howdy` - -```json -{ - "values": [ - "demo:foo", - "demo:foo" - ] -} -``` - -## Resource pack - -`@resource_pack pack.mcmeta` - -```json -{ - "pack": { - "pack_format": 8, - "description": "" - } -} -``` - -### minecraft - -`@language minecraft:aaaa` - -```json -{ - "menu.singleplayer": "AAAA", - "something.else": "bonjour", - "yaml.key1": "BONJOUR", - "yaml.key2": "Bonjour" -} -``` - -`@particle minecraft:end_rod` - -```json -{ - "textures": [ - "minecraft:glitter_7", - "minecraft:glitter_6", - "minecraft:glitter_5", - "minecraft:glitter_4", - "minecraft:glitter_3", - "minecraft:glitter_2", - "minecraft:glitter_1", - "minecraft:glitter_0" - ] -} -``` diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_generated__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_generated__0.pack.md deleted file mode 100644 index a9fc9a91a..000000000 --- a/packages/mecha/tests/snapshots/examples__build_bolt_generated__0.pack.md +++ /dev/null @@ -1,35 +0,0 @@ -# Lectern snapshot - -## Data pack - -`@data_pack pack.mcmeta` - -```json -{ - "pack": { - "pack_format": 9, - "description": "" - } -} -``` - -### demo - -`@function demo:foo` - -```mcfunction -say 123 -``` - -`@function demo:generated` - -```mcfunction -execute if score #smithed.core load.status matches 1 run function demo:0 -``` - -`@function demo:0` - -```mcfunction -data merge storage smithed:log {message: '["Could not find ",{"text":"#smithed.prevent_aggression 0.0.1","color":"red"}]', type: "ERROR"} -function #smithed:core/pub/technical/tools/log -``` diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_merge__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_merge__0.pack.md deleted file mode 100644 index cfb90a622..000000000 --- a/packages/mecha/tests/snapshots/examples__build_bolt_merge__0.pack.md +++ /dev/null @@ -1,36 +0,0 @@ -# Lectern snapshot - -## Data pack - -`@data_pack pack.mcmeta` - -```json -{ - "pack": { - "pack_format": 9, - "description": "" - } -} -``` - -### pack_1 - -`@function pack_1:bob` - -```mcfunction -say Hello, Bob! -``` - -`@function pack_1:utils` - -```mcfunction -say Hello, Alice! -``` - -### pack_2 - -`@function pack_2:carol` - -```mcfunction -say Hello, Carol! -``` diff --git a/packages/mecha/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md b/packages/mecha/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md deleted file mode 100644 index 9b3620f61..000000000 --- a/packages/mecha/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md +++ /dev/null @@ -1,22 +0,0 @@ -# Lectern snapshot - -## Data pack - -`@data_pack pack.mcmeta` - -```json -{ - "pack": { - "pack_format": 9, - "description": "" - } -} -``` - -### demo - -`@function demo:foo` - -```mcfunction -say (1, 2, 3) -``` diff --git a/packages/mecha/tests/snapshots/sandbox__run_0__0.txt b/packages/mecha/tests/snapshots/sandbox__run_0__0.txt deleted file mode 100644 index d3d741755..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_0__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -import sys ---- -Traceback (most recent call last): - File "demo:foo", line 1, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden module 'sys'. diff --git a/packages/mecha/tests/snapshots/sandbox__run_1__0.txt b/packages/mecha/tests/snapshots/sandbox__run_1__0.txt deleted file mode 100644 index a0644af1e..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_1__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -def f(): - pass -f.__code__ ---- -Traceback (most recent call last): - File "demo:foo", line 3, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden attribute '__code__' of . diff --git a/packages/mecha/tests/snapshots/sandbox__run_2__0.txt b/packages/mecha/tests/snapshots/sandbox__run_2__0.txt deleted file mode 100644 index 9f7578331..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_2__0.txt +++ /dev/null @@ -1,7 +0,0 @@ -def hello(): - return "world" -say hello.__name__.capitalize() ---- -Traceback (most recent call last): - File "demo:foo", line 3, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden attribute '__name__' of . diff --git a/packages/mecha/tests/snapshots/sandbox__run_3__0.txt b/packages/mecha/tests/snapshots/sandbox__run_3__0.txt deleted file mode 100644 index 0a15d53e9..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_3__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -say ctx.project_id ---- -Traceback (most recent call last): - File "demo:foo", line 1, in demo:foo -AttributeError: 'NoneType' object has no attribute 'project_id' diff --git a/packages/mecha/tests/snapshots/sandbox__run_4__0.txt b/packages/mecha/tests/snapshots/sandbox__run_4__0.txt deleted file mode 100644 index d0c2c5ff2..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_4__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -print(f'foo {str.__name__} bar') ---- -Traceback (most recent call last): - File "demo:foo", line 1, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden attribute '__name__' of . diff --git a/packages/mecha/tests/snapshots/sandbox__run_5__0.txt b/packages/mecha/tests/snapshots/sandbox__run_5__0.txt deleted file mode 100644 index 8695e1adf..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_5__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -"a{0.__class__}b".format(42) ---- -Traceback (most recent call last): - File "demo:foo", line 1, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden attribute 'format' of . diff --git a/packages/mecha/tests/snapshots/sandbox__run_6__0.txt b/packages/mecha/tests/snapshots/sandbox__run_6__0.txt deleted file mode 100644 index d81085b99..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_6__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -foo = "a{x.__class__}b".format_map({"x":42}) ---- -Traceback (most recent call last): - File "demo:foo", line 1, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden attribute 'format_map' of . diff --git a/packages/mecha/tests/snapshots/sandbox__run_7__0.txt b/packages/mecha/tests/snapshots/sandbox__run_7__0.txt deleted file mode 100644 index 82dd8e853..000000000 --- a/packages/mecha/tests/snapshots/sandbox__run_7__0.txt +++ /dev/null @@ -1,5 +0,0 @@ -say __name__.format() ---- -Traceback (most recent call last): - File "demo:foo", line 1, in demo:foo -mecha.contrib.bolt_sandbox.SecurityError: Access forbidden attribute 'format' of . diff --git a/packages/mecha/tests/test_bolt.py b/packages/mecha/tests/test_bolt.py deleted file mode 100644 index 8e79c5259..000000000 --- a/packages/mecha/tests/test_bolt.py +++ /dev/null @@ -1,54 +0,0 @@ -from pathlib import Path - -import pytest -from beet import Context, Function, run_beet -from pytest_insta import SnapshotFixture - -from mecha import AstNode, CompilationDatabase, CompilationUnit, DiagnosticError, Mecha -from mecha.contrib.annotate_diagnostics import annotate_diagnostics -from mecha.contrib.bolt import Runtime - -BOLT_EXAMPLES = [ - Function(source) - for source in Path("tests/resources/bolt_examples.mcfunction") - .read_text() - .split("###\n") -] - - -@pytest.fixture(scope="session") -def ctx_bolt(): - with run_beet({"require": ["mecha.contrib.bolt"]}) as ctx: - yield ctx - - -@pytest.mark.parametrize( - "source", - params := BOLT_EXAMPLES, - ids=range(len(params)), -) -def test_parse(snapshot: SnapshotFixture, ctx_bolt: Context, source: Function): - mc = ctx_bolt.inject(Mecha) - runtime = ctx_bolt.inject(Runtime) - - ast = None - diagnostics = None - - try: - ast = mc.parse(source) - except DiagnosticError as exc: - diagnostics = exc.diagnostics - - if ast: - assert snapshot() == f"{source.text}---\n{ast.dump()}\n" - text, output, refs = runtime.codegen(ast) - text = text or "# Nothing\n" - assert snapshot() == f"{text}---\noutput = {output}\n---\n" + "".join( - f"_mecha_refs[{i}]\n{obj.dump(shallow=True) if isinstance(obj, AstNode) else repr(obj)}\n" - for i, obj in enumerate(refs) - ) - elif diagnostics: - database = CompilationDatabase() - database[source] = CompilationUnit(source=source.text) - annotate_diagnostics(database, diagnostics) - assert snapshot() == source.text diff --git a/packages/mecha/tests/test_sandbox.py b/packages/mecha/tests/test_sandbox.py deleted file mode 100644 index 7b4dd2fd3..000000000 --- a/packages/mecha/tests/test_sandbox.py +++ /dev/null @@ -1,35 +0,0 @@ -from pathlib import Path - -import pytest -from beet import Context, Function, run_beet -from beet.toolchain.utils import format_exc -from pytest_insta import SnapshotFixture - -from mecha import CompilationError, Mecha - -SANDBOX_EXAMPLES = [ - Function(source) - for source in Path("tests/resources/sandbox_examples.mcfunction") - .read_text() - .split("###\n") -] - - -@pytest.fixture(scope="session") -def ctx_sandbox(): - with run_beet({"require": ["mecha.contrib.bolt_sandbox"]}) as ctx: - yield ctx - - -@pytest.mark.parametrize( - "source", - params := SANDBOX_EXAMPLES, - ids=range(len(params)), -) -def test_run(snapshot: SnapshotFixture, ctx_sandbox: Context, source: Function): - mc = ctx_sandbox.inject(Mecha) - - with pytest.raises(CompilationError) as exc_info: - mc.compile(source, resource_location="demo:foo") - - assert snapshot() == f"{source.text}---\n{format_exc(exc_info.value.__cause__)}" # type: ignore From 0c8db497cef5267d091277baf0a63ddc092e5a13 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Apr 2022 02:53:04 +0200 Subject: [PATCH 0781/1554] feat: setup project --- packages/bolt/.github/FUNDING.yml | 2 + packages/bolt/.github/dependabot.yml | 12 + packages/bolt/.github/workflows/main.yml | 68 + packages/bolt/.gitignore | 3 + packages/bolt/.vscode/extensions.json | 7 + packages/bolt/.vscode/settings.json | 22 + packages/bolt/README.md | 76 +- packages/bolt/bolt/__init__.py | 10 + packages/bolt/bolt/ast.py | 252 +++ packages/bolt/bolt/codegen.py | 956 +++++++++++ packages/bolt/bolt/contrib/__init__.py | 0 packages/bolt/bolt/contrib/sandbox.py | 164 ++ packages/bolt/bolt/helpers.py | 206 +++ packages/bolt/bolt/loop_info.py | 100 ++ packages/bolt/bolt/parse.py | 1441 +++++++++++++++++ packages/bolt/bolt/plugin.py | 12 + packages/bolt/bolt/py.typed | 0 packages/bolt/bolt/resources/__init__.py | 0 packages/bolt/bolt/resources/commands.json | 232 +++ packages/bolt/bolt/runtime.py | 441 +++++ packages/bolt/bolt/utils.py | 120 ++ packages/bolt/examples/bolt_basic/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 608 +++++++ .../data/demo/functions/import_a.mcfunction | 18 + .../data/demo/functions/import_b.mcfunction | 18 + .../src/data/demo/functions/thing.mcfunction | 15 + .../src/data/demo/functions/utils.mcfunction | 1 + .../src/data/demo/modules/utils.bolt | 2 + packages/bolt/examples/bolt_chicken/beet.yml | 6 + .../data/demo/functions/chicken.mcfunction | 4 + .../src/data/demo/modules/utils.bolt | 18 + .../bolt/examples/bolt_generated/beet.yml | 7 + packages/bolt/examples/bolt_generated/demo.py | 11 + .../src/data/demo/functions/foo.mcfunction | 2 + packages/bolt/examples/bolt_merge/beet.yml | 8 + .../data/pack_1/functions/bob.mcfunction | 2 + .../data/pack_1/functions/utils.mcfunction | 3 + .../data/pack_2/functions/carol.mcfunction | 2 + .../bolt/examples/bolt_shadow_global/beet.yml | 7 + .../bolt/examples/bolt_shadow_global/demo.py | 8 + .../src/data/demo/functions/foo.mcfunction | 1 + packages/bolt/package-lock.json | 33 + packages/bolt/package.json | 9 + packages/bolt/poetry.lock | 1374 ++++++++++++++++ packages/bolt/poetry.toml | 2 + packages/bolt/pyproject.toml | 58 + packages/bolt/setup.py | 8 + packages/bolt/tests/__init__.py | 0 .../tests/resources/bolt_examples.mcfunction | 750 +++++++++ .../resources/sandbox_examples.mcfunction | 19 + .../bolt/tests/snapshots/bolt__parse_0__0.txt | 15 + .../bolt/tests/snapshots/bolt__parse_0__1.txt | 15 + .../tests/snapshots/bolt__parse_100__0.txt | 19 + .../tests/snapshots/bolt__parse_100__1.txt | 4 + .../tests/snapshots/bolt__parse_101__0.txt | 35 + .../tests/snapshots/bolt__parse_101__1.txt | 22 + .../tests/snapshots/bolt__parse_102__0.txt | 48 + .../tests/snapshots/bolt__parse_102__1.txt | 44 + .../tests/snapshots/bolt__parse_103__0.txt | 180 ++ .../tests/snapshots/bolt__parse_103__1.txt | 161 ++ .../tests/snapshots/bolt__parse_104__0.txt | 59 + .../tests/snapshots/bolt__parse_104__1.txt | 23 + .../tests/snapshots/bolt__parse_105__0.txt | 17 + .../tests/snapshots/bolt__parse_105__1.txt | 15 + .../tests/snapshots/bolt__parse_106__0.txt | 41 + .../tests/snapshots/bolt__parse_106__1.txt | 19 + .../tests/snapshots/bolt__parse_107__0.txt | 41 + .../tests/snapshots/bolt__parse_107__1.txt | 19 + .../tests/snapshots/bolt__parse_108__0.txt | 30 + .../tests/snapshots/bolt__parse_108__1.txt | 18 + .../tests/snapshots/bolt__parse_109__0.txt | 30 + .../tests/snapshots/bolt__parse_109__1.txt | 18 + .../tests/snapshots/bolt__parse_10__0.txt | 40 + .../tests/snapshots/bolt__parse_10__1.txt | 20 + .../tests/snapshots/bolt__parse_110__0.txt | 20 + .../tests/snapshots/bolt__parse_110__1.txt | 16 + .../tests/snapshots/bolt__parse_111__0.txt | 41 + .../tests/snapshots/bolt__parse_111__1.txt | 19 + .../tests/snapshots/bolt__parse_112__0.txt | 28 + .../tests/snapshots/bolt__parse_112__1.txt | 16 + .../tests/snapshots/bolt__parse_113__0.txt | 28 + .../tests/snapshots/bolt__parse_113__1.txt | 16 + .../tests/snapshots/bolt__parse_114__0.txt | 28 + .../tests/snapshots/bolt__parse_114__1.txt | 16 + .../tests/snapshots/bolt__parse_115__0.txt | 5 + .../tests/snapshots/bolt__parse_116__0.txt | 5 + .../tests/snapshots/bolt__parse_117__0.txt | 83 + .../tests/snapshots/bolt__parse_117__1.txt | 67 + .../tests/snapshots/bolt__parse_118__0.txt | 92 ++ .../tests/snapshots/bolt__parse_118__1.txt | 44 + .../tests/snapshots/bolt__parse_119__0.txt | 7 + .../tests/snapshots/bolt__parse_11__0.txt | 40 + .../tests/snapshots/bolt__parse_11__1.txt | 20 + .../tests/snapshots/bolt__parse_120__0.txt | 28 + .../tests/snapshots/bolt__parse_120__1.txt | 16 + .../tests/snapshots/bolt__parse_121__0.txt | 5 + .../tests/snapshots/bolt__parse_122__0.txt | 5 + .../tests/snapshots/bolt__parse_123__0.txt | 5 + .../tests/snapshots/bolt__parse_124__0.txt | 5 + .../tests/snapshots/bolt__parse_125__0.txt | 9 + .../tests/snapshots/bolt__parse_126__0.txt | 41 + .../tests/snapshots/bolt__parse_126__1.txt | 22 + .../tests/snapshots/bolt__parse_127__0.txt | 45 + .../tests/snapshots/bolt__parse_127__1.txt | 22 + .../tests/snapshots/bolt__parse_128__0.txt | 42 + .../tests/snapshots/bolt__parse_128__1.txt | 35 + .../tests/snapshots/bolt__parse_129__0.txt | 74 + .../tests/snapshots/bolt__parse_129__1.txt | 25 + .../tests/snapshots/bolt__parse_12__0.txt | 50 + .../tests/snapshots/bolt__parse_12__1.txt | 22 + .../tests/snapshots/bolt__parse_130__0.txt | 116 ++ .../tests/snapshots/bolt__parse_130__1.txt | 102 ++ .../tests/snapshots/bolt__parse_131__0.txt | 5 + .../tests/snapshots/bolt__parse_132__0.txt | 144 ++ .../tests/snapshots/bolt__parse_132__1.txt | 66 + .../tests/snapshots/bolt__parse_133__0.txt | 158 ++ .../tests/snapshots/bolt__parse_133__1.txt | 75 + .../tests/snapshots/bolt__parse_134__0.txt | 168 ++ .../tests/snapshots/bolt__parse_134__1.txt | 76 + .../tests/snapshots/bolt__parse_135__0.txt | 182 +++ .../tests/snapshots/bolt__parse_135__1.txt | 85 + .../tests/snapshots/bolt__parse_136__0.txt | 212 +++ .../tests/snapshots/bolt__parse_136__1.txt | 4 + .../tests/snapshots/bolt__parse_137__0.txt | 65 + .../tests/snapshots/bolt__parse_137__1.txt | 4 + .../tests/snapshots/bolt__parse_138__0.txt | 57 + .../tests/snapshots/bolt__parse_138__1.txt | 26 + .../tests/snapshots/bolt__parse_139__0.txt | 218 +++ .../tests/snapshots/bolt__parse_139__1.txt | 193 +++ .../tests/snapshots/bolt__parse_13__0.txt | 45 + .../tests/snapshots/bolt__parse_13__1.txt | 21 + .../tests/snapshots/bolt__parse_140__0.txt | 33 + .../tests/snapshots/bolt__parse_140__1.txt | 20 + .../tests/snapshots/bolt__parse_141__0.txt | 71 + .../tests/snapshots/bolt__parse_141__1.txt | 56 + .../tests/snapshots/bolt__parse_142__0.txt | 55 + .../tests/snapshots/bolt__parse_142__1.txt | 46 + .../tests/snapshots/bolt__parse_143__0.txt | 99 ++ .../tests/snapshots/bolt__parse_143__1.txt | 72 + .../tests/snapshots/bolt__parse_144__0.txt | 69 + .../tests/snapshots/bolt__parse_144__1.txt | 61 + .../tests/snapshots/bolt__parse_145__0.txt | 38 + .../tests/snapshots/bolt__parse_145__1.txt | 17 + .../tests/snapshots/bolt__parse_146__0.txt | 8 + .../tests/snapshots/bolt__parse_147__0.txt | 8 + .../tests/snapshots/bolt__parse_148__0.txt | 8 + .../tests/snapshots/bolt__parse_149__0.txt | 8 + .../tests/snapshots/bolt__parse_14__0.txt | 45 + .../tests/snapshots/bolt__parse_14__1.txt | 21 + .../tests/snapshots/bolt__parse_150__0.txt | 60 + .../tests/snapshots/bolt__parse_150__1.txt | 22 + .../tests/snapshots/bolt__parse_151__0.txt | 73 + .../tests/snapshots/bolt__parse_151__1.txt | 24 + .../tests/snapshots/bolt__parse_152__0.txt | 73 + .../tests/snapshots/bolt__parse_152__1.txt | 24 + .../tests/snapshots/bolt__parse_153__0.txt | 86 + .../tests/snapshots/bolt__parse_153__1.txt | 26 + .../tests/snapshots/bolt__parse_154__0.txt | 24 + .../tests/snapshots/bolt__parse_154__1.txt | 16 + .../tests/snapshots/bolt__parse_155__0.txt | 5 + .../tests/snapshots/bolt__parse_156__0.txt | 37 + .../tests/snapshots/bolt__parse_156__1.txt | 18 + .../tests/snapshots/bolt__parse_157__0.txt | 5 + .../tests/snapshots/bolt__parse_158__0.txt | 7 + .../tests/snapshots/bolt__parse_159__0.txt | 7 + .../tests/snapshots/bolt__parse_15__0.txt | 35 + .../tests/snapshots/bolt__parse_15__1.txt | 19 + .../tests/snapshots/bolt__parse_160__0.txt | 47 + .../tests/snapshots/bolt__parse_160__1.txt | 18 + .../tests/snapshots/bolt__parse_161__0.txt | 95 ++ .../tests/snapshots/bolt__parse_161__1.txt | 28 + .../tests/snapshots/bolt__parse_162__0.txt | 64 + .../tests/snapshots/bolt__parse_162__1.txt | 22 + .../tests/snapshots/bolt__parse_163__0.txt | 19 + .../tests/snapshots/bolt__parse_163__1.txt | 4 + .../tests/snapshots/bolt__parse_164__0.txt | 51 + .../tests/snapshots/bolt__parse_164__1.txt | 43 + .../tests/snapshots/bolt__parse_165__0.txt | 46 + .../tests/snapshots/bolt__parse_165__1.txt | 42 + .../tests/snapshots/bolt__parse_166__0.txt | 51 + .../tests/snapshots/bolt__parse_166__1.txt | 4 + .../tests/snapshots/bolt__parse_167__0.txt | 52 + .../tests/snapshots/bolt__parse_167__1.txt | 28 + .../tests/snapshots/bolt__parse_168__0.txt | 100 ++ .../tests/snapshots/bolt__parse_168__1.txt | 70 + .../tests/snapshots/bolt__parse_169__0.txt | 75 + .../tests/snapshots/bolt__parse_169__1.txt | 42 + .../tests/snapshots/bolt__parse_16__0.txt | 155 ++ .../tests/snapshots/bolt__parse_16__1.txt | 43 + .../tests/snapshots/bolt__parse_170__0.txt | 80 + .../tests/snapshots/bolt__parse_170__1.txt | 25 + .../tests/snapshots/bolt__parse_171__0.txt | 69 + .../tests/snapshots/bolt__parse_171__1.txt | 24 + .../tests/snapshots/bolt__parse_172__0.txt | 5 + .../tests/snapshots/bolt__parse_173__0.txt | 5 + .../tests/snapshots/bolt__parse_174__0.txt | 76 + .../tests/snapshots/bolt__parse_174__1.txt | 60 + .../tests/snapshots/bolt__parse_175__0.txt | 71 + .../tests/snapshots/bolt__parse_175__1.txt | 59 + .../tests/snapshots/bolt__parse_176__0.txt | 78 + .../tests/snapshots/bolt__parse_176__1.txt | 67 + .../tests/snapshots/bolt__parse_177__0.txt | 4 + .../tests/snapshots/bolt__parse_178__0.txt | 4 + .../tests/snapshots/bolt__parse_179__0.txt | 4 + .../tests/snapshots/bolt__parse_17__0.txt | 240 +++ .../tests/snapshots/bolt__parse_17__1.txt | 210 +++ .../tests/snapshots/bolt__parse_180__0.txt | 4 + .../tests/snapshots/bolt__parse_181__0.txt | 15 + .../tests/snapshots/bolt__parse_181__1.txt | 15 + .../tests/snapshots/bolt__parse_182__0.txt | 26 + .../tests/snapshots/bolt__parse_182__1.txt | 16 + .../tests/snapshots/bolt__parse_183__0.txt | 7 + .../tests/snapshots/bolt__parse_184__0.txt | 79 + .../tests/snapshots/bolt__parse_184__1.txt | 61 + .../tests/snapshots/bolt__parse_185__0.txt | 35 + .../tests/snapshots/bolt__parse_185__1.txt | 18 + .../tests/snapshots/bolt__parse_186__0.txt | 67 + .../tests/snapshots/bolt__parse_186__1.txt | 39 + .../tests/snapshots/bolt__parse_187__0.txt | 5 + .../tests/snapshots/bolt__parse_188__0.txt | 7 + .../tests/snapshots/bolt__parse_189__0.txt | 8 + .../tests/snapshots/bolt__parse_18__0.txt | 5 + .../tests/snapshots/bolt__parse_190__0.txt | 7 + .../tests/snapshots/bolt__parse_191__0.txt | 9 + .../tests/snapshots/bolt__parse_192__0.txt | 131 ++ .../tests/snapshots/bolt__parse_192__1.txt | 67 + .../tests/snapshots/bolt__parse_193__0.txt | 423 +++++ .../tests/snapshots/bolt__parse_193__1.txt | 167 ++ .../tests/snapshots/bolt__parse_194__0.txt | 232 +++ .../tests/snapshots/bolt__parse_194__1.txt | 104 ++ .../tests/snapshots/bolt__parse_195__0.txt | 9 + .../tests/snapshots/bolt__parse_196__0.txt | 101 ++ .../tests/snapshots/bolt__parse_196__1.txt | 29 + .../tests/snapshots/bolt__parse_197__0.txt | 122 ++ .../tests/snapshots/bolt__parse_197__1.txt | 38 + .../tests/snapshots/bolt__parse_198__0.txt | 42 + .../tests/snapshots/bolt__parse_198__1.txt | 36 + .../tests/snapshots/bolt__parse_199__0.txt | 195 +++ .../tests/snapshots/bolt__parse_199__1.txt | 88 + .../tests/snapshots/bolt__parse_19__0.txt | 5 + .../bolt/tests/snapshots/bolt__parse_1__0.txt | 15 + .../bolt/tests/snapshots/bolt__parse_1__1.txt | 15 + .../tests/snapshots/bolt__parse_200__0.txt | 11 + .../tests/snapshots/bolt__parse_20__0.txt | 35 + .../tests/snapshots/bolt__parse_20__1.txt | 47 + .../tests/snapshots/bolt__parse_21__0.txt | 15 + .../tests/snapshots/bolt__parse_21__1.txt | 15 + .../tests/snapshots/bolt__parse_22__0.txt | 15 + .../tests/snapshots/bolt__parse_22__1.txt | 15 + .../tests/snapshots/bolt__parse_23__0.txt | 15 + .../tests/snapshots/bolt__parse_23__1.txt | 15 + .../tests/snapshots/bolt__parse_24__0.txt | 15 + .../tests/snapshots/bolt__parse_24__1.txt | 15 + .../tests/snapshots/bolt__parse_25__0.txt | 15 + .../tests/snapshots/bolt__parse_25__1.txt | 15 + .../tests/snapshots/bolt__parse_26__0.txt | 15 + .../tests/snapshots/bolt__parse_26__1.txt | 15 + .../tests/snapshots/bolt__parse_27__0.txt | 5 + .../tests/snapshots/bolt__parse_28__0.txt | 5 + .../tests/snapshots/bolt__parse_29__0.txt | 15 + .../tests/snapshots/bolt__parse_29__1.txt | 15 + .../bolt/tests/snapshots/bolt__parse_2__0.txt | 15 + .../bolt/tests/snapshots/bolt__parse_2__1.txt | 15 + .../tests/snapshots/bolt__parse_30__0.txt | 7 + .../tests/snapshots/bolt__parse_31__0.txt | 5 + .../tests/snapshots/bolt__parse_32__0.txt | 36 + .../tests/snapshots/bolt__parse_32__1.txt | 18 + .../tests/snapshots/bolt__parse_33__0.txt | 46 + .../tests/snapshots/bolt__parse_33__1.txt | 20 + .../tests/snapshots/bolt__parse_34__0.txt | 71 + .../tests/snapshots/bolt__parse_34__1.txt | 29 + .../tests/snapshots/bolt__parse_35__0.txt | 104 ++ .../tests/snapshots/bolt__parse_35__1.txt | 66 + .../tests/snapshots/bolt__parse_36__0.txt | 12 + .../tests/snapshots/bolt__parse_37__0.txt | 12 + .../tests/snapshots/bolt__parse_38__0.txt | 4 + .../tests/snapshots/bolt__parse_39__0.txt | 4 + .../bolt/tests/snapshots/bolt__parse_3__0.txt | 15 + .../bolt/tests/snapshots/bolt__parse_3__1.txt | 15 + .../tests/snapshots/bolt__parse_40__0.txt | 7 + .../tests/snapshots/bolt__parse_41__0.txt | 33 + .../tests/snapshots/bolt__parse_41__1.txt | 23 + .../tests/snapshots/bolt__parse_42__0.txt | 116 ++ .../tests/snapshots/bolt__parse_42__1.txt | 90 + .../tests/snapshots/bolt__parse_43__0.txt | 78 + .../tests/snapshots/bolt__parse_43__1.txt | 77 + .../tests/snapshots/bolt__parse_44__0.txt | 96 ++ .../tests/snapshots/bolt__parse_44__1.txt | 83 + .../tests/snapshots/bolt__parse_45__0.txt | 68 + .../tests/snapshots/bolt__parse_45__1.txt | 73 + .../tests/snapshots/bolt__parse_46__0.txt | 130 ++ .../tests/snapshots/bolt__parse_46__1.txt | 87 + .../tests/snapshots/bolt__parse_47__0.txt | 39 + .../tests/snapshots/bolt__parse_47__1.txt | 18 + .../tests/snapshots/bolt__parse_48__0.txt | 7 + .../tests/snapshots/bolt__parse_49__0.txt | 35 + .../tests/snapshots/bolt__parse_49__1.txt | 19 + .../bolt/tests/snapshots/bolt__parse_4__0.txt | 15 + .../bolt/tests/snapshots/bolt__parse_4__1.txt | 15 + .../tests/snapshots/bolt__parse_50__0.txt | 46 + .../tests/snapshots/bolt__parse_50__1.txt | 20 + .../tests/snapshots/bolt__parse_51__0.txt | 38 + .../tests/snapshots/bolt__parse_51__1.txt | 23 + .../tests/snapshots/bolt__parse_52__0.txt | 5 + .../tests/snapshots/bolt__parse_53__0.txt | 47 + .../tests/snapshots/bolt__parse_53__1.txt | 23 + .../tests/snapshots/bolt__parse_54__0.txt | 7 + .../tests/snapshots/bolt__parse_55__0.txt | 45 + .../tests/snapshots/bolt__parse_55__1.txt | 22 + .../tests/snapshots/bolt__parse_56__0.txt | 7 + .../tests/snapshots/bolt__parse_57__0.txt | 47 + .../tests/snapshots/bolt__parse_57__1.txt | 23 + .../tests/snapshots/bolt__parse_58__0.txt | 5 + .../tests/snapshots/bolt__parse_59__0.txt | 5 + .../bolt/tests/snapshots/bolt__parse_5__0.txt | 25 + .../bolt/tests/snapshots/bolt__parse_5__1.txt | 17 + .../tests/snapshots/bolt__parse_60__0.txt | 5 + .../tests/snapshots/bolt__parse_61__0.txt | 7 + .../tests/snapshots/bolt__parse_62__0.txt | 45 + .../tests/snapshots/bolt__parse_62__1.txt | 25 + .../tests/snapshots/bolt__parse_63__0.txt | 26 + .../tests/snapshots/bolt__parse_63__1.txt | 17 + .../tests/snapshots/bolt__parse_64__0.txt | 55 + .../tests/snapshots/bolt__parse_64__1.txt | 23 + .../tests/snapshots/bolt__parse_65__0.txt | 20 + .../tests/snapshots/bolt__parse_65__1.txt | 17 + .../tests/snapshots/bolt__parse_66__0.txt | 25 + .../tests/snapshots/bolt__parse_66__1.txt | 18 + .../tests/snapshots/bolt__parse_67__0.txt | 35 + .../tests/snapshots/bolt__parse_67__1.txt | 20 + .../tests/snapshots/bolt__parse_68__0.txt | 81 + .../tests/snapshots/bolt__parse_68__1.txt | 30 + .../tests/snapshots/bolt__parse_69__0.txt | 36 + .../tests/snapshots/bolt__parse_69__1.txt | 19 + .../bolt/tests/snapshots/bolt__parse_6__0.txt | 25 + .../bolt/tests/snapshots/bolt__parse_6__1.txt | 17 + .../tests/snapshots/bolt__parse_70__0.txt | 51 + .../tests/snapshots/bolt__parse_70__1.txt | 25 + .../tests/snapshots/bolt__parse_71__0.txt | 69 + .../tests/snapshots/bolt__parse_71__1.txt | 20 + .../tests/snapshots/bolt__parse_72__0.txt | 75 + .../tests/snapshots/bolt__parse_72__1.txt | 34 + .../tests/snapshots/bolt__parse_73__0.txt | 4 + .../tests/snapshots/bolt__parse_74__0.txt | 4 + .../tests/snapshots/bolt__parse_75__0.txt | 7 + .../tests/snapshots/bolt__parse_76__0.txt | 7 + .../tests/snapshots/bolt__parse_77__0.txt | 69 + .../tests/snapshots/bolt__parse_77__1.txt | 33 + .../tests/snapshots/bolt__parse_78__0.txt | 13 + .../tests/snapshots/bolt__parse_79__0.txt | 11 + .../bolt/tests/snapshots/bolt__parse_7__0.txt | 35 + .../bolt/tests/snapshots/bolt__parse_7__1.txt | 19 + .../tests/snapshots/bolt__parse_80__0.txt | 20 + .../tests/snapshots/bolt__parse_81__0.txt | 186 +++ .../tests/snapshots/bolt__parse_81__1.txt | 46 + .../tests/snapshots/bolt__parse_82__0.txt | 148 ++ .../tests/snapshots/bolt__parse_82__1.txt | 36 + .../tests/snapshots/bolt__parse_83__0.txt | 11 + .../tests/snapshots/bolt__parse_84__0.txt | 28 + .../tests/snapshots/bolt__parse_84__1.txt | 16 + .../tests/snapshots/bolt__parse_85__0.txt | 5 + .../tests/snapshots/bolt__parse_86__0.txt | 5 + .../tests/snapshots/bolt__parse_87__0.txt | 68 + .../tests/snapshots/bolt__parse_87__1.txt | 20 + .../tests/snapshots/bolt__parse_88__0.txt | 10 + .../tests/snapshots/bolt__parse_89__0.txt | 66 + .../tests/snapshots/bolt__parse_89__1.txt | 46 + .../bolt/tests/snapshots/bolt__parse_8__0.txt | 35 + .../bolt/tests/snapshots/bolt__parse_8__1.txt | 19 + .../tests/snapshots/bolt__parse_90__0.txt | 9 + .../tests/snapshots/bolt__parse_91__0.txt | 30 + .../tests/snapshots/bolt__parse_91__1.txt | 17 + .../tests/snapshots/bolt__parse_92__0.txt | 51 + .../tests/snapshots/bolt__parse_92__1.txt | 20 + .../tests/snapshots/bolt__parse_93__0.txt | 51 + .../tests/snapshots/bolt__parse_93__1.txt | 20 + .../tests/snapshots/bolt__parse_94__0.txt | 86 + .../tests/snapshots/bolt__parse_94__1.txt | 26 + .../tests/snapshots/bolt__parse_95__0.txt | 156 ++ .../tests/snapshots/bolt__parse_95__1.txt | 34 + .../tests/snapshots/bolt__parse_96__0.txt | 156 ++ .../tests/snapshots/bolt__parse_96__1.txt | 34 + .../tests/snapshots/bolt__parse_97__0.txt | 83 + .../tests/snapshots/bolt__parse_97__1.txt | 26 + .../tests/snapshots/bolt__parse_98__0.txt | 8 + .../tests/snapshots/bolt__parse_99__0.txt | 7 + .../bolt/tests/snapshots/bolt__parse_9__0.txt | 30 + .../bolt/tests/snapshots/bolt__parse_9__1.txt | 18 + .../examples__build_bolt_basic__0.pack.md | 642 ++++++++ .../examples__build_bolt_chicken__0.pack.md | 38 + .../examples__build_bolt_generated__0.pack.md | 35 + .../examples__build_bolt_merge__0.pack.md | 36 + ...mples__build_bolt_shadow_global__0.pack.md | 22 + .../tests/snapshots/sandbox__run_0__0.txt | 5 + .../tests/snapshots/sandbox__run_1__0.txt | 7 + .../tests/snapshots/sandbox__run_2__0.txt | 7 + .../tests/snapshots/sandbox__run_3__0.txt | 5 + .../tests/snapshots/sandbox__run_4__0.txt | 5 + .../tests/snapshots/sandbox__run_5__0.txt | 5 + .../tests/snapshots/sandbox__run_6__0.txt | 5 + .../tests/snapshots/sandbox__run_7__0.txt | 5 + packages/bolt/tests/test_bolt.py | 54 + packages/bolt/tests/test_examples.py | 14 + packages/bolt/tests/test_sandbox.py | 35 + 404 files changed, 22727 insertions(+), 2 deletions(-) create mode 100644 packages/bolt/.github/FUNDING.yml create mode 100644 packages/bolt/.github/dependabot.yml create mode 100644 packages/bolt/.github/workflows/main.yml create mode 100644 packages/bolt/.vscode/extensions.json create mode 100644 packages/bolt/.vscode/settings.json create mode 100644 packages/bolt/bolt/__init__.py create mode 100644 packages/bolt/bolt/ast.py create mode 100644 packages/bolt/bolt/codegen.py create mode 100644 packages/bolt/bolt/contrib/__init__.py create mode 100644 packages/bolt/bolt/contrib/sandbox.py create mode 100644 packages/bolt/bolt/helpers.py create mode 100644 packages/bolt/bolt/loop_info.py create mode 100644 packages/bolt/bolt/parse.py create mode 100644 packages/bolt/bolt/plugin.py create mode 100644 packages/bolt/bolt/py.typed create mode 100644 packages/bolt/bolt/resources/__init__.py create mode 100644 packages/bolt/bolt/resources/commands.json create mode 100644 packages/bolt/bolt/runtime.py create mode 100644 packages/bolt/bolt/utils.py create mode 100644 packages/bolt/examples/bolt_basic/beet.yml create mode 100644 packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction create mode 100644 packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction create mode 100644 packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction create mode 100644 packages/bolt/examples/bolt_basic/src/data/demo/functions/utils.mcfunction create mode 100644 packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt create mode 100644 packages/bolt/examples/bolt_chicken/beet.yml create mode 100644 packages/bolt/examples/bolt_chicken/src/data/demo/functions/chicken.mcfunction create mode 100644 packages/bolt/examples/bolt_chicken/src/data/demo/modules/utils.bolt create mode 100644 packages/bolt/examples/bolt_generated/beet.yml create mode 100644 packages/bolt/examples/bolt_generated/demo.py create mode 100644 packages/bolt/examples/bolt_generated/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/examples/bolt_merge/beet.yml create mode 100644 packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction create mode 100644 packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction create mode 100644 packages/bolt/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction create mode 100644 packages/bolt/examples/bolt_shadow_global/beet.yml create mode 100644 packages/bolt/examples/bolt_shadow_global/demo.py create mode 100644 packages/bolt/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/package-lock.json create mode 100644 packages/bolt/package.json create mode 100644 packages/bolt/poetry.lock create mode 100644 packages/bolt/poetry.toml create mode 100644 packages/bolt/pyproject.toml create mode 100644 packages/bolt/setup.py create mode 100644 packages/bolt/tests/__init__.py create mode 100644 packages/bolt/tests/resources/bolt_examples.mcfunction create mode 100644 packages/bolt/tests/resources/sandbox_examples.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_0__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_0__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_100__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_100__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_101__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_101__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_102__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_102__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_103__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_103__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_104__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_104__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_105__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_105__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_106__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_106__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_107__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_107__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_108__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_108__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_109__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_109__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_10__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_10__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_110__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_110__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_111__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_111__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_112__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_112__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_113__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_113__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_114__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_114__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_115__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_116__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_117__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_117__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_118__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_118__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_119__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_11__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_11__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_120__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_120__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_121__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_122__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_123__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_124__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_125__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_126__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_126__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_127__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_127__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_128__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_128__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_129__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_129__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_12__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_12__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_130__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_130__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_131__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_132__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_132__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_133__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_133__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_134__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_134__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_135__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_135__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_136__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_136__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_137__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_137__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_138__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_138__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_139__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_139__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_13__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_13__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_140__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_140__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_141__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_141__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_142__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_142__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_143__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_143__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_144__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_144__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_145__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_145__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_146__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_147__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_148__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_149__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_14__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_14__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_150__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_150__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_151__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_151__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_152__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_152__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_153__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_153__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_154__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_154__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_155__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_156__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_156__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_157__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_158__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_159__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_15__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_15__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_160__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_160__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_161__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_161__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_162__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_162__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_163__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_163__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_164__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_164__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_165__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_165__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_166__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_166__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_167__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_167__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_168__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_168__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_169__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_169__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_16__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_16__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_170__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_170__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_171__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_171__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_172__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_173__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_174__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_174__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_175__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_175__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_176__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_176__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_177__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_178__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_179__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_17__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_17__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_180__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_181__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_181__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_182__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_182__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_183__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_184__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_184__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_185__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_185__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_186__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_186__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_187__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_188__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_189__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_18__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_190__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_191__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_192__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_192__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_193__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_193__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_194__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_194__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_195__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_196__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_196__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_197__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_197__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_198__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_198__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_199__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_199__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_19__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_1__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_1__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_200__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_20__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_20__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_21__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_21__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_22__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_22__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_23__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_23__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_24__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_24__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_25__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_25__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_26__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_26__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_27__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_28__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_29__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_29__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_2__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_2__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_30__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_31__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_32__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_32__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_33__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_33__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_34__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_34__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_35__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_35__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_36__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_37__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_38__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_39__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_3__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_3__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_40__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_41__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_41__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_42__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_42__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_43__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_43__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_44__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_44__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_45__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_45__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_46__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_46__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_47__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_47__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_48__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_49__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_49__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_4__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_4__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_50__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_50__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_51__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_51__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_52__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_53__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_53__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_54__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_55__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_55__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_56__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_57__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_57__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_58__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_59__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_5__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_5__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_60__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_61__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_62__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_62__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_63__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_63__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_64__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_64__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_65__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_65__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_66__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_66__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_67__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_67__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_68__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_68__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_69__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_69__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_6__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_6__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_70__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_70__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_71__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_71__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_72__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_72__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_73__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_74__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_75__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_76__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_77__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_77__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_78__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_79__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_7__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_7__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_80__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_81__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_81__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_82__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_82__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_83__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_84__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_84__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_85__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_86__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_87__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_87__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_88__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_89__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_89__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_8__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_8__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_90__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_91__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_91__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_92__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_92__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_93__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_93__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_94__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_94__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_95__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_95__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_96__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_96__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_97__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_97__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_98__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_99__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_9__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_9__1.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md create mode 100644 packages/bolt/tests/snapshots/sandbox__run_0__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_1__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_2__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_3__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_4__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_5__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_6__0.txt create mode 100644 packages/bolt/tests/snapshots/sandbox__run_7__0.txt create mode 100644 packages/bolt/tests/test_bolt.py create mode 100644 packages/bolt/tests/test_examples.py create mode 100644 packages/bolt/tests/test_sandbox.py diff --git a/packages/bolt/.github/FUNDING.yml b/packages/bolt/.github/FUNDING.yml new file mode 100644 index 000000000..2815213d2 --- /dev/null +++ b/packages/bolt/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: + - vberlier diff --git a/packages/bolt/.github/dependabot.yml b/packages/bolt/.github/dependabot.yml new file mode 100644 index 000000000..eeff847cf --- /dev/null +++ b/packages/bolt/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 + +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" diff --git a/packages/bolt/.github/workflows/main.yml b/packages/bolt/.github/workflows/main.yml new file mode 100644 index 000000000..4d6aa43d0 --- /dev/null +++ b/packages/bolt/.github/workflows/main.yml @@ -0,0 +1,68 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + main: + name: Test and release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Python 3.9 + uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Setup poetry cache + id: cached-poetry + uses: actions/cache@v2 + with: + path: ~/.local + key: poetry-${{ runner.os }} + - name: Install poetry + if: steps.cached-poetry.outputs.cache-hit != 'true' + uses: snok/install-poetry@v1 + with: + virtualenvs-in-project: true + - name: Setup venv cache + id: cached-venv + uses: actions/cache@v2 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('poetry.lock') }} + - name: Install dependencies + if: steps.cached-venv.outputs.cache-hit != 'true' + run: poetry install + - name: Setup npm cache + id: cached-npm + uses: actions/cache@v2 + with: + path: node_modules + key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }} + - name: Install Pyright + if: steps.cached-npm.outputs.cache-hit != 'true' + run: npm install + - name: Run tests + run: poetry run pytest -v + - name: Run type-checking + run: npm run check + - name: Check formatting + run: poetry run black --check bolt tests + - name: Release + if: | + github.repository == 'mcbeet/bolt' + && github.event_name == 'push' + && github.ref == 'refs/heads/main' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + git config --global user.name "github-actions" + git config --global user.email "action@github.com" + poetry run semantic-release publish -v DEBUG -D commit_author="github-actions " diff --git a/packages/bolt/.gitignore b/packages/bolt/.gitignore index b6e47617d..d82aa4e71 100644 --- a/packages/bolt/.gitignore +++ b/packages/bolt/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# Node +node_modules/ diff --git a/packages/bolt/.vscode/extensions.json b/packages/bolt/.vscode/extensions.json new file mode 100644 index 000000000..8affbb2bf --- /dev/null +++ b/packages/bolt/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "bungcip.better-toml" + ] +} diff --git a/packages/bolt/.vscode/settings.json b/packages/bolt/.vscode/settings.json new file mode 100644 index 000000000..a0261783e --- /dev/null +++ b/packages/bolt/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "python.formatting.provider": "black", + "python.languageServer": "Pylance", + "python.linting.enabled": false, + "python.linting.pylintEnabled": false, + "python.linting.banditEnabled": false, + "python.linting.flake8Enabled": false, + "python.linting.mypyEnabled": false, + "python.linting.prospectorEnabled": false, + "python.linting.pycodestyleEnabled": false, + "python.linting.pydocstyleEnabled": false, + "python.linting.pylamaEnabled": false, + "[python]": { + "editor.tabSize": 4, + "editor.formatOnSave": true, + "editor.formatOnType": false, + "editor.formatOnPaste": false, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + } +} diff --git a/packages/bolt/README.md b/packages/bolt/README.md index c303c347a..055f22c55 100644 --- a/packages/bolt/README.md +++ b/packages/bolt/README.md @@ -1,2 +1,74 @@ -# bolt -Supercharge Minecraft commands with Python. +# Bolt + +[![GitHub Actions](https://github.com/mcbeet/bolt/workflows/CI/badge.svg)](https://github.com/mcbeet/bolt/actions) +[![PyPI](https://img.shields.io/pypi/v/bolt.svg)](https://pypi.org/project/bolt/) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/bolt.svg)](https://pypi.org/project/bolt/) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) +[![Discord](https://img.shields.io/discord/900530660677156924?color=7289DA&label=discord&logo=discord&logoColor=fff)](https://discord.gg/98MdSGMm8j) + +> Supercharge Minecraft commands with Python. + +```python +infinite_invisibility = { + Id: 14, + Duration: 999999, + Amplifier: 1, + ShowParticles: false, +} + +def summon_chicken_army(n): + for i in range(n): + summon chicken ~i ~ ~ { + Tags: [f"quack{i}"], + IsChickenJockey: true, + Passengers: [{ + id: zombie, + IsBaby: true, + ActiveEffects: [infinite_invisibility] + }] + } + +say Go forth, my minions! +summon_chicken_army(16) +``` + +## Installation + +The package can be installed with `pip`. + +```bash +$ pip install bolt +``` + +## Contributing + +Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses [`poetry`](https://python-poetry.org/). + +```bash +$ poetry install +``` + +You can run the tests with `poetry run pytest`. + +```bash +$ poetry run pytest +``` + +The project must type-check with [`pyright`](https://github.com/microsoft/pyright). If you're using VSCode the [`pylance`](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) extension should report diagnostics automatically. You can also install the type-checker locally with `npm install` and run it from the command-line. + +```bash +$ npm run watch +$ npm run check +``` + +The code follows the [`black`](https://github.com/psf/black) code style. Import statements are sorted with [`isort`](https://pycqa.github.io/isort/). + +```bash +$ poetry run isort bolt tests +$ poetry run black bolt tests +$ poetry run black --check bolt tests +``` + +--- + +License - [MIT](https://github.com/mcbeet/bolt/blob/main/LICENSE) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py new file mode 100644 index 000000000..48f43ed57 --- /dev/null +++ b/packages/bolt/bolt/__init__.py @@ -0,0 +1,10 @@ +__version__ = "0.1.0" + + +from .ast import * +from .codegen import * +from .helpers import * +from .loop_info import * +from .parse import * +from .plugin import * +from .runtime import * diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py new file mode 100644 index 000000000..a153d535d --- /dev/null +++ b/packages/bolt/bolt/ast.py @@ -0,0 +1,252 @@ +__all__ = [ + "AstModuleRoot", + "AstExpression", + "AstExpressionBinary", + "AstExpressionUnary", + "AstValue", + "AstIdentifier", + "AstFormatString", + "AstTuple", + "AstList", + "AstDictItem", + "AstDict", + "AstSlice", + "AstUnpack", + "AstKeyword", + "AstAttribute", + "AstLookup", + "AstCall", + "AstTarget", + "AstTargetIdentifier", + "AstTargetUnpack", + "AstTargetAttribute", + "AstTargetItem", + "AstAssignment", + "AstFunctionSignature", + "AstFunctionSignatureArgument", + "AstFunctionRoot", + "AstInterpolation", + "AstImportedIdentifier", +] + + +from dataclasses import dataclass +from typing import Any, Optional, Union + +from beet.core.utils import required_field +from tokenstream import TokenStream + +from mecha import AstChildren, AstNode, AstRoot + + +@dataclass(frozen=True) +class AstModuleRoot(AstRoot): + """Module root ast node.""" + + +@dataclass(frozen=True) +class AstExpression(AstNode): + """Base ast node for expressions.""" + + +@dataclass(frozen=True) +class AstExpressionBinary(AstExpression): + """Ast expression binary node.""" + + operator: str = required_field() + left: AstExpression = required_field() + right: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstExpressionUnary(AstExpression): + """Ast expression unary node.""" + + operator: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstValue(AstExpression): + """Ast value node.""" + + value: Any = required_field() + + +@dataclass(frozen=True) +class AstIdentifier(AstExpression): + """Ast identifier node.""" + + value: str = required_field() + + +@dataclass(frozen=True) +class AstFormatString(AstExpression): + """Ast format string node.""" + + fmt: str = required_field() + values: AstChildren[AstExpression] = required_field() + + +@dataclass(frozen=True) +class AstTuple(AstExpression): + """Ast tuple node.""" + + items: AstChildren[AstExpression] = required_field() + + +@dataclass(frozen=True) +class AstList(AstExpression): + """Ast list node.""" + + items: AstChildren[AstExpression] = required_field() + + +@dataclass(frozen=True) +class AstDictItem(AstNode): + """Ast dict item node.""" + + key: AstExpression = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstDict(AstExpression): + """Ast dict node.""" + + items: AstChildren[AstDictItem] = required_field() + + +@dataclass(frozen=True) +class AstSlice(AstNode): + """Ast slice node.""" + + start: Optional[AstExpression] = None + stop: Optional[AstExpression] = None + step: Optional[AstExpression] = None + + +@dataclass(frozen=True) +class AstUnpack(AstNode): + """Ast unpack node.""" + + type: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstKeyword(AstNode): + """Ast keyword node.""" + + name: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstAttribute(AstExpression): + """Ast attribute node.""" + + name: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstLookup(AstExpression): + """Ast lookup node.""" + + value: AstExpression = required_field() + arguments: AstChildren[Union[AstExpression, AstSlice]] = required_field() + + +@dataclass(frozen=True) +class AstCall(AstExpression): + """Ast call node.""" + + value: AstExpression = required_field() + arguments: AstChildren[ + Union[AstExpression, AstUnpack, AstKeyword] + ] = required_field() + + +@dataclass(frozen=True) +class AstTarget(AstNode): + """Base node for targets.""" + + +@dataclass(frozen=True) +class AstTargetIdentifier(AstTarget): + """Ast target identifier node.""" + + value: str = required_field() + rebind: bool = False + + +@dataclass(frozen=True) +class AstTargetUnpack(AstTarget): + """Ast target unpack node.""" + + targets: AstChildren[AstTarget] = required_field() + + +@dataclass(frozen=True) +class AstTargetAttribute(AstTarget): + """Ast target attribute node.""" + + name: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstTargetItem(AstTarget): + """Ast target item node.""" + + value: AstExpression = required_field() + arguments: AstChildren[Union[AstExpression, AstSlice]] = required_field() + + +@dataclass(frozen=True) +class AstAssignment(AstNode): + """Ast assignment node.""" + + operator: str = required_field() + target: AstTarget = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstFunctionSignatureArgument(AstNode): + """Ast function signature argument node.""" + + name: str = required_field() + default: Optional[AstExpression] = None + + +@dataclass(frozen=True) +class AstFunctionSignature(AstNode): + """Ast function signature node.""" + + name: str = required_field() + arguments: AstChildren[AstFunctionSignatureArgument] = required_field() + + +@dataclass(frozen=True) +class AstFunctionRoot(AstNode): + """Ast function root node.""" + + stream: TokenStream = required_field() + + +@dataclass(frozen=True) +class AstInterpolation(AstNode): + """Ast interpolation node.""" + + prefix: Optional[str] = None + converter: str = required_field() + value: AstExpression = required_field() + + +@dataclass(frozen=True) +class AstImportedIdentifier(AstNode): + """Ast imported identifier node.""" + + value: str = required_field() diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py new file mode 100644 index 000000000..6f08a2d87 --- /dev/null +++ b/packages/bolt/bolt/codegen.py @@ -0,0 +1,956 @@ +__all__ = [ + "Codegen", + "Accumulator", + "ChildrenCollector", + "CommandCollector", + "RootCommandCollector", + "visit_single", + "visit_multiple", + "visit_generic", + "visit_body", + "visit_binding", +] + + +from contextlib import contextmanager +from dataclasses import dataclass, field, fields +from typing import ( + Any, + Dict, + Generator, + Iterable, + List, + Literal, + Optional, + Tuple, + Type, + cast, + overload, +) + +from beet.core.utils import normalize_string + +from mecha import ( + AstChildren, + AstCommand, + AstNode, + AstResourceLocation, + AstRoot, + Visitor, + rule, +) + +from .ast import ( + AstAssignment, + AstAttribute, + AstCall, + AstDict, + AstDictItem, + AstExpressionBinary, + AstExpressionUnary, + AstFormatString, + AstFunctionSignature, + AstIdentifier, + AstImportedIdentifier, + AstInterpolation, + AstKeyword, + AstList, + AstLookup, + AstSlice, + AstTargetAttribute, + AstTargetIdentifier, + AstTargetItem, + AstTargetUnpack, + AstTuple, + AstUnpack, + AstValue, +) + + +@dataclass +class Accumulator: + """Utility for generating python code.""" + + indentation: str = "" + refs: List[Any] = field(default_factory=list) + lines: List[str] = field(default_factory=list) + counter: int = 0 + header: Dict[str, str] = field(default_factory=dict) + + last_condition: str = "_mecha_error_last_condition" + + def get_source(self) -> str: + """Return the source code.""" + header = "".join( + f"{variable} = {expression}\n" + for expression, variable in self.header.items() + ) + + lines: List[str] = ["_mecha_lineno = "] + numbers1: List[int] = [1] + numbers2: List[int] = [1] + + for line in (header + "".join(self.lines)).splitlines(): + if line.startswith("!lineno "): + current_line = int(line[8:]) + if numbers2[-1] != current_line: + numbers1.append(len(lines) + 1) + numbers2.append(current_line) + else: + lines.append(line) + + lines[0] += f"{numbers1}, {numbers2}" + + return "\n".join(lines) + "\n" + + def helper(self, name: str, *args: Any) -> str: + """Emit helper.""" + helper = f"_mecha_runtime.helpers[{name!r}]" + + if helper not in self.header: + self.header[helper] = f"_mecha_helper_{normalize_string(name)}" + + return f"{self.header[helper]}({', '.join(map(str, args))})" + + def replace(self, node: str, **kwargs: str) -> str: + """Emit replace helper.""" + return self.helper("replace", node, *(f"{k}={v}" for k, v in kwargs.items())) + + def missing(self) -> str: + """Emit missing sentinel.""" + self.header["_mecha_runtime.helpers['missing']"] = f"_mecha_helper_missing" + return f"_mecha_helper_missing" + + def children(self, nodes: Iterable[str]) -> str: + """Emit children helper.""" + return self.helper("children", f"[{', '.join(nodes)}]") + + def get_attribute(self, obj: str, name: str) -> str: + """Emit get_attribute helper.""" + return self.helper("get_attribute", obj, repr(name)) + + def import_module(self, name: str) -> str: + """Emit import_module helper.""" + return self.helper("import_module", repr(name)) + + def make_ref(self, obj: Any) -> str: + """Register ref.""" + index = len(self.refs) + self.refs.append(obj) + return f"_mecha_refs[{index}]" + + def make_ref_slice(self, objs: Iterable[Any]) -> str: + """Register ref slice.""" + start = len(self.refs) + self.refs.extend(objs) + stop = len(self.refs) + return f"_mecha_refs[{start}:{stop}]" + + def make_variable(self) -> str: + """Create a unique variable name.""" + name = f"_mecha_var{self.counter}" + self.counter += 1 + return name + + @contextmanager + def block(self): + """Wrap statements in an indented block.""" + previous_indentation = self.indentation + self.indentation += " " + try: + yield + finally: + self.indentation = previous_indentation + + def statement(self, code: str, *, lineno: Any = None): + """Emit statement.""" + if isinstance(lineno, AstNode) and not lineno.location.unknown: + lineno = lineno.location.lineno + if isinstance(lineno, int): + self.lines.append(f"!lineno {lineno}\n") + self.lines.append(f"{self.indentation}{code}\n") + + @contextmanager + def if_statement(self, condition: str): + """Emit if statement.""" + branch = self.helper("branch", condition) + self.statement(f"with {branch} as _mecha_condition:") + with self.block(): + self.statement(f"if _mecha_condition:") + with self.block(): + yield + self.last_condition = condition + + @contextmanager + def else_statement(self): + """Emit else statement.""" + negated_value = self.helper("operator_not", self.last_condition) + self.statement(f"{self.last_condition} = {negated_value}") + with self.if_statement(self.last_condition): + yield + + +@dataclass +class ChildrenCollector: + """Generic children collector.""" + + acc: Accumulator + start_index: int + children: List[str] = field(default_factory=list) + + def add_static(self, *args: AstNode): + self.children.extend(self.acc.make_ref(node) for node in args) + + def add_dynamic(self, *args: str): + self.children.extend(args) + + def flush(self) -> str: + return self.acc.children(self.children) + + +class CommandCollector(ChildrenCollector): + """Collector for commands.""" + + def add_static(self, *args: AstNode): + if len(args) > 1: + self.acc.statement( + f"_mecha_runtime.commands.extend({self.acc.make_ref_slice(args)})" + ) + elif args: + self.acc.statement( + f"_mecha_runtime.commands.append({self.acc.make_ref(args[0])})" + ) + + def add_dynamic(self, *args: str): + for arg in args: + self.acc.statement(f"_mecha_runtime.commands.append({arg})") + + +class RootCommandCollector(CommandCollector): + """Collector for commands in a standalone root node.""" + + def flush(self) -> str: + commands = self.acc.make_variable() + self.acc.lines[self.start_index :] = [ + line if line.startswith("!") else f" {line}" + for line in self.acc.lines[self.start_index :] + ] + self.acc.lines.insert( + self.start_index, + f"{self.acc.indentation}with _mecha_runtime.scope() as {commands}:\n", + ) + return self.acc.helper("children", commands) + + +@overload +def visit_single( + node: AstNode, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + ... + + +@overload +def visit_single( + node: AstNode, + required: Literal[True], +) -> Generator[AstNode, Optional[List[str]], str]: + ... + + +def visit_single( + node: AstNode, + required: bool = False, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + """Yield the node and make sure that it returns a single result.""" + result = yield node + + if result is None: + if required: + raise ValueError( + f"Result required for {node.__class__.__name__} {result!r}." + ) + return None + + if len(result) != 1: + raise ValueError( + f"Expected single result for {node.__class__.__name__} {result!r}." + ) + + return result[0] + + +def visit_multiple( + children: AstChildren[AstNode], + acc: Accumulator, + children_collector: Type[ChildrenCollector] = ChildrenCollector, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + """Yield all the nodes and return a single result pointing to the new children.""" + current_count = 0 + collector = None + index = len(acc.lines) + + for i, child in enumerate(children): + result = yield child + if result is None: + continue + if not collector: + collector = children_collector(acc, index) + + lines = acc.lines[index:] + del acc.lines[index:] + collector.add_static(*children[current_count:i]) + acc.lines.extend(lines) + collector.add_dynamic(*result) + + current_count = i + 1 + index = len(acc.lines) + + if collector: + collector.add_static(*children[current_count:]) + return collector.flush() + + return None + + +def visit_generic( + node: AstNode, + acc: Accumulator, + children_collector: Type[ChildrenCollector] = ChildrenCollector, +) -> Generator[AstNode, Optional[List[str]], Optional[str]]: + """Recursively yield all the fields and return a result pointing to the updated node.""" + to_replace: Dict[str, str] = {} + + for f in fields(node): + attribute = getattr(node, f.name) + result = None + + if isinstance(attribute, AstChildren): + attribute = cast(AstChildren[AstNode], attribute) + result = yield from visit_multiple(attribute, acc, children_collector) + + elif isinstance(attribute, AstNode): + result = yield from visit_single(attribute) + + if result is not None: + to_replace[f.name] = result + + if not to_replace: + return None + + return acc.replace(acc.make_ref(node), **to_replace) + + +def visit_body( + node: AstRoot, + acc: Accumulator, +) -> Generator[AstNode, Optional[List[str]], None]: + """Emit each individual command in the current scope.""" + result = yield from visit_multiple(node.commands, acc, CommandCollector) + if result is None: + acc.statement(f"_mecha_runtime.commands.extend({acc.make_ref(node)}.commands)") + + +def visit_binding( + target_node: AstNode, + op: str, + value: str, + acc: Accumulator, +) -> Generator[AstNode, Optional[List[str]], None]: + """Emit variable binding.""" + targets = yield target_node + + if not targets: + return + + if len(targets) > 1 and isinstance(target_node, AstTargetUnpack): + nodes = target_node.targets + values = [f"_mecha_unpack{i}" for i in range(len(targets))] + acc.statement(f"{', '.join(values)} = {value}", lineno=target_node) + else: + nodes = [target_node] + values = [value] + + for node, target, value in zip(nodes, targets, values): + if isinstance(node, AstTargetIdentifier) and node.rebind: + rebind = acc.helper("get_rebind", target) + acc.statement(f"_mecha_rebind = {rebind}", lineno=node) + acc.statement(f"{target} {op} {value}") + acc.statement(f"if _mecha_rebind is not None:") + with acc.block(): + acc.statement(f"{target} = _mecha_rebind({target})") + else: + acc.statement(f"{target} {op} {value}", lineno=node) + + +class Codegen(Visitor): + """Code generator.""" + + def __call__(self, node: AstRoot) -> Tuple[Optional[str], Optional[str], List[Any]]: # type: ignore + acc = Accumulator() + result = self.invoke(node, acc) + if result is None: + return None, None, acc.refs + elif len(result) != 1: + raise ValueError( + f"Expected single result for {node.__class__.__name__} {result!r}." + ) + output = acc.make_variable() + acc.statement(f"{output} = {result[0]}") + return acc.get_source(), output, acc.refs + + @rule(AstNode) + def fallback( + self, + node: AstNode, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_generic(node, acc) + if result is None: + return None + return [result] + + @rule(AstRoot) + def root( + self, + node: AstRoot, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_generic(node, acc, RootCommandCollector) + if result is None: + return None + return [result] + + @rule(AstCommand, identifier="statement") + def statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + yield node.arguments[0] + return [] + + @rule(AstCommand, identifier="def:function:body") + def function( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + signature = cast(AstFunctionSignature, node.arguments[0]) + arguments: List[str] = [ + f"{arg.name}={acc.missing()}" if arg.default else arg.name + for arg in signature.arguments + ] + + acc.statement(f"def {signature.name}({', '.join(arguments)}):") + + with acc.block(): + for arg in signature.arguments: + if arg.default: + acc.statement(f"if {arg.name} is {acc.missing()}:") + with acc.block(): + value = yield from visit_single(arg.default, required=True) + acc.statement(f"{arg.name} = {value}") + + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + + return [] + + @rule(AstCommand, identifier="return") + @rule(AstCommand, identifier="return:value") + def return_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + statement = "return" + if node.arguments: + value = yield from visit_single(node.arguments[0], required=True) + statement += f" {value}" + acc.statement(statement) + return [] + + @rule(AstCommand, identifier="yield") + @rule(AstCommand, identifier="yield:value") + @rule(AstCommand, identifier="yield:from:value") + def yield_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + statement = "yield from" if node.identifier == "yield:from:value" else "yield" + if node.arguments: + value = yield from visit_single(node.arguments[0], required=True) + statement += f" {value}" + acc.statement(statement) + return [] + + @rule(AstCommand, identifier="del:target") + def del_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + targets = yield node.arguments[0] + for target in targets or []: + acc.statement(f"del {target}") + return [] + + @rule(AstCommand, identifier="if:condition:body") + def if_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + condition = yield from visit_single(node.arguments[0], required=True) + with acc.if_statement(condition): + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + return [] + + @rule(AstCommand, identifier="else:body") + def else_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + with acc.else_statement(): + yield from visit_body(cast(AstRoot, node.arguments[0]), acc) + return [] + + @rule(AstCommand, identifier="while:condition:body") + def while_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + condition = yield from visit_single(node.arguments[0], required=True) + acc.statement(f"while {condition}:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + return [] + + @rule(AstCommand, identifier="for:target:in:iterable:body") + def for_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + iterable = yield from visit_single(node.arguments[1], required=True) + targets = yield node.arguments[0] + acc.statement(f"for {', '.join(targets or ['_'])} in {iterable}:") + with acc.block(): + yield from visit_body(cast(AstRoot, node.arguments[2]), acc) + return [] + + @rule(AstCommand, identifier="break") + def break_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement("break") + return [] + + @rule(AstCommand, identifier="continue") + def continue_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement("continue") + return [] + + @rule(AstCommand, identifier="import:module") + @rule(AstCommand, identifier="import:module:as:alias") + @rule(AstCommand, identifier="from:module:import:subcommand") + def import_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + module = cast(AstResourceLocation, node.arguments[0]) + + if node.identifier == "from:module:import:subcommand": + names: List[str] = [] + subcommand = cast(AstCommand, node.arguments[1]) + + while True: + if isinstance(name := subcommand.arguments[0], AstImportedIdentifier): + names.append(name.value) + if subcommand.identifier == "from:module:import:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + if module.namespace: + acc.statement( + f"{', '.join(names)} = _mecha_runtime.from_module_import({module.get_value()!r}, {', '.join(map(repr, names))})", + lineno=node, + ) + else: + for name in names: + rhs = acc.get_attribute(acc.import_module(module.path), name) + acc.statement(f"{name} = {rhs}", lineno=node) + + elif node.identifier == "import:module:as:alias": + alias = cast(AstImportedIdentifier, node.arguments[1]).value + + if module.namespace: + acc.statement( + f"{alias} = _mecha_runtime.import_module({module.get_value()!r}).namespace", + lineno=node, + ) + else: + rhs = acc.import_module(module.path) + acc.statement(f"{alias} = {rhs}", lineno=node) + + else: + name = module.path.partition(".")[0] + rhs = acc.import_module(module.path) + if name == module.path: + acc.statement(f"{name} = {rhs}", lineno=node) + else: + acc.statement(rhs, lineno=node) + acc.statement(f"{name} = {acc.import_module(name)}") + + return [] + + @rule(AstCommand, identifier="global:subcommand") + @rule(AstCommand, identifier="nonlocal:subcommand") + def global_nonlocal_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + storage, _, _ = node.identifier.partition(":") + + names: List[str] = [] + subcommand = cast(AstCommand, node.arguments[0]) + + while True: + if isinstance(name := subcommand.arguments[0], AstIdentifier): + names.append(name.value) + if subcommand.identifier == f"{storage}:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + acc.statement(f"{storage} {', '.join(names)}", lineno=node) + + return [] + + @rule(AstInterpolation) + def interpolation( + self, + node: AstInterpolation, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.value, required=True) + value = "f" + repr(node.prefix + "{" + result + "}") if node.prefix else result + rhs = acc.helper(f"interpolate_{node.converter}", value, acc.make_ref(node)) + acc.statement(f"{result} = {rhs}", lineno=node) + return [result] + + @rule(AstExpressionBinary) + def binary( + self, + node: AstExpressionBinary, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + left = yield from visit_single(node.left, required=True) + right = yield from visit_single(node.right, required=True) + if node.operator in ["in", "not_in"]: + value = acc.helper(f"operator_{node.operator}", left, right) + acc.statement(f"{left} = {value}", lineno=node) + else: + op = node.operator.replace("_", " ") + acc.statement(f"{left} = {left} {op} {right}", lineno=node) + return [left] + + @rule(AstExpressionBinary, operator="and") + @rule(AstExpressionBinary, operator="or") + def binary_logical( + self, + node: AstExpressionBinary, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + left = yield from visit_single(node.left, required=True) + + condition = acc.make_variable() + value = acc.helper("operator_not", left) if node.operator == "or" else left + acc.statement(f"{condition} = {value}", lineno=node.left) + + dup = acc.make_variable() + value = acc.helper("get_dup", left) + acc.statement(f"{dup} = {value}") + acc.statement(f"if {dup} is not None:") + with acc.block(): + acc.statement(f"{left} = {dup}()") + + with acc.if_statement(condition): + right = yield from visit_single(node.right, required=True) + + acc.statement(f"if {dup} is not None:") + with acc.block(): + rebind = acc.helper("get_rebind", left) + acc.statement(f"_mecha_rebind = {rebind}", lineno=node.right) + acc.statement(f"{left} = {right}") + acc.statement(f"if _mecha_rebind is not None:") + with acc.block(): + acc.statement(f"{left} = _mecha_rebind({left})") + + acc.statement("else:") + with acc.block(): + acc.statement(f"{left} = {right}") + + return [left] + + @rule(AstExpressionUnary) + def unary( + self, + node: AstExpressionUnary, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.value, required=True) + if node.operator in ["not"]: + value = acc.helper(f"operator_{node.operator}", result) + acc.statement(f"{result} = {value}", lineno=node) + else: + op = node.operator.replace("_", " ") + acc.statement(f"{result} = {op} {result}", lineno=node) + return [result] + + @rule(AstValue) + def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: + result = acc.make_variable() + acc.statement(f"{result} = {node.value!r}") + return [result] + + @rule(AstIdentifier) + def identifier(self, node: AstIdentifier, acc: Accumulator) -> Optional[List[str]]: + result = acc.make_variable() + acc.statement(f"{result} = {node.value}", lineno=node) + return [result] + + @rule(AstFormatString) + def format_string( + self, + node: AstFormatString, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + values: List[str] = [] + + for value in node.values: + result = yield from visit_single(value, required=True) + values.append(result) + + result = acc.make_variable() + acc.statement( + f"{result} = {node.fmt!r}.format({', '.join(values)})", lineno=node + ) + return [result] + + @rule(AstTuple) + def tuple( + self, + node: AstTuple, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + items: List[str] = [] + + for item in node.items: + value = yield from visit_single(item, required=True) + items.append(f"{value},") + + result = acc.make_variable() + acc.statement(f"{result} = ({''.join(items)})", lineno=node) + return [result] + + @rule(AstList) + def list( + self, + node: AstList, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + items: List[str] = [] + + for item in node.items: + value = yield from visit_single(item, required=True) + items.append(value) + + result = acc.make_variable() + acc.statement(f"{result} = [{', '.join(items)}]", lineno=node) + return [result] + + @rule(AstDict) + def dict( + self, + node: AstDict, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + items: List[str] = [] + + for item in node.items: + value = yield from visit_single(item, required=True) + items.append(value) + + result = acc.make_variable() + acc.statement(f"{result} = {{{', '.join(items)}}}", lineno=node) + return [result] + + @rule(AstDictItem) + def dict_item( + self, + node: AstDictItem, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + key = yield from visit_single(node.key, required=True) + value = yield from visit_single(node.value, required=True) + return [f"{key}: {value}"] + + @rule(AstSlice) + def slice( + self, + node: AstSlice, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + start = "" + stop = "" + step = "" + + if node.start: + start = yield from visit_single(node.start, required=True) + if node.stop: + stop = yield from visit_single(node.stop, required=True) + if node.step: + step = yield from visit_single(node.step, required=True) + + result = f"{start}:{stop}" + if step: + result += f":{step}" + + return [result] + + @rule(AstUnpack) + def unpack( + self, + node: AstUnpack, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.value, required=True) + prefix = "**" if node.type == "dict" else "*" + return [f"{prefix}{value}"] + + @rule(AstKeyword) + def keyword( + self, + node: AstKeyword, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.value, required=True) + return [f"{node.name}={value}"] + + @rule(AstAttribute) + def attribute( + self, + node: AstAttribute, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.value, required=True) + rhs = acc.get_attribute(value, node.name) + acc.statement(f"{value} = {rhs}", lineno=node) + return [value] + + @rule(AstLookup) + def lookup( + self, + node: AstLookup, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.value, required=True) + arguments: List[str] = [] + + for arg in node.arguments: + value = yield from visit_single(arg, required=True) + arguments.append(value) + + acc.statement(f"{result} = {result}[{', '.join(arguments)}]", lineno=node) + return [result] + + @rule(AstCall) + def call( + self, + node: AstCall, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.value, required=True) + arguments: List[str] = [] + + for arg in node.arguments: + value = yield from visit_single(arg, required=True) + arguments.append(value) + + acc.statement(f"{result} = {result}({', '.join(arguments)})", lineno=node) + return [result] + + @rule(AstAssignment) + def assignment( + self, + node: AstAssignment, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.value, required=True) + yield from visit_binding(node.target, node.operator, value, acc) + return [] + + @rule(AstTargetIdentifier) + def target_identifier( + self, + node: AstTargetIdentifier, + acc: Accumulator, + ) -> Optional[List[str]]: + return [node.value] + + @rule(AstTargetUnpack) + def target_destructure( + self, + node: AstTargetUnpack, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + targets: List[str] = [] + for target in node.targets: + result = yield from visit_single(target, required=True) + targets.append(result) + return targets + + @rule(AstTargetAttribute) + def target_attribute( + self, + node: AstTargetAttribute, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.value, required=True) + return [f"{value}.{node.name}"] + + @rule(AstTargetItem) + def target_item( + self, + node: AstTargetItem, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.value, required=True) + arguments: List[str] = [] + + for arg in node.arguments: + value = yield from visit_single(arg, required=True) + arguments.append(value) + + return [f"{result}[{', '.join(arguments)}]"] + + @rule(AstCommand, identifier="pass") + def pass_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement("pass") + return [] diff --git a/packages/bolt/bolt/contrib/__init__.py b/packages/bolt/bolt/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bolt/bolt/contrib/sandbox.py b/packages/bolt/bolt/contrib/sandbox.py new file mode 100644 index 000000000..c07bbca2b --- /dev/null +++ b/packages/bolt/bolt/contrib/sandbox.py @@ -0,0 +1,164 @@ +"""Plugin that sandboxes the bolt runtime.""" + + +__all__ = [ + "Sandbox", + "SandboxedGetAttribute", + "SandboxedImportModule", + "SecurityError", + "public_attrs", +] + + +import bisect +import collections +import copy +import heapq +import itertools +import json +import math +import random +from collections import defaultdict, deque +from dataclasses import dataclass, fields, is_dataclass +from typing import Any, Callable, Dict, Set, Type, Union + +from beet import Context, TreeData, TreeNode +from mecha import MechaError + +from bolt import LoopInfo, Runtime +from bolt.utils import internal + + +class SecurityError(MechaError): + """Raised when the sandboxed runtime attempts to perform a forbidden operation.""" + + +def beet_default(ctx: Context): + ctx.inject(Sandbox).activate() + + +def public_attrs(obj: Any) -> Set[str]: + """List public object attributes.""" + attrs = dir(obj) + if is_dataclass(obj): + attrs.extend(f.name for f in fields(obj)) + return {name for name in attrs if not name.startswith("_")} + + +class Sandbox: + """Bolt sandbox.""" + + runtime: Runtime + active: bool + + allowed_imports: Set[str] + allowed_obj_attrs: Dict[Any, Set[str]] + allowed_type_attrs: Dict[Type[Any], Set[str]] + + def __init__(self, ctx: Union[Context, Runtime]): + if isinstance(ctx, Context): + self.runtime = ctx.inject(Runtime) + else: + self.runtime = ctx + + self.active = False + + self.allowed_imports = { + "json", + "math", + "collections", + "itertools", + "bisect", + "heapq", + "copy", + "random", + } + self.allowed_obj_attrs = { + dict: {"fromkeys"}, + defaultdict: {"fromkeys"}, + json: {"loads", "dumps"}, + math: public_attrs(math), + collections: {"deque", "defaultdict"}, + itertools: public_attrs(itertools), + bisect: public_attrs(bisect), + heapq: public_attrs(heapq), + copy: {"copy", "deepcopy"}, + random: public_attrs(random), + } + self.allowed_type_attrs = { + str: public_attrs(str) + ^ { + "maketrans", + "translate", + "encode", + "format", + "format_map", + }, + tuple: public_attrs(tuple), + list: public_attrs(list), + dict: public_attrs(dict), + set: public_attrs(set), + TreeNode: public_attrs(TreeNode), + TreeData: public_attrs(TreeData), + LoopInfo: public_attrs(LoopInfo), + deque: public_attrs(deque), + defaultdict: public_attrs(defaultdict), + } + + def activate(self): + """Activate the sandbox.""" + if self.active: + return + self.active = True + self.runtime.globals["ctx"] = None + self.runtime.helpers.update( + get_attribute=SandboxedGetAttribute( + sandbox=self, + get_attribute=self.runtime.helpers["get_attribute"], + ), + import_module=SandboxedImportModule( + sandbox=self, + import_module=self.runtime.helpers["import_module"], + ), + ) + + +@dataclass +class SandboxedGetAttribute: + """Sandboxed get_attribute helper.""" + + sandbox: Sandbox + get_attribute: Callable[[Any, str], Any] + + @internal + def __call__(self, obj: Any, attr: str) -> Any: + if not hasattr(obj, attr): + return self.get_attribute(obj, attr) + + try: + if allowed := self.sandbox.allowed_obj_attrs.get(obj): + if attr in allowed: + return self.get_attribute(obj, attr) + except TypeError: + pass + + for cls in type.mro(type(obj)): + if allowed := self.sandbox.allowed_type_attrs.get(cls): + if attr in allowed: + return self.get_attribute(obj, attr) + + raise SecurityError(f"Access forbidden attribute {attr!r} of {type(obj)}.") + + +@dataclass +class SandboxedImportModule: + """Sandboxed import_module helper.""" + + sandbox: Sandbox + import_module: Callable[[str], Any] + + @internal + def __call__(self, name: str) -> Any: + if name in self.sandbox.allowed_imports: + return self.import_module(name) + raise SecurityError(f"Access forbidden module {name!r}.") diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py new file mode 100644 index 000000000..939a8431c --- /dev/null +++ b/packages/bolt/bolt/helpers.py @@ -0,0 +1,206 @@ +__all__ = [ + "get_bolt_helpers", +] + + +from dataclasses import dataclass, replace +from functools import partial, wraps +from importlib import import_module +from types import TracebackType +from typing import Any, Callable, ContextManager, Dict, Optional, Type +from uuid import UUID + +from tokenstream import set_location + +from mecha import ( + AstBool, + AstChildren, + AstColor, + AstCoordinate, + AstGamemode, + AstGreedy, + AstItemSlot, + AstJson, + AstMessage, + AstNbt, + AstNbtPath, + AstNode, + AstNumber, + AstObjective, + AstObjectiveCriteria, + AstPlayerName, + AstRange, + AstResourceLocation, + AstScoreboardSlot, + AstSortOrder, + AstString, + AstSwizzle, + AstTeam, + AstTime, + AstUUID, + AstVector2, + AstVector3, + AstWord, +) + +from .utils import internal + + +def get_bolt_helpers() -> Dict[str, Any]: + """Return a collection of helpers used by the generated code.""" + return { + "replace": replace, + "missing": object(), + "children": AstChildren, + "operator_not": operator_not, + "operator_in": operator_in, + "operator_not_in": operator_not_in, + "branch": BranchDriver, + "get_dup": get_dup, + "get_rebind": get_rebind, + "get_attribute": get_attribute, + "import_module": python_import_module, + "interpolate_bool": converter(AstBool.from_value), + "interpolate_numeric": converter(AstNumber.from_value), + "interpolate_coordinate": converter(AstCoordinate.from_value), + "interpolate_time": converter(AstTime.from_value), + "interpolate_word": converter(AstWord.from_value), + "interpolate_phrase": converter(AstString.from_value), + "interpolate_greedy": converter(AstGreedy.from_value), + "interpolate_json": converter(AstJson.from_value), + "interpolate_nbt": converter(AstNbt.from_value), + "interpolate_nbt_path": converter(AstNbtPath.from_value), + "interpolate_range": converter(AstRange.from_value), + "interpolate_resource_location": converter(AstResourceLocation.from_value), + "interpolate_item_slot": converter(AstItemSlot.from_value), + "interpolate_objective": converter(AstObjective.from_value), + "interpolate_objective_criteria": converter(AstObjectiveCriteria.from_value), + "interpolate_scoreboard_slot": converter(AstScoreboardSlot.from_value), + "interpolate_swizzle": converter(AstSwizzle.from_value), + "interpolate_team": converter(AstTeam.from_value), + "interpolate_color": converter(AstColor.from_value), + "interpolate_sort_order": converter(AstSortOrder.from_value), + "interpolate_gamemode": converter(AstGamemode.from_value), + "interpolate_message": converter(AstMessage.from_value), + "interpolate_vec2": converter(AstVector2.from_value), + "interpolate_vec3": converter(AstVector3.from_value), + "interpolate_entity": EntityConverter( + uuid_converter=converter(AstUUID.from_value), + player_name_converter=converter(AstPlayerName.from_value), + ), + } + + +@internal +def operator_not(obj: Any): + if func := getattr(type(obj), "__not__", None): + return func(obj) + return not obj + + +@internal +def operator_in(item: Any, container: Any): + if func := getattr(type(item), "__within__", None): + return func(item, container) + if func := getattr(type(container), "__contains__", None): + return func(container, item) + return item in container + + +@internal +def operator_not_in(item: Any, container: Any): + return operator_not(operator_in(item, container)) + + +class BranchDriver: + obj: Any + context_manager: Optional[ContextManager[Any]] + + @internal + def __init__(self, obj: Any): + self.obj = obj + self.context_manager = None + if func := getattr(type(obj), "__branch__", None): + self.context_manager = func(obj) + + @internal + def __enter__(self) -> Any: + if self.context_manager is not None: + return self.context_manager.__enter__() + return self.obj + + @internal + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> Optional[bool]: + if self.context_manager is not None: + return self.context_manager.__exit__(exc_type, exc, traceback) + + +@internal +def get_dup(obj: Any): + if func := getattr(type(obj), "__dup__", None): + return partial(func, obj) + return None + + +@internal +def get_rebind(obj: Any): + if func := getattr(type(obj), "__rebind__", None): + return partial(func, obj) + return None + + +@internal +def get_attribute(obj: Any, attr: str): + try: + return getattr(obj, attr) + except AttributeError as exc: + try: + return obj[attr] + except (TypeError, LookupError): + raise exc from None + + +@internal +def python_import_module(name: str): + try: + return import_module(name) + except Exception as exc: + tb = exc.__traceback__ + tb = tb.tb_next.tb_next # type: ignore + while tb and tb.tb_frame.f_code.co_filename.startswith(" Callable[[Any, AstNode], AstNode]: + internal(f) + + @internal + @wraps(f) + def wrapper(obj: Any, node: AstNode) -> AstNode: + return set_location(f(obj), node) + + return wrapper + + +@dataclass +class EntityConverter: + """Converter for entities.""" + + uuid_converter: Callable[[Any, AstNode], AstNode] + player_name_converter: Callable[[Any, AstNode], AstNode] + + @internal + def __call__(self, obj: Any, node: AstNode) -> AstNode: + if isinstance(obj, str): + if obj.count("-") == 4: + return self.uuid_converter(obj, node) + return self.player_name_converter(obj, node) + if isinstance(obj, UUID): + return self.uuid_converter(obj, node) + raise ValueError(f"Invalid entity value of type {type(obj)!r}.") diff --git a/packages/bolt/bolt/loop_info.py b/packages/bolt/bolt/loop_info.py new file mode 100644 index 000000000..d5923f792 --- /dev/null +++ b/packages/bolt/bolt/loop_info.py @@ -0,0 +1,100 @@ +__all__ = [ + "LoopInfo", + "loop_info", +] + + +from dataclasses import dataclass, field +from typing import ( + Any, + Generic, + Iterable, + Iterator, + List, + Optional, + Tuple, + TypeVar, + Union, + overload, +) + +from beet.core.utils import SENTINEL_OBJ, Sentinel + +T = TypeVar("T") +U = TypeVar("U") + + +def loop_info(iterable: Iterable[T]) -> "LoopInfo[T]": + return LoopInfo(iterable, iter(iterable)) + + +@dataclass +class LoopInfo(Generic[T]): + iterable: Iterable[T] + iterator: Iterator[T] + + index: int = -1 + accumulator: List[T] = field(default_factory=list) + + def __iter__(self) -> "LoopInfo[T]": + return self + + def __next__(self) -> Tuple["LoopInfo[T]", T]: + while self.index + 1 >= len(self.accumulator): + self.accumulator.append(next(self.iterator)) + self.index += 1 + return self, self.current + + @overload + def peek(self, offset: int) -> Optional[T]: + ... + + @overload + def peek(self, offset: int, default: U) -> Union[T, U]: + ... + + def peek(self, offset: int, default: Any = None) -> Any: + index = self.index + offset + + if index < 0: + return default + + try: + while index >= len(self.accumulator): + self.accumulator.append(next(self.iterator)) + except StopIteration: + return default + + return self.accumulator[index] + + @property + def before(self) -> Optional[T]: + return self.peek(-1) + + @property + def current(self) -> T: + return self.accumulator[self.index] + + @property + def after(self) -> Optional[T]: + return self.peek(1) + + @property + def count(self) -> int: + try: + return len(self.iterable) # type: ignore + except TypeError: + self.accumulator.extend(self.iterator) + return len(self.accumulator) + + @property + def first(self) -> bool: + return self.index == 0 + + @property + def last(self) -> bool: + return isinstance(self.peek(1, SENTINEL_OBJ), Sentinel) + + def cycle(self, arg: U, *args: U) -> U: + args = (arg,) + args + return args[self.index % len(args)] diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py new file mode 100644 index 000000000..cc9efe99c --- /dev/null +++ b/packages/bolt/bolt/parse.py @@ -0,0 +1,1441 @@ +__all__ = [ + "get_bolt_parsers", + "get_stream_identifiers", + "get_stream_pending_identifiers", + "get_stream_identifiers_storage", + "get_stream_pending_identifiers_storage", + "get_stream_branch_scope", + "UndefinedIdentifier", + "create_bolt_root_parser", + "ExecuteIfConditionConstraint", + "BranchScopeManager", + "InterpolationParser", + "parse_statement", + "AssignmentTargetParser", + "IfElseLoweringParser", + "BreakContinueConstraint", + "FlushPendingIdentifiersParser", + "parse_function_signature", + "parse_function_root", + "parse_del_target", + "parse_identifier", + "ImportLocationConstraint", + "ImportStatementHandler", + "parse_import_name", + "GlobalNonlocalHandler", + "parse_name_list", + "FunctionRootBacktracker", + "FunctionConstraint", + "BinaryParser", + "UnaryParser", + "UnpackParser", + "UnpackConstraint", + "KeywordParser", + "LookupParser", + "PrimaryParser", + "parse_dict_item", + "LiteralParser", + "UndefinedIdentifierErrorHandler", +] + + +import keyword +import re +from dataclasses import dataclass, field, replace +from difflib import get_close_matches +from typing import Any, Dict, List, Optional, Set, Tuple, cast + +from beet.core.utils import required_field +from tokenstream import InvalidSyntax, Token, TokenStream, set_location + +from mecha import ( + AlternativeParser, + AstChildren, + AstCommand, + AstResourceLocation, + AstRoot, + CommentDisambiguation, + CompilationDatabase, + Parser, + consume_line_continuation, + delegate, + get_stream_scope, +) +from mecha.contrib.relative_location import resolve_using_database +from mecha.utils import ( + JsonQuoteHelper, + QuoteHelper, + normalize_whitespace, + string_to_number, +) + +from .ast import ( + AstAssignment, + AstAttribute, + AstCall, + AstDict, + AstDictItem, + AstExpression, + AstExpressionBinary, + AstExpressionUnary, + AstFormatString, + AstFunctionRoot, + AstFunctionSignature, + AstFunctionSignatureArgument, + AstIdentifier, + AstImportedIdentifier, + AstInterpolation, + AstKeyword, + AstList, + AstLookup, + AstSlice, + AstTarget, + AstTargetAttribute, + AstTargetIdentifier, + AstTargetItem, + AstTargetUnpack, + AstTuple, + AstUnpack, + AstValue, +) + +KEYWORD_PATTERN: str = "|".join(rf"\b{kw}\b" for kw in keyword.kwlist) + +TRUE_PATTERN: str = r"\b[tT]rue\b" +FALSE_PATTERN: str = r"\b[fF]alse\b" +NULL_PATTERN: str = r"\b(?:null|None)\b" +IDENTIFIER_PATTERN: str = rf"(?!_mecha_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" +STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" +NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" +RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" + +IMPORT_REGEX = re.compile(rf"^{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*$") + + +def get_bolt_parsers( + parsers: Dict[str, Parser], + database: CompilationDatabase, +) -> Dict[str, Parser]: + """Return the bolt parsers.""" + return { + ################################################################################ + # Command + ################################################################################ + "root": create_bolt_root_parser(parsers["root"]), + "nested_root": create_bolt_root_parser(parsers["nested_root"]), + "command": UndefinedIdentifierErrorHandler( + ImportStatementHandler( + GlobalNonlocalHandler(ExecuteIfConditionConstraint(parsers["command"])) + ) + ), + "command:argument:bolt:if_block": delegate("bolt:if_block"), + "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), + "command:argument:bolt:elif_block": delegate("bolt:elif_block"), + "command:argument:bolt:else_block": delegate("bolt:else_block"), + "command:argument:bolt:statement": delegate("bolt:statement"), + "command:argument:bolt:assignment_target": delegate("bolt:assignment_target"), + "command:argument:bolt:import": delegate("bolt:import"), + "command:argument:bolt:import_name": delegate("bolt:import_name"), + "command:argument:bolt:global_name": delegate("bolt:global_name"), + "command:argument:bolt:nonlocal_name": delegate("bolt:nonlocal_name"), + "command:argument:bolt:expression": delegate("bolt:expression"), + "command:argument:bolt:function_signature": delegate("bolt:function_signature"), + "command:argument:bolt:function_root": delegate("bolt:function_root"), + "command:argument:bolt:del_target": delegate("bolt:del_target"), + ################################################################################ + # Bolt + ################################################################################ + "bolt:if_block": BranchScopeManager( + parser=delegate("nested_root"), + update_before=True, + ), + "bolt:elif_condition": BranchScopeManager( + parser=delegate("bolt:expression"), + mask=True, + update_after=True, + ), + "bolt:elif_block": BranchScopeManager( + parser=delegate("nested_root"), + mask=True, + ), + "bolt:else_block": BranchScopeManager( + parser=delegate("nested_root"), + mask=True, + ), + "bolt:statement": parse_statement, + "bolt:assignment_target": AssignmentTargetParser( + allow_undefined_identifiers=True, + allow_multiple=True, + ), + "bolt:augmented_assignment_target": AssignmentTargetParser(), + "bolt:function_signature": parse_function_signature, + "bolt:function_root": parse_function_root, + "bolt:del_target": parse_del_target, + "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), + "bolt:identifier": parse_identifier, + "bolt:import": ImportLocationConstraint(parsers["resource_location_or_tag"]), + "bolt:import_name": parse_import_name, + "bolt:global_name": parse_name_list, + "bolt:nonlocal_name": parse_name_list, + "bolt:expression": delegate("bolt:disjunction"), + "bolt:disjunction": BinaryParser( + operators=[r"\bor\b"], + parser=delegate("bolt:conjunction"), + ), + "bolt:conjunction": BinaryParser( + operators=[r"\band\b"], + parser=delegate("bolt:inversion"), + ), + "bolt:inversion": UnaryParser( + operators=[r"\bnot\b"], + parser=delegate("bolt:comparison"), + ), + "bolt:comparison": BinaryParser( + operators=[ + "==", + "!=", + "<=", + "<", + ">=", + ">", + r"\bnot\s+in\b", + r"\bin\b", + r"\bis\s+not\b", + r"\bis\b", + ], + parser=delegate("bolt:bitwise_or"), + ), + "bolt:bitwise_or": BinaryParser( + operators=[r"\|(?!=)"], + parser=delegate("bolt:bitwise_xor"), + ), + "bolt:bitwise_xor": BinaryParser( + operators=[r"\^(?!=)"], + parser=delegate("bolt:bitwise_and"), + ), + "bolt:bitwise_and": BinaryParser( + operators=[r"&(?!=)"], + parser=delegate("bolt:shift_expr"), + ), + "bolt:shift_expr": BinaryParser( + operators=[r"<<(?!=)", r">>(?!=)"], + parser=delegate("bolt:sum"), + ), + "bolt:sum": BinaryParser( + operators=[r"\+(?!=)", r"-(?!=)"], + parser=delegate("bolt:term"), + ), + "bolt:term": BinaryParser( + operators=[r"\*(?!=)", r"//(?!=)", r"/(?!=)", r"%(?!=)"], + parser=delegate("bolt:factor"), + ), + "bolt:factor": UnaryParser( + operators=[r"\+", "-"], + parser=delegate("bolt:power"), + ), + "bolt:power": BinaryParser( + operators=[r"\*\*(?!=)"], + parser=delegate("bolt:primary"), + right_associative=True, + ), + "bolt:lookup_argument": LookupParser(delegate("bolt:expression")), + "bolt:call_argument": AlternativeParser( + [ + KeywordParser(delegate("bolt:expression")), + UnpackParser(delegate("bolt:expression")), + delegate("bolt:expression"), + ] + ), + "bolt:primary": PrimaryParser(delegate("bolt:atom")), + "bolt:atom": AlternativeParser( + [ + delegate("bolt:identifier"), + delegate("bolt:literal"), + ] + ), + "bolt:list_item": AlternativeParser( + [ + UnpackConstraint( + type="list", + parser=UnpackParser(delegate("bolt:expression")), + ), + delegate("bolt:expression"), + ] + ), + "bolt:dict_item": AlternativeParser( + [ + UnpackConstraint( + type="dict", + parser=UnpackParser(delegate("bolt:expression")), + ), + parse_dict_item, + ] + ), + "bolt:literal": LiteralParser(database), + ################################################################################ + # Interpolation + ################################################################################ + "bool": InterpolationParser("bool", parsers["bool"], fallback=True), + "numeric": InterpolationParser( + "numeric", parsers["numeric"], prefix="-", fallback=True + ), + "coordinate": InterpolationParser( + "coordinate", parsers["coordinate"], prefix="[~^]-?|-", fallback=True + ), + "time": InterpolationParser("time", parsers["time"], fallback=True), + "word": InterpolationParser("word", parsers["word"]), + "phrase": InterpolationParser("phrase", parsers["phrase"]), + "greedy": InterpolationParser("greedy", parsers["greedy"]), + "json": InterpolationParser("json", parsers["json"]), + "nbt": InterpolationParser("nbt", parsers["nbt"]), + "nbt_path": InterpolationParser("nbt_path", parsers["nbt_path"]), + "range": InterpolationParser("range", parsers["range"], fallback=True), + "resource_location_or_tag": CommentDisambiguation( + InterpolationParser( + "resource_location", parsers["resource_location_or_tag"], prefix=r"#" + ) + ), + "item_slot": InterpolationParser( + "item_slot", parsers["item_slot"], fallback=True + ), + "objective": InterpolationParser("objective", parsers["objective"]), + "objective_criteria": InterpolationParser( + "objective_criteria", parsers["objective_criteria"] + ), + "scoreboard_slot": InterpolationParser( + "scoreboard_slot", parsers["scoreboard_slot"], fallback=True + ), + "swizzle": InterpolationParser("swizzle", parsers["swizzle"], fallback=True), + "team": InterpolationParser("team", parsers["team"]), + "color": InterpolationParser("color", parsers["color"]), + "sort_order": InterpolationParser( + "sort_order", parsers["sort_order"], fallback=True + ), + "gamemode": InterpolationParser("gamemode", parsers["gamemode"], fallback=True), + "message": InterpolationParser("message", parsers["message"]), + "block_pos": InterpolationParser("vec3", parsers["block_pos"], fallback=True), + "column_pos": InterpolationParser("vec2", parsers["column_pos"], fallback=True), + "rotation": InterpolationParser("vec2", parsers["rotation"], fallback=True), + "vec2": InterpolationParser("vec2", parsers["vec2"], fallback=True), + "vec3": InterpolationParser("vec3", parsers["vec3"], fallback=True), + "entity": CommentDisambiguation( + InterpolationParser("entity", parsers["entity"]) + ), + "score_holder": CommentDisambiguation( + InterpolationParser("entity", parsers["score_holder"]) + ), + } + + +def get_stream_identifiers(stream: TokenStream) -> Set[str]: + """Return the set of accessible identifiers currently associated with the token stream.""" + return stream.data.setdefault("identifiers", set()) + + +def get_stream_pending_identifiers(stream: TokenStream) -> Set[str]: + """Return the set of pending identifiers currently associated with the token stream.""" + return stream.data.setdefault("pending_identifiers", set()) + + +def get_stream_identifiers_storage(stream: TokenStream) -> Dict[str, str]: + """Return a dict that associates storage type to identifiers.""" + return stream.data.setdefault("identifiers_storage", {}) + + +def get_stream_pending_identifiers_storage(stream: TokenStream) -> Dict[str, str]: + """Return a dict that associates pending storage type to identifiers.""" + return stream.data.setdefault("pending_identifiers_storage", {}) + + +def get_stream_branch_scope(stream: TokenStream) -> Set[str]: + """Return the identifiers available inside the branch.""" + return stream.data.setdefault("branch_scope", set()) + + +class UndefinedIdentifier(InvalidSyntax): + """Raised when an identifier is not defined.""" + + token: Token + identifiers: Set[str] + + def __init__(self, token: Token, identifiers: Set[str]): + super().__init__(token, identifiers) + self.token = token + self.identifiers = identifiers + + def __str__(self) -> str: + msg = f"Identifier {self.token.value!r} is not defined." + + if matches := get_close_matches(self.token.value, self.identifiers): + matches = [repr(m) for m in matches] + + if len(matches) == 1: + suggestion = f"{matches[0]}" + else: + *head, before_last, last = matches + suggestion = ", ".join(head + [f"{before_last} or {last}"]) + + msg += f" Did you mean {suggestion}?" + + return msg + + +def create_bolt_root_parser(parser: Parser): + """Return parser for the root node for bolt.""" + return FunctionRootBacktracker( + FlushPendingIdentifiersParser( + FunctionConstraint( + BreakContinueConstraint( + parser=IfElseLoweringParser(parser), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ), + command_identifiers={ + "return", + "return:value", + "yield", + "yield:value", + "yield:from:value", + "global:subcommand", + "nonlocal:subcommand", + }, + ) + ) + ) + + +@dataclass +class ExecuteIfConditionConstraint: + """Constraint that prevents inlining if conditions as execute subcommands.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier == "execute:if:condition:body": + exc = InvalidSyntax("Can't inline conditions as execute subcommands.") + raise set_location(exc, node) + + return node + + +@dataclass +class BranchScopeManager: + """Parser that manages accessible identifiers for conditional branches.""" + + parser: Parser + mask: bool = False + update_before: bool = False + update_after: bool = False + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + branch_scope = get_stream_branch_scope(stream) + + mask = branch_scope and identifiers - branch_scope + mask_storage = { + identifier: identifiers_storage[identifier] + for identifier in set(identifiers_storage) & mask + } + + if self.mask: + identifiers -= mask + for identifier in mask_storage: + del identifiers_storage[identifier] + + if self.update_before: + branch_scope = identifiers.copy() + + try: + return self.parser(stream) + finally: + if self.update_after: + branch_scope = identifiers.copy() + + if self.mask: + identifiers.update(mask) + identifiers_storage.update(mask_storage) + + stream.data["branch_scope"] = branch_scope + + +@dataclass +class InterpolationParser: + """Parser for interpolation.""" + + converter: str + parser: Parser + prefix: Optional[str] = None + fallback: bool = False + + def __call__(self, stream: TokenStream) -> Any: + order = ["interpolation", "original"] + if self.fallback: + order.reverse() + for parser, alternative in stream.choose(*order): + with alternative: + if parser == "interpolation": + with stream.syntax(prefix=self.prefix): + prefix = stream.get("prefix") + node = delegate("bolt:interpolation", stream) + node = AstInterpolation( + prefix=prefix.value if prefix else None, + converter=self.converter, + value=node, + ) + return set_location(node, prefix or node.value, node.value) + elif parser == "original": + return self.parser(stream) + + +def parse_statement(stream: TokenStream) -> Any: + """Parse statement.""" + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) + + for parser, alternative in stream.choose( + "bolt:augmented_assignment_target", + "bolt:assignment_target", + "bolt:expression", + ): + with alternative: + pending_identifiers.clear() + pending_identifiers_storage.clear() + node = delegate(parser, stream) + + pattern = r"=(?!=)|\+=|-=|\*=|//=|/=|%=|&=|\|=|\^=|<<=|>>=|\*\*=" + + if isinstance(node, AstTarget): + if parser == "bolt:assignment_target": + pattern = r"=(?!=)" + with stream.syntax(assignment=pattern): + op = stream.expect("assignment") + + expression = delegate("bolt:expression", stream) + + identifiers |= pending_identifiers + pending_identifiers.clear() + identifiers_storage.update(pending_identifiers_storage) + pending_identifiers_storage.clear() + + node = AstAssignment(operator=op.value, target=node, value=expression) + node = set_location(node, node.target, node.value) + + elif isinstance(node, AstAttribute): + with stream.syntax(assignment=pattern): + op = stream.get("assignment") + + if op: + expression = delegate("bolt:expression", stream) + target = AstTargetAttribute( + name=node.name, + value=node.value, + ) + node = AstAssignment( + operator=op.value, + target=set_location(target, node), + value=expression, + ) + node = set_location(node, node.target, node.value) + + elif isinstance(node, AstLookup): + with stream.syntax(assignment=pattern): + op = stream.get("assignment") + + if op: + expression = delegate("bolt:expression", stream) + target = AstTargetItem( + value=node.value, + arguments=node.arguments, + ) + node = AstAssignment( + operator=op.value, + target=set_location(target, node), + value=expression, + ) + node = set_location(node, node.target, node.value) + + # Make sure that the statement is not followed by anything. + current_index = stream.index + stream.expect("newline", "eof") + stream.index = current_index + + return node + + +@dataclass +class AssignmentTargetParser: + """Parser for assignment targets.""" + + allow_undefined_identifiers: bool = False + allow_multiple: bool = False + + def __call__(self, stream: TokenStream) -> AstTarget: + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) + + nodes: List[AstTarget] = [] + + with stream.syntax(identifier=IDENTIFIER_PATTERN, comma=r","): + while True: + token = stream.expect("identifier") + is_defined = token.value in identifiers + with_storage = token.value in identifiers_storage + rebind = is_defined and with_storage + + if self.allow_undefined_identifiers: + pending_identifiers.add(token.value) + if not with_storage: + pending_identifiers_storage[token.value] = "local" + elif not rebind: + exc = UndefinedIdentifier(token, set(identifiers_storage)) + if is_defined and not with_storage: + exc.notes.append( + f"Use 'global {token.value}' or 'nonlocal {token.value}' to mutate the variable defined in outer scope." + ) + raise set_location(exc, token) + + target = AstTargetIdentifier(value=token.value, rebind=rebind) + nodes.append(set_location(target, token)) + + if not self.allow_multiple or not stream.get("comma"): + break + + if len(nodes) == 1: + return nodes[0] + + node = AstTargetUnpack(targets=AstChildren(nodes)) + return set_location(node, nodes[0], nodes[-1]) + + +@dataclass +class IfElseLoweringParser: + """Parser that turns elif statements into if statements in an else clause.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> AstRoot: + node: AstRoot = self.parser(stream) + + changed = False + result: List[AstCommand] = [] + + commands = iter(node.commands) + previous = "" + + for command in commands: + if command.identifier in ["elif:condition:body", "else:body"]: + if previous not in ["if:condition:body", "elif:condition:body"]: + exc = InvalidSyntax( + "Conditional branch must be part of an if statement." + ) + raise set_location(exc, command, command.arguments[-1].location) + + if command.identifier == "elif:condition:body": + changed = True + elif_chain = [command] + + for command in commands: + if command.identifier not in ["elif:condition:body", "else:body"]: + break + elif_chain.append(command) + else: + command = None + + if elif_chain[-1].identifier == "else:body": + last = [elif_chain.pop()] + else: + last = [] + + for stmt in reversed(elif_chain): + stmt = replace(stmt, identifier="if:condition:body") + stmt = AstRoot(commands=AstChildren([stmt, *last])) + stmt = set_location(stmt, stmt.commands[0], stmt.commands[-1]) + stmt = AstCommand( + identifier="else:body", + arguments=AstChildren([stmt]), + ) + last = [set_location(stmt, stmt.arguments[0])] + + result.append(last[0]) + + if not command: + break + + previous = command.identifier + result.append(command) + + if changed: + node = replace(node, commands=AstChildren(result)) + + return node + + +@dataclass +class BreakContinueConstraint: + """Constraint that makes sure that break and continue statements only occur in loops.""" + + parser: Parser + allowed_scopes: Set[Tuple[str, ...]] + + def __call__(self, stream: TokenStream) -> AstRoot: + scope = get_stream_scope(stream) + loop = stream.data.get("loop") or scope in self.allowed_scopes + + with stream.provide(loop=loop): + node: AstRoot = self.parser(stream) + + if not loop: + for command in node.commands: + if command.identifier in ["break", "continue"]: + exc = InvalidSyntax( + f"Can only use {command.identifier!r} in loops." + ) + raise set_location(exc, command) + + return node + + +@dataclass +class FlushPendingIdentifiersParser: + """Parser that flushes pending identifiers.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) + + identifiers |= pending_identifiers + pending_identifiers.clear() + identifiers_storage.update(pending_identifiers_storage) + pending_identifiers_storage.clear() + + return self.parser(stream) + + +def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: + """Parse function signature.""" + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + scoped_identifiers = set(identifiers) + + arguments: List[AstFunctionSignatureArgument] = [] + + with stream.syntax( + comma=r",", + equal=r"=(?!=)", + brace=r"\(|\)", + identifier=IDENTIFIER_PATTERN, + ): + identifier = stream.expect("identifier") + stream.expect(("brace", "(")) + + scoped_identifiers.add(identifier.value) + + with stream.ignore("newline"): + for _ in stream.peek_until(("brace", ")")): + name = stream.expect("identifier") + + default = None + if stream.get("equal"): + with stream.provide( + identifiers=scoped_identifiers | {arg.name for arg in arguments} + ): + default = delegate("bolt:expression", stream) + + argument = AstFunctionSignatureArgument( + name=name.value, + default=default, + ) + arguments.append(set_location(argument, name, stream.current)) + + if not stream.get("comma"): + stream.expect(("brace", ")")) + break + + identifiers.add(identifier.value) + pending_identifiers |= {arg.name for arg in arguments} + + node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) + return set_location(node, identifier, stream.current) + + +def parse_function_root(stream: TokenStream) -> AstFunctionRoot: + """Parse function root.""" + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + + stream_copy = stream.copy() + + with stream.syntax(statement=r"[^\s#].*"): + token = stream.expect("statement") + while consume_line_continuation(stream): + stream.expect("statement") + + stream_copy.data["identifiers"] = identifiers | pending_identifiers + stream_copy.data["pending_identifiers"] = set() + stream_copy.data["identifiers_storage"] = {} + stream_copy.data["pending_identifiers_storage"] = {} + stream_copy.data["branch_scope"] = set() + + pending_identifiers.clear() + + node = AstFunctionRoot(stream=stream_copy) + return set_location(node, token, stream.current) + + +def parse_del_target(stream: TokenStream) -> AstTarget: + node = delegate("bolt:expression", stream) + + if isinstance(node, AstIdentifier): + return set_location(AstTargetIdentifier(value=node.value), node) + elif isinstance(node, AstAttribute): + return set_location(AstTargetAttribute(name=node.name, value=node.value), node) + elif isinstance(node, AstLookup): + return set_location( + AstTargetItem(value=node.value, arguments=node.arguments), node + ) + + exc = InvalidSyntax("Can only delete variables, attributes, or subscripted items.") + raise set_location(exc, node) + + +def parse_identifier(stream: TokenStream) -> AstIdentifier: + """Parse identifier.""" + identifiers = get_stream_identifiers(stream) + + with stream.syntax( + true=TRUE_PATTERN, + false=FALSE_PATTERN, + null=NULL_PATTERN, + identifier=IDENTIFIER_PATTERN, + ): + token = stream.expect("identifier") + + if token.value not in identifiers: + exc = UndefinedIdentifier(token, set(identifiers)) + raise set_location(exc, token) + + return set_location(AstIdentifier(value=token.value), token) + + +@dataclass +class ImportLocationConstraint: + """Constraint for import location.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstResourceLocation = self.parser(stream) + + if node.is_tag or node.namespace is None and not IMPORT_REGEX.match(node.path): + exc = InvalidSyntax(f"Invalid module location {node.get_value()!r}.") + raise set_location(exc, node) + + return node + + +@dataclass +class ImportStatementHandler: + """Handle import statements.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + identifiers = get_stream_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier == "import:module": + if isinstance(module := node.arguments[0], AstResourceLocation): + if module.namespace: + exc = InvalidSyntax( + f"Can't import {module.get_value()!r} without alias." + ) + raise set_location(exc, module) + else: + identifiers.add(module.path.partition(".")[0]) + elif node.identifier == "import:module:as:alias": + if isinstance(alias := node.arguments[1], AstImportedIdentifier): + identifiers.add(alias.value) + identifiers_storage.setdefault(alias.value, "local") + elif node.identifier == "from:module:import:subcommand": + subcommand = cast(AstCommand, node.arguments[1]) + while True: + if isinstance( + name := subcommand.arguments[0], AstImportedIdentifier + ): + identifiers.add(name.value) + identifiers_storage.setdefault(name.value, "local") + if subcommand.identifier == "from:module:import:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + return node + + +def parse_import_name(stream: TokenStream) -> AstImportedIdentifier: + """Parse import name.""" + with stream.syntax(name=IDENTIFIER_PATTERN, comma=r","): + token = stream.expect("name") + stream.get("comma") + return set_location(AstImportedIdentifier(value=token.value), token) + + +@dataclass +class GlobalNonlocalHandler: + """Handle global and nonlocal declarations.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + identifiers_storage = get_stream_identifiers_storage(stream) + + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier in ["global:subcommand", "nonlocal:subcommand"]: + storage, _, _ = node.identifier.partition(":") + subcommand = cast(AstCommand, node.arguments[0]) + while True: + if isinstance(name := subcommand.arguments[0], AstIdentifier): + s = identifiers_storage.setdefault(name.value, storage) + if s != storage: + exc = InvalidSyntax(f"Can't make {s} identifier {storage}.") + raise set_location(exc, name) + if subcommand.identifier == f"{storage}:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + return node + + +def parse_name_list(stream: TokenStream) -> AstIdentifier: + """Parse name list.""" + node = delegate("bolt:identifier", stream) + with stream.syntax(comma=r","): + stream.get("comma") + return node + + +@dataclass +class FunctionRootBacktracker: + """Parser for backtracking over function root nodes.""" + + parser: Parser = required_field() + + def __call__(self, stream: TokenStream) -> AstRoot: + should_replace = False + commands: List[AstCommand] = [] + + node: AstRoot = self.parser(stream) + + identifiers = get_stream_identifiers(stream) + + for command in node.commands: + if command.identifier == "def:function:body": + if isinstance(function_root := command.arguments[-1], AstFunctionRoot): + should_replace = True + + function_stream = function_root.stream + function_stream.data["identifiers"] |= identifiers + function_stream.data["function"] = True + + if isinstance(s := command.arguments[0], AstFunctionSignature): + function_stream.data["identifiers_storage"].update( + {arg.name: "local" for arg in s.arguments} + ) + + command = replace( + command, + arguments=AstChildren( + [ + *command.arguments[:-1], + delegate("nested_root", function_root.stream), + ] + ), + ) + + commands.append(command) + + if should_replace: + return replace(node, commands=AstChildren(commands)) + + return node + + +@dataclass +class FunctionConstraint: + """Constraint that makes sure that the given statements only occur in functions.""" + + parser: Parser + command_identifiers: Set[str] + + def __call__(self, stream: TokenStream) -> AstRoot: + node = self.parser(stream) + + if stream.data.get("function"): + return node + + if isinstance(node, AstRoot): + for command in node.commands: + if command.identifier in self.command_identifiers: + name, _, _ = command.identifier.partition(":") + exc = InvalidSyntax(f"Can only use {name!r} in functions.") + raise set_location(exc, command) + + return node + + +@dataclass +class BinaryParser: + """Parser for binary expressions.""" + + operators: List[str] + parser: Parser + right_associative: bool = False + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(operator="|".join(self.operators)): + nodes = [self.parser(stream)] + operations: List[str] = [] + + for op in stream.collect("operator"): + nodes.append(self.parser(stream)) + operations.append(normalize_whitespace(op.value)) + + if self.right_associative: + result = nodes[-1] + nodes = nodes[-2::-1] + operations = operations[::-1] + else: + result = nodes[0] + nodes = nodes[1:] + + for op, node in zip(operations, nodes): + if self.right_associative: + result, node = node, result + result = AstExpressionBinary(operator=op, left=result, right=node) + result = set_location(result, result.left, result.right) + + return result + + +@dataclass +class UnaryParser: + """Parser for unary expressions.""" + + operators: List[str] + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(operator="|".join(self.operators)): + if op := stream.get("operator"): + operator = normalize_whitespace(op.value) + node = AstExpressionUnary(operator=operator, value=self(stream)) + return set_location(node, op, node.value) + return self.parser(stream) + + +@dataclass +class UnpackParser: + """Parser for unpacking.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(prefix=r"\*\*|\*"): + prefix = stream.expect("prefix") + + node = self.parser(stream) + + node = AstUnpack(type="dict" if prefix.value == "**" else "list", value=node) + return set_location(node, prefix, node.value) + + +@dataclass +class UnpackConstraint: + """Constraint for unpacking.""" + + type: str + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if isinstance(node := self.parser(stream), AstUnpack): + if node.type != self.type: + exc = InvalidSyntax(f"{node.type.capitalize()} unpacking not allowed.") + raise node.emit_error(exc) + return node + + +@dataclass +class KeywordParser: + """Parser for keywords.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(name=IDENTIFIER_PATTERN, equal=r"=(?!=)"): + name = stream.expect("name") + stream.expect("equal") + + node = self.parser(stream) + + node = AstKeyword(name=name.value, value=node) + return set_location(node, name, node.value) + + +@dataclass +class LookupParser: + """Parser for lookups.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + start = None + stop = None + step = None + + with stream.provide(bolt_lookup=True), stream.syntax( + colon=r":", + comma=r",", + bracket=r"\]", + ): + colon1 = stream.get("colon") + + if not colon1: + start = self.parser(stream) + location = start.location + colon1 = stream.get("colon") + else: + location = colon1.location + + if not colon1: + return start + + colon2 = stream.get("colon") + + if not colon2: + with stream.checkpoint(): + sep = stream.get("comma", "bracket") + if not sep: + stop = self.parser(stream) + colon2 = stream.get("colon") + + if colon2: + with stream.checkpoint(): + sep = stream.get("comma", "bracket") + if not sep: + step = self.parser(stream) + + node = AstSlice(start=start, stop=stop, step=step) + return set_location(node, location, stream.location) + + +@dataclass +class PrimaryParser: + """Parser for primary expressions.""" + + parser: Parser + quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax(brace=r"\(|\)", comma=r",", format_string=r"f['\"]"): + token = stream.get(("brace", "("), "format_string") + + if token and token.match("brace"): + with stream.ignore("newline"): + comma = None + items: List[AstExpression] = [] + + for _ in stream.peek_until(("brace", ")")): + items.append(delegate("bolt:expression", stream)) + + if not (comma := stream.get("comma")): + stream.expect(("brace", ")")) + break + + if len(items) == 1 and not comma: + node = items[0] + else: + node = AstTuple(items=AstChildren(items)) + node = set_location(node, token, stream.current) + + elif token and token.match("format_string"): + quote = token.value[-1] + + with stream.provide(bolt_format_string=True), stream.syntax( + escape=rf"\\.", + double_brace=r"\{\{|\}\}", + brace=r"\{|\}", + quote=quote, + text=r"[^\\]+?", + ): + fmt = quote + values: List[AstExpression] = [] + + for escape, double_brace, brace, text in stream.collect( + "escape", + "double_brace", + ("brace", "{"), + "text", + ): + if escape: + fmt += escape.value + elif double_brace: + fmt += double_brace.value + elif brace: + fmt += "{" + with stream.syntax(text=None): + values.append(delegate("bolt:expression", stream)) + with stream.syntax(spec=r"[:!][^\}]+", double_brace=None): + if spec := stream.get("spec"): + fmt += spec.value + stream.expect(("brace", "}")) + fmt += "}" + elif text: + fmt += text.value + + end_quote = stream.expect("quote") + fmt += end_quote.value + + fmt = self.quote_helper.unquote_string( + Token( + "format_string", + fmt, + token.location.with_horizontal_offset(1), + end_quote.end_location, + ) + ) + + node = AstFormatString(fmt=fmt, values=AstChildren(values)) + node = set_location(node, token, end_quote) + + else: + node = self.parser(stream) + + with stream.syntax( + dot=r"\.", + comma=r",", + brace=r"\(|\)", + bracket=r"\[|\]", + identifier=IDENTIFIER_PATTERN, + string=STRING_PATTERN, + number=r"(?:0|[1-9][0-9]*)", + ): + while token := stream.get("dot", ("brace", "("), ("bracket", "[")): + arguments: List[Any] = [] + + if token.match("dot"): + identifier, string, number = stream.expect( + "identifier", + "string", + "number", + ) + + if identifier: + node = AstAttribute(value=node, name=identifier.value) + node = set_location(node, node.value, identifier) + continue + + if string: + value = self.quote_helper.unquote_string(string) + elif number: + value = int(number.value) + + arguments.append(set_location(AstValue(value=value), stream.current)) # type: ignore + + else: + if token.match("brace"): + close = ("brace", ")") + argument_parser = delegate("bolt:call_argument") + else: + close = ("bracket", "]") + argument_parser = delegate("bolt:lookup_argument") + + allow_positional = True + + with stream.ignore("newline"): + for _ in stream.peek_until(close): + argument = argument_parser(stream) + + if isinstance(argument, AstKeyword): + allow_positional = False + elif isinstance(argument, AstUnpack): + if argument.type == "dict": + allow_positional = False + elif not allow_positional: + exc = InvalidSyntax( + "List unpacking not allowed after keyword arguments." + ) + raise argument.emit_error(exc) + elif not allow_positional: + exc = InvalidSyntax( + "Positional argument not allowed after keyword arguments." + ) + raise argument.emit_error(exc) + + arguments.append(argument) + + if not stream.get("comma"): + stream.expect(close) + break + + if token.match("brace"): + node = AstCall(value=node, arguments=AstChildren(arguments)) + else: + if not arguments: + arguments = [ + set_location(AstSlice(), node.end_location, stream.current) + ] + node = AstLookup(value=node, arguments=AstChildren(arguments)) + + node = set_location(node, node.value, stream.current) + + return node + + +def parse_dict_item(stream: TokenStream) -> Any: + """Parse dict item node.""" + identifiers = get_stream_identifiers(stream) + + with stream.syntax(colon=r":", identifier=IDENTIFIER_PATTERN): + with stream.checkpoint() as commit: + identifier = stream.expect("identifier") + stream.expect("colon") + commit() + + if identifier.value in identifiers: + key = AstIdentifier(value=identifier.value) + else: + key = AstValue(value=identifier.value) + + key = set_location(key, identifier) + + if commit.rollback: + key = delegate("bolt:expression", stream) + stream.expect("colon") + + value = delegate("bolt:expression", stream) + + item = AstDictItem(key=key, value=value) + return set_location(item, key, value) + + +@dataclass +class LiteralParser: + """Parser for literals.""" + + database: CompilationDatabase + quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) + + def __call__(self, stream: TokenStream) -> Any: + with stream.syntax( + curly=r"\{|\}", + bracket=r"\[|\]", + comma=r",", + true=TRUE_PATTERN, + false=FALSE_PATTERN, + null=NULL_PATTERN, + string=STRING_PATTERN, + resource=( + None + if stream.data.get("bolt_lookup") + or stream.data.get("bolt_format_string") + else RESOURCE_LOCATION_PATTERN + ), + number=NUMBER_PATTERN, + ): + curly, bracket, true, false, null, string, resource, number = stream.expect( + ("curly", "{"), + ("bracket", "["), + "true", + "false", + "null", + "string", + "resource", + "number", + ) + + if curly: + items: List[Any] = [] + + with stream.ignore("newline"): + for _ in stream.peek_until(("curly", "}")): + items.append(delegate("bolt:dict_item", stream)) + + if not stream.get("comma"): + stream.expect(("curly", "}")) + break + + node = AstDict(items=AstChildren(items)) + return set_location(node, curly, stream.current) + + if bracket: + elements: List[Any] = [] + + with stream.ignore("newline"): + for _ in stream.peek_until(("bracket", "]")): + elements.append(delegate("bolt:list_item", stream)) + + if not stream.get("comma"): + stream.expect(("bracket", "]")) + break + + node = AstList(items=AstChildren(elements)) + return set_location(node, bracket, stream.current) + + if true: + value = True + elif false: + value = False + elif null: + value = None + elif string: + value = self.quote_helper.unquote_string(string) + elif resource: + if resource.value.startswith(("./", "../")): + value = ":".join( + resolve_using_database( + relative_path=resource.value, + database=self.database, + location=resource.location, + end_location=resource.end_location, + ) + ) + else: + value = resource.value + elif number: + value = string_to_number(number.value) + + node = AstValue(value=value) # type: ignore + return set_location(node, stream.current) + + +@dataclass +class UndefinedIdentifierErrorHandler: + """Parser that provides hints for errors involving undefined identifiers.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + try: + return self.parser(stream) + except UndefinedIdentifier: + raise + except InvalidSyntax as exc: + for alt in exc.alternatives.get(UndefinedIdentifier, []): + if alt.end_location.pos + 1 >= exc.location.pos: # kind of a cheat + alt.notes.append(str(exc)) + raise alt from None + raise diff --git a/packages/bolt/bolt/plugin.py b/packages/bolt/bolt/plugin.py new file mode 100644 index 000000000..d66a11ff4 --- /dev/null +++ b/packages/bolt/bolt/plugin.py @@ -0,0 +1,12 @@ +__all__ = [ + "beet_default", +] + + +from beet import Context + +from .runtime import Runtime + + +def beet_default(ctx: Context): + ctx.inject(Runtime) diff --git a/packages/bolt/bolt/py.typed b/packages/bolt/bolt/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bolt/bolt/resources/__init__.py b/packages/bolt/bolt/resources/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json new file mode 100644 index 000000000..89f607c1a --- /dev/null +++ b/packages/bolt/bolt/resources/commands.json @@ -0,0 +1,232 @@ +{ + "type": "root", + "children": { + "statement": { + "type": "argument", + "parser": "bolt:statement", + "executable": true + }, + "def": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "parser": "bolt:function_signature", + "children": { + "body": { + "type": "argument", + "parser": "bolt:function_root", + "executable": true + } + } + } + } + }, + "return": { + "type": "literal", + "executable": true, + "children": { + "value": { + "type": "argument", + "parser": "bolt:expression", + "executable": true + } + } + }, + "yield": { + "type": "literal", + "executable": true, + "children": { + "from": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "parser": "bolt:expression", + "executable": true + } + } + }, + "value": { + "type": "argument", + "parser": "bolt:expression", + "executable": true + } + } + }, + "del": { + "type": "literal", + "executable": true, + "children": { + "target": { + "type": "argument", + "parser": "bolt:del_target", + "executable": true + } + } + }, + "if": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "bolt:expression", + "children": { + "body": { + "type": "argument", + "parser": "bolt:if_block", + "executable": true + } + } + } + } + }, + "elif": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "bolt:elif_condition", + "children": { + "body": { + "type": "argument", + "parser": "bolt:elif_block", + "executable": true + } + } + } + } + }, + "else": { + "type": "literal", + "children": { + "body": { + "type": "argument", + "parser": "bolt:else_block", + "executable": true + } + } + }, + "while": { + "type": "literal", + "children": { + "condition": { + "type": "argument", + "parser": "bolt:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + }, + "for": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "bolt:assignment_target", + "children": { + "in": { + "type": "literal", + "children": { + "iterable": { + "type": "argument", + "parser": "bolt:expression", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + } + } + } + } + }, + "break": { + "type": "literal", + "executable": true + }, + "continue": { + "type": "literal", + "executable": true + }, + "import": { + "type": "literal", + "children": { + "module": { + "type": "argument", + "parser": "bolt:import", + "executable": true, + "children": { + "as": { + "type": "literal", + "children": { + "alias": { + "type": "argument", + "parser": "bolt:import_name", + "executable": true + } + } + } + } + } + } + }, + "from": { + "type": "literal", + "children": { + "module": { + "type": "argument", + "parser": "bolt:import", + "children": { + "import": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "bolt:import_name", + "executable": true, + "redirect": ["from", "module", "import"] + } + } + } + } + } + } + }, + "global": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "bolt:global_name", + "executable": true, + "redirect": ["global"] + } + } + }, + "nonlocal": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "bolt:nonlocal_name", + "executable": true, + "redirect": ["nonlocal"] + } + } + }, + "pass": { + "type": "literal", + "executable": true + } + } +} diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py new file mode 100644 index 000000000..faf816e94 --- /dev/null +++ b/packages/bolt/bolt/runtime.py @@ -0,0 +1,441 @@ +__all__ = [ + "Runtime", + "Module", + "CompiledModule", + "ModuleCacheBackend", + "GlobalsInjection", + "ModuleRootParser", + "Evaluator", + "ModuleRootSerializer", + "UnusableCompilationUnit", +] + + +import logging +import marshal +from contextlib import contextmanager +from dataclasses import dataclass, field +from importlib.resources import read_text +from io import BufferedReader, BufferedWriter +from pathlib import Path +from types import CodeType +from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union + +from beet import ( + Context, + PipelineFallthroughException, + TextFile, + TextFileBase, + generate_tree, +) +from beet.core.utils import JsonDict, required_field +from mecha import ( + AstCacheBackend, + AstCommand, + AstRoot, + CommandTree, + CompilationDatabase, + CompilationError, + CompilationUnit, + Diagnostic, + DiagnosticCollection, + Dispatcher, + Mecha, + MechaError, + Parser, + Visitor, + rule, +) +from tokenstream import TokenStream, set_location + +from .ast import AstModuleRoot +from .codegen import Codegen +from .helpers import get_bolt_helpers +from .loop_info import loop_info +from .parse import get_bolt_parsers +from .utils import SAFE_BUILTINS, internal, rewrite_traceback + +logger = logging.getLogger("mecha") + + +class UnusableCompilationUnit(MechaError): + """Raised when a compilation unit lacks the necessary information to instantiate a module.""" + + message: str + compilation_unit: CompilationUnit + + def __init__(self, message: str, compilation_unit: CompilationUnit) -> None: + super().__init__(message, compilation_unit) + self.message = message + self.compilation_unit = compilation_unit + + def __str__(self) -> str: + return self.message + + +class Module(TextFile): + """Class representing a bolt module.""" + + scope = ("modules",) + extension = ".bolt" + + +@dataclass +class CompiledModule: + """Class holding the state of a compiled module.""" + + ast: AstRoot + code: Optional[CodeType] + refs: List[Any] + output: Optional[str] + resource_location: Optional[str] + globals: Set[str] + namespace: JsonDict = field(default_factory=dict) + executing: bool = False + + +class Runtime: + """The bolt runtime.""" + + modules: Dict[TextFileBase[Any], CompiledModule] + stack: List[CompiledModule] + commands: List[AstCommand] + helpers: Dict[str, Any] + globals: JsonDict + builtins: Set[str] + + directory: Path + database: CompilationDatabase + codegen: Codegen + evaluate: Dispatcher[AstRoot] + + def __init__(self, ctx: Union[Context, Mecha]): + self.modules = {} + self.stack = [] + self.commands = [] + self.helpers = get_bolt_helpers() + self.globals = {"ctx": None, "loop_info": loop_info} + self.builtins = set(SAFE_BUILTINS) + + if isinstance(ctx, Context): + ctx.require( + "mecha.contrib.relative_location", + "mecha.contrib.inline_function_tag", + "mecha.contrib.nesting", + "mecha.contrib.nested_resources", + "mecha.contrib.nested_yaml", + "mecha.contrib.implicit_execute", + self.finalize, + ) + + ctx.data.extend_namespace.append(Module) + + self.globals["ctx"] = ctx + + self.expose("generate_path", ctx.generate.path) + self.expose("generate_id", ctx.generate.id) + self.expose("generate_hash", ctx.generate.hash) + self.expose("generate_objective", ctx.generate.objective) + self.expose( + "generate_tree", + lambda *args, **kwargs: generate_tree( + kwargs.pop("root") if "root" in kwargs else self.get_path(), + *args, + name=( + kwargs.pop("name") + if "name" in kwargs + else ctx.generate["tree"][self.get_path()].format("tree_{incr}") + ), + **kwargs, + ), + ) + + mc = ctx.inject(Mecha) + + else: + mc = ctx + + mc.cache_backend = ModuleCacheBackend(runtime=self) + + commands_json = read_text("bolt.resources", "commands.json") + mc.spec.add_commands(CommandTree.parse_raw(commands_json)) + mc.spec.parsers.update(get_bolt_parsers(mc.spec.parsers, mc.database)) + mc.spec.parsers["root"] = GlobalsInjection( + runtime=self, + parser=ModuleRootParser(mc.database, mc.spec.parsers["root"]), + ) + + mc.providers.append(Module) + + self.directory = mc.directory + self.database = mc.database + self.codegen = Codegen() + + self.evaluate = Evaluator(runtime=self) + mc.steps.insert(0, self.evaluate) + + mc.serialize.extend(ModuleRootSerializer()) + + def get_path(self) -> str: + """Return the current path.""" + if not self.stack: + raise ValueError("No module currently executing.") + if path := self.stack[-1].resource_location: + return path + raise ValueError("No resource location corresponding to the current module.") + + def expose(self, name: str, function: Callable[..., Any]): + """Expose a utility function.""" + self.globals[name] = lambda *args, **kwargs: function(*args, **kwargs) # type: ignore + + def get_module( + self, + target: Optional[Union[AstRoot, str]] = None, + current: Optional[TextFileBase[Any]] = None, + ) -> CompiledModule: + """Retrieve an executable module.""" + if self.stack and not target and not current: + return self.stack[-1] + + if isinstance(target, str): + current = self.database.index[target] + elif current is None: + current = self.database.current + + module = self.modules.get(current) + compilation_unit = self.database[current] + name = compilation_unit.resource_location or "" + + if module: + if isinstance(target, AstRoot) and module.ast is not target: + logger.debug("Code generation due to ast update for module %s.", name) + else: + return module + else: + if not isinstance(target, AstRoot): + target = compilation_unit.ast + if not target: + raise UnusableCompilationUnit( + f"No ast for module {name}.", compilation_unit + ) + logger.debug("Code generation for module %s.", name) + + source, output, refs = self.codegen(target) + + if source and output: + filename = ( + str(self.directory / compilation_unit.filename) + if compilation_unit.filename + else name + ) + + code = compile(source, filename, "exec") + + else: + code = None + + module = CompiledModule( + target, + code, + refs, + output, + compilation_unit.resource_location, + set(self.globals), + ) + self.modules[current] = module + + return module + + def get_output(self, module: CompiledModule) -> AstRoot: + """Run the module and return the output ast.""" + if not module.code or not module.output: + return module.ast + if module.output in module.namespace: + return module.namespace[module.output] + + if module.executing: + raise ValueError("Import cycle detected.") + + logger.debug("Evaluate module %s.", module.resource_location or "") + + module.namespace.update(self.globals) + module.namespace["_mecha_runtime"] = self + module.namespace["_mecha_refs"] = module.refs + module.namespace["__name__"] = module.resource_location + module.namespace["__file__"] = module.code.co_filename + + self.stack.append(module) + module.executing = True + + try: + with self.error_handler(): + exec(module.code, module.namespace) + finally: + module.executing = False + self.stack.pop() + + return module.namespace[module.output] + + @contextmanager + def scope( + self, + commands: Optional[List[AstCommand]] = None, + ) -> Iterator[List[AstCommand]]: + """Create a new scope to gather commands.""" + if commands is None: + commands = [] + + previous_commands = self.commands + self.commands = commands + + try: + yield commands + finally: + self.commands = previous_commands + + @contextmanager + def error_handler(self): + """Handle errors coming from compiled modules.""" + try: + yield + except Exception as exc: + raise rewrite_traceback(exc) from None + + @internal + def import_module(self, resource_location: str) -> CompiledModule: + """Import module.""" + try: + module = self.get_module(resource_location) + except KeyError: + msg = f"Couldn't import {resource_location!r}." + raise ImportError(msg) from None + if not module.executing: + self.get_output(module) + return module + + @internal + def from_module_import(self, resource_location: str, *args: str) -> Any: + """Import a specific name from a module.""" + module = self.import_module(resource_location) + try: + values = [module.namespace[name] for name in args] + except KeyError as exc: + msg = f"Couldn't import {exc} from {resource_location!r}." + raise ImportError(msg) from None + return values[0] if len(values) == 1 else values + + def finalize(self, ctx: Context): + """Plugin that removes modules at the end of the build.""" + yield + ctx.data[Module].clear() + + +@dataclass +class ModuleCacheBackend(AstCacheBackend): + """Cache backend that also restores the generated modules.""" + + runtime: Runtime = required_field() + + def load(self, f: BufferedReader) -> AstRoot: + data = self.load_data(f) + ast = data["ast"] + + if data["globals"] != set(self.runtime.globals): + raise ValueError("Globals mismatch.") + + self.runtime.modules[self.runtime.database.current] = CompiledModule( + ast=ast, + code=marshal.load(f), + refs=data["refs"], + output=data["output"], + resource_location=data["resource_location"], + globals=data["globals"], + ) + + return ast + + def dump(self, node: AstRoot, f: BufferedWriter): + module = self.runtime.get_module(node) + + self.dump_data( + { + "ast": module.ast, + "refs": module.refs, + "output": module.output, + "resource_location": module.resource_location, + "globals": module.globals, + }, + f, + ) + + marshal.dump(module.code, f) + + +@dataclass +class GlobalsInjection: + """Inject global identifiers.""" + + runtime: Runtime + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide( + identifiers=set(self.runtime.globals) + | self.runtime.builtins + | {"__name__"}, + ): + return self.parser(stream) + + +@dataclass +class ModuleRootParser: + """Parser for module root.""" + + database: CompilationDatabase + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + if isinstance(node, AstRoot) and isinstance(self.database.current, Module): + node = set_location(AstModuleRoot(commands=node.commands), node) + return node + + +@dataclass +class Evaluator(Visitor): + """Visitor that evaluates modules.""" + + runtime: Runtime = required_field() + + @rule(AstRoot) + def root(self, node: AstRoot) -> AstRoot: + module = self.runtime.get_module(node) + try: + return self.runtime.get_output(module) + except PipelineFallthroughException: + raise + except UnusableCompilationUnit as exc: + if not exc.compilation_unit.diagnostics.error: + raise + raise DiagnosticCollection() + except Exception as exc: + msg = "Top-level statement raised an exception." + if module.resource_location: + msg += f" ({module.resource_location})" + tb = exc.__traceback__.tb_next.tb_next # type: ignore + raise CompilationError(msg) from exc.with_traceback(tb) + + +class ModuleRootSerializer(Visitor): + """Serializer for checking that modules don't emit any commands.""" + + @rule(AstModuleRoot) + def module_root(self, node: AstModuleRoot, result: List[str]): + if node.commands: + command = node.commands[0] + name = command.identifier.partition(":")[0] + raise set_location( + Diagnostic("warn", f"Standalone {name!r} command in module."), + command, + command.arguments[0] if command.arguments else command, + ) diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py new file mode 100644 index 000000000..3c74a3049 --- /dev/null +++ b/packages/bolt/bolt/utils.py @@ -0,0 +1,120 @@ +__all__ = [ + "rewrite_traceback", + "fake_traceback", + "internal", + "INTERNAL_CODE", + "SAFE_BUILTINS", +] + + +from bisect import bisect +from types import CodeType, TracebackType +from typing import List, Set, TypeVar + +from mecha.utils import string_to_number + +T = TypeVar("T") + + +INTERNAL_CODE: Set[CodeType] = {string_to_number.__code__} + + +def internal(f: T) -> T: + INTERNAL_CODE.add(f.__code__) # type: ignore + return f + + +SAFE_BUILTINS: List[str] = [ + "abs", + "all", + "any", + "ascii", + "bin", + "bool", + "callable", + "chr", + "dict", + "divmod", + "enumerate", + "filter", + "float", + "frozenset", + "hasattr", + "hash", + "hex", + "int", + "isinstance", + "issubclass", + "iter", + "len", + "list", + "map", + "max", + "min", + "next", + "object", + "oct", + "ord", + "pow", + "print", + "range", + "repr", + "reversed", + "round", + "set", + "slice", + "sorted", + "str", + "sum", + "tuple", + "type", + "zip", +] + + +def rewrite_traceback(exc: Exception) -> Exception: + tb = exc.__traceback__ and exc.__traceback__.tb_next + + stack: List[TracebackType] = [] + + while tb is not None: + if tb.tb_frame.f_code in INTERNAL_CODE: + tb = tb.tb_next + continue + + line_numbers = tb.tb_frame.f_globals.get("_mecha_lineno") + + if line_numbers: + n1, n2 = line_numbers + lineno = n2[bisect(n1, tb.tb_lineno) - 1] + stack.append(fake_traceback(exc, tb, lineno)) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc.with_traceback(tb) + + +def fake_traceback(exc: Exception, tb: TracebackType, lineno: int) -> TracebackType: # type: ignore + name = tb.tb_frame.f_code.co_name + filename = tb.tb_frame.f_globals["__file__"] + + if name == "": + name = tb.tb_frame.f_globals.get("__name__") + + code = compile("\n" * (lineno - 1) + "raise _mecha_exc", filename, "exec") + + if name: + code = code.replace(co_name=name) + + try: + exec(code, {"_mecha_exc": exc}) + except Exception as exc: + return exc.__traceback__.tb_next # type: ignore diff --git a/packages/bolt/examples/bolt_basic/beet.yml b/packages/bolt/examples/bolt_basic/beet.yml new file mode 100644 index 000000000..e15d7678c --- /dev/null +++ b/packages/bolt/examples/bolt_basic/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..8bd9bf620 --- /dev/null +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,608 @@ +say hello +say this is a function file augmented with mecha + +if score @s tmp matches 1.. as @a: + for feature in [ + "multiline", + "nesting", + "implicit execute", + "relative location", + ]: + say (feature + " is automatically enabled") + message = "abc" * 5 + say message.upper() + +def you_can_make_functions(): + say you_can_make_functions.__name__.replace("_", " ").capitalize() + tellraw @a [ + "", + {"text": "yep"}, + ] + return "and return values" + +say you_can_make_functions() + +def fib(n): + if n <= 1: + return n + return fib(n - 1) + fib(n - 2) + +say fib(7) +say fib(8) +say fib(9) + +def default_params_are_neat( + number, + result=fib(number), + thing={ + "number": number, + "result": result, + }, +): + say Unlike in python default params are evaluated when the function is called + say number + say result + say thing + +default_params_are_neat(12) + +say this is basically a custom subset of python +say functions are first-class objects just like in python + +my_functions = [] + +for i in "abc": + def functions_in_loop(value): + def yo(): + say value.upper() + return yo + my_functions.append(functions_in_loop(i * 3)) + +my_functions[0]() +my_functions[1]() +my_functions[2]() + +should_break = False + +while True: + if should_break: + break + say just once + should_break = True + +something = '{"text": "Hello", "bold": true}' +as @a at @s if block ~ ~-1 ~ #wool give @s stone{ + display: { + Name: something + } +} + +with_tuples = ((((())))) + (1,2,3) + (4,) +say with_tuples +say (with_tuples) +say (with_tuples,) +a = f'\\' +say f"f-strings {"work".upper()!r} too {a}" +say f"{{{f"{{{f"{{{7:08}}}\\"}}}\""}}}" + +x = 8 +if score @s tmp matches (x, None) say wat +if score @s tmp matches f"{x}.." say wat + + +def copy_items(type, count): + for i in range(count): + item replace entity @a f"{type}.{i}" from entity @s f"{type}.{i}" + +copy_items('hotbar', 9) +copy_items('inventory', 26) + +def f(): + yield 1 + yield 2 + yield 3 + +for i in f(): + say i + +def wow(ok): + yield from ok() + yield from ok() + +say list(wow(f)) + +say ctx.generate.id("hello") + +import math +say math.cos(math.pi) + +import math as m +say (math is m) + +from ./thing import do_stuff + +say do_stuff(1, math.pi) + +import ./thing as thing + +say (thing.do_stuff is do_stuff) + +for i in range(6): + if i == 1: + say 1 + elif i == 2: + say 2 + elif i == 3: + say 3 + else: + say other + say done + +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6] function ./abc: + say foo + say bar + +baz = "demo:xyz" +if predicate foo:bar function baz: + say foo + say bar + +for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): + append function node.parent: + if node.partition(5): + if score @s thingy matches node.range function node.children + else: + if score @s thingy matches node.range say node.value + +data modify entity @e[type=armor_stand,limit=1] NoBasePlate set value 1b + +from ./thing import call_recursive +call_recursive() + +def try_coordinates(): + a = 1 + setblock a 2 3 stone + a = "1 2 3" + setblock a stone + a = 1 + if block ^ f"^{a}" ^ #planks say 42 + if block ("~", "~", "~") #planks say 42 + +try_coordinates() + +keyword_arguments = dict(foo=1, bar=2, **{"thing": 42}) +say keyword_arguments + +for node in generate_tree(range(8), name="small_tree"): + append function node.parent: + if node.partition(): + if score @s thingy matches node.range function node.children + else: + if score @s thingy matches node.range say node.value + +def try_unpacking(): + a = [1, *"abc", 2] + b = dict(zip(a, a)) + c = {**b, "b": "thing"} + say c + +try_unpacking() + +def try_set_item(): + try_set_item.data = {} + try_set_item.data[1] = {} + try_set_item.data[1][2] = "foo" + say try_set_item.data + +try_set_item() + +for node in generate_tree(range(10, 20), key=int): + append function node.parent: + if node.partition(): + if score @s thingy matches node.range function node.children + else: + if score @s thingy matches node.range say node.value + +scoreboard objectives setdisplay list some_score_name +color = "red" +scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name + +weapon = {1: "weapon.offhand", 2: "weapon.mainhand"} +item replace entity @s weapon.offhand from entity @s weapon.mainhand +my_weapon = weapon +item replace entity @s my_weapon.1 from entity @s my_weapon.2 + +numbers = list(range(12)) +say numbers[:] +say numbers[3:] +say numbers[:9] +say numbers[3:9] +say numbers[::] +say numbers[3::] +say numbers[:9:] +say numbers[3:9:] +say numbers[::-1] +say numbers[9::-1] +say numbers[:3:-1] +say numbers[9:3:-1] + +execute at @s if block ~ ~ ~ #minecraft:beds: + teleport @s ~ ~0.56250 ~ + +del numbers[3:] +say numbers + +for loop, value in loop_info("abcd"): + say f"==[{loop.current}]==" + say (value == loop.current) + say loop.before + say loop.after + say loop.first + say loop.last + say loop.cycle("foo", "bar") + +from ./thing import raw + +raw(f"say hello{'!' * 5}") + +execute function demo:bbb: + say 1 +append function demo:bbb: + say 2 +prepend function demo:bbb: + say 0 + +mykey1 = "foo" + +if data storage some:path/to/storage f"some.{mykey1}.path" +if data storage some:path/to/storage f"some.{mykey1}.path" run say hi +if data storage some:path/to/storage f'some.{mykey1}.path{{my: "compound"}}' +if data storage some:path/to/storage f'some.{mykey1}.path{{my: "compound"}}' run say hi + +mykey2 = "bar" + +mypath1 = f"some.{mykey2}.path" +if data storage some:path/to/storage (mypath1) +if data storage some:path/to/storage (mypath1) run say hi + +mypath2 = f'some.{mykey2}.path{{my: "compound"}}' +if data storage some:path/to/storage (mypath2) +if data storage some:path/to/storage (mypath2) run say hi + +mypath3 = f'some.{mykey2}.path[{{my: "subscript"}}]' +if data storage some:path/to/storage (mypath3) +if data storage some:path/to/storage (mypath3) run say hi + +myindex = 42 + +if data storage some:path/to/storage f'some.{mykey1}.path{{my: "compound"}}.stuff[{myindex}].beep.{mykey2}[{{my: "subscript"}}].boop' run say hi + +mypath4 = "foo.bar" +if data storage some:path/to/storage mypath4 + +if data storage some:path/to/storage "some.foo.path" + +import nbtlib +mypath5 = nbtlib.Path().something.cool[3].foo +if data storage some:path/to/storage mypath5 + +from uuid import UUID + +def try_entity_interpolation(x): + if score x some_objective matches 0 say yes + +try_entity_interpolation("some_fake_player") +try_entity_interpolation("0-0-0-0-1") +try_entity_interpolation(UUID("12345678-1234-5678-1234-567812345678")) + +entity_type = "creeper" +at @e[type=entity_type] summon lightning_bolt + +language minecraft:aaaa { + "menu.singleplayer": "AAAA" +} + +some_translation = "bonjour" + +merge language minecraft:aaaa { + "something.else": some_translation +} + +merge language minecraft:aaaa: + yaml.key1: some_translation.upper() + yaml.key2: some_translation.title() + +x = 0 +y = 1 +z = 2 + +data merge storage demo:foo: + custom_data1: [x, y, z] + custom_data2: + - x + - y + - z + +def set_at_origin(block): + setblock 0 0 0 block + +set_at_origin(minecraft:stone) + +some_name = ./useless/../no_quotes_lol +function some_name: + say that's neat + +if ./a/b/c == ./x/../a/b/x/../c: + say same thing + +tellraw @a: + text: 'hello world' + +function_tag felix:howdy: + values: ['demo:foo', __name__] + +execute at @s run particle minecraft:dust 0 1 1 0.9 ~ ~1 ~ 0 0 0 0.01 1 force +execute at @s run particle minecraft:block yellow_concrete ~ ~1.62 ~ 0 0.4 0 0 30 force +execute at @s run particle minecraft:block minecraft:light_blue_concrete ~ ~1 ~ 0.05 0.1 0.05 0 3 + +particle_file minecraft:end_rod { + "textures": [ + "minecraft:glitter_7", + "minecraft:glitter_6", + "minecraft:glitter_5", + "minecraft:glitter_4", + "minecraft:glitter_3", + "minecraft:glitter_2", + "minecraft:glitter_1", + "minecraft:glitter_0" + ] +} + +for obj in ["foo", "bar"]: + as @a[scores={obj=1..}] scoreboard players remove @s obj 1 + +x = 8 +scoreboard players set @p tmp -x + +x = 12 +y = 23 +z = 34 + +tp @s f"~{x} ~{y} ~{z}" +tp @s f"~{x}" y f"~{z}" + +tp @s x y z +tp @s ~x ~y ~z +tp @s ^x ^y ^z +tp @s -x -y -z +tp @s ~-x ~-y ~-z +tp @s ^-x ^-y ^-z + +for i, x in enumerate("abc"): + say f"{i} {x}" + +major, minor, patch = "1.2.3".split(".") +say major +say minor +say patch + +def check_above(n): + if n > 0: + if block ~ ~n ~ air: + check_above(n - 1) + else: + say nothing above! + +check_above(6) + +math = 0 +say math +def wat(): + global math + import math +wat() +say math.ceil(0.1) + +say bolt implements a __rebind__(rhs) magic method that gets called when you reassign a value to a variable +say let's try it out by manually building a class + +def init_global_score(self, name): + self.name = name + +def add_global_score(self, rhs): + tmp = GlobalScore(generate_id("tmp.{incr}")) + scoreboard players operation tmp.name global = self.name global + tmp += rhs + return tmp + +def iadd_global_score(self, rhs): + if isinstance(rhs, GlobalScore): + scoreboard players operation self.name global += rhs.name global + else: + scoreboard players add self.name global rhs + return self + +def rebind_global_score(self, rhs): + if self is not rhs: + if isinstance(rhs, GlobalScore): + scoreboard players operation self.name global = rhs.name global + else: + scoreboard players set self.name global rhs + return self + +GlobalScore = type("GlobalScore", (), { + "__init__": init_global_score, + "__add__": add_global_score, + "__iadd__": iadd_global_score, + "__rebind__": rebind_global_score, +}) + +a = GlobalScore("a") +a = 123 +a = 456 + +b = GlobalScore("b") +b = 789 +b = a + +a += b + 6 + a +b += 1 + +say you can use nonlocal to create fake classes + +def Counter(x=0): + def incr(): + nonlocal x + x += 1 + return x + return {"incr": incr} + +counter = Counter() +say counter.incr() +say counter.incr() +say Counter(9).incr() + +def foo(msg): + say msg + +if score #temp abc matches 1..: + foo("foo") + +tag_name = ./yolo_funcs + +function_tag tag_name: + values: + - "demo:foo" + +as @p function #tag_name # this runs the tag + +def truth_table(): + for a in [False, True]: + for b in [False, True]: + for c in [False, True]: + for d in [False, True]: + yield (a and b or c and not d) in [True] not in [False] + +say list(truth_table()) + +def not_init(self, value): + self.value = value + +def not_not(self): + say self.value + return self + +NotPrint = type("NotPrint", (), {"__init__": not_init, "__not__": not_not}) +not not not not NotPrint("hello") + +def thing_within(self, container): + for item in container: + say (self == item) + return self + +def thing_contains(self, item): + say (self == item) + return self + +def thing_equal(self, item): + return f"thing == {item}" + +Thing = type("Thing", (), {"__within__": thing_within, "__contains__": thing_contains, "__eq__": thing_equal}) +Thing() in [1, 2, 3] in [99] +"world" in ("hello" in Thing()) + +from contextlib import contextmanager + +def dsl_init(self, score, inverted=False): + self.score = score + self.inverted = inverted + +def dsl_not(self): + return DSL(self.score, not self.inverted) + +def dsl_branch(self): + if score @s self.score matches int(not self.inverted): + yield True + +DSL = type("DSL", (), {"__init__": dsl_init, "__not__": dsl_not, "__branch__": contextmanager(dsl_branch)}) + +if DSL("foo"): + say yes + if DSL("bar"): + say with bar +else: + say no + +predicate ./check_scores [ + { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "foo": 1 + } + }, + { + "condition": "minecraft:entity_scores", + "entity": "killer_player", + "scores": { + "bar": 1 + } + } +] + +def cond_init(self, name=generate_id("tmp{incr}")): + self.name = name + +def cond_str(self): + return self.name + +def cond_not(self): + result = Cond() + result = 1 + unless score global self matches 0: + result = 0 + return result + +def cond_dup(self): + result = Cond() + result = self + return result + +def cond_rebind(self, rhs): + if isinstance(rhs, Cond): + scoreboard players operation global self = global rhs + else: + scoreboard players set global self rhs + return self + +def cond_branch(self): + unless score global self matches 0: + yield True + +Cond = type("Cond", (), { + "__init__": cond_init, + "__str__": cond_str, + "__not__": cond_not, + "__dup__": cond_dup, + "__rebind__": cond_rebind, + "__branch__": contextmanager(cond_branch), +}) + +is_awesome = Cond("is_awesome") +is_awesome = Cond("is_cool") and Cond("is_nice") + +if is_awesome or Cond("force_awesomeness"): + say hello + +from ./utils import something +something() diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction new file mode 100644 index 000000000..474e599d1 --- /dev/null +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction @@ -0,0 +1,18 @@ +from bolt import Runtime + +runtime = ctx.inject(Runtime) + +foo = 42 + +def callback(): + return foo + +def loga(f): + runtime.get_module().namespace["bar"] *= 2 + say __name__ + say runtime.get_path() + say f() + +from ./import_b import logb + +logb(callback) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction new file mode 100644 index 000000000..43ef2bf91 --- /dev/null +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction @@ -0,0 +1,18 @@ +from bolt import Runtime + +runtime = ctx.inject(Runtime) + +bar = 7 + +def callback(): + return bar + +def logb(f): + runtime.get_module().namespace["foo"] *= 2 + say __name__ + say runtime.get_path() + say f() + +from ./import_a import loga + +loga(callback) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction new file mode 100644 index 000000000..3a7f3e18e --- /dev/null +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction @@ -0,0 +1,15 @@ +from mecha import Mecha +from bolt import Runtime + +mc = ctx.inject(Mecha) +runtime = ctx.inject(Runtime) + +def do_stuff(a, b): + import math + return a + math.cos(b) + +def call_recursive(): + if score @s loop_again matches 1 function runtime.get_path() + +def raw(cmd): + runtime.commands.append(mc.parse(cmd, using="command")) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/utils.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/utils.mcfunction new file mode 100644 index 000000000..ed8bb9ae4 --- /dev/null +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/utils.mcfunction @@ -0,0 +1 @@ +say this doesn't conflict with the demo:utils module diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt b/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt new file mode 100644 index 000000000..8143a1168 --- /dev/null +++ b/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt @@ -0,0 +1,2 @@ +def something(): + say f"this is from {__name__}" diff --git a/packages/bolt/examples/bolt_chicken/beet.yml b/packages/bolt/examples/bolt_chicken/beet.yml new file mode 100644 index 000000000..e15d7678c --- /dev/null +++ b/packages/bolt/examples/bolt_chicken/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_chicken/src/data/demo/functions/chicken.mcfunction b/packages/bolt/examples/bolt_chicken/src/data/demo/functions/chicken.mcfunction new file mode 100644 index 000000000..1103a5d22 --- /dev/null +++ b/packages/bolt/examples/bolt_chicken/src/data/demo/functions/chicken.mcfunction @@ -0,0 +1,4 @@ +from ./utils import summon_chicken_army + +say Go forth, my minions! +summon_chicken_army(16) diff --git a/packages/bolt/examples/bolt_chicken/src/data/demo/modules/utils.bolt b/packages/bolt/examples/bolt_chicken/src/data/demo/modules/utils.bolt new file mode 100644 index 000000000..0ec3cea6a --- /dev/null +++ b/packages/bolt/examples/bolt_chicken/src/data/demo/modules/utils.bolt @@ -0,0 +1,18 @@ +infinite_invisibility = { + Id: 14, + Duration: 999999, + Amplifier: 1, + ShowParticles: false, +} + +def summon_chicken_army(n): + for i in range(n): + summon chicken ~i ~ ~ { + Tags: [f"quack{i}"], + IsChickenJockey: true, + Passengers: [{ + id: zombie, + IsBaby: true, + ActiveEffects: [infinite_invisibility] + }] + } diff --git a/packages/bolt/examples/bolt_generated/beet.yml b/packages/bolt/examples/bolt_generated/beet.yml new file mode 100644 index 000000000..9d8b1ea5d --- /dev/null +++ b/packages/bolt/examples/bolt_generated/beet.yml @@ -0,0 +1,7 @@ +require: + - bolt +data_pack: + load: [src] +pipeline: + - demo + - mecha diff --git a/packages/bolt/examples/bolt_generated/demo.py b/packages/bolt/examples/bolt_generated/demo.py new file mode 100644 index 000000000..513680caa --- /dev/null +++ b/packages/bolt/examples/bolt_generated/demo.py @@ -0,0 +1,11 @@ +from beet import Context, Function + +generated_code = """ +execute if score #smithed.core load.status matches 1 function ./0: + data merge storage smithed:log {message:'["Could not find ",{"text":"#smithed.prevent_aggression 0.0.1","color":"red"}]',type:'ERROR'} + function #smithed:core/pub/technical/tools/log +""" + + +def beet_default(ctx: Context): + ctx.data["demo:generated"] = Function(generated_code) diff --git a/packages/bolt/examples/bolt_generated/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_generated/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..4f5df804d --- /dev/null +++ b/packages/bolt/examples/bolt_generated/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,2 @@ +a = 123 +say a diff --git a/packages/bolt/examples/bolt_merge/beet.yml b/packages/bolt/examples/bolt_merge/beet.yml new file mode 100644 index 000000000..d99dcb326 --- /dev/null +++ b/packages/bolt/examples/bolt_merge/beet.yml @@ -0,0 +1,8 @@ +data_pack: + load: ["pack_1", "pack_2"] +require: + - bolt + - mecha.contrib.messages + - beet.contrib.auto_yaml +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction b/packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction new file mode 100644 index 000000000..6ba9cd6d2 --- /dev/null +++ b/packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/bob.mcfunction @@ -0,0 +1,2 @@ +from pack_1:utils import hello +hello("Bob") diff --git a/packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction b/packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction new file mode 100644 index 000000000..277812f17 --- /dev/null +++ b/packages/bolt/examples/bolt_merge/pack_1/data/pack_1/functions/utils.mcfunction @@ -0,0 +1,3 @@ +def hello(name): + say f"Hello, {name}!" +hello("Alice") diff --git a/packages/bolt/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction b/packages/bolt/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction new file mode 100644 index 000000000..6ecf74efb --- /dev/null +++ b/packages/bolt/examples/bolt_merge/pack_2/data/pack_2/functions/carol.mcfunction @@ -0,0 +1,2 @@ +from pack_1:utils import hello +hello("Carol") diff --git a/packages/bolt/examples/bolt_shadow_global/beet.yml b/packages/bolt/examples/bolt_shadow_global/beet.yml new file mode 100644 index 000000000..812ca7ebc --- /dev/null +++ b/packages/bolt/examples/bolt_shadow_global/beet.yml @@ -0,0 +1,7 @@ +require: + - bolt + - demo +data_pack: + load: [src] +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_shadow_global/demo.py b/packages/bolt/examples/bolt_shadow_global/demo.py new file mode 100644 index 000000000..e98563a11 --- /dev/null +++ b/packages/bolt/examples/bolt_shadow_global/demo.py @@ -0,0 +1,8 @@ +from beet import Context + +from bolt import Runtime + + +def beet_default(ctx: Context): + runtime = ctx.inject(Runtime) + runtime.expose("max", lambda *args: args) diff --git a/packages/bolt/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..1cce0ac31 --- /dev/null +++ b/packages/bolt/examples/bolt_shadow_global/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say max(1, 2, 3) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json new file mode 100644 index 000000000..bcdf3122a --- /dev/null +++ b/packages/bolt/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "bolt", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "pyright": "^1.1.239" + } + }, + "node_modules/pyright": { + "version": "1.1.239", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.239.tgz", + "integrity": "sha512-WiXtSVKfoT5x/f6+AGJmB/jXhmEeexmvqqZ//MtCwLRI7hPmaRJJyfFCjJi+2ezEFxwcCjQQQTbclrG8jF6o/A==", + "dev": true, + "bin": { + "pyright": "index.js", + "pyright-langserver": "langserver.index.js" + }, + "engines": { + "node": ">=12.0.0" + } + } + }, + "dependencies": { + "pyright": { + "version": "1.1.239", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.239.tgz", + "integrity": "sha512-WiXtSVKfoT5x/f6+AGJmB/jXhmEeexmvqqZ//MtCwLRI7hPmaRJJyfFCjJi+2ezEFxwcCjQQQTbclrG8jF6o/A==", + "dev": true + } + } +} diff --git a/packages/bolt/package.json b/packages/bolt/package.json new file mode 100644 index 000000000..bffcf87ac --- /dev/null +++ b/packages/bolt/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "watch": "poetry run pyright -w", + "check": "poetry run pyright" + }, + "devDependencies": { + "pyright": "^1.1.239" + } +} diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock new file mode 100644 index 000000000..317332697 --- /dev/null +++ b/packages/bolt/poetry.lock @@ -0,0 +1,1374 @@ +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "beet" +version = "0.59.0" +description = "The Minecraft pack development kit" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +click = ">=8.1.2,<9.0.0" +click-help-colors = ">=0.9.1,<0.10.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +Jinja2 = ">=3.1.1,<4.0.0" +nbtlib = ">=1.12.1,<2.0.0" +pathspec = ">=0.9.0,<0.10.0" +pydantic = ">=1.9.0,<2.0.0" +PyYAML = ">=6.0,<7.0" +toml = ">=0.10.2,<0.11.0" + +[package.extras] +image = ["pillow"] + +[[package]] +name = "black" +version = "22.3.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "bleach" +version = "5.0.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0)"] +dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.15.0" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-help-colors" +version = "0.9.1" +description = "Colorization of help messages in Click" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7.0,<9" + +[package.extras] +dev = ["pytest"] + +[[package]] +name = "click-log" +version = "0.4.0" +description = "Logging integration for Click" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = "*" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "cryptography" +version = "36.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "docutils" +version = "0.18.1" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "dotty-dict" +version = "1.3.0" +description = "Dictionary wrapper for quick access to deeply nested keys." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +setuptools_scm = "*" + +[[package]] +name = "gitdb" +version = "4.0.9" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.27" +description = "GitPython is a python library used to interact with Git repositories" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "4.11.3" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "invoke" +version = "1.7.0" +description = "Pythonic task execution" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + +[[package]] +name = "jinja2" +version = "3.1.1" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keyring" +version = "23.5.0" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +importlib-metadata = ">=3.6" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lectern" +version = "0.20.0" +description = "Literate Minecraft data packs and resource packs." +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +beet = ">=0.55.1" +click = ">=8.1.2,<9.0.0" +markdown-it-py = ">=1.1" + +[[package]] +name = "markdown-it-py" +version = "2.1.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] +code_style = ["pre-commit (==2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mdurl" +version = "0.1.1" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mecha" +version = "0.47.0" +description = "A powerful Minecraft command library" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +beet = ">=0.57.0" +tokenstream = ">=1.4,<2.0" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbtlib" +version = "1.12.1" +description = "A python package to read and edit nbt data" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +numpy = "*" + +[[package]] +name = "numpy" +version = "1.22.3" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pkginfo" +version = "1.8.2" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +testing = ["coverage", "nose"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pydantic" +version = "1.9.0" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +typing-extensions = ">=3.7.4.3" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyparsing" +version = "3.0.8" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.1.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-insta" +version = "0.1.11" +description = "A practical snapshot testing plugin for pytest" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +pytest = ">=6.0.2" +wrapt = ">=1.12.1,<2.0.0" + +[[package]] +name = "python-gitlab" +version = "3.3.0" +description = "Interact with GitLab API" +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +requests = ">=2.25.0" +requests-toolbelt = ">=0.9.1" + +[package.extras] +autocompletion = ["argcomplete (>=1.10.0,<3)"] +yaml = ["PyYaml (>=5.2)"] + +[[package]] +name = "python-semantic-release" +version = "7.28.1" +description = "Automatic Semantic Versioning for Python projects" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=7,<9" +click-log = ">=0.3,<1" +dotty-dict = ">=1.3.0,<2" +gitpython = ">=3.0.8,<4" +invoke = ">=1.4.1,<2" +python-gitlab = ">=2,<4" +requests = ">=2.25,<3" +semver = ">=2.10,<3" +tomlkit = ">=0.10.0,<0.11.0" +twine = ">=3,<4" + +[package.extras] +dev = ["tox", "isort", "black"] +docs = ["Sphinx (==1.3.6)"] +mypy = ["mypy", "types-requests"] +test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "readme-renderer" +version = "35.0" +description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +bleach = ">=2.1.0" +docutils = ">=0.13.1" +Pygments = ">=2.5.1" + +[package.extras] +md = ["cmarkgfm (>=0.8.0)"] + +[[package]] +name = "requests" +version = "2.27.1" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rfc3986" +version = "2.0.0" +description = "Validating URI References per RFC 3986" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "secretstorage" +version = "3.3.2" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "semver" +version = "2.13.0" +description = "Python helper for Semantic Versioning (http://semver.org/)" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "setuptools-scm" +version = "6.4.2" +description = "the blessed package to manage your versions by scm tags" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +packaging = ">=20.0" +tomli = ">=1.0.0" + +[package.extras] +test = ["pytest (>=6.2)", "virtualenv (>20)"] +toml = ["setuptools (>=42)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tokenstream" +version = "1.4.0" +description = "A versatile token stream for handwritten parsers" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tomlkit" +version = "0.10.2" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "tqdm" +version = "4.64.0" +description = "Fast, Extensible Progress Meter" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "twine" +version = "3.8.0" +description = "Collection of utilities for publishing packages on PyPI" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = ">=0.4.3" +importlib-metadata = ">=3.6" +keyring = ">=15.1" +pkginfo = ">=1.8.1" +readme-renderer = ">=21.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +tqdm = ">=4.14" +urllib3 = ">=1.26.0" + +[[package]] +name = "typing-extensions" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "urllib3" +version = "1.26.9" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "wrapt" +version = "1.14.0" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "zipp" +version = "3.8.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "09abe0f491a1f36ce752143b46dd4024347a4eb4937127a6f1cbcb2de3bef23d" + +[metadata.files] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +beet = [ + {file = "beet-0.59.0-py3-none-any.whl", hash = "sha256:81a60dd1804d6a6eb03beb4a77e108d93a7fa5ae7da4d2f50158db4da6235304"}, + {file = "beet-0.59.0.tar.gz", hash = "sha256:c760970157bb8fd61a3f50cbe2424870f0d0e4688ca353db19a821d81a5c0e53"}, +] +black = [ + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, +] +bleach = [ + {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, + {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] +click = [ + {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, + {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, +] +click-help-colors = [ + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, +] +click-log = [ + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cryptography = [ + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, + {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, + {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, + {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, +] +docutils = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] +dotty-dict = [ + {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, +] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +gitpython = [ + {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, + {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +invoke = [ + {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, + {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +jinja2 = [ + {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, + {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, +] +keyring = [ + {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, + {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, +] +lectern = [ + {file = "lectern-0.20.0-py3-none-any.whl", hash = "sha256:31ae3c5473dbde55b16620b9ca474519103f41497b6bc9523190071b25df60da"}, + {file = "lectern-0.20.0.tar.gz", hash = "sha256:cde89569ada5d159ee1f5aa7c07c43efd70cf8582d5bea1d6423cd1889f0f09f"}, +] +markdown-it-py = [ + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +mdurl = [ + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, +] +mecha = [ + {file = "mecha-0.47.0-py3-none-any.whl", hash = "sha256:e7808b209edb8ad035cbcf59deff250f62a03ef153228094792886f73c70d63d"}, + {file = "mecha-0.47.0.tar.gz", hash = "sha256:05ce4e8710baf5e6331343bd20ecdf959b18305f3194c5df715fa409af60914b"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbtlib = [ + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, +] +numpy = [ + {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, + {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, + {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, + {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, + {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, + {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, + {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, + {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, + {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, + {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pkginfo = [ + {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, + {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pydantic = [ + {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, + {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, + {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, + {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, + {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, + {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, + {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, + {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, + {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, + {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, + {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, + {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, + {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, + {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, + {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, + {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, + {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, + {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, + {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, + {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, + {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, + {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, + {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, + {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, + {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, + {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, + {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, + {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, + {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, + {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, + {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, + {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, + {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, + {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, + {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pyparsing = [ + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, +] +pytest = [ + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, +] +pytest-insta = [ + {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, + {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, +] +python-gitlab = [ + {file = "python-gitlab-3.3.0.tar.gz", hash = "sha256:fef25d41a62f91da82ee20f72a728b9c69eef34cf0a3005cdbb9a0b471d5b498"}, + {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, +] +python-semantic-release = [ + {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, + {file = "python_semantic_release-7.28.1-py3-none-any.whl", hash = "sha256:319c3e811d6e10bc3f0e967419eae0e5e9ba1e6745aa2fd94dd24e3995541ca2"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +readme-renderer = [ + {file = "readme_renderer-35.0-py3-none-any.whl", hash = "sha256:73b84905d091c31f36e50b4ae05ae2acead661f6a09a9abb4df7d2ddcdb6a698"}, + {file = "readme_renderer-35.0.tar.gz", hash = "sha256:a727999acfc222fc21d82a12ed48c957c4989785e5865807c65a487d21677497"}, +] +requests = [ + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +rfc3986 = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, + {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, +] +semver = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] +setuptools-scm = [ + {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, + {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] +tokenstream = [ + {file = "tokenstream-1.4.0-py3-none-any.whl", hash = "sha256:44da76e2df70b6858f7a967612af31a1606dd5f2215fb06fe606e1acce015cdb"}, + {file = "tokenstream-1.4.0.tar.gz", hash = "sha256:64dbd9d8fd2aa19a9d81056410acb37baa46aa861d765555cf2751fe54fb00f9"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tomlkit = [ + {file = "tomlkit-0.10.2-py3-none-any.whl", hash = "sha256:905cf92c2111ef80d355708f47ac24ad1b6fc2adc5107455940088c9bbecaedb"}, + {file = "tomlkit-0.10.2.tar.gz", hash = "sha256:30d54c0b914e595f3d10a87888599eab5321a2a69abc773bbefff51599b72db6"}, +] +tqdm = [ + {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, + {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, +] +twine = [ + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, +] +typing-extensions = [ + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +] +urllib3 = [ + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +wrapt = [ + {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, + {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, + {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, + {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, + {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, + {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, + {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, + {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, + {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, + {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, + {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, + {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, + {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, + {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, + {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, + {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, + {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, + {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, + {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, + {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, + {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, + {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, +] +zipp = [ + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, +] diff --git a/packages/bolt/poetry.toml b/packages/bolt/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/bolt/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml new file mode 100644 index 000000000..2573b89a7 --- /dev/null +++ b/packages/bolt/pyproject.toml @@ -0,0 +1,58 @@ +[tool.poetry] +name = "bolt" +version = "0.1.0" +description = "Supercharge Minecraft commands with Python" +authors = ["Valentin Berlier "] +license = "MIT" + +homepage = "https://github.com/mcbeet/bolt" +repository = "https://github.com/mcbeet/bolt" +documentation = "https://github.com/mcbeet/bolt" + +readme = "README.md" + +keywords = [ + "beet", + "minecraft", + "minecraft-commands", + "scripting-language", + "mcfunction" +] + +include = ["bolt/py.typed"] + +[tool.poetry.dependencies] +python = "^3.8" +mecha = ">=0.47.0" + +[tool.poetry.dev-dependencies] +pytest = "^7.1.2" +black = "^22.3.0" +isort = "^5.10.1" +python-semantic-release = "^7.28.1" +pytest-insta = "^0.1.11" +lectern = ">=0.20.0" + +[tool.pytest.ini_options] +addopts = "tests bolt --doctest-modules" +doctest_optionflags = "NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL ELLIPSIS" + +[tool.pyright] +typeCheckingMode = "strict" + +[tool.black] +target-version = ["py38"] + +[tool.isort] +profile = "black" + +[tool.semantic_release] +branch = "main" +version_variable = ["bolt/__init__.py:__version__"] +version_toml = "pyproject.toml:tool.poetry.version" +major_on_zero = false +build_command = "poetry build" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/bolt/setup.py b/packages/bolt/setup.py new file mode 100644 index 000000000..4740e3fba --- /dev/null +++ b/packages/bolt/setup.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python + +# This is a shim to allow GitHub to detect the package. The build is done with poetry. + +import setuptools + +if __name__ == "__main__": + setuptools.setup(name="bolt") diff --git a/packages/bolt/tests/__init__.py b/packages/bolt/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction new file mode 100644 index 000000000..474bebef0 --- /dev/null +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -0,0 +1,750 @@ +0 +### +123 +### +123.456 +### +22220099.6667e-3 +### +0.67e6 +### +1 + 2 +### +1 - 2 +### +1 - 2 + 3 +### +1 - (2 + 3) +### +2 + -54 +### +2 + -54 * 10 +### +(2 + -54) * 10 +### +---64+++64 +### +1 * 2 / 3 * 4 +### +1 * 2 / (3 * 4) +### +16 // 5 % 7 +### +-2 ** 3 + +4 * 5 // 6 / 7 % 9 + 10 - 11 << 12 >> 13 & 14 ^ 15 | 16 +### +False or True and "hello" or not "foo" == "bar" or 1 != 2 and 1 < 2 and 2 <= 3 and 5 > 4 and 6 >= 5 and 1 in 1 and 2 not in 2 and 3 is 3 and 3 is not 3 +### +64 §§§ +### +17 % %3 +### +True and (False or True) +### +"this" +### +"this\nthat" +### +"\"\u2588this\nthat" +### +'' +### +'"\'"' +### +'something \t\f\n\\\'here' +### +'abc\"' +### +"hey" "hey" +### +None +### +foo +### +"hello" + foo +### +foo = 1 +foo +### +foo = 1 +"hello" + foo +### +a = 1 +if a == 1: + a = 0 +### +if True: + say hello +elif True or False: + say hello +else: + say hello +### +if True: + say hello +elif True or False: + say hello +else "blah": + say hello +### +if True: + say hello +a = 1 +else: + say hello +### +if +### +if True and +### +if True: +say hello +### +while True: + say hello +### +if score @s tmp matches 0: + if "thing" == "bar": + say hello + if "thing" == "foo": + say hello +### +if score @s tmp matches 0: + if "thing" == "foo": + say hello +### +if score @s tmp matches 0: + while True: + say hello + while True: + say hello +### +if score @s tmp matches 0: + while True: + say hello +### +if score @s tmp matches 42: + count = 42 + while count > 0: + say hello + count = count - 1 +### +foo = ( + "abc" + + "def" +) +### +1 * 2 +* 3 +### +true | false | null +### +foo = 1 +foo == 1 +### +for c in "abc": + say something +### +foo = foo +### +foo = 1 +foo = foo +### +for foo in foo: + foo = foo +### +for foo in "foo": + foo = foo +### +foo += "hey" +### +foo = "" +foo += "hey" +### +wat = the = "f" +### +break +### +continue +### +if true: + break +### +for i in "": + say hello + continue +### +while false: + break +### +for i in "abc": + if i == "b": + break +### +"foo".bar +### +"foo".bar.baz +### +"foo".bar()[0] +### +"foo".bar()[0]."hello".99."with space"("thing" * 7) +### +"foo"( + 1, + 2, + 3, +) +### +def foo(): + say hello +foo() +### +def foo(): + def bar(): + foo() + bar() +### +def foo( + a=1, + b=a, + c=a + b, +): + say hello +### +def f +### +def f() +### +def f(): +say yolo +### +def f(a=a): + say wat +### +def f(a, b=a): + b += a + say wat +### +def f(a, b): + def g(c): + a + b + c +g() +### +def f(a, b): + def g(c): + a + b + f(c) +### +def foo(something): + def wat(): + say + yo + wat + is + dat +# this is a comment + x = "hello" + for i in somehng: + x += i * 3 + + say wow + wat() +### +def foo(something): + def wat(): + say + yo + wat + is + dat +# this is a comment + x = "hello" + for i in something: + x += i * 3 + + say wow + wat() +### +def foo(): + global thing + thing += bar() +def bar(): + global thing + thing += foo() +thing = bar() +### +def foo(): + bar() + thing +def bar(): + foo() + thin +thing = bar() +### +def foo(): + return +### +return "hello" +### +return foo +### +def f(): + def g(): + return foo + foo = 0 +### +def f(): + foo = 0 +f(foo) +### +def f(x): + tellraw @a x +f("thing") +### +def f(x): + tellraw @a xx +f("thing") +### +{ + foo: "bar" +} +### +foo = "hello" +{ + foo: "bar" +} +### +foo = "hello" +{ + "foo": foo +} +### +foo = "hello" +{ + foo * 3: 42, + 16 + 3: [], +} +### +my_predicate = { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "score1": { + "min": { + "type": "minecraft:score", + "target": "this", + "score": "score2", + "scale": 1 + } + } + } +} +### +my_predicate = { + condition: "minecraft:entity_scores", + entity: "this", + scores: { + score1: { + "min": { + "type": "minecraft:score", + target: "this", + score: "score2", + scale: 1 + } + } + } +} +### +def f(): + return {f(): f(), other: [{}, {}, "wat"]} +### +at @s if "foo" == "bar": + say yolo +### +at @s for i in "foo": + say yolo +### +say hello +### +def wat(): + say hello +### +a = '' +tellraw @p a +### +foo = '[{"text": "Hello", "bold": true}]' +as @a at @s if block ~ ~-1 ~ #wool give @s stone{ + display: { + Name: foo, + Lore: [ + '[{ "text": "Something else here" }]', + ] + } +} +### +thing = (1, 'hey') + () + ("wow",) +### +f"hello" +### +foo = "world" +f"hello {foo}" +### +foo = "world" +f"hello {foo!r}" +### +f"hello {1 + 1}" +### +f"hello {1 + 1:03}" +### +f'{{}}nope{1}' +### +yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" +### +yo = f"" +### +yo = f"\"" +### +yo = f"\\" +### +yo = f"}" +### +yo = f'thing \e' +### +x = 8 +if score @s tmp matches (x, None) say wat +### +def f(): + yield 1 + yield 2 + yield 3 +for i in f(): + say i +### +if True: + yield +### +def f(): + yield +### +import demo:foo +### +import ./thing +### +import wat/is/that +### +from wat/is/that import foo +### +import math +mah.sin(1) +### +import math +math.sin(1) +### +import math as m +m.sin(1) +### +from demo:foo import thing +say thing +### +def f(): + from demo:foo import a b c +say a +### +if score @s tmp matches 1.. if entity @p[tag=foo]: + if True: + say 42 + else: + say no +### +setblock = 0 +### +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +### +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +say done +### +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +else: + say other +### +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +else: + say other +say done +### +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6]: + say foo + say bar +### +say foo + bar +execute + as @a + run say hello +### +while True: + if "hello": + pass + else: + break +### +for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): + append function node.parent: + if node.partition(5): + if score @s thingy matches node.range function node.children + else: + if score @s thingy matches node.range say node.value +### +print(ctx.directory, __name__) +### +a = 1 +setblock a 2 3 stone +### +a = "1 2 3" +setblock a stone +### +a = 1 +if block ^ f"^{a}" ^ #planks say 42 +### +if block ("~", "~", "~") #planks say 42 +### +a = [][] +### +def f(): + pass +f(1, 2, thing=3, 4) +### +def f(): + pass +f(1, 2, **{"thing": 3}, 4) +### +def f(): + pass +f(1, 2, thing=3, *[4]) +### +def f(): + pass +f(1, 2, **{"thing": 3}, *[4]) +### +def f(): + pass +f(1, 2, thing=3) +### +def f(): + pass +f(1, 2, **{"thing": 3}) +### +def f(): + pass +f(1, *[4], 2, thing=3) +### +def f(): + pass +f(1, *[4], 2, **{"thing": 3}) +### +[*"abc"] +### +[**"abc"] +### +{**{1: 1}} +### +{*{1: 1}} +### +foo.bar = 1 +### +foo().bar = 1 +### +def f(): + f.data = {} +### +d = {} +d[1] = {} +d[1][2] = "foo" +### +d = {foo: 1} +d.foo += 1 +### +scoreboard objectives setdisplay list some_score_name +### +color = "red" +scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name +### +my_team = "sidebar.team.red" +scoreboard objectives setdisplay my_team some_score_name +### +item replace block ~ ~2 ~ container.26 with minecraft:spruce_sapling 4 +### +weapon = "thing" +item replace entity @s weapon.offhand from entity @s weapon.mainhand +### +my_weapon = {offhand: "weapon.offhand", mainhand: "weapon.mainhand"} +item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand +### +numbers = list(range(12)) +say numbers[3:] +### +numbers = list(range(12)) +numbers[3:] = [] +### +numbers = list(range(12)) +del numbers[3:] +### +del 1 + 1 +### +execute function demo:foo: +### +mykey = "aaa" +if data storage some:path/to/storage f'some.{mykey}.path{{my: "compound"}}' run say hi +### +mypath = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' +if data storage some:path/to/storage (mypath) run say hi +### +entity_type = "creeper" +at @e[type=entity_type] summon lightning_bolt +### +append function demo:foo +### +function_tag +### +merge function_tag +### +merge function_tag minecraft:tick +### +demo:foo +### +a = demo:foo/bar +### +for class in "abc": + scoreboard objectives add class dummy +### +a = 1 +positioned ~ ~a ~ function demo:foo +### +a, b = "ab" +### +for i, value in enumerate("abc"): + say f"{i}: {value}" +### +global x +### +x = 1 +global x +### +x = 1 +def f(): + global xx +### +def f(x): + global x +### +x = 1 +def f(): + global x + nonlocal x +### +math = 0 +say math +def wat(): + global math + import math +wat() +say math.ceil(0.1) +### +def init_global_score(self, name): + self.name = name + +def rebind_global_score(self, rhs): + if isinstance(rhs, GlobalScore): + scoreboard players operation self.name global = rhs.name global + else: + scoreboard players set self.name global rhs + return self + +GlobalScore = type("GlobalScore", (), {"__init__": init_global_score, "__rebind__": rebind_global_score}) + +a = GlobalScore("a") +a = 123 +a = 456 + +b = GlobalScore("b") +b = 789 +b = a +### +def Counter(x=0): + def incr(): + nonlocal x + x += 1 + return x + return {"incr": incr} + +counter = Counter() +say counter.incr() +say counter.incr() +say Counter(9).incr() +### +for i in range(3): + parent[i] = f"param{i}" +### +def foo(value): + if value: + result = 1 + else: + result = 0 + return result +### +def foo(value): + result = "init" + if value: + result = 1 + else: + result = 0 + return result +### +tag_name = foo:bar +function #tag_name +### +for a in [False, True]: + for b in [False, True]: + for c in [False, True]: + for d in [False, True]: + print((a and b or c and not d) in [True] not in [False]) +### +a = 1 +def f(): + a += 1 diff --git a/packages/bolt/tests/resources/sandbox_examples.mcfunction b/packages/bolt/tests/resources/sandbox_examples.mcfunction new file mode 100644 index 000000000..86a571a18 --- /dev/null +++ b/packages/bolt/tests/resources/sandbox_examples.mcfunction @@ -0,0 +1,19 @@ +import sys +### +def f(): + pass +f.__code__ +### +def hello(): + return "world" +say hello.__name__.capitalize() +### +say ctx.project_id +### +print(f'foo {str.__name__} bar') +### +"a{0.__class__}b".format(42) +### +foo = "a{x.__class__}b".format_map({"x":42}) +### +say __name__.format() diff --git a/packages/bolt/tests/snapshots/bolt__parse_0__0.txt b/packages/bolt/tests/snapshots/bolt__parse_0__0.txt new file mode 100644 index 000000000..fd9c249c7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_0__0.txt @@ -0,0 +1,15 @@ +0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 0 diff --git a/packages/bolt/tests/snapshots/bolt__parse_0__1.txt b/packages/bolt/tests/snapshots/bolt__parse_0__1.txt new file mode 100644 index 000000000..92bf806ef --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_0__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_100__0.txt b/packages/bolt/tests/snapshots/bolt__parse_100__0.txt new file mode 100644 index 000000000..3af4d1c56 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_100__0.txt @@ -0,0 +1,19 @@ +say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_100__1.txt b/packages/bolt/tests/snapshots/bolt__parse_100__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_100__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_101__0.txt b/packages/bolt/tests/snapshots/bolt__parse_101__0.txt new file mode 100644 index 000000000..5de8a0ddb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_101__0.txt @@ -0,0 +1,35 @@ +def wat(): + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'wat' + arguments: + + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_101__1.txt b/packages/bolt/tests/snapshots/bolt__parse_101__1.txt new file mode 100644 index 000000000..79943169f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_101__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def wat(): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_102__0.txt b/packages/bolt/tests/snapshots/bolt__parse_102__0.txt new file mode 100644 index 000000000..357169673 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_102__0.txt @@ -0,0 +1,48 @@ +a = '' +tellraw @p a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: '' + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=9) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + variable: 'p' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + prefix: None + converter: 'json' + value: + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + value: 'a' diff --git a/packages/bolt/tests/snapshots/bolt__parse_102__1.txt b/packages/bolt/tests/snapshots/bolt__parse_102__1.txt new file mode 100644 index 000000000..97365f376 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_102__1.txt @@ -0,0 +1,44 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = '' + a = _mecha_var0 + _mecha_var1 = a + _mecha_var1 = _mecha_helper_interpolate_json(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var1]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=18, lineno=2, colno=12) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + prefix: None + converter: 'json' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=15, lineno=2, colno=9) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + variable: 'p' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + identifier: 'tellraw:targets:message' + arguments: + + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=13) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__0.txt b/packages/bolt/tests/snapshots/bolt__parse_103__0.txt new file mode 100644 index 000000000..6a27041da --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_103__0.txt @@ -0,0 +1,180 @@ +foo = '[{"text": "Hello", "bold": true}]' +as @a at @s if block ~ ~-1 ~ #wool give @s stone{ + display: { + Name: foo, + Lore: [ + '[{ "text": "Something else here" }]', + ] + } +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + value: '[{"text": "Hello", "bold": true}]' + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=64, lineno=2, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=65, lineno=2, colno=24) + end_location: SourceLocation(pos=68, lineno=2, colno=27) + type: 'relative' + value: -1 + z: + + location: SourceLocation(pos=69, lineno=2, colno=28) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + is_tag: True + namespace: None + path: 'wool' + block_states: + + data_tags: None + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=90, lineno=2, colno=49) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=103, lineno=3, colno=12) + value: 'display' + value: + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=119, lineno=4, colno=13) + value: 'Name' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + prefix: None + converter: 'nbt' + value: + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + value: 'foo' + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=138, lineno=5, colno=13) + value: 'Lore' + value: + + location: SourceLocation(pos=140, lineno=5, colno=15) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + elements: + + location: SourceLocation(pos=154, lineno=6, colno=13) + end_location: SourceLocation(pos=191, lineno=6, colno=50) + value: String('[{ "text": "Something else here" }]') diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt new file mode 100644 index 000000000..d8935073d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt @@ -0,0 +1,161 @@ +_mecha_lineno = [1, 8], [1, 4] +_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = '[{"text": "Hello", "bold": true}]' + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_var1 = _mecha_helper_interpolate_nbt(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_var1), _mecha_refs[2]])))])))]))]))]))]))]))]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=121, lineno=4, colno=15) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + prefix: None + converter: 'nbt' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=115, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=18) + key: + + value: + +_mecha_refs[2] + + location: SourceLocation(pos=134, lineno=5, colno=9) + end_location: SourceLocation(pos=202, lineno=7, colno=10) + key: + + value: + +_mecha_refs[3] + + location: SourceLocation(pos=105, lineno=3, colno=14) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + entries: + + +_mecha_refs[4] + + location: SourceLocation(pos=96, lineno=3, colno=5) + end_location: SourceLocation(pos=208, lineno=8, colno=6) + key: + + value: + +_mecha_refs[5] + + location: SourceLocation(pos=90, lineno=2, colno=49) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + entries: + +_mecha_refs[6] + + location: SourceLocation(pos=85, lineno=2, colno=44) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: + + data_tags: + +_mecha_refs[7] + + location: SourceLocation(pos=82, lineno=2, colno=41) + end_location: SourceLocation(pos=84, lineno=2, colno=43) + variable: 's' + arguments: + +_mecha_refs[8] + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'give:targets:item' + arguments: + + +_mecha_refs[9] + + location: SourceLocation(pos=77, lineno=2, colno=36) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[10] + + location: SourceLocation(pos=63, lineno=2, colno=22) + end_location: SourceLocation(pos=70, lineno=2, colno=29) + x: + + y: + + z: + +_mecha_refs[11] + + location: SourceLocation(pos=71, lineno=2, colno=30) + end_location: SourceLocation(pos=76, lineno=2, colno=35) + identifier: + + block_states: + + data_tags: None +_mecha_refs[12] + + location: SourceLocation(pos=54, lineno=2, colno=13) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + + +_mecha_refs[13] + + location: SourceLocation(pos=51, lineno=2, colno=10) + end_location: SourceLocation(pos=53, lineno=2, colno=12) + variable: 's' + arguments: + +_mecha_refs[14] + + location: SourceLocation(pos=48, lineno=2, colno=7) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:at:targets:subcommand' + arguments: + + +_mecha_refs[15] + + location: SourceLocation(pos=45, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=6) + variable: 'a' + arguments: + +_mecha_refs[16] + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:as:targets:subcommand' + arguments: + + +_mecha_refs[17] + + location: SourceLocation(pos=42, lineno=2, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[18] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=210, lineno=9, colno=2) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_104__0.txt b/packages/bolt/tests/snapshots/bolt__parse_104__0.txt new file mode 100644 index 000000000..720b1ff52 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_104__0.txt @@ -0,0 +1,59 @@ +thing = (1, 'hey') + () + ("wow",) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'thing' + rebind: False + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + items: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'hey' + right: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + items: + + right: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + items: + + location: SourceLocation(pos=27, lineno=1, colno=28) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 'wow' diff --git a/packages/bolt/tests/snapshots/bolt__parse_104__1.txt b/packages/bolt/tests/snapshots/bolt__parse_104__1.txt new file mode 100644 index 000000000..9f5c3edf4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_104__1.txt @@ -0,0 +1,23 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var6: + _mecha_var0 = 1 + _mecha_var1 = 'hey' + _mecha_var2 = (_mecha_var0,_mecha_var1,) + _mecha_var3 = () + _mecha_var2 = _mecha_var2 + _mecha_var3 + _mecha_var4 = 'wow' + _mecha_var5 = (_mecha_var4,) + _mecha_var2 = _mecha_var2 + _mecha_var5 + thing = _mecha_var2 +_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) +--- +output = _mecha_var7 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_105__0.txt b/packages/bolt/tests/snapshots/bolt__parse_105__0.txt new file mode 100644 index 000000000..55e7e2abb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_105__0.txt @@ -0,0 +1,17 @@ +f"hello" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + fmt: 'hello' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_105__1.txt b/packages/bolt/tests/snapshots/bolt__parse_105__1.txt new file mode 100644 index 000000000..d78006888 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_105__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'hello'.format() +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_106__0.txt b/packages/bolt/tests/snapshots/bolt__parse_106__0.txt new file mode 100644 index 000000000..d188f229b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_106__0.txt @@ -0,0 +1,41 @@ +foo = "world" +f"hello {foo}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + fmt: 'hello {}' + values: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=13) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_106__1.txt b/packages/bolt/tests/snapshots/bolt__parse_106__1.txt new file mode 100644 index 000000000..90c8d4eb5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_106__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1, 7], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 'world' + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_var2 = 'hello {}'.format(_mecha_var1) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_107__0.txt b/packages/bolt/tests/snapshots/bolt__parse_107__0.txt new file mode 100644 index 000000000..9952531f1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_107__0.txt @@ -0,0 +1,41 @@ +foo = "world" +f"hello {foo!r}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=17) + fmt: 'hello {!r}' + values: + + location: SourceLocation(pos=23, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=13) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_107__1.txt b/packages/bolt/tests/snapshots/bolt__parse_107__1.txt new file mode 100644 index 000000000..09066c304 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_107__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1, 7], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 'world' + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_var2 = 'hello {!r}'.format(_mecha_var1) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_108__0.txt b/packages/bolt/tests/snapshots/bolt__parse_108__0.txt new file mode 100644 index 000000000..2ec18dd60 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_108__0.txt @@ -0,0 +1,30 @@ +f"hello {1 + 1}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + fmt: 'hello {}' + values: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_108__1.txt b/packages/bolt/tests/snapshots/bolt__parse_108__1.txt new file mode 100644 index 000000000..664d24330 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_108__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + _mecha_var1 = 1 + _mecha_var0 = _mecha_var0 + _mecha_var1 + _mecha_var2 = 'hello {}'.format(_mecha_var0) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_109__0.txt b/packages/bolt/tests/snapshots/bolt__parse_109__0.txt new file mode 100644 index 000000000..f117dd1d2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_109__0.txt @@ -0,0 +1,30 @@ +f"hello {1 + 1:03}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + fmt: 'hello {:03}' + values: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 1 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_109__1.txt b/packages/bolt/tests/snapshots/bolt__parse_109__1.txt new file mode 100644 index 000000000..b352262ea --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_109__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + _mecha_var1 = 1 + _mecha_var0 = _mecha_var0 + _mecha_var1 + _mecha_var2 = 'hello {:03}'.format(_mecha_var0) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_10__0.txt b/packages/bolt/tests/snapshots/bolt__parse_10__0.txt new file mode 100644 index 000000000..20df2755f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_10__0.txt @@ -0,0 +1,40 @@ +2 + -54 * 10 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 2 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '*' + left: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 54 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 10 diff --git a/packages/bolt/tests/snapshots/bolt__parse_10__1.txt b/packages/bolt/tests/snapshots/bolt__parse_10__1.txt new file mode 100644 index 000000000..019e03060 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_10__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 2 + _mecha_var1 = 54 + _mecha_var1 = - _mecha_var1 + _mecha_var2 = 10 + _mecha_var1 = _mecha_var1 * _mecha_var2 + _mecha_var0 = _mecha_var0 + _mecha_var1 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_110__0.txt b/packages/bolt/tests/snapshots/bolt__parse_110__0.txt new file mode 100644 index 000000000..65d0c3c36 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_110__0.txt @@ -0,0 +1,20 @@ +f'{{}}nope{1}' +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + fmt: '{{}}nope{}' + values: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_110__1.txt b/packages/bolt/tests/snapshots/bolt__parse_110__1.txt new file mode 100644 index 000000000..3a8d82aa6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_110__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + _mecha_var1 = '{{}}nope{}'.format(_mecha_var0) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_111__0.txt b/packages/bolt/tests/snapshots/bolt__parse_111__0.txt new file mode 100644 index 000000000..1eab6aebd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_111__0.txt @@ -0,0 +1,41 @@ +yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + rebind: False + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + fmt: '{{{}}}' + values: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + fmt: '{{{}}}' + values: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + fmt: '{{{:08}}}' + values: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 7 diff --git a/packages/bolt/tests/snapshots/bolt__parse_111__1.txt b/packages/bolt/tests/snapshots/bolt__parse_111__1.txt new file mode 100644 index 000000000..c82b3c7ed --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_111__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 7 + _mecha_var1 = '{{{:08}}}'.format(_mecha_var0) + _mecha_var2 = '{{{}}}'.format(_mecha_var1) + _mecha_var3 = '{{{}}}'.format(_mecha_var2) + yo = _mecha_var3 +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_112__0.txt b/packages/bolt/tests/snapshots/bolt__parse_112__0.txt new file mode 100644 index 000000000..aaa3e3ed7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_112__0.txt @@ -0,0 +1,28 @@ +yo = f"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + rebind: False + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + fmt: '' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_112__1.txt b/packages/bolt/tests/snapshots/bolt__parse_112__1.txt new file mode 100644 index 000000000..1cd364bb8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_112__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = ''.format() + yo = _mecha_var0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_113__0.txt b/packages/bolt/tests/snapshots/bolt__parse_113__0.txt new file mode 100644 index 000000000..7acc4b6a6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_113__0.txt @@ -0,0 +1,28 @@ +yo = f"\"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + rebind: False + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + fmt: '"' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_113__1.txt b/packages/bolt/tests/snapshots/bolt__parse_113__1.txt new file mode 100644 index 000000000..2712ec24a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_113__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = '"'.format() + yo = _mecha_var0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_114__0.txt b/packages/bolt/tests/snapshots/bolt__parse_114__0.txt new file mode 100644 index 000000000..97b54395f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_114__0.txt @@ -0,0 +1,28 @@ +yo = f"\\" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'yo' + rebind: False + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + fmt: '\\' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_114__1.txt b/packages/bolt/tests/snapshots/bolt__parse_114__1.txt new file mode 100644 index 000000000..0f2a4d713 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_114__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = '\\'.format() + yo = _mecha_var0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_115__0.txt b/packages/bolt/tests/snapshots/bolt__parse_115__0.txt new file mode 100644 index 000000000..d448a7276 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_115__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected quote but got brace '}'. +# line 1, column 8 +# 1 | yo = f"}" +# : ^ +yo = f"}" diff --git a/packages/bolt/tests/snapshots/bolt__parse_116__0.txt b/packages/bolt/tests/snapshots/bolt__parse_116__0.txt new file mode 100644 index 000000000..8bb2a7b3c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_116__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid escape sequence \e. +# line 1, column 14 +# 1 | yo = f'thing \e' +# : ^^ +yo = f'thing \e' diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__0.txt b/packages/bolt/tests/snapshots/bolt__parse_117__0.txt new file mode 100644 index 000000000..6b14eddcd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_117__0.txt @@ -0,0 +1,83 @@ +x = 8 +if score @s tmp matches (x, None) say wat +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'x' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 8 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + prefix: None + converter: 'range' + value: + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + items: + + location: SourceLocation(pos=31, lineno=2, colno=26) + end_location: SourceLocation(pos=32, lineno=2, colno=27) + value: 'x' + + location: SourceLocation(pos=34, lineno=2, colno=29) + end_location: SourceLocation(pos=38, lineno=2, colno=33) + value: None + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + fragments: + + location: SourceLocation(pos=44, lineno=2, colno=39) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + value: 'wat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt new file mode 100644 index 000000000..0db0c0cea --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt @@ -0,0 +1,67 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 8 + x = _mecha_var0 + _mecha_var1 = x + _mecha_var2 = None + _mecha_var3 = (_mecha_var1,_mecha_var2,) + _mecha_var3 = _mecha_helper_interpolate_range(_mecha_var3, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_refs[2], _mecha_var3, _mecha_refs[3]]))]))) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=30, lineno=2, colno=25) + end_location: SourceLocation(pos=39, lineno=2, colno=34) + prefix: None + converter: 'range' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=17, lineno=2, colno=12) + variable: 's' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=18, lineno=2, colno=13) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'tmp' +_mecha_refs[3] + + location: SourceLocation(pos=40, lineno=2, colno=35) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[5] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=42) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt new file mode 100644 index 000000000..a0deb1186 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt @@ -0,0 +1,92 @@ +def f(): + yield 1 + yield 2 + yield 3 +for i in f(): + say i +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=4, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=11) + end_location: SourceLocation(pos=20, lineno=2, colno=12) + value: 1 + + location: SourceLocation(pos=25, lineno=3, colno=5) + end_location: SourceLocation(pos=32, lineno=3, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=31, lineno=3, colno=11) + end_location: SourceLocation(pos=32, lineno=3, colno=12) + value: 2 + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=44, lineno=4, colno=12) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=43, lineno=4, colno=11) + end_location: SourceLocation(pos=44, lineno=4, colno=12) + value: 3 + + location: SourceLocation(pos=45, lineno=5, colno=1) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=49, lineno=5, colno=5) + end_location: SourceLocation(pos=50, lineno=5, colno=6) + value: 'i' + rebind: False + + location: SourceLocation(pos=54, lineno=5, colno=10) + end_location: SourceLocation(pos=57, lineno=5, colno=13) + value: + + location: SourceLocation(pos=54, lineno=5, colno=10) + end_location: SourceLocation(pos=55, lineno=5, colno=11) + value: 'f' + arguments: + + + location: SourceLocation(pos=63, lineno=6, colno=5) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=63, lineno=6, colno=5) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=67, lineno=6, colno=9) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=67, lineno=6, colno=9) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + value: 'i' diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt new file mode 100644 index 000000000..a166aacca --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt @@ -0,0 +1,44 @@ +_mecha_lineno = [1, 13, 16], [1, 5, 6] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + def f(): + _mecha_var0 = 1 + yield _mecha_var0 + _mecha_var1 = 2 + yield _mecha_var1 + _mecha_var2 = 3 + yield _mecha_var2 + _mecha_var3 = f + _mecha_var3 = _mecha_var3() + for i in _mecha_var3: + _mecha_var4 = i + _mecha_var4 = _mecha_helper_interpolate_message(_mecha_var4, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var4]))) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=67, lineno=6, colno=9) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=63, lineno=6, colno=5) + end_location: SourceLocation(pos=68, lineno=6, colno=10) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=7, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_119__0.txt b/packages/bolt/tests/snapshots/bolt__parse_119__0.txt new file mode 100644 index 000000000..566664cc2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_119__0.txt @@ -0,0 +1,7 @@ +if True: +#>ERROR Can only use 'yield' in functions. +# line 2, column 5 +# 1 | if True: +# 2 | yield +# : ^^^^^ + yield diff --git a/packages/bolt/tests/snapshots/bolt__parse_11__0.txt b/packages/bolt/tests/snapshots/bolt__parse_11__0.txt new file mode 100644 index 000000000..cee2f9318 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_11__0.txt @@ -0,0 +1,40 @@ +(2 + -54) * 10 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '*' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '+' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 2 + right: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '-' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 54 + right: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 10 diff --git a/packages/bolt/tests/snapshots/bolt__parse_11__1.txt b/packages/bolt/tests/snapshots/bolt__parse_11__1.txt new file mode 100644 index 000000000..5c482d291 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_11__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 2 + _mecha_var1 = 54 + _mecha_var1 = - _mecha_var1 + _mecha_var0 = _mecha_var0 + _mecha_var1 + _mecha_var2 = 10 + _mecha_var0 = _mecha_var0 * _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_120__0.txt b/packages/bolt/tests/snapshots/bolt__parse_120__0.txt new file mode 100644 index 000000000..e881943fb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_120__0.txt @@ -0,0 +1,28 @@ +def f(): + yield +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + identifier: 'yield' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_120__1.txt b/packages/bolt/tests/snapshots/bolt__parse_120__1.txt new file mode 100644 index 000000000..1226c5c97 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_120__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + yield +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_121__0.txt b/packages/bolt/tests/snapshots/bolt__parse_121__0.txt new file mode 100644 index 000000000..078fdc525 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_121__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can't import 'demo:foo' without alias. +# line 1, column 8 +# 1 | import demo:foo +# : ^^^^^^^^ +import demo:foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_122__0.txt b/packages/bolt/tests/snapshots/bolt__parse_122__0.txt new file mode 100644 index 000000000..48755d502 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_122__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can't resolve relative resource location './thing'. +# line 1, column 8 +# 1 | import ./thing +# : ^^^^^^^ +import ./thing diff --git a/packages/bolt/tests/snapshots/bolt__parse_123__0.txt b/packages/bolt/tests/snapshots/bolt__parse_123__0.txt new file mode 100644 index 000000000..0f6473b28 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_123__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid module location 'wat/is/that'. +# line 1, column 8 +# 1 | import wat/is/that +# : ^^^^^^^^^^^ +import wat/is/that diff --git a/packages/bolt/tests/snapshots/bolt__parse_124__0.txt b/packages/bolt/tests/snapshots/bolt__parse_124__0.txt new file mode 100644 index 000000000..846353f25 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_124__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid module location 'wat/is/that'. +# line 1, column 6 +# 1 | from wat/is/that import foo +# : ^^^^^^^^^^^ +from wat/is/that import foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_125__0.txt b/packages/bolt/tests/snapshots/bolt__parse_125__0.txt new file mode 100644 index 000000000..2a9b6d942 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_125__0.txt @@ -0,0 +1,9 @@ +import math +#>ERROR Identifier 'mah' is not defined. +# line 2, column 1 +# 1 | import math +# 2 | mah.sin(1) +# : ^^^ +# Notes: +# - Expected assignment but got literal '.sin(1)'. +mah.sin(1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_126__0.txt b/packages/bolt/tests/snapshots/bolt__parse_126__0.txt new file mode 100644 index 000000000..5cba1c90d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_126__0.txt @@ -0,0 +1,41 @@ +import math +math.sin(1) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'import:module' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=12) + value: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + name: 'sin' + value: + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=5) + value: 'math' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=11) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_126__1.txt b/packages/bolt/tests/snapshots/bolt__parse_126__1.txt new file mode 100644 index 000000000..b3fd73816 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_126__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + math = _mecha_helper_import_module('math') + _mecha_var0 = math + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'sin') + _mecha_var1 = 1 + _mecha_var0 = _mecha_var0(_mecha_var1) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_127__0.txt b/packages/bolt/tests/snapshots/bolt__parse_127__0.txt new file mode 100644 index 000000000..494600590 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_127__0.txt @@ -0,0 +1,45 @@ +import math as m +m.sin(1) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'import:module:as:alias' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'm' + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=9) + value: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=6) + name: 'sin' + value: + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=2) + value: 'm' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=7) + end_location: SourceLocation(pos=24, lineno=2, colno=8) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_127__1.txt b/packages/bolt/tests/snapshots/bolt__parse_127__1.txt new file mode 100644 index 000000000..c3764c8d4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_127__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + m = _mecha_helper_import_module('math') + _mecha_var0 = m + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'sin') + _mecha_var1 = 1 + _mecha_var0 = _mecha_var0(_mecha_var1) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt new file mode 100644 index 000000000..b2be1bad8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt @@ -0,0 +1,42 @@ +from demo:foo import thing +say thing +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + is_tag: False + namespace: 'demo' + path: 'foo' + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: 'thing' + + location: SourceLocation(pos=27, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + value: 'thing' diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt new file mode 100644 index 000000000..37ad9c1f9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt @@ -0,0 +1,35 @@ +_mecha_lineno = [1, 7], [1, 2] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + thing = _mecha_runtime.from_module_import('demo:foo', 'thing') + _mecha_var0 = thing + _mecha_var0 = _mecha_helper_interpolate_message(_mecha_var0, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var0]))) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=27, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=10) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt new file mode 100644 index 000000000..625ae841f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt @@ -0,0 +1,74 @@ +def f(): + from demo:foo import a b c +say a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=6) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=18) + is_tag: False + namespace: 'demo' + path: 'foo' + + location: SourceLocation(pos=34, lineno=2, colno=26) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + identifier: 'from:module:import:name:subcommand' + arguments: + + location: SourceLocation(pos=34, lineno=2, colno=26) + end_location: SourceLocation(pos=35, lineno=2, colno=27) + value: 'a' + + location: SourceLocation(pos=36, lineno=2, colno=28) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + identifier: 'from:module:import:name:subcommand' + arguments: + + location: SourceLocation(pos=36, lineno=2, colno=28) + end_location: SourceLocation(pos=37, lineno=2, colno=29) + value: 'b' + + location: SourceLocation(pos=38, lineno=2, colno=30) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=38, lineno=2, colno=30) + end_location: SourceLocation(pos=39, lineno=2, colno=31) + value: 'c' + + location: SourceLocation(pos=40, lineno=3, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=6) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=3, colno=5) + end_location: SourceLocation(pos=45, lineno=3, colno=6) + fragments: + + location: SourceLocation(pos=44, lineno=3, colno=5) + end_location: SourceLocation(pos=45, lineno=3, colno=6) + value: 'a' diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__1.txt b/packages/bolt/tests/snapshots/bolt__parse_129__1.txt new file mode 100644 index 000000000..60a562a65 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_129__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1, 6], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def f(): + a, b, c = _mecha_runtime.from_module_import('demo:foo', 'a', 'b', 'c') + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=40, lineno=3, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=6) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=6) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_12__0.txt b/packages/bolt/tests/snapshots/bolt__parse_12__0.txt new file mode 100644 index 000000000..f3a6e6b91 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_12__0.txt @@ -0,0 +1,50 @@ +---64+++64 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + value: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 64 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 64 diff --git a/packages/bolt/tests/snapshots/bolt__parse_12__1.txt b/packages/bolt/tests/snapshots/bolt__parse_12__1.txt new file mode 100644 index 000000000..8e049fb3d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_12__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 64 + _mecha_var0 = - _mecha_var0 + _mecha_var0 = - _mecha_var0 + _mecha_var0 = - _mecha_var0 + _mecha_var1 = 64 + _mecha_var1 = + _mecha_var1 + _mecha_var1 = + _mecha_var1 + _mecha_var0 = _mecha_var0 + _mecha_var1 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_130__0.txt b/packages/bolt/tests/snapshots/bolt__parse_130__0.txt new file mode 100644 index 000000000..e5e5fc368 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_130__0.txt @@ -0,0 +1,116 @@ +if score @s tmp matches 1.. if entity @p[tag=foo]: + if True: + say 42 + else: + say no +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + inverted: False + key: + + location: SourceLocation(pos=41, lineno=1, colno=42) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'tag' + value: + + location: SourceLocation(pos=45, lineno=1, colno=46) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'foo' + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=78, lineno=3, colno=15) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=58, lineno=2, colno=8) + end_location: SourceLocation(pos=62, lineno=2, colno=12) + value: True + + location: SourceLocation(pos=72, lineno=3, colno=9) + end_location: SourceLocation(pos=78, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=72, lineno=3, colno=9) + end_location: SourceLocation(pos=78, lineno=3, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=76, lineno=3, colno=13) + end_location: SourceLocation(pos=78, lineno=3, colno=15) + fragments: + + location: SourceLocation(pos=76, lineno=3, colno=13) + end_location: SourceLocation(pos=78, lineno=3, colno=15) + value: '42' + + location: SourceLocation(pos=83, lineno=4, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=97, lineno=5, colno=9) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + commands: + + location: SourceLocation(pos=97, lineno=5, colno=9) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=101, lineno=5, colno=13) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + fragments: + + location: SourceLocation(pos=101, lineno=5, colno=13) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + value: 'no' diff --git a/packages/bolt/tests/snapshots/bolt__parse_130__1.txt b/packages/bolt/tests/snapshots/bolt__parse_130__1.txt new file mode 100644 index 000000000..db07ead93 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_130__1.txt @@ -0,0 +1,102 @@ +_mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = True + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1))]))]))]))]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[11], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=72, lineno=3, colno=9) + end_location: SourceLocation(pos=78, lineno=3, colno=15) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=97, lineno=5, colno=9) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + commands: + + +_mecha_refs[3] + + location: SourceLocation(pos=55, lineno=2, colno=5) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:commands' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=49, lineno=1, colno=50) + variable: 'p' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + +_mecha_refs[6] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[7] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[8] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + min: 1 + max: None +_mecha_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[10] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[11] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=103, lineno=5, colno=15) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_131__0.txt b/packages/bolt/tests/snapshots/bolt__parse_131__0.txt new file mode 100644 index 000000000..fc34b84e9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_131__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected coordinate or identifier but got literal '='. +# line 1, column 10 +# 1 | setblock = 0 +# : ^ +setblock = 0 diff --git a/packages/bolt/tests/snapshots/bolt__parse_132__0.txt b/packages/bolt/tests/snapshots/bolt__parse_132__0.txt new file mode 100644 index 000000000..4753e4a5b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_132__0.txt @@ -0,0 +1,144 @@ +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + value: '4' diff --git a/packages/bolt/tests/snapshots/bolt__parse_132__1.txt b/packages/bolt/tests/snapshots/bolt__parse_132__1.txt new file mode 100644 index 000000000..c97de844b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_132__1.txt @@ -0,0 +1,66 @@ +_mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_133__0.txt b/packages/bolt/tests/snapshots/bolt__parse_133__0.txt new file mode 100644 index 000000000..4dac52c11 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_133__0.txt @@ -0,0 +1,158 @@ +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +say done +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=78, lineno=9, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + value: '4' + + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=78, lineno=9, colno=9) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=74, lineno=9, colno=5) + end_location: SourceLocation(pos=78, lineno=9, colno=9) + fragments: + + location: SourceLocation(pos=74, lineno=9, colno=5) + end_location: SourceLocation(pos=78, lineno=9, colno=9) + value: 'done' diff --git a/packages/bolt/tests/snapshots/bolt__parse_133__1.txt b/packages/bolt/tests/snapshots/bolt__parse_133__1.txt new file mode 100644 index 000000000..29692703a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_133__1.txt @@ -0,0 +1,75 @@ +_mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + _mecha_runtime.commands.append(_mecha_refs[4]) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=78, lineno=9, colno=9) + identifier: 'say:message' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=78, lineno=9, colno=9) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_134__0.txt b/packages/bolt/tests/snapshots/bolt__parse_134__0.txt new file mode 100644 index 000000000..b2804a5b6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_134__0.txt @@ -0,0 +1,168 @@ +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +else: + say other +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + value: '4' + + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + fragments: + + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + value: 'other' diff --git a/packages/bolt/tests/snapshots/bolt__parse_134__1.txt b/packages/bolt/tests/snapshots/bolt__parse_134__1.txt new file mode 100644 index 000000000..998a03f66 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_134__1.txt @@ -0,0 +1,76 @@ +_mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[4].commands) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_135__0.txt b/packages/bolt/tests/snapshots/bolt__parse_135__0.txt new file mode 100644 index 000000000..3da8f3073 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_135__0.txt @@ -0,0 +1,182 @@ +if 1: + say 1 +elif 2: + say 2 +elif 3: + say 3 +elif 4: + say 4 +else: + say other +say done +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=98, lineno=11, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 1 + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + fragments: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: '1' + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=21, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + fragments: + + location: SourceLocation(pos=32, lineno=4, colno=9) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + value: '2' + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=34, lineno=5, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=39, lineno=5, colno=6) + end_location: SourceLocation(pos=40, lineno=5, colno=7) + value: 3 + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + fragments: + + location: SourceLocation(pos=50, lineno=6, colno=9) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + value: '3' + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=52, lineno=7, colno=1) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=57, lineno=7, colno=6) + end_location: SourceLocation(pos=58, lineno=7, colno=7) + value: 4 + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + fragments: + + location: SourceLocation(pos=68, lineno=8, colno=9) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + value: '4' + + location: SourceLocation(pos=70, lineno=9, colno=1) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + fragments: + + location: SourceLocation(pos=84, lineno=10, colno=9) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + value: 'other' + + location: SourceLocation(pos=90, lineno=11, colno=1) + end_location: SourceLocation(pos=98, lineno=11, colno=9) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=94, lineno=11, colno=5) + end_location: SourceLocation(pos=98, lineno=11, colno=9) + fragments: + + location: SourceLocation(pos=94, lineno=11, colno=5) + end_location: SourceLocation(pos=98, lineno=11, colno=9) + value: 'done' diff --git a/packages/bolt/tests/snapshots/bolt__parse_135__1.txt b/packages/bolt/tests/snapshots/bolt__parse_135__1.txt new file mode 100644 index 000000000..ba16caa66 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_135__1.txt @@ -0,0 +1,85 @@ +_mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 4 + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[3].commands) + _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[4].commands) + _mecha_runtime.commands.append(_mecha_refs[5]) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=46, lineno=6, colno=5) + end_location: SourceLocation(pos=51, lineno=6, colno=10) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=64, lineno=8, colno=5) + end_location: SourceLocation(pos=69, lineno=8, colno=10) + commands: + +_mecha_refs[4] + + location: SourceLocation(pos=80, lineno=10, colno=5) + end_location: SourceLocation(pos=89, lineno=10, colno=14) + commands: + +_mecha_refs[5] + + location: SourceLocation(pos=90, lineno=11, colno=1) + end_location: SourceLocation(pos=98, lineno=11, colno=9) + identifier: 'say:message' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=98, lineno=11, colno=9) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_136__0.txt b/packages/bolt/tests/snapshots/bolt__parse_136__0.txt new file mode 100644 index 000000000..728253155 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_136__0.txt @@ -0,0 +1,212 @@ +execute + as @a # For each "player", + at @s # start at their feet. + anchored eyes # Looking through their eyes, + facing 0 0 0 # face perfectly at the target + anchored feet # (go back to the feet) + positioned ^ ^ ^1 # and move one block forward. + rotated as @s # Face the direction the player + # is actually facing, + positioned ^ ^ ^-1 # and move one block back. + if entity @s[distance=..0.6]: + say foo + say bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=8) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + variable: 'a' + arguments: + + + location: SourceLocation(pos=66, lineno=3, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=69, lineno=3, colno=8) + end_location: SourceLocation(pos=71, lineno=3, colno=10) + variable: 's' + arguments: + + + location: SourceLocation(pos=122, lineno=4, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=131, lineno=4, colno=14) + end_location: SourceLocation(pos=135, lineno=4, colno=18) + value: 'eyes' + + location: SourceLocation(pos=185, lineno=5, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:facing:pos:subcommand' + arguments: + + location: SourceLocation(pos=192, lineno=5, colno=12) + end_location: SourceLocation(pos=197, lineno=5, colno=17) + x: + + location: SourceLocation(pos=192, lineno=5, colno=12) + end_location: SourceLocation(pos=193, lineno=5, colno=13) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=194, lineno=5, colno=14) + end_location: SourceLocation(pos=195, lineno=5, colno=15) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=196, lineno=5, colno=16) + end_location: SourceLocation(pos=197, lineno=5, colno=17) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=249, lineno=6, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:anchored:anchor:subcommand' + arguments: + + location: SourceLocation(pos=258, lineno=6, colno=14) + end_location: SourceLocation(pos=262, lineno=6, colno=18) + value: 'feet' + + location: SourceLocation(pos=306, lineno=7, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=317, lineno=7, colno=16) + end_location: SourceLocation(pos=323, lineno=7, colno=22) + x: + + location: SourceLocation(pos=317, lineno=7, colno=16) + end_location: SourceLocation(pos=318, lineno=7, colno=17) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=319, lineno=7, colno=18) + end_location: SourceLocation(pos=320, lineno=7, colno=19) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=321, lineno=7, colno=20) + end_location: SourceLocation(pos=323, lineno=7, colno=22) + type: 'local' + value: 1 + + location: SourceLocation(pos=369, lineno=8, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:rotated:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=380, lineno=8, colno=16) + end_location: SourceLocation(pos=382, lineno=8, colno=18) + variable: 's' + arguments: + + + location: SourceLocation(pos=492, lineno=10, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=503, lineno=10, colno=16) + end_location: SourceLocation(pos=510, lineno=10, colno=23) + x: + + location: SourceLocation(pos=503, lineno=10, colno=16) + end_location: SourceLocation(pos=504, lineno=10, colno=17) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=505, lineno=10, colno=18) + end_location: SourceLocation(pos=506, lineno=10, colno=19) + type: 'local' + value: 0 + z: + + location: SourceLocation(pos=507, lineno=10, colno=20) + end_location: SourceLocation(pos=510, lineno=10, colno=23) + type: 'local' + value: -1 + + location: SourceLocation(pos=552, lineno=11, colno=5) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:if:entity:entities:subcommand' + arguments: + + location: SourceLocation(pos=562, lineno=11, colno=15) + end_location: SourceLocation(pos=580, lineno=11, colno=33) + variable: 's' + arguments: + + location: SourceLocation(pos=565, lineno=11, colno=18) + end_location: SourceLocation(pos=579, lineno=11, colno=32) + inverted: False + key: + + location: SourceLocation(pos=565, lineno=11, colno=18) + end_location: SourceLocation(pos=573, lineno=11, colno=26) + value: 'distance' + value: + + location: SourceLocation(pos=574, lineno=11, colno=27) + end_location: SourceLocation(pos=579, lineno=11, colno=32) + min: None + max: 0.6 + + location: SourceLocation(pos=590, lineno=12, colno=9) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=590, lineno=12, colno=9) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=590, lineno=12, colno=9) + end_location: SourceLocation(pos=597, lineno=12, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=594, lineno=12, colno=13) + end_location: SourceLocation(pos=597, lineno=12, colno=16) + fragments: + + location: SourceLocation(pos=594, lineno=12, colno=13) + end_location: SourceLocation(pos=597, lineno=12, colno=16) + value: 'foo' + + location: SourceLocation(pos=606, lineno=13, colno=9) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=610, lineno=13, colno=13) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + fragments: + + location: SourceLocation(pos=610, lineno=13, colno=13) + end_location: SourceLocation(pos=613, lineno=13, colno=16) + value: 'bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_136__1.txt b/packages/bolt/tests/snapshots/bolt__parse_136__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_136__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_137__0.txt b/packages/bolt/tests/snapshots/bolt__parse_137__0.txt new file mode 100644 index 000000000..6ddecb2a5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_137__0.txt @@ -0,0 +1,65 @@ +say foo + bar +execute + as @a + run say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'foo' + + location: SourceLocation(pos=11, lineno=2, colno=4) + end_location: SourceLocation(pos=12, lineno=2, colno=5) + value: ' ' + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + value: 'bar' + + location: SourceLocation(pos=16, lineno=3, colno=1) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=28, lineno=4, colno=5) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=31, lineno=4, colno=8) + end_location: SourceLocation(pos=33, lineno=4, colno=10) + variable: 'a' + arguments: + + + location: SourceLocation(pos=38, lineno=5, colno=5) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=42, lineno=5, colno=9) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=46, lineno=5, colno=13) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=46, lineno=5, colno=13) + end_location: SourceLocation(pos=51, lineno=5, colno=18) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_137__1.txt b/packages/bolt/tests/snapshots/bolt__parse_137__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_137__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_138__0.txt b/packages/bolt/tests/snapshots/bolt__parse_138__0.txt new file mode 100644 index 000000000..8018bc584 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_138__0.txt @@ -0,0 +1,57 @@ +while True: + if "hello": + pass + else: + break +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=64, lineno=5, colno=14) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: True + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=64, lineno=5, colno=14) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=40, lineno=3, colno=13) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=8) + end_location: SourceLocation(pos=26, lineno=2, colno=15) + value: 'hello' + + location: SourceLocation(pos=36, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=36, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=13) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=64, lineno=5, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=59, lineno=5, colno=9) + end_location: SourceLocation(pos=64, lineno=5, colno=14) + commands: + + location: SourceLocation(pos=59, lineno=5, colno=9) + end_location: SourceLocation(pos=64, lineno=5, colno=14) + identifier: 'break' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_138__1.txt b/packages/bolt/tests/snapshots/bolt__parse_138__1.txt new file mode 100644 index 000000000..c91df75e6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_138__1.txt @@ -0,0 +1,26 @@ +_mecha_lineno = [1], [1] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = True + while _mecha_var0: + _mecha_var1 = 'hello' + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + pass + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + break +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_139__0.txt b/packages/bolt/tests/snapshots/bolt__parse_139__0.txt new file mode 100644 index 000000000..01fead4fb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_139__0.txt @@ -0,0 +1,218 @@ +for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): + append function node.parent: + if node.partition(5): + if score @s thingy matches node.range function node.children + else: + if score @s thingy matches node.range say node.value +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=282, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'node' + rebind: False + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=65, lineno=1, colno=66) + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'generate_tree' + arguments: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=64, lineno=1, colno=65) + value: 'abcdefghijklmnopqrstuvwxyz0123456789' + + location: SourceLocation(pos=71, lineno=2, colno=5) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + commands: + + location: SourceLocation(pos=71, lineno=2, colno=5) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'append:function:name:commands' + arguments: + + location: SourceLocation(pos=87, lineno=2, colno=21) + end_location: SourceLocation(pos=98, lineno=2, colno=32) + prefix: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=87, lineno=2, colno=21) + end_location: SourceLocation(pos=98, lineno=2, colno=32) + name: 'parent' + value: + + location: SourceLocation(pos=87, lineno=2, colno=21) + end_location: SourceLocation(pos=91, lineno=2, colno=25) + value: 'node' + + location: SourceLocation(pos=108, lineno=3, colno=9) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + commands: + + location: SourceLocation(pos=108, lineno=3, colno=9) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=111, lineno=3, colno=12) + end_location: SourceLocation(pos=128, lineno=3, colno=29) + value: + + location: SourceLocation(pos=111, lineno=3, colno=12) + end_location: SourceLocation(pos=125, lineno=3, colno=26) + name: 'partition' + value: + + location: SourceLocation(pos=111, lineno=3, colno=12) + end_location: SourceLocation(pos=115, lineno=3, colno=16) + value: 'node' + arguments: + + location: SourceLocation(pos=126, lineno=3, colno=27) + end_location: SourceLocation(pos=127, lineno=3, colno=28) + value: 5 + + location: SourceLocation(pos=142, lineno=4, colno=13) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + commands: + + location: SourceLocation(pos=142, lineno=4, colno=13) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=142, lineno=4, colno=13) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=151, lineno=4, colno=22) + end_location: SourceLocation(pos=153, lineno=4, colno=24) + variable: 's' + arguments: + + + location: SourceLocation(pos=154, lineno=4, colno=25) + end_location: SourceLocation(pos=160, lineno=4, colno=31) + value: 'thingy' + + location: SourceLocation(pos=169, lineno=4, colno=40) + end_location: SourceLocation(pos=179, lineno=4, colno=50) + prefix: None + converter: 'range' + value: + + location: SourceLocation(pos=169, lineno=4, colno=40) + end_location: SourceLocation(pos=179, lineno=4, colno=50) + name: 'range' + value: + + location: SourceLocation(pos=169, lineno=4, colno=40) + end_location: SourceLocation(pos=173, lineno=4, colno=44) + value: 'node' + + location: SourceLocation(pos=180, lineno=4, colno=51) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=180, lineno=4, colno=51) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=189, lineno=4, colno=60) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + prefix: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=189, lineno=4, colno=60) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + name: 'children' + value: + + location: SourceLocation(pos=189, lineno=4, colno=60) + end_location: SourceLocation(pos=193, lineno=4, colno=64) + value: 'node' + + location: SourceLocation(pos=211, lineno=5, colno=9) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=229, lineno=6, colno=13) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + commands: + + location: SourceLocation(pos=229, lineno=6, colno=13) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=229, lineno=6, colno=13) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=238, lineno=6, colno=22) + end_location: SourceLocation(pos=240, lineno=6, colno=24) + variable: 's' + arguments: + + + location: SourceLocation(pos=241, lineno=6, colno=25) + end_location: SourceLocation(pos=247, lineno=6, colno=31) + value: 'thingy' + + location: SourceLocation(pos=256, lineno=6, colno=40) + end_location: SourceLocation(pos=266, lineno=6, colno=50) + prefix: None + converter: 'range' + value: + + location: SourceLocation(pos=256, lineno=6, colno=40) + end_location: SourceLocation(pos=266, lineno=6, colno=50) + name: 'range' + value: + + location: SourceLocation(pos=256, lineno=6, colno=40) + end_location: SourceLocation(pos=260, lineno=6, colno=44) + value: 'node' + + location: SourceLocation(pos=267, lineno=6, colno=51) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=267, lineno=6, colno=51) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=271, lineno=6, colno=55) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=271, lineno=6, colno=55) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + name: 'value' + value: + + location: SourceLocation(pos=271, lineno=6, colno=55) + end_location: SourceLocation(pos=275, lineno=6, colno=59) + value: 'node' diff --git a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt new file mode 100644 index 000000000..d3c6b3a25 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt @@ -0,0 +1,193 @@ +_mecha_lineno = [1, 15, 19, 25, 35], [1, 2, 3, 4, 6] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +with _mecha_runtime.scope() as _mecha_var10: + _mecha_var0 = generate_tree + _mecha_var1 = 'abcdefghijklmnopqrstuvwxyz0123456789' + _mecha_var0 = _mecha_var0(_mecha_var1) + for node in _mecha_var0: + _mecha_var2 = node + _mecha_var2 = _mecha_helper_get_attribute(_mecha_var2, 'parent') + _mecha_var2 = _mecha_helper_interpolate_resource_location(_mecha_var2, _mecha_refs[0]) + with _mecha_runtime.scope() as _mecha_var9: + _mecha_var3 = node + _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'partition') + _mecha_var4 = 5 + _mecha_var3 = _mecha_var3(_mecha_var4) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_var5 = node + _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'range') + _mecha_var5 = _mecha_helper_interpolate_range(_mecha_var5, _mecha_refs[1]) + _mecha_var6 = node + _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'children') + _mecha_var6 = _mecha_helper_interpolate_resource_location(_mecha_var6, _mecha_refs[4]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[2], _mecha_refs[3], _mecha_var5, _mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var6]))]))]))]))) + _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) + with _mecha_helper_branch(_mecha_var3) as _mecha_condition: + if _mecha_condition: + _mecha_var7 = node + _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'range') + _mecha_var7 = _mecha_helper_interpolate_range(_mecha_var7, _mecha_refs[9]) + _mecha_var8 = node + _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'value') + _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[12]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[15], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_var7, _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[13], arguments=_mecha_helper_children([_mecha_var8]))]))]))]))) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[18], arguments=_mecha_helper_children([_mecha_var2, _mecha_helper_replace(_mecha_refs[17], commands=_mecha_helper_children(_mecha_var9))]))) +_mecha_var11 = _mecha_helper_replace(_mecha_refs[19], commands=_mecha_helper_children(_mecha_var10)) +--- +output = _mecha_var11 +--- +_mecha_refs[0] + + location: SourceLocation(pos=87, lineno=2, colno=21) + end_location: SourceLocation(pos=98, lineno=2, colno=32) + prefix: None + converter: 'resource_location' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=169, lineno=4, colno=40) + end_location: SourceLocation(pos=179, lineno=4, colno=50) + prefix: None + converter: 'range' + value: + +_mecha_refs[2] + + location: SourceLocation(pos=151, lineno=4, colno=22) + end_location: SourceLocation(pos=153, lineno=4, colno=24) + variable: 's' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=154, lineno=4, colno=25) + end_location: SourceLocation(pos=160, lineno=4, colno=31) + value: 'thingy' +_mecha_refs[4] + + location: SourceLocation(pos=189, lineno=4, colno=60) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + prefix: None + converter: 'resource_location' + value: + +_mecha_refs[5] + + location: SourceLocation(pos=180, lineno=4, colno=51) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'function:name' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=180, lineno=4, colno=51) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[7] + + location: SourceLocation(pos=142, lineno=4, colno=13) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[8] + + location: SourceLocation(pos=142, lineno=4, colno=13) + end_location: SourceLocation(pos=202, lineno=4, colno=73) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[9] + + location: SourceLocation(pos=256, lineno=6, colno=40) + end_location: SourceLocation(pos=266, lineno=6, colno=50) + prefix: None + converter: 'range' + value: + +_mecha_refs[10] + + location: SourceLocation(pos=238, lineno=6, colno=22) + end_location: SourceLocation(pos=240, lineno=6, colno=24) + variable: 's' + arguments: + +_mecha_refs[11] + + location: SourceLocation(pos=241, lineno=6, colno=25) + end_location: SourceLocation(pos=247, lineno=6, colno=31) + value: 'thingy' +_mecha_refs[12] + + location: SourceLocation(pos=271, lineno=6, colno=55) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + prefix: None + converter: 'message' + value: + +_mecha_refs[13] + + location: SourceLocation(pos=267, lineno=6, colno=51) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'say:message' + arguments: + +_mecha_refs[14] + + location: SourceLocation(pos=267, lineno=6, colno=51) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[15] + + location: SourceLocation(pos=229, lineno=6, colno=13) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[16] + + location: SourceLocation(pos=229, lineno=6, colno=13) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[17] + + location: SourceLocation(pos=108, lineno=3, colno=9) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + commands: + + +_mecha_refs[18] + + location: SourceLocation(pos=71, lineno=2, colno=5) + end_location: SourceLocation(pos=281, lineno=6, colno=65) + identifier: 'append:function:name:commands' + arguments: + + +_mecha_refs[19] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=282, lineno=7, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_13__0.txt b/packages/bolt/tests/snapshots/bolt__parse_13__0.txt new file mode 100644 index 000000000..210dd3027 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_13__0.txt @@ -0,0 +1,45 @@ +1 * 2 / 3 * 4 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '/' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 3 + right: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_13__1.txt b/packages/bolt/tests/snapshots/bolt__parse_13__1.txt new file mode 100644 index 000000000..f7a6a242b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_13__1.txt @@ -0,0 +1,21 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + _mecha_var1 = 2 + _mecha_var0 = _mecha_var0 * _mecha_var1 + _mecha_var2 = 3 + _mecha_var0 = _mecha_var0 / _mecha_var2 + _mecha_var3 = 4 + _mecha_var0 = _mecha_var0 * _mecha_var3 +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_140__0.txt b/packages/bolt/tests/snapshots/bolt__parse_140__0.txt new file mode 100644 index 000000000..63b67be2f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_140__0.txt @@ -0,0 +1,33 @@ +print(ctx.directory, __name__) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'print' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + name: 'directory' + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'ctx' + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + value: '__name__' diff --git a/packages/bolt/tests/snapshots/bolt__parse_140__1.txt b/packages/bolt/tests/snapshots/bolt__parse_140__1.txt new file mode 100644 index 000000000..c401e17d6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_140__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1], [1] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = print + _mecha_var1 = ctx + _mecha_var1 = _mecha_helper_get_attribute(_mecha_var1, 'directory') + _mecha_var2 = __name__ + _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_141__0.txt b/packages/bolt/tests/snapshots/bolt__parse_141__0.txt new file mode 100644 index 000000000..ee0a68a79 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_141__0.txt @@ -0,0 +1,71 @@ +a = 1 +setblock a 2 3 stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=20, lineno=2, colno=15) + x: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=11) + prefix: None + converter: 'coordinate' + value: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=11) + value: 'a' + y: + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=18, lineno=2, colno=13) + type: 'absolute' + value: 2 + z: + + location: SourceLocation(pos=19, lineno=2, colno=14) + end_location: SourceLocation(pos=20, lineno=2, colno=15) + type: 'absolute' + value: 3 + + location: SourceLocation(pos=21, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + identifier: + + location: SourceLocation(pos=21, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + is_tag: False + namespace: None + path: 'stone' + block_states: + + data_tags: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_141__1.txt b/packages/bolt/tests/snapshots/bolt__parse_141__1.txt new file mode 100644 index 000000000..3117857c6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_141__1.txt @@ -0,0 +1,56 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + a = _mecha_var0 + _mecha_var1 = a + _mecha_var1 = _mecha_helper_interpolate_coordinate(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], x=_mecha_var1), _mecha_refs[2]]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=11) + prefix: None + converter: 'coordinate' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=20, lineno=2, colno=15) + x: + + y: + + z: + +_mecha_refs[2] + + location: SourceLocation(pos=21, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + identifier: + + block_states: + + data_tags: None +_mecha_refs[3] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + identifier: 'setblock:pos:block' + arguments: + + +_mecha_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_142__0.txt b/packages/bolt/tests/snapshots/bolt__parse_142__0.txt new file mode 100644 index 000000000..3bd7d90fb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_142__0.txt @@ -0,0 +1,55 @@ +a = "1 2 3" +setblock a stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: '1 2 3' + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=11) + prefix: None + converter: 'vec3' + value: + + location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=11) + value: 'a' + + location: SourceLocation(pos=23, lineno=2, colno=12) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + identifier: + + location: SourceLocation(pos=23, lineno=2, colno=12) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + is_tag: False + namespace: None + path: 'stone' + block_states: + + data_tags: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_142__1.txt b/packages/bolt/tests/snapshots/bolt__parse_142__1.txt new file mode 100644 index 000000000..4c11e14c5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_142__1.txt @@ -0,0 +1,46 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_vec3 = _mecha_runtime.helpers['interpolate_vec3'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = '1 2 3' + a = _mecha_var0 + _mecha_var1 = a + _mecha_var1 = _mecha_helper_interpolate_vec3(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var1, _mecha_refs[1]]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=21, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=11) + prefix: None + converter: 'vec3' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=23, lineno=2, colno=12) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + identifier: + + block_states: + + data_tags: None +_mecha_refs[2] + + location: SourceLocation(pos=12, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + identifier: 'setblock:pos:block' + arguments: + + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=17) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__0.txt b/packages/bolt/tests/snapshots/bolt__parse_143__0.txt new file mode 100644 index 000000000..a2c6702fc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_143__0.txt @@ -0,0 +1,99 @@ +a = 1 +if block ^ f"^{a}" ^ #planks say 42 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + x: + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=11) + type: 'local' + value: 0 + y: + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=24, lineno=2, colno=19) + prefix: None + converter: 'coordinate' + value: + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=24, lineno=2, colno=19) + fmt: '^{}' + values: + + location: SourceLocation(pos=21, lineno=2, colno=16) + end_location: SourceLocation(pos=22, lineno=2, colno=17) + value: 'a' + z: + + location: SourceLocation(pos=25, lineno=2, colno=20) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + type: 'local' + value: 0 + + location: SourceLocation(pos=27, lineno=2, colno=22) + end_location: SourceLocation(pos=34, lineno=2, colno=29) + identifier: + + location: SourceLocation(pos=27, lineno=2, colno=22) + end_location: SourceLocation(pos=34, lineno=2, colno=29) + is_tag: True + namespace: None + path: 'planks' + block_states: + + data_tags: None + + location: SourceLocation(pos=35, lineno=2, colno=30) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=35, lineno=2, colno=30) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=39, lineno=2, colno=34) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + fragments: + + location: SourceLocation(pos=39, lineno=2, colno=34) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + value: '42' diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt new file mode 100644 index 000000000..1e2f8f30d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt @@ -0,0 +1,72 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + a = _mecha_var0 + _mecha_var1 = a + _mecha_var2 = '^{}'.format(_mecha_var1) + _mecha_var2 = _mecha_helper_interpolate_coordinate(_mecha_var2, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], y=_mecha_var2), _mecha_refs[2], _mecha_refs[3]]))]))) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=24, lineno=2, colno=19) + prefix: None + converter: 'coordinate' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=15, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + x: + + y: + + z: + +_mecha_refs[2] + + location: SourceLocation(pos=27, lineno=2, colno=22) + end_location: SourceLocation(pos=34, lineno=2, colno=29) + identifier: + + block_states: + + data_tags: None +_mecha_refs[3] + + location: SourceLocation(pos=35, lineno=2, colno=30) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + + +_mecha_refs[5] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_144__0.txt b/packages/bolt/tests/snapshots/bolt__parse_144__0.txt new file mode 100644 index 000000000..2eb4bbcdb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_144__0.txt @@ -0,0 +1,69 @@ +if block ("~", "~", "~") #planks say 42 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + prefix: None + converter: 'vec3' + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + items: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: '~' + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: '~' + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: '~' + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + identifier: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + is_tag: True + namespace: None + path: 'planks' + block_states: + + data_tags: None + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + fragments: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: '42' diff --git a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt new file mode 100644 index 000000000..fcc470aa6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt @@ -0,0 +1,61 @@ +_mecha_lineno = [1], [1] +_mecha_helper_interpolate_vec3 = _mecha_runtime.helpers['interpolate_vec3'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = '~' + _mecha_var1 = '~' + _mecha_var2 = '~' + _mecha_var3 = (_mecha_var0,_mecha_var1,_mecha_var2,) + _mecha_var3 = _mecha_helper_interpolate_vec3(_mecha_var3, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var3, _mecha_refs[1], _mecha_refs[2]]))]))) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + prefix: None + converter: 'vec3' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + identifier: + + block_states: + + data_tags: None +_mecha_refs[2] + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + + +_mecha_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_145__0.txt b/packages/bolt/tests/snapshots/bolt__parse_145__0.txt new file mode 100644 index 000000000..5701a92ad --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_145__0.txt @@ -0,0 +1,38 @@ +a = [][] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + items: + + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + start: None + stop: None + step: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_145__1.txt b/packages/bolt/tests/snapshots/bolt__parse_145__1.txt new file mode 100644 index 000000000..557eac19d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_145__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = [] + _mecha_var0 = _mecha_var0[:] + a = _mecha_var0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_146__0.txt b/packages/bolt/tests/snapshots/bolt__parse_146__0.txt new file mode 100644 index 000000000..ba0d8395f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_146__0.txt @@ -0,0 +1,8 @@ +def f(): + pass +#>ERROR Positional argument not allowed after keyword arguments. +# line 3, column 18 +# 2 | pass +# 3 | f(1, 2, thing=3, 4) +# : ^ +f(1, 2, thing=3, 4) diff --git a/packages/bolt/tests/snapshots/bolt__parse_147__0.txt b/packages/bolt/tests/snapshots/bolt__parse_147__0.txt new file mode 100644 index 000000000..1318f25d6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_147__0.txt @@ -0,0 +1,8 @@ +def f(): + pass +#>ERROR Positional argument not allowed after keyword arguments. +# line 3, column 25 +# 2 | pass +# 3 | f(1, 2, **{"thing": 3}, 4) +# : ^ +f(1, 2, **{"thing": 3}, 4) diff --git a/packages/bolt/tests/snapshots/bolt__parse_148__0.txt b/packages/bolt/tests/snapshots/bolt__parse_148__0.txt new file mode 100644 index 000000000..7773bcb10 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_148__0.txt @@ -0,0 +1,8 @@ +def f(): + pass +#>ERROR List unpacking not allowed after keyword arguments. +# line 3, column 18 +# 2 | pass +# 3 | f(1, 2, thing=3, *[4]) +# : ^^^^ +f(1, 2, thing=3, *[4]) diff --git a/packages/bolt/tests/snapshots/bolt__parse_149__0.txt b/packages/bolt/tests/snapshots/bolt__parse_149__0.txt new file mode 100644 index 000000000..c92c0885d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_149__0.txt @@ -0,0 +1,8 @@ +def f(): + pass +#>ERROR List unpacking not allowed after keyword arguments. +# line 3, column 25 +# 2 | pass +# 3 | f(1, 2, **{"thing": 3}, *[4]) +# : ^^^^ +f(1, 2, **{"thing": 3}, *[4]) diff --git a/packages/bolt/tests/snapshots/bolt__parse_14__0.txt b/packages/bolt/tests/snapshots/bolt__parse_14__0.txt new file mode 100644 index 000000000..9fc0e8e62 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_14__0.txt @@ -0,0 +1,45 @@ +1 * 2 / (3 * 4) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '/' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '*' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '*' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 3 + right: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_14__1.txt b/packages/bolt/tests/snapshots/bolt__parse_14__1.txt new file mode 100644 index 000000000..021b75428 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_14__1.txt @@ -0,0 +1,21 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + _mecha_var1 = 2 + _mecha_var0 = _mecha_var0 * _mecha_var1 + _mecha_var2 = 3 + _mecha_var3 = 4 + _mecha_var2 = _mecha_var2 * _mecha_var3 + _mecha_var0 = _mecha_var0 / _mecha_var2 +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_150__0.txt b/packages/bolt/tests/snapshots/bolt__parse_150__0.txt new file mode 100644 index 000000000..e5f66ca23 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_150__0.txt @@ -0,0 +1,60 @@ +def f(): + pass +f(1, 2, thing=3) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=34, lineno=3, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=34, lineno=3, colno=17) + value: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=3) + end_location: SourceLocation(pos=21, lineno=3, colno=4) + value: 1 + + location: SourceLocation(pos=23, lineno=3, colno=6) + end_location: SourceLocation(pos=24, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=26, lineno=3, colno=9) + end_location: SourceLocation(pos=33, lineno=3, colno=16) + name: 'thing' + value: + + location: SourceLocation(pos=32, lineno=3, colno=15) + end_location: SourceLocation(pos=33, lineno=3, colno=16) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_150__1.txt b/packages/bolt/tests/snapshots/bolt__parse_150__1.txt new file mode 100644 index 000000000..8b48fe72c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_150__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1, 7], [1, 3] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + def f(): + pass + _mecha_var0 = f + _mecha_var1 = 1 + _mecha_var2 = 2 + _mecha_var3 = 3 + _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, thing=_mecha_var3) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_151__0.txt b/packages/bolt/tests/snapshots/bolt__parse_151__0.txt new file mode 100644 index 000000000..1861c7666 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_151__0.txt @@ -0,0 +1,73 @@ +def f(): + pass +f(1, 2, **{"thing": 3}) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=41, lineno=3, colno=24) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=41, lineno=3, colno=24) + value: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=3) + end_location: SourceLocation(pos=21, lineno=3, colno=4) + value: 1 + + location: SourceLocation(pos=23, lineno=3, colno=6) + end_location: SourceLocation(pos=24, lineno=3, colno=7) + value: 2 + + location: SourceLocation(pos=26, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=23) + type: 'dict' + value: + + location: SourceLocation(pos=28, lineno=3, colno=11) + end_location: SourceLocation(pos=40, lineno=3, colno=23) + items: + + location: SourceLocation(pos=29, lineno=3, colno=12) + end_location: SourceLocation(pos=39, lineno=3, colno=22) + key: + + location: SourceLocation(pos=29, lineno=3, colno=12) + end_location: SourceLocation(pos=36, lineno=3, colno=19) + value: 'thing' + value: + + location: SourceLocation(pos=38, lineno=3, colno=21) + end_location: SourceLocation(pos=39, lineno=3, colno=22) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_151__1.txt b/packages/bolt/tests/snapshots/bolt__parse_151__1.txt new file mode 100644 index 000000000..d1a201631 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_151__1.txt @@ -0,0 +1,24 @@ +_mecha_lineno = [1, 7], [1, 3] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var6: + def f(): + pass + _mecha_var0 = f + _mecha_var1 = 1 + _mecha_var2 = 2 + _mecha_var3 = 'thing' + _mecha_var4 = 3 + _mecha_var5 = {_mecha_var3: _mecha_var4} + _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, **_mecha_var5) +_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) +--- +output = _mecha_var7 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_152__0.txt b/packages/bolt/tests/snapshots/bolt__parse_152__0.txt new file mode 100644 index 000000000..eb6c5d90a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_152__0.txt @@ -0,0 +1,73 @@ +def f(): + pass +f(1, *[4], 2, thing=3) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=40, lineno=3, colno=23) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=40, lineno=3, colno=23) + value: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=3) + end_location: SourceLocation(pos=21, lineno=3, colno=4) + value: 1 + + location: SourceLocation(pos=23, lineno=3, colno=6) + end_location: SourceLocation(pos=27, lineno=3, colno=10) + type: 'list' + value: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=27, lineno=3, colno=10) + items: + + location: SourceLocation(pos=25, lineno=3, colno=8) + end_location: SourceLocation(pos=26, lineno=3, colno=9) + value: 4 + + location: SourceLocation(pos=29, lineno=3, colno=12) + end_location: SourceLocation(pos=30, lineno=3, colno=13) + value: 2 + + location: SourceLocation(pos=32, lineno=3, colno=15) + end_location: SourceLocation(pos=39, lineno=3, colno=22) + name: 'thing' + value: + + location: SourceLocation(pos=38, lineno=3, colno=21) + end_location: SourceLocation(pos=39, lineno=3, colno=22) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_152__1.txt b/packages/bolt/tests/snapshots/bolt__parse_152__1.txt new file mode 100644 index 000000000..2b1e101d1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_152__1.txt @@ -0,0 +1,24 @@ +_mecha_lineno = [1, 7], [1, 3] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var6: + def f(): + pass + _mecha_var0 = f + _mecha_var1 = 1 + _mecha_var2 = 4 + _mecha_var3 = [_mecha_var2] + _mecha_var4 = 2 + _mecha_var5 = 3 + _mecha_var0 = _mecha_var0(_mecha_var1, *_mecha_var3, _mecha_var4, thing=_mecha_var5) +_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) +--- +output = _mecha_var7 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_153__0.txt b/packages/bolt/tests/snapshots/bolt__parse_153__0.txt new file mode 100644 index 000000000..9a4a9620f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_153__0.txt @@ -0,0 +1,86 @@ +def f(): + pass +f(1, *[4], 2, **{"thing": 3}) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=48, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=47, lineno=3, colno=30) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=47, lineno=3, colno=30) + value: + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=3) + end_location: SourceLocation(pos=21, lineno=3, colno=4) + value: 1 + + location: SourceLocation(pos=23, lineno=3, colno=6) + end_location: SourceLocation(pos=27, lineno=3, colno=10) + type: 'list' + value: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=27, lineno=3, colno=10) + items: + + location: SourceLocation(pos=25, lineno=3, colno=8) + end_location: SourceLocation(pos=26, lineno=3, colno=9) + value: 4 + + location: SourceLocation(pos=29, lineno=3, colno=12) + end_location: SourceLocation(pos=30, lineno=3, colno=13) + value: 2 + + location: SourceLocation(pos=32, lineno=3, colno=15) + end_location: SourceLocation(pos=46, lineno=3, colno=29) + type: 'dict' + value: + + location: SourceLocation(pos=34, lineno=3, colno=17) + end_location: SourceLocation(pos=46, lineno=3, colno=29) + items: + + location: SourceLocation(pos=35, lineno=3, colno=18) + end_location: SourceLocation(pos=45, lineno=3, colno=28) + key: + + location: SourceLocation(pos=35, lineno=3, colno=18) + end_location: SourceLocation(pos=42, lineno=3, colno=25) + value: 'thing' + value: + + location: SourceLocation(pos=44, lineno=3, colno=27) + end_location: SourceLocation(pos=45, lineno=3, colno=28) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_153__1.txt b/packages/bolt/tests/snapshots/bolt__parse_153__1.txt new file mode 100644 index 000000000..1ebbd0fb6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_153__1.txt @@ -0,0 +1,26 @@ +_mecha_lineno = [1, 7], [1, 3] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var8: + def f(): + pass + _mecha_var0 = f + _mecha_var1 = 1 + _mecha_var2 = 4 + _mecha_var3 = [_mecha_var2] + _mecha_var4 = 2 + _mecha_var5 = 'thing' + _mecha_var6 = 3 + _mecha_var7 = {_mecha_var5: _mecha_var6} + _mecha_var0 = _mecha_var0(_mecha_var1, *_mecha_var3, _mecha_var4, **_mecha_var7) +_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) +--- +output = _mecha_var9 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=48, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_154__0.txt b/packages/bolt/tests/snapshots/bolt__parse_154__0.txt new file mode 100644 index 000000000..34e8428cf --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_154__0.txt @@ -0,0 +1,24 @@ +[*"abc"] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + items: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + type: 'list' + value: + + location: SourceLocation(pos=2, lineno=1, colno=3) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'abc' diff --git a/packages/bolt/tests/snapshots/bolt__parse_154__1.txt b/packages/bolt/tests/snapshots/bolt__parse_154__1.txt new file mode 100644 index 000000000..7970ac5c7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_154__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'abc' + _mecha_var1 = [*_mecha_var0] +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_155__0.txt b/packages/bolt/tests/snapshots/bolt__parse_155__0.txt new file mode 100644 index 000000000..6c81ec838 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_155__0.txt @@ -0,0 +1,5 @@ +#>ERROR Dict unpacking not allowed. +# line 1, column 2 +# 1 | [**"abc"] +# : ^^^^^^^ +[**"abc"] diff --git a/packages/bolt/tests/snapshots/bolt__parse_156__0.txt b/packages/bolt/tests/snapshots/bolt__parse_156__0.txt new file mode 100644 index 000000000..d1d27d2c2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_156__0.txt @@ -0,0 +1,37 @@ +{**{1: 1}} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + items: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + type: 'dict' + value: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + items: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + key: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_156__1.txt b/packages/bolt/tests/snapshots/bolt__parse_156__1.txt new file mode 100644 index 000000000..db993d543 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_156__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + _mecha_var1 = 1 + _mecha_var2 = {_mecha_var0: _mecha_var1} + _mecha_var3 = {**_mecha_var2} +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_157__0.txt b/packages/bolt/tests/snapshots/bolt__parse_157__0.txt new file mode 100644 index 000000000..427d92275 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_157__0.txt @@ -0,0 +1,5 @@ +#>ERROR List unpacking not allowed. +# line 1, column 2 +# 1 | {*{1: 1}} +# : ^^^^^^^ +{*{1: 1}} diff --git a/packages/bolt/tests/snapshots/bolt__parse_158__0.txt b/packages/bolt/tests/snapshots/bolt__parse_158__0.txt new file mode 100644 index 000000000..401fcb9da --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_158__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 +# 1 | foo.bar = 1 +# : ^^^ +# Notes: +# - Expected assignment but got literal '.bar'. +foo.bar = 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_159__0.txt b/packages/bolt/tests/snapshots/bolt__parse_159__0.txt new file mode 100644 index 000000000..2335ef90f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_159__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 +# 1 | foo().bar = 1 +# : ^^^ +# Notes: +# - Expected assignment but got literal '().bar'. +foo().bar = 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_15__0.txt b/packages/bolt/tests/snapshots/bolt__parse_15__0.txt new file mode 100644 index 000000000..bab30a318 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_15__0.txt @@ -0,0 +1,35 @@ +16 // 5 % 7 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '%' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '//' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 16 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 5 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 7 diff --git a/packages/bolt/tests/snapshots/bolt__parse_15__1.txt b/packages/bolt/tests/snapshots/bolt__parse_15__1.txt new file mode 100644 index 000000000..93ed1347a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_15__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 16 + _mecha_var1 = 5 + _mecha_var0 = _mecha_var0 // _mecha_var1 + _mecha_var2 = 7 + _mecha_var0 = _mecha_var0 % _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_160__0.txt b/packages/bolt/tests/snapshots/bolt__parse_160__0.txt new file mode 100644 index 000000000..9bc5dac93 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_160__0.txt @@ -0,0 +1,47 @@ +def f(): + f.data = {} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + operator: '=' + target: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=11) + name: 'data' + value: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=6) + value: 'f' + value: + + location: SourceLocation(pos=22, lineno=2, colno=14) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + items: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_160__1.txt b/packages/bolt/tests/snapshots/bolt__parse_160__1.txt new file mode 100644 index 000000000..dc1bc0ceb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_160__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1, 6], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + def f(): + _mecha_var0 = {} + _mecha_var1 = f + _mecha_var1.data = _mecha_var0 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_161__0.txt b/packages/bolt/tests/snapshots/bolt__parse_161__0.txt new file mode 100644 index 000000000..923e28da7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_161__0.txt @@ -0,0 +1,95 @@ +d = {} +d[1] = {} +d[1][2] = "foo" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'd' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + items: + + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=5) + value: + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=2) + value: 'd' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=3) + end_location: SourceLocation(pos=10, lineno=2, colno=4) + value: 1 + value: + + location: SourceLocation(pos=14, lineno=2, colno=8) + end_location: SourceLocation(pos=16, lineno=2, colno=10) + items: + + + location: SourceLocation(pos=17, lineno=3, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=16) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=17, lineno=3, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=16) + operator: '=' + target: + + location: SourceLocation(pos=17, lineno=3, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=8) + value: + + location: SourceLocation(pos=17, lineno=3, colno=1) + end_location: SourceLocation(pos=21, lineno=3, colno=5) + value: + + location: SourceLocation(pos=17, lineno=3, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + value: 'd' + arguments: + + location: SourceLocation(pos=19, lineno=3, colno=3) + end_location: SourceLocation(pos=20, lineno=3, colno=4) + value: 1 + arguments: + + location: SourceLocation(pos=22, lineno=3, colno=6) + end_location: SourceLocation(pos=23, lineno=3, colno=7) + value: 2 + value: + + location: SourceLocation(pos=27, lineno=3, colno=11) + end_location: SourceLocation(pos=32, lineno=3, colno=16) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_161__1.txt b/packages/bolt/tests/snapshots/bolt__parse_161__1.txt new file mode 100644 index 000000000..d23ae66aa --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_161__1.txt @@ -0,0 +1,28 @@ +_mecha_lineno = [1, 7, 12], [1, 2, 3] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var8: + _mecha_var0 = {} + d = _mecha_var0 + _mecha_var1 = {} + _mecha_var2 = d + _mecha_var3 = 1 + _mecha_var2[_mecha_var3] = _mecha_var1 + _mecha_var4 = 'foo' + _mecha_var5 = d + _mecha_var6 = 1 + _mecha_var5 = _mecha_var5[_mecha_var6] + _mecha_var7 = 2 + _mecha_var5[_mecha_var7] = _mecha_var4 +_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) +--- +output = _mecha_var9 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=4, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_162__0.txt b/packages/bolt/tests/snapshots/bolt__parse_162__0.txt new file mode 100644 index 000000000..3a30cf646 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_162__0.txt @@ -0,0 +1,64 @@ +d = {foo: 1} +d.foo += 1 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'd' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + items: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + key: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'foo' + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 1 + + location: SourceLocation(pos=13, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + operator: '+=' + target: + + location: SourceLocation(pos=13, lineno=2, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=6) + name: 'foo' + value: + + location: SourceLocation(pos=13, lineno=2, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=2) + value: 'd' + value: + + location: SourceLocation(pos=22, lineno=2, colno=10) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_162__1.txt b/packages/bolt/tests/snapshots/bolt__parse_162__1.txt new file mode 100644 index 000000000..227aa1ac1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_162__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1, 10], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = 'foo' + _mecha_var1 = 1 + _mecha_var2 = {_mecha_var0: _mecha_var1} + d = _mecha_var2 + _mecha_var3 = 1 + _mecha_var4 = d + _mecha_var4.foo += _mecha_var3 +_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_163__0.txt b/packages/bolt/tests/snapshots/bolt__parse_163__0.txt new file mode 100644 index 000000000..510c7204b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_163__0.txt @@ -0,0 +1,19 @@ +scoreboard objectives setdisplay list some_score_name +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + identifier: 'scoreboard:objectives:setdisplay:slot:objective' + arguments: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + value: 'list' + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + value: 'some_score_name' diff --git a/packages/bolt/tests/snapshots/bolt__parse_163__1.txt b/packages/bolt/tests/snapshots/bolt__parse_163__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_163__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_164__0.txt b/packages/bolt/tests/snapshots/bolt__parse_164__0.txt new file mode 100644 index 000000000..564e13405 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_164__0.txt @@ -0,0 +1,51 @@ +color = "red" +scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=87, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'color' + rebind: False + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'red' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=86, lineno=2, colno=73) + identifier: 'scoreboard:objectives:setdisplay:slot:objective' + arguments: + + location: SourceLocation(pos=47, lineno=2, colno=34) + end_location: SourceLocation(pos=70, lineno=2, colno=57) + prefix: None + converter: 'scoreboard_slot' + value: + + location: SourceLocation(pos=47, lineno=2, colno=34) + end_location: SourceLocation(pos=70, lineno=2, colno=57) + fmt: 'sidebar.team.{}' + values: + + location: SourceLocation(pos=63, lineno=2, colno=50) + end_location: SourceLocation(pos=68, lineno=2, colno=55) + value: 'color' + + location: SourceLocation(pos=71, lineno=2, colno=58) + end_location: SourceLocation(pos=86, lineno=2, colno=73) + value: 'some_score_name' diff --git a/packages/bolt/tests/snapshots/bolt__parse_164__1.txt b/packages/bolt/tests/snapshots/bolt__parse_164__1.txt new file mode 100644 index 000000000..1c16f6849 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_164__1.txt @@ -0,0 +1,43 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_scoreboard_slot = _mecha_runtime.helpers['interpolate_scoreboard_slot'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 'red' + color = _mecha_var0 + _mecha_var1 = color + _mecha_var2 = 'sidebar.team.{}'.format(_mecha_var1) + _mecha_var2 = _mecha_helper_interpolate_scoreboard_slot(_mecha_var2, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var2, _mecha_refs[1]]))) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=47, lineno=2, colno=34) + end_location: SourceLocation(pos=70, lineno=2, colno=57) + prefix: None + converter: 'scoreboard_slot' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=71, lineno=2, colno=58) + end_location: SourceLocation(pos=86, lineno=2, colno=73) + value: 'some_score_name' +_mecha_refs[2] + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=86, lineno=2, colno=73) + identifier: 'scoreboard:objectives:setdisplay:slot:objective' + arguments: + + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=87, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_165__0.txt b/packages/bolt/tests/snapshots/bolt__parse_165__0.txt new file mode 100644 index 000000000..49b1d58a3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_165__0.txt @@ -0,0 +1,46 @@ +my_team = "sidebar.team.red" +scoreboard objectives setdisplay my_team some_score_name +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=86, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'my_team' + rebind: False + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: 'sidebar.team.red' + + location: SourceLocation(pos=29, lineno=2, colno=1) + end_location: SourceLocation(pos=85, lineno=2, colno=57) + identifier: 'scoreboard:objectives:setdisplay:slot:objective' + arguments: + + location: SourceLocation(pos=62, lineno=2, colno=34) + end_location: SourceLocation(pos=69, lineno=2, colno=41) + prefix: None + converter: 'scoreboard_slot' + value: + + location: SourceLocation(pos=62, lineno=2, colno=34) + end_location: SourceLocation(pos=69, lineno=2, colno=41) + value: 'my_team' + + location: SourceLocation(pos=70, lineno=2, colno=42) + end_location: SourceLocation(pos=85, lineno=2, colno=57) + value: 'some_score_name' diff --git a/packages/bolt/tests/snapshots/bolt__parse_165__1.txt b/packages/bolt/tests/snapshots/bolt__parse_165__1.txt new file mode 100644 index 000000000..3ad2e911b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_165__1.txt @@ -0,0 +1,42 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_scoreboard_slot = _mecha_runtime.helpers['interpolate_scoreboard_slot'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'sidebar.team.red' + my_team = _mecha_var0 + _mecha_var1 = my_team + _mecha_var1 = _mecha_helper_interpolate_scoreboard_slot(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var1, _mecha_refs[1]]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=62, lineno=2, colno=34) + end_location: SourceLocation(pos=69, lineno=2, colno=41) + prefix: None + converter: 'scoreboard_slot' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=70, lineno=2, colno=42) + end_location: SourceLocation(pos=85, lineno=2, colno=57) + value: 'some_score_name' +_mecha_refs[2] + + location: SourceLocation(pos=29, lineno=2, colno=1) + end_location: SourceLocation(pos=85, lineno=2, colno=57) + identifier: 'scoreboard:objectives:setdisplay:slot:objective' + arguments: + + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=86, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_166__0.txt b/packages/bolt/tests/snapshots/bolt__parse_166__0.txt new file mode 100644 index 000000000..0278af8fe --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_166__0.txt @@ -0,0 +1,51 @@ +item replace block ~ ~2 ~ container.26 with minecraft:spruce_sapling 4 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=71, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=70, lineno=1, colno=71) + identifier: 'item:replace:block:pos:slot:with:item:count' + arguments: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + x: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + type: 'relative' + value: 2 + z: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + type: 'relative' + value: 0 + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'container.26' + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=68, lineno=1, colno=69) + identifier: + + location: SourceLocation(pos=44, lineno=1, colno=45) + end_location: SourceLocation(pos=68, lineno=1, colno=69) + is_tag: False + namespace: 'minecraft' + path: 'spruce_sapling' + data_tags: None + + location: SourceLocation(pos=69, lineno=1, colno=70) + end_location: SourceLocation(pos=70, lineno=1, colno=71) + value: 4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_166__1.txt b/packages/bolt/tests/snapshots/bolt__parse_166__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_166__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_167__0.txt b/packages/bolt/tests/snapshots/bolt__parse_167__0.txt new file mode 100644 index 000000000..3a47e4345 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_167__0.txt @@ -0,0 +1,52 @@ +weapon = "thing" +item replace entity @s weapon.offhand from entity @s weapon.mainhand +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=86, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'weapon' + rebind: False + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'thing' + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=85, lineno=2, colno=69) + identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' + arguments: + + location: SourceLocation(pos=37, lineno=2, colno=21) + end_location: SourceLocation(pos=39, lineno=2, colno=23) + variable: 's' + arguments: + + + location: SourceLocation(pos=40, lineno=2, colno=24) + end_location: SourceLocation(pos=54, lineno=2, colno=38) + value: 'weapon.offhand' + + location: SourceLocation(pos=67, lineno=2, colno=51) + end_location: SourceLocation(pos=69, lineno=2, colno=53) + variable: 's' + arguments: + + + location: SourceLocation(pos=70, lineno=2, colno=54) + end_location: SourceLocation(pos=85, lineno=2, colno=69) + value: 'weapon.mainhand' diff --git a/packages/bolt/tests/snapshots/bolt__parse_167__1.txt b/packages/bolt/tests/snapshots/bolt__parse_167__1.txt new file mode 100644 index 000000000..03b6eae7b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_167__1.txt @@ -0,0 +1,28 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'thing' + weapon = _mecha_var0 + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=17, lineno=2, colno=1) + end_location: SourceLocation(pos=85, lineno=2, colno=69) + identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' + arguments: + + + + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=86, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt new file mode 100644 index 000000000..d1a648113 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt @@ -0,0 +1,100 @@ +my_weapon = {offhand: "weapon.offhand", mainhand: "weapon.mainhand"} +item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=144, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=1, colno=69) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=1, colno=69) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'my_weapon' + rebind: False + value: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=68, lineno=1, colno=69) + items: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + key: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'offhand' + value: + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'weapon.offhand' + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + key: + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=48, lineno=1, colno=49) + value: 'mainhand' + value: + + location: SourceLocation(pos=50, lineno=1, colno=51) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + value: 'weapon.mainhand' + + location: SourceLocation(pos=69, lineno=2, colno=1) + end_location: SourceLocation(pos=143, lineno=2, colno=75) + identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' + arguments: + + location: SourceLocation(pos=89, lineno=2, colno=21) + end_location: SourceLocation(pos=91, lineno=2, colno=23) + variable: 's' + arguments: + + + location: SourceLocation(pos=92, lineno=2, colno=24) + end_location: SourceLocation(pos=109, lineno=2, colno=41) + prefix: None + converter: 'item_slot' + value: + + location: SourceLocation(pos=92, lineno=2, colno=24) + end_location: SourceLocation(pos=109, lineno=2, colno=41) + name: 'offhand' + value: + + location: SourceLocation(pos=92, lineno=2, colno=24) + end_location: SourceLocation(pos=101, lineno=2, colno=33) + value: 'my_weapon' + + location: SourceLocation(pos=122, lineno=2, colno=54) + end_location: SourceLocation(pos=124, lineno=2, colno=56) + variable: 's' + arguments: + + + location: SourceLocation(pos=125, lineno=2, colno=57) + end_location: SourceLocation(pos=143, lineno=2, colno=75) + prefix: None + converter: 'item_slot' + value: + + location: SourceLocation(pos=125, lineno=2, colno=57) + end_location: SourceLocation(pos=143, lineno=2, colno=75) + name: 'mainhand' + value: + + location: SourceLocation(pos=125, lineno=2, colno=57) + end_location: SourceLocation(pos=134, lineno=2, colno=66) + value: 'my_weapon' diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__1.txt b/packages/bolt/tests/snapshots/bolt__parse_168__1.txt new file mode 100644 index 000000000..25bf00a6e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_168__1.txt @@ -0,0 +1,70 @@ +_mecha_lineno = [1, 13], [1, 2] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_interpolate_item_slot = _mecha_runtime.helpers['interpolate_item_slot'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var7: + _mecha_var0 = 'offhand' + _mecha_var1 = 'weapon.offhand' + _mecha_var2 = 'mainhand' + _mecha_var3 = 'weapon.mainhand' + _mecha_var4 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3} + my_weapon = _mecha_var4 + _mecha_var5 = my_weapon + _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'offhand') + _mecha_var5 = _mecha_helper_interpolate_item_slot(_mecha_var5, _mecha_refs[0]) + _mecha_var6 = my_weapon + _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'mainhand') + _mecha_var6 = _mecha_helper_interpolate_item_slot(_mecha_var6, _mecha_refs[2]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var5, _mecha_refs[3], _mecha_var6]))) +_mecha_var8 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var7)) +--- +output = _mecha_var8 +--- +_mecha_refs[0] + + location: SourceLocation(pos=92, lineno=2, colno=24) + end_location: SourceLocation(pos=109, lineno=2, colno=41) + prefix: None + converter: 'item_slot' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=89, lineno=2, colno=21) + end_location: SourceLocation(pos=91, lineno=2, colno=23) + variable: 's' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=125, lineno=2, colno=57) + end_location: SourceLocation(pos=143, lineno=2, colno=75) + prefix: None + converter: 'item_slot' + value: + +_mecha_refs[3] + + location: SourceLocation(pos=122, lineno=2, colno=54) + end_location: SourceLocation(pos=124, lineno=2, colno=56) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=69, lineno=2, colno=1) + end_location: SourceLocation(pos=143, lineno=2, colno=75) + identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' + arguments: + + + + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=144, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_169__0.txt b/packages/bolt/tests/snapshots/bolt__parse_169__0.txt new file mode 100644 index 000000000..89cb1ca83 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_169__0.txt @@ -0,0 +1,75 @@ +numbers = list(range(12)) +say numbers[3:] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'numbers' + rebind: False + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'list' + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'range' + arguments: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 12 + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + value: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=2, colno=12) + value: 'numbers' + arguments: + + location: SourceLocation(pos=38, lineno=2, colno=13) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + start: + + location: SourceLocation(pos=38, lineno=2, colno=13) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + value: 3 + stop: None + step: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_169__1.txt b/packages/bolt/tests/snapshots/bolt__parse_169__1.txt new file mode 100644 index 000000000..f81c49576 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_169__1.txt @@ -0,0 +1,42 @@ +_mecha_lineno = [1, 12], [1, 2] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = list + _mecha_var1 = range + _mecha_var2 = 12 + _mecha_var1 = _mecha_var1(_mecha_var2) + _mecha_var0 = _mecha_var0(_mecha_var1) + numbers = _mecha_var0 + _mecha_var3 = numbers + _mecha_var4 = 3 + _mecha_var3 = _mecha_var3[_mecha_var4:] + _mecha_var3 = _mecha_helper_interpolate_message(_mecha_var3, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var3]))) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_16__0.txt b/packages/bolt/tests/snapshots/bolt__parse_16__0.txt new file mode 100644 index 000000000..99029b8c4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_16__0.txt @@ -0,0 +1,155 @@ +-2 ** 3 + +4 * 5 // 6 / 7 % 9 + 10 - 11 << 12 >> 13 & 14 ^ 15 | 16 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + operator: '^' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + operator: '&' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + operator: '>>' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + operator: '<<' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '**' + left: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 2 + right: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 3 + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + operator: '%' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '/' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + operator: '//' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + operator: '*' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '+' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 4 + right: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 5 + right: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 6 + right: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 7 + right: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + value: 9 + right: + + location: SourceLocation(pos=32, lineno=1, colno=33) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + value: 10 + right: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 11 + right: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + value: 12 + right: + + location: SourceLocation(pos=49, lineno=1, colno=50) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: 13 + right: + + location: SourceLocation(pos=54, lineno=1, colno=55) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + value: 14 + right: + + location: SourceLocation(pos=59, lineno=1, colno=60) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + value: 15 + right: + + location: SourceLocation(pos=64, lineno=1, colno=65) + end_location: SourceLocation(pos=66, lineno=1, colno=67) + value: 16 diff --git a/packages/bolt/tests/snapshots/bolt__parse_16__1.txt b/packages/bolt/tests/snapshots/bolt__parse_16__1.txt new file mode 100644 index 000000000..a8770c60b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_16__1.txt @@ -0,0 +1,43 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var14: + _mecha_var0 = 2 + _mecha_var1 = 3 + _mecha_var0 = _mecha_var0 ** _mecha_var1 + _mecha_var0 = - _mecha_var0 + _mecha_var2 = 4 + _mecha_var2 = + _mecha_var2 + _mecha_var3 = 5 + _mecha_var2 = _mecha_var2 * _mecha_var3 + _mecha_var4 = 6 + _mecha_var2 = _mecha_var2 // _mecha_var4 + _mecha_var5 = 7 + _mecha_var2 = _mecha_var2 / _mecha_var5 + _mecha_var6 = 9 + _mecha_var2 = _mecha_var2 % _mecha_var6 + _mecha_var0 = _mecha_var0 + _mecha_var2 + _mecha_var7 = 10 + _mecha_var0 = _mecha_var0 + _mecha_var7 + _mecha_var8 = 11 + _mecha_var0 = _mecha_var0 - _mecha_var8 + _mecha_var9 = 12 + _mecha_var0 = _mecha_var0 << _mecha_var9 + _mecha_var10 = 13 + _mecha_var0 = _mecha_var0 >> _mecha_var10 + _mecha_var11 = 14 + _mecha_var0 = _mecha_var0 & _mecha_var11 + _mecha_var12 = 15 + _mecha_var0 = _mecha_var0 ^ _mecha_var12 + _mecha_var13 = 16 + _mecha_var0 = _mecha_var0 | _mecha_var13 +_mecha_var15 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var14)) +--- +output = _mecha_var15 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_170__0.txt b/packages/bolt/tests/snapshots/bolt__parse_170__0.txt new file mode 100644 index 000000000..92b7f196f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_170__0.txt @@ -0,0 +1,80 @@ +numbers = list(range(12)) +numbers[3:] = [] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'numbers' + rebind: False + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'list' + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'range' + arguments: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 12 + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=42, lineno=2, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=42, lineno=2, colno=17) + operator: '=' + target: + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=12) + value: + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=33, lineno=2, colno=8) + value: 'numbers' + arguments: + + location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=36, lineno=2, colno=11) + start: + + location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=35, lineno=2, colno=10) + value: 3 + stop: None + step: None + value: + + location: SourceLocation(pos=40, lineno=2, colno=15) + end_location: SourceLocation(pos=42, lineno=2, colno=17) + items: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_170__1.txt b/packages/bolt/tests/snapshots/bolt__parse_170__1.txt new file mode 100644 index 000000000..43206102d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_170__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1, 11], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var6: + _mecha_var0 = list + _mecha_var1 = range + _mecha_var2 = 12 + _mecha_var1 = _mecha_var1(_mecha_var2) + _mecha_var0 = _mecha_var0(_mecha_var1) + numbers = _mecha_var0 + _mecha_var3 = [] + _mecha_var4 = numbers + _mecha_var5 = 3 + _mecha_var4[_mecha_var5:] = _mecha_var3 +_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) +--- +output = _mecha_var7 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_171__0.txt b/packages/bolt/tests/snapshots/bolt__parse_171__0.txt new file mode 100644 index 000000000..54513473e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_171__0.txt @@ -0,0 +1,69 @@ +numbers = list(range(12)) +del numbers[3:] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'numbers' + rebind: False + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'list' + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'range' + arguments: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 12 + + location: SourceLocation(pos=26, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + identifier: 'del:target' + arguments: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=16) + value: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=2, colno=12) + value: 'numbers' + arguments: + + location: SourceLocation(pos=38, lineno=2, colno=13) + end_location: SourceLocation(pos=40, lineno=2, colno=15) + start: + + location: SourceLocation(pos=38, lineno=2, colno=13) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + value: 3 + stop: None + step: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_171__1.txt b/packages/bolt/tests/snapshots/bolt__parse_171__1.txt new file mode 100644 index 000000000..b5a9924e9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_171__1.txt @@ -0,0 +1,24 @@ +_mecha_lineno = [1, 11], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = list + _mecha_var1 = range + _mecha_var2 = 12 + _mecha_var1 = _mecha_var1(_mecha_var2) + _mecha_var0 = _mecha_var0(_mecha_var1) + numbers = _mecha_var0 + _mecha_var3 = numbers + _mecha_var4 = 3 + del _mecha_var3[_mecha_var4:] +_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_172__0.txt b/packages/bolt/tests/snapshots/bolt__parse_172__0.txt new file mode 100644 index 000000000..5121f6321 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_172__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only delete variables, attributes, or subscripted items. +# line 1, column 5 +# 1 | del 1 + 1 +# : ^^^^^ +del 1 + 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_173__0.txt b/packages/bolt/tests/snapshots/bolt__parse_173__0.txt new file mode 100644 index 000000000..8aa6a1b8d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_173__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected non-empty block. +# line 1, column 26 +# 1 | execute function demo:foo: +# : ^ +execute function demo:foo: diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__0.txt b/packages/bolt/tests/snapshots/bolt__parse_174__0.txt new file mode 100644 index 000000000..2b6fd932d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_174__0.txt @@ -0,0 +1,76 @@ +mykey = "aaa" +if data storage some:path/to/storage f'some.{mykey}.path{{my: "compound"}}' run say hi +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'mykey' + rebind: False + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'aaa' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'execute:if:data:storage:source:path:subcommand' + arguments: + + location: SourceLocation(pos=30, lineno=2, colno=17) + end_location: SourceLocation(pos=50, lineno=2, colno=37) + is_tag: False + namespace: 'some' + path: 'path/to/storage' + + location: SourceLocation(pos=51, lineno=2, colno=38) + end_location: SourceLocation(pos=89, lineno=2, colno=76) + prefix: None + converter: 'nbt_path' + value: + + location: SourceLocation(pos=51, lineno=2, colno=38) + end_location: SourceLocation(pos=89, lineno=2, colno=76) + fmt: 'some.{}.path{{my: "compound"}}' + values: + + location: SourceLocation(pos=59, lineno=2, colno=46) + end_location: SourceLocation(pos=64, lineno=2, colno=51) + value: 'mykey' + + location: SourceLocation(pos=90, lineno=2, colno=77) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=94, lineno=2, colno=81) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=98, lineno=2, colno=85) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + fragments: + + location: SourceLocation(pos=98, lineno=2, colno=85) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + value: 'hi' diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt new file mode 100644 index 000000000..0672b5946 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt @@ -0,0 +1,60 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_nbt_path = _mecha_runtime.helpers['interpolate_nbt_path'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 'aaa' + mykey = _mecha_var0 + _mecha_var1 = mykey + _mecha_var2 = 'some.{}.path{{my: "compound"}}'.format(_mecha_var1) + _mecha_var2 = _mecha_helper_interpolate_nbt_path(_mecha_var2, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var2, _mecha_refs[2]]))]))) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=51, lineno=2, colno=38) + end_location: SourceLocation(pos=89, lineno=2, colno=76) + prefix: None + converter: 'nbt_path' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=30, lineno=2, colno=17) + end_location: SourceLocation(pos=50, lineno=2, colno=37) + is_tag: False + namespace: 'some' + path: 'path/to/storage' +_mecha_refs[2] + + location: SourceLocation(pos=90, lineno=2, colno=77) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'execute:if:data:storage:source:path:subcommand' + arguments: + + + +_mecha_refs[4] + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=100, lineno=2, colno=87) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__0.txt b/packages/bolt/tests/snapshots/bolt__parse_175__0.txt new file mode 100644 index 000000000..4d10715f9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_175__0.txt @@ -0,0 +1,71 @@ +mypath = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' +if data storage some:path/to/storage (mypath) run say hi +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=75, lineno=1, colno=76) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=75, lineno=1, colno=76) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'mypath' + rebind: False + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=75, lineno=1, colno=76) + value: 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' + + location: SourceLocation(pos=76, lineno=2, colno=1) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=76, lineno=2, colno=1) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'execute:if:data:storage:source:path:subcommand' + arguments: + + location: SourceLocation(pos=92, lineno=2, colno=17) + end_location: SourceLocation(pos=112, lineno=2, colno=37) + is_tag: False + namespace: 'some' + path: 'path/to/storage' + + location: SourceLocation(pos=114, lineno=2, colno=39) + end_location: SourceLocation(pos=120, lineno=2, colno=45) + prefix: None + converter: 'nbt_path' + value: + + location: SourceLocation(pos=114, lineno=2, colno=39) + end_location: SourceLocation(pos=120, lineno=2, colno=45) + value: 'mypath' + + location: SourceLocation(pos=122, lineno=2, colno=47) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=126, lineno=2, colno=51) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=130, lineno=2, colno=55) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + fragments: + + location: SourceLocation(pos=130, lineno=2, colno=55) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + value: 'hi' diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt new file mode 100644 index 000000000..1accb03bd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt @@ -0,0 +1,59 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_nbt_path = _mecha_runtime.helpers['interpolate_nbt_path'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' + mypath = _mecha_var0 + _mecha_var1 = mypath + _mecha_var1 = _mecha_helper_interpolate_nbt_path(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var1, _mecha_refs[2]]))]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=114, lineno=2, colno=39) + end_location: SourceLocation(pos=120, lineno=2, colno=45) + prefix: None + converter: 'nbt_path' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=92, lineno=2, colno=17) + end_location: SourceLocation(pos=112, lineno=2, colno=37) + is_tag: False + namespace: 'some' + path: 'path/to/storage' +_mecha_refs[2] + + location: SourceLocation(pos=122, lineno=2, colno=47) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=76, lineno=2, colno=1) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'execute:if:data:storage:source:path:subcommand' + arguments: + + + +_mecha_refs[4] + + location: SourceLocation(pos=76, lineno=2, colno=1) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=132, lineno=2, colno=57) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt new file mode 100644 index 000000000..9915077da --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt @@ -0,0 +1,78 @@ +entity_type = "creeper" +at @e[type=entity_type] summon lightning_bolt +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'entity_type' + rebind: False + value: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 'creeper' + + location: SourceLocation(pos=24, lineno=2, colno=1) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=24, lineno=2, colno=1) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=27, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=24) + variable: 'e' + arguments: + + location: SourceLocation(pos=30, lineno=2, colno=7) + end_location: SourceLocation(pos=46, lineno=2, colno=23) + inverted: False + key: + + location: SourceLocation(pos=30, lineno=2, colno=7) + end_location: SourceLocation(pos=34, lineno=2, colno=11) + value: 'type' + value: + + location: SourceLocation(pos=35, lineno=2, colno=12) + end_location: SourceLocation(pos=46, lineno=2, colno=23) + prefix: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=35, lineno=2, colno=12) + end_location: SourceLocation(pos=46, lineno=2, colno=23) + value: 'entity_type' + + location: SourceLocation(pos=48, lineno=2, colno=25) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=48, lineno=2, colno=25) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'summon:entity' + arguments: + + location: SourceLocation(pos=55, lineno=2, colno=32) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + is_tag: False + namespace: None + path: 'lightning_bolt' diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt new file mode 100644 index 000000000..fd52a3f9b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt @@ -0,0 +1,67 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'creeper' + entity_type = _mecha_var0 + _mecha_var1 = entity_type + _mecha_var1 = _mecha_helper_interpolate_resource_location(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_var1)])), _mecha_refs[3]]))]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=35, lineno=2, colno=12) + end_location: SourceLocation(pos=46, lineno=2, colno=23) + prefix: None + converter: 'resource_location' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=30, lineno=2, colno=7) + end_location: SourceLocation(pos=46, lineno=2, colno=23) + inverted: False + key: + + value: + +_mecha_refs[2] + + location: SourceLocation(pos=27, lineno=2, colno=4) + end_location: SourceLocation(pos=47, lineno=2, colno=24) + variable: 'e' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=48, lineno=2, colno=25) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=24, lineno=2, colno=1) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'execute:at:targets:subcommand' + arguments: + + +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=2, colno=1) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=2, colno=46) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_177__0.txt b/packages/bolt/tests/snapshots/bolt__parse_177__0.txt new file mode 100644 index 000000000..2ba9b9985 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_177__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected colon but reached end of file. +# line 1, column 25 +# 1 | append function demo:foo +append function demo:foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_178__0.txt b/packages/bolt/tests/snapshots/bolt__parse_178__0.txt new file mode 100644 index 000000000..7ecab4a6a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_178__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected identifier or resource_location but got newline '\n'. +# line 1, column 13 +# 1 | function_tag +function_tag diff --git a/packages/bolt/tests/snapshots/bolt__parse_179__0.txt b/packages/bolt/tests/snapshots/bolt__parse_179__0.txt new file mode 100644 index 000000000..76745c41a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_179__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected identifier or resource_location but got newline '\n'. +# line 1, column 19 +# 1 | merge function_tag +merge function_tag diff --git a/packages/bolt/tests/snapshots/bolt__parse_17__0.txt b/packages/bolt/tests/snapshots/bolt__parse_17__0.txt new file mode 100644 index 000000000..ec8e7dc07 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_17__0.txt @@ -0,0 +1,240 @@ +False or True and "hello" or not "foo" == "bar" or 1 != 2 and 1 < 2 and 2 <= 3 and 5 > 4 and 6 >= 5 and 1 in 1 and 2 not in 2 and 3 is 3 and 3 is not 3 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=152, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: 'or' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: False + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: 'and' + left: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: True + right: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'hello' + right: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: 'not' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + operator: '==' + left: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'foo' + right: + + location: SourceLocation(pos=42, lineno=1, colno=43) + end_location: SourceLocation(pos=47, lineno=1, colno=48) + value: 'bar' + right: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + operator: 'and' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + operator: '!=' + left: + + location: SourceLocation(pos=51, lineno=1, colno=52) + end_location: SourceLocation(pos=52, lineno=1, colno=53) + value: 1 + right: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + value: 2 + right: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + operator: '<' + left: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=63, lineno=1, colno=64) + value: 1 + right: + + location: SourceLocation(pos=66, lineno=1, colno=67) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + value: 2 + right: + + location: SourceLocation(pos=72, lineno=1, colno=73) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + operator: '<=' + left: + + location: SourceLocation(pos=72, lineno=1, colno=73) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + value: 2 + right: + + location: SourceLocation(pos=77, lineno=1, colno=78) + end_location: SourceLocation(pos=78, lineno=1, colno=79) + value: 3 + right: + + location: SourceLocation(pos=83, lineno=1, colno=84) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + operator: '>' + left: + + location: SourceLocation(pos=83, lineno=1, colno=84) + end_location: SourceLocation(pos=84, lineno=1, colno=85) + value: 5 + right: + + location: SourceLocation(pos=87, lineno=1, colno=88) + end_location: SourceLocation(pos=88, lineno=1, colno=89) + value: 4 + right: + + location: SourceLocation(pos=93, lineno=1, colno=94) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + operator: '>=' + left: + + location: SourceLocation(pos=93, lineno=1, colno=94) + end_location: SourceLocation(pos=94, lineno=1, colno=95) + value: 6 + right: + + location: SourceLocation(pos=98, lineno=1, colno=99) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + value: 5 + right: + + location: SourceLocation(pos=104, lineno=1, colno=105) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + operator: 'in' + left: + + location: SourceLocation(pos=104, lineno=1, colno=105) + end_location: SourceLocation(pos=105, lineno=1, colno=106) + value: 1 + right: + + location: SourceLocation(pos=109, lineno=1, colno=110) + end_location: SourceLocation(pos=110, lineno=1, colno=111) + value: 1 + right: + + location: SourceLocation(pos=115, lineno=1, colno=116) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + operator: 'not_in' + left: + + location: SourceLocation(pos=115, lineno=1, colno=116) + end_location: SourceLocation(pos=116, lineno=1, colno=117) + value: 2 + right: + + location: SourceLocation(pos=124, lineno=1, colno=125) + end_location: SourceLocation(pos=125, lineno=1, colno=126) + value: 2 + right: + + location: SourceLocation(pos=130, lineno=1, colno=131) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + operator: 'is' + left: + + location: SourceLocation(pos=130, lineno=1, colno=131) + end_location: SourceLocation(pos=131, lineno=1, colno=132) + value: 3 + right: + + location: SourceLocation(pos=135, lineno=1, colno=136) + end_location: SourceLocation(pos=136, lineno=1, colno=137) + value: 3 + right: + + location: SourceLocation(pos=141, lineno=1, colno=142) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + operator: 'is_not' + left: + + location: SourceLocation(pos=141, lineno=1, colno=142) + end_location: SourceLocation(pos=142, lineno=1, colno=143) + value: 3 + right: + + location: SourceLocation(pos=150, lineno=1, colno=151) + end_location: SourceLocation(pos=151, lineno=1, colno=152) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_17__1.txt b/packages/bolt/tests/snapshots/bolt__parse_17__1.txt new file mode 100644 index 000000000..837eca3a9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_17__1.txt @@ -0,0 +1,210 @@ +_mecha_lineno = [1], [1] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] +_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var47: + _mecha_var0 = False + _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) + _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var2 is not None: + _mecha_var0 = _mecha_var2() + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = True + _mecha_var4 = _mecha_var3 + _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) + if _mecha_var5 is not None: + _mecha_var3 = _mecha_var5() + with _mecha_helper_branch(_mecha_var4) as _mecha_condition: + if _mecha_condition: + _mecha_var6 = 'hello' + if _mecha_var5 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) + _mecha_var3 = _mecha_var6 + if _mecha_rebind is not None: + _mecha_var3 = _mecha_rebind(_mecha_var3) + else: + _mecha_var3 = _mecha_var6 + if _mecha_var2 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var3 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var3 + _mecha_var7 = _mecha_helper_operator_not(_mecha_var0) + _mecha_var8 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var8 is not None: + _mecha_var0 = _mecha_var8() + with _mecha_helper_branch(_mecha_var7) as _mecha_condition: + if _mecha_condition: + _mecha_var9 = 'foo' + _mecha_var10 = 'bar' + _mecha_var9 = _mecha_var9 == _mecha_var10 + _mecha_var9 = _mecha_helper_operator_not(_mecha_var9) + if _mecha_var8 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var9 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var9 + _mecha_var11 = _mecha_helper_operator_not(_mecha_var0) + _mecha_var12 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var12 is not None: + _mecha_var0 = _mecha_var12() + with _mecha_helper_branch(_mecha_var11) as _mecha_condition: + if _mecha_condition: + _mecha_var13 = 1 + _mecha_var14 = 2 + _mecha_var13 = _mecha_var13 != _mecha_var14 + _mecha_var15 = _mecha_var13 + _mecha_var16 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var16 is not None: + _mecha_var13 = _mecha_var16() + with _mecha_helper_branch(_mecha_var15) as _mecha_condition: + if _mecha_condition: + _mecha_var17 = 1 + _mecha_var18 = 2 + _mecha_var17 = _mecha_var17 < _mecha_var18 + if _mecha_var16 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var17 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var17 + _mecha_var19 = _mecha_var13 + _mecha_var20 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var20 is not None: + _mecha_var13 = _mecha_var20() + with _mecha_helper_branch(_mecha_var19) as _mecha_condition: + if _mecha_condition: + _mecha_var21 = 2 + _mecha_var22 = 3 + _mecha_var21 = _mecha_var21 <= _mecha_var22 + if _mecha_var20 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var21 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var21 + _mecha_var23 = _mecha_var13 + _mecha_var24 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var24 is not None: + _mecha_var13 = _mecha_var24() + with _mecha_helper_branch(_mecha_var23) as _mecha_condition: + if _mecha_condition: + _mecha_var25 = 5 + _mecha_var26 = 4 + _mecha_var25 = _mecha_var25 > _mecha_var26 + if _mecha_var24 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var25 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var25 + _mecha_var27 = _mecha_var13 + _mecha_var28 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var28 is not None: + _mecha_var13 = _mecha_var28() + with _mecha_helper_branch(_mecha_var27) as _mecha_condition: + if _mecha_condition: + _mecha_var29 = 6 + _mecha_var30 = 5 + _mecha_var29 = _mecha_var29 >= _mecha_var30 + if _mecha_var28 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var29 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var29 + _mecha_var31 = _mecha_var13 + _mecha_var32 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var32 is not None: + _mecha_var13 = _mecha_var32() + with _mecha_helper_branch(_mecha_var31) as _mecha_condition: + if _mecha_condition: + _mecha_var33 = 1 + _mecha_var34 = 1 + _mecha_var33 = _mecha_helper_operator_in(_mecha_var33, _mecha_var34) + if _mecha_var32 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var33 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var33 + _mecha_var35 = _mecha_var13 + _mecha_var36 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var36 is not None: + _mecha_var13 = _mecha_var36() + with _mecha_helper_branch(_mecha_var35) as _mecha_condition: + if _mecha_condition: + _mecha_var37 = 2 + _mecha_var38 = 2 + _mecha_var37 = _mecha_helper_operator_not_in(_mecha_var37, _mecha_var38) + if _mecha_var36 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var37 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var37 + _mecha_var39 = _mecha_var13 + _mecha_var40 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var40 is not None: + _mecha_var13 = _mecha_var40() + with _mecha_helper_branch(_mecha_var39) as _mecha_condition: + if _mecha_condition: + _mecha_var41 = 3 + _mecha_var42 = 3 + _mecha_var41 = _mecha_var41 is _mecha_var42 + if _mecha_var40 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var41 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var41 + _mecha_var43 = _mecha_var13 + _mecha_var44 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var44 is not None: + _mecha_var13 = _mecha_var44() + with _mecha_helper_branch(_mecha_var43) as _mecha_condition: + if _mecha_condition: + _mecha_var45 = 3 + _mecha_var46 = 3 + _mecha_var45 = _mecha_var45 is not _mecha_var46 + if _mecha_var44 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var45 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var45 + if _mecha_var12 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var13 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var13 +_mecha_var48 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var47)) +--- +output = _mecha_var48 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=152, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_180__0.txt b/packages/bolt/tests/snapshots/bolt__parse_180__0.txt new file mode 100644 index 000000000..1e000a776 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_180__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected bracket '[', curly '{', identifier, literal 'false', literal 'null', literal 'true', number or string but reached end of file. +# line 1, column 34 +# 1 | merge function_tag minecraft:tick +merge function_tag minecraft:tick diff --git a/packages/bolt/tests/snapshots/bolt__parse_181__0.txt b/packages/bolt/tests/snapshots/bolt__parse_181__0.txt new file mode 100644 index 000000000..ca2878c60 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_181__0.txt @@ -0,0 +1,15 @@ +demo:foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'demo:foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_181__1.txt b/packages/bolt/tests/snapshots/bolt__parse_181__1.txt new file mode 100644 index 000000000..43a0076c6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_181__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'demo:foo' +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_182__0.txt b/packages/bolt/tests/snapshots/bolt__parse_182__0.txt new file mode 100644 index 000000000..378eb7fe9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_182__0.txt @@ -0,0 +1,26 @@ +a = demo:foo/bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'demo:foo/bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_182__1.txt b/packages/bolt/tests/snapshots/bolt__parse_182__1.txt new file mode 100644 index 000000000..3237b20cf --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_182__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'demo:foo/bar' + a = _mecha_var0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_183__0.txt b/packages/bolt/tests/snapshots/bolt__parse_183__0.txt new file mode 100644 index 000000000..bf32d1ef6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_183__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected identifier but got literal 'class'. +# line 1, column 5 +# 1 | for class in "abc": +# : ^^^^^ +# 2 | scoreboard objectives add class dummy +for class in "abc": + scoreboard objectives add class dummy diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt new file mode 100644 index 000000000..b6be8f77f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt @@ -0,0 +1,79 @@ +a = 1 +positioned ~ ~a ~ function demo:foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=23, lineno=2, colno=18) + x: + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=18, lineno=2, colno=13) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=19, lineno=2, colno=14) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + prefix: '~' + converter: 'coordinate' + value: + + location: SourceLocation(pos=20, lineno=2, colno=15) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + value: 'a' + z: + + location: SourceLocation(pos=22, lineno=2, colno=17) + end_location: SourceLocation(pos=23, lineno=2, colno=18) + type: 'relative' + value: 0 + + location: SourceLocation(pos=24, lineno=2, colno=19) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=24, lineno=2, colno=19) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=33, lineno=2, colno=28) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + is_tag: False + namespace: 'demo' + path: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt new file mode 100644 index 000000000..7bf8a05d7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt @@ -0,0 +1,61 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + a = _mecha_var0 + _mecha_var1 = a + _mecha_var1 = _mecha_helper_interpolate_coordinate(f'~{_mecha_var1}', _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], y=_mecha_var1), _mecha_refs[2]]))]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=19, lineno=2, colno=14) + end_location: SourceLocation(pos=21, lineno=2, colno=16) + prefix: '~' + converter: 'coordinate' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=17, lineno=2, colno=12) + end_location: SourceLocation(pos=23, lineno=2, colno=18) + x: + + y: + + z: + +_mecha_refs[2] + + location: SourceLocation(pos=24, lineno=2, colno=19) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:run:subcommand' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:positioned:pos:subcommand' + arguments: + + +_mecha_refs[4] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=36) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_185__0.txt b/packages/bolt/tests/snapshots/bolt__parse_185__0.txt new file mode 100644 index 000000000..01e540294 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_185__0.txt @@ -0,0 +1,35 @@ +a, b = "ab" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + targets: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'b' + rebind: False + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'ab' diff --git a/packages/bolt/tests/snapshots/bolt__parse_185__1.txt b/packages/bolt/tests/snapshots/bolt__parse_185__1.txt new file mode 100644 index 000000000..5d220c518 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_185__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'ab' + _mecha_unpack0, _mecha_unpack1 = _mecha_var0 + a = _mecha_unpack0 + b = _mecha_unpack1 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_186__0.txt b/packages/bolt/tests/snapshots/bolt__parse_186__0.txt new file mode 100644 index 000000000..85e8d65b8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_186__0.txt @@ -0,0 +1,67 @@ +for i, value in enumerate("abc"): + say f"{i}: {value}" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + targets: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + rebind: False + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'value' + rebind: False + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'enumerate' + arguments: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 'abc' + + location: SourceLocation(pos=38, lineno=2, colno=5) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + commands: + + location: SourceLocation(pos=38, lineno=2, colno=5) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=42, lineno=2, colno=9) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=42, lineno=2, colno=9) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + fmt: '{}: {}' + values: + + location: SourceLocation(pos=45, lineno=2, colno=12) + end_location: SourceLocation(pos=46, lineno=2, colno=13) + value: 'i' + + location: SourceLocation(pos=50, lineno=2, colno=17) + end_location: SourceLocation(pos=55, lineno=2, colno=22) + value: 'value' diff --git a/packages/bolt/tests/snapshots/bolt__parse_186__1.txt b/packages/bolt/tests/snapshots/bolt__parse_186__1.txt new file mode 100644 index 000000000..abacc7beb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_186__1.txt @@ -0,0 +1,39 @@ +_mecha_lineno = [1, 10], [1, 2] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = enumerate + _mecha_var1 = 'abc' + _mecha_var0 = _mecha_var0(_mecha_var1) + for i, value in _mecha_var0: + _mecha_var2 = i + _mecha_var3 = value + _mecha_var4 = '{}: {}'.format(_mecha_var2, _mecha_var3) + _mecha_var4 = _mecha_helper_interpolate_message(_mecha_var4, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var4]))) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=42, lineno=2, colno=9) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=38, lineno=2, colno=5) + end_location: SourceLocation(pos=57, lineno=2, colno=24) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_187__0.txt b/packages/bolt/tests/snapshots/bolt__parse_187__0.txt new file mode 100644 index 000000000..4e7539714 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_187__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'x' is not defined. +# line 1, column 8 +# 1 | global x +# : ^ +global x diff --git a/packages/bolt/tests/snapshots/bolt__parse_188__0.txt b/packages/bolt/tests/snapshots/bolt__parse_188__0.txt new file mode 100644 index 000000000..e5b5e93ff --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_188__0.txt @@ -0,0 +1,7 @@ +x = 1 +#>ERROR Can't make local identifier global. +# line 2, column 8 +# 1 | x = 1 +# 2 | global x +# : ^ +global x diff --git a/packages/bolt/tests/snapshots/bolt__parse_189__0.txt b/packages/bolt/tests/snapshots/bolt__parse_189__0.txt new file mode 100644 index 000000000..ae12658e3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_189__0.txt @@ -0,0 +1,8 @@ +x = 1 +def f(): +#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? +# line 3, column 12 +# 2 | def f(): +# 3 | global xx +# : ^^ + global xx diff --git a/packages/bolt/tests/snapshots/bolt__parse_18__0.txt b/packages/bolt/tests/snapshots/bolt__parse_18__0.txt new file mode 100644 index 000000000..361818698 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_18__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected eof or newline but got literal '§§§'. +# line 1, column 4 +# 1 | 64 §§§ +# : ^^^ +64 §§§ diff --git a/packages/bolt/tests/snapshots/bolt__parse_190__0.txt b/packages/bolt/tests/snapshots/bolt__parse_190__0.txt new file mode 100644 index 000000000..3ce10b1b6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_190__0.txt @@ -0,0 +1,7 @@ +def f(x): +#>ERROR Can't make local identifier global. +# line 2, column 12 +# 1 | def f(x): +# 2 | global x +# : ^ + global x diff --git a/packages/bolt/tests/snapshots/bolt__parse_191__0.txt b/packages/bolt/tests/snapshots/bolt__parse_191__0.txt new file mode 100644 index 000000000..742aaf027 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_191__0.txt @@ -0,0 +1,9 @@ +x = 1 +def f(): + global x +#>ERROR Can't make global identifier nonlocal. +# line 4, column 14 +# 3 | global x +# 4 | nonlocal x +# : ^ + nonlocal x diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt new file mode 100644 index 000000000..26a6778d2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt @@ -0,0 +1,131 @@ +math = 0 +say math +def wat(): + global math + import math +wat() +say math.ceil(0.1) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=86, lineno=8, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'math' + rebind: False + value: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 0 + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + value: 'math' + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=60, lineno=5, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=27, lineno=3, colno=10) + name: 'wat' + arguments: + + + location: SourceLocation(pos=33, lineno=4, colno=5) + end_location: SourceLocation(pos=60, lineno=5, colno=16) + commands: + + location: SourceLocation(pos=33, lineno=4, colno=5) + end_location: SourceLocation(pos=44, lineno=4, colno=16) + identifier: 'global:subcommand' + arguments: + + location: SourceLocation(pos=40, lineno=4, colno=12) + end_location: SourceLocation(pos=44, lineno=4, colno=16) + identifier: 'global:name' + arguments: + + location: SourceLocation(pos=40, lineno=4, colno=12) + end_location: SourceLocation(pos=44, lineno=4, colno=16) + value: 'math' + + location: SourceLocation(pos=49, lineno=5, colno=5) + end_location: SourceLocation(pos=60, lineno=5, colno=16) + identifier: 'import:module' + arguments: + + location: SourceLocation(pos=56, lineno=5, colno=12) + end_location: SourceLocation(pos=60, lineno=5, colno=16) + is_tag: False + namespace: None + path: 'math' + + location: SourceLocation(pos=61, lineno=6, colno=1) + end_location: SourceLocation(pos=66, lineno=6, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=61, lineno=6, colno=1) + end_location: SourceLocation(pos=66, lineno=6, colno=6) + value: + + location: SourceLocation(pos=61, lineno=6, colno=1) + end_location: SourceLocation(pos=64, lineno=6, colno=4) + value: 'wat' + arguments: + + + location: SourceLocation(pos=67, lineno=7, colno=1) + end_location: SourceLocation(pos=85, lineno=7, colno=19) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=71, lineno=7, colno=5) + end_location: SourceLocation(pos=85, lineno=7, colno=19) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=71, lineno=7, colno=5) + end_location: SourceLocation(pos=85, lineno=7, colno=19) + value: + + location: SourceLocation(pos=71, lineno=7, colno=5) + end_location: SourceLocation(pos=80, lineno=7, colno=14) + name: 'ceil' + value: + + location: SourceLocation(pos=71, lineno=7, colno=5) + end_location: SourceLocation(pos=75, lineno=7, colno=9) + value: 'math' + arguments: + + location: SourceLocation(pos=81, lineno=7, colno=15) + end_location: SourceLocation(pos=84, lineno=7, colno=18) + value: 0.1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__1.txt b/packages/bolt/tests/snapshots/bolt__parse_192__1.txt new file mode 100644 index 000000000..1f9fa73c5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_192__1.txt @@ -0,0 +1,67 @@ +_mecha_lineno = [1, 10, 14, 15, 16, 18], [1, 2, 4, 5, 6, 7] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = 0 + math = _mecha_var0 + _mecha_var1 = math + _mecha_var1 = _mecha_helper_interpolate_message(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) + def wat(): + global math + math = _mecha_helper_import_module('math') + _mecha_var2 = wat + _mecha_var2 = _mecha_var2() + _mecha_var3 = math + _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'ceil') + _mecha_var4 = 0.1 + _mecha_var3 = _mecha_var3(_mecha_var4) + _mecha_var3 = _mecha_helper_interpolate_message(_mecha_var3, _mecha_refs[2]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var3]))) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=71, lineno=7, colno=5) + end_location: SourceLocation(pos=85, lineno=7, colno=19) + prefix: None + converter: 'message' + value: + +_mecha_refs[3] + + location: SourceLocation(pos=67, lineno=7, colno=1) + end_location: SourceLocation(pos=85, lineno=7, colno=19) + identifier: 'say:message' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=86, lineno=8, colno=1) + commands: + + + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt new file mode 100644 index 000000000..4c9bf4bec --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt @@ -0,0 +1,423 @@ +def init_global_score(self, name): + self.name = name + +def rebind_global_score(self, rhs): + if isinstance(rhs, GlobalScore): + scoreboard players operation self.name global = rhs.name global + else: + scoreboard players set self.name global rhs + return self + +GlobalScore = type("GlobalScore", (), {"__init__": init_global_score, "__rebind__": rebind_global_score}) + +a = GlobalScore("a") +a = 123 +a = 456 + +b = GlobalScore("b") +b = 789 +b = a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=461, lineno=20, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=2, colno=21) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + name: 'init_global_score' + arguments: + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + name: 'self' + default: None + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + name: 'name' + default: None + + location: SourceLocation(pos=39, lineno=2, colno=5) + end_location: SourceLocation(pos=55, lineno=2, colno=21) + commands: + + location: SourceLocation(pos=39, lineno=2, colno=5) + end_location: SourceLocation(pos=55, lineno=2, colno=21) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=39, lineno=2, colno=5) + end_location: SourceLocation(pos=55, lineno=2, colno=21) + operator: '=' + target: + + location: SourceLocation(pos=39, lineno=2, colno=5) + end_location: SourceLocation(pos=48, lineno=2, colno=14) + name: 'name' + value: + + location: SourceLocation(pos=39, lineno=2, colno=5) + end_location: SourceLocation(pos=43, lineno=2, colno=9) + value: 'self' + value: + + location: SourceLocation(pos=51, lineno=2, colno=17) + end_location: SourceLocation(pos=55, lineno=2, colno=21) + value: 'name' + + location: SourceLocation(pos=57, lineno=4, colno=1) + end_location: SourceLocation(pos=279, lineno=9, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=61, lineno=4, colno=5) + end_location: SourceLocation(pos=91, lineno=4, colno=35) + name: 'rebind_global_score' + arguments: + + location: SourceLocation(pos=81, lineno=4, colno=25) + end_location: SourceLocation(pos=85, lineno=4, colno=29) + name: 'self' + default: None + + location: SourceLocation(pos=87, lineno=4, colno=31) + end_location: SourceLocation(pos=90, lineno=4, colno=34) + name: 'rhs' + default: None + + location: SourceLocation(pos=97, lineno=5, colno=5) + end_location: SourceLocation(pos=279, lineno=9, colno=16) + commands: + + location: SourceLocation(pos=97, lineno=5, colno=5) + end_location: SourceLocation(pos=201, lineno=6, colno=72) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=100, lineno=5, colno=8) + end_location: SourceLocation(pos=128, lineno=5, colno=36) + value: + + location: SourceLocation(pos=100, lineno=5, colno=8) + end_location: SourceLocation(pos=110, lineno=5, colno=18) + value: 'isinstance' + arguments: + + location: SourceLocation(pos=111, lineno=5, colno=19) + end_location: SourceLocation(pos=114, lineno=5, colno=22) + value: 'rhs' + + location: SourceLocation(pos=116, lineno=5, colno=24) + end_location: SourceLocation(pos=127, lineno=5, colno=35) + value: 'GlobalScore' + + location: SourceLocation(pos=138, lineno=6, colno=9) + end_location: SourceLocation(pos=201, lineno=6, colno=72) + commands: + + location: SourceLocation(pos=138, lineno=6, colno=9) + end_location: SourceLocation(pos=201, lineno=6, colno=72) + identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' + arguments: + + location: SourceLocation(pos=167, lineno=6, colno=38) + end_location: SourceLocation(pos=176, lineno=6, colno=47) + prefix: None + converter: 'entity' + value: + + location: SourceLocation(pos=167, lineno=6, colno=38) + end_location: SourceLocation(pos=176, lineno=6, colno=47) + name: 'name' + value: + + location: SourceLocation(pos=167, lineno=6, colno=38) + end_location: SourceLocation(pos=171, lineno=6, colno=42) + value: 'self' + + location: SourceLocation(pos=177, lineno=6, colno=48) + end_location: SourceLocation(pos=183, lineno=6, colno=54) + value: 'global' + + location: SourceLocation(pos=184, lineno=6, colno=55) + end_location: SourceLocation(pos=185, lineno=6, colno=56) + value: '=' + + location: SourceLocation(pos=186, lineno=6, colno=57) + end_location: SourceLocation(pos=194, lineno=6, colno=65) + prefix: None + converter: 'entity' + value: + + location: SourceLocation(pos=186, lineno=6, colno=57) + end_location: SourceLocation(pos=194, lineno=6, colno=65) + name: 'name' + value: + + location: SourceLocation(pos=186, lineno=6, colno=57) + end_location: SourceLocation(pos=189, lineno=6, colno=60) + value: 'rhs' + + location: SourceLocation(pos=195, lineno=6, colno=66) + end_location: SourceLocation(pos=201, lineno=6, colno=72) + value: 'global' + + location: SourceLocation(pos=206, lineno=7, colno=5) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=220, lineno=8, colno=9) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + commands: + + location: SourceLocation(pos=220, lineno=8, colno=9) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + identifier: 'scoreboard:players:set:targets:objective:score' + arguments: + + location: SourceLocation(pos=243, lineno=8, colno=32) + end_location: SourceLocation(pos=252, lineno=8, colno=41) + prefix: None + converter: 'entity' + value: + + location: SourceLocation(pos=243, lineno=8, colno=32) + end_location: SourceLocation(pos=252, lineno=8, colno=41) + name: 'name' + value: + + location: SourceLocation(pos=243, lineno=8, colno=32) + end_location: SourceLocation(pos=247, lineno=8, colno=36) + value: 'self' + + location: SourceLocation(pos=253, lineno=8, colno=42) + end_location: SourceLocation(pos=259, lineno=8, colno=48) + value: 'global' + + location: SourceLocation(pos=260, lineno=8, colno=49) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + prefix: None + converter: 'numeric' + value: + + location: SourceLocation(pos=260, lineno=8, colno=49) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + value: 'rhs' + + location: SourceLocation(pos=268, lineno=9, colno=5) + end_location: SourceLocation(pos=279, lineno=9, colno=16) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=275, lineno=9, colno=12) + end_location: SourceLocation(pos=279, lineno=9, colno=16) + value: 'self' + + location: SourceLocation(pos=281, lineno=11, colno=1) + end_location: SourceLocation(pos=386, lineno=11, colno=106) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=281, lineno=11, colno=1) + end_location: SourceLocation(pos=386, lineno=11, colno=106) + operator: '=' + target: + + location: SourceLocation(pos=281, lineno=11, colno=1) + end_location: SourceLocation(pos=292, lineno=11, colno=12) + value: 'GlobalScore' + rebind: False + value: + + location: SourceLocation(pos=295, lineno=11, colno=15) + end_location: SourceLocation(pos=386, lineno=11, colno=106) + value: + + location: SourceLocation(pos=295, lineno=11, colno=15) + end_location: SourceLocation(pos=299, lineno=11, colno=19) + value: 'type' + arguments: + + location: SourceLocation(pos=300, lineno=11, colno=20) + end_location: SourceLocation(pos=313, lineno=11, colno=33) + value: 'GlobalScore' + + location: SourceLocation(pos=315, lineno=11, colno=35) + end_location: SourceLocation(pos=317, lineno=11, colno=37) + items: + + + location: SourceLocation(pos=319, lineno=11, colno=39) + end_location: SourceLocation(pos=385, lineno=11, colno=105) + items: + + location: SourceLocation(pos=320, lineno=11, colno=40) + end_location: SourceLocation(pos=349, lineno=11, colno=69) + key: + + location: SourceLocation(pos=320, lineno=11, colno=40) + end_location: SourceLocation(pos=330, lineno=11, colno=50) + value: '__init__' + value: + + location: SourceLocation(pos=332, lineno=11, colno=52) + end_location: SourceLocation(pos=349, lineno=11, colno=69) + value: 'init_global_score' + + location: SourceLocation(pos=351, lineno=11, colno=71) + end_location: SourceLocation(pos=384, lineno=11, colno=104) + key: + + location: SourceLocation(pos=351, lineno=11, colno=71) + end_location: SourceLocation(pos=363, lineno=11, colno=83) + value: '__rebind__' + value: + + location: SourceLocation(pos=365, lineno=11, colno=85) + end_location: SourceLocation(pos=384, lineno=11, colno=104) + value: 'rebind_global_score' + + location: SourceLocation(pos=388, lineno=13, colno=1) + end_location: SourceLocation(pos=408, lineno=13, colno=21) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=388, lineno=13, colno=1) + end_location: SourceLocation(pos=408, lineno=13, colno=21) + operator: '=' + target: + + location: SourceLocation(pos=388, lineno=13, colno=1) + end_location: SourceLocation(pos=389, lineno=13, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=392, lineno=13, colno=5) + end_location: SourceLocation(pos=408, lineno=13, colno=21) + value: + + location: SourceLocation(pos=392, lineno=13, colno=5) + end_location: SourceLocation(pos=403, lineno=13, colno=16) + value: 'GlobalScore' + arguments: + + location: SourceLocation(pos=404, lineno=13, colno=17) + end_location: SourceLocation(pos=407, lineno=13, colno=20) + value: 'a' + + location: SourceLocation(pos=409, lineno=14, colno=1) + end_location: SourceLocation(pos=416, lineno=14, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=409, lineno=14, colno=1) + end_location: SourceLocation(pos=416, lineno=14, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=409, lineno=14, colno=1) + end_location: SourceLocation(pos=410, lineno=14, colno=2) + value: 'a' + rebind: True + value: + + location: SourceLocation(pos=413, lineno=14, colno=5) + end_location: SourceLocation(pos=416, lineno=14, colno=8) + value: 123 + + location: SourceLocation(pos=417, lineno=15, colno=1) + end_location: SourceLocation(pos=424, lineno=15, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=417, lineno=15, colno=1) + end_location: SourceLocation(pos=424, lineno=15, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=417, lineno=15, colno=1) + end_location: SourceLocation(pos=418, lineno=15, colno=2) + value: 'a' + rebind: True + value: + + location: SourceLocation(pos=421, lineno=15, colno=5) + end_location: SourceLocation(pos=424, lineno=15, colno=8) + value: 456 + + location: SourceLocation(pos=426, lineno=17, colno=1) + end_location: SourceLocation(pos=446, lineno=17, colno=21) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=426, lineno=17, colno=1) + end_location: SourceLocation(pos=446, lineno=17, colno=21) + operator: '=' + target: + + location: SourceLocation(pos=426, lineno=17, colno=1) + end_location: SourceLocation(pos=427, lineno=17, colno=2) + value: 'b' + rebind: False + value: + + location: SourceLocation(pos=430, lineno=17, colno=5) + end_location: SourceLocation(pos=446, lineno=17, colno=21) + value: + + location: SourceLocation(pos=430, lineno=17, colno=5) + end_location: SourceLocation(pos=441, lineno=17, colno=16) + value: 'GlobalScore' + arguments: + + location: SourceLocation(pos=442, lineno=17, colno=17) + end_location: SourceLocation(pos=445, lineno=17, colno=20) + value: 'b' + + location: SourceLocation(pos=447, lineno=18, colno=1) + end_location: SourceLocation(pos=454, lineno=18, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=447, lineno=18, colno=1) + end_location: SourceLocation(pos=454, lineno=18, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=447, lineno=18, colno=1) + end_location: SourceLocation(pos=448, lineno=18, colno=2) + value: 'b' + rebind: True + value: + + location: SourceLocation(pos=451, lineno=18, colno=5) + end_location: SourceLocation(pos=454, lineno=18, colno=8) + value: 789 + + location: SourceLocation(pos=455, lineno=19, colno=1) + end_location: SourceLocation(pos=460, lineno=19, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=455, lineno=19, colno=1) + end_location: SourceLocation(pos=460, lineno=19, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=455, lineno=19, colno=1) + end_location: SourceLocation(pos=456, lineno=19, colno=2) + value: 'b' + rebind: True + value: + + location: SourceLocation(pos=459, lineno=19, colno=5) + end_location: SourceLocation(pos=460, lineno=19, colno=6) + value: 'a' diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt new file mode 100644 index 000000000..314e5aa99 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt @@ -0,0 +1,167 @@ +_mecha_lineno = [1, 12, 16, 22, 32, 38, 40, 50, 55, 60, 64, 69, 73], [1, 2, 5, 6, 8, 9, 11, 13, 14, 15, 17, 18, 19] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_interpolate_entity = _mecha_runtime.helpers['interpolate_entity'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_interpolate_numeric = _mecha_runtime.helpers['interpolate_numeric'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +with _mecha_runtime.scope() as _mecha_var26: + def init_global_score(self, name): + _mecha_var0 = name + _mecha_var1 = self + _mecha_var1.name = _mecha_var0 + def rebind_global_score(self, rhs): + _mecha_var2 = isinstance + _mecha_var3 = rhs + _mecha_var4 = GlobalScore + _mecha_var2 = _mecha_var2(_mecha_var3, _mecha_var4) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var5 = self + _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'name') + _mecha_var5 = _mecha_helper_interpolate_entity(_mecha_var5, _mecha_refs[0]) + _mecha_var6 = rhs + _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'name') + _mecha_var6 = _mecha_helper_interpolate_entity(_mecha_var6, _mecha_refs[1]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var5, _mecha_refs[2], _mecha_refs[3], _mecha_var6, _mecha_refs[4]]))) + _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var7 = self + _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'name') + _mecha_var7 = _mecha_helper_interpolate_entity(_mecha_var7, _mecha_refs[6]) + _mecha_var8 = rhs + _mecha_var8 = _mecha_helper_interpolate_numeric(_mecha_var8, _mecha_refs[7]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_var7, _mecha_refs[8], _mecha_var8]))) + _mecha_var9 = self + return _mecha_var9 + _mecha_var10 = type + _mecha_var11 = 'GlobalScore' + _mecha_var12 = () + _mecha_var13 = '__init__' + _mecha_var14 = init_global_score + _mecha_var15 = '__rebind__' + _mecha_var16 = rebind_global_score + _mecha_var17 = {_mecha_var13: _mecha_var14, _mecha_var15: _mecha_var16} + _mecha_var10 = _mecha_var10(_mecha_var11, _mecha_var12, _mecha_var17) + GlobalScore = _mecha_var10 + _mecha_var18 = GlobalScore + _mecha_var19 = 'a' + _mecha_var18 = _mecha_var18(_mecha_var19) + a = _mecha_var18 + _mecha_var20 = 123 + _mecha_rebind = _mecha_helper_get_rebind(a) + a = _mecha_var20 + if _mecha_rebind is not None: + a = _mecha_rebind(a) + _mecha_var21 = 456 + _mecha_rebind = _mecha_helper_get_rebind(a) + a = _mecha_var21 + if _mecha_rebind is not None: + a = _mecha_rebind(a) + _mecha_var22 = GlobalScore + _mecha_var23 = 'b' + _mecha_var22 = _mecha_var22(_mecha_var23) + b = _mecha_var22 + _mecha_var24 = 789 + _mecha_rebind = _mecha_helper_get_rebind(b) + b = _mecha_var24 + if _mecha_rebind is not None: + b = _mecha_rebind(b) + _mecha_var25 = a + _mecha_rebind = _mecha_helper_get_rebind(b) + b = _mecha_var25 + if _mecha_rebind is not None: + b = _mecha_rebind(b) +_mecha_var27 = _mecha_helper_replace(_mecha_refs[10], commands=_mecha_helper_children(_mecha_var26)) +--- +output = _mecha_var27 +--- +_mecha_refs[0] + + location: SourceLocation(pos=167, lineno=6, colno=38) + end_location: SourceLocation(pos=176, lineno=6, colno=47) + prefix: None + converter: 'entity' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=186, lineno=6, colno=57) + end_location: SourceLocation(pos=194, lineno=6, colno=65) + prefix: None + converter: 'entity' + value: + +_mecha_refs[2] + + location: SourceLocation(pos=177, lineno=6, colno=48) + end_location: SourceLocation(pos=183, lineno=6, colno=54) + value: 'global' +_mecha_refs[3] + + location: SourceLocation(pos=184, lineno=6, colno=55) + end_location: SourceLocation(pos=185, lineno=6, colno=56) + value: '=' +_mecha_refs[4] + + location: SourceLocation(pos=195, lineno=6, colno=66) + end_location: SourceLocation(pos=201, lineno=6, colno=72) + value: 'global' +_mecha_refs[5] + + location: SourceLocation(pos=138, lineno=6, colno=9) + end_location: SourceLocation(pos=201, lineno=6, colno=72) + identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' + arguments: + + + + + +_mecha_refs[6] + + location: SourceLocation(pos=243, lineno=8, colno=32) + end_location: SourceLocation(pos=252, lineno=8, colno=41) + prefix: None + converter: 'entity' + value: + +_mecha_refs[7] + + location: SourceLocation(pos=260, lineno=8, colno=49) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + prefix: None + converter: 'numeric' + value: + +_mecha_refs[8] + + location: SourceLocation(pos=253, lineno=8, colno=42) + end_location: SourceLocation(pos=259, lineno=8, colno=48) + value: 'global' +_mecha_refs[9] + + location: SourceLocation(pos=220, lineno=8, colno=9) + end_location: SourceLocation(pos=263, lineno=8, colno=52) + identifier: 'scoreboard:players:set:targets:objective:score' + arguments: + + + +_mecha_refs[10] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=461, lineno=20, colno=1) + commands: + + + + + + + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt new file mode 100644 index 000000000..ee6023bc2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt @@ -0,0 +1,232 @@ +def Counter(x=0): + def incr(): + nonlocal x + x += 1 + return x + return {"incr": incr} + +counter = Counter() +say counter.incr() +say counter.incr() +say Counter(9).incr() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=192, lineno=12, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=110, lineno=6, colno=26) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + name: 'Counter' + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + name: 'x' + default: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 0 + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=110, lineno=6, colno=26) + commands: + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=84, lineno=5, colno=17) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=26, lineno=2, colno=9) + end_location: SourceLocation(pos=32, lineno=2, colno=15) + name: 'incr' + arguments: + + + location: SourceLocation(pos=42, lineno=3, colno=9) + end_location: SourceLocation(pos=84, lineno=5, colno=17) + commands: + + location: SourceLocation(pos=42, lineno=3, colno=9) + end_location: SourceLocation(pos=52, lineno=3, colno=19) + identifier: 'nonlocal:subcommand' + arguments: + + location: SourceLocation(pos=51, lineno=3, colno=18) + end_location: SourceLocation(pos=52, lineno=3, colno=19) + identifier: 'nonlocal:name' + arguments: + + location: SourceLocation(pos=51, lineno=3, colno=18) + end_location: SourceLocation(pos=52, lineno=3, colno=19) + value: 'x' + + location: SourceLocation(pos=61, lineno=4, colno=9) + end_location: SourceLocation(pos=67, lineno=4, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=61, lineno=4, colno=9) + end_location: SourceLocation(pos=67, lineno=4, colno=15) + operator: '+=' + target: + + location: SourceLocation(pos=61, lineno=4, colno=9) + end_location: SourceLocation(pos=62, lineno=4, colno=10) + value: 'x' + rebind: True + value: + + location: SourceLocation(pos=66, lineno=4, colno=14) + end_location: SourceLocation(pos=67, lineno=4, colno=15) + value: 1 + + location: SourceLocation(pos=76, lineno=5, colno=9) + end_location: SourceLocation(pos=84, lineno=5, colno=17) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=83, lineno=5, colno=16) + end_location: SourceLocation(pos=84, lineno=5, colno=17) + value: 'x' + + location: SourceLocation(pos=89, lineno=6, colno=5) + end_location: SourceLocation(pos=110, lineno=6, colno=26) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=96, lineno=6, colno=12) + end_location: SourceLocation(pos=110, lineno=6, colno=26) + items: + + location: SourceLocation(pos=97, lineno=6, colno=13) + end_location: SourceLocation(pos=109, lineno=6, colno=25) + key: + + location: SourceLocation(pos=97, lineno=6, colno=13) + end_location: SourceLocation(pos=103, lineno=6, colno=19) + value: 'incr' + value: + + location: SourceLocation(pos=105, lineno=6, colno=21) + end_location: SourceLocation(pos=109, lineno=6, colno=25) + value: 'incr' + + location: SourceLocation(pos=112, lineno=8, colno=1) + end_location: SourceLocation(pos=131, lineno=8, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=112, lineno=8, colno=1) + end_location: SourceLocation(pos=131, lineno=8, colno=20) + operator: '=' + target: + + location: SourceLocation(pos=112, lineno=8, colno=1) + end_location: SourceLocation(pos=119, lineno=8, colno=8) + value: 'counter' + rebind: False + value: + + location: SourceLocation(pos=122, lineno=8, colno=11) + end_location: SourceLocation(pos=131, lineno=8, colno=20) + value: + + location: SourceLocation(pos=122, lineno=8, colno=11) + end_location: SourceLocation(pos=129, lineno=8, colno=18) + value: 'Counter' + arguments: + + + location: SourceLocation(pos=132, lineno=9, colno=1) + end_location: SourceLocation(pos=150, lineno=9, colno=19) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=136, lineno=9, colno=5) + end_location: SourceLocation(pos=150, lineno=9, colno=19) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=136, lineno=9, colno=5) + end_location: SourceLocation(pos=150, lineno=9, colno=19) + value: + + location: SourceLocation(pos=136, lineno=9, colno=5) + end_location: SourceLocation(pos=148, lineno=9, colno=17) + name: 'incr' + value: + + location: SourceLocation(pos=136, lineno=9, colno=5) + end_location: SourceLocation(pos=143, lineno=9, colno=12) + value: 'counter' + arguments: + + + location: SourceLocation(pos=151, lineno=10, colno=1) + end_location: SourceLocation(pos=169, lineno=10, colno=19) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=155, lineno=10, colno=5) + end_location: SourceLocation(pos=169, lineno=10, colno=19) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=155, lineno=10, colno=5) + end_location: SourceLocation(pos=169, lineno=10, colno=19) + value: + + location: SourceLocation(pos=155, lineno=10, colno=5) + end_location: SourceLocation(pos=167, lineno=10, colno=17) + name: 'incr' + value: + + location: SourceLocation(pos=155, lineno=10, colno=5) + end_location: SourceLocation(pos=162, lineno=10, colno=12) + value: 'counter' + arguments: + + + location: SourceLocation(pos=170, lineno=11, colno=1) + end_location: SourceLocation(pos=191, lineno=11, colno=22) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=174, lineno=11, colno=5) + end_location: SourceLocation(pos=191, lineno=11, colno=22) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=174, lineno=11, colno=5) + end_location: SourceLocation(pos=191, lineno=11, colno=22) + value: + + location: SourceLocation(pos=174, lineno=11, colno=5) + end_location: SourceLocation(pos=189, lineno=11, colno=20) + name: 'incr' + value: + + location: SourceLocation(pos=174, lineno=11, colno=5) + end_location: SourceLocation(pos=184, lineno=11, colno=15) + value: + + location: SourceLocation(pos=174, lineno=11, colno=5) + end_location: SourceLocation(pos=181, lineno=11, colno=12) + value: 'Counter' + arguments: + + location: SourceLocation(pos=182, lineno=11, colno=13) + end_location: SourceLocation(pos=183, lineno=11, colno=14) + value: 9 + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt new file mode 100644 index 000000000..b61eb81b3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt @@ -0,0 +1,104 @@ +_mecha_lineno = [1, 14, 16, 20, 23, 26, 29, 34, 39], [1, 3, 4, 5, 6, 8, 9, 10, 11] +_mecha_helper_missing = _mecha_runtime.helpers['missing'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var11: + def Counter(x=_mecha_helper_missing): + if x is _mecha_helper_missing: + _mecha_var0 = 0 + x = _mecha_var0 + def incr(): + nonlocal x + _mecha_var1 = 1 + _mecha_rebind = _mecha_helper_get_rebind(x) + x += _mecha_var1 + if _mecha_rebind is not None: + x = _mecha_rebind(x) + _mecha_var2 = x + return _mecha_var2 + _mecha_var3 = 'incr' + _mecha_var4 = incr + _mecha_var5 = {_mecha_var3: _mecha_var4} + return _mecha_var5 + _mecha_var6 = Counter + _mecha_var6 = _mecha_var6() + counter = _mecha_var6 + _mecha_var7 = counter + _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'incr') + _mecha_var7 = _mecha_var7() + _mecha_var7 = _mecha_helper_interpolate_message(_mecha_var7, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var7]))) + _mecha_var8 = counter + _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'incr') + _mecha_var8 = _mecha_var8() + _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[2]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var8]))) + _mecha_var9 = Counter + _mecha_var10 = 9 + _mecha_var9 = _mecha_var9(_mecha_var10) + _mecha_var9 = _mecha_helper_get_attribute(_mecha_var9, 'incr') + _mecha_var9 = _mecha_var9() + _mecha_var9 = _mecha_helper_interpolate_message(_mecha_var9, _mecha_refs[4]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var9]))) +_mecha_var12 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var11)) +--- +output = _mecha_var12 +--- +_mecha_refs[0] + + location: SourceLocation(pos=136, lineno=9, colno=5) + end_location: SourceLocation(pos=150, lineno=9, colno=19) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=132, lineno=9, colno=1) + end_location: SourceLocation(pos=150, lineno=9, colno=19) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=155, lineno=10, colno=5) + end_location: SourceLocation(pos=169, lineno=10, colno=19) + prefix: None + converter: 'message' + value: + +_mecha_refs[3] + + location: SourceLocation(pos=151, lineno=10, colno=1) + end_location: SourceLocation(pos=169, lineno=10, colno=19) + identifier: 'say:message' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=174, lineno=11, colno=5) + end_location: SourceLocation(pos=191, lineno=11, colno=22) + prefix: None + converter: 'message' + value: + +_mecha_refs[5] + + location: SourceLocation(pos=170, lineno=11, colno=1) + end_location: SourceLocation(pos=191, lineno=11, colno=22) + identifier: 'say:message' + arguments: + +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=192, lineno=12, colno=1) + commands: + + + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_195__0.txt b/packages/bolt/tests/snapshots/bolt__parse_195__0.txt new file mode 100644 index 000000000..47b76fd5c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_195__0.txt @@ -0,0 +1,9 @@ +for i in range(3): +#>ERROR Identifier 'parent' is not defined. +# line 2, column 5 +# 1 | for i in range(3): +# 2 | parent[i] = f"param{i}" +# : ^^^^^^ +# Notes: +# - Expected assignment but got literal '[i]'. + parent[i] = f"param{i}" diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt new file mode 100644 index 000000000..6843813fd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt @@ -0,0 +1,101 @@ +def foo(value): + if value: + result = 1 + else: + result = 0 + return result +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'value' + default: None + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=8) + end_location: SourceLocation(pos=28, lineno=2, colno=13) + value: 'value' + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + commands: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=44, lineno=3, colno=15) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=47, lineno=3, colno=18) + end_location: SourceLocation(pos=48, lineno=3, colno=19) + value: 1 + + location: SourceLocation(pos=53, lineno=4, colno=5) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + commands: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=67, lineno=5, colno=9) + end_location: SourceLocation(pos=73, lineno=5, colno=15) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=76, lineno=5, colno=18) + end_location: SourceLocation(pos=77, lineno=5, colno=19) + value: 0 + + location: SourceLocation(pos=82, lineno=6, colno=5) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=89, lineno=6, colno=12) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + value: 'result' diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__1.txt b/packages/bolt/tests/snapshots/bolt__parse_196__1.txt new file mode 100644 index 000000000..4cfbb56a7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_196__1.txt @@ -0,0 +1,29 @@ +_mecha_lineno = [1, 8, 12, 17, 18], [1, 2, 3, 5, 6] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + def foo(value): + _mecha_var0 = value + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = 1 + result = _mecha_var1 + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 0 + result = _mecha_var2 + _mecha_var3 = result + return _mecha_var3 +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=95, lineno=6, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt new file mode 100644 index 000000000..fca0e7fba --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt @@ -0,0 +1,122 @@ +def foo(value): + result = "init" + if value: + result = 1 + else: + result = 0 + return result +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'value' + default: None + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=35, lineno=2, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=35, lineno=2, colno=20) + operator: '=' + target: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=11) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=29, lineno=2, colno=14) + end_location: SourceLocation(pos=35, lineno=2, colno=20) + value: 'init' + + location: SourceLocation(pos=40, lineno=3, colno=5) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=43, lineno=3, colno=8) + end_location: SourceLocation(pos=48, lineno=3, colno=13) + value: 'value' + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + commands: + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=58, lineno=4, colno=9) + end_location: SourceLocation(pos=64, lineno=4, colno=15) + value: 'result' + rebind: True + value: + + location: SourceLocation(pos=67, lineno=4, colno=18) + end_location: SourceLocation(pos=68, lineno=4, colno=19) + value: 1 + + location: SourceLocation(pos=73, lineno=5, colno=5) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + commands: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=87, lineno=6, colno=9) + end_location: SourceLocation(pos=93, lineno=6, colno=15) + value: 'result' + rebind: True + value: + + location: SourceLocation(pos=96, lineno=6, colno=18) + end_location: SourceLocation(pos=97, lineno=6, colno=19) + value: 0 + + location: SourceLocation(pos=102, lineno=7, colno=5) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=109, lineno=7, colno=12) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + value: 'result' diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__1.txt b/packages/bolt/tests/snapshots/bolt__parse_197__1.txt new file mode 100644 index 000000000..e6af3f78c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_197__1.txt @@ -0,0 +1,38 @@ +_mecha_lineno = [1, 10, 11, 15, 23, 27], [1, 2, 3, 4, 6, 7] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + def foo(value): + _mecha_var0 = 'init' + result = _mecha_var0 + _mecha_var1 = value + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var2 = 1 + _mecha_rebind = _mecha_helper_get_rebind(result) + result = _mecha_var2 + if _mecha_rebind is not None: + result = _mecha_rebind(result) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 0 + _mecha_rebind = _mecha_helper_get_rebind(result) + result = _mecha_var3 + if _mecha_rebind is not None: + result = _mecha_rebind(result) + _mecha_var4 = result + return _mecha_var4 +_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=115, lineno=7, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt new file mode 100644 index 000000000..90a11d582 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt @@ -0,0 +1,42 @@ +tag_name = foo:bar +function #tag_name +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'tag_name' + rebind: False + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 'foo:bar' + + location: SourceLocation(pos=19, lineno=2, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + prefix: '#' + converter: 'resource_location' + value: + + location: SourceLocation(pos=29, lineno=2, colno=11) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + value: 'tag_name' diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt new file mode 100644 index 000000000..d57eb3993 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt @@ -0,0 +1,36 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'foo:bar' + tag_name = _mecha_var0 + _mecha_var1 = tag_name + _mecha_var1 = _mecha_helper_interpolate_resource_location(f'#{_mecha_var1}', _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + prefix: '#' + converter: 'resource_location' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=19, lineno=2, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + identifier: 'function:name' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=2, colno=19) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_199__0.txt b/packages/bolt/tests/snapshots/bolt__parse_199__0.txt new file mode 100644 index 000000000..502c83c4a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_199__0.txt @@ -0,0 +1,195 @@ +for a in [False, True]: + for b in [False, True]: + for c in [False, True]: + for d in [False, True]: + print((a and b or c and not d) in [True] not in [False]) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=193, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'a' + rebind: False + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + items: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: False + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: True + + location: SourceLocation(pos=28, lineno=2, colno=5) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + commands: + + location: SourceLocation(pos=28, lineno=2, colno=5) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=32, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=10) + value: 'b' + rebind: False + + location: SourceLocation(pos=37, lineno=2, colno=14) + end_location: SourceLocation(pos=50, lineno=2, colno=27) + items: + + location: SourceLocation(pos=38, lineno=2, colno=15) + end_location: SourceLocation(pos=43, lineno=2, colno=20) + value: False + + location: SourceLocation(pos=45, lineno=2, colno=22) + end_location: SourceLocation(pos=49, lineno=2, colno=26) + value: True + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + commands: + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=65, lineno=3, colno=14) + value: 'c' + rebind: False + + location: SourceLocation(pos=69, lineno=3, colno=18) + end_location: SourceLocation(pos=82, lineno=3, colno=31) + items: + + location: SourceLocation(pos=70, lineno=3, colno=19) + end_location: SourceLocation(pos=75, lineno=3, colno=24) + value: False + + location: SourceLocation(pos=77, lineno=3, colno=26) + end_location: SourceLocation(pos=81, lineno=3, colno=30) + value: True + + location: SourceLocation(pos=96, lineno=4, colno=13) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + commands: + + location: SourceLocation(pos=96, lineno=4, colno=13) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=100, lineno=4, colno=17) + end_location: SourceLocation(pos=101, lineno=4, colno=18) + value: 'd' + rebind: False + + location: SourceLocation(pos=105, lineno=4, colno=22) + end_location: SourceLocation(pos=118, lineno=4, colno=35) + items: + + location: SourceLocation(pos=106, lineno=4, colno=23) + end_location: SourceLocation(pos=111, lineno=4, colno=28) + value: False + + location: SourceLocation(pos=113, lineno=4, colno=30) + end_location: SourceLocation(pos=117, lineno=4, colno=34) + value: True + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + commands: + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=192, lineno=5, colno=73) + value: + + location: SourceLocation(pos=136, lineno=5, colno=17) + end_location: SourceLocation(pos=141, lineno=5, colno=22) + value: 'print' + arguments: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=191, lineno=5, colno=72) + operator: 'not_in' + left: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=176, lineno=5, colno=57) + operator: 'in' + left: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + operator: 'or' + left: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=150, lineno=5, colno=31) + operator: 'and' + left: + + location: SourceLocation(pos=143, lineno=5, colno=24) + end_location: SourceLocation(pos=144, lineno=5, colno=25) + value: 'a' + right: + + location: SourceLocation(pos=149, lineno=5, colno=30) + end_location: SourceLocation(pos=150, lineno=5, colno=31) + value: 'b' + right: + + location: SourceLocation(pos=154, lineno=5, colno=35) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + operator: 'and' + left: + + location: SourceLocation(pos=154, lineno=5, colno=35) + end_location: SourceLocation(pos=155, lineno=5, colno=36) + value: 'c' + right: + + location: SourceLocation(pos=160, lineno=5, colno=41) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + operator: 'not' + value: + + location: SourceLocation(pos=164, lineno=5, colno=45) + end_location: SourceLocation(pos=165, lineno=5, colno=46) + value: 'd' + right: + + location: SourceLocation(pos=170, lineno=5, colno=51) + end_location: SourceLocation(pos=176, lineno=5, colno=57) + items: + + location: SourceLocation(pos=171, lineno=5, colno=52) + end_location: SourceLocation(pos=175, lineno=5, colno=56) + value: True + right: + + location: SourceLocation(pos=184, lineno=5, colno=65) + end_location: SourceLocation(pos=191, lineno=5, colno=72) + items: + + location: SourceLocation(pos=185, lineno=5, colno=66) + end_location: SourceLocation(pos=190, lineno=5, colno=71) + value: False diff --git a/packages/bolt/tests/snapshots/bolt__parse_199__1.txt b/packages/bolt/tests/snapshots/bolt__parse_199__1.txt new file mode 100644 index 000000000..514ace72a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_199__1.txt @@ -0,0 +1,88 @@ +_mecha_lineno = [1, 17, 21, 25, 27], [1, 2, 3, 4, 5] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] +_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var27: + _mecha_var0 = False + _mecha_var1 = True + _mecha_var2 = [_mecha_var0, _mecha_var1] + for a in _mecha_var2: + _mecha_var3 = False + _mecha_var4 = True + _mecha_var5 = [_mecha_var3, _mecha_var4] + for b in _mecha_var5: + _mecha_var6 = False + _mecha_var7 = True + _mecha_var8 = [_mecha_var6, _mecha_var7] + for c in _mecha_var8: + _mecha_var9 = False + _mecha_var10 = True + _mecha_var11 = [_mecha_var9, _mecha_var10] + for d in _mecha_var11: + _mecha_var12 = print + _mecha_var13 = a + _mecha_var14 = _mecha_var13 + _mecha_var15 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var15 is not None: + _mecha_var13 = _mecha_var15() + with _mecha_helper_branch(_mecha_var14) as _mecha_condition: + if _mecha_condition: + _mecha_var16 = b + if _mecha_var15 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var16 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var16 + _mecha_var17 = _mecha_helper_operator_not(_mecha_var13) + _mecha_var18 = _mecha_helper_get_dup(_mecha_var13) + if _mecha_var18 is not None: + _mecha_var13 = _mecha_var18() + with _mecha_helper_branch(_mecha_var17) as _mecha_condition: + if _mecha_condition: + _mecha_var19 = c + _mecha_var20 = _mecha_var19 + _mecha_var21 = _mecha_helper_get_dup(_mecha_var19) + if _mecha_var21 is not None: + _mecha_var19 = _mecha_var21() + with _mecha_helper_branch(_mecha_var20) as _mecha_condition: + if _mecha_condition: + _mecha_var22 = d + _mecha_var22 = _mecha_helper_operator_not(_mecha_var22) + if _mecha_var21 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var19) + _mecha_var19 = _mecha_var22 + if _mecha_rebind is not None: + _mecha_var19 = _mecha_rebind(_mecha_var19) + else: + _mecha_var19 = _mecha_var22 + if _mecha_var18 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) + _mecha_var13 = _mecha_var19 + if _mecha_rebind is not None: + _mecha_var13 = _mecha_rebind(_mecha_var13) + else: + _mecha_var13 = _mecha_var19 + _mecha_var23 = True + _mecha_var24 = [_mecha_var23] + _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var24) + _mecha_var25 = False + _mecha_var26 = [_mecha_var25] + _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var26) + _mecha_var12 = _mecha_var12(_mecha_var13) +_mecha_var28 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var27)) +--- +output = _mecha_var28 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=193, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_19__0.txt b/packages/bolt/tests/snapshots/bolt__parse_19__0.txt new file mode 100644 index 000000000..d580f0754 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_19__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got literal '%3'. +# line 1, column 6 +# 1 | 17 % %3 +# : ^^ +17 % %3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_1__0.txt b/packages/bolt/tests/snapshots/bolt__parse_1__0.txt new file mode 100644 index 000000000..0b64fb026 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_1__0.txt @@ -0,0 +1,15 @@ +123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 123 diff --git a/packages/bolt/tests/snapshots/bolt__parse_1__1.txt b/packages/bolt/tests/snapshots/bolt__parse_1__1.txt new file mode 100644 index 000000000..d99c0bbb0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_1__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 123 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt new file mode 100644 index 000000000..7d6270463 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt @@ -0,0 +1,11 @@ +a = 1 +def f(): +#>ERROR Identifier 'a' is not defined. +# line 3, column 5 +# 2 | def f(): +# 3 | a += 1 +# : ^ +# Notes: +# - Use 'global a' or 'nonlocal a' to mutate the variable defined in outer scope. +# - Expected assignment, eof or newline but got literal '+='. + a += 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_20__0.txt b/packages/bolt/tests/snapshots/bolt__parse_20__0.txt new file mode 100644 index 000000000..ad5545a0f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_20__0.txt @@ -0,0 +1,35 @@ +True and (False or True) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: 'and' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True + right: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + operator: 'or' + left: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: False + right: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: True diff --git a/packages/bolt/tests/snapshots/bolt__parse_20__1.txt b/packages/bolt/tests/snapshots/bolt__parse_20__1.txt new file mode 100644 index 000000000..441752d1a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_20__1.txt @@ -0,0 +1,47 @@ +_mecha_lineno = [1], [1] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var7: + _mecha_var0 = True + _mecha_var1 = _mecha_var0 + _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) + if _mecha_var2 is not None: + _mecha_var0 = _mecha_var2() + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = False + _mecha_var4 = _mecha_helper_operator_not(_mecha_var3) + _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) + if _mecha_var5 is not None: + _mecha_var3 = _mecha_var5() + with _mecha_helper_branch(_mecha_var4) as _mecha_condition: + if _mecha_condition: + _mecha_var6 = True + if _mecha_var5 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) + _mecha_var3 = _mecha_var6 + if _mecha_rebind is not None: + _mecha_var3 = _mecha_rebind(_mecha_var3) + else: + _mecha_var3 = _mecha_var6 + if _mecha_var2 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) + _mecha_var0 = _mecha_var3 + if _mecha_rebind is not None: + _mecha_var0 = _mecha_rebind(_mecha_var0) + else: + _mecha_var0 = _mecha_var3 +_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) +--- +output = _mecha_var8 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_21__0.txt b/packages/bolt/tests/snapshots/bolt__parse_21__0.txt new file mode 100644 index 000000000..a267df1d1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_21__0.txt @@ -0,0 +1,15 @@ +"this" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'this' diff --git a/packages/bolt/tests/snapshots/bolt__parse_21__1.txt b/packages/bolt/tests/snapshots/bolt__parse_21__1.txt new file mode 100644 index 000000000..cc5b6faac --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_21__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'this' +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_22__0.txt b/packages/bolt/tests/snapshots/bolt__parse_22__0.txt new file mode 100644 index 000000000..52c19be2e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_22__0.txt @@ -0,0 +1,15 @@ +"this\nthat" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'this\nthat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_22__1.txt b/packages/bolt/tests/snapshots/bolt__parse_22__1.txt new file mode 100644 index 000000000..7e41941ab --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_22__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'this\nthat' +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_23__0.txt b/packages/bolt/tests/snapshots/bolt__parse_23__0.txt new file mode 100644 index 000000000..06d7c0978 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_23__0.txt @@ -0,0 +1,15 @@ +"\"\u2588this\nthat" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: '"█this\nthat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_23__1.txt b/packages/bolt/tests/snapshots/bolt__parse_23__1.txt new file mode 100644 index 000000000..778b55ec5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_23__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = '"█this\nthat' +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_24__0.txt b/packages/bolt/tests/snapshots/bolt__parse_24__0.txt new file mode 100644 index 000000000..033806fa7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_24__0.txt @@ -0,0 +1,15 @@ +'' +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: '' diff --git a/packages/bolt/tests/snapshots/bolt__parse_24__1.txt b/packages/bolt/tests/snapshots/bolt__parse_24__1.txt new file mode 100644 index 000000000..41fde0c90 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_24__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = '' +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_25__0.txt b/packages/bolt/tests/snapshots/bolt__parse_25__0.txt new file mode 100644 index 000000000..7eae7fea4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_25__0.txt @@ -0,0 +1,15 @@ +'"\'"' +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: '"\'"' diff --git a/packages/bolt/tests/snapshots/bolt__parse_25__1.txt b/packages/bolt/tests/snapshots/bolt__parse_25__1.txt new file mode 100644 index 000000000..93429b164 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_25__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = '"\'"' +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_26__0.txt b/packages/bolt/tests/snapshots/bolt__parse_26__0.txt new file mode 100644 index 000000000..7f9fa4204 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_26__0.txt @@ -0,0 +1,15 @@ +'something \t\f\n\\\'here' +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: "something \t\x0c\n\\'here" diff --git a/packages/bolt/tests/snapshots/bolt__parse_26__1.txt b/packages/bolt/tests/snapshots/bolt__parse_26__1.txt new file mode 100644 index 000000000..15778dfaf --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_26__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = "something \t\x0c\n\\'here" +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_27__0.txt b/packages/bolt/tests/snapshots/bolt__parse_27__0.txt new file mode 100644 index 000000000..c8a617445 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_27__0.txt @@ -0,0 +1,5 @@ +#>ERROR Invalid escape sequence \". +# line 1, column 5 +# 1 | 'abc\"' +# : ^^ +'abc\"' diff --git a/packages/bolt/tests/snapshots/bolt__parse_28__0.txt b/packages/bolt/tests/snapshots/bolt__parse_28__0.txt new file mode 100644 index 000000000..dddee99be --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_28__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected eof or newline but got literal '"hey"'. +# line 1, column 7 +# 1 | "hey" "hey" +# : ^^^^^ +"hey" "hey" diff --git a/packages/bolt/tests/snapshots/bolt__parse_29__0.txt b/packages/bolt/tests/snapshots/bolt__parse_29__0.txt new file mode 100644 index 000000000..42ac39ccb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_29__0.txt @@ -0,0 +1,15 @@ +None +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_29__1.txt b/packages/bolt/tests/snapshots/bolt__parse_29__1.txt new file mode 100644 index 000000000..ec5e89c25 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_29__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = None +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_2__0.txt b/packages/bolt/tests/snapshots/bolt__parse_2__0.txt new file mode 100644 index 000000000..60151a40a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_2__0.txt @@ -0,0 +1,15 @@ +123.456 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 123.456 diff --git a/packages/bolt/tests/snapshots/bolt__parse_2__1.txt b/packages/bolt/tests/snapshots/bolt__parse_2__1.txt new file mode 100644 index 000000000..3bda36983 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_2__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 123.456 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_30__0.txt b/packages/bolt/tests/snapshots/bolt__parse_30__0.txt new file mode 100644 index 000000000..388d21465 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_30__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 +# 1 | foo +# : ^^^ +# Notes: +# - Expected assignment but got newline '\n'. +foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_31__0.txt b/packages/bolt/tests/snapshots/bolt__parse_31__0.txt new file mode 100644 index 000000000..a9a51d480 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_31__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 11 +# 1 | "hello" + foo +# : ^^^ +"hello" + foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_32__0.txt b/packages/bolt/tests/snapshots/bolt__parse_32__0.txt new file mode 100644 index 000000000..7a5f2abd9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_32__0.txt @@ -0,0 +1,36 @@ +foo = 1 +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_32__1.txt b/packages/bolt/tests/snapshots/bolt__parse_32__1.txt new file mode 100644 index 000000000..0485fcdbb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_32__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1, 7], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + foo = _mecha_var0 + _mecha_var1 = foo +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_33__0.txt b/packages/bolt/tests/snapshots/bolt__parse_33__0.txt new file mode 100644 index 000000000..207faeabc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_33__0.txt @@ -0,0 +1,46 @@ +foo = 1 +"hello" + foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + operator: '+' + left: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=8) + value: 'hello' + right: + + location: SourceLocation(pos=18, lineno=2, colno=11) + end_location: SourceLocation(pos=21, lineno=2, colno=14) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_33__1.txt b/packages/bolt/tests/snapshots/bolt__parse_33__1.txt new file mode 100644 index 000000000..d563e36eb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_33__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + foo = _mecha_var0 + _mecha_var1 = 'hello' + _mecha_var2 = foo + _mecha_var1 = _mecha_var1 + _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_34__0.txt b/packages/bolt/tests/snapshots/bolt__parse_34__0.txt new file mode 100644 index 000000000..13e402a2b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_34__0.txt @@ -0,0 +1,71 @@ +a = 1 +if a == 1: + a = 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=10) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=4) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + operator: '==' + left: + + location: SourceLocation(pos=9, lineno=2, colno=4) + end_location: SourceLocation(pos=10, lineno=2, colno=5) + value: 'a' + right: + + location: SourceLocation(pos=14, lineno=2, colno=9) + end_location: SourceLocation(pos=15, lineno=2, colno=10) + value: 1 + + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=10) + commands: + + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=21, lineno=3, colno=5) + end_location: SourceLocation(pos=22, lineno=3, colno=6) + value: 'a' + rebind: True + value: + + location: SourceLocation(pos=25, lineno=3, colno=9) + end_location: SourceLocation(pos=26, lineno=3, colno=10) + value: 0 diff --git a/packages/bolt/tests/snapshots/bolt__parse_34__1.txt b/packages/bolt/tests/snapshots/bolt__parse_34__1.txt new file mode 100644 index 000000000..566977c24 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_34__1.txt @@ -0,0 +1,29 @@ +_mecha_lineno = [1, 9, 15], [1, 2, 3] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 1 + a = _mecha_var0 + _mecha_var1 = a + _mecha_var2 = 1 + _mecha_var1 = _mecha_var1 == _mecha_var2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_var3 = 0 + _mecha_rebind = _mecha_helper_get_rebind(a) + a = _mecha_var3 + if _mecha_rebind is not None: + a = _mecha_rebind(a) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_35__0.txt b/packages/bolt/tests/snapshots/bolt__parse_35__0.txt new file mode 100644 index 000000000..46d749f9b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_35__0.txt @@ -0,0 +1,104 @@ +if True: + say hello +elif True or False: + say hello +else: + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=3, lineno=1, colno=4) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: True + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=56, lineno=4, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=28, lineno=3, colno=6) + end_location: SourceLocation(pos=41, lineno=3, colno=19) + operator: 'or' + left: + + location: SourceLocation(pos=28, lineno=3, colno=6) + end_location: SourceLocation(pos=32, lineno=3, colno=10) + value: True + right: + + location: SourceLocation(pos=36, lineno=3, colno=14) + end_location: SourceLocation(pos=41, lineno=3, colno=19) + value: False + + location: SourceLocation(pos=47, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=14) + commands: + + location: SourceLocation(pos=47, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=51, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=14) + fragments: + + location: SourceLocation(pos=51, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=14) + value: 'hello' + + location: SourceLocation(pos=57, lineno=5, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + identifier: 'else:body' + arguments: + + location: SourceLocation(pos=67, lineno=6, colno=5) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=67, lineno=6, colno=5) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=71, lineno=6, colno=9) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=71, lineno=6, colno=9) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_35__1.txt b/packages/bolt/tests/snapshots/bolt__parse_35__1.txt new file mode 100644 index 000000000..79aefa85a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_35__1.txt @@ -0,0 +1,66 @@ +_mecha_lineno = [1, 17], [1, 3] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] +_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = True + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_var1 = True + _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) + _mecha_var3 = _mecha_helper_get_dup(_mecha_var1) + if _mecha_var3 is not None: + _mecha_var1 = _mecha_var3() + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_var4 = False + if _mecha_var3 is not None: + _mecha_rebind = _mecha_helper_get_rebind(_mecha_var1) + _mecha_var1 = _mecha_var4 + if _mecha_rebind is not None: + _mecha_var1 = _mecha_rebind(_mecha_var1) + else: + _mecha_var1 = _mecha_var4 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[2].commands) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=47, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=14) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=67, lineno=6, colno=5) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + commands: + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=76, lineno=6, colno=14) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_36__0.txt b/packages/bolt/tests/snapshots/bolt__parse_36__0.txt new file mode 100644 index 000000000..0c8f7208a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_36__0.txt @@ -0,0 +1,12 @@ +if True: + say hello +elif True or False: + say hello +#>ERROR Expected colon but got literal '"blah"'. +# line 5, column 6 +# 4 | say hello +# 5 | else "blah": +# : ^^^^^^ +# 6 | say hello +else "blah": + say hello diff --git a/packages/bolt/tests/snapshots/bolt__parse_37__0.txt b/packages/bolt/tests/snapshots/bolt__parse_37__0.txt new file mode 100644 index 000000000..be30965f2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_37__0.txt @@ -0,0 +1,12 @@ +if True: + say hello +a = 1 +#>ERROR Conditional branch must be part of an if statement. +# line 4, column 1 +# 2 | say hello +# 3 | a = 1 +# 4 | else: +# : ^^^^^ +# 5 | say hello +else: + say hello diff --git a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt new file mode 100644 index 000000000..de0aadffe --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'block', literal 'blocks' or 9 other tokens but reached end of file. +# line 1, column 3 +# 1 | if +if diff --git a/packages/bolt/tests/snapshots/bolt__parse_39__0.txt b/packages/bolt/tests/snapshots/bolt__parse_39__0.txt new file mode 100644 index 000000000..d8c36d818 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_39__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got newline '\n'. +# line 1, column 12 +# 1 | if True and +if True and diff --git a/packages/bolt/tests/snapshots/bolt__parse_3__0.txt b/packages/bolt/tests/snapshots/bolt__parse_3__0.txt new file mode 100644 index 000000000..712de6e50 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_3__0.txt @@ -0,0 +1,15 @@ +22220099.6667e-3 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 22220.0996667 diff --git a/packages/bolt/tests/snapshots/bolt__parse_3__1.txt b/packages/bolt/tests/snapshots/bolt__parse_3__1.txt new file mode 100644 index 000000000..e3e800c33 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_3__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 22220.0996667 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_40__0.txt b/packages/bolt/tests/snapshots/bolt__parse_40__0.txt new file mode 100644 index 000000000..ab601f22f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_40__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected non-empty block. +# line 1, column 8 +# 1 | if True: +# : ^ +# 2 | say hello +if True: +say hello diff --git a/packages/bolt/tests/snapshots/bolt__parse_41__0.txt b/packages/bolt/tests/snapshots/bolt__parse_41__0.txt new file mode 100644 index 000000000..9287cac1f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_41__0.txt @@ -0,0 +1,33 @@ +while True: + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: True + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=20, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_41__1.txt b/packages/bolt/tests/snapshots/bolt__parse_41__1.txt new file mode 100644 index 000000000..14b1dee42 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_41__1.txt @@ -0,0 +1,23 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = True + while _mecha_var0: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_42__0.txt b/packages/bolt/tests/snapshots/bolt__parse_42__0.txt new file mode 100644 index 000000000..2b5c84f25 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_42__0.txt @@ -0,0 +1,116 @@ +if score @s tmp matches 0: + if "thing" == "bar": + say hello + if "thing" == "foo": + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=50, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=45, lineno=2, colno=19) + end_location: SourceLocation(pos=50, lineno=2, colno=24) + value: 'bar' + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=74, lineno=4, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=77, lineno=4, colno=8) + end_location: SourceLocation(pos=93, lineno=4, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=77, lineno=4, colno=8) + end_location: SourceLocation(pos=84, lineno=4, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=88, lineno=4, colno=19) + end_location: SourceLocation(pos=93, lineno=4, colno=24) + value: 'foo' + + location: SourceLocation(pos=103, lineno=5, colno=9) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=103, lineno=5, colno=9) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=107, lineno=5, colno=13) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=107, lineno=5, colno=13) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_42__1.txt b/packages/bolt/tests/snapshots/bolt__parse_42__1.txt new file mode 100644 index 000000000..004265c21 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_42__1.txt @@ -0,0 +1,90 @@ +_mecha_lineno = [1, 9, 15], [1, 2, 4] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 'thing' + _mecha_var1 = 'bar' + _mecha_var0 = _mecha_var0 == _mecha_var1 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var2 = 'thing' + _mecha_var3 = 'foo' + _mecha_var2 = _mecha_var2 == _mecha_var3 + with _mecha_helper_branch(_mecha_var2) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var4))]))]))]))) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=103, lineno=5, colno=9) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + commands: + + +_mecha_refs[3] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[6] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=112, lineno=5, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_43__0.txt b/packages/bolt/tests/snapshots/bolt__parse_43__0.txt new file mode 100644 index 000000000..20cd9879f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_43__0.txt @@ -0,0 +1,78 @@ +if score @s tmp matches 0: + if "thing" == "foo": + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=50, lineno=2, colno=24) + operator: '==' + left: + + location: SourceLocation(pos=34, lineno=2, colno=8) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: 'thing' + right: + + location: SourceLocation(pos=45, lineno=2, colno=19) + end_location: SourceLocation(pos=50, lineno=2, colno=24) + value: 'foo' + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=64, lineno=3, colno=13) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_43__1.txt b/packages/bolt/tests/snapshots/bolt__parse_43__1.txt new file mode 100644 index 000000000..3a4e67e61 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_43__1.txt @@ -0,0 +1,77 @@ +_mecha_lineno = [1, 9], [1, 2] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'thing' + _mecha_var1 = 'foo' + _mecha_var0 = _mecha_var0 == _mecha_var1 + with _mecha_helper_branch(_mecha_var0) as _mecha_condition: + if _mecha_condition: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2))]))]))]))) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=60, lineno=3, colno=9) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=3, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_44__0.txt b/packages/bolt/tests/snapshots/bolt__parse_44__0.txt new file mode 100644 index 000000000..87e56737b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_44__0.txt @@ -0,0 +1,96 @@ +if score @s tmp matches 0: + while True: + say hello + while True: + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=37, lineno=2, colno=11) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + value: 'hello' + + location: SourceLocation(pos=65, lineno=4, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=71, lineno=4, colno=11) + end_location: SourceLocation(pos=75, lineno=4, colno=15) + value: True + + location: SourceLocation(pos=85, lineno=5, colno=9) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + commands: + + location: SourceLocation(pos=85, lineno=5, colno=9) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=89, lineno=5, colno=13) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + fragments: + + location: SourceLocation(pos=89, lineno=5, colno=13) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt new file mode 100644 index 000000000..046b9e0da --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt @@ -0,0 +1,83 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = True + while _mecha_var0: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var1 = True + while _mecha_var1: + _mecha_runtime.commands.extend(_mecha_refs[1].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2))]))]))]))) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=85, lineno=5, colno=9) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + commands: + + +_mecha_refs[3] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:commands' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[5] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[6] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=94, lineno=5, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_45__0.txt b/packages/bolt/tests/snapshots/bolt__parse_45__0.txt new file mode 100644 index 000000000..84cea55df --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_45__0.txt @@ -0,0 +1,68 @@ +if score @s tmp matches 0: + while True: + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=37, lineno=2, colno=11) + end_location: SourceLocation(pos=41, lineno=2, colno=15) + value: True + + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + fragments: + + location: SourceLocation(pos=55, lineno=3, colno=13) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt new file mode 100644 index 000000000..0fc43d4dd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt @@ -0,0 +1,73 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = True + while _mecha_var0: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1))]))]))]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=51, lineno=3, colno=9) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + +_mecha_refs[2] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:commands' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + min: 0 + max: 0 +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=60, lineno=3, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_46__0.txt b/packages/bolt/tests/snapshots/bolt__parse_46__0.txt new file mode 100644 index 000000000..70836a58f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_46__0.txt @@ -0,0 +1,130 @@ +if score @s tmp matches 42: + count = 42 + while count > 0: + say hello + count = count - 1 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=108, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:commands' + arguments: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=42, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=42, lineno=2, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=2, colno=10) + value: 'count' + rebind: False + value: + + location: SourceLocation(pos=40, lineno=2, colno=13) + end_location: SourceLocation(pos=42, lineno=2, colno=15) + value: 42 + + location: SourceLocation(pos=47, lineno=3, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=62, lineno=3, colno=20) + operator: '>' + left: + + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=58, lineno=3, colno=16) + value: 'count' + right: + + location: SourceLocation(pos=61, lineno=3, colno=19) + end_location: SourceLocation(pos=62, lineno=3, colno=20) + value: 0 + + location: SourceLocation(pos=72, lineno=4, colno=9) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + commands: + + location: SourceLocation(pos=72, lineno=4, colno=9) + end_location: SourceLocation(pos=81, lineno=4, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=76, lineno=4, colno=13) + end_location: SourceLocation(pos=81, lineno=4, colno=18) + fragments: + + location: SourceLocation(pos=76, lineno=4, colno=13) + end_location: SourceLocation(pos=81, lineno=4, colno=18) + value: 'hello' + + location: SourceLocation(pos=90, lineno=5, colno=9) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=90, lineno=5, colno=9) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=90, lineno=5, colno=9) + end_location: SourceLocation(pos=95, lineno=5, colno=14) + value: 'count' + rebind: True + value: + + location: SourceLocation(pos=98, lineno=5, colno=17) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + operator: '-' + left: + + location: SourceLocation(pos=98, lineno=5, colno=17) + end_location: SourceLocation(pos=103, lineno=5, colno=22) + value: 'count' + right: + + location: SourceLocation(pos=106, lineno=5, colno=25) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt new file mode 100644 index 000000000..f88515afd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt @@ -0,0 +1,87 @@ +_mecha_lineno = [1, 8, 9, 14], [1, 2, 3, 5] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var6: + with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = 42 + count = _mecha_var0 + _mecha_var1 = count + _mecha_var2 = 0 + _mecha_var1 = _mecha_var1 > _mecha_var2 + while _mecha_var1: + _mecha_runtime.commands.append(_mecha_refs[0]) + _mecha_var3 = count + _mecha_var4 = 1 + _mecha_var3 = _mecha_var3 - _mecha_var4 + _mecha_rebind = _mecha_helper_get_rebind(count) + count = _mecha_var3 + if _mecha_rebind is not None: + count = _mecha_rebind(count) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var5))]))]))]))) +_mecha_var7 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var6)) +--- +output = _mecha_var7 +--- +_mecha_refs[0] + + location: SourceLocation(pos=72, lineno=4, colno=9) + end_location: SourceLocation(pos=81, lineno=4, colno=18) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + commands: + + +_mecha_refs[2] + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:commands' + arguments: + +_mecha_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'tmp' +_mecha_refs[5] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + min: 42 + max: 42 +_mecha_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + + + +_mecha_refs[7] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=107, lineno=5, colno=26) + identifier: 'execute:subcommand' + arguments: + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=108, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_47__0.txt b/packages/bolt/tests/snapshots/bolt__parse_47__0.txt new file mode 100644 index 000000000..431b8535e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_47__0.txt @@ -0,0 +1,39 @@ +foo = ( + "abc" + + "def" +) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + operator: '+' + left: + + location: SourceLocation(pos=12, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + value: 'abc' + right: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=29, lineno=3, colno=12) + value: 'def' diff --git a/packages/bolt/tests/snapshots/bolt__parse_47__1.txt b/packages/bolt/tests/snapshots/bolt__parse_47__1.txt new file mode 100644 index 000000000..b026a0719 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_47__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1, 7, 8], [1, 2, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'abc' + _mecha_var1 = 'def' + _mecha_var0 = _mecha_var0 + _mecha_var1 + foo = _mecha_var0 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=5, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt new file mode 100644 index 000000000..01c0fa3f3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -0,0 +1,7 @@ +1 * 2 +#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'advancement', literal 'align' or 146 other tokens but got literal '*'. +# line 2, column 1 +# 1 | 1 * 2 +# 2 | * 3 +# : ^ +* 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_49__0.txt b/packages/bolt/tests/snapshots/bolt__parse_49__0.txt new file mode 100644 index 000000000..855fcf859 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_49__0.txt @@ -0,0 +1,35 @@ +true | false | null +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '|' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: True + right: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: False + right: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_49__1.txt b/packages/bolt/tests/snapshots/bolt__parse_49__1.txt new file mode 100644 index 000000000..360708453 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_49__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = True + _mecha_var1 = False + _mecha_var0 = _mecha_var0 | _mecha_var1 + _mecha_var2 = None + _mecha_var0 = _mecha_var0 | _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_4__0.txt b/packages/bolt/tests/snapshots/bolt__parse_4__0.txt new file mode 100644 index 000000000..0ca9e4aff --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_4__0.txt @@ -0,0 +1,15 @@ +0.67e6 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 670000.0 diff --git a/packages/bolt/tests/snapshots/bolt__parse_4__1.txt b/packages/bolt/tests/snapshots/bolt__parse_4__1.txt new file mode 100644 index 000000000..c1e4a6981 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_4__1.txt @@ -0,0 +1,15 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 670000.0 +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_50__0.txt b/packages/bolt/tests/snapshots/bolt__parse_50__0.txt new file mode 100644 index 000000000..36192d1bb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_50__0.txt @@ -0,0 +1,46 @@ +foo = 1 +foo == 1 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + operator: '==' + left: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' + right: + + location: SourceLocation(pos=15, lineno=2, colno=8) + end_location: SourceLocation(pos=16, lineno=2, colno=9) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_50__1.txt b/packages/bolt/tests/snapshots/bolt__parse_50__1.txt new file mode 100644 index 000000000..ece8b868d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_50__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1, 7], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_var2 = 1 + _mecha_var1 = _mecha_var1 == _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_51__0.txt b/packages/bolt/tests/snapshots/bolt__parse_51__0.txt new file mode 100644 index 000000000..3112cf8e1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_51__0.txt @@ -0,0 +1,38 @@ +for c in "abc": + say something +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'c' + rebind: False + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'abc' + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=24, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + fragments: + + location: SourceLocation(pos=24, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + value: 'something' diff --git a/packages/bolt/tests/snapshots/bolt__parse_51__1.txt b/packages/bolt/tests/snapshots/bolt__parse_51__1.txt new file mode 100644 index 000000000..d92f20983 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_51__1.txt @@ -0,0 +1,23 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'abc' + for c in _mecha_var0: + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=2, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_52__0.txt b/packages/bolt/tests/snapshots/bolt__parse_52__0.txt new file mode 100644 index 000000000..27f7819c1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_52__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 7 +# 1 | foo = foo +# : ^^^ +foo = foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_53__0.txt b/packages/bolt/tests/snapshots/bolt__parse_53__0.txt new file mode 100644 index 000000000..8070ef7a8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_53__0.txt @@ -0,0 +1,47 @@ +foo = 1 +foo = foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 1 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=4) + value: 'foo' + rebind: True + value: + + location: SourceLocation(pos=14, lineno=2, colno=7) + end_location: SourceLocation(pos=17, lineno=2, colno=10) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_53__1.txt b/packages/bolt/tests/snapshots/bolt__parse_53__1.txt new file mode 100644 index 000000000..62dfab42e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_53__1.txt @@ -0,0 +1,23 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_rebind = _mecha_helper_get_rebind(foo) + foo = _mecha_var1 + if _mecha_rebind is not None: + foo = _mecha_rebind(foo) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_54__0.txt b/packages/bolt/tests/snapshots/bolt__parse_54__0.txt new file mode 100644 index 000000000..9dc998ba7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_54__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 12 +# 1 | for foo in foo: +# : ^^^ +# 2 | foo = foo +for foo in foo: + foo = foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_55__0.txt b/packages/bolt/tests/snapshots/bolt__parse_55__0.txt new file mode 100644 index 000000000..2be76a96e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_55__0.txt @@ -0,0 +1,45 @@ +for foo in "foo": + foo = foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=14) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 'foo' + rebind: False + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'foo' + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=8) + value: 'foo' + rebind: True + value: + + location: SourceLocation(pos=28, lineno=2, colno=11) + end_location: SourceLocation(pos=31, lineno=2, colno=14) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_55__1.txt b/packages/bolt/tests/snapshots/bolt__parse_55__1.txt new file mode 100644 index 000000000..c998bf9f5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_55__1.txt @@ -0,0 +1,22 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'foo' + for foo in _mecha_var0: + _mecha_var1 = foo + _mecha_rebind = _mecha_helper_get_rebind(foo) + foo = _mecha_var1 + if _mecha_rebind is not None: + foo = _mecha_rebind(foo) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_56__0.txt b/packages/bolt/tests/snapshots/bolt__parse_56__0.txt new file mode 100644 index 000000000..1d4f62438 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_56__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 1 +# 1 | foo += "hey" +# : ^^^ +# Notes: +# - Expected assignment but got literal '+='. +foo += "hey" diff --git a/packages/bolt/tests/snapshots/bolt__parse_57__0.txt b/packages/bolt/tests/snapshots/bolt__parse_57__0.txt new file mode 100644 index 000000000..888a8a921 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_57__0.txt @@ -0,0 +1,47 @@ +foo = "" +foo += "hey" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: '' + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + operator: '+=' + target: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=4) + value: 'foo' + rebind: True + value: + + location: SourceLocation(pos=16, lineno=2, colno=8) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + value: 'hey' diff --git a/packages/bolt/tests/snapshots/bolt__parse_57__1.txt b/packages/bolt/tests/snapshots/bolt__parse_57__1.txt new file mode 100644 index 000000000..87a71f344 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_57__1.txt @@ -0,0 +1,23 @@ +_mecha_lineno = [1, 9], [1, 2] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = '' + foo = _mecha_var0 + _mecha_var1 = 'hey' + _mecha_rebind = _mecha_helper_get_rebind(foo) + foo += _mecha_var1 + if _mecha_rebind is not None: + foo = _mecha_rebind(foo) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt new file mode 100644 index 000000000..428e86669 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'the' is not defined. Did you mean 'hex'? +# line 1, column 7 +# 1 | wat = the = "f" +# : ^^^ +wat = the = "f" diff --git a/packages/bolt/tests/snapshots/bolt__parse_59__0.txt b/packages/bolt/tests/snapshots/bolt__parse_59__0.txt new file mode 100644 index 000000000..881a78c30 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_59__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only use 'break' in loops. +# line 1, column 1 +# 1 | break +# : ^^^^^ +break diff --git a/packages/bolt/tests/snapshots/bolt__parse_5__0.txt b/packages/bolt/tests/snapshots/bolt__parse_5__0.txt new file mode 100644 index 000000000..f2135f396 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_5__0.txt @@ -0,0 +1,25 @@ +1 + 2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_5__1.txt b/packages/bolt/tests/snapshots/bolt__parse_5__1.txt new file mode 100644 index 000000000..1a685ec51 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_5__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + _mecha_var1 = 2 + _mecha_var0 = _mecha_var0 + _mecha_var1 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_60__0.txt b/packages/bolt/tests/snapshots/bolt__parse_60__0.txt new file mode 100644 index 000000000..a2e2bba79 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_60__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only use 'continue' in loops. +# line 1, column 1 +# 1 | continue +# : ^^^^^^^^ +continue diff --git a/packages/bolt/tests/snapshots/bolt__parse_61__0.txt b/packages/bolt/tests/snapshots/bolt__parse_61__0.txt new file mode 100644 index 000000000..b4c290a84 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_61__0.txt @@ -0,0 +1,7 @@ +if true: +#>ERROR Can only use 'break' in loops. +# line 2, column 5 +# 1 | if true: +# 2 | break +# : ^^^^^ + break diff --git a/packages/bolt/tests/snapshots/bolt__parse_62__0.txt b/packages/bolt/tests/snapshots/bolt__parse_62__0.txt new file mode 100644 index 000000000..7c88c3bc3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_62__0.txt @@ -0,0 +1,45 @@ +for i in "": + say hello + continue +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=40, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=3, colno=13) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + rebind: False + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: '' + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=9) + end_location: SourceLocation(pos=26, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=21, lineno=2, colno=9) + end_location: SourceLocation(pos=26, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=31, lineno=3, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=13) + identifier: 'continue' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_62__1.txt b/packages/bolt/tests/snapshots/bolt__parse_62__1.txt new file mode 100644 index 000000000..f7a132010 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_62__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = '' + for i in _mecha_var0: + _mecha_runtime.commands.append(_mecha_refs[0]) + continue +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=14) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=40, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_63__0.txt b/packages/bolt/tests/snapshots/bolt__parse_63__0.txt new file mode 100644 index 000000000..0e563873d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_63__0.txt @@ -0,0 +1,26 @@ +while false: + break +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=10) + identifier: 'while:condition:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: False + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=10) + commands: + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=10) + identifier: 'break' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_63__1.txt b/packages/bolt/tests/snapshots/bolt__parse_63__1.txt new file mode 100644 index 000000000..9b13ae4c7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_63__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = False + while _mecha_var0: + break +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_64__0.txt b/packages/bolt/tests/snapshots/bolt__parse_64__0.txt new file mode 100644 index 000000000..c09bc2369 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_64__0.txt @@ -0,0 +1,55 @@ +for i in "abc": + if i == "b": + break +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=3, colno=14) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'i' + rebind: False + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'abc' + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=14) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=8) + end_location: SourceLocation(pos=31, lineno=2, colno=16) + operator: '==' + left: + + location: SourceLocation(pos=23, lineno=2, colno=8) + end_location: SourceLocation(pos=24, lineno=2, colno=9) + value: 'i' + right: + + location: SourceLocation(pos=28, lineno=2, colno=13) + end_location: SourceLocation(pos=31, lineno=2, colno=16) + value: 'b' + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=46, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=41, lineno=3, colno=9) + end_location: SourceLocation(pos=46, lineno=3, colno=14) + identifier: 'break' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_64__1.txt b/packages/bolt/tests/snapshots/bolt__parse_64__1.txt new file mode 100644 index 000000000..8f72edbe3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_64__1.txt @@ -0,0 +1,23 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_branch = _mecha_runtime.helpers['branch'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 'abc' + for i in _mecha_var0: + _mecha_var1 = i + _mecha_var2 = 'b' + _mecha_var1 = _mecha_var1 == _mecha_var2 + with _mecha_helper_branch(_mecha_var1) as _mecha_condition: + if _mecha_condition: + break +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_65__0.txt b/packages/bolt/tests/snapshots/bolt__parse_65__0.txt new file mode 100644 index 000000000..0c8c40c47 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_65__0.txt @@ -0,0 +1,20 @@ +"foo".bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_65__1.txt b/packages/bolt/tests/snapshots/bolt__parse_65__1.txt new file mode 100644 index 000000000..c6ee9a489 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_65__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'foo' + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_66__0.txt b/packages/bolt/tests/snapshots/bolt__parse_66__0.txt new file mode 100644 index 000000000..56432b149 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_66__0.txt @@ -0,0 +1,25 @@ +"foo".bar.baz +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'baz' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_66__1.txt b/packages/bolt/tests/snapshots/bolt__parse_66__1.txt new file mode 100644 index 000000000..0b38aa117 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_66__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1], [1] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 'foo' + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'baz') +_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_67__0.txt b/packages/bolt/tests/snapshots/bolt__parse_67__0.txt new file mode 100644 index 000000000..7e032d427 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_67__0.txt @@ -0,0 +1,35 @@ +"foo".bar()[0] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 diff --git a/packages/bolt/tests/snapshots/bolt__parse_67__1.txt b/packages/bolt/tests/snapshots/bolt__parse_67__1.txt new file mode 100644 index 000000000..b9357601a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_67__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1], [1] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 'foo' + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') + _mecha_var0 = _mecha_var0() + _mecha_var1 = 0 + _mecha_var0 = _mecha_var0[_mecha_var1] +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_68__0.txt b/packages/bolt/tests/snapshots/bolt__parse_68__0.txt new file mode 100644 index 000000000..e4a9a28a4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_68__0.txt @@ -0,0 +1,81 @@ +"foo".bar()[0]."hello".99."with space"("thing" * 7) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'bar' + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + arguments: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 0 + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: 'hello' + arguments: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 99 + arguments: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=38, lineno=1, colno=39) + value: 'with space' + arguments: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + operator: '*' + left: + + location: SourceLocation(pos=39, lineno=1, colno=40) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + value: 'thing' + right: + + location: SourceLocation(pos=49, lineno=1, colno=50) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + value: 7 diff --git a/packages/bolt/tests/snapshots/bolt__parse_68__1.txt b/packages/bolt/tests/snapshots/bolt__parse_68__1.txt new file mode 100644 index 000000000..e2da64bbe --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_68__1.txt @@ -0,0 +1,30 @@ +_mecha_lineno = [1], [1] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var7: + _mecha_var0 = 'foo' + _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') + _mecha_var0 = _mecha_var0() + _mecha_var1 = 0 + _mecha_var0 = _mecha_var0[_mecha_var1] + _mecha_var2 = 'hello' + _mecha_var0 = _mecha_var0[_mecha_var2] + _mecha_var3 = 99 + _mecha_var0 = _mecha_var0[_mecha_var3] + _mecha_var4 = 'with space' + _mecha_var0 = _mecha_var0[_mecha_var4] + _mecha_var5 = 'thing' + _mecha_var6 = 7 + _mecha_var5 = _mecha_var5 * _mecha_var6 + _mecha_var0 = _mecha_var0(_mecha_var5) +_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) +--- +output = _mecha_var8 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_69__0.txt b/packages/bolt/tests/snapshots/bolt__parse_69__0.txt new file mode 100644 index 000000000..47bc6a83f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_69__0.txt @@ -0,0 +1,36 @@ +"foo"( + 1, + 2, + 3, +) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=5, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=5, colno=2) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'foo' + arguments: + + location: SourceLocation(pos=11, lineno=2, colno=5) + end_location: SourceLocation(pos=12, lineno=2, colno=6) + value: 1 + + location: SourceLocation(pos=18, lineno=3, colno=5) + end_location: SourceLocation(pos=19, lineno=3, colno=6) + value: 2 + + location: SourceLocation(pos=25, lineno=4, colno=5) + end_location: SourceLocation(pos=26, lineno=4, colno=6) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_69__1.txt b/packages/bolt/tests/snapshots/bolt__parse_69__1.txt new file mode 100644 index 000000000..018dc965a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_69__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 'foo' + _mecha_var1 = 1 + _mecha_var2 = 2 + _mecha_var3 = 3 + _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, _mecha_var3) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_6__0.txt b/packages/bolt/tests/snapshots/bolt__parse_6__0.txt new file mode 100644 index 000000000..db4fd38d0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_6__0.txt @@ -0,0 +1,25 @@ +1 - 2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_6__1.txt b/packages/bolt/tests/snapshots/bolt__parse_6__1.txt new file mode 100644 index 000000000..79fbfaabf --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_6__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 1 + _mecha_var1 = 2 + _mecha_var0 = _mecha_var0 - _mecha_var1 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_70__0.txt b/packages/bolt/tests/snapshots/bolt__parse_70__0.txt new file mode 100644 index 000000000..5264fd31c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_70__0.txt @@ -0,0 +1,51 @@ +def foo(): + say hello +foo() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + value: 'hello' + + location: SourceLocation(pos=25, lineno=3, colno=1) + end_location: SourceLocation(pos=30, lineno=3, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=25, lineno=3, colno=1) + end_location: SourceLocation(pos=30, lineno=3, colno=6) + value: + + location: SourceLocation(pos=25, lineno=3, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=4) + value: 'foo' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_70__1.txt b/packages/bolt/tests/snapshots/bolt__parse_70__1.txt new file mode 100644 index 000000000..ab7c43942 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_70__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1, 7], [1, 3] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + def foo(): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = foo + _mecha_var0 = _mecha_var0() +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_71__0.txt b/packages/bolt/tests/snapshots/bolt__parse_71__0.txt new file mode 100644 index 000000000..b18621b49 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_71__0.txt @@ -0,0 +1,69 @@ +def foo(): + def bar(): + foo() + bar() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=49, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=49, lineno=4, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=49, lineno=4, colno=10) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + name: 'bar' + arguments: + + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + value: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + value: 'foo' + arguments: + + + location: SourceLocation(pos=44, lineno=4, colno=5) + end_location: SourceLocation(pos=49, lineno=4, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=44, lineno=4, colno=5) + end_location: SourceLocation(pos=49, lineno=4, colno=10) + value: + + location: SourceLocation(pos=44, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=8) + value: 'bar' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_71__1.txt b/packages/bolt/tests/snapshots/bolt__parse_71__1.txt new file mode 100644 index 000000000..e5b1bd7c6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_71__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1, 7, 9], [1, 3, 4] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + def foo(): + def bar(): + _mecha_var0 = foo + _mecha_var0 = _mecha_var0() + _mecha_var1 = bar + _mecha_var1 = _mecha_var1() +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=49, lineno=4, colno=10) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_72__0.txt b/packages/bolt/tests/snapshots/bolt__parse_72__0.txt new file mode 100644 index 000000000..f24f09beb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_72__0.txt @@ -0,0 +1,75 @@ +def foo( + a=1, + b=a, + c=a + b, +): + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=41, lineno=5, colno=2) + name: 'foo' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + name: 'a' + default: + + location: SourceLocation(pos=15, lineno=2, colno=7) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + value: 1 + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + name: 'b' + default: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + value: 'a' + + location: SourceLocation(pos=31, lineno=4, colno=5) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + name: 'c' + default: + + location: SourceLocation(pos=33, lineno=4, colno=7) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + operator: '+' + left: + + location: SourceLocation(pos=33, lineno=4, colno=7) + end_location: SourceLocation(pos=34, lineno=4, colno=8) + value: 'a' + right: + + location: SourceLocation(pos=37, lineno=4, colno=11) + end_location: SourceLocation(pos=38, lineno=4, colno=12) + value: 'b' + + location: SourceLocation(pos=47, lineno=6, colno=5) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=47, lineno=6, colno=5) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=51, lineno=6, colno=9) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + fragments: + + location: SourceLocation(pos=51, lineno=6, colno=9) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_72__1.txt b/packages/bolt/tests/snapshots/bolt__parse_72__1.txt new file mode 100644 index 000000000..890b880d8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_72__1.txt @@ -0,0 +1,34 @@ +_mecha_lineno = [1, 11, 14], [1, 3, 4] +_mecha_helper_missing = _mecha_runtime.helpers['missing'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + def foo(a=_mecha_helper_missing, b=_mecha_helper_missing, c=_mecha_helper_missing): + if a is _mecha_helper_missing: + _mecha_var0 = 1 + a = _mecha_var0 + if b is _mecha_helper_missing: + _mecha_var1 = a + b = _mecha_var1 + if c is _mecha_helper_missing: + _mecha_var2 = a + _mecha_var3 = b + _mecha_var2 = _mecha_var2 + _mecha_var3 + c = _mecha_var2 + _mecha_runtime.commands.extend(_mecha_refs[0].commands) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=47, lineno=6, colno=5) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + commands: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=6, colno=14) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_73__0.txt b/packages/bolt/tests/snapshots/bolt__parse_73__0.txt new file mode 100644 index 000000000..03a27def6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_73__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected brace '(' but got newline '\n'. +# line 1, column 6 +# 1 | def f +def f diff --git a/packages/bolt/tests/snapshots/bolt__parse_74__0.txt b/packages/bolt/tests/snapshots/bolt__parse_74__0.txt new file mode 100644 index 000000000..c1b3ae5bb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_74__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected statement but reached end of file. +# line 1, column 8 +# 1 | def f() +def f() diff --git a/packages/bolt/tests/snapshots/bolt__parse_75__0.txt b/packages/bolt/tests/snapshots/bolt__parse_75__0.txt new file mode 100644 index 000000000..295df0b8d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_75__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected non-empty block. +# line 1, column 8 +# 1 | def f(): +# : ^ +# 2 | say yolo +def f(): +say yolo diff --git a/packages/bolt/tests/snapshots/bolt__parse_76__0.txt b/packages/bolt/tests/snapshots/bolt__parse_76__0.txt new file mode 100644 index 000000000..55fc54fed --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_76__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier 'a' is not defined. +# line 1, column 9 +# 1 | def f(a=a): +# : ^ +# 2 | say wat +def f(a=a): + say wat diff --git a/packages/bolt/tests/snapshots/bolt__parse_77__0.txt b/packages/bolt/tests/snapshots/bolt__parse_77__0.txt new file mode 100644 index 000000000..00367b3a5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_77__0.txt @@ -0,0 +1,69 @@ +def f(a, b=a): + b += a + say wat +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'a' + default: None + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + name: 'b' + default: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'a' + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=11) + operator: '+=' + target: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=6) + value: 'b' + rebind: True + value: + + location: SourceLocation(pos=24, lineno=2, colno=10) + end_location: SourceLocation(pos=25, lineno=2, colno=11) + value: 'a' + + location: SourceLocation(pos=30, lineno=3, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + fragments: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + value: 'wat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_77__1.txt b/packages/bolt/tests/snapshots/bolt__parse_77__1.txt new file mode 100644 index 000000000..0b3ded24f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_77__1.txt @@ -0,0 +1,33 @@ +_mecha_lineno = [1, 11], [1, 2] +_mecha_helper_missing = _mecha_runtime.helpers['missing'] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + def f(a, b=_mecha_helper_missing): + if b is _mecha_helper_missing: + _mecha_var0 = a + b = _mecha_var0 + _mecha_var1 = a + _mecha_rebind = _mecha_helper_get_rebind(b) + b += _mecha_var1 + if _mecha_rebind is not None: + b = _mecha_rebind(b) + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=30, lineno=3, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_78__0.txt b/packages/bolt/tests/snapshots/bolt__parse_78__0.txt new file mode 100644 index 000000000..0424f5b36 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_78__0.txt @@ -0,0 +1,13 @@ +def f(a, b): + def g(c): + a + b + c +#>ERROR Identifier 'g' is not defined. +# line 5, column 1 +# 3 | a + b +# 4 | c +# 5 | g() +# : ^ +# Notes: +# - Expected assignment but got literal '()'. +g() diff --git a/packages/bolt/tests/snapshots/bolt__parse_79__0.txt b/packages/bolt/tests/snapshots/bolt__parse_79__0.txt new file mode 100644 index 000000000..e692a356f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_79__0.txt @@ -0,0 +1,11 @@ +def f(a, b): + def g(c): + a + b +#>ERROR Identifier 'c' is not defined. +# line 4, column 7 +# 3 | a + b +# 4 | f(c) +# : ^ +# Notes: +# - Expected equal but got brace ')'. + f(c) diff --git a/packages/bolt/tests/snapshots/bolt__parse_7__0.txt b/packages/bolt/tests/snapshots/bolt__parse_7__0.txt new file mode 100644 index 000000000..36f411f60 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_7__0.txt @@ -0,0 +1,35 @@ +1 - 2 + 3 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + right: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_7__1.txt b/packages/bolt/tests/snapshots/bolt__parse_7__1.txt new file mode 100644 index 000000000..9d342764a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_7__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + _mecha_var1 = 2 + _mecha_var0 = _mecha_var0 - _mecha_var1 + _mecha_var2 = 3 + _mecha_var0 = _mecha_var0 + _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_80__0.txt b/packages/bolt/tests/snapshots/bolt__parse_80__0.txt new file mode 100644 index 000000000..ef7d69339 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_80__0.txt @@ -0,0 +1,20 @@ +def foo(something): + def wat(): + say + yo + wat + is + dat +# this is a comment + x = "hello" +#>ERROR Identifier 'somehng' is not defined. Did you mean 'something'? +# line 10, column 18 +# 9 | x = "hello" +# 10 | for i in somehng: +# : ^^^^^^^ +# 11 | x += i * 3 + for i in somehng: + x += i * 3 + + say wow + wat() diff --git a/packages/bolt/tests/snapshots/bolt__parse_81__0.txt b/packages/bolt/tests/snapshots/bolt__parse_81__0.txt new file mode 100644 index 000000000..4c163830e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_81__0.txt @@ -0,0 +1,186 @@ +def foo(something): + def wat(): + say + yo + wat + is + dat +# this is a comment + x = "hello" + for i in something: + x += i * 3 + + say wow + wat() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=226, lineno=14, colno=10) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=226, lineno=14, colno=10) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + name: 'foo' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'something' + default: None + + location: SourceLocation(pos=24, lineno=2, colno=5) + end_location: SourceLocation(pos=226, lineno=14, colno=10) + commands: + + location: SourceLocation(pos=24, lineno=2, colno=5) + end_location: SourceLocation(pos=216, lineno=13, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=28, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=14) + name: 'wat' + arguments: + + + location: SourceLocation(pos=43, lineno=3, colno=9) + end_location: SourceLocation(pos=216, lineno=13, colno=16) + commands: + + location: SourceLocation(pos=43, lineno=3, colno=9) + end_location: SourceLocation(pos=108, lineno=7, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=59, lineno=4, colno=13) + end_location: SourceLocation(pos=108, lineno=7, colno=16) + fragments: + + location: SourceLocation(pos=59, lineno=4, colno=13) + end_location: SourceLocation(pos=61, lineno=4, colno=15) + value: 'yo' + + location: SourceLocation(pos=73, lineno=5, colno=12) + end_location: SourceLocation(pos=74, lineno=5, colno=13) + value: ' ' + + location: SourceLocation(pos=74, lineno=5, colno=13) + end_location: SourceLocation(pos=77, lineno=5, colno=16) + value: 'wat' + + location: SourceLocation(pos=89, lineno=6, colno=12) + end_location: SourceLocation(pos=90, lineno=6, colno=13) + value: ' ' + + location: SourceLocation(pos=90, lineno=6, colno=13) + end_location: SourceLocation(pos=92, lineno=6, colno=15) + value: 'is' + + location: SourceLocation(pos=104, lineno=7, colno=12) + end_location: SourceLocation(pos=105, lineno=7, colno=13) + value: ' ' + + location: SourceLocation(pos=105, lineno=7, colno=13) + end_location: SourceLocation(pos=108, lineno=7, colno=16) + value: 'dat' + + location: SourceLocation(pos=137, lineno=9, colno=9) + end_location: SourceLocation(pos=148, lineno=9, colno=20) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=137, lineno=9, colno=9) + end_location: SourceLocation(pos=148, lineno=9, colno=20) + operator: '=' + target: + + location: SourceLocation(pos=137, lineno=9, colno=9) + end_location: SourceLocation(pos=138, lineno=9, colno=10) + value: 'x' + rebind: False + value: + + location: SourceLocation(pos=141, lineno=9, colno=13) + end_location: SourceLocation(pos=148, lineno=9, colno=20) + value: 'hello' + + location: SourceLocation(pos=157, lineno=10, colno=9) + end_location: SourceLocation(pos=199, lineno=11, colno=23) + identifier: 'for:target:in:iterable:body' + arguments: + + location: SourceLocation(pos=161, lineno=10, colno=13) + end_location: SourceLocation(pos=162, lineno=10, colno=14) + value: 'i' + rebind: False + + location: SourceLocation(pos=166, lineno=10, colno=18) + end_location: SourceLocation(pos=175, lineno=10, colno=27) + value: 'something' + + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=199, lineno=11, colno=23) + commands: + + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=199, lineno=11, colno=23) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=199, lineno=11, colno=23) + operator: '+=' + target: + + location: SourceLocation(pos=189, lineno=11, colno=13) + end_location: SourceLocation(pos=190, lineno=11, colno=14) + value: 'x' + rebind: True + value: + + location: SourceLocation(pos=194, lineno=11, colno=18) + end_location: SourceLocation(pos=199, lineno=11, colno=23) + operator: '*' + left: + + location: SourceLocation(pos=194, lineno=11, colno=18) + end_location: SourceLocation(pos=195, lineno=11, colno=19) + value: 'i' + right: + + location: SourceLocation(pos=198, lineno=11, colno=22) + end_location: SourceLocation(pos=199, lineno=11, colno=23) + value: 3 + + location: SourceLocation(pos=209, lineno=13, colno=9) + end_location: SourceLocation(pos=216, lineno=13, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=213, lineno=13, colno=13) + end_location: SourceLocation(pos=216, lineno=13, colno=16) + fragments: + + location: SourceLocation(pos=213, lineno=13, colno=13) + end_location: SourceLocation(pos=216, lineno=13, colno=16) + value: 'wow' + + location: SourceLocation(pos=221, lineno=14, colno=5) + end_location: SourceLocation(pos=226, lineno=14, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=221, lineno=14, colno=5) + end_location: SourceLocation(pos=226, lineno=14, colno=10) + value: + + location: SourceLocation(pos=221, lineno=14, colno=5) + end_location: SourceLocation(pos=224, lineno=14, colno=8) + value: 'wat' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_81__1.txt b/packages/bolt/tests/snapshots/bolt__parse_81__1.txt new file mode 100644 index 000000000..01a709a95 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_81__1.txt @@ -0,0 +1,46 @@ +_mecha_lineno = [1, 10, 11, 13, 21], [1, 9, 10, 11, 14] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var5: + def foo(something): + def wat(): + _mecha_runtime.commands.append(_mecha_refs[0]) + _mecha_var0 = 'hello' + x = _mecha_var0 + _mecha_var1 = something + for i in _mecha_var1: + _mecha_var2 = i + _mecha_var3 = 3 + _mecha_var2 = _mecha_var2 * _mecha_var3 + _mecha_rebind = _mecha_helper_get_rebind(x) + x += _mecha_var2 + if _mecha_rebind is not None: + x = _mecha_rebind(x) + _mecha_runtime.commands.append(_mecha_refs[1]) + _mecha_var4 = wat + _mecha_var4 = _mecha_var4() +_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=43, lineno=3, colno=9) + end_location: SourceLocation(pos=108, lineno=7, colno=16) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=209, lineno=13, colno=9) + end_location: SourceLocation(pos=216, lineno=13, colno=16) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=226, lineno=14, colno=10) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_82__0.txt b/packages/bolt/tests/snapshots/bolt__parse_82__0.txt new file mode 100644 index 000000000..d0f5459b8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_82__0.txt @@ -0,0 +1,148 @@ +def foo(): + global thing + thing += bar() +def bar(): + global thing + thing += foo() +thing = bar() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=108, lineno=8, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=3, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=19) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=17) + identifier: 'global:subcommand' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=12) + end_location: SourceLocation(pos=27, lineno=2, colno=17) + identifier: 'global:name' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=12) + end_location: SourceLocation(pos=27, lineno=2, colno=17) + value: 'thing' + + location: SourceLocation(pos=32, lineno=3, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=32, lineno=3, colno=5) + end_location: SourceLocation(pos=46, lineno=3, colno=19) + operator: '+=' + target: + + location: SourceLocation(pos=32, lineno=3, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=41, lineno=3, colno=14) + end_location: SourceLocation(pos=46, lineno=3, colno=19) + value: + + location: SourceLocation(pos=41, lineno=3, colno=14) + end_location: SourceLocation(pos=44, lineno=3, colno=17) + value: 'bar' + arguments: + + + location: SourceLocation(pos=47, lineno=4, colno=1) + end_location: SourceLocation(pos=93, lineno=6, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=51, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=10) + name: 'bar' + arguments: + + + location: SourceLocation(pos=62, lineno=5, colno=5) + end_location: SourceLocation(pos=93, lineno=6, colno=19) + commands: + + location: SourceLocation(pos=62, lineno=5, colno=5) + end_location: SourceLocation(pos=74, lineno=5, colno=17) + identifier: 'global:subcommand' + arguments: + + location: SourceLocation(pos=69, lineno=5, colno=12) + end_location: SourceLocation(pos=74, lineno=5, colno=17) + identifier: 'global:name' + arguments: + + location: SourceLocation(pos=69, lineno=5, colno=12) + end_location: SourceLocation(pos=74, lineno=5, colno=17) + value: 'thing' + + location: SourceLocation(pos=79, lineno=6, colno=5) + end_location: SourceLocation(pos=93, lineno=6, colno=19) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=79, lineno=6, colno=5) + end_location: SourceLocation(pos=93, lineno=6, colno=19) + operator: '+=' + target: + + location: SourceLocation(pos=79, lineno=6, colno=5) + end_location: SourceLocation(pos=84, lineno=6, colno=10) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=88, lineno=6, colno=14) + end_location: SourceLocation(pos=93, lineno=6, colno=19) + value: + + location: SourceLocation(pos=88, lineno=6, colno=14) + end_location: SourceLocation(pos=91, lineno=6, colno=17) + value: 'foo' + arguments: + + + location: SourceLocation(pos=94, lineno=7, colno=1) + end_location: SourceLocation(pos=107, lineno=7, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=94, lineno=7, colno=1) + end_location: SourceLocation(pos=107, lineno=7, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=94, lineno=7, colno=1) + end_location: SourceLocation(pos=99, lineno=7, colno=6) + value: 'thing' + rebind: False + value: + + location: SourceLocation(pos=102, lineno=7, colno=9) + end_location: SourceLocation(pos=107, lineno=7, colno=14) + value: + + location: SourceLocation(pos=102, lineno=7, colno=9) + end_location: SourceLocation(pos=105, lineno=7, colno=12) + value: 'bar' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_82__1.txt b/packages/bolt/tests/snapshots/bolt__parse_82__1.txt new file mode 100644 index 000000000..2147efbec --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_82__1.txt @@ -0,0 +1,36 @@ +_mecha_lineno = [1, 7, 8, 15, 16, 22], [1, 2, 3, 5, 6, 7] +_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + def foo(): + global thing + _mecha_var0 = bar + _mecha_var0 = _mecha_var0() + _mecha_rebind = _mecha_helper_get_rebind(thing) + thing += _mecha_var0 + if _mecha_rebind is not None: + thing = _mecha_rebind(thing) + def bar(): + global thing + _mecha_var1 = foo + _mecha_var1 = _mecha_var1() + _mecha_rebind = _mecha_helper_get_rebind(thing) + thing += _mecha_var1 + if _mecha_rebind is not None: + thing = _mecha_rebind(thing) + _mecha_var2 = bar + _mecha_var2 = _mecha_var2() + thing = _mecha_var2 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=108, lineno=8, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_83__0.txt b/packages/bolt/tests/snapshots/bolt__parse_83__0.txt new file mode 100644 index 000000000..1e085b412 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_83__0.txt @@ -0,0 +1,11 @@ +def foo(): + bar() + thing +def bar(): +#>ERROR Identifier 'thin' is not defined. Did you mean 'thing'? +# line 4, column 13 +# 3 | def bar(): +# 4 | foo() + thin +# : ^^^^ +# 5 | thing = bar() + foo() + thin +thing = bar() diff --git a/packages/bolt/tests/snapshots/bolt__parse_84__0.txt b/packages/bolt/tests/snapshots/bolt__parse_84__0.txt new file mode 100644 index 000000000..685e616d0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_84__0.txt @@ -0,0 +1,28 @@ +def foo(): + return +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=11) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=11) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'foo' + arguments: + + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=11) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=11) + identifier: 'return' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_84__1.txt b/packages/bolt/tests/snapshots/bolt__parse_84__1.txt new file mode 100644 index 000000000..584da111f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_84__1.txt @@ -0,0 +1,16 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + def foo(): + return +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=11) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_85__0.txt b/packages/bolt/tests/snapshots/bolt__parse_85__0.txt new file mode 100644 index 000000000..7ae67654b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_85__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can only use 'return' in functions. +# line 1, column 1 +# 1 | return "hello" +# : ^^^^^^^^^^^^^^ +return "hello" diff --git a/packages/bolt/tests/snapshots/bolt__parse_86__0.txt b/packages/bolt/tests/snapshots/bolt__parse_86__0.txt new file mode 100644 index 000000000..773e7171f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_86__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier 'foo' is not defined. +# line 1, column 8 +# 1 | return foo +# : ^^^ +return foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt new file mode 100644 index 000000000..51616b3c2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt @@ -0,0 +1,68 @@ +def f(): + def g(): + return foo + foo = 0 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=20, lineno=2, colno=12) + name: 'g' + arguments: + + + location: SourceLocation(pos=30, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + commands: + + location: SourceLocation(pos=30, lineno=3, colno=9) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=37, lineno=3, colno=16) + end_location: SourceLocation(pos=40, lineno=3, colno=19) + value: 'foo' + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=48, lineno=4, colno=8) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=51, lineno=4, colno=11) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + value: 0 diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__1.txt b/packages/bolt/tests/snapshots/bolt__parse_87__1.txt new file mode 100644 index 000000000..b30492ae5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_87__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1, 7, 10], [1, 3, 4] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + def f(): + def g(): + _mecha_var0 = foo + return _mecha_var0 + _mecha_var1 = 0 + foo = _mecha_var1 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=52, lineno=4, colno=12) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_88__0.txt b/packages/bolt/tests/snapshots/bolt__parse_88__0.txt new file mode 100644 index 000000000..8959523ff --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_88__0.txt @@ -0,0 +1,10 @@ +def f(): + foo = 0 +#>ERROR Identifier 'foo' is not defined. +# line 3, column 3 +# 2 | foo = 0 +# 3 | f(foo) +# : ^^^ +# Notes: +# - Expected equal but got brace ')'. +f(foo) diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt new file mode 100644 index 000000000..d92adbb6e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt @@ -0,0 +1,66 @@ +def f(x): + tellraw @a x +f("thing") +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'x' + default: None + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=13) + end_location: SourceLocation(pos=24, lineno=2, colno=15) + variable: 'a' + arguments: + + + location: SourceLocation(pos=25, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + prefix: None + converter: 'json' + value: + + location: SourceLocation(pos=25, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + value: 'x' + + location: SourceLocation(pos=27, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=27, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=11) + value: + + location: SourceLocation(pos=27, lineno=3, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=2) + value: 'f' + arguments: + + location: SourceLocation(pos=29, lineno=3, colno=3) + end_location: SourceLocation(pos=36, lineno=3, colno=10) + value: 'thing' diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt new file mode 100644 index 000000000..96f29cdad --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt @@ -0,0 +1,46 @@ +_mecha_lineno = [1, 7, 10], [1, 2, 3] +_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + def f(x): + _mecha_var0 = x + _mecha_var0 = _mecha_helper_interpolate_json(_mecha_var0, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var0]))) + _mecha_var1 = f + _mecha_var2 = 'thing' + _mecha_var1 = _mecha_var1(_mecha_var2) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=25, lineno=2, colno=16) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + prefix: None + converter: 'json' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=22, lineno=2, colno=13) + end_location: SourceLocation(pos=24, lineno=2, colno=15) + variable: 'a' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + identifier: 'tellraw:targets:message' + arguments: + + +_mecha_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_8__0.txt b/packages/bolt/tests/snapshots/bolt__parse_8__0.txt new file mode 100644 index 000000000..84d4c5210 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_8__0.txt @@ -0,0 +1,35 @@ +1 - (2 + 3) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '-' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 1 + right: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 2 + right: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_8__1.txt b/packages/bolt/tests/snapshots/bolt__parse_8__1.txt new file mode 100644 index 000000000..efd974dc5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_8__1.txt @@ -0,0 +1,19 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 1 + _mecha_var1 = 2 + _mecha_var2 = 3 + _mecha_var1 = _mecha_var1 + _mecha_var2 + _mecha_var0 = _mecha_var0 - _mecha_var1 +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_90__0.txt b/packages/bolt/tests/snapshots/bolt__parse_90__0.txt new file mode 100644 index 000000000..0292421c9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_90__0.txt @@ -0,0 +1,9 @@ +def f(x): +#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? +# line 2, column 16 +# 1 | def f(x): +# 2 | tellraw @a xx +# : ^^ +# 3 | f("thing") + tellraw @a xx +f("thing") diff --git a/packages/bolt/tests/snapshots/bolt__parse_91__0.txt b/packages/bolt/tests/snapshots/bolt__parse_91__0.txt new file mode 100644 index 000000000..22c7a1309 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_91__0.txt @@ -0,0 +1,30 @@ +{ + foo: "bar" +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=2) + items: + + location: SourceLocation(pos=6, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=15) + key: + + location: SourceLocation(pos=6, lineno=2, colno=5) + end_location: SourceLocation(pos=9, lineno=2, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=11, lineno=2, colno=10) + end_location: SourceLocation(pos=16, lineno=2, colno=15) + value: 'bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_91__1.txt b/packages/bolt/tests/snapshots/bolt__parse_91__1.txt new file mode 100644 index 000000000..e6e4d1233 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_91__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + _mecha_var0 = 'foo' + _mecha_var1 = 'bar' + _mecha_var2 = {_mecha_var0: _mecha_var1} +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_92__0.txt b/packages/bolt/tests/snapshots/bolt__parse_92__0.txt new file mode 100644 index 000000000..e6d4f0980 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_92__0.txt @@ -0,0 +1,51 @@ +foo = "hello" +{ + foo: "bar" +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=23, lineno=3, colno=8) + value: 'foo' + value: + + location: SourceLocation(pos=25, lineno=3, colno=10) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + value: 'bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_92__1.txt b/packages/bolt/tests/snapshots/bolt__parse_92__1.txt new file mode 100644 index 000000000..bbf0a2433 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_92__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1, 7, 9], [1, 3, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 'hello' + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_var2 = 'bar' + _mecha_var3 = {_mecha_var1: _mecha_var2} +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_93__0.txt b/packages/bolt/tests/snapshots/bolt__parse_93__0.txt new file mode 100644 index 000000000..71e6fa4bb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_93__0.txt @@ -0,0 +1,51 @@ +foo = "hello" +{ + "foo": foo +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=32, lineno=4, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=25, lineno=3, colno=10) + value: 'foo' + value: + + location: SourceLocation(pos=27, lineno=3, colno=12) + end_location: SourceLocation(pos=30, lineno=3, colno=15) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_93__1.txt b/packages/bolt/tests/snapshots/bolt__parse_93__1.txt new file mode 100644 index 000000000..548458ea4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_93__1.txt @@ -0,0 +1,20 @@ +_mecha_lineno = [1, 8, 9], [1, 3, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 'hello' + foo = _mecha_var0 + _mecha_var1 = 'foo' + _mecha_var2 = foo + _mecha_var3 = {_mecha_var1: _mecha_var2} +_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=5, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_94__0.txt b/packages/bolt/tests/snapshots/bolt__parse_94__0.txt new file mode 100644 index 000000000..fcbb520c3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_94__0.txt @@ -0,0 +1,86 @@ +foo = "hello" +{ + foo * 3: 42, + 16 + 3: [], +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'hello' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=50, lineno=5, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=50, lineno=5, colno=2) + items: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=16) + key: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=27, lineno=3, colno=12) + operator: '*' + left: + + location: SourceLocation(pos=20, lineno=3, colno=5) + end_location: SourceLocation(pos=23, lineno=3, colno=8) + value: 'foo' + right: + + location: SourceLocation(pos=26, lineno=3, colno=11) + end_location: SourceLocation(pos=27, lineno=3, colno=12) + value: 3 + value: + + location: SourceLocation(pos=29, lineno=3, colno=14) + end_location: SourceLocation(pos=31, lineno=3, colno=16) + value: 42 + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=47, lineno=4, colno=15) + key: + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=43, lineno=4, colno=11) + operator: '+' + left: + + location: SourceLocation(pos=37, lineno=4, colno=5) + end_location: SourceLocation(pos=39, lineno=4, colno=7) + value: 16 + right: + + location: SourceLocation(pos=42, lineno=4, colno=10) + end_location: SourceLocation(pos=43, lineno=4, colno=11) + value: 3 + value: + + location: SourceLocation(pos=45, lineno=4, colno=13) + end_location: SourceLocation(pos=47, lineno=4, colno=15) + items: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_94__1.txt b/packages/bolt/tests/snapshots/bolt__parse_94__1.txt new file mode 100644 index 000000000..d87e0678d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_94__1.txt @@ -0,0 +1,26 @@ +_mecha_lineno = [1, 7, 13, 15], [1, 3, 4, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var8: + _mecha_var0 = 'hello' + foo = _mecha_var0 + _mecha_var1 = foo + _mecha_var2 = 3 + _mecha_var1 = _mecha_var1 * _mecha_var2 + _mecha_var3 = 42 + _mecha_var4 = 16 + _mecha_var5 = 3 + _mecha_var4 = _mecha_var4 + _mecha_var5 + _mecha_var6 = [] + _mecha_var7 = {_mecha_var1: _mecha_var3, _mecha_var4: _mecha_var6} +_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) +--- +output = _mecha_var9 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=6, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_95__0.txt b/packages/bolt/tests/snapshots/bolt__parse_95__0.txt new file mode 100644 index 000000000..2371e8bd8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_95__0.txt @@ -0,0 +1,156 @@ +my_predicate = { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "score1": { + "min": { + "type": "minecraft:score", + "target": "this", + "score": "score2", + "scale": 1 + } + } + } +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=251, lineno=15, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=250, lineno=14, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=250, lineno=14, colno=2) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'my_predicate' + rebind: False + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=250, lineno=14, colno=2) + items: + + location: SourceLocation(pos=19, lineno=2, colno=3) + end_location: SourceLocation(pos=57, lineno=2, colno=41) + key: + + location: SourceLocation(pos=19, lineno=2, colno=3) + end_location: SourceLocation(pos=30, lineno=2, colno=14) + value: 'condition' + value: + + location: SourceLocation(pos=32, lineno=2, colno=16) + end_location: SourceLocation(pos=57, lineno=2, colno=41) + value: 'minecraft:entity_scores' + + location: SourceLocation(pos=61, lineno=3, colno=3) + end_location: SourceLocation(pos=77, lineno=3, colno=19) + key: + + location: SourceLocation(pos=61, lineno=3, colno=3) + end_location: SourceLocation(pos=69, lineno=3, colno=11) + value: 'entity' + value: + + location: SourceLocation(pos=71, lineno=3, colno=13) + end_location: SourceLocation(pos=77, lineno=3, colno=19) + value: 'this' + + location: SourceLocation(pos=81, lineno=4, colno=3) + end_location: SourceLocation(pos=248, lineno=13, colno=4) + key: + + location: SourceLocation(pos=81, lineno=4, colno=3) + end_location: SourceLocation(pos=89, lineno=4, colno=11) + value: 'scores' + value: + + location: SourceLocation(pos=91, lineno=4, colno=13) + end_location: SourceLocation(pos=248, lineno=13, colno=4) + items: + + location: SourceLocation(pos=97, lineno=5, colno=5) + end_location: SourceLocation(pos=244, lineno=12, colno=6) + key: + + location: SourceLocation(pos=97, lineno=5, colno=5) + end_location: SourceLocation(pos=105, lineno=5, colno=13) + value: 'score1' + value: + + location: SourceLocation(pos=107, lineno=5, colno=15) + end_location: SourceLocation(pos=244, lineno=12, colno=6) + items: + + location: SourceLocation(pos=115, lineno=6, colno=7) + end_location: SourceLocation(pos=238, lineno=11, colno=8) + key: + + location: SourceLocation(pos=115, lineno=6, colno=7) + end_location: SourceLocation(pos=120, lineno=6, colno=12) + value: 'min' + value: + + location: SourceLocation(pos=122, lineno=6, colno=14) + end_location: SourceLocation(pos=238, lineno=11, colno=8) + items: + + location: SourceLocation(pos=132, lineno=7, colno=9) + end_location: SourceLocation(pos=157, lineno=7, colno=34) + key: + + location: SourceLocation(pos=132, lineno=7, colno=9) + end_location: SourceLocation(pos=138, lineno=7, colno=15) + value: 'type' + value: + + location: SourceLocation(pos=140, lineno=7, colno=17) + end_location: SourceLocation(pos=157, lineno=7, colno=34) + value: 'minecraft:score' + + location: SourceLocation(pos=167, lineno=8, colno=9) + end_location: SourceLocation(pos=183, lineno=8, colno=25) + key: + + location: SourceLocation(pos=167, lineno=8, colno=9) + end_location: SourceLocation(pos=175, lineno=8, colno=17) + value: 'target' + value: + + location: SourceLocation(pos=177, lineno=8, colno=19) + end_location: SourceLocation(pos=183, lineno=8, colno=25) + value: 'this' + + location: SourceLocation(pos=193, lineno=9, colno=9) + end_location: SourceLocation(pos=210, lineno=9, colno=26) + key: + + location: SourceLocation(pos=193, lineno=9, colno=9) + end_location: SourceLocation(pos=200, lineno=9, colno=16) + value: 'score' + value: + + location: SourceLocation(pos=202, lineno=9, colno=18) + end_location: SourceLocation(pos=210, lineno=9, colno=26) + value: 'score2' + + location: SourceLocation(pos=220, lineno=10, colno=9) + end_location: SourceLocation(pos=230, lineno=10, colno=19) + key: + + location: SourceLocation(pos=220, lineno=10, colno=9) + end_location: SourceLocation(pos=227, lineno=10, colno=16) + value: 'scale' + value: + + location: SourceLocation(pos=229, lineno=10, colno=18) + end_location: SourceLocation(pos=230, lineno=10, colno=19) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_95__1.txt b/packages/bolt/tests/snapshots/bolt__parse_95__1.txt new file mode 100644 index 000000000..9cd4b2b6f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_95__1.txt @@ -0,0 +1,34 @@ +_mecha_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var19: + _mecha_var0 = 'condition' + _mecha_var1 = 'minecraft:entity_scores' + _mecha_var2 = 'entity' + _mecha_var3 = 'this' + _mecha_var4 = 'scores' + _mecha_var5 = 'score1' + _mecha_var6 = 'min' + _mecha_var7 = 'type' + _mecha_var8 = 'minecraft:score' + _mecha_var9 = 'target' + _mecha_var10 = 'this' + _mecha_var11 = 'score' + _mecha_var12 = 'score2' + _mecha_var13 = 'scale' + _mecha_var14 = 1 + _mecha_var15 = {_mecha_var7: _mecha_var8, _mecha_var9: _mecha_var10, _mecha_var11: _mecha_var12, _mecha_var13: _mecha_var14} + _mecha_var16 = {_mecha_var6: _mecha_var15} + _mecha_var17 = {_mecha_var5: _mecha_var16} + _mecha_var18 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3, _mecha_var4: _mecha_var17} + my_predicate = _mecha_var18 +_mecha_var20 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var19)) +--- +output = _mecha_var20 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=251, lineno=15, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt new file mode 100644 index 000000000..67de56a10 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt @@ -0,0 +1,156 @@ +my_predicate = { + condition: "minecraft:entity_scores", + entity: "this", + scores: { + score1: { + "min": { + "type": "minecraft:score", + target: "this", + score: "score2", + scale: 1 + } + } + } +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=237, lineno=15, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=236, lineno=14, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=236, lineno=14, colno=2) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'my_predicate' + rebind: False + value: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=236, lineno=14, colno=2) + items: + + location: SourceLocation(pos=19, lineno=2, colno=3) + end_location: SourceLocation(pos=55, lineno=2, colno=39) + key: + + location: SourceLocation(pos=19, lineno=2, colno=3) + end_location: SourceLocation(pos=28, lineno=2, colno=12) + value: 'condition' + value: + + location: SourceLocation(pos=30, lineno=2, colno=14) + end_location: SourceLocation(pos=55, lineno=2, colno=39) + value: 'minecraft:entity_scores' + + location: SourceLocation(pos=59, lineno=3, colno=3) + end_location: SourceLocation(pos=73, lineno=3, colno=17) + key: + + location: SourceLocation(pos=59, lineno=3, colno=3) + end_location: SourceLocation(pos=65, lineno=3, colno=9) + value: 'entity' + value: + + location: SourceLocation(pos=67, lineno=3, colno=11) + end_location: SourceLocation(pos=73, lineno=3, colno=17) + value: 'this' + + location: SourceLocation(pos=77, lineno=4, colno=3) + end_location: SourceLocation(pos=234, lineno=13, colno=4) + key: + + location: SourceLocation(pos=77, lineno=4, colno=3) + end_location: SourceLocation(pos=83, lineno=4, colno=9) + value: 'scores' + value: + + location: SourceLocation(pos=85, lineno=4, colno=11) + end_location: SourceLocation(pos=234, lineno=13, colno=4) + items: + + location: SourceLocation(pos=91, lineno=5, colno=5) + end_location: SourceLocation(pos=230, lineno=12, colno=6) + key: + + location: SourceLocation(pos=91, lineno=5, colno=5) + end_location: SourceLocation(pos=97, lineno=5, colno=11) + value: 'score1' + value: + + location: SourceLocation(pos=99, lineno=5, colno=13) + end_location: SourceLocation(pos=230, lineno=12, colno=6) + items: + + location: SourceLocation(pos=107, lineno=6, colno=7) + end_location: SourceLocation(pos=224, lineno=11, colno=8) + key: + + location: SourceLocation(pos=107, lineno=6, colno=7) + end_location: SourceLocation(pos=112, lineno=6, colno=12) + value: 'min' + value: + + location: SourceLocation(pos=114, lineno=6, colno=14) + end_location: SourceLocation(pos=224, lineno=11, colno=8) + items: + + location: SourceLocation(pos=124, lineno=7, colno=9) + end_location: SourceLocation(pos=149, lineno=7, colno=34) + key: + + location: SourceLocation(pos=124, lineno=7, colno=9) + end_location: SourceLocation(pos=130, lineno=7, colno=15) + value: 'type' + value: + + location: SourceLocation(pos=132, lineno=7, colno=17) + end_location: SourceLocation(pos=149, lineno=7, colno=34) + value: 'minecraft:score' + + location: SourceLocation(pos=159, lineno=8, colno=9) + end_location: SourceLocation(pos=173, lineno=8, colno=23) + key: + + location: SourceLocation(pos=159, lineno=8, colno=9) + end_location: SourceLocation(pos=165, lineno=8, colno=15) + value: 'target' + value: + + location: SourceLocation(pos=167, lineno=8, colno=17) + end_location: SourceLocation(pos=173, lineno=8, colno=23) + value: 'this' + + location: SourceLocation(pos=183, lineno=9, colno=9) + end_location: SourceLocation(pos=198, lineno=9, colno=24) + key: + + location: SourceLocation(pos=183, lineno=9, colno=9) + end_location: SourceLocation(pos=188, lineno=9, colno=14) + value: 'score' + value: + + location: SourceLocation(pos=190, lineno=9, colno=16) + end_location: SourceLocation(pos=198, lineno=9, colno=24) + value: 'score2' + + location: SourceLocation(pos=208, lineno=10, colno=9) + end_location: SourceLocation(pos=216, lineno=10, colno=17) + key: + + location: SourceLocation(pos=208, lineno=10, colno=9) + end_location: SourceLocation(pos=213, lineno=10, colno=14) + value: 'scale' + value: + + location: SourceLocation(pos=215, lineno=10, colno=16) + end_location: SourceLocation(pos=216, lineno=10, colno=17) + value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt new file mode 100644 index 000000000..0dad714c1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt @@ -0,0 +1,34 @@ +_mecha_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var19: + _mecha_var0 = 'condition' + _mecha_var1 = 'minecraft:entity_scores' + _mecha_var2 = 'entity' + _mecha_var3 = 'this' + _mecha_var4 = 'scores' + _mecha_var5 = 'score1' + _mecha_var6 = 'min' + _mecha_var7 = 'type' + _mecha_var8 = 'minecraft:score' + _mecha_var9 = 'target' + _mecha_var10 = 'this' + _mecha_var11 = 'score' + _mecha_var12 = 'score2' + _mecha_var13 = 'scale' + _mecha_var14 = 1 + _mecha_var15 = {_mecha_var7: _mecha_var8, _mecha_var9: _mecha_var10, _mecha_var11: _mecha_var12, _mecha_var13: _mecha_var14} + _mecha_var16 = {_mecha_var6: _mecha_var15} + _mecha_var17 = {_mecha_var5: _mecha_var16} + _mecha_var18 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3, _mecha_var4: _mecha_var17} + my_predicate = _mecha_var18 +_mecha_var20 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var19)) +--- +output = _mecha_var20 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=237, lineno=15, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt new file mode 100644 index 000000000..b461e773c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt @@ -0,0 +1,83 @@ +def f(): + return {f(): f(), other: [{}, {}, "wat"]} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=2, colno=46) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=54, lineno=2, colno=46) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=54, lineno=2, colno=46) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=20, lineno=2, colno=12) + end_location: SourceLocation(pos=54, lineno=2, colno=46) + items: + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=29, lineno=2, colno=21) + key: + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + value: + + location: SourceLocation(pos=21, lineno=2, colno=13) + end_location: SourceLocation(pos=22, lineno=2, colno=14) + value: 'f' + arguments: + + value: + + location: SourceLocation(pos=26, lineno=2, colno=18) + end_location: SourceLocation(pos=29, lineno=2, colno=21) + value: + + location: SourceLocation(pos=26, lineno=2, colno=18) + end_location: SourceLocation(pos=27, lineno=2, colno=19) + value: 'f' + arguments: + + + location: SourceLocation(pos=31, lineno=2, colno=23) + end_location: SourceLocation(pos=53, lineno=2, colno=45) + key: + + location: SourceLocation(pos=31, lineno=2, colno=23) + end_location: SourceLocation(pos=36, lineno=2, colno=28) + value: 'other' + value: + + location: SourceLocation(pos=38, lineno=2, colno=30) + end_location: SourceLocation(pos=53, lineno=2, colno=45) + items: + + location: SourceLocation(pos=39, lineno=2, colno=31) + end_location: SourceLocation(pos=41, lineno=2, colno=33) + items: + + + location: SourceLocation(pos=43, lineno=2, colno=35) + end_location: SourceLocation(pos=45, lineno=2, colno=37) + items: + + + location: SourceLocation(pos=47, lineno=2, colno=39) + end_location: SourceLocation(pos=52, lineno=2, colno=44) + value: 'wat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt new file mode 100644 index 000000000..5fd46d00b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt @@ -0,0 +1,26 @@ +_mecha_lineno = [1, 6], [1, 2] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var8: + def f(): + _mecha_var0 = f + _mecha_var0 = _mecha_var0() + _mecha_var1 = f + _mecha_var1 = _mecha_var1() + _mecha_var2 = 'other' + _mecha_var3 = {} + _mecha_var4 = {} + _mecha_var5 = 'wat' + _mecha_var6 = [_mecha_var3, _mecha_var4, _mecha_var5] + _mecha_var7 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var6} + return _mecha_var7 +_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) +--- +output = _mecha_var9 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=2, colno=46) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_98__0.txt b/packages/bolt/tests/snapshots/bolt__parse_98__0.txt new file mode 100644 index 000000000..21de2a29e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_98__0.txt @@ -0,0 +1,8 @@ +#>ERROR Can't inline conditions as execute subcommands. +# line 1, column 7 +# 1 | at @s if "foo" == "bar": +# : ^^^^^^^^^^^^^^^^^^ +# 2 | say yolo +# : ^^^^^^^^ +at @s if "foo" == "bar": + say yolo diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt new file mode 100644 index 000000000..fc6c39b78 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'for'. +# line 1, column 7 +# 1 | at @s for i in "foo": +# : ^^^ +# 2 | say yolo +at @s for i in "foo": + say yolo diff --git a/packages/bolt/tests/snapshots/bolt__parse_9__0.txt b/packages/bolt/tests/snapshots/bolt__parse_9__0.txt new file mode 100644 index 000000000..2cd10680a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_9__0.txt @@ -0,0 +1,30 @@ +2 + -54 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '+' + left: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 2 + right: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '-' + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 54 diff --git a/packages/bolt/tests/snapshots/bolt__parse_9__1.txt b/packages/bolt/tests/snapshots/bolt__parse_9__1.txt new file mode 100644 index 000000000..a9d6a0af8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_9__1.txt @@ -0,0 +1,18 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 2 + _mecha_var1 = 54 + _mecha_var1 = - _mecha_var1 + _mecha_var0 = _mecha_var0 + _mecha_var1 +_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md new file mode 100644 index 000000000..1be3cb6a3 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -0,0 +1,642 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello +say this is a function file augmented with mecha +execute if score @s tmp matches 1.. as @a run function demo:foo/nested_execute_0 +say You can make functions +tellraw @a ["", {"text": "yep"}] +say and return values +say 13 +say 21 +say 34 +say Unlike in python default params are evaluated when the function is called +say 12 +say 144 +say {'number': 12, 'result': 144} +say this is basically a custom subset of python +say functions are first-class objects just like in python +say AAA +say BBB +say CCC +say just once +execute as @a at @s if block ~ ~-1 ~ #wool run give @s stone{display: {Name: '{"text": "Hello", "bold": true}'}} +say (1, 2, 3, 4) +say (1, 2, 3, 4) +say ((1, 2, 3, 4),) +say f-strings 'WORK' too \ +say {{{00000007}\}"} +execute if score @s tmp matches 8.. run say wat +execute if score @s tmp matches 8.. run say wat +item replace entity @a hotbar.0 from entity @s hotbar.0 +item replace entity @a hotbar.1 from entity @s hotbar.1 +item replace entity @a hotbar.2 from entity @s hotbar.2 +item replace entity @a hotbar.3 from entity @s hotbar.3 +item replace entity @a hotbar.4 from entity @s hotbar.4 +item replace entity @a hotbar.5 from entity @s hotbar.5 +item replace entity @a hotbar.6 from entity @s hotbar.6 +item replace entity @a hotbar.7 from entity @s hotbar.7 +item replace entity @a hotbar.8 from entity @s hotbar.8 +item replace entity @a inventory.0 from entity @s inventory.0 +item replace entity @a inventory.1 from entity @s inventory.1 +item replace entity @a inventory.2 from entity @s inventory.2 +item replace entity @a inventory.3 from entity @s inventory.3 +item replace entity @a inventory.4 from entity @s inventory.4 +item replace entity @a inventory.5 from entity @s inventory.5 +item replace entity @a inventory.6 from entity @s inventory.6 +item replace entity @a inventory.7 from entity @s inventory.7 +item replace entity @a inventory.8 from entity @s inventory.8 +item replace entity @a inventory.9 from entity @s inventory.9 +item replace entity @a inventory.10 from entity @s inventory.10 +item replace entity @a inventory.11 from entity @s inventory.11 +item replace entity @a inventory.12 from entity @s inventory.12 +item replace entity @a inventory.13 from entity @s inventory.13 +item replace entity @a inventory.14 from entity @s inventory.14 +item replace entity @a inventory.15 from entity @s inventory.15 +item replace entity @a inventory.16 from entity @s inventory.16 +item replace entity @a inventory.17 from entity @s inventory.17 +item replace entity @a inventory.18 from entity @s inventory.18 +item replace entity @a inventory.19 from entity @s inventory.19 +item replace entity @a inventory.20 from entity @s inventory.20 +item replace entity @a inventory.21 from entity @s inventory.21 +item replace entity @a inventory.22 from entity @s inventory.22 +item replace entity @a inventory.23 from entity @s inventory.23 +item replace entity @a inventory.24 from entity @s inventory.24 +item replace entity @a inventory.25 from entity @s inventory.25 +say 1 +say 2 +say 3 +say [1, 2, 3, 1, 2, 3] +say bolt_basic.hello +say -1.0 +say True +say 0.0 +say True +say other +say done +say 1 +say done +say 2 +say done +say 3 +say done +say other +say done +say other +say done +execute as @a at @s anchored eyes facing 0 0 0 anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.6] run function demo:abc +execute if predicate foo:bar run function demo:xyz +execute if score @s thingy matches 0..7 run function demo:foo/tree_0/0_7 +execute if score @s thingy matches 8..14 run function demo:foo/tree_0/8_14 +execute if score @s thingy matches 15..21 run function demo:foo/tree_0/15_21 +execute if score @s thingy matches 22..28 run function demo:foo/tree_0/22_28 +execute if score @s thingy matches 29..35 run function demo:foo/tree_0/29_35 +data modify entity @e[type=armor_stand, limit=1] NoBasePlate set value 1b +execute if score @s loop_again matches 1 run function demo:foo +setblock 1 2 3 stone +setblock 1 2 3 stone +execute if block ^ ^1 ^ #planks run say 42 +execute if block ~ ~ ~ #planks run say 42 +say {'foo': 1, 'bar': 2, 'thing': 42} +execute if score @s thingy matches 0..3 run function demo:foo/small_tree/0_3 +execute if score @s thingy matches 4..7 run function demo:foo/small_tree/4_7 +say {1: 1, 'a': 'a', 'b': 'thing', 'c': 'c', 2: 2} +say {1: {2: 'foo'}} +execute if score @s thingy matches 10..14 run function demo:foo/tree_1/10_14 +execute if score @s thingy matches 15..19 run function demo:foo/tree_1/15_19 +scoreboard objectives setdisplay list some_score_name +scoreboard objectives setdisplay sidebar.team.red some_score_name +item replace entity @s weapon.offhand from entity @s weapon.mainhand +item replace entity @s weapon.offhand from entity @s weapon.mainhand +say [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +say [3, 4, 5, 6, 7, 8, 9, 10, 11] +say [0, 1, 2, 3, 4, 5, 6, 7, 8] +say [3, 4, 5, 6, 7, 8] +say [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +say [3, 4, 5, 6, 7, 8, 9, 10, 11] +say [0, 1, 2, 3, 4, 5, 6, 7, 8] +say [3, 4, 5, 6, 7, 8] +say [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] +say [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] +say [11, 10, 9, 8, 7, 6, 5, 4] +say [9, 8, 7, 6, 5, 4] +execute at @s if block ~ ~ ~ #minecraft:beds run teleport @s ~ ~0.5625 ~ +say [0, 1, 2] +say ==[a]== +say True +say None +say b +say True +say False +say foo +say ==[b]== +say True +say a +say c +say False +say False +say bar +say ==[c]== +say True +say b +say d +say False +say False +say foo +say ==[d]== +say True +say c +say None +say False +say True +say bar +say hello!!!!! +function demo:bbb +execute if data storage some:path/to/storage some.foo.path +execute if data storage some:path/to/storage some.foo.path run say hi +execute if data storage some:path/to/storage some.foo.path{my: "compound"} +execute if data storage some:path/to/storage some.foo.path{my: "compound"} run say hi +execute if data storage some:path/to/storage some.bar.path +execute if data storage some:path/to/storage some.bar.path run say hi +execute if data storage some:path/to/storage some.bar.path{my: "compound"} +execute if data storage some:path/to/storage some.bar.path{my: "compound"} run say hi +execute if data storage some:path/to/storage some.bar.path[{my: "subscript"}] +execute if data storage some:path/to/storage some.bar.path[{my: "subscript"}] run say hi +execute if data storage some:path/to/storage some.foo.path{my: "compound"}.stuff[42].beep.bar[{my: "subscript"}].boop run say hi +execute if data storage some:path/to/storage foo.bar +execute if data storage some:path/to/storage "some.foo.path" +execute if data storage some:path/to/storage something.cool[3].foo +execute if score some_fake_player some_objective matches 0 run say yes +execute if score 00000000-0000-0000-0000-000000000001 some_objective matches 0 run say yes +execute if score 12345678-1234-5678-1234-567812345678 some_objective matches 0 run say yes +execute at @e[type=creeper] run summon lightning_bolt +data merge storage demo:foo {custom_data1: [0, 1, 2], custom_data2: [0, 1, 2]} +setblock 0 0 0 minecraft:stone +say same thing +tellraw @a {"text": "hello world"} +execute at @s run particle minecraft:dust 0 1 1 0.9 ~ ~1 ~ 0 0 0 0.01 1 force +execute at @s run particle minecraft:block yellow_concrete ~ ~1.62 ~ 0 0.4 0 0 30 force +execute at @s run particle minecraft:block minecraft:light_blue_concrete ~ ~1 ~ 0.05 0.1 0.05 0 3 +execute as @a[scores={foo=1..}] run scoreboard players remove @s foo 1 +execute as @a[scores={bar=1..}] run scoreboard players remove @s bar 1 +scoreboard players set @p tmp -8 +tp @s ~12 ~23 ~34 +tp @s ~12 23 ~34 +tp @s 12 23 34 +tp @s ~12 ~23 ~34 +tp @s ^12 ^23 ^34 +tp @s -12 -23 -34 +tp @s ~-12 ~-23 ~-34 +tp @s ^-12 ^-23 ^-34 +say 0 a +say 1 b +say 2 c +say 1 +say 2 +say 3 +execute if block ~ ~6 ~ air if block ~ ~5 ~ air if block ~ ~4 ~ air if block ~ ~3 ~ air if block ~ ~2 ~ air if block ~ ~1 ~ air run say nothing above! +say 0 +say 1 +say bolt implements a __rebind__(rhs) magic method that gets called when you reassign a value to a variable +say let's try it out by manually building a class +scoreboard players set a global 123 +scoreboard players set a global 456 +scoreboard players set b global 789 +scoreboard players operation b global = a global +scoreboard players operation bolt_basic.tmp.0 global = b global +scoreboard players add bolt_basic.tmp.0 global 6 +scoreboard players operation bolt_basic.tmp.1 global = bolt_basic.tmp.0 global +scoreboard players operation bolt_basic.tmp.1 global += a global +scoreboard players operation a global += bolt_basic.tmp.1 global +scoreboard players add b global 1 +say you can use nonlocal to create fake classes +say 1 +say 2 +say 10 +execute if score #temp abc matches 1.. run say foo +execute as @p run function #demo:yolo_funcs +say [False, False, True, False, False, False, True, False, False, False, True, False, True, True, True, True] +say hello +say hello +say hello +say hello +say thing == 1 +say thing == 2 +say thing == 3 +say thing == 99 +say thing == hello +say thing == world +execute if score @s foo matches 1 run function demo:foo/nested_execute_1 +execute if score @s foo matches 0 run say no +scoreboard players operation global bolt_basic.tmp0 = global is_cool +execute unless score global is_cool matches 0 run scoreboard players operation global bolt_basic.tmp0 = global is_nice +scoreboard players operation global is_awesome = global bolt_basic.tmp0 +scoreboard players set global bolt_basic.tmp1 1 +execute unless score global is_awesome matches 0 run scoreboard players set global bolt_basic.tmp1 0 +scoreboard players operation global bolt_basic.tmp2 = global is_awesome +execute unless score global bolt_basic.tmp1 matches 0 run scoreboard players operation global bolt_basic.tmp2 = global force_awesomeness +execute unless score global bolt_basic.tmp2 matches 0 run say hello +say this is from demo:utils +``` + +`@function demo:import_a` + +```mcfunction +say demo:import_b +say demo:import_a +say 84 +``` + +`@function demo:import_b` + +```mcfunction +say demo:import_a +say demo:import_b +say 14 +``` + +`@function(strip_final_newline) demo:thing` + +```mcfunction + +``` + +`@function demo:utils` + +```mcfunction +say this doesn't conflict with the demo:utils module +``` + +`@function demo:foo/nested_execute_0` + +```mcfunction +say multiline is automatically enabled +say nesting is automatically enabled +say implicit execute is automatically enabled +say relative location is automatically enabled +say ABCABCABCABCABC +``` + +`@function demo:abc` + +```mcfunction +say foo +say bar +``` + +`@function demo:xyz` + +```mcfunction +say foo +say bar +``` + +`@function demo:bbb` + +```mcfunction +say 0 +say 1 +say 2 +``` + +`@function demo:foo/nested_execute_1` + +```mcfunction +say yes +execute if score @s bar matches 1 run say with bar +``` + +`@function demo:foo/tree_0/0_7` + +```mcfunction +execute if score @s thingy matches ..1 run function demo:foo/tree_0/0_1 +execute if score @s thingy matches 2..3 run function demo:foo/tree_0/2_3 +execute if score @s thingy matches 4..5 run function demo:foo/tree_0/4_5 +execute if score @s thingy matches 6 run say g +execute if score @s thingy matches 7 run say h +``` + +`@function demo:foo/tree_0/0_1` + +```mcfunction +execute if score @s thingy matches 0 run say a +execute if score @s thingy matches 1 run say b +``` + +`@function demo:foo/tree_0/2_3` + +```mcfunction +execute if score @s thingy matches 2 run say c +execute if score @s thingy matches 3 run say d +``` + +`@function demo:foo/tree_0/4_5` + +```mcfunction +execute if score @s thingy matches 4 run say e +execute if score @s thingy matches 5 run say f +``` + +`@function demo:foo/tree_0/8_14` + +```mcfunction +execute if score @s thingy matches ..9 run function demo:foo/tree_0/8_9 +execute if score @s thingy matches 10..11 run function demo:foo/tree_0/10_11 +execute if score @s thingy matches 12 run say m +execute if score @s thingy matches 13 run say n +execute if score @s thingy matches 14 run say o +``` + +`@function demo:foo/tree_0/8_9` + +```mcfunction +execute if score @s thingy matches 8 run say i +execute if score @s thingy matches 9 run say j +``` + +`@function demo:foo/tree_0/10_11` + +```mcfunction +execute if score @s thingy matches 10 run say k +execute if score @s thingy matches 11 run say l +``` + +`@function demo:foo/tree_0/15_21` + +```mcfunction +execute if score @s thingy matches ..16 run function demo:foo/tree_0/15_16 +execute if score @s thingy matches 17..18 run function demo:foo/tree_0/17_18 +execute if score @s thingy matches 19 run say t +execute if score @s thingy matches 20 run say u +execute if score @s thingy matches 21 run say v +``` + +`@function demo:foo/tree_0/15_16` + +```mcfunction +execute if score @s thingy matches 15 run say p +execute if score @s thingy matches 16 run say q +``` + +`@function demo:foo/tree_0/17_18` + +```mcfunction +execute if score @s thingy matches 17 run say r +execute if score @s thingy matches 18 run say s +``` + +`@function demo:foo/tree_0/22_28` + +```mcfunction +execute if score @s thingy matches ..23 run function demo:foo/tree_0/22_23 +execute if score @s thingy matches 24..25 run function demo:foo/tree_0/24_25 +execute if score @s thingy matches 26 run say 0 +execute if score @s thingy matches 27 run say 1 +execute if score @s thingy matches 28 run say 2 +``` + +`@function demo:foo/tree_0/22_23` + +```mcfunction +execute if score @s thingy matches 22 run say w +execute if score @s thingy matches 23 run say x +``` + +`@function demo:foo/tree_0/24_25` + +```mcfunction +execute if score @s thingy matches 24 run say y +execute if score @s thingy matches 25 run say z +``` + +`@function demo:foo/tree_0/29_35` + +```mcfunction +execute if score @s thingy matches ..30 run function demo:foo/tree_0/29_30 +execute if score @s thingy matches 31..32 run function demo:foo/tree_0/31_32 +execute if score @s thingy matches 33 run say 7 +execute if score @s thingy matches 34 run say 8 +execute if score @s thingy matches 35 run say 9 +``` + +`@function demo:foo/tree_0/29_30` + +```mcfunction +execute if score @s thingy matches 29 run say 3 +execute if score @s thingy matches 30 run say 4 +``` + +`@function demo:foo/tree_0/31_32` + +```mcfunction +execute if score @s thingy matches 31 run say 5 +execute if score @s thingy matches 32 run say 6 +``` + +`@function demo:foo/small_tree/0_3` + +```mcfunction +execute if score @s thingy matches ..1 run function demo:foo/small_tree/0_1 +execute if score @s thingy matches 2.. run function demo:foo/small_tree/2_3 +``` + +`@function demo:foo/small_tree/0_1` + +```mcfunction +execute if score @s thingy matches 0 run say 0 +execute if score @s thingy matches 1 run say 1 +``` + +`@function demo:foo/small_tree/2_3` + +```mcfunction +execute if score @s thingy matches 2 run say 2 +execute if score @s thingy matches 3 run say 3 +``` + +`@function demo:foo/small_tree/4_7` + +```mcfunction +execute if score @s thingy matches ..5 run function demo:foo/small_tree/4_5 +execute if score @s thingy matches 6.. run function demo:foo/small_tree/6_7 +``` + +`@function demo:foo/small_tree/4_5` + +```mcfunction +execute if score @s thingy matches 4 run say 4 +execute if score @s thingy matches 5 run say 5 +``` + +`@function demo:foo/small_tree/6_7` + +```mcfunction +execute if score @s thingy matches 6 run say 6 +execute if score @s thingy matches 7 run say 7 +``` + +`@function demo:foo/tree_1/10_14` + +```mcfunction +execute if score @s thingy matches ..12 run function demo:foo/tree_1/10_12 +execute if score @s thingy matches 13.. run function demo:foo/tree_1/13_14 +``` + +`@function demo:foo/tree_1/10_12` + +```mcfunction +execute if score @s thingy matches ..11 run function demo:foo/tree_1/10_11 +execute if score @s thingy matches 12 run say 12 +``` + +`@function demo:foo/tree_1/10_11` + +```mcfunction +execute if score @s thingy matches 10 run say 10 +execute if score @s thingy matches 11 run say 11 +``` + +`@function demo:foo/tree_1/13_14` + +```mcfunction +execute if score @s thingy matches 13 run say 13 +execute if score @s thingy matches 14 run say 14 +``` + +`@function demo:foo/tree_1/15_19` + +```mcfunction +execute if score @s thingy matches ..17 run function demo:foo/tree_1/15_17 +execute if score @s thingy matches 18.. run function demo:foo/tree_1/18_19 +``` + +`@function demo:foo/tree_1/15_17` + +```mcfunction +execute if score @s thingy matches ..16 run function demo:foo/tree_1/15_16 +execute if score @s thingy matches 17 run say 17 +``` + +`@function demo:foo/tree_1/15_16` + +```mcfunction +execute if score @s thingy matches 15 run say 15 +execute if score @s thingy matches 16 run say 16 +``` + +`@function demo:foo/tree_1/18_19` + +```mcfunction +execute if score @s thingy matches 18 run say 18 +execute if score @s thingy matches 19 run say 19 +``` + +`@function demo:no_quotes_lol` + +```mcfunction +say that's neat +``` + +`@function_tag demo:yolo_funcs` + +```json +{ + "values": [ + "demo:foo" + ] +} +``` + +`@predicate demo:check_scores` + +```json +[ + { + "condition": "minecraft:entity_scores", + "entity": "this", + "scores": { + "foo": 1 + } + }, + { + "condition": "minecraft:entity_scores", + "entity": "killer_player", + "scores": { + "bar": 1 + } + } +] +``` + +### felix + +`@function_tag felix:howdy` + +```json +{ + "values": [ + "demo:foo", + "demo:foo" + ] +} +``` + +## Resource pack + +`@resource_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 8, + "description": "" + } +} +``` + +### minecraft + +`@language minecraft:aaaa` + +```json +{ + "menu.singleplayer": "AAAA", + "something.else": "bonjour", + "yaml.key1": "BONJOUR", + "yaml.key2": "Bonjour" +} +``` + +`@particle minecraft:end_rod` + +```json +{ + "textures": [ + "minecraft:glitter_7", + "minecraft:glitter_6", + "minecraft:glitter_5", + "minecraft:glitter_4", + "minecraft:glitter_3", + "minecraft:glitter_2", + "minecraft:glitter_1", + "minecraft:glitter_0" + ] +} +``` diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md new file mode 100644 index 000000000..341f5246b --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md @@ -0,0 +1,38 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:chicken` + +```mcfunction +say Go forth, my minions! +summon chicken ~ ~ ~ {Tags: ["quack0"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~1 ~ ~ {Tags: ["quack1"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~2 ~ ~ {Tags: ["quack2"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~3 ~ ~ {Tags: ["quack3"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~4 ~ ~ {Tags: ["quack4"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~5 ~ ~ {Tags: ["quack5"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~6 ~ ~ {Tags: ["quack6"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~7 ~ ~ {Tags: ["quack7"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~8 ~ ~ {Tags: ["quack8"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~9 ~ ~ {Tags: ["quack9"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~10 ~ ~ {Tags: ["quack10"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~11 ~ ~ {Tags: ["quack11"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~12 ~ ~ {Tags: ["quack12"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~13 ~ ~ {Tags: ["quack13"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~14 ~ ~ {Tags: ["quack14"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +summon chicken ~15 ~ ~ {Tags: ["quack15"], IsChickenJockey: 1b, Passengers: [{id: "zombie", IsBaby: 1b, ActiveEffects: [{Id: 14, Duration: 999999, Amplifier: 1, ShowParticles: 0b}]}]} +``` diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md new file mode 100644 index 000000000..a9fc9a91a --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md @@ -0,0 +1,35 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say 123 +``` + +`@function demo:generated` + +```mcfunction +execute if score #smithed.core load.status matches 1 run function demo:0 +``` + +`@function demo:0` + +```mcfunction +data merge storage smithed:log {message: '["Could not find ",{"text":"#smithed.prevent_aggression 0.0.1","color":"red"}]', type: "ERROR"} +function #smithed:core/pub/technical/tools/log +``` diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md new file mode 100644 index 000000000..cfb90a622 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md @@ -0,0 +1,36 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### pack_1 + +`@function pack_1:bob` + +```mcfunction +say Hello, Bob! +``` + +`@function pack_1:utils` + +```mcfunction +say Hello, Alice! +``` + +### pack_2 + +`@function pack_2:carol` + +```mcfunction +say Hello, Carol! +``` diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md new file mode 100644 index 000000000..9b3620f61 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say (1, 2, 3) +``` diff --git a/packages/bolt/tests/snapshots/sandbox__run_0__0.txt b/packages/bolt/tests/snapshots/sandbox__run_0__0.txt new file mode 100644 index 000000000..7d05f8411 --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_0__0.txt @@ -0,0 +1,5 @@ +import sys +--- +Traceback (most recent call last): + File "demo:foo", line 1, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden module 'sys'. diff --git a/packages/bolt/tests/snapshots/sandbox__run_1__0.txt b/packages/bolt/tests/snapshots/sandbox__run_1__0.txt new file mode 100644 index 000000000..9e85c54f5 --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_1__0.txt @@ -0,0 +1,7 @@ +def f(): + pass +f.__code__ +--- +Traceback (most recent call last): + File "demo:foo", line 3, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden attribute '__code__' of . diff --git a/packages/bolt/tests/snapshots/sandbox__run_2__0.txt b/packages/bolt/tests/snapshots/sandbox__run_2__0.txt new file mode 100644 index 000000000..6e7398bfa --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_2__0.txt @@ -0,0 +1,7 @@ +def hello(): + return "world" +say hello.__name__.capitalize() +--- +Traceback (most recent call last): + File "demo:foo", line 3, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden attribute '__name__' of . diff --git a/packages/bolt/tests/snapshots/sandbox__run_3__0.txt b/packages/bolt/tests/snapshots/sandbox__run_3__0.txt new file mode 100644 index 000000000..0a15d53e9 --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_3__0.txt @@ -0,0 +1,5 @@ +say ctx.project_id +--- +Traceback (most recent call last): + File "demo:foo", line 1, in demo:foo +AttributeError: 'NoneType' object has no attribute 'project_id' diff --git a/packages/bolt/tests/snapshots/sandbox__run_4__0.txt b/packages/bolt/tests/snapshots/sandbox__run_4__0.txt new file mode 100644 index 000000000..826cd519f --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_4__0.txt @@ -0,0 +1,5 @@ +print(f'foo {str.__name__} bar') +--- +Traceback (most recent call last): + File "demo:foo", line 1, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden attribute '__name__' of . diff --git a/packages/bolt/tests/snapshots/sandbox__run_5__0.txt b/packages/bolt/tests/snapshots/sandbox__run_5__0.txt new file mode 100644 index 000000000..f9c91c703 --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_5__0.txt @@ -0,0 +1,5 @@ +"a{0.__class__}b".format(42) +--- +Traceback (most recent call last): + File "demo:foo", line 1, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden attribute 'format' of . diff --git a/packages/bolt/tests/snapshots/sandbox__run_6__0.txt b/packages/bolt/tests/snapshots/sandbox__run_6__0.txt new file mode 100644 index 000000000..76f3e205b --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_6__0.txt @@ -0,0 +1,5 @@ +foo = "a{x.__class__}b".format_map({"x":42}) +--- +Traceback (most recent call last): + File "demo:foo", line 1, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden attribute 'format_map' of . diff --git a/packages/bolt/tests/snapshots/sandbox__run_7__0.txt b/packages/bolt/tests/snapshots/sandbox__run_7__0.txt new file mode 100644 index 000000000..23a53b614 --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_7__0.txt @@ -0,0 +1,5 @@ +say __name__.format() +--- +Traceback (most recent call last): + File "demo:foo", line 1, in demo:foo +bolt.contrib.sandbox.SecurityError: Access forbidden attribute 'format' of . diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py new file mode 100644 index 000000000..3967d90e9 --- /dev/null +++ b/packages/bolt/tests/test_bolt.py @@ -0,0 +1,54 @@ +from pathlib import Path + +import pytest +from beet import Context, Function, run_beet +from pytest_insta import SnapshotFixture + +from mecha import AstNode, CompilationDatabase, CompilationUnit, DiagnosticError, Mecha +from mecha.contrib.annotate_diagnostics import annotate_diagnostics +from bolt import Runtime + +BOLT_EXAMPLES = [ + Function(source) + for source in Path("tests/resources/bolt_examples.mcfunction") + .read_text() + .split("###\n") +] + + +@pytest.fixture(scope="session") +def ctx_bolt(): + with run_beet({"require": ["bolt"]}) as ctx: + yield ctx + + +@pytest.mark.parametrize( + "source", + params := BOLT_EXAMPLES, + ids=range(len(params)), +) +def test_parse(snapshot: SnapshotFixture, ctx_bolt: Context, source: Function): + mc = ctx_bolt.inject(Mecha) + runtime = ctx_bolt.inject(Runtime) + + ast = None + diagnostics = None + + try: + ast = mc.parse(source) + except DiagnosticError as exc: + diagnostics = exc.diagnostics + + if ast: + assert snapshot() == f"{source.text}---\n{ast.dump()}\n" + text, output, refs = runtime.codegen(ast) + text = text or "# Nothing\n" + assert snapshot() == f"{text}---\noutput = {output}\n---\n" + "".join( + f"_mecha_refs[{i}]\n{obj.dump(shallow=True) if isinstance(obj, AstNode) else repr(obj)}\n" + for i, obj in enumerate(refs) + ) + elif diagnostics: + database = CompilationDatabase() + database[source] = CompilationUnit(source=source.text) + annotate_diagnostics(database, diagnostics) + assert snapshot() == source.text diff --git a/packages/bolt/tests/test_examples.py b/packages/bolt/tests/test_examples.py new file mode 100644 index 000000000..3c1013e50 --- /dev/null +++ b/packages/bolt/tests/test_examples.py @@ -0,0 +1,14 @@ +import os + +import pytest +from beet import run_beet +from lectern import Document +from pytest_insta import SnapshotFixture + + +@pytest.mark.parametrize("directory", os.listdir("examples")) +def test_build(snapshot: SnapshotFixture, directory: str): + with run_beet(directory=f"examples/{directory}") as ctx: + document = ctx.inject(Document) + document.markdown_serializer.flat = True + assert snapshot("pack.md") == document diff --git a/packages/bolt/tests/test_sandbox.py b/packages/bolt/tests/test_sandbox.py new file mode 100644 index 000000000..e98096fcf --- /dev/null +++ b/packages/bolt/tests/test_sandbox.py @@ -0,0 +1,35 @@ +from pathlib import Path + +import pytest +from beet import Context, Function, run_beet +from beet.toolchain.utils import format_exc +from pytest_insta import SnapshotFixture + +from mecha import CompilationError, Mecha + +SANDBOX_EXAMPLES = [ + Function(source) + for source in Path("tests/resources/sandbox_examples.mcfunction") + .read_text() + .split("###\n") +] + + +@pytest.fixture(scope="session") +def ctx_sandbox(): + with run_beet({"require": ["bolt.contrib.sandbox"]}) as ctx: + yield ctx + + +@pytest.mark.parametrize( + "source", + params := SANDBOX_EXAMPLES, + ids=range(len(params)), +) +def test_run(snapshot: SnapshotFixture, ctx_sandbox: Context, source: Function): + mc = ctx_sandbox.inject(Mecha) + + with pytest.raises(CompilationError) as exc_info: + mc.compile(source, resource_location="demo:foo") + + assert snapshot() == f"{source.text}---\n{format_exc(exc_info.value.__cause__)}" # type: ignore From 310dea913e51ad4b135825d4fd62e478adc669c5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 25 Apr 2022 00:54:57 +0000 Subject: [PATCH 0782/1554] 0.2.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 7 +++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 packages/bolt/CHANGELOG.md diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md new file mode 100644 index 000000000..73dde15ac --- /dev/null +++ b/packages/bolt/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + + + +## v0.2.0 (2022-04-25) +### Feature +* Setup project ([`50b4bea`](https://github.com/mcbeet/bolt/commit/50b4beaf0faad49fad9785423378002d2bdd482a)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 48f43ed57..ad9bbbffa 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.1.0" +__version__ = "0.2.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 2573b89a7..f9e68702c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.1.0" +version = "0.2.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 088177416eb781252da4283675e4aebfd8a54c7e Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 25 Apr 2022 01:00:24 +0000 Subject: [PATCH 0783/1554] 0.48.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index a8bf41c8c..5a2913066 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.48.0 (2022-04-25) +### Feature +* Remove bolt ([`10a47a9`](https://github.com/mcbeet/mecha/commit/10a47a93538fe17ee7d2a38fa18cea32a386c72c)) + ## v0.47.0 (2022-04-19) ### Feature * Add bolt modules in data packs ([`1ad6291`](https://github.com/mcbeet/mecha/commit/1ad6291c3bba002c6e159f74bd57c8c0c614b70d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 9e7d96cce..b665af3ea 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.47.0" +__version__ = "0.48.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2e2beaaee..521b9ca4a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.47.0" +version = "0.48.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 6e153e196a0b4d31e80483b97280f078496ba2fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 01:43:17 +0000 Subject: [PATCH 0784/1554] build(deps): bump mecha from 0.47.0 to 0.48.0 Bumps [mecha](https://github.com/mcbeet/mecha) from 0.47.0 to 0.48.0. - [Release notes](https://github.com/mcbeet/mecha/releases) - [Changelog](https://github.com/mcbeet/mecha/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/mecha/compare/v0.47.0...v0.48.0) --- updated-dependencies: - dependency-name: mecha dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/bolt/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 317332697..21d8f5989 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.47.0" +version = "0.48.0" description = "A powerful Minecraft command library" category = "main" optional = false @@ -1069,8 +1069,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.47.0-py3-none-any.whl", hash = "sha256:e7808b209edb8ad035cbcf59deff250f62a03ef153228094792886f73c70d63d"}, - {file = "mecha-0.47.0.tar.gz", hash = "sha256:05ce4e8710baf5e6331343bd20ecdf959b18305f3194c5df715fa409af60914b"}, + {file = "mecha-0.48.0-py3-none-any.whl", hash = "sha256:f6b209e4e17e4adf8a31b02b00ed3fe7d0a72d5ef5ed20b664864ea850eba0e3"}, + {file = "mecha-0.48.0.tar.gz", hash = "sha256:d971afbc8fed6155c0ed608c1816e3d312ed977a44769657aa8c8e31915c6c50"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, From f503edfcbfd9c2da29743b0650ffadb8608b0d72 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 26 Apr 2022 03:18:20 +0200 Subject: [PATCH 0785/1554] fix: use BubbleException --- packages/lectern/lectern/fragment.py | 13 ++++++++++--- packages/lectern/poetry.lock | 22 +++++++++++----------- packages/lectern/pyproject.toml | 2 +- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index c7b45bf4c..a62c0311d 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -9,18 +9,25 @@ from typing import Any, Optional, Sequence, Type, TypeVar, overload from urllib.request import urlopen -from beet import BinaryFile, BinaryFileBase, Cache, File, FormattedPipelineException +from beet import BinaryFile, BinaryFileBase, BubbleException, Cache, File from beet.core.utils import FileSystemPath FileType = TypeVar("FileType", bound=File[Any, Any]) -class InvalidFragment(FormattedPipelineException): +class InvalidFragment(BubbleException): """Raised when a fragment can not be processed.""" + message: str + line: int + def __init__(self, message: str, line: int): super().__init__(message, line) - self.message = message + f" (line {line + 1})" + self.message = message + self.line = line + + def __str__(self) -> str: + return f"{self.message} (line {self.line + 1})" @dataclass(frozen=True) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index d5f5621c7..a2bb3f478 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -22,21 +22,21 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.55.1" +version = "0.60.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -click = ">=8.0.1,<9.0.0" +click = ">=8.1.2,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -Jinja2 = ">=3.0.1,<4.0.0" +Jinja2 = ">=3.1.1,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.9.0,<0.10.0" pydantic = ">=1.9.0,<2.0.0" -PyYAML = ">=5.4.1,<7.0.0" +PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" [package.extras] @@ -280,11 +280,11 @@ trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.2" +version = "3.1.1" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -784,7 +784,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f9e9847222939d6396b1afaa430b99a5b7e35d7646a1f84bdd893bb9c635a2db" +content-hash = "505860403c4b0569e4c48bb491c291eb501f5aeac9c7736e23d7cea47ed185a2" [metadata.files] atomicwrites = [ @@ -796,8 +796,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] beet = [ - {file = "beet-0.55.1-py3-none-any.whl", hash = "sha256:fc5abcd6f21f05d55e19462c890c981b9cf60eba9c23555c88f041032af8d312"}, - {file = "beet-0.55.1.tar.gz", hash = "sha256:5ded421ad7200902f903a48258932f5cddcdc7cd7ce93b4abdb0b21f62345681"}, + {file = "beet-0.60.0-py3-none-any.whl", hash = "sha256:bf409343a20c28d0d85a59f37be5944381e6e6d9c7a03bcab6c9e3300e898d21"}, + {file = "beet-0.60.0.tar.gz", hash = "sha256:7af9e81d576d3ec6ae1ed3c236dd58bb7236e18cffedda455558c253fedebf6d"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -967,8 +967,8 @@ jeepney = [ {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ - {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, - {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, + {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, + {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, ] keyring = [ {file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 3aa9ce50e..ea5366aaf 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.55.1" +beet = ">=0.60.0" markdown-it-py = ">=1.1" click = "^8.1.2" From 26994f3ef7ef3d3dc8fcc6e3d6e0cdfbb4ef9c26 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 26 Apr 2022 03:31:05 +0200 Subject: [PATCH 0786/1554] chore: make pyright happy --- packages/lectern/lectern/directive.py | 6 +++--- packages/lectern/lectern/serialize.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index 5dc978e9a..cdeb52821 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -82,16 +82,16 @@ class NamespacedResourceDirective: def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): full_name = fragment.expect("full_name") - file_instance: Any = fragment.as_file(self.file_type) + file_instance: Any = fragment.as_file(self.file_type) # type: ignore pack = assets if self.file_type in assets.namespace_type.field_map else data proxy: Any = pack[self.file_type] if fragment.modifier == "append": - current_file = proxy.setdefault(full_name, self.file_type("")) + current_file = proxy.setdefault(full_name, self.file_type("")) # type: ignore current_file.text += file_instance.text elif fragment.modifier == "prepend": - current_file = proxy.setdefault(full_name, self.file_type("")) + current_file = proxy.setdefault(full_name, self.file_type("")) # type: ignore current_file.text = file_instance.text + current_file.text elif fragment.modifier == "merge": proxy.merge({full_name: file_instance}) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index e6fec4643..28ee205ac 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -79,8 +79,8 @@ def __post_init__(self): path.name[: -len(self.extension)] if self.extension else path.name ) - if not self.extension and isinstance(self.file_instance, NamespaceFile): - self.extension = self.file_instance.extension + if not self.extension: + self.extension = getattr(self.file_instance, "extension", self.extension) self.content_type = ( guess_type(f"{self.filename}{self.extension}")[0] @@ -298,7 +298,7 @@ def serialize_pack( self.serialize_file_instance( mapping[file_type], f"{name}:{path}", - file_instance, + file_instance, # type: ignore external_files, external_prefix, ) @@ -308,7 +308,7 @@ def serialize_pack( self.serialize_file_instance( pack_directive, f"{namespace.directory}/{name}/{'/'.join(file_type.scope)}/{path}{file_type.extension}", - file_instance, + file_instance, # type: ignore external_files, external_prefix, ) @@ -328,7 +328,7 @@ def serialize_file_instance( self, directive: str, argument: str, - file_instance: Union[File[Any, Any], NamespaceFile], + file_instance: File[Any, Any], external_files: Optional[Dict[str, File[Any, Any]]] = None, external_prefix: str = "", ) -> Iterator[str]: From 42356c12f2ad944cd4428dc989f0ecb8cf0ef71c Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 26 Apr 2022 01:32:13 +0000 Subject: [PATCH 0787/1554] 0.20.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 3ab342d9a..2f2266458 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.20.1 (2022-04-26) +### Fix +* Use BubbleException ([`d2ded22`](https://github.com/mcbeet/lectern/commit/d2ded223f3c65d1ebf98daee56d69881e0e83140)) + ## v0.20.0 (2022-04-06) ### Feature * Add format sniffer and allow regular text format in code blocks ([`85420af`](https://github.com/mcbeet/lectern/commit/85420afe3ef856f570c4583936a606d824cbff2a)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index dfefbf5c4..2df60514f 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -6,4 +6,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.20.0" +__version__ = "0.20.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index ea5366aaf..9549e49b8 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.20.0" +version = "0.20.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 564a66955f2b2cc20ea78227fc1b6afa58285a73 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 26 Apr 2022 03:35:32 +0200 Subject: [PATCH 0788/1554] fix: use BubbleException and WrappedException --- packages/mecha/mecha/diagnostic.py | 9 ++++++--- packages/mecha/mecha/dispatch.py | 12 ++++++++---- packages/mecha/poetry.lock | 16 ++++++++-------- packages/mecha/pyproject.toml | 4 ++-- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index 3337ba4aa..4de4fcbf6 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -10,7 +10,7 @@ from types import TracebackType from typing import Any, Iterator, List, Literal, Optional, Type -from beet import FormattedPipelineException, TextFileBase +from beet import BubbleException, TextFileBase from tokenstream import UNKNOWN_LOCATION, SourceLocation from .error import MechaError @@ -180,11 +180,14 @@ def __str__(self) -> str: return f"{self.diagnostics}\n\n{details}" -class DiagnosticErrorSummary(FormattedPipelineException): +class DiagnosticErrorSummary(BubbleException): """Raised for showing a summary of how many errors occurred.""" diagnostics: DiagnosticCollection def __init__(self, diagnostics: DiagnosticCollection): super().__init__(diagnostics) - self.message = str(diagnostics) + self.diagnostics = diagnostics + + def __str__(self) -> str: + return str(self.diagnostics) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 293650813..c9033fefe 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -33,7 +33,7 @@ overload, ) -from beet import FormattedPipelineException, PipelineFallthroughException +from beet import BubbleException, WrappedException from beet.core.utils import extra_field from .ast import AstChildren, AstNode @@ -42,13 +42,17 @@ T = TypeVar("T") -class CompilationError(FormattedPipelineException): +class CompilationError(WrappedException): """Raised when an error occurs in a rule.""" + message: str + def __init__(self, message: str) -> None: super().__init__(message) self.message = message - self.format_cause = True + + def __str__(self) -> str: + return self.message @dataclass @@ -279,7 +283,7 @@ def use_rule(self, node: AstNode, name: Optional[str] = None) -> Iterator[None]: ) except StopIteration: raise - except PipelineFallthroughException: + except BubbleException: raise except Exception as exc: msg = "Compilation raised an exception." diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 5ef466b2e..424883c16 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.57.0" +version = "0.60.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -314,14 +314,14 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.20.0" +version = "0.20.1" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.55.1" +beet = ">=0.60.0" click = ">=8.1.2,<9.0.0" markdown-it-py = ">=1.1" @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d8ec6f9cbe828476fefc5fd980c9e5f2df79c67488c54dd38c0e1b3df7bda88b" +content-hash = "dc1d6edb2a8ce741e7a8bbe198afea7ffc543b1d36c54fe8b5466fba3cf0596f" [metadata.files] atomicwrites = [ @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.57.0-py3-none-any.whl", hash = "sha256:daaf5dedfabe173935aed45cf4e7570947bac5bbe8fe069721846af52c6c3a62"}, - {file = "beet-0.57.0.tar.gz", hash = "sha256:6ef70983ae87852399e4831c1f11b10616c8911d93a14e2dc3e10814e91bd9da"}, + {file = "beet-0.60.0-py3-none-any.whl", hash = "sha256:bf409343a20c28d0d85a59f37be5944381e6e6d9c7a03bcab6c9e3300e898d21"}, + {file = "beet-0.60.0.tar.gz", hash = "sha256:7af9e81d576d3ec6ae1ed3c236dd58bb7236e18cffedda455558c253fedebf6d"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1003,8 +1003,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.20.0-py3-none-any.whl", hash = "sha256:31ae3c5473dbde55b16620b9ca474519103f41497b6bc9523190071b25df60da"}, - {file = "lectern-0.20.0.tar.gz", hash = "sha256:cde89569ada5d159ee1f5aa7c07c43efd70cf8582d5bea1d6423cd1889f0f09f"}, + {file = "lectern-0.20.1-py3-none-any.whl", hash = "sha256:bc49ee4baced19aa4402cfb4d494d04af9dc1937e8406d98722e04e02abe7e59"}, + {file = "lectern-0.20.1.tar.gz", hash = "sha256:ec0d72235fe14ea66ff332262102424476d19c77b383e2785c9f88bd60b53908"}, ] markdown-it-py = [ {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 521b9ca4a..3d83cf1ca 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.57.0" +beet = ">=0.60.0" tokenstream = "^1.4" [tool.poetry.dev-dependencies] @@ -32,7 +32,7 @@ pytest = "^7.1.1" isort = "^5.10.1" python-semantic-release = "^7.28.0" pytest-insta = "^0.1.11" -lectern = ">=0.20.0" +lectern = ">=0.20.1" [tool.poetry.scripts] mecha = "mecha.cli:main" From b8518c5e897b1ea5fe58e12b192e59f5427b5b95 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 26 Apr 2022 01:36:51 +0000 Subject: [PATCH 0789/1554] 0.48.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 5a2913066..f401acfe9 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.48.1 (2022-04-26) +### Fix +* Use BubbleException and WrappedException ([`31a1009`](https://github.com/mcbeet/mecha/commit/31a100981a4251466cbe4de586266646ddef8239)) + ## v0.48.0 (2022-04-25) ### Feature * Remove bolt ([`10a47a9`](https://github.com/mcbeet/mecha/commit/10a47a93538fe17ee7d2a38fa18cea32a386c72c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index b665af3ea..4a97a7c7f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.48.0" +__version__ = "0.48.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 3d83cf1ca..4696d519d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.48.0" +version = "0.48.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 94d9be6ab1a939d6f275ffcd4d28a6894f252a52 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 26 Apr 2022 03:42:34 +0200 Subject: [PATCH 0790/1554] fix: use BubbleException --- packages/bolt/bolt/runtime.py | 10 ++-------- packages/bolt/poetry.lock | 24 ++++++++++++------------ packages/bolt/pyproject.toml | 5 +++-- packages/bolt/tests/test_sandbox.py | 5 ++--- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index faf816e94..096f1630f 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -21,13 +21,7 @@ from types import CodeType from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union -from beet import ( - Context, - PipelineFallthroughException, - TextFile, - TextFileBase, - generate_tree, -) +from beet import BubbleException, Context, TextFile, TextFileBase, generate_tree from beet.core.utils import JsonDict, required_field from mecha import ( AstCacheBackend, @@ -412,7 +406,7 @@ def root(self, node: AstRoot) -> AstRoot: module = self.runtime.get_module(node) try: return self.runtime.get_output(module) - except PipelineFallthroughException: + except BubbleException: raise except UnusableCompilationUnit as exc: if not exc.compilation_unit.diagnostics.error: diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 21d8f5989..733f47820 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.59.0" +version = "0.60.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -314,14 +314,14 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.20.0" +version = "0.20.1" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.55.1" +beet = ">=0.60.0" click = ">=8.1.2,<9.0.0" markdown-it-py = ">=1.1" @@ -364,14 +364,14 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.48.0" +version = "0.48.1" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.57.0" +beet = ">=0.60.0" tokenstream = ">=1.4,<2.0" [[package]] @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "09abe0f491a1f36ce752143b46dd4024347a4eb4937127a6f1cbcb2de3bef23d" +content-hash = "d330df634ba906e0f8bb89ee4ca16a2de3b0a303afbc77a0cbe22a0e74505865" [metadata.files] atomicwrites = [ @@ -837,8 +837,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.59.0-py3-none-any.whl", hash = "sha256:81a60dd1804d6a6eb03beb4a77e108d93a7fa5ae7da4d2f50158db4da6235304"}, - {file = "beet-0.59.0.tar.gz", hash = "sha256:c760970157bb8fd61a3f50cbe2424870f0d0e4688ca353db19a821d81a5c0e53"}, + {file = "beet-0.60.0-py3-none-any.whl", hash = "sha256:bf409343a20c28d0d85a59f37be5944381e6e6d9c7a03bcab6c9e3300e898d21"}, + {file = "beet-0.60.0.tar.gz", hash = "sha256:7af9e81d576d3ec6ae1ed3c236dd58bb7236e18cffedda455558c253fedebf6d"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1015,8 +1015,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.20.0-py3-none-any.whl", hash = "sha256:31ae3c5473dbde55b16620b9ca474519103f41497b6bc9523190071b25df60da"}, - {file = "lectern-0.20.0.tar.gz", hash = "sha256:cde89569ada5d159ee1f5aa7c07c43efd70cf8582d5bea1d6423cd1889f0f09f"}, + {file = "lectern-0.20.1-py3-none-any.whl", hash = "sha256:bc49ee4baced19aa4402cfb4d494d04af9dc1937e8406d98722e04e02abe7e59"}, + {file = "lectern-0.20.1.tar.gz", hash = "sha256:ec0d72235fe14ea66ff332262102424476d19c77b383e2785c9f88bd60b53908"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, @@ -1069,8 +1069,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.48.0-py3-none-any.whl", hash = "sha256:f6b209e4e17e4adf8a31b02b00ed3fe7d0a72d5ef5ed20b664864ea850eba0e3"}, - {file = "mecha-0.48.0.tar.gz", hash = "sha256:d971afbc8fed6155c0ed608c1816e3d312ed977a44769657aa8c8e31915c6c50"}, + {file = "mecha-0.48.1-py3-none-any.whl", hash = "sha256:a22a4f6815ab232fcc896836684d56beb82599babf2b137d83b8106f5a963cab"}, + {file = "mecha-0.48.1.tar.gz", hash = "sha256:3c2a6a5da4ae2912939e2a590bd7d0a15dccbe3651c7efbf2369f91dbf880a99"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f9e68702c..0afb9ff48 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,7 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -mecha = ">=0.47.0" +beet = ">=0.60.0" +mecha = ">=0.48.1" [tool.poetry.dev-dependencies] pytest = "^7.1.2" @@ -31,7 +32,7 @@ black = "^22.3.0" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" -lectern = ">=0.20.0" +lectern = ">=0.20.1" [tool.pytest.ini_options] addopts = "tests bolt --doctest-modules" diff --git a/packages/bolt/tests/test_sandbox.py b/packages/bolt/tests/test_sandbox.py index e98096fcf..d9029e9a6 100644 --- a/packages/bolt/tests/test_sandbox.py +++ b/packages/bolt/tests/test_sandbox.py @@ -2,10 +2,9 @@ import pytest from beet import Context, Function, run_beet -from beet.toolchain.utils import format_exc -from pytest_insta import SnapshotFixture - +from beet.core.utils import format_exc from mecha import CompilationError, Mecha +from pytest_insta import SnapshotFixture SANDBOX_EXAMPLES = [ Function(source) From ffdbcd01e89d456fe881642066ee13efc85c7745 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 26 Apr 2022 01:44:13 +0000 Subject: [PATCH 0791/1554] 0.2.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 73dde15ac..28144b97d 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.2.1 (2022-04-26) +### Fix +* Use BubbleException ([`c8ce2fb`](https://github.com/mcbeet/bolt/commit/c8ce2fb478fa35aff0cf768cdb320302cf123378)) + ## v0.2.0 (2022-04-25) ### Feature * Setup project ([`50b4bea`](https://github.com/mcbeet/bolt/commit/50b4beaf0faad49fad9785423378002d2bdd482a)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index ad9bbbffa..6310a223d 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.2.0" +__version__ = "0.2.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 0afb9ff48..6010714c4 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.2.0" +version = "0.2.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From bf8ed6ce2428e6ba0eb27bec201e1d4702df8346 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 02:56:44 +0200 Subject: [PATCH 0792/1554] chore: update beet --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index a2bb3f478..7cb2296cb 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.60.0" +version = "0.63.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -784,7 +784,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "505860403c4b0569e4c48bb491c291eb501f5aeac9c7736e23d7cea47ed185a2" +content-hash = "b41f25dd7c9d80c2acafcfb61a6ef75b5e27f32dd6fccdba53efb831742c98a9" [metadata.files] atomicwrites = [ @@ -796,8 +796,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] beet = [ - {file = "beet-0.60.0-py3-none-any.whl", hash = "sha256:bf409343a20c28d0d85a59f37be5944381e6e6d9c7a03bcab6c9e3300e898d21"}, - {file = "beet-0.60.0.tar.gz", hash = "sha256:7af9e81d576d3ec6ae1ed3c236dd58bb7236e18cffedda455558c253fedebf6d"}, + {file = "beet-0.63.0-py3-none-any.whl", hash = "sha256:7fce5a7137789d38e8507e9cab671bfec4b11e19153fb8b45af7f485d803f094"}, + {file = "beet-0.63.0.tar.gz", hash = "sha256:5250c0716cc652165fb68beaf197e252acc0ecf957766f079948de735c5d0ecc"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9549e49b8..59b01856a 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -35,6 +35,7 @@ pytest = "^7.1.1" isort = "^5.10.1" python-semantic-release = "^7.27.1" pytest-insta = "^0.1.11" +beet = ">=0.63.0" [tool.poetry.scripts] lectern = "lectern.cli:main" From 3ad8d122d6c8255b80904f967b04f960b76ff3b5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 02:57:18 +0200 Subject: [PATCH 0793/1554] fix: return bool to indicate if files were added --- packages/lectern/lectern/document.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 09a5018c3..0f850e5ed 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -92,14 +92,14 @@ def add( self, source: str, external_files: Optional[FileSystemPath] = None, - ): + ) -> bool: """Extract pack fragments from source.""" if self.markdown_sniffer.search(source): - self.add_markdown(source, external_files) + return self.add_markdown(source, external_files) else: - self.add_text(source) + return self.add_text(source) - def add_text(self, source: str): + def add_text(self, source: str) -> bool: """Extract pack fragments from plain text.""" assets, data = self.text_extractor.extract( source=source, @@ -108,12 +108,13 @@ def add_text(self, source: str): ) self.assets.merge(assets) self.data.merge(data) + return bool(assets or data) def add_markdown( self, source: str, external_files: Optional[FileSystemPath] = None, - ): + ) -> bool: """Extract pack fragments from markdown.""" assets, data = self.markdown_extractor.extract( source=source, @@ -123,6 +124,7 @@ def add_markdown( ) self.assets.merge(assets) self.data.merge(data) + return bool(assets or data) def get_text(self) -> str: """Turn the data pack and the resource pack into text.""" From a12de3792420a9e091e7e481929d2b22c86e3ff4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 03:02:20 +0200 Subject: [PATCH 0794/1554] feat: add lectern.contrib.messaging --- packages/lectern/lectern/contrib/messaging.py | 42 ++++++++++++++ .../snapshots/messaging__build_0__0.pack.md | 22 ++++++++ .../snapshots/messaging__build_1__0.pack.md | 22 ++++++++ .../snapshots/messaging__build_2__0.pack.md | 22 ++++++++ .../snapshots/messaging__build_3__0.pack.md | 22 ++++++++ .../snapshots/messaging__build_4__0.pack.md | 22 ++++++++ packages/lectern/tests/test_messaging.py | 55 +++++++++++++++++++ 7 files changed, 207 insertions(+) create mode 100644 packages/lectern/lectern/contrib/messaging.py create mode 100644 packages/lectern/tests/snapshots/messaging__build_0__0.pack.md create mode 100644 packages/lectern/tests/snapshots/messaging__build_1__0.pack.md create mode 100644 packages/lectern/tests/snapshots/messaging__build_2__0.pack.md create mode 100644 packages/lectern/tests/snapshots/messaging__build_3__0.pack.md create mode 100644 packages/lectern/tests/snapshots/messaging__build_4__0.pack.md create mode 100644 packages/lectern/tests/test_messaging.py diff --git a/packages/lectern/lectern/contrib/messaging.py b/packages/lectern/lectern/contrib/messaging.py new file mode 100644 index 000000000..74fc37e1f --- /dev/null +++ b/packages/lectern/lectern/contrib/messaging.py @@ -0,0 +1,42 @@ +"""Plugin for handling markdown coming from messaging apps.""" + + +__all__ = [ + "MessagingOptions", + "messaging", +] + + +from beet import Context, Function, ListOption, configurable +from pydantic import BaseModel + +from lectern import Document + + +class MessagingOptions(BaseModel): + input: ListOption[str] = ListOption() + + +def beet_default(ctx: Context): + ctx.require(messaging) + + +@configurable(validator=MessagingOptions) +def messaging(ctx: Context, opts: MessagingOptions): + """Plugin for handling markdown coming from messaging apps. + + The extractor cache is disabled to prevent remote files from being + written to disk. If the message doesn't produce any files we try to + form a default function by concatenating all code blocks. + """ + document = ctx.inject(Document) + document.markdown_extractor.cache = None + + for message in opts.input.entries(): + if not document.add(message): + code_blocks = [ + token.content + for token in document.markdown_extractor.parser.parse(message) # type: ignore + if token.type in ["fence", "code_block"] + ] + ctx.generate("{short_hash}", Function("\n###\n".join(code_blocks))) diff --git a/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md new file mode 100644 index 000000000..821d60286 --- /dev/null +++ b/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### msg + +`@function msg:az4ih8` + +```mcfunction +say hello1 +``` diff --git a/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md new file mode 100644 index 000000000..b97b8a2da --- /dev/null +++ b/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello2 +``` diff --git a/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md new file mode 100644 index 000000000..70e498860 --- /dev/null +++ b/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello3 +``` diff --git a/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md new file mode 100644 index 000000000..30c615461 --- /dev/null +++ b/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello4 +``` diff --git a/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md new file mode 100644 index 000000000..18b5e7f3a --- /dev/null +++ b/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello5 +``` diff --git a/packages/lectern/tests/test_messaging.py b/packages/lectern/tests/test_messaging.py new file mode 100644 index 000000000..d7ddd8076 --- /dev/null +++ b/packages/lectern/tests/test_messaging.py @@ -0,0 +1,55 @@ +from itertools import count +from textwrap import dedent + +import pytest +from beet import run_beet +from pytest_insta import SnapshotFixture + +from lectern import Document + +SAMPLES = [ + """ + ``` + say hello1 + ``` + """, + """ + @function demo:foo + say hello2 + """, + """ + ``` + @function demo:foo + say hello3 + ``` + """, + """ + ``` + # @function demo:foo + say hello4 + ``` + """, + """ + `@function demo:foo` + ``` + say hello5 + ``` + """, +] + + +@pytest.mark.parametrize("message", [dedent(m).strip() for m in SAMPLES], ids=count()) +def test_build(snapshot: SnapshotFixture, message: str): + config = { + "name": "msg", + "pipeline": ["lectern.contrib.messaging"], + "meta": { + "messaging": { + "input": message, + } + }, + } + with run_beet(config) as ctx: + document = ctx.inject(Document) + document.markdown_serializer.flat = True + assert snapshot("pack.md") == document From 0e863b7d2bfe40059546ebc1a1575d87feed7eb8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 03:41:48 +0200 Subject: [PATCH 0795/1554] feat: add LinkFragmentLoader --- packages/lectern/lectern/__init__.py | 1 + packages/lectern/lectern/contrib/messaging.py | 6 +++- packages/lectern/lectern/loaders.py | 30 +++++++++++++++++++ packages/lectern/lectern/plugin.py | 5 +++- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 packages/lectern/lectern/loaders.py diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 2df60514f..fcd3023ee 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -2,6 +2,7 @@ from .document import * from .extract import * from .fragment import * +from .loaders import * from .plugin import * from .prefetch import * from .serialize import * diff --git a/packages/lectern/lectern/contrib/messaging.py b/packages/lectern/lectern/contrib/messaging.py index 74fc37e1f..f77405fdb 100644 --- a/packages/lectern/lectern/contrib/messaging.py +++ b/packages/lectern/lectern/contrib/messaging.py @@ -7,13 +7,16 @@ ] +from typing import Literal + from beet import Context, Function, ListOption, configurable from pydantic import BaseModel -from lectern import Document +from lectern import Document, LinkFragmentLoader class MessagingOptions(BaseModel): + links: Literal["enable", "ignore", "disable"] = "enable" input: ListOption[str] = ListOption() @@ -30,6 +33,7 @@ def messaging(ctx: Context, opts: MessagingOptions): form a default function by concatenating all code blocks. """ document = ctx.inject(Document) + document.loaders.append(LinkFragmentLoader(status=opts.links)) document.markdown_extractor.cache = None for message in opts.input.entries(): diff --git a/packages/lectern/lectern/loaders.py b/packages/lectern/lectern/loaders.py new file mode 100644 index 000000000..19c0fc7ed --- /dev/null +++ b/packages/lectern/lectern/loaders.py @@ -0,0 +1,30 @@ +__all__ = [ + "LinkFragmentLoader", +] + + +from dataclasses import dataclass +from typing import Literal, Mapping, Optional + +from .directive import Directive +from .fragment import Fragment, InvalidFragment + + +@dataclass +class LinkFragmentLoader: + """Loader for validating link fragments.""" + + status: Literal["enable", "ignore", "disable"] = "enable" + + def __call__( + self, + fragment: Fragment, + directives: Mapping[str, Directive], + ) -> Optional[Fragment]: + if fragment.url or fragment.modifier == "download": + if self.status == "ignore": + return None + if self.status == "disable": + msg = "Link fragments are disabled." + raise InvalidFragment(msg, fragment.start_line) + return fragment diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 8efda12fd..26ce6772b 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -5,16 +5,18 @@ import subprocess -from typing import List, Optional +from typing import List, Literal, Optional from beet import Context, configurable from pydantic import BaseModel from .document import Document +from .loaders import LinkFragmentLoader class LecternOptions(BaseModel): load: List[str] = [] + links: Literal["enable", "ignore", "disable"] = "enable" snapshot: Optional[str] = None snapshot_flat: bool = False external_files: Optional[str] = None @@ -29,6 +31,7 @@ def beet_default(ctx: Context): def lectern(ctx: Context, opts: LecternOptions): """Plugin that handles markdown files with lectern.""" document = ctx.inject(Document) + document.loaders.append(LinkFragmentLoader(status=opts.links)) for pattern in opts.load: for path in ctx.directory.glob(pattern): From 8bb5bc1c261888cbd58af87a63ae4a24d3962c73 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 29 Apr 2022 01:43:03 +0000 Subject: [PATCH 0796/1554] 0.21.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 8 ++++++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 2f2266458..8c4b9c5cd 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.21.0 (2022-04-29) +### Feature +* Add LinkFragmentLoader ([`9d2980c`](https://github.com/mcbeet/lectern/commit/9d2980cbcb439ce8b5218c75abc6c8299222ab0f)) +* Add lectern.contrib.messaging ([`e94e460`](https://github.com/mcbeet/lectern/commit/e94e460f882b421b97c4108c583a7a11ecfd2886)) + +### Fix +* Return bool to indicate if files were added ([`6ae62bd`](https://github.com/mcbeet/lectern/commit/6ae62bd50917ab8da2d1da86258d3ef3bc183a18)) + ## v0.20.1 (2022-04-26) ### Fix * Use BubbleException ([`d2ded22`](https://github.com/mcbeet/lectern/commit/d2ded223f3c65d1ebf98daee56d69881e0e83140)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index fcd3023ee..d2b91ede9 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.20.1" +__version__ = "0.21.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 59b01856a..2cf7eaf9c 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.20.1" +version = "0.21.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From af360be4a671f0c9579a2fd20d21afad51fa2aec Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 04:07:03 +0200 Subject: [PATCH 0797/1554] fix: use packageable paths --- packages/lectern/lectern/plugin.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/lectern/lectern/plugin.py b/packages/lectern/lectern/plugin.py index 26ce6772b..44127b072 100644 --- a/packages/lectern/lectern/plugin.py +++ b/packages/lectern/lectern/plugin.py @@ -5,9 +5,10 @@ import subprocess +from glob import glob from typing import List, Literal, Optional -from beet import Context, configurable +from beet import Context, ListOption, PackageablePath, configurable from pydantic import BaseModel from .document import Document @@ -15,11 +16,11 @@ class LecternOptions(BaseModel): - load: List[str] = [] + load: ListOption[PackageablePath] = ListOption() links: Literal["enable", "ignore", "disable"] = "enable" snapshot: Optional[str] = None snapshot_flat: bool = False - external_files: Optional[str] = None + external_files: Optional[PackageablePath] = None scripts: List[List[str]] = [] @@ -33,8 +34,8 @@ def lectern(ctx: Context, opts: LecternOptions): document = ctx.inject(Document) document.loaders.append(LinkFragmentLoader(status=opts.links)) - for pattern in opts.load: - for path in ctx.directory.glob(pattern): + for pattern in opts.load.entries(): + for path in glob(str(ctx.directory / pattern)): document.load(path) for arguments in opts.scripts: From 78643292e3fcc9af842f5ef078a3b36f37182376 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 29 Apr 2022 02:08:16 +0000 Subject: [PATCH 0798/1554] 0.21.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 8c4b9c5cd..f367c3e34 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.21.1 (2022-04-29) +### Fix +* Use packageable paths ([`8e42a07`](https://github.com/mcbeet/lectern/commit/8e42a075649db47c6165749e594e331b46c819f6)) + ## v0.21.0 (2022-04-29) ### Feature * Add LinkFragmentLoader ([`9d2980c`](https://github.com/mcbeet/lectern/commit/9d2980cbcb439ce8b5218c75abc6c8299222ab0f)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index d2b91ede9..fa0f2b296 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.21.0" +__version__ = "0.21.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 2cf7eaf9c..72f32bfa9 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.21.0" +version = "0.21.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 80c8fd2ba1d0fb15d334cfa2eed13f1fbc21f32b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 04:20:27 +0200 Subject: [PATCH 0799/1554] fix: don't do fancy concatenation --- packages/lectern/lectern/contrib/messaging.py | 2 +- .../snapshots/messaging__build_5__0.pack.md | 24 +++++++++++++++++++ packages/lectern/tests/test_messaging.py | 9 +++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 packages/lectern/tests/snapshots/messaging__build_5__0.pack.md diff --git a/packages/lectern/lectern/contrib/messaging.py b/packages/lectern/lectern/contrib/messaging.py index f77405fdb..597dfd80d 100644 --- a/packages/lectern/lectern/contrib/messaging.py +++ b/packages/lectern/lectern/contrib/messaging.py @@ -43,4 +43,4 @@ def messaging(ctx: Context, opts: MessagingOptions): for token in document.markdown_extractor.parser.parse(message) # type: ignore if token.type in ["fence", "code_block"] ] - ctx.generate("{short_hash}", Function("\n###\n".join(code_blocks))) + ctx.generate("{short_hash}", Function("\n".join(code_blocks))) diff --git a/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md new file mode 100644 index 000000000..3f89461bf --- /dev/null +++ b/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md @@ -0,0 +1,24 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### msg + +`@function msg:cbnnd5` + +```mcfunction +say foo + +say bar +``` diff --git a/packages/lectern/tests/test_messaging.py b/packages/lectern/tests/test_messaging.py index d7ddd8076..53d712880 100644 --- a/packages/lectern/tests/test_messaging.py +++ b/packages/lectern/tests/test_messaging.py @@ -35,6 +35,15 @@ say hello5 ``` """, + """ + ``` + say foo + ``` + something else + ``` + say bar + ``` + """, ] From b4f098b04a02494b900c00e5be26393277a4714f Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 29 Apr 2022 02:21:16 +0000 Subject: [PATCH 0800/1554] 0.21.2 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index f367c3e34..ca356cf92 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.21.2 (2022-04-29) +### Fix +* Don't do fancy concatenation ([`8d7dd36`](https://github.com/mcbeet/lectern/commit/8d7dd367553524ca061e92edb6c78f9f0fd4ce4c)) + ## v0.21.1 (2022-04-29) ### Fix * Use packageable paths ([`8e42a07`](https://github.com/mcbeet/lectern/commit/8e42a075649db47c6165749e594e331b46c819f6)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index fa0f2b296..dbc581d06 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.21.1" +__version__ = "0.21.2" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 72f32bfa9..12b1f2ebe 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.21.1" +version = "0.21.2" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 5aeecd7d37df7393470625b248de416207702f08 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 19:24:31 +0200 Subject: [PATCH 0801/1554] feat: allow nbt compound interpolation --- packages/bolt/bolt/helpers.py | 18 ++++++++++++++-- packages/bolt/bolt/parse.py | 4 ++-- .../bolt/examples/bolt_basic/random_data.json | 3 +++ .../src/data/demo/functions/foo.mcfunction | 4 ++++ .../src/data/demo/modules/utils.bolt | 8 +++++++ .../examples__build_bolt_basic__0.pack.md | 21 +++++++++++++++++++ 6 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 packages/bolt/examples/bolt_basic/random_data.json diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 939a8431c..742920256 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -10,8 +10,6 @@ from typing import Any, Callable, ContextManager, Dict, Optional, Type from uuid import UUID -from tokenstream import set_location - from mecha import ( AstBool, AstChildren, @@ -23,6 +21,7 @@ AstJson, AstMessage, AstNbt, + AstNbtCompound, AstNbtPath, AstNode, AstNumber, @@ -42,6 +41,7 @@ AstVector3, AstWord, ) +from tokenstream import set_location from .utils import internal @@ -69,6 +69,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "interpolate_greedy": converter(AstGreedy.from_value), "interpolate_json": converter(AstJson.from_value), "interpolate_nbt": converter(AstNbt.from_value), + "interpolate_nbt_compound": NbtCompoundConverter(converter(AstNbt.from_value)), "interpolate_nbt_path": converter(AstNbtPath.from_value), "interpolate_range": converter(AstRange.from_value), "interpolate_resource_location": converter(AstResourceLocation.from_value), @@ -188,6 +189,19 @@ def wrapper(obj: Any, node: AstNode) -> AstNode: return wrapper +@dataclass +class NbtCompoundConverter: + """Converter for nbt compounds.""" + + nbt_converter: Callable[[Any, AstNode], AstNode] + + @internal + def __call__(self, obj: Any, node: AstNode) -> AstNode: + if isinstance(node := self.nbt_converter(obj, node), AstNbtCompound): + return node + raise ValueError(f"Invalid nbt compound of type {type(obj)!r}.") + + @dataclass class EntityConverter: """Converter for entities.""" diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index cc9efe99c..fb0955dbe 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -46,8 +46,6 @@ from typing import Any, Dict, List, Optional, Set, Tuple, cast from beet.core.utils import required_field -from tokenstream import InvalidSyntax, Token, TokenStream, set_location - from mecha import ( AlternativeParser, AstChildren, @@ -68,6 +66,7 @@ normalize_whitespace, string_to_number, ) +from tokenstream import InvalidSyntax, Token, TokenStream, set_location from .ast import ( AstAssignment, @@ -288,6 +287,7 @@ def get_bolt_parsers( "greedy": InterpolationParser("greedy", parsers["greedy"]), "json": InterpolationParser("json", parsers["json"]), "nbt": InterpolationParser("nbt", parsers["nbt"]), + "nbt_compound": InterpolationParser("nbt_compound", parsers["nbt_compound"]), "nbt_path": InterpolationParser("nbt_path", parsers["nbt_path"]), "range": InterpolationParser("range", parsers["range"], fallback=True), "resource_location_or_tag": CommentDisambiguation( diff --git a/packages/bolt/examples/bolt_basic/random_data.json b/packages/bolt/examples/bolt_basic/random_data.json new file mode 100644 index 000000000..d086709f6 --- /dev/null +++ b/packages/bolt/examples/bolt_basic/random_data.json @@ -0,0 +1,3 @@ +{ + "value": 42 +} diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 8bd9bf620..07a9cbd33 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -606,3 +606,7 @@ if is_awesome or Cond("force_awesomeness"): from ./utils import something something() + +from ./utils import load_storage +load_storage(./random_data, "random_data.json") +if data storage ./random_data {value: 42} say json loaded successfully diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt b/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt index 8143a1168..4198b4fe1 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt +++ b/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt @@ -1,2 +1,10 @@ +import json + def something(): say f"this is from {__name__}" + +def load_storage(storage_id, filename): + path = ctx.directory / filename + merge function_tag minecraft:load {"values": [generate_path("load_storage")]} + append function generate_path("load_storage"): + data merge storage storage_id json.loads(path.read_text()) diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 1be3cb6a3..c49cd89ae 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -254,6 +254,7 @@ scoreboard players operation global bolt_basic.tmp2 = global is_awesome execute unless score global bolt_basic.tmp1 matches 0 run scoreboard players operation global bolt_basic.tmp2 = global force_awesomeness execute unless score global bolt_basic.tmp2 matches 0 run say hello say this is from demo:utils +execute if data storage demo:random_data {value: 42} run say json loaded successfully ``` `@function demo:import_a` @@ -598,6 +599,26 @@ say that's neat } ``` +### minecraft + +`@function_tag minecraft:load` + +```json +{ + "values": [ + "bolt_basic:load_storage" + ] +} +``` + +### bolt_basic + +`@function bolt_basic:load_storage` + +```mcfunction +data merge storage demo:random_data {value: 42} +``` + ## Resource pack `@resource_pack pack.mcmeta` From 91c887da1ea5ab1f8b066d998c790109c985f17f Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 29 Apr 2022 17:25:30 +0000 Subject: [PATCH 0802/1554] 0.3.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 28144b97d..b1d54ac24 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.0 (2022-04-29) +### Feature +* Allow nbt compound interpolation ([`b6f964f`](https://github.com/mcbeet/bolt/commit/b6f964fc16805bedc1d3be94a7d042acf4112551)) + ## v0.2.1 (2022-04-26) ### Fix * Use BubbleException ([`c8ce2fb`](https://github.com/mcbeet/bolt/commit/c8ce2fb478fa35aff0cf768cdb320302cf123378)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 6310a223d..93891a58a 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.2.1" +__version__ = "0.3.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 6010714c4..c1e6a1f27 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.2.1" +version = "0.3.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From e4ffcd2099a7ed8953c00ad22d2b1395fabc6f70 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 29 Apr 2022 22:52:20 +0200 Subject: [PATCH 0803/1554] fix: make message interpolation final --- packages/bolt/bolt/parse.py | 7 ++++++- .../examples/bolt_basic/src/data/demo/modules/utils.bolt | 1 + .../tests/snapshots/examples__build_bolt_basic__0.pack.md | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index fb0955dbe..a850fa5b3 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -312,7 +312,7 @@ def get_bolt_parsers( "sort_order", parsers["sort_order"], fallback=True ), "gamemode": InterpolationParser("gamemode", parsers["gamemode"], fallback=True), - "message": InterpolationParser("message", parsers["message"]), + "message": InterpolationParser("message", parsers["message"], final=True), "block_pos": InterpolationParser("vec3", parsers["block_pos"], fallback=True), "column_pos": InterpolationParser("vec2", parsers["column_pos"], fallback=True), "rotation": InterpolationParser("vec2", parsers["rotation"], fallback=True), @@ -470,6 +470,7 @@ class InterpolationParser: parser: Parser prefix: Optional[str] = None fallback: bool = False + final: bool = False def __call__(self, stream: TokenStream) -> Any: order = ["interpolation", "original"] @@ -486,6 +487,10 @@ def __call__(self, stream: TokenStream) -> Any: converter=self.converter, value=node, ) + if self.final: + current_index = stream.index + stream.expect("newline", "eof") + stream.index = current_index return set_location(node, prefix or node.value, node.value) elif parser == "original": return self.parser(stream) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt b/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt index 4198b4fe1..3953beb33 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt +++ b/packages/bolt/examples/bolt_basic/src/data/demo/modules/utils.bolt @@ -8,3 +8,4 @@ def load_storage(storage_id, filename): merge function_tag minecraft:load {"values": [generate_path("load_storage")]} append function generate_path("load_storage"): data merge storage storage_id json.loads(path.read_text()) + say json loaded! diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index c49cd89ae..6953b75c6 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -617,6 +617,7 @@ say that's neat ```mcfunction data merge storage demo:random_data {value: 42} +say json loaded! ``` ## Resource pack From 5b21676298dfe5bc44a148a6d987040f13b598dc Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 29 Apr 2022 20:52:56 +0000 Subject: [PATCH 0804/1554] 0.3.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index b1d54ac24..ade693044 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.1 (2022-04-29) +### Fix +* Make message interpolation final ([`b46b165`](https://github.com/mcbeet/bolt/commit/b46b1652ee78a3224911a7a57173c9f3f236244e)) + ## v0.3.0 (2022-04-29) ### Feature * Allow nbt compound interpolation ([`b6f964f`](https://github.com/mcbeet/bolt/commit/b6f964fc16805bedc1d3be94a7d042acf4112551)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 93891a58a..6720e818d 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.0" +__version__ = "0.3.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index c1e6a1f27..91c2695ec 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.3.0" +version = "0.3.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 74388d618252f46c0342ce3b0f7d1d35d7be9050 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 30 Apr 2022 02:33:49 +0200 Subject: [PATCH 0805/1554] fix: proper check for final expressions --- packages/bolt/bolt/parse.py | 24 ++++++-- .../tests/resources/bolt_examples.mcfunction | 14 +++++ .../tests/snapshots/bolt__parse_18__0.txt | 2 +- .../tests/snapshots/bolt__parse_200__0.txt | 2 +- .../tests/snapshots/bolt__parse_201__0.txt | 42 ++++++++++++++ .../tests/snapshots/bolt__parse_201__1.txt | 36 ++++++++++++ .../tests/snapshots/bolt__parse_202__0.txt | 40 +++++++++++++ .../tests/snapshots/bolt__parse_202__1.txt | 25 ++++++++ .../tests/snapshots/bolt__parse_203__0.txt | 58 +++++++++++++++++++ .../tests/snapshots/bolt__parse_203__1.txt | 25 ++++++++ .../tests/snapshots/bolt__parse_204__0.txt | 7 +++ .../tests/snapshots/bolt__parse_28__0.txt | 2 +- packages/bolt/tests/test_bolt.py | 4 +- 13 files changed, 270 insertions(+), 11 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_201__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_201__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_202__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_202__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_203__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_203__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_204__0.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index a850fa5b3..732c8e755 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -9,6 +9,7 @@ "create_bolt_root_parser", "ExecuteIfConditionConstraint", "BranchScopeManager", + "check_final_expression", "InterpolationParser", "parse_statement", "AssignmentTargetParser", @@ -462,6 +463,21 @@ def __call__(self, stream: TokenStream) -> Any: stream.data["branch_scope"] = branch_scope +def check_final_expression(stream: TokenStream): + current_index = stream.index + + if consume_line_continuation(stream): + exc = InvalidSyntax("Invalid indent following final expression.") + raise set_location(exc, stream.get()) + + next_token = stream.get() + if next_token and not next_token.match("newline", "eof"): + exc = InvalidSyntax("Trailing input following final expression.") + raise set_location(exc, stream.current) + + stream.index = current_index + + @dataclass class InterpolationParser: """Parser for interpolation.""" @@ -488,9 +504,7 @@ def __call__(self, stream: TokenStream) -> Any: value=node, ) if self.final: - current_index = stream.index - stream.expect("newline", "eof") - stream.index = current_index + check_final_expression(stream) return set_location(node, prefix or node.value, node.value) elif parser == "original": return self.parser(stream) @@ -566,9 +580,7 @@ def parse_statement(stream: TokenStream) -> Any: node = set_location(node, node.target, node.value) # Make sure that the statement is not followed by anything. - current_index = stream.index - stream.expect("newline", "eof") - stream.index = current_index + check_final_expression(stream) return node diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 474bebef0..6aea9625b 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -748,3 +748,17 @@ for a in [False, True]: a = 1 def f(): a += 1 +### +a = 2 +say a +### +a = 2 +say a normal message +### +a = 2 +say a + normal + message +### +"hey" + "hey" diff --git a/packages/bolt/tests/snapshots/bolt__parse_18__0.txt b/packages/bolt/tests/snapshots/bolt__parse_18__0.txt index 361818698..37d73e545 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_18__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_18__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected eof or newline but got literal '§§§'. +#>ERROR Trailing input following final expression. # line 1, column 4 # 1 | 64 §§§ # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt index 7d6270463..18b0724fe 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt @@ -7,5 +7,5 @@ def f(): # : ^ # Notes: # - Use 'global a' or 'nonlocal a' to mutate the variable defined in outer scope. -# - Expected assignment, eof or newline but got literal '+='. +# - Expected assignment but got literal '+='. a += 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_201__0.txt b/packages/bolt/tests/snapshots/bolt__parse_201__0.txt new file mode 100644 index 000000000..0ec8af685 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_201__0.txt @@ -0,0 +1,42 @@ +a = 2 +say a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + prefix: None + converter: 'message' + value: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + value: 'a' diff --git a/packages/bolt/tests/snapshots/bolt__parse_201__1.txt b/packages/bolt/tests/snapshots/bolt__parse_201__1.txt new file mode 100644 index 000000000..77a33c72b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_201__1.txt @@ -0,0 +1,36 @@ +_mecha_lineno = [1, 8], [1, 2] +_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var2: + _mecha_var0 = 2 + a = _mecha_var0 + _mecha_var1 = a + _mecha_var1 = _mecha_helper_interpolate_message(_mecha_var1, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) +_mecha_var3 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2)) +--- +output = _mecha_var3 +--- +_mecha_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + prefix: None + converter: 'message' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + identifier: 'say:message' + arguments: + +_mecha_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_202__0.txt b/packages/bolt/tests/snapshots/bolt__parse_202__0.txt new file mode 100644 index 000000000..ba1bf0a32 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_202__0.txt @@ -0,0 +1,40 @@ +a = 2 +say a normal message +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + fragments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + value: 'a normal message' diff --git a/packages/bolt/tests/snapshots/bolt__parse_202__1.txt b/packages/bolt/tests/snapshots/bolt__parse_202__1.txt new file mode 100644 index 000000000..deb992a2c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_202__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 2 + a = _mecha_var0 + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=21) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_203__0.txt b/packages/bolt/tests/snapshots/bolt__parse_203__0.txt new file mode 100644 index 000000000..0d20046e4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_203__0.txt @@ -0,0 +1,58 @@ +a = 2 +say a + normal + message +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 2 + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=34, lineno=4, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=4, colno=12) + fragments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + value: 'a' + + location: SourceLocation(pos=15, lineno=3, colno=4) + end_location: SourceLocation(pos=16, lineno=3, colno=5) + value: ' ' + + location: SourceLocation(pos=16, lineno=3, colno=5) + end_location: SourceLocation(pos=22, lineno=3, colno=11) + value: 'normal' + + location: SourceLocation(pos=26, lineno=4, colno=4) + end_location: SourceLocation(pos=27, lineno=4, colno=5) + value: ' ' + + location: SourceLocation(pos=27, lineno=4, colno=5) + end_location: SourceLocation(pos=34, lineno=4, colno=12) + value: 'message' diff --git a/packages/bolt/tests/snapshots/bolt__parse_203__1.txt b/packages/bolt/tests/snapshots/bolt__parse_203__1.txt new file mode 100644 index 000000000..d34eb155b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_203__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1], [1] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + _mecha_var0 = 2 + a = _mecha_var0 + _mecha_runtime.commands.append(_mecha_refs[0]) +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +--- +output = _mecha_var2 +--- +_mecha_refs[0] + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=34, lineno=4, colno=12) + identifier: 'say:message' + arguments: + +_mecha_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=4, colno=12) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_204__0.txt b/packages/bolt/tests/snapshots/bolt__parse_204__0.txt new file mode 100644 index 000000000..d68aa8f29 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_204__0.txt @@ -0,0 +1,7 @@ +"hey" +#>ERROR Invalid indent following final expression. +# line 2, column 5 +# 1 | "hey" +# 2 | "hey" +# : ^^^^^ + "hey" diff --git a/packages/bolt/tests/snapshots/bolt__parse_28__0.txt b/packages/bolt/tests/snapshots/bolt__parse_28__0.txt index dddee99be..9628d24cc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_28__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_28__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected eof or newline but got literal '"hey"'. +#>ERROR Trailing input following final expression. # line 1, column 7 # 1 | "hey" "hey" # : ^^^^^ diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py index 3967d90e9..e018abf72 100644 --- a/packages/bolt/tests/test_bolt.py +++ b/packages/bolt/tests/test_bolt.py @@ -2,10 +2,10 @@ import pytest from beet import Context, Function, run_beet -from pytest_insta import SnapshotFixture - from mecha import AstNode, CompilationDatabase, CompilationUnit, DiagnosticError, Mecha from mecha.contrib.annotate_diagnostics import annotate_diagnostics +from pytest_insta import SnapshotFixture + from bolt import Runtime BOLT_EXAMPLES = [ From 3ec883e3a2abe800bc794ef55fd3b03ab0c6c834 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 30 Apr 2022 00:34:26 +0000 Subject: [PATCH 0806/1554] 0.3.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index ade693044..0d2e3bf9b 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.2 (2022-04-30) +### Fix +* Proper check for final expressions ([`57bb1f1`](https://github.com/mcbeet/bolt/commit/57bb1f18b09bc7b9ab04079651668341262a462b)) + ## v0.3.1 (2022-04-29) ### Fix * Make message interpolation final ([`b46b165`](https://github.com/mcbeet/bolt/commit/b46b1652ee78a3224911a7a57173c9f3f236244e)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 6720e818d..cb46c96fa 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.1" +__version__ = "0.3.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 91c2695ec..33510dd6e 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.3.1" +version = "0.3.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From d417e550fbb0a1ff45693bdaf533c712ba06f775 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 30 Apr 2022 02:42:51 +0200 Subject: [PATCH 0807/1554] fix: use next_token --- packages/bolt/bolt/parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 732c8e755..28e12109f 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -473,7 +473,7 @@ def check_final_expression(stream: TokenStream): next_token = stream.get() if next_token and not next_token.match("newline", "eof"): exc = InvalidSyntax("Trailing input following final expression.") - raise set_location(exc, stream.current) + raise set_location(exc, next_token) stream.index = current_index From dbaeed1ecf4ac0a90ccbadab1a5ecef2c73ad950 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 30 Apr 2022 00:43:24 +0000 Subject: [PATCH 0808/1554] 0.3.3 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 0d2e3bf9b..eddb0f227 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.3 (2022-04-30) +### Fix +* Use next_token ([`3fb3aab`](https://github.com/mcbeet/bolt/commit/3fb3aabae017862b89d29c2124d523f2fd0c0e3a)) + ## v0.3.2 (2022-04-30) ### Fix * Proper check for final expressions ([`57bb1f1`](https://github.com/mcbeet/bolt/commit/57bb1f18b09bc7b9ab04079651668341262a462b)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index cb46c96fa..2ad6ceb14 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.2" +__version__ = "0.3.3" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 33510dd6e..ca5f1396a 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.3.2" +version = "0.3.3" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From a03cfe2c7ba67592061d94d6922d9d2fbd99d671 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 30 Apr 2022 23:19:35 +0200 Subject: [PATCH 0809/1554] fix: handle nbt primitives --- packages/mecha/mecha/ast.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index daeeab11c..0391a5044 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -100,7 +100,7 @@ # pyright: reportMissingTypeStubs=false from nbtlib import Byte, ByteArray, Compound, CompoundMatch, Double, Int, IntArray from nbtlib import List as ListTag -from nbtlib import ListIndex, LongArray, NamedKey, Path, String +from nbtlib import ListIndex, LongArray, NamedKey, Numeric, Path, String from tokenstream import UNKNOWN_LOCATION, SourceLocation, set_location from .utils import string_to_number @@ -625,7 +625,9 @@ def from_value(cls, value: Any) -> "AstNbt": @classmethod def from_value(cls, value: Any) -> "AstNbt": """Create nbt ast nodes representing the specified value.""" - if isinstance(value, bool): + if isinstance(value, (Numeric, String)): + return AstNbtValue(value=value) + elif isinstance(value, bool): return AstNbtValue(value=Byte(1 if value else 0)) elif isinstance(value, int): return AstNbtValue(value=Int(value)) @@ -633,6 +635,18 @@ def from_value(cls, value: Any) -> "AstNbt": return AstNbtValue(value=Double(value)) elif isinstance(value, str): return AstNbtValue(value=String(value)) + elif isinstance(value, ByteArray): + return AstNbtByteArray( + elements=AstChildren(cls.from_value(e) for e in value) + ) + elif isinstance(value, IntArray): + return AstNbtIntArray( + elements=AstChildren(cls.from_value(e) for e in value) + ) + elif isinstance(value, LongArray): + return AstNbtLongArray( + elements=AstChildren(cls.from_value(e) for e in value) + ) elif isinstance(value, Mapping): compound: Mapping[Any, Any] = value return AstNbtCompound( From cca22f4f27d27f551a6dc643521d7bd352b6d23a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 30 Apr 2022 21:24:50 +0000 Subject: [PATCH 0810/1554] 0.48.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f401acfe9..90c84a42b 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.48.2 (2022-04-30) +### Fix +* Handle nbt primitives ([`bf065f4`](https://github.com/mcbeet/mecha/commit/bf065f406776fd386ed68db8fb0ae5ad2e6535f3)) + ## v0.48.1 (2022-04-26) ### Fix * Use BubbleException and WrappedException ([`31a1009`](https://github.com/mcbeet/mecha/commit/31a100981a4251466cbe4de586266646ddef8239)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 4a97a7c7f..d6eb301c8 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.48.1" +__version__ = "0.48.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4696d519d..c89a7ccba 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.48.1" +version = "0.48.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 959e593eeb8af2be1f3b51986a2998f2fcd20b32 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 30 Apr 2022 23:27:55 +0200 Subject: [PATCH 0811/1554] fix: update mecha to handle nbtlib instances properly for interpolation --- .../bolt_basic/src/data/demo/functions/foo.mcfunction | 3 +++ packages/bolt/poetry.lock | 8 ++++---- packages/bolt/pyproject.toml | 2 +- .../tests/snapshots/examples__build_bolt_basic__0.pack.md | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 07a9cbd33..d076e73f9 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -296,6 +296,9 @@ import nbtlib mypath5 = nbtlib.Path().something.cool[3].foo if data storage some:path/to/storage mypath5 +foo = nbtlib.Byte(23) +data merge storage some:path/to/storage {Count: foo} + from uuid import UUID def try_entity_interpolation(x): diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 733f47820..a8b28756b 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.48.1" +version = "0.48.2" description = "A powerful Minecraft command library" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d330df634ba906e0f8bb89ee4ca16a2de3b0a303afbc77a0cbe22a0e74505865" +content-hash = "7db9d855750bb78b1a8e7c8f389acdafa0014a334bcd06e7c6192e5edf3bfcc9" [metadata.files] atomicwrites = [ @@ -1069,8 +1069,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.48.1-py3-none-any.whl", hash = "sha256:a22a4f6815ab232fcc896836684d56beb82599babf2b137d83b8106f5a963cab"}, - {file = "mecha-0.48.1.tar.gz", hash = "sha256:3c2a6a5da4ae2912939e2a590bd7d0a15dccbe3651c7efbf2369f91dbf880a99"}, + {file = "mecha-0.48.2-py3-none-any.whl", hash = "sha256:89de6b81ef762074d0d3a5f71053cac354b15c9305c22b110463d29231ab4e44"}, + {file = "mecha-0.48.2.tar.gz", hash = "sha256:0e0fcaf9030dbc0f3cf3ede840bc6442b6f62cef47b608e625f74eb11cfd4fb7"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index ca5f1396a..dbd52a783 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.60.0" -mecha = ">=0.48.1" +mecha = ">=0.48.2" [tool.poetry.dev-dependencies] pytest = "^7.1.2" diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 6953b75c6..524712486 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -183,6 +183,7 @@ execute if data storage some:path/to/storage some.foo.path{my: "compound"}.stuff execute if data storage some:path/to/storage foo.bar execute if data storage some:path/to/storage "some.foo.path" execute if data storage some:path/to/storage something.cool[3].foo +data merge storage some:path/to/storage {Count: 23b} execute if score some_fake_player some_objective matches 0 run say yes execute if score 00000000-0000-0000-0000-000000000001 some_objective matches 0 run say yes execute if score 12345678-1234-5678-1234-567812345678 some_objective matches 0 run say yes From 2a7444115f5080311858b496e4b5f33825d281e0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 30 Apr 2022 21:29:08 +0000 Subject: [PATCH 0812/1554] 0.3.4 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index eddb0f227..46ab0bde5 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.3.4 (2022-04-30) +### Fix +* Update mecha to handle nbtlib instances properly for interpolation ([`fce1766`](https://github.com/mcbeet/bolt/commit/fce1766807e588d5a7c75b7e4e407926c0bc164d)) + ## v0.3.3 (2022-04-30) ### Fix * Use next_token ([`3fb3aab`](https://github.com/mcbeet/bolt/commit/3fb3aabae017862b89d29c2124d523f2fd0c0e3a)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 2ad6ceb14..d624ee1d2 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.3" +__version__ = "0.3.4" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index dbd52a783..5a6c9a49b 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.3.3" +version = "0.3.4" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 023e707d87e4f6437f7ff6010b3351b2f7cc508f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 1 May 2022 06:09:04 +0200 Subject: [PATCH 0813/1554] feat: update beet to allow bolt files outside of the data pack --- packages/bolt/examples/bolt_flat/beet.yml | 7 ++++++ .../bolt/examples/bolt_flat/demo/__init__.py | 0 .../bolt/examples/bolt_flat/demo/main.bolt | 4 ++++ packages/bolt/examples/bolt_flat/demo/math.py | 3 +++ packages/bolt/poetry.lock | 8 +++---- packages/bolt/pyproject.toml | 2 +- .../examples__build_bolt_flat__0.pack.md | 22 +++++++++++++++++++ 7 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 packages/bolt/examples/bolt_flat/beet.yml create mode 100644 packages/bolt/examples/bolt_flat/demo/__init__.py create mode 100644 packages/bolt/examples/bolt_flat/demo/main.bolt create mode 100644 packages/bolt/examples/bolt_flat/demo/math.py create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md diff --git a/packages/bolt/examples/bolt_flat/beet.yml b/packages/bolt/examples/bolt_flat/beet.yml new file mode 100644 index 000000000..f0ae1df3e --- /dev/null +++ b/packages/bolt/examples/bolt_flat/beet.yml @@ -0,0 +1,7 @@ +require: + - bolt +data_pack: + load: + data/demo/modules: "@demo" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_flat/demo/__init__.py b/packages/bolt/examples/bolt_flat/demo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bolt/examples/bolt_flat/demo/main.bolt b/packages/bolt/examples/bolt_flat/demo/main.bolt new file mode 100644 index 000000000..71725add9 --- /dev/null +++ b/packages/bolt/examples/bolt_flat/demo/main.bolt @@ -0,0 +1,4 @@ +from demo.math import add + +function ./foo: + say add(2, 3) diff --git a/packages/bolt/examples/bolt_flat/demo/math.py b/packages/bolt/examples/bolt_flat/demo/math.py new file mode 100644 index 000000000..97d197a26 --- /dev/null +++ b/packages/bolt/examples/bolt_flat/demo/math.py @@ -0,0 +1,3 @@ +def add(a: int, b: int) -> int: + print(a, b) + return a + b diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index a8b28756b..890e20175 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.60.0" +version = "0.64.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7db9d855750bb78b1a8e7c8f389acdafa0014a334bcd06e7c6192e5edf3bfcc9" +content-hash = "fec0023687ac2d9078806be6959cfa8a75e650b2e3e47d8a942ea9012b8353a1" [metadata.files] atomicwrites = [ @@ -837,8 +837,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.60.0-py3-none-any.whl", hash = "sha256:bf409343a20c28d0d85a59f37be5944381e6e6d9c7a03bcab6c9e3300e898d21"}, - {file = "beet-0.60.0.tar.gz", hash = "sha256:7af9e81d576d3ec6ae1ed3c236dd58bb7236e18cffedda455558c253fedebf6d"}, + {file = "beet-0.64.0-py3-none-any.whl", hash = "sha256:faf29bdb85ceedca749d7b00f2bdf8a08822e34a466f144e5e5a0ea0244ccea9"}, + {file = "beet-0.64.0.tar.gz", hash = "sha256:a8bbff0dcc0b622aa0b5fc5d28dcfb7cb9ab5d9c867a2d44df6f1e5181540cde"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 5a6c9a49b..0945d3d11 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,7 +23,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.60.0" +beet = ">=0.64.0" mecha = ">=0.48.2" [tool.poetry.dev-dependencies] diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md new file mode 100644 index 000000000..0732434b8 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say 5 +``` From 9354ccaaa0816c48335bfe8d0a986564080e5f2e Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 1 May 2022 04:10:30 +0000 Subject: [PATCH 0814/1554] 0.4.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 46ab0bde5..9fdba3257 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.4.0 (2022-05-01) +### Feature +* Update beet to allow bolt files outside of the data pack ([`5c0d58c`](https://github.com/mcbeet/bolt/commit/5c0d58c181a053c2c0090d9af8b6eb96b6bc54f8)) + ## v0.3.4 (2022-04-30) ### Fix * Update mecha to handle nbtlib instances properly for interpolation ([`fce1766`](https://github.com/mcbeet/bolt/commit/fce1766807e588d5a7c75b7e4e407926c0bc164d)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index d624ee1d2..147947c3f 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.4" +__version__ = "0.4.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 0945d3d11..7667bbf31 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.3.4" +version = "0.4.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 4ff7bc6108f08c0e257bfaf85c55be9b2f81428c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 1 May 2022 06:17:06 +0200 Subject: [PATCH 0815/1554] fix: leftover print --- packages/bolt/bolt/contrib/extern.py | 27 +++++++++++++++++++ packages/bolt/examples/bolt_flat/demo/math.py | 1 - 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 packages/bolt/bolt/contrib/extern.py diff --git a/packages/bolt/bolt/contrib/extern.py b/packages/bolt/bolt/contrib/extern.py new file mode 100644 index 000000000..344e10e0a --- /dev/null +++ b/packages/bolt/bolt/contrib/extern.py @@ -0,0 +1,27 @@ +"""Plugin for handling bolt modules outside data packs.""" + + +__all__ = [ + "ExternOptions", + "extern", +] + + +from typing import Dict, Optional, Union + +from beet import Context, ListOption, configurable +from pydantic import BaseModel + + +class ExternOptions(BaseModel): + namespace: Optional[str] = None + modules: Union[ListOption[str], Dict[str, ListOption[str]]] = {} + + +def beet_default(ctx: Context): + ctx.require(extern) + + +@configurable(validator=ExternOptions) +def extern(ctx: Context, opts: ExternOptions): + """Plugin for handling bolt modules outside data packs.""" diff --git a/packages/bolt/examples/bolt_flat/demo/math.py b/packages/bolt/examples/bolt_flat/demo/math.py index 97d197a26..e1829c359 100644 --- a/packages/bolt/examples/bolt_flat/demo/math.py +++ b/packages/bolt/examples/bolt_flat/demo/math.py @@ -1,3 +1,2 @@ def add(a: int, b: int) -> int: - print(a, b) return a + b From 1fe5995b4bdc64878013bdcdf820e75b73c72e8f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 1 May 2022 04:18:04 +0000 Subject: [PATCH 0816/1554] 0.4.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 9fdba3257..377bba319 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.4.1 (2022-05-01) +### Fix +* Leftover print ([`3731f2c`](https://github.com/mcbeet/bolt/commit/3731f2c071942d0e131f42432bbd165bdf4e602e)) + ## v0.4.0 (2022-05-01) ### Feature * Update beet to allow bolt files outside of the data pack ([`5c0d58c`](https://github.com/mcbeet/bolt/commit/5c0d58c181a053c2c0090d9af8b6eb96b6bc54f8)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 147947c3f..b61821d11 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.4.0" +__version__ = "0.4.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 7667bbf31..dbc96c008 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.4.0" +version = "0.4.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 07f7d8d38dc86444ff85531024bf9f2d77006a71 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 2 May 2022 00:48:30 +0200 Subject: [PATCH 0817/1554] fix: auto-convert to string for resource location interpolation --- packages/mecha/mecha/ast.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 0391a5044..f1d023e7e 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -765,8 +765,9 @@ class AstResourceLocation(AstNode): parser = "resource_location_or_tag" @classmethod - def from_value(cls, value: str) -> "AstResourceLocation": + def from_value(cls, value: Any) -> "AstResourceLocation": """Create a resource location node representing the given value.""" + value = str(value) if is_tag := value.startswith("#"): value = value[1:] namespace, _, path = value.rpartition(":") From 483e6d998be175b12f52ac8510ed1d0ab0d97fca Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 1 May 2022 22:49:14 +0000 Subject: [PATCH 0818/1554] 0.48.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 90c84a42b..94bf186aa 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.48.3 (2022-05-01) +### Fix +* Auto-convert to string for resource location interpolation ([`e5e379a`](https://github.com/mcbeet/mecha/commit/e5e379aa82bd370a4d4417a21bcff9afeb796ef3)) + ## v0.48.2 (2022-04-30) ### Fix * Handle nbt primitives ([`bf065f4`](https://github.com/mcbeet/mecha/commit/bf065f406776fd386ed68db8fb0ae5ad2e6535f3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d6eb301c8..ea327a4c5 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.48.2" +__version__ = "0.48.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c89a7ccba..0c7d8b523 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.48.2" +version = "0.48.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From c4ecb58f0dcdf7dade8d1303e5cfb04316dedb26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 12:28:50 +0000 Subject: [PATCH 0819/1554] chore(deps): bump beet from 0.60.0 to 0.64.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.60.0 to 0.64.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.60.0...v0.64.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 424883c16..ccf1bb0fa 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.60.0" +version = "0.64.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.60.0-py3-none-any.whl", hash = "sha256:bf409343a20c28d0d85a59f37be5944381e6e6d9c7a03bcab6c9e3300e898d21"}, - {file = "beet-0.60.0.tar.gz", hash = "sha256:7af9e81d576d3ec6ae1ed3c236dd58bb7236e18cffedda455558c253fedebf6d"}, + {file = "beet-0.64.0-py3-none-any.whl", hash = "sha256:faf29bdb85ceedca749d7b00f2bdf8a08822e34a466f144e5e5a0ea0244ccea9"}, + {file = "beet-0.64.0.tar.gz", hash = "sha256:a8bbff0dcc0b622aa0b5fc5d28dcfb7cb9ab5d9c867a2d44df6f1e5181540cde"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, From 38f9e9a1ef6cfc03696c391f7f307e7c0b37fcec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Apr 2022 12:28:25 +0000 Subject: [PATCH 0820/1554] chore(deps-dev): bump lectern from 0.20.1 to 0.21.2 Bumps [lectern](https://github.com/mcbeet/lectern) from 0.20.1 to 0.21.2. - [Release notes](https://github.com/mcbeet/lectern/releases) - [Changelog](https://github.com/mcbeet/lectern/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/lectern/compare/v0.20.1...v0.21.2) --- updated-dependencies: - dependency-name: lectern dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index ccf1bb0fa..db4781777 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -314,7 +314,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.20.1" +version = "0.21.2" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false @@ -1003,8 +1003,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.20.1-py3-none-any.whl", hash = "sha256:bc49ee4baced19aa4402cfb4d494d04af9dc1937e8406d98722e04e02abe7e59"}, - {file = "lectern-0.20.1.tar.gz", hash = "sha256:ec0d72235fe14ea66ff332262102424476d19c77b383e2785c9f88bd60b53908"}, + {file = "lectern-0.21.2-py3-none-any.whl", hash = "sha256:ff395bd6ab5fc4851e7f17909f1a7f96f71a8e192529f26ff936ab202361e68d"}, + {file = "lectern-0.21.2.tar.gz", hash = "sha256:515a0bf602bdf90eca64416b05e79292f9137cb32e5a6ab9a1a9f82fa3ab99f0"}, ] markdown-it-py = [ {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, From 7e420f27e97f2d5d0be4c0f5d807db82e1d3157d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 01:38:53 +0000 Subject: [PATCH 0821/1554] chore(deps-dev): bump pytest from 7.1.1 to 7.1.2 Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.1 to 7.1.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.1...7.1.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index db4781777..0d2c64205 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -495,7 +495,7 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "dc1d6edb2a8ce741e7a8bbe198afea7ffc543b1d36c54fe8b5466fba3cf0596f" +content-hash = "251419f0ee598bb86e23be1b56d3186f26c73b780db1ebfc4e579df9f8ae9436" [metadata.files] atomicwrites = [ @@ -1160,8 +1160,8 @@ pyparsing = [ {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pytest-insta = [ {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0c7d8b523..a4b80512a 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -28,7 +28,7 @@ tokenstream = "^1.4" [tool.poetry.dev-dependencies] black = "^22.3.0" -pytest = "^7.1.1" +pytest = "^7.1.2" isort = "^5.10.1" python-semantic-release = "^7.28.0" pytest-insta = "^0.1.11" From d5dd8d22ba951ffa1178e0a41f25970e87f7f91f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 2 May 2022 23:21:56 +0200 Subject: [PATCH 0822/1554] fix: update tokenstream to fix indentation bug --- .../src/data/demo/functions/wat.mcfunction | 6 ++++++ packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- .../examples__build_basic_nesting__0.pack.md | 13 +++++++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 packages/mecha/examples/basic_nesting/src/data/demo/functions/wat.mcfunction diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/wat.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/wat.mcfunction new file mode 100644 index 000000000..641d8b664 --- /dev/null +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/wat.mcfunction @@ -0,0 +1,6 @@ +execute: + execute: + + say 1 + execute: + say 2 diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 0d2c64205..281f2c57a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -694,7 +694,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "1.4.0" +version = "1.4.1" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "251419f0ee598bb86e23be1b56d3186f26c73b780db1ebfc4e579df9f8ae9436" +content-hash = "717d35c2026f21a7fd5b06d3dc3300e30609a87a0f6a7317368a5a9392d95970" [metadata.files] atomicwrites = [ @@ -1251,8 +1251,8 @@ smmap = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] tokenstream = [ - {file = "tokenstream-1.4.0-py3-none-any.whl", hash = "sha256:44da76e2df70b6858f7a967612af31a1606dd5f2215fb06fe606e1acce015cdb"}, - {file = "tokenstream-1.4.0.tar.gz", hash = "sha256:64dbd9d8fd2aa19a9d81056410acb37baa46aa861d765555cf2751fe54fb00f9"}, + {file = "tokenstream-1.4.1-py3-none-any.whl", hash = "sha256:66b42b059e1bda1b88dc54b63f4de935e1e8e2f1f746e06d5323e694d10d38fa"}, + {file = "tokenstream-1.4.1.tar.gz", hash = "sha256:a3e65dea39ca75a3cbe68880f325cd65a0b957f952137bc8bd2eeca8b4a44df7"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a4b80512a..ffff9bd78 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.60.0" -tokenstream = "^1.4" +tokenstream = "1.4.1" [tool.poetry.dev-dependencies] black = "^22.3.0" diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index fb1a3eb7c..e1c828b6c 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -39,6 +39,12 @@ say foo3 say after ``` +`@function demo:wat` + +```mcfunction +function demo:wat/nested_execute_0 +``` + `@function demo:thing2` ```mcfunction @@ -130,3 +136,10 @@ say stack3 say stack2 say stack1 ``` + +`@function demo:wat/nested_execute_0` + +```mcfunction +say 1 +say 2 +``` From 3d94f620ffa27d85c073fc683c2da1dfb6cefc81 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 2 May 2022 21:23:13 +0000 Subject: [PATCH 0823/1554] 0.48.4 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 94bf186aa..67353772a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.48.4 (2022-05-02) +### Fix +* Update tokenstream to fix indentation bug ([`df10dbc`](https://github.com/mcbeet/mecha/commit/df10dbcf1a31a775c8fdc961e43b2063657c5626)) + ## v0.48.3 (2022-05-01) ### Fix * Auto-convert to string for resource location interpolation ([`e5e379a`](https://github.com/mcbeet/mecha/commit/e5e379aa82bd370a4d4417a21bcff9afeb796ef3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index ea327a4c5..44f37c0b7 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.48.3" +__version__ = "0.48.4" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ffff9bd78..2ae1410b6 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.48.3" +version = "0.48.4" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 650f181ab73d0b3991b29ea12f5b42ef93d87cc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 04:26:07 +0000 Subject: [PATCH 0824/1554] build(deps-dev): bump lectern from 0.20.1 to 0.21.2 Bumps [lectern](https://github.com/mcbeet/lectern) from 0.20.1 to 0.21.2. - [Release notes](https://github.com/mcbeet/lectern/releases) - [Changelog](https://github.com/mcbeet/lectern/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/lectern/compare/v0.20.1...v0.21.2) --- updated-dependencies: - dependency-name: lectern dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/bolt/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 890e20175..7b2df79a0 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -314,7 +314,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.20.1" +version = "0.21.2" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false @@ -1015,8 +1015,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.20.1-py3-none-any.whl", hash = "sha256:bc49ee4baced19aa4402cfb4d494d04af9dc1937e8406d98722e04e02abe7e59"}, - {file = "lectern-0.20.1.tar.gz", hash = "sha256:ec0d72235fe14ea66ff332262102424476d19c77b383e2785c9f88bd60b53908"}, + {file = "lectern-0.21.2-py3-none-any.whl", hash = "sha256:ff395bd6ab5fc4851e7f17909f1a7f96f71a8e192529f26ff936ab202361e68d"}, + {file = "lectern-0.21.2.tar.gz", hash = "sha256:515a0bf602bdf90eca64416b05e79292f9137cb32e5a6ab9a1a9f82fa3ab99f0"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, From d224075b07614054fc254439ad3351851c8075da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 04:24:24 +0000 Subject: [PATCH 0825/1554] build(deps-dev): bump pyright from 1.1.239 to 1.1.243 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.239 to 1.1.243. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.243/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index bcdf3122a..1a8290621 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.239" + "pyright": "^1.1.243" } }, "node_modules/pyright": { - "version": "1.1.239", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.239.tgz", - "integrity": "sha512-WiXtSVKfoT5x/f6+AGJmB/jXhmEeexmvqqZ//MtCwLRI7hPmaRJJyfFCjJi+2ezEFxwcCjQQQTbclrG8jF6o/A==", + "version": "1.1.243", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.243.tgz", + "integrity": "sha512-0PUyHTSr+LyE9Ej0A7tB8tM4pzAr34o1c3rHtfaBdZ2265HPvPE/Kj92ljX2F00Q6uAeZyyLEmzPOTuKh2WC8Q==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.239", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.239.tgz", - "integrity": "sha512-WiXtSVKfoT5x/f6+AGJmB/jXhmEeexmvqqZ//MtCwLRI7hPmaRJJyfFCjJi+2ezEFxwcCjQQQTbclrG8jF6o/A==", + "version": "1.1.243", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.243.tgz", + "integrity": "sha512-0PUyHTSr+LyE9Ej0A7tB8tM4pzAr34o1c3rHtfaBdZ2265HPvPE/Kj92ljX2F00Q6uAeZyyLEmzPOTuKh2WC8Q==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index bffcf87ac..e90c44aed 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.239" + "pyright": "^1.1.243" } } From 00ccf0c682d9f2321324a6b22cdbe1546c4d302c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 2 May 2022 23:31:03 +0200 Subject: [PATCH 0826/1554] fix: update mecha to fix indent bug --- .../bolt/examples/bolt_flat/demo/main.bolt | 17 ++ packages/bolt/poetry.lock | 210 +++++++++--------- packages/bolt/pyproject.toml | 2 +- .../examples__build_bolt_flat__0.pack.md | 16 ++ 4 files changed, 140 insertions(+), 105 deletions(-) diff --git a/packages/bolt/examples/bolt_flat/demo/main.bolt b/packages/bolt/examples/bolt_flat/demo/main.bolt index 71725add9..0a04f4673 100644 --- a/packages/bolt/examples/bolt_flat/demo/main.bolt +++ b/packages/bolt/examples/bolt_flat/demo/main.bolt @@ -2,3 +2,20 @@ from demo.math import add function ./foo: say add(2, 3) + +function ./oby: + stat_list = [ + "damage", + "attack_speed", + "multishot", + "piercing" + ] + + if data storage firework:temp data.item.tag.aftermath.stats: + + for stat in stat_list: + if data storage firework:temp f'data.item.tag.aftermath.stats.{stat}': + say f'{stat}, present' + + unless data storage firework:temp data.item.tag.aftermath.stats: + say 'hi' diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 7b2df79a0..327989aa1 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -112,7 +112,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -156,7 +156,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "36.0.2" +version = "37.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -171,7 +171,7 @@ docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "docutils" @@ -282,7 +282,7 @@ trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.1.1" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.48.2" +version = "0.48.4" description = "A powerful Minecraft command library" category = "main" optional = false @@ -372,7 +372,7 @@ python-versions = ">=3.8,<4.0" [package.dependencies] beet = ">=0.60.0" -tokenstream = ">=1.4,<2.0" +tokenstream = "1.4.1" [[package]] name = "mypy-extensions" @@ -540,7 +540,7 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.3.0" +version = "3.4.0" description = "Interact with GitLab API" category = "dev" optional = false @@ -706,7 +706,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "1.4.0" +version = "1.4.1" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -804,7 +804,7 @@ python-versions = "*" [[package]] name = "wrapt" -version = "1.14.0" +version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "fec0023687ac2d9078806be6959cfa8a75e650b2e3e47d8a942ea9012b8353a1" +content-hash = "fb4d3cbbd824244f38d43d5737eada922c77bbbde036538d5ca4c410007fd6c3" [metadata.files] atomicwrites = [ @@ -930,8 +930,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, - {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, @@ -946,26 +946,28 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] cryptography = [ - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, - {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, - {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, - {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, + {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:74b55f67f4cf026cb84da7a1b04fc2a1d260193d4ad0ea5e9897c8b74c1e76ac"}, + {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0db5cf21bd7d092baacb576482b0245102cea2d3cf09f09271ce9f69624ecb6f"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:faf0f5456c059c7b1c29441bdd5e988f0ba75bdc3eea776520d8dcb1e30e1b5c"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:06bfafa6e53ccbfb7a94be4687b211a025ce0625e3f3c60bb15cd048a18f3ed8"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf585476fcbcd37bed08072e8e2db3954ce1bfc68087a2dc9c19cfe0b90979ca"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4daf890e674d191757d8d7d60dc3a29c58c72c7a76a05f1c0a326013f47e8b"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:ae1cd29fbe6b716855454e44f4bf743465152e15d2d317303fe3b58ee9e5af7a"}, + {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:451aaff8b8adf2dd0597cbb1fdcfc8a7d580f33f843b7cce75307a7f20112dd8"}, + {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1858eff6246bb8bbc080eee78f3dd1528739e3f416cba5f9914e8631b8df9871"}, + {file = "cryptography-37.0.1-cp36-abi3-win32.whl", hash = "sha256:e69a0e36e62279120e648e787b76d79b41e0f9e86c1c636a4f38d415595c722e"}, + {file = "cryptography-37.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a18ff4bfa9d64914a84d7b06c46eb86e0cc03113470b3c111255aceb6dcaf81d"}, + {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce90609e01e1b192fae9e13665058ab46b2ea53a3c05a3ea74a3eb8c3af8857"}, + {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c4a58eeafbd7409054be41a377e726a7904a17c26f45abf18125d21b1215b08b"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:618391152147a1221c87b1b0b7f792cafcfd4b5a685c5c72eeea2ddd29aeceff"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ceae26f876aabe193b13a0c36d1bb8e3e7e608d17351861b437bd882f617e9f"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:930b829e8a2abaf43a19f38277ae3c5e1ffcf547b936a927d2587769ae52c296"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58021d6e9b1d88b1105269d0da5e60e778b37dfc0e824efc71343dd003726831"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b1ee5c82cf03b30f6ae4e32d2bcb1e167ef74d6071cbb77c2af30f101d0b360b"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f095988548ec5095e3750cdb30e6962273d239b1998ba1aac66c0d5bee7111c1"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:125702572be12bcd318e3a14e9e70acd4be69a43664a75f0397e8650fe3c6cc3"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:315af6268de72bcfa0bb3401350ce7d921f216e6b60de12a363dad128d9d459f"}, + {file = "cryptography-37.0.1.tar.gz", hash = "sha256:d610d0ee14dd9109006215c7c0de15eee91230b70a9bce2263461cf7c3720b83"}, ] docutils = [ {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, @@ -1007,8 +1009,8 @@ jeepney = [ {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, @@ -1069,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.48.2-py3-none-any.whl", hash = "sha256:89de6b81ef762074d0d3a5f71053cac354b15c9305c22b110463d29231ab4e44"}, - {file = "mecha-0.48.2.tar.gz", hash = "sha256:0e0fcaf9030dbc0f3cf3ede840bc6442b6f62cef47b608e625f74eb11cfd4fb7"}, + {file = "mecha-0.48.4-py3-none-any.whl", hash = "sha256:13f906494118e323ccf21936f1ca8cf3671d5d940a3b60bdddb259d044e525ad"}, + {file = "mecha-0.48.4.tar.gz", hash = "sha256:2332f12f867d61e9d610940df29f976c09c69783280bd8921a114e09a8edb1dc"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1184,8 +1186,8 @@ pytest-insta = [ {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-3.3.0.tar.gz", hash = "sha256:fef25d41a62f91da82ee20f72a728b9c69eef34cf0a3005cdbb9a0b471d5b498"}, - {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, + {file = "python-gitlab-3.4.0.tar.gz", hash = "sha256:6180b81ee2f265ad8d8412956a1740b4d3ceca7b28ae2f707dfe62375fed0082"}, + {file = "python_gitlab-3.4.0-py3-none-any.whl", hash = "sha256:251b63f0589d51f854516948c84e9eb8df26e1e9dea595cf86b43f17c43007dd"}, ] python-semantic-release = [ {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, @@ -1267,8 +1269,8 @@ smmap = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] tokenstream = [ - {file = "tokenstream-1.4.0-py3-none-any.whl", hash = "sha256:44da76e2df70b6858f7a967612af31a1606dd5f2215fb06fe606e1acce015cdb"}, - {file = "tokenstream-1.4.0.tar.gz", hash = "sha256:64dbd9d8fd2aa19a9d81056410acb37baa46aa861d765555cf2751fe54fb00f9"}, + {file = "tokenstream-1.4.1-py3-none-any.whl", hash = "sha256:66b42b059e1bda1b88dc54b63f4de935e1e8e2f1f746e06d5323e694d10d38fa"}, + {file = "tokenstream-1.4.1.tar.gz", hash = "sha256:a3e65dea39ca75a3cbe68880f325cd65a0b957f952137bc8bd2eeca8b4a44df7"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, @@ -1303,70 +1305,70 @@ webencodings = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] wrapt = [ - {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, - {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, - {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, - {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, - {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, - {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, - {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, - {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, - {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, - {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, - {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, - {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, - {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, - {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, - {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, - {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index dbc96c008..099226098 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.64.0" -mecha = ">=0.48.2" +mecha = ">=0.48.4" [tool.poetry.dev-dependencies] pytest = "^7.1.2" diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md index 0732434b8..68ebbe0a3 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md @@ -15,8 +15,24 @@ ### demo +`@function demo:main/nested_execute_0` + +```mcfunction +execute if data storage firework:temp data.item.tag.aftermath.stats.damage run say damage, present +execute if data storage firework:temp data.item.tag.aftermath.stats.attack_speed run say attack_speed, present +execute if data storage firework:temp data.item.tag.aftermath.stats.multishot run say multishot, present +execute if data storage firework:temp data.item.tag.aftermath.stats.piercing run say piercing, present +``` + `@function demo:foo` ```mcfunction say 5 ``` + +`@function demo:oby` + +```mcfunction +execute if data storage firework:temp data.item.tag.aftermath.stats run function demo:main/nested_execute_0 +execute unless data storage firework:temp data.item.tag.aftermath.stats run say 'hi' +``` From 85a592b7180ced75ed5feb10c0f81fe87256fa23 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 2 May 2022 21:32:26 +0000 Subject: [PATCH 0827/1554] 0.4.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 377bba319..cc1ac05f9 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.4.2 (2022-05-02) +### Fix +* Update mecha to fix indent bug ([`006a57a`](https://github.com/mcbeet/bolt/commit/006a57a4ff0f0e99af106e235440c5c7b06f1f71)) + ## v0.4.1 (2022-05-01) ### Fix * Leftover print ([`3731f2c`](https://github.com/mcbeet/bolt/commit/3731f2c071942d0e131f42432bbd165bdf4e602e)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index b61821d11..c2c88b60b 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.4.1" +__version__ = "0.4.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 099226098..b7414958f 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.4.1" +version = "0.4.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 478c972ae0d86951693064f55cbae5215c6fc7e5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 6 May 2022 00:57:15 +0200 Subject: [PATCH 0828/1554] feat: make json and nbt parsers more flexible --- packages/mecha/mecha/parse.py | 79 +++++++++++-------- ...mples_minecraft_block_predicate_1_4__0.txt | 2 +- ..._examples_minecraft_block_state_1_5__0.txt | 2 +- ...ent_examples_minecraft_nbt_tag_1_11__0.txt | 2 +- ...ent_examples_minecraft_nbt_tag_1_14__0.txt | 2 +- ...ment_examples_minecraft_nbt_tag_1_3__0.txt | 2 +- ...ent_examples_minecraft_particle_1_4__0.txt | 2 +- 7 files changed, 51 insertions(+), 40 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 3d43c7e5d..af5a7bb99 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -171,6 +171,9 @@ def get_default_parsers() -> Dict[str, Parser]: """Return the default parsers.""" + json_parser = JsonParser() + nbt_parser = NbtParser() + return { ################################################################################ # Primitives @@ -184,13 +187,17 @@ def get_default_parsers() -> Dict[str, Parser]: "word": StringParser(type="word"), "phrase": StringParser(type="phrase"), "greedy": StringParser(type="greedy"), - "json": JsonParser(), + "json": json_parser, + "json_object_entry": json_parser.parse_object_entry, + "json_array_element": delegate("json"), "json_object": TypeConstraint( parser=delegate("json"), type=AstJsonObject, message="Expected json object.", ), - "nbt": NbtParser(), + "nbt": nbt_parser, + "nbt_compound_entry": nbt_parser.parse_compound_entry, + "nbt_list_or_array_element": delegate("nbt"), "nbt_compound": TypeConstraint( parser=delegate("nbt"), type=AstNbtCompound, @@ -898,32 +905,21 @@ def __call__(self, stream: TokenStream) -> AstJson: if curly: entries: List[AstJsonObjectEntry] = [] - for key in stream.collect("string"): - key_node = AstJsonObjectKey( - value=self.quote_helper.unquote_string(key), - ) - key_node = set_location(key_node, key) - - stream.expect("colon") - - value_node = delegate("json", stream) - - entry_node = AstJsonObjectEntry(key=key_node, value=value_node) - entries.append(set_location(entry_node, key_node, value_node)) + for _ in stream.peek_until(("curly", "}")): + entries.append(delegate("json_object_entry", stream)) if not stream.get("comma"): + stream.expect(("curly", "}")) break - close_curly = stream.expect(("curly", "}")) - node = AstJsonObject(entries=AstChildren(entries)) - return set_location(node, curly, close_curly) + return set_location(node, curly, stream.current) elif bracket: elements: List[AstJson] = [] for _ in stream.peek_until(("bracket", "]")): - elements.append(delegate("json", stream)) + elements.append(delegate("json_array_element", stream)) if not stream.get("comma"): stream.expect(("bracket", "]")) @@ -946,6 +942,19 @@ def __call__(self, stream: TokenStream) -> AstJson: node = AstJsonValue(value=value) # type: ignore return set_location(node, stream.current) + def parse_object_entry(self, stream: TokenStream) -> AstJsonObjectEntry: + """Parse json object entry.""" + key = stream.expect("string") + key_node = AstJsonObjectKey(value=self.quote_helper.unquote_string(key)) + key_node = set_location(key_node, key) + + stream.expect("colon") + + value_node = delegate("json", stream) + + entry_node = AstJsonObjectEntry(key=key_node, value=value_node) + return set_location(entry_node, key_node, value_node) + @dataclass class TypeConstraint: @@ -1016,32 +1025,21 @@ def __call__(self, stream: TokenStream) -> AstNbt: if curly: entries: List[AstNbtCompoundEntry] = [] - for key in stream.collect_any("number", "string", "quoted_string"): - key_node = AstNbtCompoundKey( - value=self.quote_helper.unquote_string(key), - ) - key_node = set_location(key_node, key) - - stream.expect("colon") - - value_node = delegate("nbt", stream) - - entry_node = AstNbtCompoundEntry(key=key_node, value=value_node) - entries.append(set_location(entry_node, key_node, value_node)) + for _ in stream.peek_until(("curly", "}")): + entries.append(delegate("nbt_compound_entry", stream)) if not stream.get("comma"): + stream.expect(("curly", "}")) break - close_curly = stream.expect(("curly", "}")) - node = AstNbtCompound(entries=AstChildren(entries)) - return set_location(node, curly, close_curly) + return set_location(node, curly, stream.current) elif bracket or array: elements: List[AstNbt] = [] for _ in stream.peek_until(("bracket", "]")): - elements.append(delegate("nbt", stream)) + elements.append(delegate("nbt_list_or_array_element", stream)) if not stream.get("comma"): stream.expect(("bracket", "]")) @@ -1113,6 +1111,19 @@ def __call__(self, stream: TokenStream) -> AstNbt: node = AstNbtValue(value=value) # type: ignore return set_location(node, stream.current) + def parse_compound_entry(self, stream: TokenStream) -> AstNbtCompoundEntry: + """Parse nbt compound entry.""" + key = stream.expect_any("number", "string", "quoted_string") + key_node = AstNbtCompoundKey(value=self.quote_helper.unquote_string(key)) + key_node = set_location(key_node, key) + + stream.expect("colon") + + value_node = delegate("nbt", stream) + + entry_node = AstNbtCompoundEntry(key=key_node, value=value_node) + return set_location(entry_node, key_node, value_node) + @dataclass class AdjacentConstraint: diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt index a9b998c39..af3c06cea 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_predicate_1_4__0.txt @@ -6,4 +6,4 @@ minecraft:block_predicate 1 4 --- Reported 1 error. -line 1, column 21: Expected curly '}' but got eof. \ No newline at end of file +line 1, column 21: Expected number, quoted_string or string but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt index bc77b0c3e..f716dfb48 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_block_state_1_5__0.txt @@ -6,4 +6,4 @@ stone[thing=hello]{ --- Reported 1 error. -line 1, column 20: Expected curly '}' but got eof. \ No newline at end of file +line 1, column 20: Expected number, quoted_string or string but got eof. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt index 5ff26806c..c145633be 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_11__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 11 --- Reported 1 error. -line 1, column 2: Expected curly '}' but got literal '\\"'. \ No newline at end of file +line 1, column 2: Expected number, quoted_string or string but got literal '\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt index 6efd62d27..f6c9a8971 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_14__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 14 --- Reported 1 error. -line 1, column 3: Expected curly '}' but got comma ','. \ No newline at end of file +line 1, column 3: Expected number, quoted_string or string but got comma ','. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt index 4e2d05044..633b491a2 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_nbt_tag_1_3__0.txt @@ -6,4 +6,4 @@ minecraft:nbt_tag 1 3 --- Reported 1 error. -line 1, column 2: Expected curly '}' but got literal '"\\"'. \ No newline at end of file +line 1, column 2: Expected number, quoted_string or string but got literal '"\\"'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt index 6bf0a30b3..e97c4d7db 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_particle_1_4__0.txt @@ -6,4 +6,4 @@ item minecraft:apple{ --- Reported 1 error. -line 1, column 22: Expected curly '}' but got eof. \ No newline at end of file +line 1, column 22: Expected number, quoted_string or string but got eof. \ No newline at end of file From 92820deef70c347f7994ac9286e5cd6709baf874 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 May 2022 22:58:10 +0000 Subject: [PATCH 0829/1554] 0.49.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 67353772a..2bad43000 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.49.0 (2022-05-05) +### Feature +* Make json and nbt parsers more flexible ([`2d1afa1`](https://github.com/mcbeet/mecha/commit/2d1afa173a14f35d2f13130a48959a35222dd931)) + ## v0.48.4 (2022-05-02) ### Fix * Update tokenstream to fix indentation bug ([`df10dbc`](https://github.com/mcbeet/mecha/commit/df10dbcf1a31a775c8fdc961e43b2063657c5626)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 44f37c0b7..ebb78d533 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.48.4" +__version__ = "0.49.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2ae1410b6..dd499c1eb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.48.4" +version = "0.49.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 8dc5e360dc326b16e35ef70672ea79a72bc98163 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 6 May 2022 01:13:47 +0200 Subject: [PATCH 0830/1554] fix: converter for json object --- packages/bolt/bolt/helpers.py | 15 +++++++++++++++ packages/bolt/bolt/parse.py | 1 + packages/bolt/poetry.lock | 8 ++++---- packages/bolt/pyproject.toml | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 742920256..026bc8d7d 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -19,6 +19,7 @@ AstGreedy, AstItemSlot, AstJson, + AstJsonObject, AstMessage, AstNbt, AstNbtCompound, @@ -68,6 +69,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "interpolate_phrase": converter(AstString.from_value), "interpolate_greedy": converter(AstGreedy.from_value), "interpolate_json": converter(AstJson.from_value), + "interpolate_json_object": JsonObjectConverter(converter(AstJson.from_value)), "interpolate_nbt": converter(AstNbt.from_value), "interpolate_nbt_compound": NbtCompoundConverter(converter(AstNbt.from_value)), "interpolate_nbt_path": converter(AstNbtPath.from_value), @@ -189,6 +191,19 @@ def wrapper(obj: Any, node: AstNode) -> AstNode: return wrapper +@dataclass +class JsonObjectConverter: + """Converter for json objects.""" + + json_converter: Callable[[Any, AstNode], AstNode] + + @internal + def __call__(self, obj: Any, node: AstNode) -> AstNode: + if isinstance(node := self.json_converter(obj, node), AstJsonObject): + return node + raise ValueError(f"Invalid json object of type {type(obj)!r}.") + + @dataclass class NbtCompoundConverter: """Converter for nbt compounds.""" diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 28e12109f..c8a54ed09 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -287,6 +287,7 @@ def get_bolt_parsers( "phrase": InterpolationParser("phrase", parsers["phrase"]), "greedy": InterpolationParser("greedy", parsers["greedy"]), "json": InterpolationParser("json", parsers["json"]), + "json_object": InterpolationParser("json_object", parsers["json_object"]), "nbt": InterpolationParser("nbt", parsers["nbt"]), "nbt_compound": InterpolationParser("nbt_compound", parsers["nbt_compound"]), "nbt_path": InterpolationParser("nbt_path", parsers["nbt_path"]), diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 327989aa1..dc8138b94 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.48.4" +version = "0.49.0" description = "A powerful Minecraft command library" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "fb4d3cbbd824244f38d43d5737eada922c77bbbde036538d5ca4c410007fd6c3" +content-hash = "742e3c6f97c61d337dd502994508e8d70bf6754469f9414b56f75cc1ec40e7c4" [metadata.files] atomicwrites = [ @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.48.4-py3-none-any.whl", hash = "sha256:13f906494118e323ccf21936f1ca8cf3671d5d940a3b60bdddb259d044e525ad"}, - {file = "mecha-0.48.4.tar.gz", hash = "sha256:2332f12f867d61e9d610940df29f976c09c69783280bd8921a114e09a8edb1dc"}, + {file = "mecha-0.49.0-py3-none-any.whl", hash = "sha256:40c3cb9d5d7413d85ccf2b0907fba4d5b5ab3bd2bfc6c2800e5b4c58c75b2434"}, + {file = "mecha-0.49.0.tar.gz", hash = "sha256:b09e9bdffcbd9f121e20d29009f4552adfe129d2a810ec1efa87aabfc7bf91ae"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index b7414958f..9fd4ff1e5 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.64.0" -mecha = ">=0.48.4" +mecha = ">=0.49.0" [tool.poetry.dev-dependencies] pytest = "^7.1.2" From 28318917ad0fe5daf7b0e789a1acf1e91d1546c5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 6 May 2022 01:32:45 +0200 Subject: [PATCH 0831/1554] feat: unpack field for interpolation node --- packages/bolt/bolt/ast.py | 4 ++-- packages/bolt/tests/snapshots/bolt__parse_102__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_102__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_103__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_103__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_117__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_117__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_118__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_118__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_128__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_128__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_139__0.txt | 5 +++++ packages/bolt/tests/snapshots/bolt__parse_139__1.txt | 5 +++++ packages/bolt/tests/snapshots/bolt__parse_141__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_141__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_142__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_142__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_143__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_143__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_144__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_144__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_164__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_164__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_165__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_165__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_168__0.txt | 2 ++ packages/bolt/tests/snapshots/bolt__parse_168__1.txt | 2 ++ packages/bolt/tests/snapshots/bolt__parse_169__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_169__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_174__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_174__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_175__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_175__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_176__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_176__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_184__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_184__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_186__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_186__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_192__0.txt | 2 ++ packages/bolt/tests/snapshots/bolt__parse_192__1.txt | 2 ++ packages/bolt/tests/snapshots/bolt__parse_193__0.txt | 4 ++++ packages/bolt/tests/snapshots/bolt__parse_193__1.txt | 4 ++++ packages/bolt/tests/snapshots/bolt__parse_194__0.txt | 3 +++ packages/bolt/tests/snapshots/bolt__parse_194__1.txt | 3 +++ packages/bolt/tests/snapshots/bolt__parse_198__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_198__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_201__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_201__1.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_89__0.txt | 1 + packages/bolt/tests/snapshots/bolt__parse_89__1.txt | 1 + 51 files changed, 74 insertions(+), 2 deletions(-) diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index a153d535d..f3326cc74 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -34,9 +34,8 @@ from typing import Any, Optional, Union from beet.core.utils import required_field -from tokenstream import TokenStream - from mecha import AstChildren, AstNode, AstRoot +from tokenstream import TokenStream @dataclass(frozen=True) @@ -241,6 +240,7 @@ class AstInterpolation(AstNode): """Ast interpolation node.""" prefix: Optional[str] = None + unpack: Optional[str] = None converter: str = required_field() value: AstExpression = required_field() diff --git a/packages/bolt/tests/snapshots/bolt__parse_102__0.txt b/packages/bolt/tests/snapshots/bolt__parse_102__0.txt index 357169673..058c88275 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_102__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_102__0.txt @@ -40,6 +40,7 @@ tellraw @p a location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) prefix: None + unpack: None converter: 'json' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_102__1.txt b/packages/bolt/tests/snapshots/bolt__parse_102__1.txt index 97365f376..a06245711 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_102__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_102__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) prefix: None + unpack: None converter: 'json' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__0.txt b/packages/bolt/tests/snapshots/bolt__parse_103__0.txt index 6a27041da..7630ad440 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_103__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_103__0.txt @@ -155,6 +155,7 @@ as @a at @s if block ~ ~-1 ~ #wool give @s stone{ location: SourceLocation(pos=121, lineno=4, colno=15) end_location: SourceLocation(pos=124, lineno=4, colno=18) prefix: None + unpack: None converter: 'nbt' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt index d8935073d..9fef1e431 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=121, lineno=4, colno=15) end_location: SourceLocation(pos=124, lineno=4, colno=18) prefix: None + unpack: None converter: 'nbt' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__0.txt b/packages/bolt/tests/snapshots/bolt__parse_117__0.txt index 6b14eddcd..737d0b2b6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_117__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_117__0.txt @@ -49,6 +49,7 @@ if score @s tmp matches (x, None) say wat location: SourceLocation(pos=30, lineno=2, colno=25) end_location: SourceLocation(pos=39, lineno=2, colno=34) prefix: None + unpack: None converter: 'range' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt index 0db0c0cea..d0364551e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt @@ -19,6 +19,7 @@ _mecha_refs[0] location: SourceLocation(pos=30, lineno=2, colno=25) end_location: SourceLocation(pos=39, lineno=2, colno=34) prefix: None + unpack: None converter: 'range' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt index a0deb1186..686c6daf4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt @@ -84,6 +84,7 @@ for i in f(): location: SourceLocation(pos=67, lineno=6, colno=9) end_location: SourceLocation(pos=68, lineno=6, colno=10) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt index a166aacca..8fb829b38 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt @@ -25,6 +25,7 @@ _mecha_refs[0] location: SourceLocation(pos=67, lineno=6, colno=9) end_location: SourceLocation(pos=68, lineno=6, colno=10) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt index b2be1bad8..4a316d77a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt @@ -34,6 +34,7 @@ say thing location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=36, lineno=2, colno=10) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt index 37ad9c1f9..6ccd382d1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt @@ -16,6 +16,7 @@ _mecha_refs[0] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=36, lineno=2, colno=10) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_139__0.txt b/packages/bolt/tests/snapshots/bolt__parse_139__0.txt index 01fead4fb..14df1de6e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_139__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_139__0.txt @@ -45,6 +45,7 @@ for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): location: SourceLocation(pos=87, lineno=2, colno=21) end_location: SourceLocation(pos=98, lineno=2, colno=32) prefix: None + unpack: None converter: 'resource_location' value: @@ -111,6 +112,7 @@ for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): location: SourceLocation(pos=169, lineno=4, colno=40) end_location: SourceLocation(pos=179, lineno=4, colno=50) prefix: None + unpack: None converter: 'range' value: @@ -136,6 +138,7 @@ for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): location: SourceLocation(pos=189, lineno=4, colno=60) end_location: SourceLocation(pos=202, lineno=4, colno=73) prefix: None + unpack: None converter: 'resource_location' value: @@ -180,6 +183,7 @@ for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): location: SourceLocation(pos=256, lineno=6, colno=40) end_location: SourceLocation(pos=266, lineno=6, colno=50) prefix: None + unpack: None converter: 'range' value: @@ -205,6 +209,7 @@ for node in generate_tree("abcdefghijklmnopqrstuvwxyz0123456789"): location: SourceLocation(pos=271, lineno=6, colno=55) end_location: SourceLocation(pos=281, lineno=6, colno=65) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt index d3c6b3a25..b4ec9fda4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt @@ -49,6 +49,7 @@ _mecha_refs[0] location: SourceLocation(pos=87, lineno=2, colno=21) end_location: SourceLocation(pos=98, lineno=2, colno=32) prefix: None + unpack: None converter: 'resource_location' value: @@ -57,6 +58,7 @@ _mecha_refs[1] location: SourceLocation(pos=169, lineno=4, colno=40) end_location: SourceLocation(pos=179, lineno=4, colno=50) prefix: None + unpack: None converter: 'range' value: @@ -77,6 +79,7 @@ _mecha_refs[4] location: SourceLocation(pos=189, lineno=4, colno=60) end_location: SourceLocation(pos=202, lineno=4, colno=73) prefix: None + unpack: None converter: 'resource_location' value: @@ -116,6 +119,7 @@ _mecha_refs[9] location: SourceLocation(pos=256, lineno=6, colno=40) end_location: SourceLocation(pos=266, lineno=6, colno=50) prefix: None + unpack: None converter: 'range' value: @@ -136,6 +140,7 @@ _mecha_refs[12] location: SourceLocation(pos=271, lineno=6, colno=55) end_location: SourceLocation(pos=281, lineno=6, colno=65) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_141__0.txt b/packages/bolt/tests/snapshots/bolt__parse_141__0.txt index ee0a68a79..88b5c7e59 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_141__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_141__0.txt @@ -38,6 +38,7 @@ setblock a 2 3 stone location: SourceLocation(pos=15, lineno=2, colno=10) end_location: SourceLocation(pos=16, lineno=2, colno=11) prefix: None + unpack: None converter: 'coordinate' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_141__1.txt b/packages/bolt/tests/snapshots/bolt__parse_141__1.txt index 3117857c6..fb376c2e6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_141__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_141__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=15, lineno=2, colno=10) end_location: SourceLocation(pos=16, lineno=2, colno=11) prefix: None + unpack: None converter: 'coordinate' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_142__0.txt b/packages/bolt/tests/snapshots/bolt__parse_142__0.txt index 3bd7d90fb..845acc040 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_142__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_142__0.txt @@ -34,6 +34,7 @@ setblock a stone location: SourceLocation(pos=21, lineno=2, colno=10) end_location: SourceLocation(pos=22, lineno=2, colno=11) prefix: None + unpack: None converter: 'vec3' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_142__1.txt b/packages/bolt/tests/snapshots/bolt__parse_142__1.txt index 4c11e14c5..a0db7c793 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_142__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_142__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=21, lineno=2, colno=10) end_location: SourceLocation(pos=22, lineno=2, colno=11) prefix: None + unpack: None converter: 'vec3' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__0.txt b/packages/bolt/tests/snapshots/bolt__parse_143__0.txt index a2c6702fc..8187a20a2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_143__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_143__0.txt @@ -49,6 +49,7 @@ if block ^ f"^{a}" ^ #planks say 42 location: SourceLocation(pos=17, lineno=2, colno=12) end_location: SourceLocation(pos=24, lineno=2, colno=19) prefix: None + unpack: None converter: 'coordinate' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt index 1e2f8f30d..2cf1677d8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt @@ -18,6 +18,7 @@ _mecha_refs[0] location: SourceLocation(pos=17, lineno=2, colno=12) end_location: SourceLocation(pos=24, lineno=2, colno=19) prefix: None + unpack: None converter: 'coordinate' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_144__0.txt b/packages/bolt/tests/snapshots/bolt__parse_144__0.txt index 2eb4bbcdb..8a2a37b46 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_144__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_144__0.txt @@ -18,6 +18,7 @@ if block ("~", "~", "~") #planks say 42 location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=24, lineno=1, colno=25) prefix: None + unpack: None converter: 'vec3' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt index fcc470aa6..9786ea663 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt @@ -18,6 +18,7 @@ _mecha_refs[0] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=24, lineno=1, colno=25) prefix: None + unpack: None converter: 'vec3' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_164__0.txt b/packages/bolt/tests/snapshots/bolt__parse_164__0.txt index 564e13405..4a0572bc3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_164__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_164__0.txt @@ -34,6 +34,7 @@ scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name location: SourceLocation(pos=47, lineno=2, colno=34) end_location: SourceLocation(pos=70, lineno=2, colno=57) prefix: None + unpack: None converter: 'scoreboard_slot' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_164__1.txt b/packages/bolt/tests/snapshots/bolt__parse_164__1.txt index 1c16f6849..1f20b9f63 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_164__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_164__1.txt @@ -18,6 +18,7 @@ _mecha_refs[0] location: SourceLocation(pos=47, lineno=2, colno=34) end_location: SourceLocation(pos=70, lineno=2, colno=57) prefix: None + unpack: None converter: 'scoreboard_slot' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_165__0.txt b/packages/bolt/tests/snapshots/bolt__parse_165__0.txt index 49b1d58a3..eae772144 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_165__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_165__0.txt @@ -34,6 +34,7 @@ scoreboard objectives setdisplay my_team some_score_name location: SourceLocation(pos=62, lineno=2, colno=34) end_location: SourceLocation(pos=69, lineno=2, colno=41) prefix: None + unpack: None converter: 'scoreboard_slot' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_165__1.txt b/packages/bolt/tests/snapshots/bolt__parse_165__1.txt index 3ad2e911b..1c08c3be6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_165__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_165__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=62, lineno=2, colno=34) end_location: SourceLocation(pos=69, lineno=2, colno=41) prefix: None + unpack: None converter: 'scoreboard_slot' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt index d1a648113..68ad39402 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt @@ -66,6 +66,7 @@ item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand location: SourceLocation(pos=92, lineno=2, colno=24) end_location: SourceLocation(pos=109, lineno=2, colno=41) prefix: None + unpack: None converter: 'item_slot' value: @@ -87,6 +88,7 @@ item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand location: SourceLocation(pos=125, lineno=2, colno=57) end_location: SourceLocation(pos=143, lineno=2, colno=75) prefix: None + unpack: None converter: 'item_slot' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__1.txt b/packages/bolt/tests/snapshots/bolt__parse_168__1.txt index 25bf00a6e..90099c8bf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_168__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_168__1.txt @@ -26,6 +26,7 @@ _mecha_refs[0] location: SourceLocation(pos=92, lineno=2, colno=24) end_location: SourceLocation(pos=109, lineno=2, colno=41) prefix: None + unpack: None converter: 'item_slot' value: @@ -41,6 +42,7 @@ _mecha_refs[2] location: SourceLocation(pos=125, lineno=2, colno=57) end_location: SourceLocation(pos=143, lineno=2, colno=75) prefix: None + unpack: None converter: 'item_slot' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_169__0.txt b/packages/bolt/tests/snapshots/bolt__parse_169__0.txt index 89cb1ca83..0685d7eec 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_169__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_169__0.txt @@ -52,6 +52,7 @@ say numbers[3:] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=41, lineno=2, colno=16) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_169__1.txt b/packages/bolt/tests/snapshots/bolt__parse_169__1.txt index f81c49576..d09a9751a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_169__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_169__1.txt @@ -23,6 +23,7 @@ _mecha_refs[0] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=41, lineno=2, colno=16) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__0.txt b/packages/bolt/tests/snapshots/bolt__parse_174__0.txt index 2b6fd932d..1328f6c26 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_174__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_174__0.txt @@ -45,6 +45,7 @@ if data storage some:path/to/storage f'some.{mykey}.path{{my: "compound"}}' run location: SourceLocation(pos=51, lineno=2, colno=38) end_location: SourceLocation(pos=89, lineno=2, colno=76) prefix: None + unpack: None converter: 'nbt_path' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt index 0672b5946..19f2f287b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt @@ -18,6 +18,7 @@ _mecha_refs[0] location: SourceLocation(pos=51, lineno=2, colno=38) end_location: SourceLocation(pos=89, lineno=2, colno=76) prefix: None + unpack: None converter: 'nbt_path' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__0.txt b/packages/bolt/tests/snapshots/bolt__parse_175__0.txt index 4d10715f9..ffb61bbcc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_175__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_175__0.txt @@ -45,6 +45,7 @@ if data storage some:path/to/storage (mypath) run say hi location: SourceLocation(pos=114, lineno=2, colno=39) end_location: SourceLocation(pos=120, lineno=2, colno=45) prefix: None + unpack: None converter: 'nbt_path' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt index 1accb03bd..d8e863425 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=114, lineno=2, colno=39) end_location: SourceLocation(pos=120, lineno=2, colno=45) prefix: None + unpack: None converter: 'nbt_path' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt index 9915077da..b963bac9f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt @@ -54,6 +54,7 @@ at @e[type=entity_type] summon lightning_bolt location: SourceLocation(pos=35, lineno=2, colno=12) end_location: SourceLocation(pos=46, lineno=2, colno=23) prefix: None + unpack: None converter: 'resource_location' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt index fd52a3f9b..3b183d56b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=35, lineno=2, colno=12) end_location: SourceLocation(pos=46, lineno=2, colno=23) prefix: None + unpack: None converter: 'resource_location' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt index b6be8f77f..ae57620e2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt @@ -49,6 +49,7 @@ positioned ~ ~a ~ function demo:foo location: SourceLocation(pos=19, lineno=2, colno=14) end_location: SourceLocation(pos=21, lineno=2, colno=16) prefix: '~' + unpack: None converter: 'coordinate' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt index 7bf8a05d7..cdeca7087 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=19, lineno=2, colno=14) end_location: SourceLocation(pos=21, lineno=2, colno=16) prefix: '~' + unpack: None converter: 'coordinate' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_186__0.txt b/packages/bolt/tests/snapshots/bolt__parse_186__0.txt index 85e8d65b8..9c31613cf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_186__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_186__0.txt @@ -50,6 +50,7 @@ for i, value in enumerate("abc"): location: SourceLocation(pos=42, lineno=2, colno=9) end_location: SourceLocation(pos=57, lineno=2, colno=24) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_186__1.txt b/packages/bolt/tests/snapshots/bolt__parse_186__1.txt index abacc7beb..1dba090e4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_186__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_186__1.txt @@ -21,6 +21,7 @@ _mecha_refs[0] location: SourceLocation(pos=42, lineno=2, colno=9) end_location: SourceLocation(pos=57, lineno=2, colno=24) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt index 26a6778d2..bf1f52064 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt @@ -39,6 +39,7 @@ say math.ceil(0.1) location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) prefix: None + unpack: None converter: 'message' value: @@ -109,6 +110,7 @@ say math.ceil(0.1) location: SourceLocation(pos=71, lineno=7, colno=5) end_location: SourceLocation(pos=85, lineno=7, colno=19) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__1.txt b/packages/bolt/tests/snapshots/bolt__parse_192__1.txt index 1f9fa73c5..fe6af37c6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_192__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_192__1.txt @@ -30,6 +30,7 @@ _mecha_refs[0] location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) prefix: None + unpack: None converter: 'message' value: @@ -45,6 +46,7 @@ _mecha_refs[2] location: SourceLocation(pos=71, lineno=7, colno=5) end_location: SourceLocation(pos=85, lineno=7, colno=19) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt index 4c9bf4bec..b6df73cd9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt @@ -129,6 +129,7 @@ b = a location: SourceLocation(pos=167, lineno=6, colno=38) end_location: SourceLocation(pos=176, lineno=6, colno=47) prefix: None + unpack: None converter: 'entity' value: @@ -152,6 +153,7 @@ b = a location: SourceLocation(pos=186, lineno=6, colno=57) end_location: SourceLocation(pos=194, lineno=6, colno=65) prefix: None + unpack: None converter: 'entity' value: @@ -185,6 +187,7 @@ b = a location: SourceLocation(pos=243, lineno=8, colno=32) end_location: SourceLocation(pos=252, lineno=8, colno=41) prefix: None + unpack: None converter: 'entity' value: @@ -204,6 +207,7 @@ b = a location: SourceLocation(pos=260, lineno=8, colno=49) end_location: SourceLocation(pos=263, lineno=8, colno=52) prefix: None + unpack: None converter: 'numeric' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt index 314e5aa99..69a4d0712 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt @@ -84,6 +84,7 @@ _mecha_refs[0] location: SourceLocation(pos=167, lineno=6, colno=38) end_location: SourceLocation(pos=176, lineno=6, colno=47) prefix: None + unpack: None converter: 'entity' value: @@ -92,6 +93,7 @@ _mecha_refs[1] location: SourceLocation(pos=186, lineno=6, colno=57) end_location: SourceLocation(pos=194, lineno=6, colno=65) prefix: None + unpack: None converter: 'entity' value: @@ -126,6 +128,7 @@ _mecha_refs[6] location: SourceLocation(pos=243, lineno=8, colno=32) end_location: SourceLocation(pos=252, lineno=8, colno=41) prefix: None + unpack: None converter: 'entity' value: @@ -134,6 +137,7 @@ _mecha_refs[7] location: SourceLocation(pos=260, lineno=8, colno=49) end_location: SourceLocation(pos=263, lineno=8, colno=52) prefix: None + unpack: None converter: 'numeric' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt index ee6023bc2..4bee48fed 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt @@ -152,6 +152,7 @@ say Counter(9).incr() location: SourceLocation(pos=136, lineno=9, colno=5) end_location: SourceLocation(pos=150, lineno=9, colno=19) prefix: None + unpack: None converter: 'message' value: @@ -178,6 +179,7 @@ say Counter(9).incr() location: SourceLocation(pos=155, lineno=10, colno=5) end_location: SourceLocation(pos=169, lineno=10, colno=19) prefix: None + unpack: None converter: 'message' value: @@ -204,6 +206,7 @@ say Counter(9).incr() location: SourceLocation(pos=174, lineno=11, colno=5) end_location: SourceLocation(pos=191, lineno=11, colno=22) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt index b61eb81b3..fa0ea7a28 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt @@ -52,6 +52,7 @@ _mecha_refs[0] location: SourceLocation(pos=136, lineno=9, colno=5) end_location: SourceLocation(pos=150, lineno=9, colno=19) prefix: None + unpack: None converter: 'message' value: @@ -67,6 +68,7 @@ _mecha_refs[2] location: SourceLocation(pos=155, lineno=10, colno=5) end_location: SourceLocation(pos=169, lineno=10, colno=19) prefix: None + unpack: None converter: 'message' value: @@ -82,6 +84,7 @@ _mecha_refs[4] location: SourceLocation(pos=174, lineno=11, colno=5) end_location: SourceLocation(pos=191, lineno=11, colno=22) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt index 90a11d582..1cb3ad2b9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt @@ -34,6 +34,7 @@ function #tag_name location: SourceLocation(pos=28, lineno=2, colno=10) end_location: SourceLocation(pos=37, lineno=2, colno=19) prefix: '#' + unpack: None converter: 'resource_location' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt index d57eb3993..96138503f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=28, lineno=2, colno=10) end_location: SourceLocation(pos=37, lineno=2, colno=19) prefix: '#' + unpack: None converter: 'resource_location' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_201__0.txt b/packages/bolt/tests/snapshots/bolt__parse_201__0.txt index 0ec8af685..472d5da63 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_201__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_201__0.txt @@ -34,6 +34,7 @@ say a location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=11, lineno=2, colno=6) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_201__1.txt b/packages/bolt/tests/snapshots/bolt__parse_201__1.txt index 77a33c72b..d168d4f54 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_201__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_201__1.txt @@ -17,6 +17,7 @@ _mecha_refs[0] location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=11, lineno=2, colno=6) prefix: None + unpack: None converter: 'message' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt index d92adbb6e..7173fad31 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt @@ -40,6 +40,7 @@ f("thing") location: SourceLocation(pos=25, lineno=2, colno=16) end_location: SourceLocation(pos=26, lineno=2, colno=17) prefix: None + unpack: None converter: 'json' value: diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt index 96f29cdad..c844dc656 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt @@ -19,6 +19,7 @@ _mecha_refs[0] location: SourceLocation(pos=25, lineno=2, colno=16) end_location: SourceLocation(pos=26, lineno=2, colno=17) prefix: None + unpack: None converter: 'json' value: From dbd0c17165ece3079a1a7fc22714405cddb9e98f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 6 May 2022 02:41:55 +0200 Subject: [PATCH 0832/1554] fix: take into account possible syntax extensions when checking nbt list/array homogeneity --- packages/mecha/mecha/parse.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index af5a7bb99..e24f30ab3 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -1060,24 +1060,21 @@ def __call__(self, stream: TokenStream) -> AstNbt: msg = "Expected all elements to be long integers." else: node = AstNbtList(elements=AstChildren(elements)) - if node.elements: - if isinstance(elements[0], AstNbtValue): - element_type = type(elements[0].value) - else: - element_type = type(elements[0]) - else: - element_type = None + element_type = None msg = "Expected all elements to have the same type." node = set_location(node, bracket or array, stream.current) - if element_type: - for element in node.elements: - if ( - type(element.value) is not element_type - if isinstance(element, AstNbtValue) - else type(element) is not element_type - ): + for element in node.elements: + if isinstance(element, AstNbtValue): + if not element_type: + element_type = type(element.value) + elif type(element.value) is not element_type: + raise element.emit_error(InvalidSyntax(msg)) + elif isinstance(element, AstNbt): # type: ignore + if not element_type: + element_type = type(element) + elif type(element) is not element_type: raise element.emit_error(InvalidSyntax(msg)) return node From 0f95e7bd1574f67c21f1523a73907b689a79c8c0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 6 May 2022 00:42:43 +0000 Subject: [PATCH 0833/1554] 0.49.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 2bad43000..22bc7117a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.49.1 (2022-05-06) +### Fix +* Take into account possible syntax extensions when checking nbt list/array homogeneity ([`de12e61`](https://github.com/mcbeet/mecha/commit/de12e617a0401182ccfebe071c6b4930988b9e7f)) + ## v0.49.0 (2022-05-05) ### Feature * Make json and nbt parsers more flexible ([`2d1afa1`](https://github.com/mcbeet/mecha/commit/2d1afa173a14f35d2f13130a48959a35222dd931)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index ebb78d533..615ca5899 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.49.0" +__version__ = "0.49.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index dd499c1eb..56adeca79 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.49.0" +version = "0.49.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3637569366ca879bb4b594cd3456cddb16f937d4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 6 May 2022 02:45:09 +0200 Subject: [PATCH 0834/1554] feat: iterable/mapping unpacking in json/nbt interpolation --- packages/bolt/bolt/codegen.py | 11 +- packages/bolt/bolt/parse.py | 17 ++- .../src/data/demo/functions/foo.mcfunction | 9 ++ .../tests/resources/bolt_examples.mcfunction | 10 ++ .../tests/snapshots/bolt__parse_205__0.txt | 77 +++++++++++ .../tests/snapshots/bolt__parse_205__1.txt | 61 +++++++++ .../tests/snapshots/bolt__parse_206__0.txt | 126 ++++++++++++++++++ .../tests/snapshots/bolt__parse_206__1.txt | 91 +++++++++++++ .../tests/snapshots/bolt__parse_207__0.txt | 103 ++++++++++++++ .../tests/snapshots/bolt__parse_207__1.txt | 88 ++++++++++++ .../examples__build_bolt_basic__0.pack.md | 3 + 11 files changed, 594 insertions(+), 2 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_205__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_205__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_206__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_206__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_207__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_207__1.txt diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 6f08a2d87..e1fa50e54 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -29,7 +29,6 @@ ) from beet.core.utils import normalize_string - from mecha import ( AstChildren, AstCommand, @@ -646,8 +645,18 @@ def interpolation( ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: result = yield from visit_single(node.value, required=True) value = "f" + repr(node.prefix + "{" + result + "}") if node.prefix else result + + if node.unpack == "**": + value = f"{{**{value}}}" + elif node.unpack == "*": + value = f"[*{value}]" + rhs = acc.helper(f"interpolate_{node.converter}", value, acc.make_ref(node)) acc.statement(f"{result} = {rhs}", lineno=node) + + if node.unpack: + result = f"*{result}" + return [result] @rule(AstExpressionBinary) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index c8a54ed09..6a3f9d575 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -287,8 +287,20 @@ def get_bolt_parsers( "phrase": InterpolationParser("phrase", parsers["phrase"]), "greedy": InterpolationParser("greedy", parsers["greedy"]), "json": InterpolationParser("json", parsers["json"]), + "json_object_entry": InterpolationParser( + "json", parsers["json_object_entry"], unpack=r"\*\*" + ), + "json_array_element": InterpolationParser( + "json", parsers["json_array_element"], unpack=r"\*" + ), "json_object": InterpolationParser("json_object", parsers["json_object"]), "nbt": InterpolationParser("nbt", parsers["nbt"]), + "nbt_compound_entry": InterpolationParser( + "nbt", parsers["nbt_compound_entry"], unpack=r"\*\*" + ), + "nbt_list_or_array_element": InterpolationParser( + "nbt", parsers["nbt_list_or_array_element"], unpack=r"\*" + ), "nbt_compound": InterpolationParser("nbt_compound", parsers["nbt_compound"]), "nbt_path": InterpolationParser("nbt_path", parsers["nbt_path"]), "range": InterpolationParser("range", parsers["range"], fallback=True), @@ -486,6 +498,7 @@ class InterpolationParser: converter: str parser: Parser prefix: Optional[str] = None + unpack: Optional[str] = None fallback: bool = False final: bool = False @@ -496,11 +509,13 @@ def __call__(self, stream: TokenStream) -> Any: for parser, alternative in stream.choose(*order): with alternative: if parser == "interpolation": - with stream.syntax(prefix=self.prefix): + with stream.syntax(prefix=self.prefix, unpack=self.unpack): prefix = stream.get("prefix") + unpack = self.unpack is not None and stream.expect("unpack") node = delegate("bolt:interpolation", stream) node = AstInterpolation( prefix=prefix.value if prefix else None, + unpack=unpack.value if unpack else None, converter=self.converter, value=node, ) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index d076e73f9..d121a0021 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -613,3 +613,12 @@ something() from ./utils import load_storage load_storage(./random_data, "random_data.json") if data storage ./random_data {value: 42} say json loaded successfully + +custom_model_data = {CustomModelData: 7} +give @s bow{**custom_model_data} + +stone_can_place_on = ["minecraft:dirt"] +give @s stone{CanPlaceOn: [*stone_can_place_on, "minecraft:gravel"], **custom_model_data} + +red = {"color": "red"} +tellraw @p ["", {"text": "hey", **red}, *stone_can_place_on, *red.color] diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 6aea9625b..8230faeee 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -762,3 +762,13 @@ say a ### "hey" "hey" +### +bow_data = {CustomModelData: 7} +give @s bow{**bow_data} +### +custom_model_data = {CustomModelData: 7} +stone_can_place_on = ["minecraft:dirt"] +give @s stone{CanPlaceOn: [*stone_can_place_on], **custom_model_data} +### +red = {"color": "red"} +tellraw @p ["", {"text": "hey", **red}, *red.color] diff --git a/packages/bolt/tests/snapshots/bolt__parse_205__0.txt b/packages/bolt/tests/snapshots/bolt__parse_205__0.txt new file mode 100644 index 000000000..62148d6de --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_205__0.txt @@ -0,0 +1,77 @@ +bow_data = {CustomModelData: 7} +give @s bow{**bow_data} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'bow_data' + rebind: False + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + items: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + key: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'CustomModelData' + value: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=30, lineno=1, colno=31) + value: 7 + + location: SourceLocation(pos=32, lineno=2, colno=1) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=37, lineno=2, colno=6) + end_location: SourceLocation(pos=39, lineno=2, colno=8) + variable: 's' + arguments: + + + location: SourceLocation(pos=40, lineno=2, colno=9) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + identifier: + + location: SourceLocation(pos=40, lineno=2, colno=9) + end_location: SourceLocation(pos=43, lineno=2, colno=12) + is_tag: False + namespace: None + path: 'bow' + data_tags: + + location: SourceLocation(pos=43, lineno=2, colno=12) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + entries: + + location: SourceLocation(pos=46, lineno=2, colno=15) + end_location: SourceLocation(pos=54, lineno=2, colno=23) + prefix: None + unpack: '**' + converter: 'nbt' + value: + + location: SourceLocation(pos=46, lineno=2, colno=15) + end_location: SourceLocation(pos=54, lineno=2, colno=23) + value: 'bow_data' diff --git a/packages/bolt/tests/snapshots/bolt__parse_205__1.txt b/packages/bolt/tests/snapshots/bolt__parse_205__1.txt new file mode 100644 index 000000000..24a5c79ca --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_205__1.txt @@ -0,0 +1,61 @@ +_mecha_lineno = [1, 10], [1, 2] +_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var4: + _mecha_var0 = 'CustomModelData' + _mecha_var1 = 7 + _mecha_var2 = {_mecha_var0: _mecha_var1} + bow_data = _mecha_var2 + _mecha_var3 = bow_data + _mecha_var3 = _mecha_helper_interpolate_nbt({**_mecha_var3}, _mecha_refs[0]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_helper_replace(_mecha_refs[2], data_tags=_mecha_helper_replace(_mecha_refs[1], entries=_mecha_helper_children([*_mecha_var3])))]))) +_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +--- +output = _mecha_var5 +--- +_mecha_refs[0] + + location: SourceLocation(pos=46, lineno=2, colno=15) + end_location: SourceLocation(pos=54, lineno=2, colno=23) + prefix: None + unpack: '**' + converter: 'nbt' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=43, lineno=2, colno=12) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + entries: + +_mecha_refs[2] + + location: SourceLocation(pos=40, lineno=2, colno=9) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + identifier: + + data_tags: + +_mecha_refs[3] + + location: SourceLocation(pos=37, lineno=2, colno=6) + end_location: SourceLocation(pos=39, lineno=2, colno=8) + variable: 's' + arguments: + +_mecha_refs[4] + + location: SourceLocation(pos=32, lineno=2, colno=1) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + identifier: 'give:targets:item' + arguments: + + +_mecha_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=2, colno=24) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_206__0.txt b/packages/bolt/tests/snapshots/bolt__parse_206__0.txt new file mode 100644 index 000000000..f2c33cb7a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_206__0.txt @@ -0,0 +1,126 @@ +custom_model_data = {CustomModelData: 7} +stone_can_place_on = ["minecraft:dirt"] +give @s stone{CanPlaceOn: [*stone_can_place_on], **custom_model_data} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'custom_model_data' + rebind: False + value: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + items: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + key: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 'CustomModelData' + value: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 7 + + location: SourceLocation(pos=41, lineno=2, colno=1) + end_location: SourceLocation(pos=80, lineno=2, colno=40) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=41, lineno=2, colno=1) + end_location: SourceLocation(pos=80, lineno=2, colno=40) + operator: '=' + target: + + location: SourceLocation(pos=41, lineno=2, colno=1) + end_location: SourceLocation(pos=59, lineno=2, colno=19) + value: 'stone_can_place_on' + rebind: False + value: + + location: SourceLocation(pos=62, lineno=2, colno=22) + end_location: SourceLocation(pos=80, lineno=2, colno=40) + items: + + location: SourceLocation(pos=63, lineno=2, colno=23) + end_location: SourceLocation(pos=79, lineno=2, colno=39) + value: 'minecraft:dirt' + + location: SourceLocation(pos=81, lineno=3, colno=1) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + identifier: 'give:targets:item' + arguments: + + location: SourceLocation(pos=86, lineno=3, colno=6) + end_location: SourceLocation(pos=88, lineno=3, colno=8) + variable: 's' + arguments: + + + location: SourceLocation(pos=89, lineno=3, colno=9) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + identifier: + + location: SourceLocation(pos=89, lineno=3, colno=9) + end_location: SourceLocation(pos=94, lineno=3, colno=14) + is_tag: False + namespace: None + path: 'stone' + data_tags: + + location: SourceLocation(pos=94, lineno=3, colno=14) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + entries: + + location: SourceLocation(pos=95, lineno=3, colno=15) + end_location: SourceLocation(pos=128, lineno=3, colno=48) + key: + + location: SourceLocation(pos=95, lineno=3, colno=15) + end_location: SourceLocation(pos=105, lineno=3, colno=25) + value: 'CanPlaceOn' + value: + + location: SourceLocation(pos=107, lineno=3, colno=27) + end_location: SourceLocation(pos=128, lineno=3, colno=48) + elements: + + location: SourceLocation(pos=109, lineno=3, colno=29) + end_location: SourceLocation(pos=127, lineno=3, colno=47) + prefix: None + unpack: '*' + converter: 'nbt' + value: + + location: SourceLocation(pos=109, lineno=3, colno=29) + end_location: SourceLocation(pos=127, lineno=3, colno=47) + value: 'stone_can_place_on' + + location: SourceLocation(pos=132, lineno=3, colno=52) + end_location: SourceLocation(pos=149, lineno=3, colno=69) + prefix: None + unpack: '**' + converter: 'nbt' + value: + + location: SourceLocation(pos=132, lineno=3, colno=52) + end_location: SourceLocation(pos=149, lineno=3, colno=69) + value: 'custom_model_data' diff --git a/packages/bolt/tests/snapshots/bolt__parse_206__1.txt b/packages/bolt/tests/snapshots/bolt__parse_206__1.txt new file mode 100644 index 000000000..7be209484 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_206__1.txt @@ -0,0 +1,91 @@ +_mecha_lineno = [1, 11, 13], [1, 2, 3] +_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var7: + _mecha_var0 = 'CustomModelData' + _mecha_var1 = 7 + _mecha_var2 = {_mecha_var0: _mecha_var1} + custom_model_data = _mecha_var2 + _mecha_var3 = 'minecraft:dirt' + _mecha_var4 = [_mecha_var3] + stone_can_place_on = _mecha_var4 + _mecha_var5 = stone_can_place_on + _mecha_var5 = _mecha_helper_interpolate_nbt([*_mecha_var5], _mecha_refs[0]) + _mecha_var6 = custom_model_data + _mecha_var6 = _mecha_helper_interpolate_nbt({**_mecha_var6}, _mecha_refs[3]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_helper_replace(_mecha_refs[5], data_tags=_mecha_helper_replace(_mecha_refs[4], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], value=_mecha_helper_replace(_mecha_refs[1], elements=_mecha_helper_children([*_mecha_var5]))), *_mecha_var6])))]))) +_mecha_var8 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var7)) +--- +output = _mecha_var8 +--- +_mecha_refs[0] + + location: SourceLocation(pos=109, lineno=3, colno=29) + end_location: SourceLocation(pos=127, lineno=3, colno=47) + prefix: None + unpack: '*' + converter: 'nbt' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=107, lineno=3, colno=27) + end_location: SourceLocation(pos=128, lineno=3, colno=48) + elements: + +_mecha_refs[2] + + location: SourceLocation(pos=95, lineno=3, colno=15) + end_location: SourceLocation(pos=128, lineno=3, colno=48) + key: + + value: + +_mecha_refs[3] + + location: SourceLocation(pos=132, lineno=3, colno=52) + end_location: SourceLocation(pos=149, lineno=3, colno=69) + prefix: None + unpack: '**' + converter: 'nbt' + value: + +_mecha_refs[4] + + location: SourceLocation(pos=94, lineno=3, colno=14) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + entries: + + +_mecha_refs[5] + + location: SourceLocation(pos=89, lineno=3, colno=9) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + identifier: + + data_tags: + +_mecha_refs[6] + + location: SourceLocation(pos=86, lineno=3, colno=6) + end_location: SourceLocation(pos=88, lineno=3, colno=8) + variable: 's' + arguments: + +_mecha_refs[7] + + location: SourceLocation(pos=81, lineno=3, colno=1) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + identifier: 'give:targets:item' + arguments: + + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=150, lineno=3, colno=70) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_207__0.txt b/packages/bolt/tests/snapshots/bolt__parse_207__0.txt new file mode 100644 index 000000000..0053b00e0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_207__0.txt @@ -0,0 +1,103 @@ +red = {"color": "red"} +tellraw @p ["", {"text": "hey", **red}, *red.color] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=75, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'red' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + items: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + key: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'color' + value: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'red' + + location: SourceLocation(pos=23, lineno=2, colno=1) + end_location: SourceLocation(pos=74, lineno=2, colno=52) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=31, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=11) + variable: 'p' + arguments: + + + location: SourceLocation(pos=34, lineno=2, colno=12) + end_location: SourceLocation(pos=74, lineno=2, colno=52) + elements: + + location: SourceLocation(pos=35, lineno=2, colno=13) + end_location: SourceLocation(pos=37, lineno=2, colno=15) + value: '' + + location: SourceLocation(pos=39, lineno=2, colno=17) + end_location: SourceLocation(pos=61, lineno=2, colno=39) + entries: + + location: SourceLocation(pos=40, lineno=2, colno=18) + end_location: SourceLocation(pos=53, lineno=2, colno=31) + key: + + location: SourceLocation(pos=40, lineno=2, colno=18) + end_location: SourceLocation(pos=46, lineno=2, colno=24) + value: 'text' + value: + + location: SourceLocation(pos=48, lineno=2, colno=26) + end_location: SourceLocation(pos=53, lineno=2, colno=31) + value: 'hey' + + location: SourceLocation(pos=57, lineno=2, colno=35) + end_location: SourceLocation(pos=60, lineno=2, colno=38) + prefix: None + unpack: '**' + converter: 'json' + value: + + location: SourceLocation(pos=57, lineno=2, colno=35) + end_location: SourceLocation(pos=60, lineno=2, colno=38) + value: 'red' + + location: SourceLocation(pos=64, lineno=2, colno=42) + end_location: SourceLocation(pos=73, lineno=2, colno=51) + prefix: None + unpack: '*' + converter: 'json' + value: + + location: SourceLocation(pos=64, lineno=2, colno=42) + end_location: SourceLocation(pos=73, lineno=2, colno=51) + name: 'color' + value: + + location: SourceLocation(pos=64, lineno=2, colno=42) + end_location: SourceLocation(pos=67, lineno=2, colno=45) + value: 'red' diff --git a/packages/bolt/tests/snapshots/bolt__parse_207__1.txt b/packages/bolt/tests/snapshots/bolt__parse_207__1.txt new file mode 100644 index 000000000..6ac1c1add --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_207__1.txt @@ -0,0 +1,88 @@ +_mecha_lineno = [1, 11], [1, 2] +_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +with _mecha_runtime.scope() as _mecha_var5: + _mecha_var0 = 'color' + _mecha_var1 = 'red' + _mecha_var2 = {_mecha_var0: _mecha_var1} + red = _mecha_var2 + _mecha_var3 = red + _mecha_var3 = _mecha_helper_interpolate_json({**_mecha_var3}, _mecha_refs[0]) + _mecha_var4 = red + _mecha_var4 = _mecha_helper_get_attribute(_mecha_var4, 'color') + _mecha_var4 = _mecha_helper_interpolate_json([*_mecha_var4], _mecha_refs[4]) + _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_helper_replace(_mecha_refs[5], elements=_mecha_helper_children([_mecha_refs[3], _mecha_helper_replace(_mecha_refs[2], entries=_mecha_helper_children([_mecha_refs[1], *_mecha_var3])), *_mecha_var4]))]))) +_mecha_var6 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var5)) +--- +output = _mecha_var6 +--- +_mecha_refs[0] + + location: SourceLocation(pos=57, lineno=2, colno=35) + end_location: SourceLocation(pos=60, lineno=2, colno=38) + prefix: None + unpack: '**' + converter: 'json' + value: + +_mecha_refs[1] + + location: SourceLocation(pos=40, lineno=2, colno=18) + end_location: SourceLocation(pos=53, lineno=2, colno=31) + key: + + value: + +_mecha_refs[2] + + location: SourceLocation(pos=39, lineno=2, colno=17) + end_location: SourceLocation(pos=61, lineno=2, colno=39) + entries: + + +_mecha_refs[3] + + location: SourceLocation(pos=35, lineno=2, colno=13) + end_location: SourceLocation(pos=37, lineno=2, colno=15) + value: '' +_mecha_refs[4] + + location: SourceLocation(pos=64, lineno=2, colno=42) + end_location: SourceLocation(pos=73, lineno=2, colno=51) + prefix: None + unpack: '*' + converter: 'json' + value: + +_mecha_refs[5] + + location: SourceLocation(pos=34, lineno=2, colno=12) + end_location: SourceLocation(pos=74, lineno=2, colno=52) + elements: + + + +_mecha_refs[6] + + location: SourceLocation(pos=31, lineno=2, colno=9) + end_location: SourceLocation(pos=33, lineno=2, colno=11) + variable: 'p' + arguments: + +_mecha_refs[7] + + location: SourceLocation(pos=23, lineno=2, colno=1) + end_location: SourceLocation(pos=74, lineno=2, colno=52) + identifier: 'tellraw:targets:message' + arguments: + + +_mecha_refs[8] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=75, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 524712486..880138b35 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -256,6 +256,9 @@ execute unless score global bolt_basic.tmp1 matches 0 run scoreboard players ope execute unless score global bolt_basic.tmp2 matches 0 run say hello say this is from demo:utils execute if data storage demo:random_data {value: 42} run say json loaded successfully +give @s bow{CustomModelData: 7} +give @s stone{CanPlaceOn: ["minecraft:dirt", "minecraft:gravel"], CustomModelData: 7} +tellraw @p ["", {"text": "hey", "color": "red"}, "minecraft:dirt", "r", "e", "d"] ``` `@function demo:import_a` From 7bf5e6a5800d5caae7f5cb819f75139793701574 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 6 May 2022 02:46:05 +0200 Subject: [PATCH 0835/1554] chore: update mecha --- packages/bolt/poetry.lock | 8 ++++---- packages/bolt/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index dc8138b94..7fa03b92e 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.49.0" +version = "0.49.1" description = "A powerful Minecraft command library" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "742e3c6f97c61d337dd502994508e8d70bf6754469f9414b56f75cc1ec40e7c4" +content-hash = "1bde70dbe9853029544a132a8084773042bcf5c032d503f4d1e7c9444c482d41" [metadata.files] atomicwrites = [ @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.49.0-py3-none-any.whl", hash = "sha256:40c3cb9d5d7413d85ccf2b0907fba4d5b5ab3bd2bfc6c2800e5b4c58c75b2434"}, - {file = "mecha-0.49.0.tar.gz", hash = "sha256:b09e9bdffcbd9f121e20d29009f4552adfe129d2a810ec1efa87aabfc7bf91ae"}, + {file = "mecha-0.49.1-py3-none-any.whl", hash = "sha256:5db5f229724c12e170bc39c1c1d33b96df26bdeec104ef3d14a6d032b1d3be8d"}, + {file = "mecha-0.49.1.tar.gz", hash = "sha256:6c3babe75aa3439fac4ebe0a0786fc29521de24a413467ba1e93f048dfeb5683"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 9fd4ff1e5..46d371beb 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.64.0" -mecha = ">=0.49.0" +mecha = ">=0.49.1" [tool.poetry.dev-dependencies] pytest = "^7.1.2" From 19e65af0afd41ccc212a70c4269465951c1fcf9c Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 6 May 2022 00:47:21 +0000 Subject: [PATCH 0836/1554] 0.5.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 8 ++++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index cc1ac05f9..2867fe451 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.5.0 (2022-05-06) +### Feature +* Iterable/mapping unpacking in json/nbt interpolation ([`32acee0`](https://github.com/mcbeet/bolt/commit/32acee0e8bbf2c831fa48c30595b63ed61f1de40)) +* Unpack field for interpolation node ([`b2f6dd7`](https://github.com/mcbeet/bolt/commit/b2f6dd7017afe5c7ebc4c530f152b666c7557ba1)) + +### Fix +* Converter for json object ([`825f077`](https://github.com/mcbeet/bolt/commit/825f077e14bafdf719f4f488347714b5761886ac)) + ## v0.4.2 (2022-05-02) ### Fix * Update mecha to fix indent bug ([`006a57a`](https://github.com/mcbeet/bolt/commit/006a57a4ff0f0e99af106e235440c5c7b06f1f71)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index c2c88b60b..43444a622 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.4.2" +__version__ = "0.5.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 46d371beb..48786dee7 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.4.2" +version = "0.5.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From b704aa8312caf2ad2487affbb2be1bfa3df28aff Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 13 May 2022 00:24:32 +0200 Subject: [PATCH 0837/1554] feat: allow append/prepend for nested tag resources --- .../src/data/demo/functions/foo.mcfunction | 12 ++++++++ .../mecha/mecha/contrib/nested_resources.py | 28 ++++++++++++++++--- ...s__build_basic_nested_resources__0.pack.md | 4 ++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction index 9231f2dce..e4aead033 100644 --- a/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction @@ -14,3 +14,15 @@ merge function_tag minecraft:tick { "demo:bar" ] } + +prepend function_tag minecraft:tick { + "values": [ + "demo:before" + ] +} + +append function_tag minecraft:tick { + "values": [ + "demo:after" + ] +} diff --git a/packages/mecha/mecha/contrib/nested_resources.py b/packages/mecha/mecha/contrib/nested_resources.py index 492458d28..152a1e9d4 100644 --- a/packages/mecha/mecha/contrib/nested_resources.py +++ b/packages/mecha/mecha/contrib/nested_resources.py @@ -9,7 +9,7 @@ from dataclasses import dataclass, replace from typing import Dict, List, Type -from beet import Context, DataModelBase, NamespaceFile +from beet import Context, DataModelBase, NamespaceFile, TagFile from beet.core.utils import required_field, snake_case from tokenstream import set_location @@ -65,8 +65,23 @@ def beet_default(ctx: Context): json_resources[f"{name}_file"] = json_resources.pop(name) commands = {name: NESTED_JSON_COMMAND_TREE for name in json_resources} - merge_commands = {"merge": {"type": "literal", "children": commands}} - mc.spec.add_commands({"type": "root", "children": {**commands, **merge_commands}}) + tag_commands = { + name: NESTED_JSON_COMMAND_TREE + for name, file_type in json_resources.items() + if issubclass(file_type, TagFile) + } + + mc.spec.add_commands( + { + "type": "root", + "children": { + **commands, + "merge": {"type": "literal", "children": commands}, + "append": {"type": "literal", "children": tag_commands}, + "prepend": {"type": "literal", "children": tag_commands}, + }, + } + ) mc.spec.parsers["nested_json"] = delegate("json") mc.spec.parsers["command:argument:mecha:nested_json"] = MultilineParser( @@ -79,8 +94,9 @@ def beet_default(ctx: Context): database=mc.database, json_identifiers={ f"{prefix}{name}:name:content": file_type - for prefix in ["", "merge:"] for name, file_type in json_resources.items() + for prefix in ["", "merge:"] + + ["append:", "prepend:"] * issubclass(file_type, TagFile) }, ) ) @@ -125,6 +141,10 @@ def nested_resources(self, node: AstRoot): proxy.merge({full_name: file_instance}) # type: ignore elif full_name not in proxy: proxy[full_name] = file_instance + elif command.identifier.startswith("append:"): + proxy[full_name].merge(file_instance) # type: ignore + elif command.identifier.startswith("prepend:"): + proxy[full_name].prepend(file_instance) # type: ignore else: d = Diagnostic( level="error", diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md index 0ca1caa2b..5f1dad2f4 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md @@ -34,8 +34,10 @@ say world ```json { "values": [ + "demo:before", "demo:foo", - "demo:bar" + "demo:bar", + "demo:after" ] } ``` From 4d262b3033782ff7baedae978c99c87ba85ff46b Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 12 May 2022 22:25:24 +0000 Subject: [PATCH 0838/1554] 0.50.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 22bc7117a..fc40cb231 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.50.0 (2022-05-12) +### Feature +* Allow append/prepend for nested tag resources ([`84b0643`](https://github.com/mcbeet/mecha/commit/84b0643c0631d7d40ede44f4d86a7e74b07322f7)) + ## v0.49.1 (2022-05-06) ### Fix * Take into account possible syntax extensions when checking nbt list/array homogeneity ([`de12e61`](https://github.com/mcbeet/mecha/commit/de12e617a0401182ccfebe071c6b4930988b9e7f)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 615ca5899..6cc88f115 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.49.1" +__version__ = "0.50.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 56adeca79..4e2278048 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.49.1" +version = "0.50.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 7748070275f19a0715fcc1c6b56b732c26fbc9bf Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 14 May 2022 17:34:30 +0200 Subject: [PATCH 0839/1554] fix: allow colon in player names --- packages/mecha/mecha/ast.py | 2 +- .../mecha/tests/resources/argument_examples.json | 6 +++++- ...ument_examples_minecraft_score_holder_0_22__0.txt | 12 ++++++++++++ ...ument_examples_minecraft_score_holder_0_23__0.txt | 12 ++++++++++++ ...ument_examples_minecraft_score_holder_0_24__0.txt | 12 ++++++++++++ ...ument_examples_minecraft_score_holder_0_25__0.txt | 12 ++++++++++++ 6 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_22__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_23__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_24__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_25__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index f1d023e7e..025c23159 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -423,7 +423,7 @@ class AstPlayerName(AstLiteral): """Ast player name node.""" parser = "player_name" - regex = re.compile(r"(?!@)[^:*\s]+") + regex = re.compile(r"(?!@)[^*\s]+") @dataclass(frozen=True) diff --git a/packages/mecha/tests/resources/argument_examples.json b/packages/mecha/tests/resources/argument_examples.json index cc71965dd..2cfd7ada7 100644 --- a/packages/mecha/tests/resources/argument_examples.json +++ b/packages/mecha/tests/resources/argument_examples.json @@ -488,7 +488,11 @@ "@a[team=]", "@a[team=!]", "@a[tag=]", - "@a[tag=!]" + "@a[tag=!]", + "#bruh", + "%foo.bar", + "$heey.this-+weird:butok", + "#no_flag:start" ] }, { diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_22__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_22__0.txt new file mode 100644 index 000000000..83a83ff2e --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_22__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder 0 22 +--- +{'amount': 'multiple'} +--- +#bruh +--- +#bruh +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: '#bruh' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_23__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_23__0.txt new file mode 100644 index 000000000..b1e235849 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_23__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder 0 23 +--- +{'amount': 'multiple'} +--- +%foo.bar +--- +%foo.bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: '%foo.bar' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_24__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_24__0.txt new file mode 100644 index 000000000..126e777e6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_24__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder 0 24 +--- +{'amount': 'multiple'} +--- +$heey.this-+weird:butok +--- +$heey.this-+weird:butok +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: '$heey.this-+weird:butok' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_25__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_25__0.txt new file mode 100644 index 000000000..256f888a8 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_score_holder_0_25__0.txt @@ -0,0 +1,12 @@ +minecraft:score_holder 0 25 +--- +{'amount': 'multiple'} +--- +#no_flag:start +--- +#no_flag:start +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: '#no_flag:start' \ No newline at end of file From cf7ab279e98009ad113c40fc24a711b2b7111c59 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 14 May 2022 15:35:24 +0000 Subject: [PATCH 0840/1554] 0.50.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index fc40cb231..0151e4fe9 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.50.1 (2022-05-14) +### Fix +* Allow colon in player names ([`fefb480`](https://github.com/mcbeet/mecha/commit/fefb480a60586ab5e76cc33426d4d66674a72673)) + ## v0.50.0 (2022-05-12) ### Feature * Allow append/prepend for nested tag resources ([`84b0643`](https://github.com/mcbeet/mecha/commit/84b0643c0631d7d40ede44f4d86a7e74b07322f7)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 6cc88f115..d4948c70a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.50.0" +__version__ = "0.50.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4e2278048..0a5c33c27 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.50.0" +version = "0.50.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From c4bf17a2841e2ecadfd0bf899d645d03b2e38901 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 17 May 2022 20:11:52 +0200 Subject: [PATCH 0841/1554] fix: allow multiline notes --- packages/mecha/mecha/diagnostic.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/diagnostic.py b/packages/mecha/mecha/diagnostic.py index 4de4fcbf6..3456f8907 100644 --- a/packages/mecha/mecha/diagnostic.py +++ b/packages/mecha/mecha/diagnostic.py @@ -7,6 +7,7 @@ from dataclasses import dataclass, field, replace +from textwrap import indent from types import TracebackType from typing import Any, Iterator, List, Literal, Optional, Type @@ -44,7 +45,9 @@ def format_message(self) -> str: def format_notes(self) -> str: """Return the formatted notes.""" - return "Notes:\n" + "\n".join(f" - {note}" for note in self.notes) + return "Notes:\n" + "\n".join( + " - " + indent(note, " ")[4:] for note in self.notes + ) def format_location(self) -> str: """Return the formatted location of the reported message.""" From a82c63c699bafd8d83736780b1b1ab3d2875841f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 17 May 2022 20:18:12 +0200 Subject: [PATCH 0842/1554] fix: allow resource redefinition if content matches --- .../src/data/demo/functions/foo.mcfunction | 13 +++++++++++++ .../src/data/demo/functions/foo.mcfunction | 7 +++++++ packages/mecha/mecha/contrib/nested_resources.py | 7 +++++-- packages/mecha/mecha/contrib/nesting.py | 10 +++++++--- ...xamples__build_basic_nested_resources__0.pack.md | 10 ++++++++++ .../examples__build_basic_nesting__0.pack.md | 6 ++++++ 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction index e4aead033..ec64a9263 100644 --- a/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nested_resources/src/data/demo/functions/foo.mcfunction @@ -26,3 +26,16 @@ append function_tag minecraft:tick { "demo:after" ] } + + +function_tag demo:abc { + "values": [ + "demo:foo" + ] +} + +function_tag demo:abc { + "values": [ + "demo:foo" + ] +} diff --git a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction index 4dceef5f7..7b9513944 100644 --- a/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_nesting/src/data/demo/functions/foo.mcfunction @@ -124,3 +124,10 @@ prepend function demo:stack: say stack3 say after + + +function demo:abc: + say hello + +function demo:abc: + say hello diff --git a/packages/mecha/mecha/contrib/nested_resources.py b/packages/mecha/mecha/contrib/nested_resources.py index 152a1e9d4..ccaa73989 100644 --- a/packages/mecha/mecha/contrib/nested_resources.py +++ b/packages/mecha/mecha/contrib/nested_resources.py @@ -145,10 +145,13 @@ def nested_resources(self, node: AstRoot): proxy[full_name].merge(file_instance) # type: ignore elif command.identifier.startswith("prepend:"): proxy[full_name].prepend(file_instance) # type: ignore - else: + elif ( + proxy[full_name].ensure_deserialized() + != file_instance.ensure_deserialized() + ): d = Diagnostic( level="error", - message=f"Resource {full_name!r} of type {file_type} already exists.", + message=f'Redefinition of {snake_case(file_type.__name__)} "{full_name}" doesn\'t match existing file.', ) diagnostics.add(set_location(d, name)) continue diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 3c7cb21f6..a2c4d0489 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -246,14 +246,18 @@ def handle_function( self.emit_function(path, root) elif node.identifier == "function:name:commands": - d = Diagnostic("error", f"Function {path!r} already exists.") - raise set_location(d, name) + if self.database[target].ast != root: + d = Diagnostic( + "error", + f'Redefinition of function "{path}" doesn\'t match existing implementation.', + ) + raise set_location(d, name) elif target is self.database.current: if node.identifier == "prepend:function:name:commands": d = Diagnostic( "error", - f"Can't prepend commands to the current function {path!r}.", + f'Can\'t prepend commands to the current function "{path}".', ) raise set_location(d, node, name) diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md index 5f1dad2f4..f8a2a0714 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md @@ -27,6 +27,16 @@ say hello say world ``` +`@function_tag demo:abc` + +```json +{ + "values": [ + "demo:foo" + ] +} +``` + ### minecraft `@function_tag minecraft:tick` diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index e1c828b6c..45c4bf83b 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -137,6 +137,12 @@ say stack2 say stack1 ``` +`@function demo:abc` + +```mcfunction +say hello +``` + `@function demo:wat/nested_execute_0` ```mcfunction From d82af8ae81accd370d442ead80f0e43bdd8159bc Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 17 May 2022 18:20:28 +0000 Subject: [PATCH 0843/1554] 0.50.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 0151e4fe9..1a177f0a9 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.50.2 (2022-05-17) +### Fix +* Allow resource redefinition if content matches ([`0e15796`](https://github.com/mcbeet/mecha/commit/0e157966e5c972811ef33e95c68ff779cd03825e)) +* Allow multiline notes ([`80de947`](https://github.com/mcbeet/mecha/commit/80de94784529b1ec726b8483ab63d46a18e3679b)) + ## v0.50.1 (2022-05-14) ### Fix * Allow colon in player names ([`fefb480`](https://github.com/mcbeet/mecha/commit/fefb480a60586ab5e76cc33426d4d66674a72673)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index d4948c70a..dc26bc49f 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.50.1" +__version__ = "0.50.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0a5c33c27..6317dc474 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.50.1" +version = "0.50.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 8ccc17276eff2c5fe512d6ddb6686192cb5ecb73 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 21 May 2022 19:10:50 +0200 Subject: [PATCH 0844/1554] test: circular import --- packages/bolt/examples/bolt_circular/beet.yml | 7 ++++++ .../bolt/examples/bolt_circular/src/bar.bolt | 6 +++++ .../bolt/examples/bolt_circular/src/foo.bolt | 6 +++++ .../bolt/examples/bolt_circular/src/main.bolt | 6 +++++ .../examples__build_bolt_circular__0.pack.md | 23 +++++++++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 packages/bolt/examples/bolt_circular/beet.yml create mode 100644 packages/bolt/examples/bolt_circular/src/bar.bolt create mode 100644 packages/bolt/examples/bolt_circular/src/foo.bolt create mode 100644 packages/bolt/examples/bolt_circular/src/main.bolt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md diff --git a/packages/bolt/examples/bolt_circular/beet.yml b/packages/bolt/examples/bolt_circular/beet.yml new file mode 100644 index 000000000..6a565b7f7 --- /dev/null +++ b/packages/bolt/examples/bolt_circular/beet.yml @@ -0,0 +1,7 @@ +require: + - bolt +data_pack: + load: + data/demo/modules: src +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_circular/src/bar.bolt b/packages/bolt/examples/bolt_circular/src/bar.bolt new file mode 100644 index 000000000..a6568c5ba --- /dev/null +++ b/packages/bolt/examples/bolt_circular/src/bar.bolt @@ -0,0 +1,6 @@ +import ./foo as foo + +VALUE = 33 + +def b(): + return foo.VALUE diff --git a/packages/bolt/examples/bolt_circular/src/foo.bolt b/packages/bolt/examples/bolt_circular/src/foo.bolt new file mode 100644 index 000000000..16fab9389 --- /dev/null +++ b/packages/bolt/examples/bolt_circular/src/foo.bolt @@ -0,0 +1,6 @@ +import ./bar as bar + +VALUE = 42 + +def a(): + return bar.VALUE diff --git a/packages/bolt/examples/bolt_circular/src/main.bolt b/packages/bolt/examples/bolt_circular/src/main.bolt new file mode 100644 index 000000000..a8e7f18bf --- /dev/null +++ b/packages/bolt/examples/bolt_circular/src/main.bolt @@ -0,0 +1,6 @@ +from ./foo import a +from ./bar import b + +function ./thing: + say a() + say b() diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md new file mode 100644 index 000000000..77be4cb9c --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md @@ -0,0 +1,23 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:thing` + +```mcfunction +say 33 +say 42 +``` From 47a8cbc4f72eb3a83b9c21e0ffe7ca0efc856062 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 22 May 2022 23:16:47 +0200 Subject: [PATCH 0845/1554] feat: 1.19 command tree --- packages/mecha/examples/basic_1.19/beet.yml | 7 + .../src/data/demo/functions/foo.mcfunction | 1 + packages/mecha/mecha/resources/1_19.json | 7704 +++++++++++++++++ .../examples__build_basic_1_19__0.pack.md | 22 + 4 files changed, 7734 insertions(+) create mode 100644 packages/mecha/examples/basic_1.19/beet.yml create mode 100644 packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/resources/1_19.json create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md diff --git a/packages/mecha/examples/basic_1.19/beet.yml b/packages/mecha/examples/basic_1.19/beet.yml new file mode 100644 index 000000000..2339c64a5 --- /dev/null +++ b/packages/mecha/examples/basic_1.19/beet.yml @@ -0,0 +1,7 @@ +data_pack: + load: "src" +pipeline: + - mecha +meta: + mecha: + version: 1.19 diff --git a/packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..8642e0565 --- /dev/null +++ b/packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +locate structure demo:thingy diff --git a/packages/mecha/mecha/resources/1_19.json b/packages/mecha/mecha/resources/1_19.json new file mode 100644 index 000000000..33906dad6 --- /dev/null +++ b/packages/mecha/mecha/resources/1_19.json @@ -0,0 +1,7704 @@ +{ + "type": "root", + "children": { + "advancement": { + "type": "literal", + "children": { + "grant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "everything": { + "type": "literal", + "executable": true + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "children": { + "criterion": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "revoke": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "everything": { + "type": "literal", + "executable": true + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "children": { + "criterion": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + } + }, + "attribute": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "attribute": { + "type": "argument", + "children": { + "base": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true + }, + "modifier": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "children": { + "name": { + "type": "argument", + "children": { + "value": { + "type": "argument", + "children": { + "add": { + "type": "literal", + "executable": true + }, + "multiply": { + "type": "literal", + "executable": true + }, + "multiply_base": { + "type": "literal", + "executable": true + } + }, + "parser": "brigadier:double" + } + }, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + }, + "parser": "minecraft:uuid" + } + } + }, + "remove": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "executable": true, + "parser": "minecraft:uuid" + } + } + }, + "value": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:uuid" + } + } + } + } + } + } + } + }, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:attribute" + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "ban": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "reason": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "ban-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "reason": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "banlist": { + "type": "literal", + "children": { + "ips": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "bossbar": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "get": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "max": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + }, + "value": { + "type": "literal", + "executable": true + }, + "visible": { + "type": "literal", + "executable": true + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "set": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "color": { + "type": "literal", + "children": { + "blue": { + "type": "literal", + "executable": true + }, + "green": { + "type": "literal", + "executable": true + }, + "pink": { + "type": "literal", + "executable": true + }, + "purple": { + "type": "literal", + "executable": true + }, + "red": { + "type": "literal", + "executable": true + }, + "white": { + "type": "literal", + "executable": true + }, + "yellow": { + "type": "literal", + "executable": true + } + } + }, + "max": { + "type": "literal", + "children": { + "max": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 1 + } + } + } + }, + "name": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "players": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "style": { + "type": "literal", + "children": { + "notched_10": { + "type": "literal", + "executable": true + }, + "notched_12": { + "type": "literal", + "executable": true + }, + "notched_20": { + "type": "literal", + "executable": true + }, + "notched_6": { + "type": "literal", + "executable": true + }, + "progress": { + "type": "literal", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "visible": { + "type": "literal", + "children": { + "visible": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + } + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "item": { + "type": "argument", + "children": { + "maxCount": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:item_predicate" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "clone": { + "type": "literal", + "children": { + "begin": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "data": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + } + } + }, + "datapack": { + "type": "literal", + "children": { + "disable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "enable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "children": { + "after": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "before": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "first": { + "type": "literal", + "executable": true + }, + "last": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "list": { + "type": "literal", + "children": { + "available": { + "type": "literal", + "executable": true + }, + "enabled": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "debug": { + "type": "literal", + "children": { + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:function" + } + } + }, + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "defaultgamemode": { + "type": "literal", + "children": { + "adventure": { + "type": "literal", + "executable": true + }, + "creative": { + "type": "literal", + "executable": true + }, + "spectator": { + "type": "literal", + "executable": true + }, + "survival": { + "type": "literal", + "executable": true + } + } + }, + "deop": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "difficulty": { + "type": "literal", + "children": { + "easy": { + "type": "literal", + "executable": true + }, + "hard": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + }, + "peaceful": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "effect": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "effect": { + "type": "argument", + "executable": true, + "parser": "minecraft:mob_effect" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "executable": true + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "effect": { + "type": "argument", + "children": { + "seconds": { + "type": "argument", + "children": { + "amplifier": { + "type": "argument", + "children": { + "hideParticles": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 255, + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 1000000, + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:mob_effect" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + }, + "enchant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "enchantment": { + "type": "argument", + "children": { + "level": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:item_enchantment" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "execute": { + "type": "literal", + "children": { + "align": { + "type": "literal", + "children": { + "axes": { + "type": "argument", + "parser": "minecraft:swizzle", + "redirect": ["execute"] + } + } + }, + "anchored": { + "type": "literal", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "at": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "if": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_predicate", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "data": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location", + "redirect": ["execute"] + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetObjective": { + "type": "argument", + "children": { + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "executable": true, + "parser": "minecraft:int_range", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + } + } + }, + "in": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, + "positioned": { + "type": "literal", + "children": { + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "rotated": { + "type": "literal", + "children": { + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "rot": { + "type": "argument", + "parser": "minecraft:rotation", + "redirect": ["execute"] + } + } + }, + "run": { + "type": "literal" + }, + "store": { + "type": "literal", + "children": { + "result": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "max": { + "type": "literal", + "redirect": ["execute"] + }, + "value": { + "type": "literal", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "success": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "max": { + "type": "literal", + "redirect": ["execute"] + }, + "value": { + "type": "literal", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + } + } + }, + "unless": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_predicate", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "data": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location", + "redirect": ["execute"] + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetObjective": { + "type": "argument", + "children": { + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "executable": true, + "parser": "minecraft:int_range", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + } + } + } + } + }, + "experience": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "amount": { + "type": "argument", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "brigadier:integer" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "query": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "single" + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "amount": { + "type": "argument", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + } + }, + "fill": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "hollow": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "outline": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_predicate" + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_state" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "forceload": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "executable": true, + "parser": "minecraft:column_pos" + } + }, + "executable": true, + "parser": "minecraft:column_pos" + } + } + }, + "query": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:column_pos" + } + }, + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "all": { + "type": "literal", + "executable": true + }, + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "executable": true, + "parser": "minecraft:column_pos" + } + }, + "executable": true, + "parser": "minecraft:column_pos" + } + } + } + } + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:function" + } + } + }, + "gamemode": { + "type": "literal", + "children": { + "adventure": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "creative": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "spectator": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "survival": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + } + } + }, + "gamerule": { + "type": "literal", + "children": { + "announceAdvancements": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "commandBlockOutput": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "disableElytraMovementCheck": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "disableRaids": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doDaylightCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doEntityDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doFireTick": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doImmediateRespawn": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doInsomnia": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doLimitedCrafting": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doMobLoot": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doMobSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doPatrolSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doTileDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doTraderSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doWardenSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doWeatherCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "drowningDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "fallDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "fireDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "forgiveDeadPlayers": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "freezeDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "keepInventory": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "logAdminCommands": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "maxCommandChainLength": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "maxEntityCramming": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "mobGriefing": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "naturalRegeneration": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "playersSleepingPercentage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "randomTickSpeed": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "reducedDebugInfo": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "sendCommandFeedback": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "showDeathMessages": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "spawnRadius": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "spectatorsGenerateChunks": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "universalAnger": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + } + } + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "item": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "help": { + "type": "literal", + "children": { + "command": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + }, + "executable": true + }, + "item": { + "type": "literal", + "children": { + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + }, + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + } + }, + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 64, + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:item_stack" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + } + }, + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 64, + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:item_stack" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + } + } + }, + "jfr": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "kick": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "reason": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "executable": true + }, + "list": { + "type": "literal", + "children": { + "uuids": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "locate": { + "type": "literal", + "children": { + "biome": { + "type": "literal", + "children": { + "biome": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + } + } + } + }, + "poi": { + "type": "literal", + "children": { + "poi": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:point_of_interest_type" + } + } + } + }, + "structure": { + "type": "literal", + "children": { + "structure": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/structure" + } + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "players": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + }, + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + }, + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + }, + "spawn": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:vec3" + } + } + } + } + }, + "me": { + "type": "literal", + "children": { + "action": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + } + }, + "msg": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "op": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "pardon": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "pardon-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "particle": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "delta": { + "type": "argument", + "children": { + "speed": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "normal": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:particle" + } + } + }, + "perf": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "place": { + "type": "literal", + "children": { + "feature": { + "type": "literal", + "children": { + "feature": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:worldgen/configured_feature" + } + } + } + }, + "jigsaw": { + "type": "literal", + "children": { + "pool": { + "type": "argument", + "children": { + "target": { + "type": "argument", + "children": { + "max_depth": { + "type": "argument", + "children": { + "position": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 7, + "min": 1 + } + } + }, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:worldgen/template_pool" + } + } + } + }, + "structure": { + "type": "literal", + "children": { + "structure": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:worldgen/structure" + } + } + } + }, + "template": { + "type": "literal", + "children": { + "template": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "rotation": { + "type": "argument", + "children": { + "mirror": { + "type": "argument", + "children": { + "integrity": { + "type": "argument", + "children": { + "seed": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:template_mirror" + } + }, + "executable": true, + "parser": "minecraft:template_rotation" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "playsound": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "children": { + "ambient": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "hostile": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "master": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "music": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "neutral": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "player": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "record": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "voice": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "weather": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "publish": { + "type": "literal", + "children": { + "port": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 65535, + "min": 0 + } + } + }, + "executable": true + }, + "recipe": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "*": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "take": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "*": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + } + }, + "reload": { + "type": "literal", + "executable": true + }, + "save-all": { + "type": "literal", + "children": { + "flush": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "save-off": { + "type": "literal", + "executable": true + }, + "save-on": { + "type": "literal", + "executable": true + }, + "say": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + } + }, + "schedule": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + } + }, + "function": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "children": { + "time": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:time" + } + }, + "parser": "minecraft:function" + } + } + } + } + }, + "scoreboard": { + "type": "literal", + "children": { + "objectives": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "children": { + "criteria": { + "type": "argument", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "executable": true, + "parser": "minecraft:objective_criteria" + } + }, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "modify": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "children": { + "displayname": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "rendertype": { + "type": "literal", + "children": { + "hearts": { + "type": "literal", + "executable": true + }, + "integer": { + "type": "literal", + "executable": true + } + } + } + }, + "parser": "minecraft:objective" + } + } + }, + "remove": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + } + }, + "setdisplay": { + "type": "literal", + "children": { + "slot": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "executable": true, + "parser": "minecraft:scoreboard_slot" + } + } + } + } + }, + "players": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "children": { + "score": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "enable": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "get": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "list": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + }, + "executable": true + }, + "operation": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "targetObjective": { + "type": "argument", + "children": { + "operation": { + "type": "argument", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + }, + "parser": "minecraft:operation" + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "children": { + "score": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "reset": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "children": { + "score": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + } + } + } + } + }, + "seed": { + "type": "literal", + "executable": true + }, + "setblock": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_state" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "setidletimeout": { + "type": "literal", + "children": { + "minutes": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "setworldspawn": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "angle": { + "type": "argument", + "executable": true, + "parser": "minecraft:angle" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true + }, + "spawnpoint": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "angle": { + "type": "argument", + "executable": true, + "parser": "minecraft:angle" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "spectate": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "player": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "single" + } + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + }, + "executable": true + }, + "spreadplayers": { + "type": "literal", + "children": { + "center": { + "type": "argument", + "children": { + "spreadDistance": { + "type": "argument", + "children": { + "maxRange": { + "type": "argument", + "children": { + "respectTeams": { + "type": "argument", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "parser": "brigadier:bool" + }, + "under": { + "type": "literal", + "children": { + "maxHeight": { + "type": "argument", + "children": { + "respectTeams": { + "type": "argument", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "parser": "brigadier:bool" + } + }, + "parser": "brigadier:integer" + } + } + } + }, + "parser": "brigadier:float", + "properties": { + "min": 1.0 + } + } + }, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "parser": "minecraft:vec2" + } + } + }, + "stop": { + "type": "literal", + "executable": true + }, + "stopsound": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "*": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "ambient": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "block": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "hostile": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "master": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "music": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "neutral": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "player": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "record": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "voice": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "weather": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity_summon" + } + } + }, + "tag": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "add": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "team": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "empty": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "executable": true, + "parser": "minecraft:team" + } + } + }, + "join": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "children": { + "members": { + "type": "argument", + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + }, + "executable": true, + "parser": "minecraft:team" + } + } + }, + "leave": { + "type": "literal", + "children": { + "members": { + "type": "argument", + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "list": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "executable": true, + "parser": "minecraft:team" + } + }, + "executable": true + }, + "modify": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "children": { + "collisionRule": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + }, + "pushOtherTeams": { + "type": "literal", + "executable": true + }, + "pushOwnTeam": { + "type": "literal", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:color" + } + } + }, + "deathMessageVisibility": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + } + } + }, + "displayName": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "friendlyFire": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + } + }, + "nametagVisibility": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + } + } + }, + "prefix": { + "type": "literal", + "children": { + "prefix": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "seeFriendlyInvisibles": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + } + }, + "suffix": { + "type": "literal", + "children": { + "suffix": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + } + }, + "parser": "minecraft:team" + } + } + }, + "remove": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "executable": true, + "parser": "minecraft:team" + } + } + } + } + }, + "teammsg": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + } + }, + "teleport": { + "type": "literal", + "children": { + "destination": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + }, + "location": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec3" + }, + "targets": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + }, + "location": { + "type": "argument", + "children": { + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "facingEntity": { + "type": "argument", + "children": { + "facingAnchor": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity_anchor" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "facingLocation": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec3" + } + } + }, + "rotation": { + "type": "argument", + "executable": true, + "parser": "minecraft:rotation" + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "tell": { + "type": "literal", + "redirect": ["msg"] + }, + "tellraw": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "time": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "minecraft:time" + } + } + }, + "query": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "daytime": { + "type": "literal", + "executable": true + }, + "gametime": { + "type": "literal", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "midnight": { + "type": "literal", + "executable": true + }, + "night": { + "type": "literal", + "executable": true + }, + "noon": { + "type": "literal", + "executable": true + }, + "time": { + "type": "argument", + "executable": true, + "parser": "minecraft:time" + } + } + } + } + }, + "title": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "actionbar": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "clear": { + "type": "literal", + "executable": true + }, + "reset": { + "type": "literal", + "executable": true + }, + "subtitle": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "times": { + "type": "literal", + "children": { + "fadeIn": { + "type": "argument", + "children": { + "stay": { + "type": "argument", + "children": { + "fadeOut": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "title": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "tm": { + "type": "literal", + "redirect": ["teammsg"] + }, + "tp": { + "type": "literal", + "redirect": ["teleport"] + }, + "trigger": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "children": { + "add": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + } + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + } + } + }, + "executable": true, + "parser": "minecraft:objective" + } + } + }, + "w": { + "type": "literal", + "redirect": ["msg"] + }, + "weather": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 1000000, + "min": 0 + } + } + }, + "executable": true + }, + "rain": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 1000000, + "min": 0 + } + } + }, + "executable": true + }, + "thunder": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 1000000, + "min": 0 + } + } + }, + "executable": true + } + } + }, + "whitelist": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "off": { + "type": "literal", + "executable": true + }, + "on": { + "type": "literal", + "executable": true + }, + "reload": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + } + } + }, + "worldborder": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:double", + "properties": { + "max": 59999968.0, + "min": -59999968.0 + } + } + } + }, + "center": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec2" + } + } + }, + "damage": { + "type": "literal", + "children": { + "amount": { + "type": "literal", + "children": { + "damagePerBlock": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + } + }, + "buffer": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + } + } + } + }, + "get": { + "type": "literal", + "executable": true + }, + "set": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:double", + "properties": { + "max": 59999968.0, + "min": -59999968.0 + } + } + } + }, + "warning": { + "type": "literal", + "children": { + "distance": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "time": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + } + } + } + } + }, + "xp": { + "type": "literal", + "redirect": ["experience"] + } + } +} diff --git a/packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md new file mode 100644 index 000000000..2dbf79f33 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +locate structure demo:thingy +``` From 8f2ffc678260b6e77550c04902afeb7705fde610 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 22 May 2022 23:17:05 +0200 Subject: [PATCH 0846/1554] chore: update dependencies --- packages/mecha/poetry.lock | 14 +++++++------- packages/mecha/pyproject.toml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 281f2c57a..9ebb89b70 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.64.0" +version = "0.66.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -544,7 +544,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.28.0" +version = "7.28.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "717d35c2026f21a7fd5b06d3dc3300e30609a87a0f6a7317368a5a9392d95970" +content-hash = "41c1b180d17b1f67f001298e40ebc56d7c01d7b30e612cd6cd6618691d3cffd6" [metadata.files] atomicwrites = [ @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.64.0-py3-none-any.whl", hash = "sha256:faf29bdb85ceedca749d7b00f2bdf8a08822e34a466f144e5e5a0ea0244ccea9"}, - {file = "beet-0.64.0.tar.gz", hash = "sha256:a8bbff0dcc0b622aa0b5fc5d28dcfb7cb9ab5d9c867a2d44df6f1e5181540cde"}, + {file = "beet-0.66.0-py3-none-any.whl", hash = "sha256:1fe14b20b46901ef9dc16d59bee86dc7b5d93d16777e7f84b422cff1faa26b1a"}, + {file = "beet-0.66.0.tar.gz", hash = "sha256:f8d9690a91b1382d87a4435531221322a1f1aab5e6f2376f61b70fe84fa5de12"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1172,8 +1172,8 @@ python-gitlab = [ {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.28.0.tar.gz", hash = "sha256:3f80f6a66d195ddd2e5a43c18d42174ee038d4dd77f959c00ab1df9bb9ccf654"}, - {file = "python_semantic_release-7.28.0-py3-none-any.whl", hash = "sha256:446fdf4143648b7ef6d791233dcce01b1e46c6aa9fc9fd4b48f8ef5b49580a30"}, + {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, + {file = "python_semantic_release-7.28.1-py3-none-any.whl", hash = "sha256:319c3e811d6e10bc3f0e967419eae0e5e9ba1e6745aa2fd94dd24e3995541ca2"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 6317dc474..f79163d5d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,14 +23,14 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.60.0" +beet = ">=0.66.0" tokenstream = "1.4.1" [tool.poetry.dev-dependencies] black = "^22.3.0" pytest = "^7.1.2" isort = "^5.10.1" -python-semantic-release = "^7.28.0" +python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" lectern = ">=0.20.1" From 3ffd8c520f76c5a46f8c7473e194a0b134c61940 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 22 May 2022 23:18:57 +0200 Subject: [PATCH 0847/1554] chore: update pyright --- packages/mecha/mecha/ast.py | 2 -- packages/mecha/mecha/contrib/nested_yaml.py | 2 -- packages/mecha/mecha/parse.py | 8 ++++---- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- packages/mecha/typings/nbtlib.py | 20 ++++++++++++++++++++ 6 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 packages/mecha/typings/nbtlib.py diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 025c23159..095808443 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -96,8 +96,6 @@ from uuid import UUID from beet.core.utils import extra_field, required_field - -# pyright: reportMissingTypeStubs=false from nbtlib import Byte, ByteArray, Compound, CompoundMatch, Double, Int, IntArray from nbtlib import List as ListTag from nbtlib import ListIndex, LongArray, NamedKey, Numeric, Path, String diff --git a/packages/mecha/mecha/contrib/nested_yaml.py b/packages/mecha/mecha/contrib/nested_yaml.py index 29f100d44..3bbd1a695 100644 --- a/packages/mecha/mecha/contrib/nested_yaml.py +++ b/packages/mecha/mecha/contrib/nested_yaml.py @@ -20,8 +20,6 @@ from typing import Any, Callable, Generic, Iterator, List, TypeVar from beet import Context - -# pyright: reportMissingTypeStubs=false from nbtlib import String from tokenstream import SourceLocation, TokenStream, set_location diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e24f30ab3..642140b0f 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -80,7 +80,6 @@ ) from uuid import UUID -# pyright: reportMissingTypeStubs=false from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location @@ -156,6 +155,7 @@ AstWildcard, AstWord, ) +from .config import CommandTree from .error import MechaError from .spec import CommandSpec, Parser from .utils import ( @@ -552,7 +552,7 @@ def parse_root(stream: TokenStream) -> AstRoot: start = stream.peek() if not start: - node = AstRoot(commands=AstChildren()) + node = AstRoot(commands=AstChildren[AstCommand]()) return set_location(node, SourceLocation(0, 1, 1)) commands: List[AstCommand] = [] @@ -602,7 +602,7 @@ def parse_command(stream: TokenStream) -> AstCommand: commit() if commit.rollback: - choices = list((tree.children or {}).items()) + choices: List[Tuple[str, CommandTree]] = list((tree.children or {}).items()) choices.sort(key=lambda p: p[1].type != "argument") if tree.executable: @@ -1225,7 +1225,7 @@ def __call__(self, stream: TokenStream) -> AstBlock: if block_states := self.block_states_parser(stream): end_location = stream.current.end_location else: - block_states = AstChildren() + block_states = AstChildren[AstBlockState]() data_tags = delegate("adjacent_nbt_compound", stream) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 7f17aac30..2c1cd7e17 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.236" + "pyright": "^1.1.248" } }, "node_modules/pyright": { - "version": "1.1.236", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.236.tgz", - "integrity": "sha512-LreWbVIFN3VGntqYFqfbyaVi9+czQSkDT9Ug4mTFeJKWF7kG3c9iSGo4hWes6jwqD/a+f/AYkXFLrKFfCYNlMw==", + "version": "1.1.248", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", + "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.236", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.236.tgz", - "integrity": "sha512-LreWbVIFN3VGntqYFqfbyaVi9+czQSkDT9Ug4mTFeJKWF7kG3c9iSGo4hWes6jwqD/a+f/AYkXFLrKFfCYNlMw==", + "version": "1.1.248", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", + "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index bb601c0cb..6ef5ea31b 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.236" + "pyright": "^1.1.248" } } diff --git a/packages/mecha/typings/nbtlib.py b/packages/mecha/typings/nbtlib.py new file mode 100644 index 000000000..95cf737d6 --- /dev/null +++ b/packages/mecha/typings/nbtlib.py @@ -0,0 +1,20 @@ +from typing import Any + +Byte = Any +ByteArray = Any +Compound = Any +CompoundMatch = Any +Double = Any +Float = Any +Int = Any +IntArray = Any +ListIndex = Any +Long = Any +LongArray = Any +NamedKey = Any +Numeric = Any +OutOfRange = Any +Path = Any +Short = Any +String = Any +List = Any From 8ea245ebd94c9fa0fb4f876075e4bb1c343d96e3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 22 May 2022 21:35:11 +0000 Subject: [PATCH 0848/1554] 0.51.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 1a177f0a9..ea2accdff 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.51.0 (2022-05-22) +### Feature +* 1.19 command tree ([`1ef4324`](https://github.com/mcbeet/mecha/commit/1ef4324a542ff11464d21880bcc0dd977311d148)) + ## v0.50.2 (2022-05-17) ### Fix * Allow resource redefinition if content matches ([`0e15796`](https://github.com/mcbeet/mecha/commit/0e157966e5c972811ef33e95c68ff779cd03825e)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index dc26bc49f..4a84a02a9 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.50.2" +__version__ = "0.51.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f79163d5d..a61a4babf 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.50.2" +version = "0.51.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b9f02ba083c1049a9f831719c4afc1c27b54dd8f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 27 May 2022 04:04:38 +0200 Subject: [PATCH 0849/1554] fix: handle uppercase python imports --- packages/bolt/bolt/parse.py | 18 +++++++++++-- .../tests/resources/bolt_examples.mcfunction | 4 +++ .../tests/snapshots/bolt__parse_208__0.txt | 26 +++++++++++++++++++ .../tests/snapshots/bolt__parse_208__1.txt | 17 ++++++++++++ .../tests/snapshots/bolt__parse_209__0.txt | 26 +++++++++++++++++++ .../tests/snapshots/bolt__parse_209__1.txt | 17 ++++++++++++ 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_208__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_208__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_209__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_209__1.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 6a3f9d575..9397b09c6 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -22,6 +22,7 @@ "parse_identifier", "ImportLocationConstraint", "ImportStatementHandler", + "parse_python_import", "parse_import_name", "GlobalNonlocalHandler", "parse_name_list", @@ -105,11 +106,12 @@ FALSE_PATTERN: str = r"\b[fF]alse\b" NULL_PATTERN: str = r"\b(?:null|None)\b" IDENTIFIER_PATTERN: str = rf"(?!_mecha_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" +MODULE_PATTERN: str = rf"{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*" STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" -IMPORT_REGEX = re.compile(rf"^{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*$") +IMPORT_REGEX = re.compile(rf"^{MODULE_PATTERN}$") def get_bolt_parsers( @@ -173,7 +175,12 @@ def get_bolt_parsers( "bolt:del_target": parse_del_target, "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), "bolt:identifier": parse_identifier, - "bolt:import": ImportLocationConstraint(parsers["resource_location_or_tag"]), + "bolt:import": AlternativeParser( + [ + ImportLocationConstraint(parsers["resource_location_or_tag"]), + parse_python_import, + ] + ), "bolt:import_name": parse_import_name, "bolt:global_name": parse_name_list, "bolt:nonlocal_name": parse_name_list, @@ -918,6 +925,13 @@ def __call__(self, stream: TokenStream) -> Any: return node +def parse_python_import(stream: TokenStream) -> Any: + """Parse python import.""" + with stream.syntax(module=rf"{MODULE_PATTERN}(?=\s)"): + token = stream.expect("module") + return set_location(AstResourceLocation(path=token.value), token) + + def parse_import_name(stream: TokenStream) -> AstImportedIdentifier: """Parse import name.""" with stream.syntax(name=IDENTIFIER_PATTERN, comma=r","): diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 8230faeee..f43f0a867 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -772,3 +772,7 @@ give @s stone{CanPlaceOn: [*stone_can_place_on], **custom_model_data} ### red = {"color": "red"} tellraw @p ["", {"text": "hey", **red}, *red.color] +### +from PIL import Image +### +from PIL.Image import Image diff --git a/packages/bolt/tests/snapshots/bolt__parse_208__0.txt b/packages/bolt/tests/snapshots/bolt__parse_208__0.txt new file mode 100644 index 000000000..6ead39115 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_208__0.txt @@ -0,0 +1,26 @@ +from PIL import Image +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + is_tag: False + namespace: None + path: 'PIL' + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'Image' diff --git a/packages/bolt/tests/snapshots/bolt__parse_208__1.txt b/packages/bolt/tests/snapshots/bolt__parse_208__1.txt new file mode 100644 index 000000000..159f9b0d4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_208__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + Image = _mecha_helper_get_attribute(_mecha_helper_import_module('PIL'), 'Image') +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_209__0.txt b/packages/bolt/tests/snapshots/bolt__parse_209__0.txt new file mode 100644 index 000000000..cfc970f42 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_209__0.txt @@ -0,0 +1,26 @@ +from PIL.Image import Image +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + identifier: 'from:module:import:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + is_tag: False + namespace: None + path: 'PIL.Image' + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + identifier: 'from:module:import:name' + arguments: + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'Image' diff --git a/packages/bolt/tests/snapshots/bolt__parse_209__1.txt b/packages/bolt/tests/snapshots/bolt__parse_209__1.txt new file mode 100644 index 000000000..bafc25c14 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_209__1.txt @@ -0,0 +1,17 @@ +_mecha_lineno = [1], [1] +_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] +_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var0: + Image = _mecha_helper_get_attribute(_mecha_helper_import_module('PIL.Image'), 'Image') +_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +--- +output = _mecha_var1 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=1) + commands: + From c3d3be448bc0da345f4261564e42c5d662b836c6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 27 May 2022 02:05:16 +0000 Subject: [PATCH 0850/1554] 0.5.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 2867fe451..65f2d9175 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.5.1 (2022-05-27) +### Fix +* Handle uppercase python imports ([`a5e50e0`](https://github.com/mcbeet/bolt/commit/a5e50e0173b47310db43b6915d31b707b7218c3a)) + ## v0.5.0 (2022-05-06) ### Feature * Iterable/mapping unpacking in json/nbt interpolation ([`32acee0`](https://github.com/mcbeet/bolt/commit/32acee0e8bbf2c831fa48c30595b63ed61f1de40)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 43444a622..597011cdd 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.0" +__version__ = "0.5.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 48786dee7..8f0e0ab0a 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.5.0" +version = "0.5.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From bb72b910a5bcbd590ac06cdc3604218a195a2170 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 May 2022 12:20:20 +0000 Subject: [PATCH 0851/1554] chore(deps-dev): bump pyright from 1.1.248 to 1.1.249 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.248 to 1.1.249. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.249/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 2c1cd7e17..fb4d641c3 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.248" + "pyright": "^1.1.249" } }, "node_modules/pyright": { - "version": "1.1.248", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", - "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", + "version": "1.1.249", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.249.tgz", + "integrity": "sha512-/pLue74RMbc6j+XkbDNIWmQ4EHw0kar3Juw6fN5+AjtJeY7a5cpSi2q023OZymqoTAaYzPxP5v+p87/sqFjTqg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.248", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", - "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", + "version": "1.1.249", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.249.tgz", + "integrity": "sha512-/pLue74RMbc6j+XkbDNIWmQ4EHw0kar3Juw6fN5+AjtJeY7a5cpSi2q023OZymqoTAaYzPxP5v+p87/sqFjTqg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 6ef5ea31b..fcf0dcef5 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.248" + "pyright": "^1.1.249" } } From dbd963467a36c708a960e27bed2e66d7e0cb9cbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 May 2022 12:24:58 +0000 Subject: [PATCH 0852/1554] chore(deps-dev): bump python-semantic-release from 7.28.1 to 7.29.0 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.28.1 to 7.29.0. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.28.1...v7.29.0) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 9ebb89b70..ebd6707b0 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -544,7 +544,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.28.1" +version = "7.29.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -564,7 +564,7 @@ twine = ">=3,<4" [package.extras] dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)"] +docs = ["Sphinx (==1.3.6)", "Jinja2 (==3.0.3)"] mypy = ["mypy", "types-requests"] test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "41c1b180d17b1f67f001298e40ebc56d7c01d7b30e612cd6cd6618691d3cffd6" +content-hash = "c4ace5e59f78d5cf9d2d05e594c5d17f71e5089dab92d2119c4af90a22b7d4b7" [metadata.files] atomicwrites = [ @@ -1172,8 +1172,8 @@ python-gitlab = [ {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, - {file = "python_semantic_release-7.28.1-py3-none-any.whl", hash = "sha256:319c3e811d6e10bc3f0e967419eae0e5e9ba1e6745aa2fd94dd24e3995541ca2"}, + {file = "python-semantic-release-7.29.0.tar.gz", hash = "sha256:63bc4f92e23442b87df87ca98a8b585efaa15bd4bd7a2caf028452cc01acda8f"}, + {file = "python_semantic_release-7.29.0-py3-none-any.whl", hash = "sha256:c8f45390caaa1c32886bd0af498bdbf4c5d6c8b8c947d67fce821f1689c132b1"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a61a4babf..177ec2487 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -30,7 +30,7 @@ tokenstream = "1.4.1" black = "^22.3.0" pytest = "^7.1.2" isort = "^5.10.1" -python-semantic-release = "^7.28.1" +python-semantic-release = "^7.29.0" pytest-insta = "^0.1.11" lectern = ">=0.20.1" From b0a1ff2da26f20bba2822669af9253dc0785e495 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 27 May 2022 23:42:22 +0200 Subject: [PATCH 0853/1554] chore: update beet --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index ebd6707b0..02e65e974 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.66.0" +version = "0.67.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "c4ace5e59f78d5cf9d2d05e594c5d17f71e5089dab92d2119c4af90a22b7d4b7" +content-hash = "3e91c43f8d20e0d9b163deea7819f3574a136aa8e36e39b74b17ac2405cf459f" [metadata.files] atomicwrites = [ @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.66.0-py3-none-any.whl", hash = "sha256:1fe14b20b46901ef9dc16d59bee86dc7b5d93d16777e7f84b422cff1faa26b1a"}, - {file = "beet-0.66.0.tar.gz", hash = "sha256:f8d9690a91b1382d87a4435531221322a1f1aab5e6f2376f61b70fe84fa5de12"}, + {file = "beet-0.67.0-py3-none-any.whl", hash = "sha256:4e44e7278be50ebd8dec697e411ccdc377a24308e21cdb197f071dfbe1e1cde7"}, + {file = "beet-0.67.0.tar.gz", hash = "sha256:f6796b7a8e8241aabbbf5b7e15403e87645055b4ec952bb9cfc0a5c0ba52d48d"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 177ec2487..43842ea84 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.66.0" +beet = ">=0.67.0" tokenstream = "1.4.1" [tool.poetry.dev-dependencies] From eb51a3a79f3ac2cf26963a525e462837a95e0279 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 27 May 2022 23:51:15 +0200 Subject: [PATCH 0854/1554] feat: dump exclude --- packages/mecha/mecha/ast.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 095808443..d82d818ab 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -161,23 +161,29 @@ def walk(self) -> Iterator["AstNode"]: elif isinstance(attribute, AstNode): yield from attribute.walk() - def dump(self, prefix: str = "", shallow: bool = False) -> str: + def dump( + self, + prefix: str = "", + shallow: bool = False, + exclude: Optional[Set[str]] = None, + ) -> str: """Return a pretty-printed representation of the ast.""" return f"{prefix}{self.__class__}\n" + "\n".join( f"{prefix} {f.name}:" + ( - "\n" + ("\n".join((f"{prefix} {type(child)}" if shallow else child.dump(prefix + " ")) for child in attribute) if attribute else prefix + " ") # type: ignore + "\n" + ("\n".join((f"{prefix} {type(child)}" if shallow else child.dump(prefix + " ", shallow, exclude)) for child in attribute) if attribute else prefix + " ") # type: ignore if isinstance(attribute := getattr(self, f.name), AstChildren) else "\n" + ( f"{prefix} {type(attribute)}" if shallow - else attribute.dump(prefix + " ") + else attribute.dump(prefix + " ", shallow, exclude) ) if isinstance(attribute, AstNode) else f" {attribute!r}" ) for f in fields(self) + if not exclude or f.name not in exclude ) def emit_error(self, exc: T) -> T: From 39da47d74de5bad07eb972e8d1ad2441faee7712 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:13:48 +0200 Subject: [PATCH 0855/1554] feat: add mecha.contrib.debug_ast --- .../examples/basic_debug/beet-location.yml | 10 ++++ packages/mecha/examples/basic_debug/beet.yml | 7 +++ .../src/data/demo/functions/foo.mcfunction | 1 + packages/mecha/mecha/contrib/debug_ast.py | 44 ++++++++++++++++ .../examples__build_basic_debug__0.pack.md | 52 +++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 packages/mecha/examples/basic_debug/beet-location.yml create mode 100644 packages/mecha/examples/basic_debug/beet.yml create mode 100644 packages/mecha/examples/basic_debug/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/debug_ast.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md diff --git a/packages/mecha/examples/basic_debug/beet-location.yml b/packages/mecha/examples/basic_debug/beet-location.yml new file mode 100644 index 000000000..c54c515d4 --- /dev/null +++ b/packages/mecha/examples/basic_debug/beet-location.yml @@ -0,0 +1,10 @@ +require: + - mecha.contrib.debug_ast +data_pack: + load: + data/demo/functions/bar.mcfunction: "src/data/demo/functions/foo.mcfunction" +pipeline: + - mecha +meta: + debug_ast: + location: true diff --git a/packages/mecha/examples/basic_debug/beet.yml b/packages/mecha/examples/basic_debug/beet.yml new file mode 100644 index 000000000..92dac62b5 --- /dev/null +++ b/packages/mecha/examples/basic_debug/beet.yml @@ -0,0 +1,7 @@ +require: + - mecha.contrib.debug_ast +data_pack: + load: "src" +pipeline: + - mecha + - extend: "beet-location.yml" diff --git a/packages/mecha/examples/basic_debug/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_debug/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..516a5d0c0 --- /dev/null +++ b/packages/mecha/examples/basic_debug/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say hello diff --git a/packages/mecha/mecha/contrib/debug_ast.py b/packages/mecha/mecha/contrib/debug_ast.py new file mode 100644 index 000000000..4ec221bd2 --- /dev/null +++ b/packages/mecha/mecha/contrib/debug_ast.py @@ -0,0 +1,44 @@ +"""Plugin for emitting ast.""" + + +__all__ = [ + "DebugAstOptions", + "debug_ast", +] + + +from dataclasses import dataclass + +from beet import Context, configurable +from beet.core.utils import required_field +from pydantic import BaseModel + +from mecha import AstRoot, CompilationDatabase, Mecha, Visitor, rule + + +class DebugAstOptions(BaseModel): + location: bool = False + + +def beet_default(ctx: Context): + ctx.require(debug_ast) + + +@configurable(validator=DebugAstOptions) +def debug_ast(ctx: Context, opts: DebugAstOptions): + mc = ctx.inject(Mecha) + mc.steps.insert(0, DebugAstEmitter(location=opts.location, database=mc.database)) + + +@dataclass +class DebugAstEmitter(Visitor): + """Visitor that interrupts the compilation process and dumps the current ast.""" + + location: bool = False + database: CompilationDatabase = required_field() + + @rule(AstRoot) + def debug_ast(self, node: AstRoot): + exclude = None if self.location else {"location", "end_location"} + self.database.current.text = node.dump(exclude=exclude) + "\n" + return None diff --git a/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md new file mode 100644 index 000000000..6fef6ccf3 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md @@ -0,0 +1,52 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction + + commands: + + identifier: 'say:message' + arguments: + + fragments: + + value: 'hello' +``` + +`@function demo:bar` + +```mcfunction + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'hello' +``` From 54bdba26ab10d84b46c4db81e058d2aef46cc5f3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:18:45 +0200 Subject: [PATCH 0856/1554] chore: revert python-semantic-release --- packages/mecha/poetry.lock | 10 +++++----- packages/mecha/pyproject.toml | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 02e65e974..fd1d45a76 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -544,7 +544,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.29.0" +version = "7.28.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -564,7 +564,7 @@ twine = ">=3,<4" [package.extras] dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)", "Jinja2 (==3.0.3)"] +docs = ["Sphinx (==1.3.6)"] mypy = ["mypy", "types-requests"] test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "3e91c43f8d20e0d9b163deea7819f3574a136aa8e36e39b74b17ac2405cf459f" +content-hash = "82fc536c064be3dfb78cea9fb5236d58b13a13f911eb17e6af9ab3482680fd01" [metadata.files] atomicwrites = [ @@ -1172,8 +1172,8 @@ python-gitlab = [ {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.29.0.tar.gz", hash = "sha256:63bc4f92e23442b87df87ca98a8b585efaa15bd4bd7a2caf028452cc01acda8f"}, - {file = "python_semantic_release-7.29.0-py3-none-any.whl", hash = "sha256:c8f45390caaa1c32886bd0af498bdbf4c5d6c8b8c947d67fce821f1689c132b1"}, + {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, + {file = "python_semantic_release-7.28.1-py3-none-any.whl", hash = "sha256:319c3e811d6e10bc3f0e967419eae0e5e9ba1e6745aa2fd94dd24e3995541ca2"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 43842ea84..d354591d7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -30,7 +30,7 @@ tokenstream = "1.4.1" black = "^22.3.0" pytest = "^7.1.2" isort = "^5.10.1" -python-semantic-release = "^7.29.0" +python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" lectern = ">=0.20.1" @@ -76,4 +76,4 @@ build_command = "poetry build" [build-system] requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +build-backend = "poetry.core.masonry.api" \ No newline at end of file From 5578cd26f43989db073b8a15c1bd222e325a9e87 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 27 May 2022 22:19:51 +0000 Subject: [PATCH 0857/1554] 0.52.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index ea2accdff..815b9919c 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.52.0 (2022-05-27) +### Feature +* Add mecha.contrib.debug_ast ([`b61e8ab`](https://github.com/mcbeet/mecha/commit/b61e8aba97767c500c7feaf031a165ce8430dd73)) +* Dump exclude ([`56673e7`](https://github.com/mcbeet/mecha/commit/56673e755c7841a10e6f4807544fa88b859b41f6)) + ## v0.51.0 (2022-05-22) ### Feature * 1.19 command tree ([`1ef4324`](https://github.com/mcbeet/mecha/commit/1ef4324a542ff11464d21880bcc0dd977311d148)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 4a84a02a9..7aecf003a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.51.0" +__version__ = "0.52.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index d354591d7..67e517df7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.51.0" +version = "0.52.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From f4275ba906599c32aea1362a149cc8ce786e33f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 May 2022 04:27:11 +0000 Subject: [PATCH 0858/1554] build(deps-dev): bump pyright from 1.1.243 to 1.1.248 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.243 to 1.1.248. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.248/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 1a8290621..69724d573 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.243" + "pyright": "^1.1.248" } }, "node_modules/pyright": { - "version": "1.1.243", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.243.tgz", - "integrity": "sha512-0PUyHTSr+LyE9Ej0A7tB8tM4pzAr34o1c3rHtfaBdZ2265HPvPE/Kj92ljX2F00Q6uAeZyyLEmzPOTuKh2WC8Q==", + "version": "1.1.248", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", + "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.243", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.243.tgz", - "integrity": "sha512-0PUyHTSr+LyE9Ej0A7tB8tM4pzAr34o1c3rHtfaBdZ2265HPvPE/Kj92ljX2F00Q6uAeZyyLEmzPOTuKh2WC8Q==", + "version": "1.1.248", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", + "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index e90c44aed..6ef5ea31b 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.243" + "pyright": "^1.1.248" } } From c0efed624974fb5be16660bf0f59ca877795a83c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:22:04 +0200 Subject: [PATCH 0859/1554] chore: update beet and mecha --- packages/bolt/poetry.lock | 16 ++++++++-------- packages/bolt/pyproject.toml | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 7fa03b92e..d2e1ca5a8 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.64.0" +version = "0.67.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -364,14 +364,14 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.49.1" +version = "0.52.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.60.0" +beet = ">=0.67.0" tokenstream = "1.4.1" [[package]] @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "1bde70dbe9853029544a132a8084773042bcf5c032d503f4d1e7c9444c482d41" +content-hash = "b1bb9b0969b1d7a30d272c3d2cc4145cf30d7d06dcdfb0ca28a5c74638d06a8f" [metadata.files] atomicwrites = [ @@ -837,8 +837,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.64.0-py3-none-any.whl", hash = "sha256:faf29bdb85ceedca749d7b00f2bdf8a08822e34a466f144e5e5a0ea0244ccea9"}, - {file = "beet-0.64.0.tar.gz", hash = "sha256:a8bbff0dcc0b622aa0b5fc5d28dcfb7cb9ab5d9c867a2d44df6f1e5181540cde"}, + {file = "beet-0.67.0-py3-none-any.whl", hash = "sha256:4e44e7278be50ebd8dec697e411ccdc377a24308e21cdb197f071dfbe1e1cde7"}, + {file = "beet-0.67.0.tar.gz", hash = "sha256:f6796b7a8e8241aabbbf5b7e15403e87645055b4ec952bb9cfc0a5c0ba52d48d"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.49.1-py3-none-any.whl", hash = "sha256:5db5f229724c12e170bc39c1c1d33b96df26bdeec104ef3d14a6d032b1d3be8d"}, - {file = "mecha-0.49.1.tar.gz", hash = "sha256:6c3babe75aa3439fac4ebe0a0786fc29521de24a413467ba1e93f048dfeb5683"}, + {file = "mecha-0.52.0-py3-none-any.whl", hash = "sha256:4f90dcf6bda803b94c9364ffb88e59bc5bf874d2a7986ca1293507d0b38c5ef1"}, + {file = "mecha-0.52.0.tar.gz", hash = "sha256:f807cb16f6411d6b96a538944ef48b31e60c95ae2df3e3a3334af4a3f6825710"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 8f0e0ab0a..84a1f918c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.64.0" -mecha = ">=0.49.1" +beet = ">=0.67.0" +mecha = ">=0.52.0" [tool.poetry.dev-dependencies] pytest = "^7.1.2" From 58a82350dc915e934749ee12f044d8ca0dc707f5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:33:26 +0200 Subject: [PATCH 0860/1554] fix: forgot to export DebugAstEmitter --- packages/mecha/mecha/contrib/debug_ast.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mecha/mecha/contrib/debug_ast.py b/packages/mecha/mecha/contrib/debug_ast.py index 4ec221bd2..fcdb8019b 100644 --- a/packages/mecha/mecha/contrib/debug_ast.py +++ b/packages/mecha/mecha/contrib/debug_ast.py @@ -3,6 +3,7 @@ __all__ = [ "DebugAstOptions", + "DebugAstEmitter", "debug_ast", ] From 47d8c5c0cf22f252ca599c975b71ec1a8ce6f388 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 27 May 2022 22:34:06 +0000 Subject: [PATCH 0861/1554] 0.52.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 815b9919c..f2179ba65 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.52.1 (2022-05-27) +### Fix +* Forgot to export DebugAstEmitter ([`3c31e46`](https://github.com/mcbeet/mecha/commit/3c31e46fa37c9ba6598abfce2e26854d5245702a)) + ## v0.52.0 (2022-05-27) ### Feature * Add mecha.contrib.debug_ast ([`b61e8ab`](https://github.com/mcbeet/mecha/commit/b61e8aba97767c500c7feaf031a165ce8430dd73)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 7aecf003a..e5edffa47 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.52.0" +__version__ = "0.52.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 67e517df7..469dea4b3 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.52.0" +version = "0.52.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From aa018615c35e82ed00a76b7a9b89c5f6f4b7c147 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:39:08 +0200 Subject: [PATCH 0862/1554] fix: slice update to modify steps --- packages/mecha/mecha/contrib/debug_ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/contrib/debug_ast.py b/packages/mecha/mecha/contrib/debug_ast.py index fcdb8019b..6c9370101 100644 --- a/packages/mecha/mecha/contrib/debug_ast.py +++ b/packages/mecha/mecha/contrib/debug_ast.py @@ -28,7 +28,7 @@ def beet_default(ctx: Context): @configurable(validator=DebugAstOptions) def debug_ast(ctx: Context, opts: DebugAstOptions): mc = ctx.inject(Mecha) - mc.steps.insert(0, DebugAstEmitter(location=opts.location, database=mc.database)) + mc.steps[:] = [DebugAstEmitter(location=opts.location, database=mc.database)] @dataclass From d6052dca26912900687ed3a8de09142ea47fe0b1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 27 May 2022 22:39:54 +0000 Subject: [PATCH 0863/1554] 0.52.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f2179ba65..9655d0e55 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.52.2 (2022-05-27) +### Fix +* Slice update to modify steps ([`76fb08c`](https://github.com/mcbeet/mecha/commit/76fb08c21887ce1386dae0788428b8e96cd6362a)) + ## v0.52.1 (2022-05-27) ### Fix * Forgot to export DebugAstEmitter ([`3c31e46`](https://github.com/mcbeet/mecha/commit/3c31e46fa37c9ba6598abfce2e26854d5245702a)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e5edffa47..de7984569 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.52.1" +__version__ = "0.52.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 469dea4b3..d2f1ba493 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.52.1" +version = "0.52.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From fd653c1bb0dbbcff569e34e470086fd77c0fe580 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:45:19 +0200 Subject: [PATCH 0864/1554] feat: add bolt.contrib.debug_codegen --- packages/bolt/bolt/contrib/debug_codegen.py | 34 ++++++++++++++++++ packages/bolt/examples/bolt_debug/beet.yml | 6 ++++ .../src/data/demo/functions/bar.mcfunction | 1 + .../src/data/demo/functions/foo.mcfunction | 4 +++ .../examples__build_bolt_debug__0.pack.md | 36 +++++++++++++++++++ 5 files changed, 81 insertions(+) create mode 100644 packages/bolt/bolt/contrib/debug_codegen.py create mode 100644 packages/bolt/examples/bolt_debug/beet.yml create mode 100644 packages/bolt/examples/bolt_debug/src/data/demo/functions/bar.mcfunction create mode 100644 packages/bolt/examples/bolt_debug/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md diff --git a/packages/bolt/bolt/contrib/debug_codegen.py b/packages/bolt/bolt/contrib/debug_codegen.py new file mode 100644 index 000000000..a693d16e2 --- /dev/null +++ b/packages/bolt/bolt/contrib/debug_codegen.py @@ -0,0 +1,34 @@ +"""Plugin for emitting generated code.""" + + +__all__ = [ + "DebugCodegenEmitter", +] + + +from dataclasses import dataclass + +from beet import Context +from beet.core.utils import required_field +from mecha import AstRoot, CompilationDatabase, Mecha, Visitor, rule + +from bolt import Runtime + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + runtime = ctx.inject(Runtime) + mc.steps[:] = [DebugCodegenEmitter(runtime=runtime, database=mc.database)] + + +@dataclass +class DebugCodegenEmitter(Visitor): + """Visitor that interrupts the compilation process and dumps the generated code.""" + + runtime: Runtime = required_field() + database: CompilationDatabase = required_field() + + @rule(AstRoot) + def debug_codegen(self, node: AstRoot): + self.database.current.text = self.runtime.codegen(node)[0] or "" + return None diff --git a/packages/bolt/examples/bolt_debug/beet.yml b/packages/bolt/examples/bolt_debug/beet.yml new file mode 100644 index 000000000..b17a0fd69 --- /dev/null +++ b/packages/bolt/examples/bolt_debug/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt.contrib.debug_codegen +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_debug/src/data/demo/functions/bar.mcfunction b/packages/bolt/examples/bolt_debug/src/data/demo/functions/bar.mcfunction new file mode 100644 index 000000000..e8e9320c0 --- /dev/null +++ b/packages/bolt/examples/bolt_debug/src/data/demo/functions/bar.mcfunction @@ -0,0 +1 @@ +say hello without anything fancy diff --git a/packages/bolt/examples/bolt_debug/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_debug/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..8ed547d67 --- /dev/null +++ b/packages/bolt/examples/bolt_debug/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,4 @@ +def say_hello(): + say hello + +say_hello() diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md new file mode 100644 index 000000000..477107ef1 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md @@ -0,0 +1,36 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 9, + "description": "" + } +} +``` + +### demo + +`@function(strip_final_newline) demo:bar` + +```mcfunction + +``` + +`@function demo:foo` + +```mcfunction +_mecha_lineno = [1, 7], [1, 4] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var1: + def say_hello(): + _mecha_runtime.commands.extend(_mecha_refs[0].commands) + _mecha_var0 = say_hello + _mecha_var0 = _mecha_var0() +_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +``` From 10221786d5772e69e076f50b2635794cef16a621 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 28 May 2022 00:46:55 +0200 Subject: [PATCH 0865/1554] chore: update mecha --- packages/bolt/poetry.lock | 8 ++++---- packages/bolt/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index d2e1ca5a8..ad52806ab 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.52.0" +version = "0.52.2" description = "A powerful Minecraft command library" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b1bb9b0969b1d7a30d272c3d2cc4145cf30d7d06dcdfb0ca28a5c74638d06a8f" +content-hash = "69eaec6dc676884c6bc8f84bb0e475a5e0614d572399c4b8689210420bff7ab8" [metadata.files] atomicwrites = [ @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.52.0-py3-none-any.whl", hash = "sha256:4f90dcf6bda803b94c9364ffb88e59bc5bf874d2a7986ca1293507d0b38c5ef1"}, - {file = "mecha-0.52.0.tar.gz", hash = "sha256:f807cb16f6411d6b96a538944ef48b31e60c95ae2df3e3a3334af4a3f6825710"}, + {file = "mecha-0.52.2-py3-none-any.whl", hash = "sha256:69a49ec9273699d340eb4d8e63395f885437753b3503bec0eba5312f7303c52b"}, + {file = "mecha-0.52.2.tar.gz", hash = "sha256:c16cb38435710d249ec9dd1b277e875c446d39b6b48a2e7cf4390e821449392e"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 84a1f918c..d1169aa96 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.67.0" -mecha = ">=0.52.0" +mecha = ">=0.52.2" [tool.poetry.dev-dependencies] pytest = "^7.1.2" From a4dbfa364283a9bd63265d24fe141a7a7de8c1e1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 27 May 2022 22:48:11 +0000 Subject: [PATCH 0866/1554] 0.6.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 65f2d9175..727b34495 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.6.0 (2022-05-27) +### Feature +* Add bolt.contrib.debug_codegen ([`d504b00`](https://github.com/mcbeet/bolt/commit/d504b00867bf22770708e6eeb6190ed790f0a483)) + ## v0.5.1 (2022-05-27) ### Fix * Handle uppercase python imports ([`a5e50e0`](https://github.com/mcbeet/bolt/commit/a5e50e0173b47310db43b6915d31b707b7218c3a)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 597011cdd..9ef727766 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.1" +__version__ = "0.6.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index d1169aa96..38a62d117 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.5.1" +version = "0.6.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From d32f3558e112df1851305a9244853c528cec0a36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Apr 2022 01:30:22 +0000 Subject: [PATCH 0867/1554] chore(deps): bump click from 8.1.2 to 8.1.3 Bumps [click](https://github.com/pallets/click) from 8.1.2 to 8.1.3. - [Release notes](https://github.com/pallets/click/releases) - [Changelog](https://github.com/pallets/click/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/click/compare/8.1.2...8.1.3) --- updated-dependencies: - dependency-name: click dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 7cb2296cb..4158017b5 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -109,7 +109,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -889,8 +889,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, ] click = [ - {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, - {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, From b616d2f3ab31bdfa3677a4866bb6e95ed1443542 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Apr 2022 01:50:07 +0000 Subject: [PATCH 0868/1554] chore(deps-dev): bump pytest from 7.1.1 to 7.1.2 Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.1 to 7.1.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.1...7.1.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 4158017b5..bc2c752c0 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -477,7 +477,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -784,7 +784,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b41f25dd7c9d80c2acafcfb61a6ef75b5e27f32dd6fccdba53efb831742c98a9" +content-hash = "0f588d1205350554c271ca06abadf4213be96628d8b673a61feb9622e80f435b" [metadata.files] atomicwrites = [ @@ -1165,8 +1165,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pytest-insta = [ {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 12b1f2ebe..9070dd301 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -31,7 +31,7 @@ click = "^8.1.2" [tool.poetry.dev-dependencies] black = "^22.3.0" -pytest = "^7.1.1" +pytest = "^7.1.2" isort = "^5.10.1" python-semantic-release = "^7.27.1" pytest-insta = "^0.1.11" From 14e402b3ba4d2493855fcf34ba86c098d4a6e54e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Jun 2022 01:12:48 +0200 Subject: [PATCH 0869/1554] chore: update dependencies --- packages/lectern/poetry.lock | 24 ++++++++++++------------ packages/lectern/pyproject.toml | 7 +++---- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index bc2c752c0..3bce3ce2b 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -10,7 +10,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "attrs" version = "21.2.0" description = "Classes Without Boilerplate" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.63.0" +version = "0.67.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -312,23 +312,23 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "markdown-it-py" -version = "2.0.1" +version = "2.1.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "main" optional = false -python-versions = "~=3.6" +python-versions = ">=3.7" [package.dependencies] -attrs = ">=19,<22" mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] -rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -784,7 +784,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0f588d1205350554c271ca06abadf4213be96628d8b673a61feb9622e80f435b" +content-hash = "6f9836914f61fbde4fd7512b651c7ab88442a8b9d0064972cf6a600726c5271e" [metadata.files] atomicwrites = [ @@ -796,8 +796,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] beet = [ - {file = "beet-0.63.0-py3-none-any.whl", hash = "sha256:7fce5a7137789d38e8507e9cab671bfec4b11e19153fb8b45af7f485d803f094"}, - {file = "beet-0.63.0.tar.gz", hash = "sha256:5250c0716cc652165fb68beaf197e252acc0ecf957766f079948de735c5d0ecc"}, + {file = "beet-0.67.0-py3-none-any.whl", hash = "sha256:4e44e7278be50ebd8dec697e411ccdc377a24308e21cdb197f071dfbe1e1cde7"}, + {file = "beet-0.67.0.tar.gz", hash = "sha256:f6796b7a8e8241aabbbf5b7e15403e87645055b4ec952bb9cfc0a5c0ba52d48d"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -975,8 +975,8 @@ keyring = [ {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, ] markdown-it-py = [ - {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, - {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9070dd301..878ff7a10 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,9 +25,9 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.60.0" -markdown-it-py = ">=1.1" -click = "^8.1.2" +beet = ">=0.67.0" +markdown-it-py = "^2.1.0" +click = "^8.1.3" [tool.poetry.dev-dependencies] black = "^22.3.0" @@ -35,7 +35,6 @@ pytest = "^7.1.2" isort = "^5.10.1" python-semantic-release = "^7.27.1" pytest-insta = "^0.1.11" -beet = ">=0.63.0" [tool.poetry.scripts] lectern = "lectern.cli:main" From 07fd990f4c5f57c7c3c7afd26d1a4c86631b641b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Jun 2022 01:14:52 +0200 Subject: [PATCH 0870/1554] chore: update pyright --- packages/lectern/lectern/cli.py | 2 +- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/lectern/lectern/cli.py b/packages/lectern/lectern/cli.py index e9e9c7ffa..9ba004adc 100644 --- a/packages/lectern/lectern/cli.py +++ b/packages/lectern/lectern/cli.py @@ -63,7 +63,7 @@ @error_handler(should_exit=True) def lectern( ctx: click.Context, - path: Tuple[str], + path: Tuple[str, ...], data_pack: Optional[str], resource_pack: Optional[str], external_files: Optional[str], diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 71a9ced3b..30bbfd0b7 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.235" + "pyright": "^1.1.250" } }, "node_modules/pyright": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.235.tgz", - "integrity": "sha512-eW40mxHo8WE7WHoBzFfyrH0lQ9nP5rTM5XKvkBgaYjhVafh4MmQeaEm8LmYGN2vUq2//YFLVprvA+U6u+v9i3g==", + "version": "1.1.250", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.250.tgz", + "integrity": "sha512-LZl5ZzE5P4YkobJTpUvDmxreNFhFUgyYnKwDdSEneP4ZtKI4rIi5AvQ9lEsr/uXdzO/w+P+XRWbmderC0Cc/Pw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.235.tgz", - "integrity": "sha512-eW40mxHo8WE7WHoBzFfyrH0lQ9nP5rTM5XKvkBgaYjhVafh4MmQeaEm8LmYGN2vUq2//YFLVprvA+U6u+v9i3g==", + "version": "1.1.250", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.250.tgz", + "integrity": "sha512-LZl5ZzE5P4YkobJTpUvDmxreNFhFUgyYnKwDdSEneP4ZtKI4rIi5AvQ9lEsr/uXdzO/w+P+XRWbmderC0Cc/Pw==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index c4567b95a..cc597f4fb 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.235" + "pyright": "^1.1.250" } } From 5a7d8fc66384c3964563107b079d81b6bd523b33 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Jun 2022 22:12:46 +0200 Subject: [PATCH 0871/1554] feat: support decorators --- packages/bolt/bolt/ast.py | 9 ++ packages/bolt/bolt/codegen.py | 12 +++ packages/bolt/bolt/parse.py | 98 +++++++++++++++---- .../src/data/demo/functions/foo.mcfunction | 18 +++- .../tests/resources/bolt_examples.mcfunction | 8 ++ .../tests/snapshots/bolt__parse_101__0.txt | 2 + .../tests/snapshots/bolt__parse_118__0.txt | 2 + .../tests/snapshots/bolt__parse_120__0.txt | 2 + .../tests/snapshots/bolt__parse_129__0.txt | 2 + .../tests/snapshots/bolt__parse_150__0.txt | 2 + .../tests/snapshots/bolt__parse_151__0.txt | 2 + .../tests/snapshots/bolt__parse_152__0.txt | 2 + .../tests/snapshots/bolt__parse_153__0.txt | 2 + .../tests/snapshots/bolt__parse_160__0.txt | 2 + .../tests/snapshots/bolt__parse_192__0.txt | 2 + .../tests/snapshots/bolt__parse_193__0.txt | 4 + .../tests/snapshots/bolt__parse_194__0.txt | 4 + .../tests/snapshots/bolt__parse_196__0.txt | 2 + .../tests/snapshots/bolt__parse_197__0.txt | 2 + .../tests/snapshots/bolt__parse_210__0.txt | 81 +++++++++++++++ .../tests/snapshots/bolt__parse_210__1.txt | 25 +++++ .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_70__0.txt | 2 + .../tests/snapshots/bolt__parse_71__0.txt | 4 + .../tests/snapshots/bolt__parse_72__0.txt | 2 + .../tests/snapshots/bolt__parse_77__0.txt | 2 + .../tests/snapshots/bolt__parse_81__0.txt | 4 + .../tests/snapshots/bolt__parse_82__0.txt | 4 + .../tests/snapshots/bolt__parse_84__0.txt | 2 + .../tests/snapshots/bolt__parse_87__0.txt | 4 + .../tests/snapshots/bolt__parse_89__0.txt | 2 + .../tests/snapshots/bolt__parse_97__0.txt | 2 + .../examples__build_bolt_basic__0.pack.md | 7 ++ 33 files changed, 300 insertions(+), 20 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_210__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_210__1.txt diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index f3326cc74..529c0950c 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -22,6 +22,7 @@ "AstTargetAttribute", "AstTargetItem", "AstAssignment", + "AstDecorator", "AstFunctionSignature", "AstFunctionSignatureArgument", "AstFunctionRoot", @@ -212,6 +213,13 @@ class AstAssignment(AstNode): value: AstExpression = required_field() +@dataclass(frozen=True) +class AstDecorator(AstNode): + """Ast decorator node.""" + + expression: AstExpression = required_field() + + @dataclass(frozen=True) class AstFunctionSignatureArgument(AstNode): """Ast function signature argument node.""" @@ -224,6 +232,7 @@ class AstFunctionSignatureArgument(AstNode): class AstFunctionSignature(AstNode): """Ast function signature node.""" + decorators: AstChildren[AstDecorator] = AstChildren() name: str = required_field() arguments: AstChildren[AstFunctionSignatureArgument] = required_field() diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index e1fa50e54..18eb0744f 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -435,6 +435,12 @@ def function( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: signature = cast(AstFunctionSignature, node.arguments[0]) + + decorators: List[str] = [] + for decorator in signature.decorators: + value = yield from visit_single(decorator.expression, required=True) + decorators.append(value) + arguments: List[str] = [ f"{arg.name}={acc.missing()}" if arg.default else arg.name for arg in signature.arguments @@ -452,6 +458,12 @@ def function( yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + for decorator, value in list(zip(signature.decorators, decorators))[::-1]: + acc.statement( + f"{signature.name} = {value}({signature.name})", + lineno=decorator, + ) + return [] @rule(AstCommand, identifier="return") diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 9397b09c6..ecdb8fd2e 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -12,6 +12,7 @@ "check_final_expression", "InterpolationParser", "parse_statement", + "parse_decorator", "AssignmentTargetParser", "IfElseLoweringParser", "BreakContinueConstraint", @@ -74,6 +75,7 @@ AstAssignment, AstAttribute, AstCall, + AstDecorator, AstDict, AstDictItem, AstExpression, @@ -165,6 +167,7 @@ def get_bolt_parsers( mask=True, ), "bolt:statement": parse_statement, + "bolt:decorator": parse_decorator, "bolt:assignment_target": AssignmentTargetParser( allow_undefined_identifiers=True, allow_multiple=True, @@ -403,25 +406,27 @@ def __str__(self) -> str: def create_bolt_root_parser(parser: Parser): """Return parser for the root node for bolt.""" - return FunctionRootBacktracker( - FlushPendingIdentifiersParser( - FunctionConstraint( - BreakContinueConstraint( - parser=IfElseLoweringParser(parser), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), + return DecoratorResolver( + FunctionRootBacktracker( + FlushPendingIdentifiersParser( + FunctionConstraint( + BreakContinueConstraint( + parser=IfElseLoweringParser(parser), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ), + command_identifiers={ + "return", + "return:value", + "yield", + "yield:value", + "yield:from:value", + "global:subcommand", + "nonlocal:subcommand", }, - ), - command_identifiers={ - "return", - "return:value", - "yield", - "yield:value", - "yield:from:value", - "global:subcommand", - "nonlocal:subcommand", - }, + ) ) ) ) @@ -544,6 +549,7 @@ def parse_statement(stream: TokenStream) -> Any: "bolt:augmented_assignment_target", "bolt:assignment_target", "bolt:expression", + "bolt:decorator", ): with alternative: pending_identifiers.clear() @@ -608,6 +614,62 @@ def parse_statement(stream: TokenStream) -> Any: return node +def parse_decorator(stream: TokenStream) -> Any: + """Parse decorator.""" + with stream.syntax(decorator="@"): + token = stream.expect("decorator") + expression = delegate("bolt:expression", stream) + return set_location(AstDecorator(expression=expression), token, expression) + + +@dataclass +class DecoratorResolver: + """Parser for resolving decorators.""" + + parser: Parser = required_field() + + def __call__(self, stream: TokenStream) -> AstRoot: + node: AstRoot = self.parser(stream) + + stack: List[AstDecorator] = [] + + changed = False + result: List[AstCommand] = [] + + for command in node.commands: + if command.identifier == "statement" and isinstance( + decorator := command.arguments[0], AstDecorator + ): + changed = True + stack.append(decorator) + elif ( + stack + and command.identifier == "def:function:body" + and isinstance(command.arguments[0], AstFunctionSignature) + ): + arg = replace(command.arguments[0], decorators=AstChildren(stack)) + result.append( + replace( + command, arguments=AstChildren([arg, *command.arguments[1:]]) + ) + ) + stack.clear() + elif stack: + exc = InvalidSyntax("Decorators can only be applied to functions.") + raise set_location(exc, stack[-1]) + else: + result.append(command) + + if stack: + exc = InvalidSyntax("Can not apply decorator to nothing.") + raise set_location(exc, stack[-1]) + + if changed: + node = replace(node, commands=AstChildren(result)) + + return node + + @dataclass class AssignmentTargetParser: """Parser for assignment targets.""" diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index d121a0021..4d2057883 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -619,6 +619,22 @@ give @s bow{**custom_model_data} stone_can_place_on = ["minecraft:dirt"] give @s stone{CanPlaceOn: [*stone_can_place_on, "minecraft:gravel"], **custom_model_data} - red = {"color": "red"} tellraw @p ["", {"text": "hey", **red}, *stone_can_place_on, *red.color] + +def testing_decorator(f): + if callable(f): + f("dummy") + else: + say f + return testing_decorator + +@testing_decorator +@testing_decorator(1) +@testing_decorator(2) +@testing_decorator([ + ./abc, + ./def, +]) or None +def f(x): + say f"inner {x}" diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index f43f0a867..2ed4d0d86 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -776,3 +776,11 @@ tellraw @p ["", {"text": "hey", **red}, *red.color] from PIL import Image ### from PIL.Image import Image +### +def testing_decorator(): + pass + +@testing_decorator +@testing_decorator(1) +def f(): + pass \ No newline at end of file diff --git a/packages/bolt/tests/snapshots/bolt__parse_101__0.txt b/packages/bolt/tests/snapshots/bolt__parse_101__0.txt index 5de8a0ddb..4322f2432 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_101__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_101__0.txt @@ -13,6 +13,8 @@ def wat(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + name: 'wat' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt index 686c6daf4..a89de9f3b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt @@ -17,6 +17,8 @@ for i in f(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_120__0.txt b/packages/bolt/tests/snapshots/bolt__parse_120__0.txt index e881943fb..38ea67ed6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_120__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_120__0.txt @@ -13,6 +13,8 @@ def f(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt index 625ae841f..96e3eb41c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt @@ -14,6 +14,8 @@ say a location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_150__0.txt b/packages/bolt/tests/snapshots/bolt__parse_150__0.txt index e5f66ca23..03db2ea74 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_150__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_150__0.txt @@ -14,6 +14,8 @@ f(1, 2, thing=3) location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_151__0.txt b/packages/bolt/tests/snapshots/bolt__parse_151__0.txt index 1861c7666..b94610fcf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_151__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_151__0.txt @@ -14,6 +14,8 @@ f(1, 2, **{"thing": 3}) location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_152__0.txt b/packages/bolt/tests/snapshots/bolt__parse_152__0.txt index eb6c5d90a..af2ee0b5c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_152__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_152__0.txt @@ -14,6 +14,8 @@ f(1, *[4], 2, thing=3) location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_153__0.txt b/packages/bolt/tests/snapshots/bolt__parse_153__0.txt index 9a4a9620f..ec4bc3c65 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_153__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_153__0.txt @@ -14,6 +14,8 @@ f(1, *[4], 2, **{"thing": 3}) location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_160__0.txt b/packages/bolt/tests/snapshots/bolt__parse_160__0.txt index 9bc5dac93..a9313f032 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_160__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_160__0.txt @@ -13,6 +13,8 @@ def f(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt index bf1f52064..664630f06 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt @@ -54,6 +54,8 @@ say math.ceil(0.1) location: SourceLocation(pos=22, lineno=3, colno=5) end_location: SourceLocation(pos=27, lineno=3, colno=10) + decorators: + name: 'wat' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt index b6df73cd9..12fd7b181 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt @@ -30,6 +30,8 @@ b = a location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=33, lineno=1, colno=34) + decorators: + name: 'init_global_score' arguments: @@ -78,6 +80,8 @@ b = a location: SourceLocation(pos=61, lineno=4, colno=5) end_location: SourceLocation(pos=91, lineno=4, colno=35) + decorators: + name: 'rebind_global_score' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt index 4bee48fed..ed4635d25 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt @@ -22,6 +22,8 @@ say Counter(9).incr() location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=16, lineno=1, colno=17) + decorators: + name: 'Counter' arguments: @@ -45,6 +47,8 @@ say Counter(9).incr() location: SourceLocation(pos=26, lineno=2, colno=9) end_location: SourceLocation(pos=32, lineno=2, colno=15) + decorators: + name: 'incr' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt index 6843813fd..70ec66332 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt @@ -17,6 +17,8 @@ def foo(value): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=14, lineno=1, colno=15) + decorators: + name: 'foo' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt index fca0e7fba..6891cf4a2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt @@ -18,6 +18,8 @@ def foo(value): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=14, lineno=1, colno=15) + decorators: + name: 'foo' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_210__0.txt b/packages/bolt/tests/snapshots/bolt__parse_210__0.txt new file mode 100644 index 000000000..2b3343023 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_210__0.txt @@ -0,0 +1,81 @@ +def testing_decorator(): + pass + +@testing_decorator +@testing_decorator(1) +def f(): + pass--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=93, lineno=7, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=33, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + decorators: + + name: 'testing_decorator' + arguments: + + + location: SourceLocation(pos=29, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=29, lineno=2, colno=5) + end_location: SourceLocation(pos=33, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=76, lineno=6, colno=1) + end_location: SourceLocation(pos=93, lineno=7, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=80, lineno=6, colno=5) + end_location: SourceLocation(pos=83, lineno=6, colno=8) + decorators: + + location: SourceLocation(pos=35, lineno=4, colno=1) + end_location: SourceLocation(pos=53, lineno=4, colno=19) + expression: + + location: SourceLocation(pos=36, lineno=4, colno=2) + end_location: SourceLocation(pos=53, lineno=4, colno=19) + value: 'testing_decorator' + + location: SourceLocation(pos=54, lineno=5, colno=1) + end_location: SourceLocation(pos=75, lineno=5, colno=22) + expression: + + location: SourceLocation(pos=55, lineno=5, colno=2) + end_location: SourceLocation(pos=75, lineno=5, colno=22) + value: + + location: SourceLocation(pos=55, lineno=5, colno=2) + end_location: SourceLocation(pos=72, lineno=5, colno=19) + value: 'testing_decorator' + arguments: + + location: SourceLocation(pos=73, lineno=5, colno=20) + end_location: SourceLocation(pos=74, lineno=5, colno=21) + value: 1 + name: 'f' + arguments: + + + location: SourceLocation(pos=89, lineno=7, colno=5) + end_location: SourceLocation(pos=93, lineno=7, colno=9) + commands: + + location: SourceLocation(pos=89, lineno=7, colno=5) + end_location: SourceLocation(pos=93, lineno=7, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_210__1.txt b/packages/bolt/tests/snapshots/bolt__parse_210__1.txt new file mode 100644 index 000000000..e3e540789 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_210__1.txt @@ -0,0 +1,25 @@ +_mecha_lineno = [1, 7, 8, 14], [1, 4, 5, 4] +_mecha_helper_children = _mecha_runtime.helpers['children'] +_mecha_helper_replace = _mecha_runtime.helpers['replace'] +with _mecha_runtime.scope() as _mecha_var3: + def testing_decorator(): + pass + _mecha_var0 = testing_decorator + _mecha_var1 = testing_decorator + _mecha_var2 = 1 + _mecha_var1 = _mecha_var1(_mecha_var2) + def f(): + pass + f = _mecha_var1(f) + f = _mecha_var0(f) +_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +--- +output = _mecha_var4 +--- +_mecha_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=93, lineno=7, colno=9) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index 01c0fa3f3..1ea05ea93 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'advancement', literal 'align' or 146 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 147 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_70__0.txt b/packages/bolt/tests/snapshots/bolt__parse_70__0.txt index 5264fd31c..0af8a90c3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_70__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_70__0.txt @@ -14,6 +14,8 @@ foo() location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + name: 'foo' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_71__0.txt b/packages/bolt/tests/snapshots/bolt__parse_71__0.txt index b18621b49..710a78932 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_71__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_71__0.txt @@ -15,6 +15,8 @@ def foo(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + name: 'foo' arguments: @@ -30,6 +32,8 @@ def foo(): location: SourceLocation(pos=19, lineno=2, colno=9) end_location: SourceLocation(pos=24, lineno=2, colno=14) + decorators: + name: 'bar' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_72__0.txt b/packages/bolt/tests/snapshots/bolt__parse_72__0.txt index f24f09beb..9ce50595a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_72__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_72__0.txt @@ -17,6 +17,8 @@ def foo( location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=41, lineno=5, colno=2) + decorators: + name: 'foo' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_77__0.txt b/packages/bolt/tests/snapshots/bolt__parse_77__0.txt index 00367b3a5..bc60d3e3e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_77__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_77__0.txt @@ -14,6 +14,8 @@ def f(a, b=a): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=13, lineno=1, colno=14) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_81__0.txt b/packages/bolt/tests/snapshots/bolt__parse_81__0.txt index 4c163830e..9238e268b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_81__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_81__0.txt @@ -25,6 +25,8 @@ def foo(something): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=18, lineno=1, colno=19) + decorators: + name: 'foo' arguments: @@ -44,6 +46,8 @@ def foo(something): location: SourceLocation(pos=28, lineno=2, colno=9) end_location: SourceLocation(pos=33, lineno=2, colno=14) + decorators: + name: 'wat' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_82__0.txt b/packages/bolt/tests/snapshots/bolt__parse_82__0.txt index d0f5459b8..b9571e5f0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_82__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_82__0.txt @@ -18,6 +18,8 @@ thing = bar() location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + name: 'foo' arguments: @@ -73,6 +75,8 @@ thing = bar() location: SourceLocation(pos=51, lineno=4, colno=5) end_location: SourceLocation(pos=56, lineno=4, colno=10) + decorators: + name: 'bar' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_84__0.txt b/packages/bolt/tests/snapshots/bolt__parse_84__0.txt index 685e616d0..747228148 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_84__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_84__0.txt @@ -13,6 +13,8 @@ def foo(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + name: 'foo' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt index 51616b3c2..06c30ba27 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt @@ -15,6 +15,8 @@ def f(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: @@ -30,6 +32,8 @@ def f(): location: SourceLocation(pos=17, lineno=2, colno=9) end_location: SourceLocation(pos=20, lineno=2, colno=12) + decorators: + name: 'g' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt index 7173fad31..212d84c57 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt @@ -14,6 +14,8 @@ f("thing") location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=8, lineno=1, colno=9) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt index b461e773c..56a0b7c86 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt @@ -13,6 +13,8 @@ def f(): location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + name: 'f' arguments: diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 880138b35..139870038 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -259,6 +259,13 @@ execute if data storage demo:random_data {value: 42} run say json loaded success give @s bow{CustomModelData: 7} give @s stone{CanPlaceOn: ["minecraft:dirt", "minecraft:gravel"], CustomModelData: 7} tellraw @p ["", {"text": "hey", "color": "red"}, "minecraft:dirt", "r", "e", "d"] +say 1 +say 2 +say ['demo:abc', 'demo:def'] +say inner dummy +say dummy +say dummy +say dummy ``` `@function demo:import_a` From 4ae987b65e80483f0de77995e23ea0f608a1d817 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Jun 2022 22:16:48 +0200 Subject: [PATCH 0872/1554] fix: change prefix of codegen variables --- packages/bolt/bolt/codegen.py | 50 +-- packages/bolt/bolt/parse.py | 2 +- packages/bolt/bolt/runtime.py | 4 +- packages/bolt/bolt/utils.py | 6 +- .../bolt/tests/snapshots/bolt__parse_0__1.txt | 16 +- .../tests/snapshots/bolt__parse_101__1.txt | 18 +- .../tests/snapshots/bolt__parse_102__1.txt | 32 +- .../tests/snapshots/bolt__parse_103__1.txt | 62 +-- .../tests/snapshots/bolt__parse_104__1.txt | 32 +- .../tests/snapshots/bolt__parse_105__1.txt | 16 +- .../tests/snapshots/bolt__parse_106__1.txt | 22 +- .../tests/snapshots/bolt__parse_107__1.txt | 22 +- .../tests/snapshots/bolt__parse_108__1.txt | 22 +- .../tests/snapshots/bolt__parse_109__1.txt | 22 +- .../tests/snapshots/bolt__parse_10__1.txt | 26 +- .../tests/snapshots/bolt__parse_110__1.txt | 18 +- .../tests/snapshots/bolt__parse_111__1.txt | 24 +- .../tests/snapshots/bolt__parse_112__1.txt | 18 +- .../tests/snapshots/bolt__parse_113__1.txt | 18 +- .../tests/snapshots/bolt__parse_114__1.txt | 18 +- .../tests/snapshots/bolt__parse_117__1.txt | 42 +- .../tests/snapshots/bolt__parse_118__1.txt | 44 +- .../tests/snapshots/bolt__parse_11__1.txt | 26 +- .../tests/snapshots/bolt__parse_120__1.txt | 14 +- .../tests/snapshots/bolt__parse_126__1.txt | 28 +- .../tests/snapshots/bolt__parse_127__1.txt | 28 +- .../tests/snapshots/bolt__parse_128__1.txt | 28 +- .../tests/snapshots/bolt__parse_129__1.txt | 20 +- .../tests/snapshots/bolt__parse_12__1.txt | 30 +- .../tests/snapshots/bolt__parse_130__1.txt | 60 +-- .../tests/snapshots/bolt__parse_132__1.txt | 76 ++-- .../tests/snapshots/bolt__parse_133__1.txt | 80 ++-- .../tests/snapshots/bolt__parse_134__1.txt | 86 ++-- .../tests/snapshots/bolt__parse_135__1.txt | 90 ++--- .../tests/snapshots/bolt__parse_138__1.txt | 34 +- .../tests/snapshots/bolt__parse_139__1.txt | 128 +++--- .../tests/snapshots/bolt__parse_13__1.txt | 28 +- .../tests/snapshots/bolt__parse_140__1.txt | 26 +- .../tests/snapshots/bolt__parse_141__1.txt | 34 +- .../tests/snapshots/bolt__parse_142__1.txt | 32 +- .../tests/snapshots/bolt__parse_143__1.txt | 40 +- .../tests/snapshots/bolt__parse_144__1.txt | 38 +- .../tests/snapshots/bolt__parse_145__1.txt | 20 +- .../tests/snapshots/bolt__parse_14__1.txt | 28 +- .../tests/snapshots/bolt__parse_150__1.txt | 24 +- .../tests/snapshots/bolt__parse_151__1.txt | 28 +- .../tests/snapshots/bolt__parse_152__1.txt | 28 +- .../tests/snapshots/bolt__parse_153__1.txt | 32 +- .../tests/snapshots/bolt__parse_154__1.txt | 18 +- .../tests/snapshots/bolt__parse_156__1.txt | 22 +- .../tests/snapshots/bolt__parse_15__1.txt | 24 +- .../tests/snapshots/bolt__parse_160__1.txt | 20 +- .../tests/snapshots/bolt__parse_161__1.txt | 38 +- .../tests/snapshots/bolt__parse_162__1.txt | 28 +- .../tests/snapshots/bolt__parse_164__1.txt | 34 +- .../tests/snapshots/bolt__parse_165__1.txt | 32 +- .../tests/snapshots/bolt__parse_167__1.txt | 22 +- .../tests/snapshots/bolt__parse_168__1.txt | 54 +-- .../tests/snapshots/bolt__parse_169__1.txt | 42 +- .../tests/snapshots/bolt__parse_16__1.txt | 72 ++-- .../tests/snapshots/bolt__parse_170__1.txt | 34 +- .../tests/snapshots/bolt__parse_171__1.txt | 32 +- .../tests/snapshots/bolt__parse_174__1.txt | 38 +- .../tests/snapshots/bolt__parse_175__1.txt | 36 +- .../tests/snapshots/bolt__parse_176__1.txt | 38 +- .../tests/snapshots/bolt__parse_17__1.txt | 382 +++++++++--------- .../tests/snapshots/bolt__parse_181__1.txt | 16 +- .../tests/snapshots/bolt__parse_182__1.txt | 18 +- .../tests/snapshots/bolt__parse_184__1.txt | 36 +- .../tests/snapshots/bolt__parse_185__1.txt | 22 +- .../tests/snapshots/bolt__parse_186__1.txt | 38 +- .../tests/snapshots/bolt__parse_192__1.txt | 56 +-- .../tests/snapshots/bolt__parse_193__1.txt | 176 ++++---- .../tests/snapshots/bolt__parse_194__1.txt | 104 ++--- .../tests/snapshots/bolt__parse_196__1.txt | 42 +- .../tests/snapshots/bolt__parse_197__1.txt | 60 +-- .../tests/snapshots/bolt__parse_198__1.txt | 30 +- .../tests/snapshots/bolt__parse_199__1.txt | 156 +++---- .../bolt/tests/snapshots/bolt__parse_1__1.txt | 16 +- .../tests/snapshots/bolt__parse_201__1.txt | 30 +- .../tests/snapshots/bolt__parse_202__1.txt | 22 +- .../tests/snapshots/bolt__parse_203__1.txt | 22 +- .../tests/snapshots/bolt__parse_205__1.txt | 40 +- .../tests/snapshots/bolt__parse_206__1.txt | 56 +-- .../tests/snapshots/bolt__parse_207__1.txt | 54 +-- .../tests/snapshots/bolt__parse_208__1.txt | 20 +- .../tests/snapshots/bolt__parse_209__1.txt | 20 +- .../tests/snapshots/bolt__parse_20__1.txt | 76 ++-- .../tests/snapshots/bolt__parse_210__1.txt | 26 +- .../tests/snapshots/bolt__parse_21__1.txt | 16 +- .../tests/snapshots/bolt__parse_22__1.txt | 16 +- .../tests/snapshots/bolt__parse_23__1.txt | 16 +- .../tests/snapshots/bolt__parse_24__1.txt | 16 +- .../tests/snapshots/bolt__parse_25__1.txt | 16 +- .../tests/snapshots/bolt__parse_26__1.txt | 16 +- .../tests/snapshots/bolt__parse_29__1.txt | 16 +- .../bolt/tests/snapshots/bolt__parse_2__1.txt | 16 +- .../tests/snapshots/bolt__parse_32__1.txt | 20 +- .../tests/snapshots/bolt__parse_33__1.txt | 24 +- .../tests/snapshots/bolt__parse_34__1.txt | 42 +- .../tests/snapshots/bolt__parse_35__1.txt | 84 ++-- .../bolt/tests/snapshots/bolt__parse_3__1.txt | 16 +- .../tests/snapshots/bolt__parse_41__1.txt | 22 +- .../tests/snapshots/bolt__parse_42__1.txt | 62 +-- .../tests/snapshots/bolt__parse_43__1.txt | 48 +-- .../tests/snapshots/bolt__parse_44__1.txt | 48 +-- .../tests/snapshots/bolt__parse_45__1.txt | 40 +- .../tests/snapshots/bolt__parse_46__1.txt | 64 +-- .../tests/snapshots/bolt__parse_47__1.txt | 22 +- .../tests/snapshots/bolt__parse_49__1.txt | 24 +- .../bolt/tests/snapshots/bolt__parse_4__1.txt | 16 +- .../tests/snapshots/bolt__parse_50__1.txt | 24 +- .../tests/snapshots/bolt__parse_51__1.txt | 22 +- .../tests/snapshots/bolt__parse_53__1.txt | 30 +- .../tests/snapshots/bolt__parse_55__1.txt | 30 +- .../tests/snapshots/bolt__parse_57__1.txt | 30 +- .../bolt/tests/snapshots/bolt__parse_5__1.txt | 20 +- .../tests/snapshots/bolt__parse_62__1.txt | 22 +- .../tests/snapshots/bolt__parse_63__1.txt | 18 +- .../tests/snapshots/bolt__parse_64__1.txt | 30 +- .../tests/snapshots/bolt__parse_65__1.txt | 20 +- .../tests/snapshots/bolt__parse_66__1.txt | 22 +- .../tests/snapshots/bolt__parse_67__1.txt | 26 +- .../tests/snapshots/bolt__parse_68__1.txt | 46 +-- .../tests/snapshots/bolt__parse_69__1.txt | 24 +- .../bolt/tests/snapshots/bolt__parse_6__1.txt | 20 +- .../tests/snapshots/bolt__parse_70__1.txt | 22 +- .../tests/snapshots/bolt__parse_71__1.txt | 22 +- .../tests/snapshots/bolt__parse_72__1.txt | 44 +- .../tests/snapshots/bolt__parse_77__1.txt | 40 +- .../bolt/tests/snapshots/bolt__parse_7__1.txt | 24 +- .../tests/snapshots/bolt__parse_81__1.txt | 50 +-- .../tests/snapshots/bolt__parse_82__1.txt | 46 +-- .../tests/snapshots/bolt__parse_84__1.txt | 14 +- .../tests/snapshots/bolt__parse_87__1.txt | 22 +- .../tests/snapshots/bolt__parse_89__1.txt | 34 +- .../bolt/tests/snapshots/bolt__parse_8__1.txt | 24 +- .../tests/snapshots/bolt__parse_91__1.txt | 20 +- .../tests/snapshots/bolt__parse_92__1.txt | 24 +- .../tests/snapshots/bolt__parse_93__1.txt | 24 +- .../tests/snapshots/bolt__parse_94__1.txt | 36 +- .../tests/snapshots/bolt__parse_95__1.txt | 54 +-- .../tests/snapshots/bolt__parse_96__1.txt | 54 +-- .../tests/snapshots/bolt__parse_97__1.txt | 36 +- .../bolt/tests/snapshots/bolt__parse_9__1.txt | 22 +- .../examples__build_bolt_debug__0.pack.md | 16 +- packages/bolt/tests/test_bolt.py | 2 +- 147 files changed, 2698 insertions(+), 2698 deletions(-) diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 18eb0744f..bc1e84e1f 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -76,7 +76,7 @@ class Accumulator: counter: int = 0 header: Dict[str, str] = field(default_factory=dict) - last_condition: str = "_mecha_error_last_condition" + last_condition: str = "_bolt_error_last_condition" def get_source(self) -> str: """Return the source code.""" @@ -85,7 +85,7 @@ def get_source(self) -> str: for expression, variable in self.header.items() ) - lines: List[str] = ["_mecha_lineno = "] + lines: List[str] = ["_bolt_lineno = "] numbers1: List[int] = [1] numbers2: List[int] = [1] @@ -104,10 +104,10 @@ def get_source(self) -> str: def helper(self, name: str, *args: Any) -> str: """Emit helper.""" - helper = f"_mecha_runtime.helpers[{name!r}]" + helper = f"_bolt_runtime.helpers[{name!r}]" if helper not in self.header: - self.header[helper] = f"_mecha_helper_{normalize_string(name)}" + self.header[helper] = f"_bolt_helper_{normalize_string(name)}" return f"{self.header[helper]}({', '.join(map(str, args))})" @@ -117,8 +117,8 @@ def replace(self, node: str, **kwargs: str) -> str: def missing(self) -> str: """Emit missing sentinel.""" - self.header["_mecha_runtime.helpers['missing']"] = f"_mecha_helper_missing" - return f"_mecha_helper_missing" + self.header["_bolt_runtime.helpers['missing']"] = f"_bolt_helper_missing" + return f"_bolt_helper_missing" def children(self, nodes: Iterable[str]) -> str: """Emit children helper.""" @@ -136,18 +136,18 @@ def make_ref(self, obj: Any) -> str: """Register ref.""" index = len(self.refs) self.refs.append(obj) - return f"_mecha_refs[{index}]" + return f"_bolt_refs[{index}]" def make_ref_slice(self, objs: Iterable[Any]) -> str: """Register ref slice.""" start = len(self.refs) self.refs.extend(objs) stop = len(self.refs) - return f"_mecha_refs[{start}:{stop}]" + return f"_bolt_refs[{start}:{stop}]" def make_variable(self) -> str: """Create a unique variable name.""" - name = f"_mecha_var{self.counter}" + name = f"_bolt_var{self.counter}" self.counter += 1 return name @@ -173,9 +173,9 @@ def statement(self, code: str, *, lineno: Any = None): def if_statement(self, condition: str): """Emit if statement.""" branch = self.helper("branch", condition) - self.statement(f"with {branch} as _mecha_condition:") + self.statement(f"with {branch} as _bolt_condition:") with self.block(): - self.statement(f"if _mecha_condition:") + self.statement(f"if _bolt_condition:") with self.block(): yield self.last_condition = condition @@ -213,16 +213,16 @@ class CommandCollector(ChildrenCollector): def add_static(self, *args: AstNode): if len(args) > 1: self.acc.statement( - f"_mecha_runtime.commands.extend({self.acc.make_ref_slice(args)})" + f"_bolt_runtime.commands.extend({self.acc.make_ref_slice(args)})" ) elif args: self.acc.statement( - f"_mecha_runtime.commands.append({self.acc.make_ref(args[0])})" + f"_bolt_runtime.commands.append({self.acc.make_ref(args[0])})" ) def add_dynamic(self, *args: str): for arg in args: - self.acc.statement(f"_mecha_runtime.commands.append({arg})") + self.acc.statement(f"_bolt_runtime.commands.append({arg})") class RootCommandCollector(CommandCollector): @@ -236,7 +236,7 @@ def flush(self) -> str: ] self.acc.lines.insert( self.start_index, - f"{self.acc.indentation}with _mecha_runtime.scope() as {commands}:\n", + f"{self.acc.indentation}with _bolt_runtime.scope() as {commands}:\n", ) return self.acc.helper("children", commands) @@ -346,7 +346,7 @@ def visit_body( """Emit each individual command in the current scope.""" result = yield from visit_multiple(node.commands, acc, CommandCollector) if result is None: - acc.statement(f"_mecha_runtime.commands.extend({acc.make_ref(node)}.commands)") + acc.statement(f"_bolt_runtime.commands.extend({acc.make_ref(node)}.commands)") def visit_binding( @@ -363,7 +363,7 @@ def visit_binding( if len(targets) > 1 and isinstance(target_node, AstTargetUnpack): nodes = target_node.targets - values = [f"_mecha_unpack{i}" for i in range(len(targets))] + values = [f"_bolt_unpack{i}" for i in range(len(targets))] acc.statement(f"{', '.join(values)} = {value}", lineno=target_node) else: nodes = [target_node] @@ -372,11 +372,11 @@ def visit_binding( for node, target, value in zip(nodes, targets, values): if isinstance(node, AstTargetIdentifier) and node.rebind: rebind = acc.helper("get_rebind", target) - acc.statement(f"_mecha_rebind = {rebind}", lineno=node) + acc.statement(f"_bolt_rebind = {rebind}", lineno=node) acc.statement(f"{target} {op} {value}") - acc.statement(f"if _mecha_rebind is not None:") + acc.statement(f"if _bolt_rebind is not None:") with acc.block(): - acc.statement(f"{target} = _mecha_rebind({target})") + acc.statement(f"{target} = _bolt_rebind({target})") else: acc.statement(f"{target} {op} {value}", lineno=node) @@ -594,7 +594,7 @@ def import_statement( if module.namespace: acc.statement( - f"{', '.join(names)} = _mecha_runtime.from_module_import({module.get_value()!r}, {', '.join(map(repr, names))})", + f"{', '.join(names)} = _bolt_runtime.from_module_import({module.get_value()!r}, {', '.join(map(repr, names))})", lineno=node, ) else: @@ -607,7 +607,7 @@ def import_statement( if module.namespace: acc.statement( - f"{alias} = _mecha_runtime.import_module({module.get_value()!r}).namespace", + f"{alias} = _bolt_runtime.import_module({module.get_value()!r}).namespace", lineno=node, ) else: @@ -713,11 +713,11 @@ def binary_logical( acc.statement(f"if {dup} is not None:") with acc.block(): rebind = acc.helper("get_rebind", left) - acc.statement(f"_mecha_rebind = {rebind}", lineno=node.right) + acc.statement(f"_bolt_rebind = {rebind}", lineno=node.right) acc.statement(f"{left} = {right}") - acc.statement(f"if _mecha_rebind is not None:") + acc.statement(f"if _bolt_rebind is not None:") with acc.block(): - acc.statement(f"{left} = _mecha_rebind({left})") + acc.statement(f"{left} = _bolt_rebind({left})") acc.statement("else:") with acc.block(): diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index ecdb8fd2e..900bfcab9 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -107,7 +107,7 @@ TRUE_PATTERN: str = r"\b[tT]rue\b" FALSE_PATTERN: str = r"\b[fF]alse\b" NULL_PATTERN: str = r"\b(?:null|None)\b" -IDENTIFIER_PATTERN: str = rf"(?!_mecha_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" +IDENTIFIER_PATTERN: str = rf"(?!_bolt_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" MODULE_PATTERN: str = rf"{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*" STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 096f1630f..18bbe8881 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -253,8 +253,8 @@ def get_output(self, module: CompiledModule) -> AstRoot: logger.debug("Evaluate module %s.", module.resource_location or "") module.namespace.update(self.globals) - module.namespace["_mecha_runtime"] = self - module.namespace["_mecha_refs"] = module.refs + module.namespace["_bolt_runtime"] = self + module.namespace["_bolt_refs"] = module.refs module.namespace["__name__"] = module.resource_location module.namespace["__file__"] = module.code.co_filename diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py index 3c74a3049..99e0d53d9 100644 --- a/packages/bolt/bolt/utils.py +++ b/packages/bolt/bolt/utils.py @@ -82,7 +82,7 @@ def rewrite_traceback(exc: Exception) -> Exception: tb = tb.tb_next continue - line_numbers = tb.tb_frame.f_globals.get("_mecha_lineno") + line_numbers = tb.tb_frame.f_globals.get("_bolt_lineno") if line_numbers: n1, n2 = line_numbers @@ -109,12 +109,12 @@ def fake_traceback(exc: Exception, tb: TracebackType, lineno: int) -> TracebackT if name == "": name = tb.tb_frame.f_globals.get("__name__") - code = compile("\n" * (lineno - 1) + "raise _mecha_exc", filename, "exec") + code = compile("\n" * (lineno - 1) + "raise _bolt_exc", filename, "exec") if name: code = code.replace(co_name=name) try: - exec(code, {"_mecha_exc": exc}) + exec(code, {"_bolt_exc": exc}) except Exception as exc: return exc.__traceback__.tb_next # type: ignore diff --git a/packages/bolt/tests/snapshots/bolt__parse_0__1.txt b/packages/bolt/tests/snapshots/bolt__parse_0__1.txt index 92bf806ef..486055542 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_0__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_0__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_101__1.txt b/packages/bolt/tests/snapshots/bolt__parse_101__1.txt index 79943169f..c1cd30d19 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_101__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_101__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: def wat(): - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) + _bolt_runtime.commands.extend(_bolt_refs[0].commands) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) --- -output = _mecha_var1 +output = _bolt_var1 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=2, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_102__1.txt b/packages/bolt/tests/snapshots/bolt__parse_102__1.txt index a06245711..f689d79b5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_102__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_102__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '' - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_json(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var1]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_json = _bolt_runtime.helpers['interpolate_json'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = '' + a = _bolt_var0 + _bolt_var1 = a + _bolt_var1 = _bolt_helper_interpolate_json(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var1]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=18, lineno=2, colno=12) end_location: SourceLocation(pos=19, lineno=2, colno=13) @@ -21,14 +21,14 @@ _mecha_refs[0] converter: 'json' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=15, lineno=2, colno=9) end_location: SourceLocation(pos=17, lineno=2, colno=11) variable: 'p' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=7, lineno=2, colno=1) end_location: SourceLocation(pos=19, lineno=2, colno=13) @@ -36,7 +36,7 @@ _mecha_refs[2] arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=2, colno=13) diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt index 9fef1e431..448f9a732 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 4] -_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '[{"text": "Hello", "bold": true}]' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var1 = _mecha_helper_interpolate_nbt(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[17], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_refs[15], _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_refs[13], _mecha_helper_replace(_mecha_refs[12], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_refs[7], _mecha_helper_replace(_mecha_refs[6], data_tags=_mecha_helper_replace(_mecha_refs[5], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], value=_mecha_helper_replace(_mecha_refs[3], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_var1), _mecha_refs[2]])))])))]))]))]))]))]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[18], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 4] +_bolt_helper_interpolate_nbt = _bolt_runtime.helpers['interpolate_nbt'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = '[{"text": "Hello", "bold": true}]' + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_var1 = _bolt_helper_interpolate_nbt(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[17], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[16], arguments=_bolt_helper_children([_bolt_refs[15], _bolt_helper_replace(_bolt_refs[14], arguments=_bolt_helper_children([_bolt_refs[13], _bolt_helper_replace(_bolt_refs[12], arguments=_bolt_helper_children([_bolt_refs[10], _bolt_refs[11], _bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_refs[7], _bolt_helper_replace(_bolt_refs[6], data_tags=_bolt_helper_replace(_bolt_refs[5], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], value=_bolt_helper_replace(_bolt_refs[3], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1), _bolt_refs[2]])))])))]))]))]))]))]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[18], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=121, lineno=4, colno=15) end_location: SourceLocation(pos=124, lineno=4, colno=18) @@ -21,7 +21,7 @@ _mecha_refs[0] converter: 'nbt' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=115, lineno=4, colno=9) end_location: SourceLocation(pos=124, lineno=4, colno=18) @@ -29,7 +29,7 @@ _mecha_refs[1] value: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=134, lineno=5, colno=9) end_location: SourceLocation(pos=202, lineno=7, colno=10) @@ -37,14 +37,14 @@ _mecha_refs[2] value: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=105, lineno=3, colno=14) end_location: SourceLocation(pos=208, lineno=8, colno=6) entries: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=96, lineno=3, colno=5) end_location: SourceLocation(pos=208, lineno=8, colno=6) @@ -52,13 +52,13 @@ _mecha_refs[4] value: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=90, lineno=2, colno=49) end_location: SourceLocation(pos=210, lineno=9, colno=2) entries: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=85, lineno=2, colno=44) end_location: SourceLocation(pos=210, lineno=9, colno=2) @@ -66,14 +66,14 @@ _mecha_refs[6] data_tags: -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=82, lineno=2, colno=41) end_location: SourceLocation(pos=84, lineno=2, colno=43) variable: 's' arguments: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=77, lineno=2, colno=36) end_location: SourceLocation(pos=210, lineno=9, colno=2) @@ -81,14 +81,14 @@ _mecha_refs[8] arguments: -_mecha_refs[9] +_bolt_refs[9] location: SourceLocation(pos=77, lineno=2, colno=36) end_location: SourceLocation(pos=210, lineno=9, colno=2) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[10] +_bolt_refs[10] location: SourceLocation(pos=63, lineno=2, colno=22) end_location: SourceLocation(pos=70, lineno=2, colno=29) @@ -98,7 +98,7 @@ _mecha_refs[10] z: -_mecha_refs[11] +_bolt_refs[11] location: SourceLocation(pos=71, lineno=2, colno=30) end_location: SourceLocation(pos=76, lineno=2, colno=35) @@ -107,7 +107,7 @@ _mecha_refs[11] block_states: data_tags: None -_mecha_refs[12] +_bolt_refs[12] location: SourceLocation(pos=54, lineno=2, colno=13) end_location: SourceLocation(pos=210, lineno=9, colno=2) @@ -116,14 +116,14 @@ _mecha_refs[12] -_mecha_refs[13] +_bolt_refs[13] location: SourceLocation(pos=51, lineno=2, colno=10) end_location: SourceLocation(pos=53, lineno=2, colno=12) variable: 's' arguments: -_mecha_refs[14] +_bolt_refs[14] location: SourceLocation(pos=48, lineno=2, colno=7) end_location: SourceLocation(pos=210, lineno=9, colno=2) @@ -131,14 +131,14 @@ _mecha_refs[14] arguments: -_mecha_refs[15] +_bolt_refs[15] location: SourceLocation(pos=45, lineno=2, colno=4) end_location: SourceLocation(pos=47, lineno=2, colno=6) variable: 'a' arguments: -_mecha_refs[16] +_bolt_refs[16] location: SourceLocation(pos=42, lineno=2, colno=1) end_location: SourceLocation(pos=210, lineno=9, colno=2) @@ -146,14 +146,14 @@ _mecha_refs[16] arguments: -_mecha_refs[17] +_bolt_refs[17] location: SourceLocation(pos=42, lineno=2, colno=1) end_location: SourceLocation(pos=210, lineno=9, colno=2) identifier: 'execute:subcommand' arguments: -_mecha_refs[18] +_bolt_refs[18] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=210, lineno=9, colno=2) diff --git a/packages/bolt/tests/snapshots/bolt__parse_104__1.txt b/packages/bolt/tests/snapshots/bolt__parse_104__1.txt index 9f5c3edf4..70ef1833f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_104__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_104__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - _mecha_var0 = 1 - _mecha_var1 = 'hey' - _mecha_var2 = (_mecha_var0,_mecha_var1,) - _mecha_var3 = () - _mecha_var2 = _mecha_var2 + _mecha_var3 - _mecha_var4 = 'wow' - _mecha_var5 = (_mecha_var4,) - _mecha_var2 = _mecha_var2 + _mecha_var5 - thing = _mecha_var2 -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var6: + _bolt_var0 = 1 + _bolt_var1 = 'hey' + _bolt_var2 = (_bolt_var0,_bolt_var1,) + _bolt_var3 = () + _bolt_var2 = _bolt_var2 + _bolt_var3 + _bolt_var4 = 'wow' + _bolt_var5 = (_bolt_var4,) + _bolt_var2 = _bolt_var2 + _bolt_var5 + thing = _bolt_var2 +_bolt_var7 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var6)) --- -output = _mecha_var7 +output = _bolt_var7 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=35, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_105__1.txt b/packages/bolt/tests/snapshots/bolt__parse_105__1.txt index d78006888..236c011ba 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_105__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_105__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'hello'.format() -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'hello'.format() +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_106__1.txt b/packages/bolt/tests/snapshots/bolt__parse_106__1.txt index 90c8d4eb5..9292a9afc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_106__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_106__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'world' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 'hello {}'.format(_mecha_var1) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 7], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 'world' + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_var2 = 'hello {}'.format(_bolt_var1) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=29, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_107__1.txt b/packages/bolt/tests/snapshots/bolt__parse_107__1.txt index 09066c304..ca4cdab71 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_107__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_107__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'world' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 'hello {!r}'.format(_mecha_var1) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 7], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 'world' + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_var2 = 'hello {!r}'.format(_bolt_var1) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_108__1.txt b/packages/bolt/tests/snapshots/bolt__parse_108__1.txt index 664d24330..d46320db1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_108__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_108__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0 + _mecha_var1 - _mecha_var2 = 'hello {}'.format(_mecha_var0) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + _bolt_var1 = 1 + _bolt_var0 = _bolt_var0 + _bolt_var1 + _bolt_var2 = 'hello {}'.format(_bolt_var0) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_109__1.txt b/packages/bolt/tests/snapshots/bolt__parse_109__1.txt index b352262ea..f7617284d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_109__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_109__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0 + _mecha_var1 - _mecha_var2 = 'hello {:03}'.format(_mecha_var0) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + _bolt_var1 = 1 + _bolt_var0 = _bolt_var0 + _bolt_var1 + _bolt_var2 = 'hello {:03}'.format(_bolt_var0) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_10__1.txt b/packages/bolt/tests/snapshots/bolt__parse_10__1.txt index 019e03060..9d49214b3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_10__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_10__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 2 - _mecha_var1 = 54 - _mecha_var1 = - _mecha_var1 - _mecha_var2 = 10 - _mecha_var1 = _mecha_var1 * _mecha_var2 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 2 + _bolt_var1 = 54 + _bolt_var1 = - _bolt_var1 + _bolt_var2 = 10 + _bolt_var1 = _bolt_var1 * _bolt_var2 + _bolt_var0 = _bolt_var0 + _bolt_var1 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_110__1.txt b/packages/bolt/tests/snapshots/bolt__parse_110__1.txt index 3a8d82aa6..272d9489c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_110__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_110__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - _mecha_var1 = '{{}}nope{}'.format(_mecha_var0) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + _bolt_var1 = '{{}}nope{}'.format(_bolt_var0) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_111__1.txt b/packages/bolt/tests/snapshots/bolt__parse_111__1.txt index c82b3c7ed..504ba5f40 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_111__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_111__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 7 - _mecha_var1 = '{{{:08}}}'.format(_mecha_var0) - _mecha_var2 = '{{{}}}'.format(_mecha_var1) - _mecha_var3 = '{{{}}}'.format(_mecha_var2) - yo = _mecha_var3 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 7 + _bolt_var1 = '{{{:08}}}'.format(_bolt_var0) + _bolt_var2 = '{{{}}}'.format(_bolt_var1) + _bolt_var3 = '{{{}}}'.format(_bolt_var2) + yo = _bolt_var3 +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_112__1.txt b/packages/bolt/tests/snapshots/bolt__parse_112__1.txt index 1cd364bb8..292b458aa 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_112__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_112__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = ''.format() - yo = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = ''.format() + yo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_113__1.txt b/packages/bolt/tests/snapshots/bolt__parse_113__1.txt index 2712ec24a..ff4f22a6f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_113__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_113__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '"'.format() - yo = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '"'.format() + yo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_114__1.txt b/packages/bolt/tests/snapshots/bolt__parse_114__1.txt index 0f2a4d713..3a699d695 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_114__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_114__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '\\'.format() - yo = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '\\'.format() + yo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt index d0364551e..f6c4a7dd8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 8 - x = _mecha_var0 - _mecha_var1 = x - _mecha_var2 = None - _mecha_var3 = (_mecha_var1,_mecha_var2,) - _mecha_var3 = _mecha_helper_interpolate_range(_mecha_var3, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_refs[2], _mecha_var3, _mecha_refs[3]]))]))) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_range = _bolt_runtime.helpers['interpolate_range'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 8 + x = _bolt_var0 + _bolt_var1 = x + _bolt_var2 = None + _bolt_var3 = (_bolt_var1,_bolt_var2,) + _bolt_var3 = _bolt_helper_interpolate_range(_bolt_var3, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_refs[2], _bolt_var3, _bolt_refs[3]]))]))) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=30, lineno=2, colno=25) end_location: SourceLocation(pos=39, lineno=2, colno=34) @@ -23,26 +23,26 @@ _mecha_refs[0] converter: 'range' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=15, lineno=2, colno=10) end_location: SourceLocation(pos=17, lineno=2, colno=12) variable: 's' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=18, lineno=2, colno=13) end_location: SourceLocation(pos=21, lineno=2, colno=16) value: 'tmp' -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=40, lineno=2, colno=35) end_location: SourceLocation(pos=47, lineno=2, colno=42) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=47, lineno=2, colno=42) @@ -52,14 +52,14 @@ _mecha_refs[4] -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=47, lineno=2, colno=42) identifier: 'execute:subcommand' arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=47, lineno=2, colno=42) diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt index 8fb829b38..d7be8dd1d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt @@ -1,26 +1,26 @@ -_mecha_lineno = [1, 13, 16], [1, 5, 6] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: +_bolt_lineno = [1, 13, 16], [1, 5, 6] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: def f(): - _mecha_var0 = 1 - yield _mecha_var0 - _mecha_var1 = 2 - yield _mecha_var1 - _mecha_var2 = 3 - yield _mecha_var2 - _mecha_var3 = f - _mecha_var3 = _mecha_var3() - for i in _mecha_var3: - _mecha_var4 = i - _mecha_var4 = _mecha_helper_interpolate_message(_mecha_var4, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var4]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) + _bolt_var0 = 1 + yield _bolt_var0 + _bolt_var1 = 2 + yield _bolt_var1 + _bolt_var2 = 3 + yield _bolt_var2 + _bolt_var3 = f + _bolt_var3 = _bolt_var3() + for i in _bolt_var3: + _bolt_var4 = i + _bolt_var4 = _bolt_helper_interpolate_message(_bolt_var4, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var4]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=67, lineno=6, colno=9) end_location: SourceLocation(pos=68, lineno=6, colno=10) @@ -29,14 +29,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=63, lineno=6, colno=5) end_location: SourceLocation(pos=68, lineno=6, colno=10) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=69, lineno=7, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_11__1.txt b/packages/bolt/tests/snapshots/bolt__parse_11__1.txt index 5c482d291..38dca2ff9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_11__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_11__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 2 - _mecha_var1 = 54 - _mecha_var1 = - _mecha_var1 - _mecha_var0 = _mecha_var0 + _mecha_var1 - _mecha_var2 = 10 - _mecha_var0 = _mecha_var0 * _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 2 + _bolt_var1 = 54 + _bolt_var1 = - _bolt_var1 + _bolt_var0 = _bolt_var0 + _bolt_var1 + _bolt_var2 = 10 + _bolt_var0 = _bolt_var0 * _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_120__1.txt b/packages/bolt/tests/snapshots/bolt__parse_120__1.txt index 1226c5c97..f1263931f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_120__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_120__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: def f(): yield -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _mecha_var1 +output = _bolt_var1 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=18, lineno=2, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_126__1.txt b/packages/bolt/tests/snapshots/bolt__parse_126__1.txt index b3fd73816..495ef8366 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_126__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_126__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - math = _mecha_helper_import_module('math') - _mecha_var0 = math - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'sin') - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0(_mecha_var1) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_import_module = _bolt_runtime.helpers['import_module'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + math = _bolt_helper_import_module('math') + _bolt_var0 = math + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'sin') + _bolt_var1 = 1 + _bolt_var0 = _bolt_var0(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_127__1.txt b/packages/bolt/tests/snapshots/bolt__parse_127__1.txt index c3764c8d4..c1036edf9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_127__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_127__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - m = _mecha_helper_import_module('math') - _mecha_var0 = m - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'sin') - _mecha_var1 = 1 - _mecha_var0 = _mecha_var0(_mecha_var1) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_import_module = _bolt_runtime.helpers['import_module'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + m = _bolt_helper_import_module('math') + _bolt_var0 = m + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'sin') + _bolt_var1 = 1 + _bolt_var0 = _bolt_var0(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=26, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt index 6ccd382d1..9fcf2d19a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - thing = _mecha_runtime.from_module_import('demo:foo', 'thing') - _mecha_var0 = thing - _mecha_var0 = _mecha_helper_interpolate_message(_mecha_var0, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var0]))) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1, 7], [1, 2] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + thing = _bolt_runtime.from_module_import('demo:foo', 'thing') + _bolt_var0 = thing + _bolt_var0 = _bolt_helper_interpolate_message(_bolt_var0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var0]))) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=36, lineno=2, colno=10) @@ -20,14 +20,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=27, lineno=2, colno=1) end_location: SourceLocation(pos=36, lineno=2, colno=10) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__1.txt b/packages/bolt/tests/snapshots/bolt__parse_129__1.txt index 60a562a65..edf65398a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_129__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_129__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1, 6], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: +_bolt_lineno = [1, 6], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: def f(): - a, b, c = _mecha_runtime.from_module_import('demo:foo', 'a', 'b', 'c') - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var1 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var0)) + a, b, c = _bolt_runtime.from_module_import('demo:foo', 'a', 'b', 'c') + _bolt_runtime.commands.append(_bolt_refs[0]) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) --- -output = _mecha_var1 +output = _bolt_var1 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=40, lineno=3, colno=1) end_location: SourceLocation(pos=45, lineno=3, colno=6) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=45, lineno=3, colno=6) diff --git a/packages/bolt/tests/snapshots/bolt__parse_12__1.txt b/packages/bolt/tests/snapshots/bolt__parse_12__1.txt index 8e049fb3d..77193a30f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_12__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_12__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 64 - _mecha_var0 = - _mecha_var0 - _mecha_var0 = - _mecha_var0 - _mecha_var0 = - _mecha_var0 - _mecha_var1 = 64 - _mecha_var1 = + _mecha_var1 - _mecha_var1 = + _mecha_var1 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 64 + _bolt_var0 = - _bolt_var0 + _bolt_var0 = - _bolt_var0 + _bolt_var0 = - _bolt_var0 + _bolt_var1 = 64 + _bolt_var1 = + _bolt_var1 + _bolt_var1 = + _bolt_var1 + _bolt_var0 = _bolt_var0 + _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_130__1.txt b/packages/bolt/tests/snapshots/bolt__parse_130__1.txt index db07ead93..9d8f90ce4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_130__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_130__1.txt @@ -1,57 +1,57 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = True - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[10], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_refs[7], _mecha_refs[8], _mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var1))]))]))]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[11], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = True + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[10], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_refs[6], _bolt_refs[7], _bolt_refs[8], _bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var1))]))]))]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[11], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=72, lineno=3, colno=9) end_location: SourceLocation(pos=78, lineno=3, colno=15) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=97, lineno=5, colno=9) end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=55, lineno=2, colno=5) end_location: SourceLocation(pos=103, lineno=5, colno=15) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=55, lineno=2, colno=5) end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:commands' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=38, lineno=1, colno=39) end_location: SourceLocation(pos=49, lineno=1, colno=50) variable: 'p' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=103, lineno=5, colno=15) @@ -59,25 +59,25 @@ _mecha_refs[5] arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) variable: 's' arguments: -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=27, lineno=1, colno=28) min: 1 max: None -_mecha_refs[9] +_bolt_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=103, lineno=5, colno=15) @@ -87,14 +87,14 @@ _mecha_refs[9] -_mecha_refs[10] +_bolt_refs[10] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=103, lineno=5, colno=15) identifier: 'execute:subcommand' arguments: -_mecha_refs[11] +_bolt_refs[11] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=103, lineno=5, colno=15) diff --git a/packages/bolt/tests/snapshots/bolt__parse_132__1.txt b/packages/bolt/tests/snapshots/bolt__parse_132__1.txt index c97de844b..307ea3d32 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_132__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_132__1.txt @@ -1,63 +1,63 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var1 = 2 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = 3 + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[2].commands) + _bolt_var2 = _bolt_helper_operator_not(_bolt_var2) + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = 4 + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[3].commands) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=28, lineno=4, colno=5) end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=46, lineno=6, colno=5) end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=64, lineno=8, colno=5) end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=69, lineno=8, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_133__1.txt b/packages/bolt/tests/snapshots/bolt__parse_133__1.txt index 29692703a..76557fe9d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_133__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_133__1.txt @@ -1,71 +1,71 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - _mecha_runtime.commands.append(_mecha_refs[4]) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var1 = 2 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = 3 + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[2].commands) + _bolt_var2 = _bolt_helper_operator_not(_bolt_var2) + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = 4 + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[3].commands) + _bolt_runtime.commands.append(_bolt_refs[4]) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=28, lineno=4, colno=5) end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=46, lineno=6, colno=5) end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=64, lineno=8, colno=5) end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=70, lineno=9, colno=1) end_location: SourceLocation(pos=78, lineno=9, colno=9) identifier: 'say:message' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=78, lineno=9, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_134__1.txt b/packages/bolt/tests/snapshots/bolt__parse_134__1.txt index 998a03f66..4196e640f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_134__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_134__1.txt @@ -1,73 +1,73 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[4].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var1 = 2 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = 3 + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[2].commands) + _bolt_var2 = _bolt_helper_operator_not(_bolt_var2) + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = 4 + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[3].commands) + _bolt_var3 = _bolt_helper_operator_not(_bolt_var3) + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[4].commands) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=28, lineno=4, colno=5) end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=46, lineno=6, colno=5) end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=64, lineno=8, colno=5) end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=80, lineno=10, colno=5) end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=89, lineno=10, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_135__1.txt b/packages/bolt/tests/snapshots/bolt__parse_135__1.txt index ba16caa66..8eaf35b7b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_135__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_135__1.txt @@ -1,81 +1,81 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 4 - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[3].commands) - _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[4].commands) - _mecha_runtime.commands.append(_mecha_refs[5]) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var1 = 2 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = 3 + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[2].commands) + _bolt_var2 = _bolt_helper_operator_not(_bolt_var2) + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = 4 + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[3].commands) + _bolt_var3 = _bolt_helper_operator_not(_bolt_var3) + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[4].commands) + _bolt_runtime.commands.append(_bolt_refs[5]) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=15, lineno=2, colno=10) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=28, lineno=4, colno=5) end_location: SourceLocation(pos=33, lineno=4, colno=10) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=46, lineno=6, colno=5) end_location: SourceLocation(pos=51, lineno=6, colno=10) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=64, lineno=8, colno=5) end_location: SourceLocation(pos=69, lineno=8, colno=10) commands: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=80, lineno=10, colno=5) end_location: SourceLocation(pos=89, lineno=10, colno=14) commands: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=90, lineno=11, colno=1) end_location: SourceLocation(pos=98, lineno=11, colno=9) identifier: 'say:message' arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=98, lineno=11, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_138__1.txt b/packages/bolt/tests/snapshots/bolt__parse_138__1.txt index c91df75e6..91517470d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_138__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_138__1.txt @@ -1,24 +1,24 @@ -_mecha_lineno = [1], [1] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = True - while _mecha_var0: - _mecha_var1 = 'hello' - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: +_bolt_lineno = [1], [1] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = True + while _bolt_var0: + _bolt_var1 = 'hello' + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: pass - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: break -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=65, lineno=6, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt index b4ec9fda4..529768017 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt @@ -1,50 +1,50 @@ -_mecha_lineno = [1, 15, 19, 25, 35], [1, 2, 3, 4, 6] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_interpolate_range = _mecha_runtime.helpers['interpolate_range'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -with _mecha_runtime.scope() as _mecha_var10: - _mecha_var0 = generate_tree - _mecha_var1 = 'abcdefghijklmnopqrstuvwxyz0123456789' - _mecha_var0 = _mecha_var0(_mecha_var1) - for node in _mecha_var0: - _mecha_var2 = node - _mecha_var2 = _mecha_helper_get_attribute(_mecha_var2, 'parent') - _mecha_var2 = _mecha_helper_interpolate_resource_location(_mecha_var2, _mecha_refs[0]) - with _mecha_runtime.scope() as _mecha_var9: - _mecha_var3 = node - _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'partition') - _mecha_var4 = 5 - _mecha_var3 = _mecha_var3(_mecha_var4) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_var5 = node - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'range') - _mecha_var5 = _mecha_helper_interpolate_range(_mecha_var5, _mecha_refs[1]) - _mecha_var6 = node - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'children') - _mecha_var6 = _mecha_helper_interpolate_resource_location(_mecha_var6, _mecha_refs[4]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[2], _mecha_refs[3], _mecha_var5, _mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var6]))]))]))]))) - _mecha_var3 = _mecha_helper_operator_not(_mecha_var3) - with _mecha_helper_branch(_mecha_var3) as _mecha_condition: - if _mecha_condition: - _mecha_var7 = node - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'range') - _mecha_var7 = _mecha_helper_interpolate_range(_mecha_var7, _mecha_refs[9]) - _mecha_var8 = node - _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'value') - _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[12]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[16], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[15], arguments=_mecha_helper_children([_mecha_refs[10], _mecha_refs[11], _mecha_var7, _mecha_helper_replace(_mecha_refs[14], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[13], arguments=_mecha_helper_children([_mecha_var8]))]))]))]))) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[18], arguments=_mecha_helper_children([_mecha_var2, _mecha_helper_replace(_mecha_refs[17], commands=_mecha_helper_children(_mecha_var9))]))) -_mecha_var11 = _mecha_helper_replace(_mecha_refs[19], commands=_mecha_helper_children(_mecha_var10)) +_bolt_lineno = [1, 15, 19, 25, 35], [1, 2, 3, 4, 6] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_interpolate_range = _bolt_runtime.helpers['interpolate_range'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +with _bolt_runtime.scope() as _bolt_var10: + _bolt_var0 = generate_tree + _bolt_var1 = 'abcdefghijklmnopqrstuvwxyz0123456789' + _bolt_var0 = _bolt_var0(_bolt_var1) + for node in _bolt_var0: + _bolt_var2 = node + _bolt_var2 = _bolt_helper_get_attribute(_bolt_var2, 'parent') + _bolt_var2 = _bolt_helper_interpolate_resource_location(_bolt_var2, _bolt_refs[0]) + with _bolt_runtime.scope() as _bolt_var9: + _bolt_var3 = node + _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'partition') + _bolt_var4 = 5 + _bolt_var3 = _bolt_var3(_bolt_var4) + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_var5 = node + _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'range') + _bolt_var5 = _bolt_helper_interpolate_range(_bolt_var5, _bolt_refs[1]) + _bolt_var6 = node + _bolt_var6 = _bolt_helper_get_attribute(_bolt_var6, 'children') + _bolt_var6 = _bolt_helper_interpolate_resource_location(_bolt_var6, _bolt_refs[4]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[2], _bolt_refs[3], _bolt_var5, _bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var6]))]))]))]))) + _bolt_var3 = _bolt_helper_operator_not(_bolt_var3) + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + _bolt_var7 = node + _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'range') + _bolt_var7 = _bolt_helper_interpolate_range(_bolt_var7, _bolt_refs[9]) + _bolt_var8 = node + _bolt_var8 = _bolt_helper_get_attribute(_bolt_var8, 'value') + _bolt_var8 = _bolt_helper_interpolate_message(_bolt_var8, _bolt_refs[12]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[16], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[15], arguments=_bolt_helper_children([_bolt_refs[10], _bolt_refs[11], _bolt_var7, _bolt_helper_replace(_bolt_refs[14], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[13], arguments=_bolt_helper_children([_bolt_var8]))]))]))]))) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[18], arguments=_bolt_helper_children([_bolt_var2, _bolt_helper_replace(_bolt_refs[17], commands=_bolt_helper_children(_bolt_var9))]))) +_bolt_var11 = _bolt_helper_replace(_bolt_refs[19], commands=_bolt_helper_children(_bolt_var10)) --- -output = _mecha_var11 +output = _bolt_var11 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=87, lineno=2, colno=21) end_location: SourceLocation(pos=98, lineno=2, colno=32) @@ -53,7 +53,7 @@ _mecha_refs[0] converter: 'resource_location' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=169, lineno=4, colno=40) end_location: SourceLocation(pos=179, lineno=4, colno=50) @@ -62,19 +62,19 @@ _mecha_refs[1] converter: 'range' value: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=151, lineno=4, colno=22) end_location: SourceLocation(pos=153, lineno=4, colno=24) variable: 's' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=154, lineno=4, colno=25) end_location: SourceLocation(pos=160, lineno=4, colno=31) value: 'thingy' -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=189, lineno=4, colno=60) end_location: SourceLocation(pos=202, lineno=4, colno=73) @@ -83,21 +83,21 @@ _mecha_refs[4] converter: 'resource_location' value: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=180, lineno=4, colno=51) end_location: SourceLocation(pos=202, lineno=4, colno=73) identifier: 'function:name' arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=180, lineno=4, colno=51) end_location: SourceLocation(pos=202, lineno=4, colno=73) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=142, lineno=4, colno=13) end_location: SourceLocation(pos=202, lineno=4, colno=73) @@ -107,14 +107,14 @@ _mecha_refs[7] -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=142, lineno=4, colno=13) end_location: SourceLocation(pos=202, lineno=4, colno=73) identifier: 'execute:subcommand' arguments: -_mecha_refs[9] +_bolt_refs[9] location: SourceLocation(pos=256, lineno=6, colno=40) end_location: SourceLocation(pos=266, lineno=6, colno=50) @@ -123,19 +123,19 @@ _mecha_refs[9] converter: 'range' value: -_mecha_refs[10] +_bolt_refs[10] location: SourceLocation(pos=238, lineno=6, colno=22) end_location: SourceLocation(pos=240, lineno=6, colno=24) variable: 's' arguments: -_mecha_refs[11] +_bolt_refs[11] location: SourceLocation(pos=241, lineno=6, colno=25) end_location: SourceLocation(pos=247, lineno=6, colno=31) value: 'thingy' -_mecha_refs[12] +_bolt_refs[12] location: SourceLocation(pos=271, lineno=6, colno=55) end_location: SourceLocation(pos=281, lineno=6, colno=65) @@ -144,21 +144,21 @@ _mecha_refs[12] converter: 'message' value: -_mecha_refs[13] +_bolt_refs[13] location: SourceLocation(pos=267, lineno=6, colno=51) end_location: SourceLocation(pos=281, lineno=6, colno=65) identifier: 'say:message' arguments: -_mecha_refs[14] +_bolt_refs[14] location: SourceLocation(pos=267, lineno=6, colno=51) end_location: SourceLocation(pos=281, lineno=6, colno=65) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[15] +_bolt_refs[15] location: SourceLocation(pos=229, lineno=6, colno=13) end_location: SourceLocation(pos=281, lineno=6, colno=65) @@ -168,21 +168,21 @@ _mecha_refs[15] -_mecha_refs[16] +_bolt_refs[16] location: SourceLocation(pos=229, lineno=6, colno=13) end_location: SourceLocation(pos=281, lineno=6, colno=65) identifier: 'execute:subcommand' arguments: -_mecha_refs[17] +_bolt_refs[17] location: SourceLocation(pos=108, lineno=3, colno=9) end_location: SourceLocation(pos=281, lineno=6, colno=65) commands: -_mecha_refs[18] +_bolt_refs[18] location: SourceLocation(pos=71, lineno=2, colno=5) end_location: SourceLocation(pos=281, lineno=6, colno=65) @@ -190,7 +190,7 @@ _mecha_refs[18] arguments: -_mecha_refs[19] +_bolt_refs[19] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=282, lineno=7, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_13__1.txt b/packages/bolt/tests/snapshots/bolt__parse_13__1.txt index f7a6a242b..3a8264def 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_13__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_13__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 * _mecha_var1 - _mecha_var2 = 3 - _mecha_var0 = _mecha_var0 / _mecha_var2 - _mecha_var3 = 4 - _mecha_var0 = _mecha_var0 * _mecha_var3 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var0 = _bolt_var0 * _bolt_var1 + _bolt_var2 = 3 + _bolt_var0 = _bolt_var0 / _bolt_var2 + _bolt_var3 = 4 + _bolt_var0 = _bolt_var0 * _bolt_var3 +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_140__1.txt b/packages/bolt/tests/snapshots/bolt__parse_140__1.txt index c401e17d6..8e47e100f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_140__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_140__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = print - _mecha_var1 = ctx - _mecha_var1 = _mecha_helper_get_attribute(_mecha_var1, 'directory') - _mecha_var2 = __name__ - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = print + _bolt_var1 = ctx + _bolt_var1 = _bolt_helper_get_attribute(_bolt_var1, 'directory') + _bolt_var2 = __name__ + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_141__1.txt b/packages/bolt/tests/snapshots/bolt__parse_141__1.txt index fb376c2e6..d5f7f063a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_141__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_141__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_coordinate(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], x=_mecha_var1), _mecha_refs[2]]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_coordinate = _bolt_runtime.helpers['interpolate_coordinate'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + a = _bolt_var0 + _bolt_var1 = a + _bolt_var1 = _bolt_helper_interpolate_coordinate(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], x=_bolt_var1), _bolt_refs[2]]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=15, lineno=2, colno=10) end_location: SourceLocation(pos=16, lineno=2, colno=11) @@ -21,7 +21,7 @@ _mecha_refs[0] converter: 'coordinate' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=15, lineno=2, colno=10) end_location: SourceLocation(pos=20, lineno=2, colno=15) @@ -31,7 +31,7 @@ _mecha_refs[1] z: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=21, lineno=2, colno=16) end_location: SourceLocation(pos=26, lineno=2, colno=21) @@ -40,7 +40,7 @@ _mecha_refs[2] block_states: data_tags: None -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=26, lineno=2, colno=21) @@ -48,7 +48,7 @@ _mecha_refs[3] arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=26, lineno=2, colno=21) diff --git a/packages/bolt/tests/snapshots/bolt__parse_142__1.txt b/packages/bolt/tests/snapshots/bolt__parse_142__1.txt index a0db7c793..3c73d566c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_142__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_142__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_vec3 = _mecha_runtime.helpers['interpolate_vec3'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '1 2 3' - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_vec3(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var1, _mecha_refs[1]]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_vec3 = _bolt_runtime.helpers['interpolate_vec3'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = '1 2 3' + a = _bolt_var0 + _bolt_var1 = a + _bolt_var1 = _bolt_helper_interpolate_vec3(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var1, _bolt_refs[1]]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=21, lineno=2, colno=10) end_location: SourceLocation(pos=22, lineno=2, colno=11) @@ -21,7 +21,7 @@ _mecha_refs[0] converter: 'vec3' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=23, lineno=2, colno=12) end_location: SourceLocation(pos=28, lineno=2, colno=17) @@ -30,7 +30,7 @@ _mecha_refs[1] block_states: data_tags: None -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=12, lineno=2, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=17) @@ -38,7 +38,7 @@ _mecha_refs[2] arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=17) diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt index 2cf1677d8..0a91f50d9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var2 = '^{}'.format(_mecha_var1) - _mecha_var2 = _mecha_helper_interpolate_coordinate(_mecha_var2, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], y=_mecha_var2), _mecha_refs[2], _mecha_refs[3]]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_coordinate = _bolt_runtime.helpers['interpolate_coordinate'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + a = _bolt_var0 + _bolt_var1 = a + _bolt_var2 = '^{}'.format(_bolt_var1) + _bolt_var2 = _bolt_helper_interpolate_coordinate(_bolt_var2, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], y=_bolt_var2), _bolt_refs[2], _bolt_refs[3]]))]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=17, lineno=2, colno=12) end_location: SourceLocation(pos=24, lineno=2, colno=19) @@ -22,7 +22,7 @@ _mecha_refs[0] converter: 'coordinate' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=15, lineno=2, colno=10) end_location: SourceLocation(pos=26, lineno=2, colno=21) @@ -32,7 +32,7 @@ _mecha_refs[1] z: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=27, lineno=2, colno=22) end_location: SourceLocation(pos=34, lineno=2, colno=29) @@ -41,14 +41,14 @@ _mecha_refs[2] block_states: data_tags: None -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=35, lineno=2, colno=30) end_location: SourceLocation(pos=41, lineno=2, colno=36) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) @@ -57,14 +57,14 @@ _mecha_refs[4] -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) identifier: 'execute:subcommand' arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) diff --git a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt index 9786ea663..3d984038d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1], [1] -_mecha_helper_interpolate_vec3 = _mecha_runtime.helpers['interpolate_vec3'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = '~' - _mecha_var1 = '~' - _mecha_var2 = '~' - _mecha_var3 = (_mecha_var0,_mecha_var1,_mecha_var2,) - _mecha_var3 = _mecha_helper_interpolate_vec3(_mecha_var3, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var3, _mecha_refs[1], _mecha_refs[2]]))]))) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_interpolate_vec3 = _bolt_runtime.helpers['interpolate_vec3'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = '~' + _bolt_var1 = '~' + _bolt_var2 = '~' + _bolt_var3 = (_bolt_var0,_bolt_var1,_bolt_var2,) + _bolt_var3 = _bolt_helper_interpolate_vec3(_bolt_var3, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_var3, _bolt_refs[1], _bolt_refs[2]]))]))) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=24, lineno=1, colno=25) @@ -22,7 +22,7 @@ _mecha_refs[0] converter: 'vec3' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=25, lineno=1, colno=26) end_location: SourceLocation(pos=32, lineno=1, colno=33) @@ -31,14 +31,14 @@ _mecha_refs[1] block_states: data_tags: None -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=33, lineno=1, colno=34) end_location: SourceLocation(pos=39, lineno=1, colno=40) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=1, colno=40) @@ -47,14 +47,14 @@ _mecha_refs[3] -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=1, colno=40) identifier: 'execute:subcommand' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=39, lineno=1, colno=40) diff --git a/packages/bolt/tests/snapshots/bolt__parse_145__1.txt b/packages/bolt/tests/snapshots/bolt__parse_145__1.txt index 557eac19d..c380f54e7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_145__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_145__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = [] - _mecha_var0 = _mecha_var0[:] - a = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = [] + _bolt_var0 = _bolt_var0[:] + a = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_14__1.txt b/packages/bolt/tests/snapshots/bolt__parse_14__1.txt index 021b75428..b7c79c3c0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_14__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_14__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 * _mecha_var1 - _mecha_var2 = 3 - _mecha_var3 = 4 - _mecha_var2 = _mecha_var2 * _mecha_var3 - _mecha_var0 = _mecha_var0 / _mecha_var2 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var0 = _bolt_var0 * _bolt_var1 + _bolt_var2 = 3 + _bolt_var3 = 4 + _bolt_var2 = _bolt_var2 * _bolt_var3 + _bolt_var0 = _bolt_var0 / _bolt_var2 +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=16, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_150__1.txt b/packages/bolt/tests/snapshots/bolt__parse_150__1.txt index 8b48fe72c..6cf1b253a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_150__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_150__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: def f(): pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 2 - _mecha_var3 = 3 - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, thing=_mecha_var3) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) + _bolt_var0 = f + _bolt_var1 = 1 + _bolt_var2 = 2 + _bolt_var3 = 3 + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2, thing=_bolt_var3) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=35, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_151__1.txt b/packages/bolt/tests/snapshots/bolt__parse_151__1.txt index d1a201631..6a3d6923c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_151__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_151__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var6: def f(): pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 2 - _mecha_var3 = 'thing' - _mecha_var4 = 3 - _mecha_var5 = {_mecha_var3: _mecha_var4} - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, **_mecha_var5) -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) + _bolt_var0 = f + _bolt_var1 = 1 + _bolt_var2 = 2 + _bolt_var3 = 'thing' + _bolt_var4 = 3 + _bolt_var5 = {_bolt_var3: _bolt_var4} + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2, **_bolt_var5) +_bolt_var7 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var6)) --- -output = _mecha_var7 +output = _bolt_var7 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=42, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_152__1.txt b/packages/bolt/tests/snapshots/bolt__parse_152__1.txt index 2b1e101d1..1083346ab 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_152__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_152__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var6: def f(): pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 4 - _mecha_var3 = [_mecha_var2] - _mecha_var4 = 2 - _mecha_var5 = 3 - _mecha_var0 = _mecha_var0(_mecha_var1, *_mecha_var3, _mecha_var4, thing=_mecha_var5) -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) + _bolt_var0 = f + _bolt_var1 = 1 + _bolt_var2 = 4 + _bolt_var3 = [_bolt_var2] + _bolt_var4 = 2 + _bolt_var5 = 3 + _bolt_var0 = _bolt_var0(_bolt_var1, *_bolt_var3, _bolt_var4, thing=_bolt_var5) +_bolt_var7 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var6)) --- -output = _mecha_var7 +output = _bolt_var7 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=41, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_153__1.txt b/packages/bolt/tests/snapshots/bolt__parse_153__1.txt index 1ebbd0fb6..936dcce79 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_153__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_153__1.txt @@ -1,23 +1,23 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var8: def f(): pass - _mecha_var0 = f - _mecha_var1 = 1 - _mecha_var2 = 4 - _mecha_var3 = [_mecha_var2] - _mecha_var4 = 2 - _mecha_var5 = 'thing' - _mecha_var6 = 3 - _mecha_var7 = {_mecha_var5: _mecha_var6} - _mecha_var0 = _mecha_var0(_mecha_var1, *_mecha_var3, _mecha_var4, **_mecha_var7) -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) + _bolt_var0 = f + _bolt_var1 = 1 + _bolt_var2 = 4 + _bolt_var3 = [_bolt_var2] + _bolt_var4 = 2 + _bolt_var5 = 'thing' + _bolt_var6 = 3 + _bolt_var7 = {_bolt_var5: _bolt_var6} + _bolt_var0 = _bolt_var0(_bolt_var1, *_bolt_var3, _bolt_var4, **_bolt_var7) +_bolt_var9 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var8)) --- -output = _mecha_var9 +output = _bolt_var9 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=48, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_154__1.txt b/packages/bolt/tests/snapshots/bolt__parse_154__1.txt index 7970ac5c7..8e3362698 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_154__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_154__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'abc' - _mecha_var1 = [*_mecha_var0] -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'abc' + _bolt_var1 = [*_bolt_var0] +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_156__1.txt b/packages/bolt/tests/snapshots/bolt__parse_156__1.txt index db993d543..263bca944 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_156__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_156__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - _mecha_var1 = 1 - _mecha_var2 = {_mecha_var0: _mecha_var1} - _mecha_var3 = {**_mecha_var2} -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + _bolt_var1 = 1 + _bolt_var2 = {_bolt_var0: _bolt_var1} + _bolt_var3 = {**_bolt_var2} +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_15__1.txt b/packages/bolt/tests/snapshots/bolt__parse_15__1.txt index 93ed1347a..0eabbb5b4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_15__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_15__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 16 - _mecha_var1 = 5 - _mecha_var0 = _mecha_var0 // _mecha_var1 - _mecha_var2 = 7 - _mecha_var0 = _mecha_var0 % _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 16 + _bolt_var1 = 5 + _bolt_var0 = _bolt_var0 // _bolt_var1 + _bolt_var2 = 7 + _bolt_var0 = _bolt_var0 % _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_160__1.txt b/packages/bolt/tests/snapshots/bolt__parse_160__1.txt index dc1bc0ceb..a65777286 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_160__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_160__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1, 6], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: +_bolt_lineno = [1, 6], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: def f(): - _mecha_var0 = {} - _mecha_var1 = f - _mecha_var1.data = _mecha_var0 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) + _bolt_var0 = {} + _bolt_var1 = f + _bolt_var1.data = _bolt_var0 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=2, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_161__1.txt b/packages/bolt/tests/snapshots/bolt__parse_161__1.txt index d23ae66aa..c7122f138 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_161__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_161__1.txt @@ -1,24 +1,24 @@ -_mecha_lineno = [1, 7, 12], [1, 2, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: - _mecha_var0 = {} - d = _mecha_var0 - _mecha_var1 = {} - _mecha_var2 = d - _mecha_var3 = 1 - _mecha_var2[_mecha_var3] = _mecha_var1 - _mecha_var4 = 'foo' - _mecha_var5 = d - _mecha_var6 = 1 - _mecha_var5 = _mecha_var5[_mecha_var6] - _mecha_var7 = 2 - _mecha_var5[_mecha_var7] = _mecha_var4 -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) +_bolt_lineno = [1, 7, 12], [1, 2, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var8: + _bolt_var0 = {} + d = _bolt_var0 + _bolt_var1 = {} + _bolt_var2 = d + _bolt_var3 = 1 + _bolt_var2[_bolt_var3] = _bolt_var1 + _bolt_var4 = 'foo' + _bolt_var5 = d + _bolt_var6 = 1 + _bolt_var5 = _bolt_var5[_bolt_var6] + _bolt_var7 = 2 + _bolt_var5[_bolt_var7] = _bolt_var4 +_bolt_var9 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var8)) --- -output = _mecha_var9 +output = _bolt_var9 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=33, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_162__1.txt b/packages/bolt/tests/snapshots/bolt__parse_162__1.txt index 227aa1ac1..5b7eb8f6f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_162__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_162__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 10], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 'foo' - _mecha_var1 = 1 - _mecha_var2 = {_mecha_var0: _mecha_var1} - d = _mecha_var2 - _mecha_var3 = 1 - _mecha_var4 = d - _mecha_var4.foo += _mecha_var3 -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) +_bolt_lineno = [1, 10], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 'foo' + _bolt_var1 = 1 + _bolt_var2 = {_bolt_var0: _bolt_var1} + d = _bolt_var2 + _bolt_var3 = 1 + _bolt_var4 = d + _bolt_var4.foo += _bolt_var3 +_bolt_var6 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=24, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_164__1.txt b/packages/bolt/tests/snapshots/bolt__parse_164__1.txt index 1f20b9f63..5e281bb4f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_164__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_164__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_scoreboard_slot = _mecha_runtime.helpers['interpolate_scoreboard_slot'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'red' - color = _mecha_var0 - _mecha_var1 = color - _mecha_var2 = 'sidebar.team.{}'.format(_mecha_var1) - _mecha_var2 = _mecha_helper_interpolate_scoreboard_slot(_mecha_var2, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var2, _mecha_refs[1]]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_scoreboard_slot = _bolt_runtime.helpers['interpolate_scoreboard_slot'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 'red' + color = _bolt_var0 + _bolt_var1 = color + _bolt_var2 = 'sidebar.team.{}'.format(_bolt_var1) + _bolt_var2 = _bolt_helper_interpolate_scoreboard_slot(_bolt_var2, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var2, _bolt_refs[1]]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=47, lineno=2, colno=34) end_location: SourceLocation(pos=70, lineno=2, colno=57) @@ -22,12 +22,12 @@ _mecha_refs[0] converter: 'scoreboard_slot' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=71, lineno=2, colno=58) end_location: SourceLocation(pos=86, lineno=2, colno=73) value: 'some_score_name' -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=86, lineno=2, colno=73) @@ -35,7 +35,7 @@ _mecha_refs[2] arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=87, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_165__1.txt b/packages/bolt/tests/snapshots/bolt__parse_165__1.txt index 1c08c3be6..30139b1e9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_165__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_165__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_scoreboard_slot = _mecha_runtime.helpers['interpolate_scoreboard_slot'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'sidebar.team.red' - my_team = _mecha_var0 - _mecha_var1 = my_team - _mecha_var1 = _mecha_helper_interpolate_scoreboard_slot(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_var1, _mecha_refs[1]]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_scoreboard_slot = _bolt_runtime.helpers['interpolate_scoreboard_slot'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'sidebar.team.red' + my_team = _bolt_var0 + _bolt_var1 = my_team + _bolt_var1 = _bolt_helper_interpolate_scoreboard_slot(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var1, _bolt_refs[1]]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=62, lineno=2, colno=34) end_location: SourceLocation(pos=69, lineno=2, colno=41) @@ -21,12 +21,12 @@ _mecha_refs[0] converter: 'scoreboard_slot' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=70, lineno=2, colno=42) end_location: SourceLocation(pos=85, lineno=2, colno=57) value: 'some_score_name' -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=29, lineno=2, colno=1) end_location: SourceLocation(pos=85, lineno=2, colno=57) @@ -34,7 +34,7 @@ _mecha_refs[2] arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=86, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_167__1.txt b/packages/bolt/tests/snapshots/bolt__parse_167__1.txt index 03b6eae7b..27fae4256 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_167__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_167__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'thing' - weapon = _mecha_var0 - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'thing' + weapon = _bolt_var0 + _bolt_runtime.commands.append(_bolt_refs[0]) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=17, lineno=2, colno=1) end_location: SourceLocation(pos=85, lineno=2, colno=69) @@ -19,7 +19,7 @@ _mecha_refs[0] -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=86, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__1.txt b/packages/bolt/tests/snapshots/bolt__parse_168__1.txt index 90099c8bf..8fd6ad127 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_168__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_168__1.txt @@ -1,27 +1,27 @@ -_mecha_lineno = [1, 13], [1, 2] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_item_slot = _mecha_runtime.helpers['interpolate_item_slot'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = 'offhand' - _mecha_var1 = 'weapon.offhand' - _mecha_var2 = 'mainhand' - _mecha_var3 = 'weapon.mainhand' - _mecha_var4 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3} - my_weapon = _mecha_var4 - _mecha_var5 = my_weapon - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'offhand') - _mecha_var5 = _mecha_helper_interpolate_item_slot(_mecha_var5, _mecha_refs[0]) - _mecha_var6 = my_weapon - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'mainhand') - _mecha_var6 = _mecha_helper_interpolate_item_slot(_mecha_var6, _mecha_refs[2]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var5, _mecha_refs[3], _mecha_var6]))) -_mecha_var8 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var7)) +_bolt_lineno = [1, 13], [1, 2] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_item_slot = _bolt_runtime.helpers['interpolate_item_slot'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var7: + _bolt_var0 = 'offhand' + _bolt_var1 = 'weapon.offhand' + _bolt_var2 = 'mainhand' + _bolt_var3 = 'weapon.mainhand' + _bolt_var4 = {_bolt_var0: _bolt_var1, _bolt_var2: _bolt_var3} + my_weapon = _bolt_var4 + _bolt_var5 = my_weapon + _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'offhand') + _bolt_var5 = _bolt_helper_interpolate_item_slot(_bolt_var5, _bolt_refs[0]) + _bolt_var6 = my_weapon + _bolt_var6 = _bolt_helper_get_attribute(_bolt_var6, 'mainhand') + _bolt_var6 = _bolt_helper_interpolate_item_slot(_bolt_var6, _bolt_refs[2]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var5, _bolt_refs[3], _bolt_var6]))) +_bolt_var8 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var7)) --- -output = _mecha_var8 +output = _bolt_var8 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=92, lineno=2, colno=24) end_location: SourceLocation(pos=109, lineno=2, colno=41) @@ -30,14 +30,14 @@ _mecha_refs[0] converter: 'item_slot' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=89, lineno=2, colno=21) end_location: SourceLocation(pos=91, lineno=2, colno=23) variable: 's' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=125, lineno=2, colno=57) end_location: SourceLocation(pos=143, lineno=2, colno=75) @@ -46,14 +46,14 @@ _mecha_refs[2] converter: 'item_slot' value: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=122, lineno=2, colno=54) end_location: SourceLocation(pos=124, lineno=2, colno=56) variable: 's' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=69, lineno=2, colno=1) end_location: SourceLocation(pos=143, lineno=2, colno=75) @@ -63,7 +63,7 @@ _mecha_refs[4] -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=144, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_169__1.txt b/packages/bolt/tests/snapshots/bolt__parse_169__1.txt index d09a9751a..31af3edb8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_169__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_169__1.txt @@ -1,24 +1,24 @@ -_mecha_lineno = [1, 12], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = list - _mecha_var1 = range - _mecha_var2 = 12 - _mecha_var1 = _mecha_var1(_mecha_var2) - _mecha_var0 = _mecha_var0(_mecha_var1) - numbers = _mecha_var0 - _mecha_var3 = numbers - _mecha_var4 = 3 - _mecha_var3 = _mecha_var3[_mecha_var4:] - _mecha_var3 = _mecha_helper_interpolate_message(_mecha_var3, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var3]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) +_bolt_lineno = [1, 12], [1, 2] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = list + _bolt_var1 = range + _bolt_var2 = 12 + _bolt_var1 = _bolt_var1(_bolt_var2) + _bolt_var0 = _bolt_var0(_bolt_var1) + numbers = _bolt_var0 + _bolt_var3 = numbers + _bolt_var4 = 3 + _bolt_var3 = _bolt_var3[_bolt_var4:] + _bolt_var3 = _bolt_helper_interpolate_message(_bolt_var3, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var3]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=30, lineno=2, colno=5) end_location: SourceLocation(pos=41, lineno=2, colno=16) @@ -27,14 +27,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=26, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=16) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=42, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_16__1.txt b/packages/bolt/tests/snapshots/bolt__parse_16__1.txt index a8770c60b..2f71408d9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_16__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_16__1.txt @@ -1,41 +1,41 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var14: - _mecha_var0 = 2 - _mecha_var1 = 3 - _mecha_var0 = _mecha_var0 ** _mecha_var1 - _mecha_var0 = - _mecha_var0 - _mecha_var2 = 4 - _mecha_var2 = + _mecha_var2 - _mecha_var3 = 5 - _mecha_var2 = _mecha_var2 * _mecha_var3 - _mecha_var4 = 6 - _mecha_var2 = _mecha_var2 // _mecha_var4 - _mecha_var5 = 7 - _mecha_var2 = _mecha_var2 / _mecha_var5 - _mecha_var6 = 9 - _mecha_var2 = _mecha_var2 % _mecha_var6 - _mecha_var0 = _mecha_var0 + _mecha_var2 - _mecha_var7 = 10 - _mecha_var0 = _mecha_var0 + _mecha_var7 - _mecha_var8 = 11 - _mecha_var0 = _mecha_var0 - _mecha_var8 - _mecha_var9 = 12 - _mecha_var0 = _mecha_var0 << _mecha_var9 - _mecha_var10 = 13 - _mecha_var0 = _mecha_var0 >> _mecha_var10 - _mecha_var11 = 14 - _mecha_var0 = _mecha_var0 & _mecha_var11 - _mecha_var12 = 15 - _mecha_var0 = _mecha_var0 ^ _mecha_var12 - _mecha_var13 = 16 - _mecha_var0 = _mecha_var0 | _mecha_var13 -_mecha_var15 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var14)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var14: + _bolt_var0 = 2 + _bolt_var1 = 3 + _bolt_var0 = _bolt_var0 ** _bolt_var1 + _bolt_var0 = - _bolt_var0 + _bolt_var2 = 4 + _bolt_var2 = + _bolt_var2 + _bolt_var3 = 5 + _bolt_var2 = _bolt_var2 * _bolt_var3 + _bolt_var4 = 6 + _bolt_var2 = _bolt_var2 // _bolt_var4 + _bolt_var5 = 7 + _bolt_var2 = _bolt_var2 / _bolt_var5 + _bolt_var6 = 9 + _bolt_var2 = _bolt_var2 % _bolt_var6 + _bolt_var0 = _bolt_var0 + _bolt_var2 + _bolt_var7 = 10 + _bolt_var0 = _bolt_var0 + _bolt_var7 + _bolt_var8 = 11 + _bolt_var0 = _bolt_var0 - _bolt_var8 + _bolt_var9 = 12 + _bolt_var0 = _bolt_var0 << _bolt_var9 + _bolt_var10 = 13 + _bolt_var0 = _bolt_var0 >> _bolt_var10 + _bolt_var11 = 14 + _bolt_var0 = _bolt_var0 & _bolt_var11 + _bolt_var12 = 15 + _bolt_var0 = _bolt_var0 ^ _bolt_var12 + _bolt_var13 = 16 + _bolt_var0 = _bolt_var0 | _bolt_var13 +_bolt_var15 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var14)) --- -output = _mecha_var15 +output = _bolt_var15 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=67, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_170__1.txt b/packages/bolt/tests/snapshots/bolt__parse_170__1.txt index 43206102d..62014a748 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_170__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_170__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - _mecha_var0 = list - _mecha_var1 = range - _mecha_var2 = 12 - _mecha_var1 = _mecha_var1(_mecha_var2) - _mecha_var0 = _mecha_var0(_mecha_var1) - numbers = _mecha_var0 - _mecha_var3 = [] - _mecha_var4 = numbers - _mecha_var5 = 3 - _mecha_var4[_mecha_var5:] = _mecha_var3 -_mecha_var7 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var6)) +_bolt_lineno = [1, 11], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var6: + _bolt_var0 = list + _bolt_var1 = range + _bolt_var2 = 12 + _bolt_var1 = _bolt_var1(_bolt_var2) + _bolt_var0 = _bolt_var0(_bolt_var1) + numbers = _bolt_var0 + _bolt_var3 = [] + _bolt_var4 = numbers + _bolt_var5 = 3 + _bolt_var4[_bolt_var5:] = _bolt_var3 +_bolt_var7 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var6)) --- -output = _mecha_var7 +output = _bolt_var7 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=43, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_171__1.txt b/packages/bolt/tests/snapshots/bolt__parse_171__1.txt index b5a9924e9..b0637f22c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_171__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_171__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = list - _mecha_var1 = range - _mecha_var2 = 12 - _mecha_var1 = _mecha_var1(_mecha_var2) - _mecha_var0 = _mecha_var0(_mecha_var1) - numbers = _mecha_var0 - _mecha_var3 = numbers - _mecha_var4 = 3 - del _mecha_var3[_mecha_var4:] -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) +_bolt_lineno = [1, 11], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = list + _bolt_var1 = range + _bolt_var2 = 12 + _bolt_var1 = _bolt_var1(_bolt_var2) + _bolt_var0 = _bolt_var0(_bolt_var1) + numbers = _bolt_var0 + _bolt_var3 = numbers + _bolt_var4 = 3 + del _bolt_var3[_bolt_var4:] +_bolt_var6 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=42, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt index 19f2f287b..4c9afae30 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt @@ -1,19 +1,19 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_nbt_path = _mecha_runtime.helpers['interpolate_nbt_path'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'aaa' - mykey = _mecha_var0 - _mecha_var1 = mykey - _mecha_var2 = 'some.{}.path{{my: "compound"}}'.format(_mecha_var1) - _mecha_var2 = _mecha_helper_interpolate_nbt_path(_mecha_var2, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var2, _mecha_refs[2]]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_nbt_path = _bolt_runtime.helpers['interpolate_nbt_path'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 'aaa' + mykey = _bolt_var0 + _bolt_var1 = mykey + _bolt_var2 = 'some.{}.path{{my: "compound"}}'.format(_bolt_var1) + _bolt_var2 = _bolt_helper_interpolate_nbt_path(_bolt_var2, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var2, _bolt_refs[2]]))]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=51, lineno=2, colno=38) end_location: SourceLocation(pos=89, lineno=2, colno=76) @@ -22,21 +22,21 @@ _mecha_refs[0] converter: 'nbt_path' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=30, lineno=2, colno=17) end_location: SourceLocation(pos=50, lineno=2, colno=37) is_tag: False namespace: 'some' path: 'path/to/storage' -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=90, lineno=2, colno=77) end_location: SourceLocation(pos=100, lineno=2, colno=87) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=100, lineno=2, colno=87) @@ -45,14 +45,14 @@ _mecha_refs[3] -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=100, lineno=2, colno=87) identifier: 'execute:subcommand' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=100, lineno=2, colno=87) diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt index d8e863425..40862e791 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_nbt_path = _mecha_runtime.helpers['interpolate_nbt_path'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' - mypath = _mecha_var0 - _mecha_var1 = mypath - _mecha_var1 = _mecha_helper_interpolate_nbt_path(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var1, _mecha_refs[2]]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_nbt_path = _bolt_runtime.helpers['interpolate_nbt_path'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' + mypath = _bolt_var0 + _bolt_var1 = mypath + _bolt_var1 = _bolt_helper_interpolate_nbt_path(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var1, _bolt_refs[2]]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=114, lineno=2, colno=39) end_location: SourceLocation(pos=120, lineno=2, colno=45) @@ -21,21 +21,21 @@ _mecha_refs[0] converter: 'nbt_path' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=92, lineno=2, colno=17) end_location: SourceLocation(pos=112, lineno=2, colno=37) is_tag: False namespace: 'some' path: 'path/to/storage' -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=122, lineno=2, colno=47) end_location: SourceLocation(pos=132, lineno=2, colno=57) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=76, lineno=2, colno=1) end_location: SourceLocation(pos=132, lineno=2, colno=57) @@ -44,14 +44,14 @@ _mecha_refs[3] -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=76, lineno=2, colno=1) end_location: SourceLocation(pos=132, lineno=2, colno=57) identifier: 'execute:subcommand' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=132, lineno=2, colno=57) diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt index 3b183d56b..013cd2888 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'creeper' - entity_type = _mecha_var0 - _mecha_var1 = entity_type - _mecha_var1 = _mecha_helper_interpolate_resource_location(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], value=_mecha_var1)])), _mecha_refs[3]]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'creeper' + entity_type = _bolt_var0 + _bolt_var1 = entity_type + _bolt_var1 = _bolt_helper_interpolate_resource_location(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1)])), _bolt_refs[3]]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=35, lineno=2, colno=12) end_location: SourceLocation(pos=46, lineno=2, colno=23) @@ -21,7 +21,7 @@ _mecha_refs[0] converter: 'resource_location' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=30, lineno=2, colno=7) end_location: SourceLocation(pos=46, lineno=2, colno=23) @@ -30,21 +30,21 @@ _mecha_refs[1] value: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=27, lineno=2, colno=4) end_location: SourceLocation(pos=47, lineno=2, colno=24) variable: 'e' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=48, lineno=2, colno=25) end_location: SourceLocation(pos=69, lineno=2, colno=46) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=24, lineno=2, colno=1) end_location: SourceLocation(pos=69, lineno=2, colno=46) @@ -52,14 +52,14 @@ _mecha_refs[4] arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=24, lineno=2, colno=1) end_location: SourceLocation(pos=69, lineno=2, colno=46) identifier: 'execute:subcommand' arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=69, lineno=2, colno=46) diff --git a/packages/bolt/tests/snapshots/bolt__parse_17__1.txt b/packages/bolt/tests/snapshots/bolt__parse_17__1.txt index 837eca3a9..2b83a0a4a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_17__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_17__1.txt @@ -1,208 +1,208 @@ -_mecha_lineno = [1], [1] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] -_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var47: - _mecha_var0 = False - _mecha_var1 = _mecha_helper_operator_not(_mecha_var0) - _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var2 is not None: - _mecha_var0 = _mecha_var2() - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = True - _mecha_var4 = _mecha_var3 - _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) - if _mecha_var5 is not None: - _mecha_var3 = _mecha_var5() - with _mecha_helper_branch(_mecha_var4) as _mecha_condition: - if _mecha_condition: - _mecha_var6 = 'hello' - if _mecha_var5 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) - _mecha_var3 = _mecha_var6 - if _mecha_rebind is not None: - _mecha_var3 = _mecha_rebind(_mecha_var3) +_bolt_lineno = [1], [1] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_get_dup = _bolt_runtime.helpers['get_dup'] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_operator_in = _bolt_runtime.helpers['operator_in'] +_bolt_helper_operator_not_in = _bolt_runtime.helpers['operator_not_in'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var47: + _bolt_var0 = False + _bolt_var1 = _bolt_helper_operator_not(_bolt_var0) + _bolt_var2 = _bolt_helper_get_dup(_bolt_var0) + if _bolt_var2 is not None: + _bolt_var0 = _bolt_var2() + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = True + _bolt_var4 = _bolt_var3 + _bolt_var5 = _bolt_helper_get_dup(_bolt_var3) + if _bolt_var5 is not None: + _bolt_var3 = _bolt_var5() + with _bolt_helper_branch(_bolt_var4) as _bolt_condition: + if _bolt_condition: + _bolt_var6 = 'hello' + if _bolt_var5 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var3) + _bolt_var3 = _bolt_var6 + if _bolt_rebind is not None: + _bolt_var3 = _bolt_rebind(_bolt_var3) else: - _mecha_var3 = _mecha_var6 - if _mecha_var2 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var3 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) + _bolt_var3 = _bolt_var6 + if _bolt_var2 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var0) + _bolt_var0 = _bolt_var3 + if _bolt_rebind is not None: + _bolt_var0 = _bolt_rebind(_bolt_var0) else: - _mecha_var0 = _mecha_var3 - _mecha_var7 = _mecha_helper_operator_not(_mecha_var0) - _mecha_var8 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var8 is not None: - _mecha_var0 = _mecha_var8() - with _mecha_helper_branch(_mecha_var7) as _mecha_condition: - if _mecha_condition: - _mecha_var9 = 'foo' - _mecha_var10 = 'bar' - _mecha_var9 = _mecha_var9 == _mecha_var10 - _mecha_var9 = _mecha_helper_operator_not(_mecha_var9) - if _mecha_var8 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var9 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) + _bolt_var0 = _bolt_var3 + _bolt_var7 = _bolt_helper_operator_not(_bolt_var0) + _bolt_var8 = _bolt_helper_get_dup(_bolt_var0) + if _bolt_var8 is not None: + _bolt_var0 = _bolt_var8() + with _bolt_helper_branch(_bolt_var7) as _bolt_condition: + if _bolt_condition: + _bolt_var9 = 'foo' + _bolt_var10 = 'bar' + _bolt_var9 = _bolt_var9 == _bolt_var10 + _bolt_var9 = _bolt_helper_operator_not(_bolt_var9) + if _bolt_var8 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var0) + _bolt_var0 = _bolt_var9 + if _bolt_rebind is not None: + _bolt_var0 = _bolt_rebind(_bolt_var0) else: - _mecha_var0 = _mecha_var9 - _mecha_var11 = _mecha_helper_operator_not(_mecha_var0) - _mecha_var12 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var12 is not None: - _mecha_var0 = _mecha_var12() - with _mecha_helper_branch(_mecha_var11) as _mecha_condition: - if _mecha_condition: - _mecha_var13 = 1 - _mecha_var14 = 2 - _mecha_var13 = _mecha_var13 != _mecha_var14 - _mecha_var15 = _mecha_var13 - _mecha_var16 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var16 is not None: - _mecha_var13 = _mecha_var16() - with _mecha_helper_branch(_mecha_var15) as _mecha_condition: - if _mecha_condition: - _mecha_var17 = 1 - _mecha_var18 = 2 - _mecha_var17 = _mecha_var17 < _mecha_var18 - if _mecha_var16 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var17 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var0 = _bolt_var9 + _bolt_var11 = _bolt_helper_operator_not(_bolt_var0) + _bolt_var12 = _bolt_helper_get_dup(_bolt_var0) + if _bolt_var12 is not None: + _bolt_var0 = _bolt_var12() + with _bolt_helper_branch(_bolt_var11) as _bolt_condition: + if _bolt_condition: + _bolt_var13 = 1 + _bolt_var14 = 2 + _bolt_var13 = _bolt_var13 != _bolt_var14 + _bolt_var15 = _bolt_var13 + _bolt_var16 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var16 is not None: + _bolt_var13 = _bolt_var16() + with _bolt_helper_branch(_bolt_var15) as _bolt_condition: + if _bolt_condition: + _bolt_var17 = 1 + _bolt_var18 = 2 + _bolt_var17 = _bolt_var17 < _bolt_var18 + if _bolt_var16 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var17 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var17 - _mecha_var19 = _mecha_var13 - _mecha_var20 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var20 is not None: - _mecha_var13 = _mecha_var20() - with _mecha_helper_branch(_mecha_var19) as _mecha_condition: - if _mecha_condition: - _mecha_var21 = 2 - _mecha_var22 = 3 - _mecha_var21 = _mecha_var21 <= _mecha_var22 - if _mecha_var20 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var21 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var17 + _bolt_var19 = _bolt_var13 + _bolt_var20 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var20 is not None: + _bolt_var13 = _bolt_var20() + with _bolt_helper_branch(_bolt_var19) as _bolt_condition: + if _bolt_condition: + _bolt_var21 = 2 + _bolt_var22 = 3 + _bolt_var21 = _bolt_var21 <= _bolt_var22 + if _bolt_var20 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var21 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var21 - _mecha_var23 = _mecha_var13 - _mecha_var24 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var24 is not None: - _mecha_var13 = _mecha_var24() - with _mecha_helper_branch(_mecha_var23) as _mecha_condition: - if _mecha_condition: - _mecha_var25 = 5 - _mecha_var26 = 4 - _mecha_var25 = _mecha_var25 > _mecha_var26 - if _mecha_var24 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var25 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var21 + _bolt_var23 = _bolt_var13 + _bolt_var24 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var24 is not None: + _bolt_var13 = _bolt_var24() + with _bolt_helper_branch(_bolt_var23) as _bolt_condition: + if _bolt_condition: + _bolt_var25 = 5 + _bolt_var26 = 4 + _bolt_var25 = _bolt_var25 > _bolt_var26 + if _bolt_var24 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var25 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var25 - _mecha_var27 = _mecha_var13 - _mecha_var28 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var28 is not None: - _mecha_var13 = _mecha_var28() - with _mecha_helper_branch(_mecha_var27) as _mecha_condition: - if _mecha_condition: - _mecha_var29 = 6 - _mecha_var30 = 5 - _mecha_var29 = _mecha_var29 >= _mecha_var30 - if _mecha_var28 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var29 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var25 + _bolt_var27 = _bolt_var13 + _bolt_var28 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var28 is not None: + _bolt_var13 = _bolt_var28() + with _bolt_helper_branch(_bolt_var27) as _bolt_condition: + if _bolt_condition: + _bolt_var29 = 6 + _bolt_var30 = 5 + _bolt_var29 = _bolt_var29 >= _bolt_var30 + if _bolt_var28 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var29 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var29 - _mecha_var31 = _mecha_var13 - _mecha_var32 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var32 is not None: - _mecha_var13 = _mecha_var32() - with _mecha_helper_branch(_mecha_var31) as _mecha_condition: - if _mecha_condition: - _mecha_var33 = 1 - _mecha_var34 = 1 - _mecha_var33 = _mecha_helper_operator_in(_mecha_var33, _mecha_var34) - if _mecha_var32 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var33 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var29 + _bolt_var31 = _bolt_var13 + _bolt_var32 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var32 is not None: + _bolt_var13 = _bolt_var32() + with _bolt_helper_branch(_bolt_var31) as _bolt_condition: + if _bolt_condition: + _bolt_var33 = 1 + _bolt_var34 = 1 + _bolt_var33 = _bolt_helper_operator_in(_bolt_var33, _bolt_var34) + if _bolt_var32 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var33 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var33 - _mecha_var35 = _mecha_var13 - _mecha_var36 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var36 is not None: - _mecha_var13 = _mecha_var36() - with _mecha_helper_branch(_mecha_var35) as _mecha_condition: - if _mecha_condition: - _mecha_var37 = 2 - _mecha_var38 = 2 - _mecha_var37 = _mecha_helper_operator_not_in(_mecha_var37, _mecha_var38) - if _mecha_var36 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var37 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var33 + _bolt_var35 = _bolt_var13 + _bolt_var36 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var36 is not None: + _bolt_var13 = _bolt_var36() + with _bolt_helper_branch(_bolt_var35) as _bolt_condition: + if _bolt_condition: + _bolt_var37 = 2 + _bolt_var38 = 2 + _bolt_var37 = _bolt_helper_operator_not_in(_bolt_var37, _bolt_var38) + if _bolt_var36 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var37 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var37 - _mecha_var39 = _mecha_var13 - _mecha_var40 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var40 is not None: - _mecha_var13 = _mecha_var40() - with _mecha_helper_branch(_mecha_var39) as _mecha_condition: - if _mecha_condition: - _mecha_var41 = 3 - _mecha_var42 = 3 - _mecha_var41 = _mecha_var41 is _mecha_var42 - if _mecha_var40 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var41 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var37 + _bolt_var39 = _bolt_var13 + _bolt_var40 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var40 is not None: + _bolt_var13 = _bolt_var40() + with _bolt_helper_branch(_bolt_var39) as _bolt_condition: + if _bolt_condition: + _bolt_var41 = 3 + _bolt_var42 = 3 + _bolt_var41 = _bolt_var41 is _bolt_var42 + if _bolt_var40 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var41 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var41 - _mecha_var43 = _mecha_var13 - _mecha_var44 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var44 is not None: - _mecha_var13 = _mecha_var44() - with _mecha_helper_branch(_mecha_var43) as _mecha_condition: - if _mecha_condition: - _mecha_var45 = 3 - _mecha_var46 = 3 - _mecha_var45 = _mecha_var45 is not _mecha_var46 - if _mecha_var44 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var45 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var13 = _bolt_var41 + _bolt_var43 = _bolt_var13 + _bolt_var44 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var44 is not None: + _bolt_var13 = _bolt_var44() + with _bolt_helper_branch(_bolt_var43) as _bolt_condition: + if _bolt_condition: + _bolt_var45 = 3 + _bolt_var46 = 3 + _bolt_var45 = _bolt_var45 is not _bolt_var46 + if _bolt_var44 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var45 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var45 - if _mecha_var12 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var13 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) + _bolt_var13 = _bolt_var45 + if _bolt_var12 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var0) + _bolt_var0 = _bolt_var13 + if _bolt_rebind is not None: + _bolt_var0 = _bolt_rebind(_bolt_var0) else: - _mecha_var0 = _mecha_var13 -_mecha_var48 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var47)) + _bolt_var0 = _bolt_var13 +_bolt_var48 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var47)) --- -output = _mecha_var48 +output = _bolt_var48 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=152, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_181__1.txt b/packages/bolt/tests/snapshots/bolt__parse_181__1.txt index 43a0076c6..ca7f42aa4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_181__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_181__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'demo:foo' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'demo:foo' +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_182__1.txt b/packages/bolt/tests/snapshots/bolt__parse_182__1.txt index 3237b20cf..202caf015 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_182__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_182__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'demo:foo/bar' - a = _mecha_var0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'demo:foo/bar' + a = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt index cdeca7087..2e11d9dd0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_coordinate = _mecha_runtime.helpers['interpolate_coordinate'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_coordinate(f'~{_mecha_var1}', _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], y=_mecha_var1), _mecha_refs[2]]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_coordinate = _bolt_runtime.helpers['interpolate_coordinate'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + a = _bolt_var0 + _bolt_var1 = a + _bolt_var1 = _bolt_helper_interpolate_coordinate(f'~{_bolt_var1}', _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], y=_bolt_var1), _bolt_refs[2]]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=19, lineno=2, colno=14) end_location: SourceLocation(pos=21, lineno=2, colno=16) @@ -21,7 +21,7 @@ _mecha_refs[0] converter: 'coordinate' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=17, lineno=2, colno=12) end_location: SourceLocation(pos=23, lineno=2, colno=18) @@ -31,14 +31,14 @@ _mecha_refs[1] z: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=24, lineno=2, colno=19) end_location: SourceLocation(pos=41, lineno=2, colno=36) identifier: 'execute:run:subcommand' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) @@ -46,14 +46,14 @@ _mecha_refs[3] arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) identifier: 'execute:subcommand' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) diff --git a/packages/bolt/tests/snapshots/bolt__parse_185__1.txt b/packages/bolt/tests/snapshots/bolt__parse_185__1.txt index 5d220c518..b82b1a2af 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_185__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_185__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'ab' - _mecha_unpack0, _mecha_unpack1 = _mecha_var0 - a = _mecha_unpack0 - b = _mecha_unpack1 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'ab' + _bolt_unpack0, _bolt_unpack1 = _bolt_var0 + a = _bolt_unpack0 + b = _bolt_unpack1 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_186__1.txt b/packages/bolt/tests/snapshots/bolt__parse_186__1.txt index 1dba090e4..0096ac879 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_186__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_186__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1, 10], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = enumerate - _mecha_var1 = 'abc' - _mecha_var0 = _mecha_var0(_mecha_var1) - for i, value in _mecha_var0: - _mecha_var2 = i - _mecha_var3 = value - _mecha_var4 = '{}: {}'.format(_mecha_var2, _mecha_var3) - _mecha_var4 = _mecha_helper_interpolate_message(_mecha_var4, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var4]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) +_bolt_lineno = [1, 10], [1, 2] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = enumerate + _bolt_var1 = 'abc' + _bolt_var0 = _bolt_var0(_bolt_var1) + for i, value in _bolt_var0: + _bolt_var2 = i + _bolt_var3 = value + _bolt_var4 = '{}: {}'.format(_bolt_var2, _bolt_var3) + _bolt_var4 = _bolt_helper_interpolate_message(_bolt_var4, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var4]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=42, lineno=2, colno=9) end_location: SourceLocation(pos=57, lineno=2, colno=24) @@ -25,14 +25,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=38, lineno=2, colno=5) end_location: SourceLocation(pos=57, lineno=2, colno=24) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=58, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__1.txt b/packages/bolt/tests/snapshots/bolt__parse_192__1.txt index fe6af37c6..1a27871b6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_192__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_192__1.txt @@ -1,31 +1,31 @@ -_mecha_lineno = [1, 10, 14, 15, 16, 18], [1, 2, 4, 5, 6, 7] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 0 - math = _mecha_var0 - _mecha_var1 = math - _mecha_var1 = _mecha_helper_interpolate_message(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) +_bolt_lineno = [1, 10, 14, 15, 16, 18], [1, 2, 4, 5, 6, 7] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_import_module = _bolt_runtime.helpers['import_module'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 0 + math = _bolt_var0 + _bolt_var1 = math + _bolt_var1 = _bolt_helper_interpolate_message(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) def wat(): global math - math = _mecha_helper_import_module('math') - _mecha_var2 = wat - _mecha_var2 = _mecha_var2() - _mecha_var3 = math - _mecha_var3 = _mecha_helper_get_attribute(_mecha_var3, 'ceil') - _mecha_var4 = 0.1 - _mecha_var3 = _mecha_var3(_mecha_var4) - _mecha_var3 = _mecha_helper_interpolate_message(_mecha_var3, _mecha_refs[2]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var3]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[4], commands=_mecha_helper_children(_mecha_var5)) + math = _bolt_helper_import_module('math') + _bolt_var2 = wat + _bolt_var2 = _bolt_var2() + _bolt_var3 = math + _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'ceil') + _bolt_var4 = 0.1 + _bolt_var3 = _bolt_var3(_bolt_var4) + _bolt_var3 = _bolt_helper_interpolate_message(_bolt_var3, _bolt_refs[2]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_var3]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) @@ -34,14 +34,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=9, lineno=2, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=9) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=71, lineno=7, colno=5) end_location: SourceLocation(pos=85, lineno=7, colno=19) @@ -50,14 +50,14 @@ _mecha_refs[2] converter: 'message' value: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=67, lineno=7, colno=1) end_location: SourceLocation(pos=85, lineno=7, colno=19) identifier: 'say:message' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=86, lineno=8, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt index 69a4d0712..b3b05b026 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt @@ -1,85 +1,85 @@ -_mecha_lineno = [1, 12, 16, 22, 32, 38, 40, 50, 55, 60, 64, 69, 73], [1, 2, 5, 6, 8, 9, 11, 13, 14, 15, 17, 18, 19] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_entity = _mecha_runtime.helpers['interpolate_entity'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_interpolate_numeric = _mecha_runtime.helpers['interpolate_numeric'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -with _mecha_runtime.scope() as _mecha_var26: +_bolt_lineno = [1, 12, 16, 22, 32, 38, 40, 50, 55, 60, 64, 69, 73], [1, 2, 5, 6, 8, 9, 11, 13, 14, 15, 17, 18, 19] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_entity = _bolt_runtime.helpers['interpolate_entity'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_interpolate_numeric = _bolt_runtime.helpers['interpolate_numeric'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +with _bolt_runtime.scope() as _bolt_var26: def init_global_score(self, name): - _mecha_var0 = name - _mecha_var1 = self - _mecha_var1.name = _mecha_var0 + _bolt_var0 = name + _bolt_var1 = self + _bolt_var1.name = _bolt_var0 def rebind_global_score(self, rhs): - _mecha_var2 = isinstance - _mecha_var3 = rhs - _mecha_var4 = GlobalScore - _mecha_var2 = _mecha_var2(_mecha_var3, _mecha_var4) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var5 = self - _mecha_var5 = _mecha_helper_get_attribute(_mecha_var5, 'name') - _mecha_var5 = _mecha_helper_interpolate_entity(_mecha_var5, _mecha_refs[0]) - _mecha_var6 = rhs - _mecha_var6 = _mecha_helper_get_attribute(_mecha_var6, 'name') - _mecha_var6 = _mecha_helper_interpolate_entity(_mecha_var6, _mecha_refs[1]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var5, _mecha_refs[2], _mecha_refs[3], _mecha_var6, _mecha_refs[4]]))) - _mecha_var2 = _mecha_helper_operator_not(_mecha_var2) - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var7 = self - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'name') - _mecha_var7 = _mecha_helper_interpolate_entity(_mecha_var7, _mecha_refs[6]) - _mecha_var8 = rhs - _mecha_var8 = _mecha_helper_interpolate_numeric(_mecha_var8, _mecha_refs[7]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[9], arguments=_mecha_helper_children([_mecha_var7, _mecha_refs[8], _mecha_var8]))) - _mecha_var9 = self - return _mecha_var9 - _mecha_var10 = type - _mecha_var11 = 'GlobalScore' - _mecha_var12 = () - _mecha_var13 = '__init__' - _mecha_var14 = init_global_score - _mecha_var15 = '__rebind__' - _mecha_var16 = rebind_global_score - _mecha_var17 = {_mecha_var13: _mecha_var14, _mecha_var15: _mecha_var16} - _mecha_var10 = _mecha_var10(_mecha_var11, _mecha_var12, _mecha_var17) - GlobalScore = _mecha_var10 - _mecha_var18 = GlobalScore - _mecha_var19 = 'a' - _mecha_var18 = _mecha_var18(_mecha_var19) - a = _mecha_var18 - _mecha_var20 = 123 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var20 - if _mecha_rebind is not None: - a = _mecha_rebind(a) - _mecha_var21 = 456 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var21 - if _mecha_rebind is not None: - a = _mecha_rebind(a) - _mecha_var22 = GlobalScore - _mecha_var23 = 'b' - _mecha_var22 = _mecha_var22(_mecha_var23) - b = _mecha_var22 - _mecha_var24 = 789 - _mecha_rebind = _mecha_helper_get_rebind(b) - b = _mecha_var24 - if _mecha_rebind is not None: - b = _mecha_rebind(b) - _mecha_var25 = a - _mecha_rebind = _mecha_helper_get_rebind(b) - b = _mecha_var25 - if _mecha_rebind is not None: - b = _mecha_rebind(b) -_mecha_var27 = _mecha_helper_replace(_mecha_refs[10], commands=_mecha_helper_children(_mecha_var26)) + _bolt_var2 = isinstance + _bolt_var3 = rhs + _bolt_var4 = GlobalScore + _bolt_var2 = _bolt_var2(_bolt_var3, _bolt_var4) + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var5 = self + _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'name') + _bolt_var5 = _bolt_helper_interpolate_entity(_bolt_var5, _bolt_refs[0]) + _bolt_var6 = rhs + _bolt_var6 = _bolt_helper_get_attribute(_bolt_var6, 'name') + _bolt_var6 = _bolt_helper_interpolate_entity(_bolt_var6, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var5, _bolt_refs[2], _bolt_refs[3], _bolt_var6, _bolt_refs[4]]))) + _bolt_var2 = _bolt_helper_operator_not(_bolt_var2) + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var7 = self + _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'name') + _bolt_var7 = _bolt_helper_interpolate_entity(_bolt_var7, _bolt_refs[6]) + _bolt_var8 = rhs + _bolt_var8 = _bolt_helper_interpolate_numeric(_bolt_var8, _bolt_refs[7]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_var7, _bolt_refs[8], _bolt_var8]))) + _bolt_var9 = self + return _bolt_var9 + _bolt_var10 = type + _bolt_var11 = 'GlobalScore' + _bolt_var12 = () + _bolt_var13 = '__init__' + _bolt_var14 = init_global_score + _bolt_var15 = '__rebind__' + _bolt_var16 = rebind_global_score + _bolt_var17 = {_bolt_var13: _bolt_var14, _bolt_var15: _bolt_var16} + _bolt_var10 = _bolt_var10(_bolt_var11, _bolt_var12, _bolt_var17) + GlobalScore = _bolt_var10 + _bolt_var18 = GlobalScore + _bolt_var19 = 'a' + _bolt_var18 = _bolt_var18(_bolt_var19) + a = _bolt_var18 + _bolt_var20 = 123 + _bolt_rebind = _bolt_helper_get_rebind(a) + a = _bolt_var20 + if _bolt_rebind is not None: + a = _bolt_rebind(a) + _bolt_var21 = 456 + _bolt_rebind = _bolt_helper_get_rebind(a) + a = _bolt_var21 + if _bolt_rebind is not None: + a = _bolt_rebind(a) + _bolt_var22 = GlobalScore + _bolt_var23 = 'b' + _bolt_var22 = _bolt_var22(_bolt_var23) + b = _bolt_var22 + _bolt_var24 = 789 + _bolt_rebind = _bolt_helper_get_rebind(b) + b = _bolt_var24 + if _bolt_rebind is not None: + b = _bolt_rebind(b) + _bolt_var25 = a + _bolt_rebind = _bolt_helper_get_rebind(b) + b = _bolt_var25 + if _bolt_rebind is not None: + b = _bolt_rebind(b) +_bolt_var27 = _bolt_helper_replace(_bolt_refs[10], commands=_bolt_helper_children(_bolt_var26)) --- -output = _mecha_var27 +output = _bolt_var27 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=167, lineno=6, colno=38) end_location: SourceLocation(pos=176, lineno=6, colno=47) @@ -88,7 +88,7 @@ _mecha_refs[0] converter: 'entity' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=186, lineno=6, colno=57) end_location: SourceLocation(pos=194, lineno=6, colno=65) @@ -97,22 +97,22 @@ _mecha_refs[1] converter: 'entity' value: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=177, lineno=6, colno=48) end_location: SourceLocation(pos=183, lineno=6, colno=54) value: 'global' -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=184, lineno=6, colno=55) end_location: SourceLocation(pos=185, lineno=6, colno=56) value: '=' -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=195, lineno=6, colno=66) end_location: SourceLocation(pos=201, lineno=6, colno=72) value: 'global' -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=138, lineno=6, colno=9) end_location: SourceLocation(pos=201, lineno=6, colno=72) @@ -123,7 +123,7 @@ _mecha_refs[5] -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=243, lineno=8, colno=32) end_location: SourceLocation(pos=252, lineno=8, colno=41) @@ -132,7 +132,7 @@ _mecha_refs[6] converter: 'entity' value: -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=260, lineno=8, colno=49) end_location: SourceLocation(pos=263, lineno=8, colno=52) @@ -141,12 +141,12 @@ _mecha_refs[7] converter: 'numeric' value: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=253, lineno=8, colno=42) end_location: SourceLocation(pos=259, lineno=8, colno=48) value: 'global' -_mecha_refs[9] +_bolt_refs[9] location: SourceLocation(pos=220, lineno=8, colno=9) end_location: SourceLocation(pos=263, lineno=8, colno=52) @@ -155,7 +155,7 @@ _mecha_refs[9] -_mecha_refs[10] +_bolt_refs[10] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=461, lineno=20, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt index fa0ea7a28..c099589bb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt @@ -1,53 +1,53 @@ -_mecha_lineno = [1, 14, 16, 20, 23, 26, 29, 34, 39], [1, 3, 4, 5, 6, 8, 9, 10, 11] -_mecha_helper_missing = _mecha_runtime.helpers['missing'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var11: - def Counter(x=_mecha_helper_missing): - if x is _mecha_helper_missing: - _mecha_var0 = 0 - x = _mecha_var0 +_bolt_lineno = [1, 14, 16, 20, 23, 26, 29, 34, 39], [1, 3, 4, 5, 6, 8, 9, 10, 11] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var11: + def Counter(x=_bolt_helper_missing): + if x is _bolt_helper_missing: + _bolt_var0 = 0 + x = _bolt_var0 def incr(): nonlocal x - _mecha_var1 = 1 - _mecha_rebind = _mecha_helper_get_rebind(x) - x += _mecha_var1 - if _mecha_rebind is not None: - x = _mecha_rebind(x) - _mecha_var2 = x - return _mecha_var2 - _mecha_var3 = 'incr' - _mecha_var4 = incr - _mecha_var5 = {_mecha_var3: _mecha_var4} - return _mecha_var5 - _mecha_var6 = Counter - _mecha_var6 = _mecha_var6() - counter = _mecha_var6 - _mecha_var7 = counter - _mecha_var7 = _mecha_helper_get_attribute(_mecha_var7, 'incr') - _mecha_var7 = _mecha_var7() - _mecha_var7 = _mecha_helper_interpolate_message(_mecha_var7, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var7]))) - _mecha_var8 = counter - _mecha_var8 = _mecha_helper_get_attribute(_mecha_var8, 'incr') - _mecha_var8 = _mecha_var8() - _mecha_var8 = _mecha_helper_interpolate_message(_mecha_var8, _mecha_refs[2]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_var8]))) - _mecha_var9 = Counter - _mecha_var10 = 9 - _mecha_var9 = _mecha_var9(_mecha_var10) - _mecha_var9 = _mecha_helper_get_attribute(_mecha_var9, 'incr') - _mecha_var9 = _mecha_var9() - _mecha_var9 = _mecha_helper_interpolate_message(_mecha_var9, _mecha_refs[4]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[5], arguments=_mecha_helper_children([_mecha_var9]))) -_mecha_var12 = _mecha_helper_replace(_mecha_refs[6], commands=_mecha_helper_children(_mecha_var11)) + _bolt_var1 = 1 + _bolt_rebind = _bolt_helper_get_rebind(x) + x += _bolt_var1 + if _bolt_rebind is not None: + x = _bolt_rebind(x) + _bolt_var2 = x + return _bolt_var2 + _bolt_var3 = 'incr' + _bolt_var4 = incr + _bolt_var5 = {_bolt_var3: _bolt_var4} + return _bolt_var5 + _bolt_var6 = Counter + _bolt_var6 = _bolt_var6() + counter = _bolt_var6 + _bolt_var7 = counter + _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'incr') + _bolt_var7 = _bolt_var7() + _bolt_var7 = _bolt_helper_interpolate_message(_bolt_var7, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var7]))) + _bolt_var8 = counter + _bolt_var8 = _bolt_helper_get_attribute(_bolt_var8, 'incr') + _bolt_var8 = _bolt_var8() + _bolt_var8 = _bolt_helper_interpolate_message(_bolt_var8, _bolt_refs[2]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_var8]))) + _bolt_var9 = Counter + _bolt_var10 = 9 + _bolt_var9 = _bolt_var9(_bolt_var10) + _bolt_var9 = _bolt_helper_get_attribute(_bolt_var9, 'incr') + _bolt_var9 = _bolt_var9() + _bolt_var9 = _bolt_helper_interpolate_message(_bolt_var9, _bolt_refs[4]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var9]))) +_bolt_var12 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var11)) --- -output = _mecha_var12 +output = _bolt_var12 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=136, lineno=9, colno=5) end_location: SourceLocation(pos=150, lineno=9, colno=19) @@ -56,14 +56,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=132, lineno=9, colno=1) end_location: SourceLocation(pos=150, lineno=9, colno=19) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=155, lineno=10, colno=5) end_location: SourceLocation(pos=169, lineno=10, colno=19) @@ -72,14 +72,14 @@ _mecha_refs[2] converter: 'message' value: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=151, lineno=10, colno=1) end_location: SourceLocation(pos=169, lineno=10, colno=19) identifier: 'say:message' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=174, lineno=11, colno=5) end_location: SourceLocation(pos=191, lineno=11, colno=22) @@ -88,14 +88,14 @@ _mecha_refs[4] converter: 'message' value: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=170, lineno=11, colno=1) end_location: SourceLocation(pos=191, lineno=11, colno=22) identifier: 'say:message' arguments: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=192, lineno=12, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__1.txt b/packages/bolt/tests/snapshots/bolt__parse_196__1.txt index 4cfbb56a7..7f0930ffc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_196__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_196__1.txt @@ -1,27 +1,27 @@ -_mecha_lineno = [1, 8, 12, 17, 18], [1, 2, 3, 5, 6] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: +_bolt_lineno = [1, 8, 12, 17, 18], [1, 2, 3, 5, 6] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: def foo(value): - _mecha_var0 = value - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = 1 - result = _mecha_var1 - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 0 - result = _mecha_var2 - _mecha_var3 = result - return _mecha_var3 -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) + _bolt_var0 = value + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var1 = 1 + result = _bolt_var1 + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = 0 + result = _bolt_var2 + _bolt_var3 = result + return _bolt_var3 +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=95, lineno=6, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__1.txt b/packages/bolt/tests/snapshots/bolt__parse_197__1.txt index e6af3f78c..ee55f8b33 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_197__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_197__1.txt @@ -1,36 +1,36 @@ -_mecha_lineno = [1, 10, 11, 15, 23, 27], [1, 2, 3, 4, 6, 7] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: +_bolt_lineno = [1, 10, 11, 15, 23, 27], [1, 2, 3, 4, 6, 7] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: def foo(value): - _mecha_var0 = 'init' - result = _mecha_var0 - _mecha_var1 = value - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var2 = 1 - _mecha_rebind = _mecha_helper_get_rebind(result) - result = _mecha_var2 - if _mecha_rebind is not None: - result = _mecha_rebind(result) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 0 - _mecha_rebind = _mecha_helper_get_rebind(result) - result = _mecha_var3 - if _mecha_rebind is not None: - result = _mecha_rebind(result) - _mecha_var4 = result - return _mecha_var4 -_mecha_var6 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var5)) + _bolt_var0 = 'init' + result = _bolt_var0 + _bolt_var1 = value + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = 1 + _bolt_rebind = _bolt_helper_get_rebind(result) + result = _bolt_var2 + if _bolt_rebind is not None: + result = _bolt_rebind(result) + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = 0 + _bolt_rebind = _bolt_helper_get_rebind(result) + result = _bolt_var3 + if _bolt_rebind is not None: + result = _bolt_rebind(result) + _bolt_var4 = result + return _bolt_var4 +_bolt_var6 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=115, lineno=7, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt index 96138503f..9add209b3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_resource_location = _mecha_runtime.helpers['interpolate_resource_location'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'foo:bar' - tag_name = _mecha_var0 - _mecha_var1 = tag_name - _mecha_var1 = _mecha_helper_interpolate_resource_location(f'#{_mecha_var1}', _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'foo:bar' + tag_name = _bolt_var0 + _bolt_var1 = tag_name + _bolt_var1 = _bolt_helper_interpolate_resource_location(f'#{_bolt_var1}', _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=28, lineno=2, colno=10) end_location: SourceLocation(pos=37, lineno=2, colno=19) @@ -21,14 +21,14 @@ _mecha_refs[0] converter: 'resource_location' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=19, lineno=2, colno=1) end_location: SourceLocation(pos=37, lineno=2, colno=19) identifier: 'function:name' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=2, colno=19) diff --git a/packages/bolt/tests/snapshots/bolt__parse_199__1.txt b/packages/bolt/tests/snapshots/bolt__parse_199__1.txt index 514ace72a..5ba7f6296 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_199__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_199__1.txt @@ -1,86 +1,86 @@ -_mecha_lineno = [1, 17, 21, 25, 27], [1, 2, 3, 4, 5] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_operator_in = _mecha_runtime.helpers['operator_in'] -_mecha_helper_operator_not_in = _mecha_runtime.helpers['operator_not_in'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var27: - _mecha_var0 = False - _mecha_var1 = True - _mecha_var2 = [_mecha_var0, _mecha_var1] - for a in _mecha_var2: - _mecha_var3 = False - _mecha_var4 = True - _mecha_var5 = [_mecha_var3, _mecha_var4] - for b in _mecha_var5: - _mecha_var6 = False - _mecha_var7 = True - _mecha_var8 = [_mecha_var6, _mecha_var7] - for c in _mecha_var8: - _mecha_var9 = False - _mecha_var10 = True - _mecha_var11 = [_mecha_var9, _mecha_var10] - for d in _mecha_var11: - _mecha_var12 = print - _mecha_var13 = a - _mecha_var14 = _mecha_var13 - _mecha_var15 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var15 is not None: - _mecha_var13 = _mecha_var15() - with _mecha_helper_branch(_mecha_var14) as _mecha_condition: - if _mecha_condition: - _mecha_var16 = b - if _mecha_var15 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var16 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) +_bolt_lineno = [1, 17, 21, 25, 27], [1, 2, 3, 4, 5] +_bolt_helper_get_dup = _bolt_runtime.helpers['get_dup'] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_operator_in = _bolt_runtime.helpers['operator_in'] +_bolt_helper_operator_not_in = _bolt_runtime.helpers['operator_not_in'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var27: + _bolt_var0 = False + _bolt_var1 = True + _bolt_var2 = [_bolt_var0, _bolt_var1] + for a in _bolt_var2: + _bolt_var3 = False + _bolt_var4 = True + _bolt_var5 = [_bolt_var3, _bolt_var4] + for b in _bolt_var5: + _bolt_var6 = False + _bolt_var7 = True + _bolt_var8 = [_bolt_var6, _bolt_var7] + for c in _bolt_var8: + _bolt_var9 = False + _bolt_var10 = True + _bolt_var11 = [_bolt_var9, _bolt_var10] + for d in _bolt_var11: + _bolt_var12 = print + _bolt_var13 = a + _bolt_var14 = _bolt_var13 + _bolt_var15 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var15 is not None: + _bolt_var13 = _bolt_var15() + with _bolt_helper_branch(_bolt_var14) as _bolt_condition: + if _bolt_condition: + _bolt_var16 = b + if _bolt_var15 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var16 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var16 - _mecha_var17 = _mecha_helper_operator_not(_mecha_var13) - _mecha_var18 = _mecha_helper_get_dup(_mecha_var13) - if _mecha_var18 is not None: - _mecha_var13 = _mecha_var18() - with _mecha_helper_branch(_mecha_var17) as _mecha_condition: - if _mecha_condition: - _mecha_var19 = c - _mecha_var20 = _mecha_var19 - _mecha_var21 = _mecha_helper_get_dup(_mecha_var19) - if _mecha_var21 is not None: - _mecha_var19 = _mecha_var21() - with _mecha_helper_branch(_mecha_var20) as _mecha_condition: - if _mecha_condition: - _mecha_var22 = d - _mecha_var22 = _mecha_helper_operator_not(_mecha_var22) - if _mecha_var21 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var19) - _mecha_var19 = _mecha_var22 - if _mecha_rebind is not None: - _mecha_var19 = _mecha_rebind(_mecha_var19) + _bolt_var13 = _bolt_var16 + _bolt_var17 = _bolt_helper_operator_not(_bolt_var13) + _bolt_var18 = _bolt_helper_get_dup(_bolt_var13) + if _bolt_var18 is not None: + _bolt_var13 = _bolt_var18() + with _bolt_helper_branch(_bolt_var17) as _bolt_condition: + if _bolt_condition: + _bolt_var19 = c + _bolt_var20 = _bolt_var19 + _bolt_var21 = _bolt_helper_get_dup(_bolt_var19) + if _bolt_var21 is not None: + _bolt_var19 = _bolt_var21() + with _bolt_helper_branch(_bolt_var20) as _bolt_condition: + if _bolt_condition: + _bolt_var22 = d + _bolt_var22 = _bolt_helper_operator_not(_bolt_var22) + if _bolt_var21 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var19) + _bolt_var19 = _bolt_var22 + if _bolt_rebind is not None: + _bolt_var19 = _bolt_rebind(_bolt_var19) else: - _mecha_var19 = _mecha_var22 - if _mecha_var18 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var13) - _mecha_var13 = _mecha_var19 - if _mecha_rebind is not None: - _mecha_var13 = _mecha_rebind(_mecha_var13) + _bolt_var19 = _bolt_var22 + if _bolt_var18 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var13) + _bolt_var13 = _bolt_var19 + if _bolt_rebind is not None: + _bolt_var13 = _bolt_rebind(_bolt_var13) else: - _mecha_var13 = _mecha_var19 - _mecha_var23 = True - _mecha_var24 = [_mecha_var23] - _mecha_var13 = _mecha_helper_operator_in(_mecha_var13, _mecha_var24) - _mecha_var25 = False - _mecha_var26 = [_mecha_var25] - _mecha_var13 = _mecha_helper_operator_not_in(_mecha_var13, _mecha_var26) - _mecha_var12 = _mecha_var12(_mecha_var13) -_mecha_var28 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var27)) + _bolt_var13 = _bolt_var19 + _bolt_var23 = True + _bolt_var24 = [_bolt_var23] + _bolt_var13 = _bolt_helper_operator_in(_bolt_var13, _bolt_var24) + _bolt_var25 = False + _bolt_var26 = [_bolt_var25] + _bolt_var13 = _bolt_helper_operator_not_in(_bolt_var13, _bolt_var26) + _bolt_var12 = _bolt_var12(_bolt_var13) +_bolt_var28 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var27)) --- -output = _mecha_var28 +output = _bolt_var28 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=193, lineno=6, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_1__1.txt b/packages/bolt/tests/snapshots/bolt__parse_1__1.txt index d99c0bbb0..8d623c729 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_1__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_1__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 123 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 123 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=4, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_201__1.txt b/packages/bolt/tests/snapshots/bolt__parse_201__1.txt index d168d4f54..c9607c62e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_201__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_201__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_interpolate_message = _mecha_runtime.helpers['interpolate_message'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 2 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var1 = _mecha_helper_interpolate_message(_mecha_var1, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[1], arguments=_mecha_helper_children([_mecha_var1]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 2 + a = _bolt_var0 + _bolt_var1 = a + _bolt_var1 = _bolt_helper_interpolate_message(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=10, lineno=2, colno=5) end_location: SourceLocation(pos=11, lineno=2, colno=6) @@ -21,14 +21,14 @@ _mecha_refs[0] converter: 'message' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=6) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_202__1.txt b/packages/bolt/tests/snapshots/bolt__parse_202__1.txt index deb992a2c..b69bc1b2f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_202__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_202__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 2 - a = _mecha_var0 - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 2 + a = _bolt_var0 + _bolt_runtime.commands.append(_bolt_refs[0]) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=26, lineno=2, colno=21) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=26, lineno=2, colno=21) diff --git a/packages/bolt/tests/snapshots/bolt__parse_203__1.txt b/packages/bolt/tests/snapshots/bolt__parse_203__1.txt index d34eb155b..17bd20e57 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_203__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_203__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 2 - a = _mecha_var0 - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 2 + a = _bolt_var0 + _bolt_runtime.commands.append(_bolt_refs[0]) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=34, lineno=4, colno=12) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=34, lineno=4, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_205__1.txt b/packages/bolt/tests/snapshots/bolt__parse_205__1.txt index 24a5c79ca..4847f2a3a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_205__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_205__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1, 10], [1, 2] -_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'CustomModelData' - _mecha_var1 = 7 - _mecha_var2 = {_mecha_var0: _mecha_var1} - bow_data = _mecha_var2 - _mecha_var3 = bow_data - _mecha_var3 = _mecha_helper_interpolate_nbt({**_mecha_var3}, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[4], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_helper_replace(_mecha_refs[2], data_tags=_mecha_helper_replace(_mecha_refs[1], entries=_mecha_helper_children([*_mecha_var3])))]))) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[5], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1, 10], [1, 2] +_bolt_helper_interpolate_nbt = _bolt_runtime.helpers['interpolate_nbt'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 'CustomModelData' + _bolt_var1 = 7 + _bolt_var2 = {_bolt_var0: _bolt_var1} + bow_data = _bolt_var2 + _bolt_var3 = bow_data + _bolt_var3 = _bolt_helper_interpolate_nbt({**_bolt_var3}, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_helper_replace(_bolt_refs[2], data_tags=_bolt_helper_replace(_bolt_refs[1], entries=_bolt_helper_children([*_bolt_var3])))]))) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=46, lineno=2, colno=15) end_location: SourceLocation(pos=54, lineno=2, colno=23) @@ -23,13 +23,13 @@ _mecha_refs[0] converter: 'nbt' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=43, lineno=2, colno=12) end_location: SourceLocation(pos=55, lineno=2, colno=24) entries: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=40, lineno=2, colno=9) end_location: SourceLocation(pos=55, lineno=2, colno=24) @@ -37,14 +37,14 @@ _mecha_refs[2] data_tags: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=37, lineno=2, colno=6) end_location: SourceLocation(pos=39, lineno=2, colno=8) variable: 's' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=32, lineno=2, colno=1) end_location: SourceLocation(pos=55, lineno=2, colno=24) @@ -52,7 +52,7 @@ _mecha_refs[4] arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=55, lineno=2, colno=24) diff --git a/packages/bolt/tests/snapshots/bolt__parse_206__1.txt b/packages/bolt/tests/snapshots/bolt__parse_206__1.txt index 7be209484..6bab74956 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_206__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_206__1.txt @@ -1,25 +1,25 @@ -_mecha_lineno = [1, 11, 13], [1, 2, 3] -_mecha_helper_interpolate_nbt = _mecha_runtime.helpers['interpolate_nbt'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = 'CustomModelData' - _mecha_var1 = 7 - _mecha_var2 = {_mecha_var0: _mecha_var1} - custom_model_data = _mecha_var2 - _mecha_var3 = 'minecraft:dirt' - _mecha_var4 = [_mecha_var3] - stone_can_place_on = _mecha_var4 - _mecha_var5 = stone_can_place_on - _mecha_var5 = _mecha_helper_interpolate_nbt([*_mecha_var5], _mecha_refs[0]) - _mecha_var6 = custom_model_data - _mecha_var6 = _mecha_helper_interpolate_nbt({**_mecha_var6}, _mecha_refs[3]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_helper_replace(_mecha_refs[5], data_tags=_mecha_helper_replace(_mecha_refs[4], entries=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], value=_mecha_helper_replace(_mecha_refs[1], elements=_mecha_helper_children([*_mecha_var5]))), *_mecha_var6])))]))) -_mecha_var8 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var7)) +_bolt_lineno = [1, 11, 13], [1, 2, 3] +_bolt_helper_interpolate_nbt = _bolt_runtime.helpers['interpolate_nbt'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var7: + _bolt_var0 = 'CustomModelData' + _bolt_var1 = 7 + _bolt_var2 = {_bolt_var0: _bolt_var1} + custom_model_data = _bolt_var2 + _bolt_var3 = 'minecraft:dirt' + _bolt_var4 = [_bolt_var3] + stone_can_place_on = _bolt_var4 + _bolt_var5 = stone_can_place_on + _bolt_var5 = _bolt_helper_interpolate_nbt([*_bolt_var5], _bolt_refs[0]) + _bolt_var6 = custom_model_data + _bolt_var6 = _bolt_helper_interpolate_nbt({**_bolt_var6}, _bolt_refs[3]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[6], _bolt_helper_replace(_bolt_refs[5], data_tags=_bolt_helper_replace(_bolt_refs[4], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], value=_bolt_helper_replace(_bolt_refs[1], elements=_bolt_helper_children([*_bolt_var5]))), *_bolt_var6])))]))) +_bolt_var8 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var7)) --- -output = _mecha_var8 +output = _bolt_var8 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=109, lineno=3, colno=29) end_location: SourceLocation(pos=127, lineno=3, colno=47) @@ -28,13 +28,13 @@ _mecha_refs[0] converter: 'nbt' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=107, lineno=3, colno=27) end_location: SourceLocation(pos=128, lineno=3, colno=48) elements: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=95, lineno=3, colno=15) end_location: SourceLocation(pos=128, lineno=3, colno=48) @@ -42,7 +42,7 @@ _mecha_refs[2] value: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=132, lineno=3, colno=52) end_location: SourceLocation(pos=149, lineno=3, colno=69) @@ -51,14 +51,14 @@ _mecha_refs[3] converter: 'nbt' value: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=94, lineno=3, colno=14) end_location: SourceLocation(pos=150, lineno=3, colno=70) entries: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=89, lineno=3, colno=9) end_location: SourceLocation(pos=150, lineno=3, colno=70) @@ -66,14 +66,14 @@ _mecha_refs[5] data_tags: -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=86, lineno=3, colno=6) end_location: SourceLocation(pos=88, lineno=3, colno=8) variable: 's' arguments: -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=81, lineno=3, colno=1) end_location: SourceLocation(pos=150, lineno=3, colno=70) @@ -81,7 +81,7 @@ _mecha_refs[7] arguments: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=150, lineno=3, colno=70) diff --git a/packages/bolt/tests/snapshots/bolt__parse_207__1.txt b/packages/bolt/tests/snapshots/bolt__parse_207__1.txt index 6ac1c1add..f0ec90710 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_207__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_207__1.txt @@ -1,24 +1,24 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 'color' - _mecha_var1 = 'red' - _mecha_var2 = {_mecha_var0: _mecha_var1} - red = _mecha_var2 - _mecha_var3 = red - _mecha_var3 = _mecha_helper_interpolate_json({**_mecha_var3}, _mecha_refs[0]) - _mecha_var4 = red - _mecha_var4 = _mecha_helper_get_attribute(_mecha_var4, 'color') - _mecha_var4 = _mecha_helper_interpolate_json([*_mecha_var4], _mecha_refs[4]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[6], _mecha_helper_replace(_mecha_refs[5], elements=_mecha_helper_children([_mecha_refs[3], _mecha_helper_replace(_mecha_refs[2], entries=_mecha_helper_children([_mecha_refs[1], *_mecha_var3])), *_mecha_var4]))]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var5)) +_bolt_lineno = [1, 11], [1, 2] +_bolt_helper_interpolate_json = _bolt_runtime.helpers['interpolate_json'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 'color' + _bolt_var1 = 'red' + _bolt_var2 = {_bolt_var0: _bolt_var1} + red = _bolt_var2 + _bolt_var3 = red + _bolt_var3 = _bolt_helper_interpolate_json({**_bolt_var3}, _bolt_refs[0]) + _bolt_var4 = red + _bolt_var4 = _bolt_helper_get_attribute(_bolt_var4, 'color') + _bolt_var4 = _bolt_helper_interpolate_json([*_bolt_var4], _bolt_refs[4]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[6], _bolt_helper_replace(_bolt_refs[5], elements=_bolt_helper_children([_bolt_refs[3], _bolt_helper_replace(_bolt_refs[2], entries=_bolt_helper_children([_bolt_refs[1], *_bolt_var3])), *_bolt_var4]))]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=57, lineno=2, colno=35) end_location: SourceLocation(pos=60, lineno=2, colno=38) @@ -27,7 +27,7 @@ _mecha_refs[0] converter: 'json' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=40, lineno=2, colno=18) end_location: SourceLocation(pos=53, lineno=2, colno=31) @@ -35,19 +35,19 @@ _mecha_refs[1] value: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=39, lineno=2, colno=17) end_location: SourceLocation(pos=61, lineno=2, colno=39) entries: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=35, lineno=2, colno=13) end_location: SourceLocation(pos=37, lineno=2, colno=15) value: '' -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=64, lineno=2, colno=42) end_location: SourceLocation(pos=73, lineno=2, colno=51) @@ -56,7 +56,7 @@ _mecha_refs[4] converter: 'json' value: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=34, lineno=2, colno=12) end_location: SourceLocation(pos=74, lineno=2, colno=52) @@ -64,14 +64,14 @@ _mecha_refs[5] -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=31, lineno=2, colno=9) end_location: SourceLocation(pos=33, lineno=2, colno=11) variable: 'p' arguments: -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=23, lineno=2, colno=1) end_location: SourceLocation(pos=74, lineno=2, colno=52) @@ -79,7 +79,7 @@ _mecha_refs[7] arguments: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=75, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_208__1.txt b/packages/bolt/tests/snapshots/bolt__parse_208__1.txt index 159f9b0d4..9db588d43 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_208__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_208__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: - Image = _mecha_helper_get_attribute(_mecha_helper_import_module('PIL'), 'Image') -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +_bolt_lineno = [1], [1] +_bolt_helper_import_module = _bolt_runtime.helpers['import_module'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + Image = _bolt_helper_get_attribute(_bolt_helper_import_module('PIL'), 'Image') +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _mecha_var1 +output = _bolt_var1 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_209__1.txt b/packages/bolt/tests/snapshots/bolt__parse_209__1.txt index bafc25c14..2e25e0706 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_209__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_209__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_import_module = _mecha_runtime.helpers['import_module'] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: - Image = _mecha_helper_get_attribute(_mecha_helper_import_module('PIL.Image'), 'Image') -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +_bolt_lineno = [1], [1] +_bolt_helper_import_module = _bolt_runtime.helpers['import_module'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + Image = _bolt_helper_get_attribute(_bolt_helper_import_module('PIL.Image'), 'Image') +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _mecha_var1 +output = _bolt_var1 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_20__1.txt b/packages/bolt/tests/snapshots/bolt__parse_20__1.txt index 441752d1a..20087d6dc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_20__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_20__1.txt @@ -1,45 +1,45 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = True - _mecha_var1 = _mecha_var0 - _mecha_var2 = _mecha_helper_get_dup(_mecha_var0) - if _mecha_var2 is not None: - _mecha_var0 = _mecha_var2() - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = False - _mecha_var4 = _mecha_helper_operator_not(_mecha_var3) - _mecha_var5 = _mecha_helper_get_dup(_mecha_var3) - if _mecha_var5 is not None: - _mecha_var3 = _mecha_var5() - with _mecha_helper_branch(_mecha_var4) as _mecha_condition: - if _mecha_condition: - _mecha_var6 = True - if _mecha_var5 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var3) - _mecha_var3 = _mecha_var6 - if _mecha_rebind is not None: - _mecha_var3 = _mecha_rebind(_mecha_var3) +_bolt_lineno = [1], [1] +_bolt_helper_get_dup = _bolt_runtime.helpers['get_dup'] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var7: + _bolt_var0 = True + _bolt_var1 = _bolt_var0 + _bolt_var2 = _bolt_helper_get_dup(_bolt_var0) + if _bolt_var2 is not None: + _bolt_var0 = _bolt_var2() + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = False + _bolt_var4 = _bolt_helper_operator_not(_bolt_var3) + _bolt_var5 = _bolt_helper_get_dup(_bolt_var3) + if _bolt_var5 is not None: + _bolt_var3 = _bolt_var5() + with _bolt_helper_branch(_bolt_var4) as _bolt_condition: + if _bolt_condition: + _bolt_var6 = True + if _bolt_var5 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var3) + _bolt_var3 = _bolt_var6 + if _bolt_rebind is not None: + _bolt_var3 = _bolt_rebind(_bolt_var3) else: - _mecha_var3 = _mecha_var6 - if _mecha_var2 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var0) - _mecha_var0 = _mecha_var3 - if _mecha_rebind is not None: - _mecha_var0 = _mecha_rebind(_mecha_var0) + _bolt_var3 = _bolt_var6 + if _bolt_var2 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var0) + _bolt_var0 = _bolt_var3 + if _bolt_rebind is not None: + _bolt_var0 = _bolt_rebind(_bolt_var0) else: - _mecha_var0 = _mecha_var3 -_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) + _bolt_var0 = _bolt_var3 +_bolt_var8 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var7)) --- -output = _mecha_var8 +output = _bolt_var8 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=25, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_210__1.txt b/packages/bolt/tests/snapshots/bolt__parse_210__1.txt index e3e540789..369b96d33 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_210__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_210__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1, 7, 8, 14], [1, 4, 5, 4] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: +_bolt_lineno = [1, 7, 8, 14], [1, 4, 5, 4] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: def testing_decorator(): pass - _mecha_var0 = testing_decorator - _mecha_var1 = testing_decorator - _mecha_var2 = 1 - _mecha_var1 = _mecha_var1(_mecha_var2) + _bolt_var0 = testing_decorator + _bolt_var1 = testing_decorator + _bolt_var2 = 1 + _bolt_var1 = _bolt_var1(_bolt_var2) def f(): pass - f = _mecha_var1(f) - f = _mecha_var0(f) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) + f = _bolt_var1(f) + f = _bolt_var0(f) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=93, lineno=7, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_21__1.txt b/packages/bolt/tests/snapshots/bolt__parse_21__1.txt index cc5b6faac..640822503 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_21__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_21__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'this' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'this' +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_22__1.txt b/packages/bolt/tests/snapshots/bolt__parse_22__1.txt index 7e41941ab..dc7d278bf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_22__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_22__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'this\nthat' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'this\nthat' +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_23__1.txt b/packages/bolt/tests/snapshots/bolt__parse_23__1.txt index 778b55ec5..cad997b6e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_23__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_23__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '"█this\nthat' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '"█this\nthat' +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_24__1.txt b/packages/bolt/tests/snapshots/bolt__parse_24__1.txt index 41fde0c90..d67a1fe41 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_24__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_24__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '' +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_25__1.txt b/packages/bolt/tests/snapshots/bolt__parse_25__1.txt index 93429b164..b176911ac 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_25__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_25__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '"\'"' -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '"\'"' +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_26__1.txt b/packages/bolt/tests/snapshots/bolt__parse_26__1.txt index 15778dfaf..aef28c8eb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_26__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_26__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = "something \t\x0c\n\\'here" -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = "something \t\x0c\n\\'here" +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=27, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_29__1.txt b/packages/bolt/tests/snapshots/bolt__parse_29__1.txt index ec5e89c25..c59a35963 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_29__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_29__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = None -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = None +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=5, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_2__1.txt b/packages/bolt/tests/snapshots/bolt__parse_2__1.txt index 3bda36983..bf84ad31f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_2__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_2__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 123.456 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 123.456 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_32__1.txt b/packages/bolt/tests/snapshots/bolt__parse_32__1.txt index 0485fcdbb..84478b871 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_32__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_32__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = foo -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 7], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + foo = _bolt_var0 + _bolt_var1 = foo +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_33__1.txt b/packages/bolt/tests/snapshots/bolt__parse_33__1.txt index d563e36eb..6f426a9a2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_33__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_33__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = 'hello' - _mecha_var2 = foo - _mecha_var1 = _mecha_var1 + _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + foo = _bolt_var0 + _bolt_var1 = 'hello' + _bolt_var2 = foo + _bolt_var1 = _bolt_var1 + _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_34__1.txt b/packages/bolt/tests/snapshots/bolt__parse_34__1.txt index 566977c24..1a8912cc2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_34__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_34__1.txt @@ -1,26 +1,26 @@ -_mecha_lineno = [1, 9, 15], [1, 2, 3] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 1 - a = _mecha_var0 - _mecha_var1 = a - _mecha_var2 = 1 - _mecha_var1 = _mecha_var1 == _mecha_var2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_var3 = 0 - _mecha_rebind = _mecha_helper_get_rebind(a) - a = _mecha_var3 - if _mecha_rebind is not None: - a = _mecha_rebind(a) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1, 9, 15], [1, 2, 3] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 1 + a = _bolt_var0 + _bolt_var1 = a + _bolt_var2 = 1 + _bolt_var1 = _bolt_var1 == _bolt_var2 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = 0 + _bolt_rebind = _bolt_helper_get_rebind(a) + a = _bolt_var3 + if _bolt_rebind is not None: + a = _bolt_rebind(a) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=27, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_35__1.txt b/packages/bolt/tests/snapshots/bolt__parse_35__1.txt index 79aefa85a..37751f3d5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_35__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_35__1.txt @@ -1,63 +1,63 @@ -_mecha_lineno = [1, 17], [1, 3] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_operator_not = _mecha_runtime.helpers['operator_not'] -_mecha_helper_get_dup = _mecha_runtime.helpers['get_dup'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = True - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = _mecha_helper_operator_not(_mecha_var0) - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_var1 = True - _mecha_var2 = _mecha_helper_operator_not(_mecha_var1) - _mecha_var3 = _mecha_helper_get_dup(_mecha_var1) - if _mecha_var3 is not None: - _mecha_var1 = _mecha_var3() - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_var4 = False - if _mecha_var3 is not None: - _mecha_rebind = _mecha_helper_get_rebind(_mecha_var1) - _mecha_var1 = _mecha_var4 - if _mecha_rebind is not None: - _mecha_var1 = _mecha_rebind(_mecha_var1) +_bolt_lineno = [1, 17], [1, 3] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] +_bolt_helper_get_dup = _bolt_runtime.helpers['get_dup'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = True + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var1 = True + _bolt_var2 = _bolt_helper_operator_not(_bolt_var1) + _bolt_var3 = _bolt_helper_get_dup(_bolt_var1) + if _bolt_var3 is not None: + _bolt_var1 = _bolt_var3() + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_var4 = False + if _bolt_var3 is not None: + _bolt_rebind = _bolt_helper_get_rebind(_bolt_var1) + _bolt_var1 = _bolt_var4 + if _bolt_rebind is not None: + _bolt_var1 = _bolt_rebind(_bolt_var1) else: - _mecha_var1 = _mecha_var4 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_var1 = _mecha_helper_operator_not(_mecha_var1) - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[2].commands) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var5)) + _bolt_var1 = _bolt_var4 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_var1 = _bolt_helper_operator_not(_bolt_var1) + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[2].commands) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=22, lineno=2, colno=14) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=47, lineno=4, colno=5) end_location: SourceLocation(pos=56, lineno=4, colno=14) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=67, lineno=6, colno=5) end_location: SourceLocation(pos=76, lineno=6, colno=14) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=76, lineno=6, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_3__1.txt b/packages/bolt/tests/snapshots/bolt__parse_3__1.txt index e3e800c33..3d24078f3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_3__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_3__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 22220.0996667 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 22220.0996667 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_41__1.txt b/packages/bolt/tests/snapshots/bolt__parse_41__1.txt index 14b1dee42..39fad9f30 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_41__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_41__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = True - while _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = True + while _bolt_var0: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=16, lineno=2, colno=5) end_location: SourceLocation(pos=25, lineno=2, colno=14) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=25, lineno=2, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_42__1.txt b/packages/bolt/tests/snapshots/bolt__parse_42__1.txt index 004265c21..ced9763dd 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_42__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_42__1.txt @@ -1,71 +1,71 @@ -_mecha_lineno = [1, 9, 15], [1, 2, 4] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: - with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'thing' - _mecha_var1 = 'bar' - _mecha_var0 = _mecha_var0 == _mecha_var1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var2 = 'thing' - _mecha_var3 = 'foo' - _mecha_var2 = _mecha_var2 == _mecha_var3 - with _mecha_helper_branch(_mecha_var2) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var4))]))]))]))) -_mecha_var6 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var5)) +_bolt_lineno = [1, 9, 15], [1, 2, 4] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 'thing' + _bolt_var1 = 'bar' + _bolt_var0 = _bolt_var0 == _bolt_var1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var2 = 'thing' + _bolt_var3 = 'foo' + _bolt_var2 = _bolt_var2 == _bolt_var3 + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_refs[5], _bolt_refs[6], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var4))]))]))]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[9], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=60, lineno=3, colno=9) end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=103, lineno=5, colno=9) end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=112, lineno=5, colno=18) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'execute:commands' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) variable: 's' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=112, lineno=5, colno=18) @@ -75,14 +75,14 @@ _mecha_refs[7] -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=112, lineno=5, colno=18) identifier: 'execute:subcommand' arguments: -_mecha_refs[9] +_bolt_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=112, lineno=5, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_43__1.txt b/packages/bolt/tests/snapshots/bolt__parse_43__1.txt index 3a4e67e61..a7e480c5c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_43__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_43__1.txt @@ -1,58 +1,58 @@ -_mecha_lineno = [1, 9], [1, 2] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'thing' - _mecha_var1 = 'foo' - _mecha_var0 = _mecha_var0 == _mecha_var1 - with _mecha_helper_branch(_mecha_var0) as _mecha_condition: - if _mecha_condition: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2))]))]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 9], [1, 2] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'thing' + _bolt_var1 = 'foo' + _bolt_var0 = _bolt_var0 == _bolt_var1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var2))]))]))]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=60, lineno=3, colno=9) end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=69, lineno=3, colno=18) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'execute:commands' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) variable: 's' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=69, lineno=3, colno=18) @@ -62,14 +62,14 @@ _mecha_refs[6] -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=69, lineno=3, colno=18) identifier: 'execute:subcommand' arguments: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=69, lineno=3, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt index 046b9e0da..d4a949c9e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt @@ -1,64 +1,64 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = True - while _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var1 = True - while _mecha_var1: - _mecha_runtime.commands.extend(_mecha_refs[1].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[8], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_refs[4], _mecha_refs[5], _mecha_refs[6], _mecha_helper_replace(_mecha_refs[3], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var2))]))]))]))) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[9], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = True + while _bolt_var0: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var1 = True + while _bolt_var1: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_refs[5], _bolt_refs[6], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2))]))]))]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[9], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=51, lineno=3, colno=9) end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=85, lineno=5, colno=9) end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=94, lineno=5, colno=18) commands: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'execute:commands' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) variable: 's' arguments: -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=94, lineno=5, colno=18) @@ -68,14 +68,14 @@ _mecha_refs[7] -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=94, lineno=5, colno=18) identifier: 'execute:subcommand' arguments: -_mecha_refs[9] +_bolt_refs[9] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=94, lineno=5, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt index 0fc43d4dd..e1d690806 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt @@ -1,54 +1,54 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = True - while _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1))]))]))]))) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = True + while _bolt_var0: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1))]))]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=51, lineno=3, colno=9) end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=60, lineno=3, colno=18) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'execute:commands' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) variable: 's' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) min: 0 max: 0 -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=60, lineno=3, colno=18) @@ -58,14 +58,14 @@ _mecha_refs[6] -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=60, lineno=3, colno=18) identifier: 'execute:subcommand' arguments: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=60, lineno=3, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt index f88515afd..1a2aacf31 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt @@ -1,68 +1,68 @@ -_mecha_lineno = [1, 8, 9, 14], [1, 2, 3, 5] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var6: - with _mecha_runtime.scope() as _mecha_var5: - _mecha_var0 = 42 - count = _mecha_var0 - _mecha_var1 = count - _mecha_var2 = 0 - _mecha_var1 = _mecha_var1 > _mecha_var2 - while _mecha_var1: - _mecha_runtime.commands.append(_mecha_refs[0]) - _mecha_var3 = count - _mecha_var4 = 1 - _mecha_var3 = _mecha_var3 - _mecha_var4 - _mecha_rebind = _mecha_helper_get_rebind(count) - count = _mecha_var3 - if _mecha_rebind is not None: - count = _mecha_rebind(count) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[7], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[6], arguments=_mecha_helper_children([_mecha_refs[3], _mecha_refs[4], _mecha_refs[5], _mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var5))]))]))]))) -_mecha_var7 = _mecha_helper_replace(_mecha_refs[8], commands=_mecha_helper_children(_mecha_var6)) +_bolt_lineno = [1, 8, 9, 14], [1, 2, 3, 5] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var6: + with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 42 + count = _bolt_var0 + _bolt_var1 = count + _bolt_var2 = 0 + _bolt_var1 = _bolt_var1 > _bolt_var2 + while _bolt_var1: + _bolt_runtime.commands.append(_bolt_refs[0]) + _bolt_var3 = count + _bolt_var4 = 1 + _bolt_var3 = _bolt_var3 - _bolt_var4 + _bolt_rebind = _bolt_helper_get_rebind(count) + count = _bolt_var3 + if _bolt_rebind is not None: + count = _bolt_rebind(count) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var5))]))]))]))) +_bolt_var7 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var6)) --- -output = _mecha_var7 +output = _bolt_var7 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=72, lineno=4, colno=9) end_location: SourceLocation(pos=81, lineno=4, colno=18) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=32, lineno=2, colno=5) end_location: SourceLocation(pos=107, lineno=5, colno=26) commands: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=32, lineno=2, colno=5) end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'execute:commands' arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) variable: 's' arguments: -_mecha_refs[4] +_bolt_refs[4] location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 'tmp' -_mecha_refs[5] +_bolt_refs[5] location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=26, lineno=1, colno=27) min: 42 max: 42 -_mecha_refs[6] +_bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=107, lineno=5, colno=26) @@ -72,14 +72,14 @@ _mecha_refs[6] -_mecha_refs[7] +_bolt_refs[7] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=107, lineno=5, colno=26) identifier: 'execute:subcommand' arguments: -_mecha_refs[8] +_bolt_refs[8] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=108, lineno=6, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_47__1.txt b/packages/bolt/tests/snapshots/bolt__parse_47__1.txt index b026a0719..b18c9838c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_47__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_47__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1, 7, 8], [1, 2, 1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'abc' - _mecha_var1 = 'def' - _mecha_var0 = _mecha_var0 + _mecha_var1 - foo = _mecha_var0 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 7, 8], [1, 2, 1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'abc' + _bolt_var1 = 'def' + _bolt_var0 = _bolt_var0 + _bolt_var1 + foo = _bolt_var0 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=5, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_49__1.txt b/packages/bolt/tests/snapshots/bolt__parse_49__1.txt index 360708453..ea4ab48ac 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_49__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_49__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = True - _mecha_var1 = False - _mecha_var0 = _mecha_var0 | _mecha_var1 - _mecha_var2 = None - _mecha_var0 = _mecha_var0 | _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = True + _bolt_var1 = False + _bolt_var0 = _bolt_var0 | _bolt_var1 + _bolt_var2 = None + _bolt_var0 = _bolt_var0 | _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_4__1.txt b/packages/bolt/tests/snapshots/bolt__parse_4__1.txt index c1e4a6981..9d3d2d6aa 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_4__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_4__1.txt @@ -1,13 +1,13 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 670000.0 -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 670000.0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_50__1.txt b/packages/bolt/tests/snapshots/bolt__parse_50__1.txt index ece8b868d..f0dcca6fe 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_50__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_50__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1, 7], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 1 - _mecha_var1 = _mecha_var1 == _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1, 7], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_var2 = 1 + _bolt_var1 = _bolt_var1 == _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=17, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_51__1.txt b/packages/bolt/tests/snapshots/bolt__parse_51__1.txt index d92f20983..2ad72b1f4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_51__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_51__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'abc' - for c in _mecha_var0: - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'abc' + for c in _bolt_var0: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=20, lineno=2, colno=5) end_location: SourceLocation(pos=33, lineno=2, colno=18) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=33, lineno=2, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_53__1.txt b/packages/bolt/tests/snapshots/bolt__parse_53__1.txt index 62dfab42e..c90f2a6db 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_53__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_53__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_rebind = _mecha_helper_get_rebind(foo) - foo = _mecha_var1 - if _mecha_rebind is not None: - foo = _mecha_rebind(foo) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_rebind = _bolt_helper_get_rebind(foo) + foo = _bolt_var1 + if _bolt_rebind is not None: + foo = _bolt_rebind(foo) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=18, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_55__1.txt b/packages/bolt/tests/snapshots/bolt__parse_55__1.txt index c998bf9f5..2ceacd68c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_55__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_55__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'foo' - for foo in _mecha_var0: - _mecha_var1 = foo - _mecha_rebind = _mecha_helper_get_rebind(foo) - foo = _mecha_var1 - if _mecha_rebind is not None: - foo = _mecha_rebind(foo) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'foo' + for foo in _bolt_var0: + _bolt_var1 = foo + _bolt_rebind = _bolt_helper_get_rebind(foo) + foo = _bolt_var1 + if _bolt_rebind is not None: + foo = _bolt_rebind(foo) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=32, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_57__1.txt b/packages/bolt/tests/snapshots/bolt__parse_57__1.txt index 87a71f344..5249840d1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_57__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_57__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1, 9], [1, 2] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = '' - foo = _mecha_var0 - _mecha_var1 = 'hey' - _mecha_rebind = _mecha_helper_get_rebind(foo) - foo += _mecha_var1 - if _mecha_rebind is not None: - foo = _mecha_rebind(foo) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 9], [1, 2] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = '' + foo = _bolt_var0 + _bolt_var1 = 'hey' + _bolt_rebind = _bolt_helper_get_rebind(foo) + foo += _bolt_var1 + if _bolt_rebind is not None: + foo = _bolt_rebind(foo) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_5__1.txt b/packages/bolt/tests/snapshots/bolt__parse_5__1.txt index 1a685ec51..9a7ae3cb2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_5__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_5__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var0 = _bolt_var0 + _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_62__1.txt b/packages/bolt/tests/snapshots/bolt__parse_62__1.txt index f7a132010..480d43332 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_62__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_62__1.txt @@ -1,23 +1,23 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = '' - for i in _mecha_var0: - _mecha_runtime.commands.append(_mecha_refs[0]) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '' + for i in _bolt_var0: + _bolt_runtime.commands.append(_bolt_refs[0]) continue -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=17, lineno=2, colno=5) end_location: SourceLocation(pos=26, lineno=2, colno=14) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=40, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_63__1.txt b/packages/bolt/tests/snapshots/bolt__parse_63__1.txt index 9b13ae4c7..8837f4fc6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_63__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_63__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = False - while _mecha_var0: +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = False + while _bolt_var0: break -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=23, lineno=3, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_64__1.txt b/packages/bolt/tests/snapshots/bolt__parse_64__1.txt index 8f72edbe3..ff6196e82 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_64__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_64__1.txt @@ -1,21 +1,21 @@ -_mecha_lineno = [1, 8], [1, 2] -_mecha_helper_branch = _mecha_runtime.helpers['branch'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'abc' - for i in _mecha_var0: - _mecha_var1 = i - _mecha_var2 = 'b' - _mecha_var1 = _mecha_var1 == _mecha_var2 - with _mecha_helper_branch(_mecha_var1) as _mecha_condition: - if _mecha_condition: +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 'abc' + for i in _bolt_var0: + _bolt_var1 = i + _bolt_var2 = 'b' + _bolt_var1 = _bolt_var1 == _bolt_var2 + with _bolt_helper_branch(_bolt_var1) as _bolt_condition: + if _bolt_condition: break -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=47, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_65__1.txt b/packages/bolt/tests/snapshots/bolt__parse_65__1.txt index c6ee9a489..7d6559778 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_65__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_65__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'foo' + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'bar') +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_66__1.txt b/packages/bolt/tests/snapshots/bolt__parse_66__1.txt index 0b38aa117..436ad70e7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_66__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_66__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'baz') -_mecha_var2 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var1)) +_bolt_lineno = [1], [1] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = 'foo' + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'bar') + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'baz') +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=14, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_67__1.txt b/packages/bolt/tests/snapshots/bolt__parse_67__1.txt index b9357601a..83447d3b2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_67__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_67__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') - _mecha_var0 = _mecha_var0() - _mecha_var1 = 0 - _mecha_var0 = _mecha_var0[_mecha_var1] -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'foo' + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'bar') + _bolt_var0 = _bolt_var0() + _bolt_var1 = 0 + _bolt_var0 = _bolt_var0[_bolt_var1] +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=15, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_68__1.txt b/packages/bolt/tests/snapshots/bolt__parse_68__1.txt index e2da64bbe..13a7f5d10 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_68__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_68__1.txt @@ -1,28 +1,28 @@ -_mecha_lineno = [1], [1] -_mecha_helper_get_attribute = _mecha_runtime.helpers['get_attribute'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var7: - _mecha_var0 = 'foo' - _mecha_var0 = _mecha_helper_get_attribute(_mecha_var0, 'bar') - _mecha_var0 = _mecha_var0() - _mecha_var1 = 0 - _mecha_var0 = _mecha_var0[_mecha_var1] - _mecha_var2 = 'hello' - _mecha_var0 = _mecha_var0[_mecha_var2] - _mecha_var3 = 99 - _mecha_var0 = _mecha_var0[_mecha_var3] - _mecha_var4 = 'with space' - _mecha_var0 = _mecha_var0[_mecha_var4] - _mecha_var5 = 'thing' - _mecha_var6 = 7 - _mecha_var5 = _mecha_var5 * _mecha_var6 - _mecha_var0 = _mecha_var0(_mecha_var5) -_mecha_var8 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var7)) +_bolt_lineno = [1], [1] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var7: + _bolt_var0 = 'foo' + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'bar') + _bolt_var0 = _bolt_var0() + _bolt_var1 = 0 + _bolt_var0 = _bolt_var0[_bolt_var1] + _bolt_var2 = 'hello' + _bolt_var0 = _bolt_var0[_bolt_var2] + _bolt_var3 = 99 + _bolt_var0 = _bolt_var0[_bolt_var3] + _bolt_var4 = 'with space' + _bolt_var0 = _bolt_var0[_bolt_var4] + _bolt_var5 = 'thing' + _bolt_var6 = 7 + _bolt_var5 = _bolt_var5 * _bolt_var6 + _bolt_var0 = _bolt_var0(_bolt_var5) +_bolt_var8 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var7)) --- -output = _mecha_var8 +output = _bolt_var8 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=52, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_69__1.txt b/packages/bolt/tests/snapshots/bolt__parse_69__1.txt index 018dc965a..cc20e71c9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_69__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_69__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'foo' - _mecha_var1 = 1 - _mecha_var2 = 2 - _mecha_var3 = 3 - _mecha_var0 = _mecha_var0(_mecha_var1, _mecha_var2, _mecha_var3) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 'foo' + _bolt_var1 = 1 + _bolt_var2 = 2 + _bolt_var3 = 3 + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2, _bolt_var3) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=30, lineno=6, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_6__1.txt b/packages/bolt/tests/snapshots/bolt__parse_6__1.txt index 79fbfaabf..0b6491074 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_6__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_6__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 - _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var0 = _bolt_var0 - _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_70__1.txt b/packages/bolt/tests/snapshots/bolt__parse_70__1.txt index ab7c43942..f14a0c368 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_70__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_70__1.txt @@ -1,22 +1,22 @@ -_mecha_lineno = [1, 7], [1, 3] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: def foo(): - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = foo - _mecha_var0 = _mecha_var0() -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = foo + _bolt_var0 = _bolt_var0() +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _mecha_var2 +output = _bolt_var2 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=24, lineno=2, colno=14) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=31, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_71__1.txt b/packages/bolt/tests/snapshots/bolt__parse_71__1.txt index e5b1bd7c6..30c18452b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_71__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_71__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 7, 9], [1, 3, 4] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: +_bolt_lineno = [1, 7, 9], [1, 3, 4] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: def foo(): def bar(): - _mecha_var0 = foo - _mecha_var0 = _mecha_var0() - _mecha_var1 = bar - _mecha_var1 = _mecha_var1() -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) + _bolt_var0 = foo + _bolt_var0 = _bolt_var0() + _bolt_var1 = bar + _bolt_var1 = _bolt_var1() +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=49, lineno=4, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_72__1.txt b/packages/bolt/tests/snapshots/bolt__parse_72__1.txt index 890b880d8..af38484e4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_72__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_72__1.txt @@ -1,32 +1,32 @@ -_mecha_lineno = [1, 11, 14], [1, 3, 4] -_mecha_helper_missing = _mecha_runtime.helpers['missing'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - def foo(a=_mecha_helper_missing, b=_mecha_helper_missing, c=_mecha_helper_missing): - if a is _mecha_helper_missing: - _mecha_var0 = 1 - a = _mecha_var0 - if b is _mecha_helper_missing: - _mecha_var1 = a - b = _mecha_var1 - if c is _mecha_helper_missing: - _mecha_var2 = a - _mecha_var3 = b - _mecha_var2 = _mecha_var2 + _mecha_var3 - c = _mecha_var2 - _mecha_runtime.commands.extend(_mecha_refs[0].commands) -_mecha_var5 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1, 11, 14], [1, 3, 4] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + def foo(a=_bolt_helper_missing, b=_bolt_helper_missing, c=_bolt_helper_missing): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = a + b = _bolt_var1 + if c is _bolt_helper_missing: + _bolt_var2 = a + _bolt_var3 = b + _bolt_var2 = _bolt_var2 + _bolt_var3 + c = _bolt_var2 + _bolt_runtime.commands.extend(_bolt_refs[0].commands) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=47, lineno=6, colno=5) end_location: SourceLocation(pos=56, lineno=6, colno=14) commands: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=56, lineno=6, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_77__1.txt b/packages/bolt/tests/snapshots/bolt__parse_77__1.txt index 0b3ded24f..91cf41d4f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_77__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_77__1.txt @@ -1,31 +1,31 @@ -_mecha_lineno = [1, 11], [1, 2] -_mecha_helper_missing = _mecha_runtime.helpers['missing'] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - def f(a, b=_mecha_helper_missing): - if b is _mecha_helper_missing: - _mecha_var0 = a - b = _mecha_var0 - _mecha_var1 = a - _mecha_rebind = _mecha_helper_get_rebind(b) - b += _mecha_var1 - if _mecha_rebind is not None: - b = _mecha_rebind(b) - _mecha_runtime.commands.append(_mecha_refs[0]) -_mecha_var3 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1, 11], [1, 2] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + def f(a, b=_bolt_helper_missing): + if b is _bolt_helper_missing: + _bolt_var0 = a + b = _bolt_var0 + _bolt_var1 = a + _bolt_rebind = _bolt_helper_get_rebind(b) + b += _bolt_var1 + if _bolt_rebind is not None: + b = _bolt_rebind(b) + _bolt_runtime.commands.append(_bolt_refs[0]) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=30, lineno=3, colno=5) end_location: SourceLocation(pos=37, lineno=3, colno=12) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=3, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_7__1.txt b/packages/bolt/tests/snapshots/bolt__parse_7__1.txt index 9d342764a..bab6255bd 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_7__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_7__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var0 = _mecha_var0 - _mecha_var1 - _mecha_var2 = 3 - _mecha_var0 = _mecha_var0 + _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var0 = _bolt_var0 - _bolt_var1 + _bolt_var2 = 3 + _bolt_var0 = _bolt_var0 + _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=10, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_81__1.txt b/packages/bolt/tests/snapshots/bolt__parse_81__1.txt index 01a709a95..1eeabd577 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_81__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_81__1.txt @@ -1,44 +1,44 @@ -_mecha_lineno = [1, 10, 11, 13, 21], [1, 9, 10, 11, 14] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var5: +_bolt_lineno = [1, 10, 11, 13, 21], [1, 9, 10, 11, 14] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: def foo(something): def wat(): - _mecha_runtime.commands.append(_mecha_refs[0]) - _mecha_var0 = 'hello' - x = _mecha_var0 - _mecha_var1 = something - for i in _mecha_var1: - _mecha_var2 = i - _mecha_var3 = 3 - _mecha_var2 = _mecha_var2 * _mecha_var3 - _mecha_rebind = _mecha_helper_get_rebind(x) - x += _mecha_var2 - if _mecha_rebind is not None: - x = _mecha_rebind(x) - _mecha_runtime.commands.append(_mecha_refs[1]) - _mecha_var4 = wat - _mecha_var4 = _mecha_var4() -_mecha_var6 = _mecha_helper_replace(_mecha_refs[2], commands=_mecha_helper_children(_mecha_var5)) + _bolt_runtime.commands.append(_bolt_refs[0]) + _bolt_var0 = 'hello' + x = _bolt_var0 + _bolt_var1 = something + for i in _bolt_var1: + _bolt_var2 = i + _bolt_var3 = 3 + _bolt_var2 = _bolt_var2 * _bolt_var3 + _bolt_rebind = _bolt_helper_get_rebind(x) + x += _bolt_var2 + if _bolt_rebind is not None: + x = _bolt_rebind(x) + _bolt_runtime.commands.append(_bolt_refs[1]) + _bolt_var4 = wat + _bolt_var4 = _bolt_var4() +_bolt_var6 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var5)) --- -output = _mecha_var6 +output = _bolt_var6 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=43, lineno=3, colno=9) end_location: SourceLocation(pos=108, lineno=7, colno=16) identifier: 'say:message' arguments: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=209, lineno=13, colno=9) end_location: SourceLocation(pos=216, lineno=13, colno=16) identifier: 'say:message' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=226, lineno=14, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_82__1.txt b/packages/bolt/tests/snapshots/bolt__parse_82__1.txt index 2147efbec..1fcaab65a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_82__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_82__1.txt @@ -1,32 +1,32 @@ -_mecha_lineno = [1, 7, 8, 15, 16, 22], [1, 2, 3, 5, 6, 7] -_mecha_helper_get_rebind = _mecha_runtime.helpers['get_rebind'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: +_bolt_lineno = [1, 7, 8, 15, 16, 22], [1, 2, 3, 5, 6, 7] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: def foo(): global thing - _mecha_var0 = bar - _mecha_var0 = _mecha_var0() - _mecha_rebind = _mecha_helper_get_rebind(thing) - thing += _mecha_var0 - if _mecha_rebind is not None: - thing = _mecha_rebind(thing) + _bolt_var0 = bar + _bolt_var0 = _bolt_var0() + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing += _bolt_var0 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) def bar(): global thing - _mecha_var1 = foo - _mecha_var1 = _mecha_var1() - _mecha_rebind = _mecha_helper_get_rebind(thing) - thing += _mecha_var1 - if _mecha_rebind is not None: - thing = _mecha_rebind(thing) - _mecha_var2 = bar - _mecha_var2 = _mecha_var2() - thing = _mecha_var2 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) + _bolt_var1 = foo + _bolt_var1 = _bolt_var1() + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing += _bolt_var1 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) + _bolt_var2 = bar + _bolt_var2 = _bolt_var2() + thing = _bolt_var2 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=108, lineno=8, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_84__1.txt b/packages/bolt/tests/snapshots/bolt__parse_84__1.txt index 584da111f..3339d09f0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_84__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_84__1.txt @@ -1,14 +1,14 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var0: +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: def foo(): return -_mecha_var1 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var0)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _mecha_var1 +output = _bolt_var1 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=11) diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__1.txt b/packages/bolt/tests/snapshots/bolt__parse_87__1.txt index b30492ae5..591cf5e62 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_87__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_87__1.txt @@ -1,18 +1,18 @@ -_mecha_lineno = [1, 7, 10], [1, 3, 4] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: +_bolt_lineno = [1, 7, 10], [1, 3, 4] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: def f(): def g(): - _mecha_var0 = foo - return _mecha_var0 - _mecha_var1 = 0 - foo = _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) + _bolt_var0 = foo + return _bolt_var0 + _bolt_var1 = 0 + foo = _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=52, lineno=4, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt index c844dc656..8e6f83c6b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt @@ -1,20 +1,20 @@ -_mecha_lineno = [1, 7, 10], [1, 2, 3] -_mecha_helper_interpolate_json = _mecha_runtime.helpers['interpolate_json'] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: +_bolt_lineno = [1, 7, 10], [1, 2, 3] +_bolt_helper_interpolate_json = _bolt_runtime.helpers['interpolate_json'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: def f(x): - _mecha_var0 = x - _mecha_var0 = _mecha_helper_interpolate_json(_mecha_var0, _mecha_refs[0]) - _mecha_runtime.commands.append(_mecha_helper_replace(_mecha_refs[2], arguments=_mecha_helper_children([_mecha_refs[1], _mecha_var0]))) - _mecha_var1 = f - _mecha_var2 = 'thing' - _mecha_var1 = _mecha_var1(_mecha_var2) -_mecha_var4 = _mecha_helper_replace(_mecha_refs[3], commands=_mecha_helper_children(_mecha_var3)) + _bolt_var0 = x + _bolt_var0 = _bolt_helper_interpolate_json(_bolt_var0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var0]))) + _bolt_var1 = f + _bolt_var2 = 'thing' + _bolt_var1 = _bolt_var1(_bolt_var2) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=25, lineno=2, colno=16) end_location: SourceLocation(pos=26, lineno=2, colno=17) @@ -23,14 +23,14 @@ _mecha_refs[0] converter: 'json' value: -_mecha_refs[1] +_bolt_refs[1] location: SourceLocation(pos=22, lineno=2, colno=13) end_location: SourceLocation(pos=24, lineno=2, colno=15) variable: 'a' arguments: -_mecha_refs[2] +_bolt_refs[2] location: SourceLocation(pos=14, lineno=2, colno=5) end_location: SourceLocation(pos=26, lineno=2, colno=17) @@ -38,7 +38,7 @@ _mecha_refs[2] arguments: -_mecha_refs[3] +_bolt_refs[3] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=38, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_8__1.txt b/packages/bolt/tests/snapshots/bolt__parse_8__1.txt index efd974dc5..eb2d5cec3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_8__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_8__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 1 - _mecha_var1 = 2 - _mecha_var2 = 3 - _mecha_var1 = _mecha_var1 + _mecha_var2 - _mecha_var0 = _mecha_var0 - _mecha_var1 -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var2 = 3 + _bolt_var1 = _bolt_var1 + _bolt_var2 + _bolt_var0 = _bolt_var0 - _bolt_var1 +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_91__1.txt b/packages/bolt/tests/snapshots/bolt__parse_91__1.txt index e6e4d1233..f629dbf18 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_91__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_91__1.txt @@ -1,15 +1,15 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var3: - _mecha_var0 = 'foo' - _mecha_var1 = 'bar' - _mecha_var2 = {_mecha_var0: _mecha_var1} -_mecha_var4 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var3)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = 'foo' + _bolt_var1 = 'bar' + _bolt_var2 = {_bolt_var0: _bolt_var1} +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) --- -output = _mecha_var4 +output = _bolt_var4 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=19, lineno=4, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_92__1.txt b/packages/bolt/tests/snapshots/bolt__parse_92__1.txt index bbf0a2433..5619424ae 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_92__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_92__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1, 7, 9], [1, 3, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'hello' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 'bar' - _mecha_var3 = {_mecha_var1: _mecha_var2} -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1, 7, 9], [1, 3, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 'hello' + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_var2 = 'bar' + _bolt_var3 = {_bolt_var1: _bolt_var2} +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=33, lineno=5, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_93__1.txt b/packages/bolt/tests/snapshots/bolt__parse_93__1.txt index 548458ea4..f5a93bd0e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_93__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_93__1.txt @@ -1,17 +1,17 @@ -_mecha_lineno = [1, 8, 9], [1, 3, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var4: - _mecha_var0 = 'hello' - foo = _mecha_var0 - _mecha_var1 = 'foo' - _mecha_var2 = foo - _mecha_var3 = {_mecha_var1: _mecha_var2} -_mecha_var5 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var4)) +_bolt_lineno = [1, 8, 9], [1, 3, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 'hello' + foo = _bolt_var0 + _bolt_var1 = 'foo' + _bolt_var2 = foo + _bolt_var3 = {_bolt_var1: _bolt_var2} +_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) --- -output = _mecha_var5 +output = _bolt_var5 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=33, lineno=5, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_94__1.txt b/packages/bolt/tests/snapshots/bolt__parse_94__1.txt index d87e0678d..4b32bee3d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_94__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_94__1.txt @@ -1,23 +1,23 @@ -_mecha_lineno = [1, 7, 13, 15], [1, 3, 4, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: - _mecha_var0 = 'hello' - foo = _mecha_var0 - _mecha_var1 = foo - _mecha_var2 = 3 - _mecha_var1 = _mecha_var1 * _mecha_var2 - _mecha_var3 = 42 - _mecha_var4 = 16 - _mecha_var5 = 3 - _mecha_var4 = _mecha_var4 + _mecha_var5 - _mecha_var6 = [] - _mecha_var7 = {_mecha_var1: _mecha_var3, _mecha_var4: _mecha_var6} -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) +_bolt_lineno = [1, 7, 13, 15], [1, 3, 4, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var8: + _bolt_var0 = 'hello' + foo = _bolt_var0 + _bolt_var1 = foo + _bolt_var2 = 3 + _bolt_var1 = _bolt_var1 * _bolt_var2 + _bolt_var3 = 42 + _bolt_var4 = 16 + _bolt_var5 = 3 + _bolt_var4 = _bolt_var4 + _bolt_var5 + _bolt_var6 = [] + _bolt_var7 = {_bolt_var1: _bolt_var3, _bolt_var4: _bolt_var6} +_bolt_var9 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var8)) --- -output = _mecha_var9 +output = _bolt_var9 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=51, lineno=6, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_95__1.txt b/packages/bolt/tests/snapshots/bolt__parse_95__1.txt index 9cd4b2b6f..51940e1be 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_95__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_95__1.txt @@ -1,32 +1,32 @@ -_mecha_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var19: - _mecha_var0 = 'condition' - _mecha_var1 = 'minecraft:entity_scores' - _mecha_var2 = 'entity' - _mecha_var3 = 'this' - _mecha_var4 = 'scores' - _mecha_var5 = 'score1' - _mecha_var6 = 'min' - _mecha_var7 = 'type' - _mecha_var8 = 'minecraft:score' - _mecha_var9 = 'target' - _mecha_var10 = 'this' - _mecha_var11 = 'score' - _mecha_var12 = 'score2' - _mecha_var13 = 'scale' - _mecha_var14 = 1 - _mecha_var15 = {_mecha_var7: _mecha_var8, _mecha_var9: _mecha_var10, _mecha_var11: _mecha_var12, _mecha_var13: _mecha_var14} - _mecha_var16 = {_mecha_var6: _mecha_var15} - _mecha_var17 = {_mecha_var5: _mecha_var16} - _mecha_var18 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3, _mecha_var4: _mecha_var17} - my_predicate = _mecha_var18 -_mecha_var20 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var19)) +_bolt_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var19: + _bolt_var0 = 'condition' + _bolt_var1 = 'minecraft:entity_scores' + _bolt_var2 = 'entity' + _bolt_var3 = 'this' + _bolt_var4 = 'scores' + _bolt_var5 = 'score1' + _bolt_var6 = 'min' + _bolt_var7 = 'type' + _bolt_var8 = 'minecraft:score' + _bolt_var9 = 'target' + _bolt_var10 = 'this' + _bolt_var11 = 'score' + _bolt_var12 = 'score2' + _bolt_var13 = 'scale' + _bolt_var14 = 1 + _bolt_var15 = {_bolt_var7: _bolt_var8, _bolt_var9: _bolt_var10, _bolt_var11: _bolt_var12, _bolt_var13: _bolt_var14} + _bolt_var16 = {_bolt_var6: _bolt_var15} + _bolt_var17 = {_bolt_var5: _bolt_var16} + _bolt_var18 = {_bolt_var0: _bolt_var1, _bolt_var2: _bolt_var3, _bolt_var4: _bolt_var17} + my_predicate = _bolt_var18 +_bolt_var20 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var19)) --- -output = _mecha_var20 +output = _bolt_var20 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=251, lineno=15, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt index 0dad714c1..c9a6cd2a8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt @@ -1,32 +1,32 @@ -_mecha_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var19: - _mecha_var0 = 'condition' - _mecha_var1 = 'minecraft:entity_scores' - _mecha_var2 = 'entity' - _mecha_var3 = 'this' - _mecha_var4 = 'scores' - _mecha_var5 = 'score1' - _mecha_var6 = 'min' - _mecha_var7 = 'type' - _mecha_var8 = 'minecraft:score' - _mecha_var9 = 'target' - _mecha_var10 = 'this' - _mecha_var11 = 'score' - _mecha_var12 = 'score2' - _mecha_var13 = 'scale' - _mecha_var14 = 1 - _mecha_var15 = {_mecha_var7: _mecha_var8, _mecha_var9: _mecha_var10, _mecha_var11: _mecha_var12, _mecha_var13: _mecha_var14} - _mecha_var16 = {_mecha_var6: _mecha_var15} - _mecha_var17 = {_mecha_var5: _mecha_var16} - _mecha_var18 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var3, _mecha_var4: _mecha_var17} - my_predicate = _mecha_var18 -_mecha_var20 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var19)) +_bolt_lineno = [1, 20, 21, 22, 23], [1, 6, 5, 4, 1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var19: + _bolt_var0 = 'condition' + _bolt_var1 = 'minecraft:entity_scores' + _bolt_var2 = 'entity' + _bolt_var3 = 'this' + _bolt_var4 = 'scores' + _bolt_var5 = 'score1' + _bolt_var6 = 'min' + _bolt_var7 = 'type' + _bolt_var8 = 'minecraft:score' + _bolt_var9 = 'target' + _bolt_var10 = 'this' + _bolt_var11 = 'score' + _bolt_var12 = 'score2' + _bolt_var13 = 'scale' + _bolt_var14 = 1 + _bolt_var15 = {_bolt_var7: _bolt_var8, _bolt_var9: _bolt_var10, _bolt_var11: _bolt_var12, _bolt_var13: _bolt_var14} + _bolt_var16 = {_bolt_var6: _bolt_var15} + _bolt_var17 = {_bolt_var5: _bolt_var16} + _bolt_var18 = {_bolt_var0: _bolt_var1, _bolt_var2: _bolt_var3, _bolt_var4: _bolt_var17} + my_predicate = _bolt_var18 +_bolt_var20 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var19)) --- -output = _mecha_var20 +output = _bolt_var20 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=237, lineno=15, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt index 5fd46d00b..778542a4c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt @@ -1,24 +1,24 @@ -_mecha_lineno = [1, 6], [1, 2] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var8: +_bolt_lineno = [1, 6], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var8: def f(): - _mecha_var0 = f - _mecha_var0 = _mecha_var0() - _mecha_var1 = f - _mecha_var1 = _mecha_var1() - _mecha_var2 = 'other' - _mecha_var3 = {} - _mecha_var4 = {} - _mecha_var5 = 'wat' - _mecha_var6 = [_mecha_var3, _mecha_var4, _mecha_var5] - _mecha_var7 = {_mecha_var0: _mecha_var1, _mecha_var2: _mecha_var6} - return _mecha_var7 -_mecha_var9 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var8)) + _bolt_var0 = f + _bolt_var0 = _bolt_var0() + _bolt_var1 = f + _bolt_var1 = _bolt_var1() + _bolt_var2 = 'other' + _bolt_var3 = {} + _bolt_var4 = {} + _bolt_var5 = 'wat' + _bolt_var6 = [_bolt_var3, _bolt_var4, _bolt_var5] + _bolt_var7 = {_bolt_var0: _bolt_var1, _bolt_var2: _bolt_var6} + return _bolt_var7 +_bolt_var9 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var8)) --- -output = _mecha_var9 +output = _bolt_var9 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=54, lineno=2, colno=46) diff --git a/packages/bolt/tests/snapshots/bolt__parse_9__1.txt b/packages/bolt/tests/snapshots/bolt__parse_9__1.txt index a9d6a0af8..e90b718ef 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_9__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_9__1.txt @@ -1,16 +1,16 @@ -_mecha_lineno = [1], [1] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var2: - _mecha_var0 = 2 - _mecha_var1 = 54 - _mecha_var1 = - _mecha_var1 - _mecha_var0 = _mecha_var0 + _mecha_var1 -_mecha_var3 = _mecha_helper_replace(_mecha_refs[0], commands=_mecha_helper_children(_mecha_var2)) +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 2 + _bolt_var1 = 54 + _bolt_var1 = - _bolt_var1 + _bolt_var0 = _bolt_var0 + _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) --- -output = _mecha_var3 +output = _bolt_var3 --- -_mecha_refs[0] +_bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=2, colno=1) diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md index 477107ef1..29325227e 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md @@ -24,13 +24,13 @@ `@function demo:foo` ```mcfunction -_mecha_lineno = [1, 7], [1, 4] -_mecha_helper_children = _mecha_runtime.helpers['children'] -_mecha_helper_replace = _mecha_runtime.helpers['replace'] -with _mecha_runtime.scope() as _mecha_var1: +_bolt_lineno = [1, 7], [1, 4] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: def say_hello(): - _mecha_runtime.commands.extend(_mecha_refs[0].commands) - _mecha_var0 = say_hello - _mecha_var0 = _mecha_var0() -_mecha_var2 = _mecha_helper_replace(_mecha_refs[1], commands=_mecha_helper_children(_mecha_var1)) + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = say_hello + _bolt_var0 = _bolt_var0() +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) ``` diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py index e018abf72..b285d90d3 100644 --- a/packages/bolt/tests/test_bolt.py +++ b/packages/bolt/tests/test_bolt.py @@ -44,7 +44,7 @@ def test_parse(snapshot: SnapshotFixture, ctx_bolt: Context, source: Function): text, output, refs = runtime.codegen(ast) text = text or "# Nothing\n" assert snapshot() == f"{text}---\noutput = {output}\n---\n" + "".join( - f"_mecha_refs[{i}]\n{obj.dump(shallow=True) if isinstance(obj, AstNode) else repr(obj)}\n" + f"_bolt_refs[{i}]\n{obj.dump(shallow=True) if isinstance(obj, AstNode) else repr(obj)}\n" for i, obj in enumerate(refs) ) elif diagnostics: From 86411f47b86ea27f2225e9cb4f9441a2b128f66d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Jun 2022 22:17:52 +0200 Subject: [PATCH 0873/1554] chore: update pyright --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 69724d573..0703d5c20 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.248" + "pyright": "^1.1.254" } }, "node_modules/pyright": { - "version": "1.1.248", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", - "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", + "version": "1.1.254", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", + "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.248", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.248.tgz", - "integrity": "sha512-CYnZ5IbLZV7hEd/55LdiF40nUfm/lc7fIxMg6Fum0Xk/cYujAqwvp5zWIpJ9KonzKlPprOI4CQXlea7d/gmErQ==", + "version": "1.1.254", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", + "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 6ef5ea31b..ce423b29d 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.248" + "pyright": "^1.1.254" } } From 8205c74dfede0112b09504a15bf5cd97408658a6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Jun 2022 22:21:44 +0200 Subject: [PATCH 0874/1554] chore: bump lectern --- packages/bolt/poetry.lock | 2 +- packages/bolt/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index ad52806ab..6fac9602e 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "69eaec6dc676884c6bc8f84bb0e475a5e0614d572399c4b8689210420bff7ab8" +content-hash = "0727ac01b0e41167696ac756a365d64f3146f93c7472abe1cebd87a072d0aa7b" [metadata.files] atomicwrites = [ diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 38a62d117..f072b099a 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -32,7 +32,7 @@ black = "^22.3.0" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" -lectern = ">=0.20.1" +lectern = ">=0.21.2" [tool.pytest.ini_options] addopts = "tests bolt --doctest-modules" From 95432721e31c34e60e20f5c8eb9155cc6f70e16c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Jun 2022 22:25:16 +0200 Subject: [PATCH 0875/1554] chore: reset poetry cache --- packages/bolt/.github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bolt/.github/workflows/main.yml b/packages/bolt/.github/workflows/main.yml index 4d6aa43d0..cbcd40aba 100644 --- a/packages/bolt/.github/workflows/main.yml +++ b/packages/bolt/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.local - key: poetry-${{ runner.os }} + key: poetry0-${{ runner.os }} - name: Install poetry if: steps.cached-poetry.outputs.cache-hit != 'true' uses: snok/install-poetry@v1 From 6c1affba87bccca33b08f04aa52db9321a188d39 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 15 Jun 2022 20:27:20 +0000 Subject: [PATCH 0876/1554] 0.7.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 7 +++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 727b34495..45db97a55 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.7.0 (2022-06-15) +### Feature +* Support decorators ([`3e8f60b`](https://github.com/mcbeet/bolt/commit/3e8f60bf9b7e9c74b631bdf689f4370f76f37766)) + +### Fix +* Change prefix of codegen variables ([`f9cc901`](https://github.com/mcbeet/bolt/commit/f9cc9013ba1dd1333a2b5a199c29c84d054e15be)) + ## v0.6.0 (2022-05-27) ### Feature * Add bolt.contrib.debug_codegen ([`d504b00`](https://github.com/mcbeet/bolt/commit/d504b00867bf22770708e6eeb6190ed790f0a483)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 9ef727766..88d285a33 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f072b099a..014ea47e7 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.6.0" +version = "0.7.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 43bae7f982ac27a1c5465db332b6405aa5136d74 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 15 Jun 2022 23:01:08 +0200 Subject: [PATCH 0877/1554] fix: track bolt version in cached ast --- packages/bolt/bolt/runtime.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 18bbe8881..3393ca102 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -22,7 +22,7 @@ from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union from beet import BubbleException, Context, TextFile, TextFileBase, generate_tree -from beet.core.utils import JsonDict, required_field +from beet.core.utils import JsonDict, import_from_string, required_field from mecha import ( AstCacheBackend, AstCommand, @@ -329,6 +329,17 @@ class ModuleCacheBackend(AstCacheBackend): """Cache backend that also restores the generated modules.""" runtime: Runtime = required_field() + bolt_version: str = import_from_string("bolt.__version__") + + def load_data(self, f: BufferedReader) -> JsonDict: + data = super().load_data(f) + if data["bolt"] != self.bolt_version: + raise ValueError("Version mismatch.") + return data + + def dump_data(self, data: JsonDict, f: BufferedWriter): + data["bolt"] = self.bolt_version + super().dump_data(data, f) def load(self, f: BufferedReader) -> AstRoot: data = self.load_data(f) From dbcc985978ef7a022f1ebfbfca4445a71148e65c Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 15 Jun 2022 21:01:46 +0000 Subject: [PATCH 0878/1554] 0.7.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 45db97a55..0ec79fca3 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.7.1 (2022-06-15) +### Fix +* Track bolt version in cached ast ([`1e5d2d1`](https://github.com/mcbeet/bolt/commit/1e5d2d119872397dadac006c18b2c3909ccf6496)) + ## v0.7.0 (2022-06-15) ### Feature * Support decorators ([`3e8f60b`](https://github.com/mcbeet/bolt/commit/3e8f60bf9b7e9c74b631bdf689f4370f76f37766)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 88d285a33..c42bb45fd 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.7.0" +__version__ = "0.7.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 014ea47e7..f0096fc84 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.7.0" +version = "0.7.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 20637a82184e72da8a1cf57d7e324461d2dcf4cc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 17 Jun 2022 20:37:44 +0200 Subject: [PATCH 0879/1554] fix: only restrict builtins when sandbox is active --- packages/bolt/bolt/contrib/sandbox.py | 48 ++++++++++++++++++ packages/bolt/bolt/runtime.py | 5 +- packages/bolt/bolt/utils.py | 49 ------------------- .../resources/sandbox_examples.mcfunction | 2 + .../tests/snapshots/sandbox__run_8__0.txt | 5 ++ packages/bolt/tests/test_sandbox.py | 11 +++-- 6 files changed, 66 insertions(+), 54 deletions(-) create mode 100644 packages/bolt/tests/snapshots/sandbox__run_8__0.txt diff --git a/packages/bolt/bolt/contrib/sandbox.py b/packages/bolt/bolt/contrib/sandbox.py index c07bbca2b..7664ef9f1 100644 --- a/packages/bolt/bolt/contrib/sandbox.py +++ b/packages/bolt/bolt/contrib/sandbox.py @@ -51,6 +51,7 @@ class Sandbox: runtime: Runtime active: bool + allowed_builtins: Set[str] allowed_imports: Set[str] allowed_obj_attrs: Dict[Any, Set[str]] allowed_type_attrs: Dict[Type[Any], Set[str]] @@ -63,6 +64,52 @@ def __init__(self, ctx: Union[Context, Runtime]): self.active = False + self.allowed_builtins = { + "abs", + "all", + "any", + "ascii", + "bin", + "bool", + "callable", + "chr", + "dict", + "divmod", + "enumerate", + "filter", + "float", + "frozenset", + "hasattr", + "hash", + "hex", + "int", + "isinstance", + "issubclass", + "iter", + "len", + "list", + "map", + "max", + "min", + "next", + "object", + "oct", + "ord", + "pow", + "print", + "range", + "repr", + "reversed", + "round", + "set", + "slice", + "sorted", + "str", + "sum", + "tuple", + "type", + "zip", + } self.allowed_imports = { "json", "math", @@ -110,6 +157,7 @@ def activate(self): if self.active: return self.active = True + self.runtime.builtins &= self.allowed_builtins self.runtime.globals["ctx"] = None self.runtime.helpers.update( get_attribute=SandboxedGetAttribute( diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 3393ca102..a98a32f0c 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -11,6 +11,7 @@ ] +import builtins import logging import marshal from contextlib import contextmanager @@ -47,7 +48,7 @@ from .helpers import get_bolt_helpers from .loop_info import loop_info from .parse import get_bolt_parsers -from .utils import SAFE_BUILTINS, internal, rewrite_traceback +from .utils import internal, rewrite_traceback logger = logging.getLogger("mecha") @@ -109,7 +110,7 @@ def __init__(self, ctx: Union[Context, Mecha]): self.commands = [] self.helpers = get_bolt_helpers() self.globals = {"ctx": None, "loop_info": loop_info} - self.builtins = set(SAFE_BUILTINS) + self.builtins = {name for name in dir(builtins) if not name.startswith("_")} if isinstance(ctx, Context): ctx.require( diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py index 99e0d53d9..ad742d4df 100644 --- a/packages/bolt/bolt/utils.py +++ b/packages/bolt/bolt/utils.py @@ -3,7 +3,6 @@ "fake_traceback", "internal", "INTERNAL_CODE", - "SAFE_BUILTINS", ] @@ -24,54 +23,6 @@ def internal(f: T) -> T: return f -SAFE_BUILTINS: List[str] = [ - "abs", - "all", - "any", - "ascii", - "bin", - "bool", - "callable", - "chr", - "dict", - "divmod", - "enumerate", - "filter", - "float", - "frozenset", - "hasattr", - "hash", - "hex", - "int", - "isinstance", - "issubclass", - "iter", - "len", - "list", - "map", - "max", - "min", - "next", - "object", - "oct", - "ord", - "pow", - "print", - "range", - "repr", - "reversed", - "round", - "set", - "slice", - "sorted", - "str", - "sum", - "tuple", - "type", - "zip", -] - - def rewrite_traceback(exc: Exception) -> Exception: tb = exc.__traceback__ and exc.__traceback__.tb_next diff --git a/packages/bolt/tests/resources/sandbox_examples.mcfunction b/packages/bolt/tests/resources/sandbox_examples.mcfunction index 86a571a18..1c6e4fa3a 100644 --- a/packages/bolt/tests/resources/sandbox_examples.mcfunction +++ b/packages/bolt/tests/resources/sandbox_examples.mcfunction @@ -17,3 +17,5 @@ print(f'foo {str.__name__} bar') foo = "a{x.__class__}b".format_map({"x":42}) ### say __name__.format() +### +open("/etc/passwd") diff --git a/packages/bolt/tests/snapshots/sandbox__run_8__0.txt b/packages/bolt/tests/snapshots/sandbox__run_8__0.txt new file mode 100644 index 000000000..f9e4b1aa4 --- /dev/null +++ b/packages/bolt/tests/snapshots/sandbox__run_8__0.txt @@ -0,0 +1,5 @@ +open("/etc/passwd") +--- +Reported 1 error. + +File "demo:foo", line 1, column 1: Identifier 'open' is not defined. \ No newline at end of file diff --git a/packages/bolt/tests/test_sandbox.py b/packages/bolt/tests/test_sandbox.py index d9029e9a6..f69442bf0 100644 --- a/packages/bolt/tests/test_sandbox.py +++ b/packages/bolt/tests/test_sandbox.py @@ -3,7 +3,7 @@ import pytest from beet import Context, Function, run_beet from beet.core.utils import format_exc -from mecha import CompilationError, Mecha +from mecha import CompilationError, DiagnosticError, Mecha from pytest_insta import SnapshotFixture SANDBOX_EXAMPLES = [ @@ -28,7 +28,12 @@ def ctx_sandbox(): def test_run(snapshot: SnapshotFixture, ctx_sandbox: Context, source: Function): mc = ctx_sandbox.inject(Mecha) - with pytest.raises(CompilationError) as exc_info: + with pytest.raises((CompilationError, DiagnosticError)) as exc_info: mc.compile(source, resource_location="demo:foo") - assert snapshot() == f"{source.text}---\n{format_exc(exc_info.value.__cause__)}" # type: ignore + details = ( + format_exc(exc_info.value.__cause__) + if isinstance(exc_info.value, CompilationError) + else str(exc_info.value) + ) + assert snapshot() == f"{source.text}---\n{details}" # type: ignore From 772c170f518d0dab1290d1bdb2ee6180c8762a0f Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 17 Jun 2022 18:51:30 +0000 Subject: [PATCH 0880/1554] 0.7.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 0ec79fca3..00e3183c0 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.7.2 (2022-06-17) +### Fix +* Only restrict builtins when sandbox is active ([`8eefb0c`](https://github.com/mcbeet/bolt/commit/8eefb0cf1f5d6f3a6b0e472ffb1da0e6b60ba5e7)) + ## v0.7.1 (2022-06-15) ### Fix * Track bolt version in cached ast ([`1e5d2d1`](https://github.com/mcbeet/bolt/commit/1e5d2d119872397dadac006c18b2c3909ccf6496)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index c42bb45fd..e66bf1b13 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.7.1" +__version__ = "0.7.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f0096fc84..c84d123e3 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.7.1" +version = "0.7.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From c40bbfc0ca794c407b2bc676b6b3919befff319b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 00:05:20 +0200 Subject: [PATCH 0881/1554] fix: handle nested redirects --- packages/mecha/mecha/config.py | 17 ++++++++++++----- packages/mecha/mecha/spec.py | 17 ++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index 04ace8996..ace7d9e65 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -6,7 +6,7 @@ import json from importlib.resources import read_text from pathlib import Path -from typing import Dict, Iterator, List, Literal, Optional, Tuple, Union +from typing import Dict, Iterator, List, Literal, Optional, Set, Tuple, Union from beet import ErrorMessage from beet.core.utils import FileSystemPath, JsonDict @@ -139,19 +139,26 @@ def resolve( if not root: root = self + hoisted: Set[str] = set() + if self.redirect is not None: if target := root.get(self.redirect): if scope[: len(self.redirect)] == self.redirect: target.subcommand = True - self.children = target.children + if target.children: + if not self.children: + self.children = {} + self.children.update(target.children) + hoisted.update(target.children) else: raise ValueError(f"Invalid redirect {self.redirect}.") - elif self.children: + if self.children: for name, child in self.children.items(): - child.resolve(root, scope + (name,)) + if name not in hoisted: + child.resolve(root, scope + (name,)) - elif not self.executable: + if self.redirect is None and not self.children and not self.executable: self.redirect = () self.resolve(root, scope) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 0ea4b1d6d..231318bb2 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -5,7 +5,7 @@ from dataclasses import dataclass -from typing import Any, Dict, Protocol, Tuple, Union +from typing import Any, Dict, Protocol, Set, Tuple, Union from beet.core.utils import JsonDict, extra_field from tokenstream import TokenStream @@ -65,8 +65,13 @@ def generate_prototypes( identifier, signature, arguments ) - target = self.tree.get(tree.redirect) - recursive = target and target.subcommand + recursive = False + hoisted: Set[str] = set() + + if target := self.tree.get(tree.redirect): + recursive = target.subcommand + if recursive and target.children: + hoisted.update(target.children) if scope and tree.subcommand or recursive: identifier = ":".join(scope + ("subcommand",)) @@ -81,9 +86,11 @@ def generate_prototypes( offset for arg in arguments if (offset := arg - len(scope)) >= 0 ) - if tree.children and not recursive: + if tree.children: for name, child in tree.children.items(): - if child.type == "literal": + if name in hoisted: + continue + elif child.type == "literal": self.generate_prototypes( child, scope + (name,), From 33b7c357cc6809a13c6cb0341cc2bbdea987f961 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 17 Jun 2022 22:06:44 +0000 Subject: [PATCH 0882/1554] 0.52.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 9655d0e55..4d5e42b6b 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.52.3 (2022-06-17) +### Fix +* Handle nested redirects ([`179bdcd`](https://github.com/mcbeet/mecha/commit/179bdcdbb6e62caeed100285425f0b964aa9b30d)) + ## v0.52.2 (2022-05-27) ### Fix * Slice update to modify steps ([`76fb08c`](https://github.com/mcbeet/mecha/commit/76fb08c21887ce1386dae0788428b8e96cd6362a)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index de7984569..08ccea3ed 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.52.2" +__version__ = "0.52.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index d2f1ba493..e64d9ecfc 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.52.2" +version = "0.52.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 1b6b6f43b0b0caded0255395927850a95873a21d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jun 2022 12:35:16 +0000 Subject: [PATCH 0883/1554] chore(deps-dev): bump pyright from 1.1.249 to 1.1.254 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.249 to 1.1.254. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.254/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index fb4d641c3..0622a4a71 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.249" + "pyright": "^1.1.254" } }, "node_modules/pyright": { - "version": "1.1.249", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.249.tgz", - "integrity": "sha512-/pLue74RMbc6j+XkbDNIWmQ4EHw0kar3Juw6fN5+AjtJeY7a5cpSi2q023OZymqoTAaYzPxP5v+p87/sqFjTqg==", + "version": "1.1.254", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", + "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.249", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.249.tgz", - "integrity": "sha512-/pLue74RMbc6j+XkbDNIWmQ4EHw0kar3Juw6fN5+AjtJeY7a5cpSi2q023OZymqoTAaYzPxP5v+p87/sqFjTqg==", + "version": "1.1.254", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", + "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index fcf0dcef5..ce423b29d 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.249" + "pyright": "^1.1.254" } } From f9f6c185e71cc93d33275556c6665e7fc2b3f3de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jun 2022 12:24:18 +0000 Subject: [PATCH 0884/1554] chore(deps): bump tokenstream from 1.4.1 to 1.4.2 Bumps [tokenstream](https://github.com/vberlier/tokenstream) from 1.4.1 to 1.4.2. - [Release notes](https://github.com/vberlier/tokenstream/releases) - [Changelog](https://github.com/vberlier/tokenstream/blob/main/CHANGELOG.md) - [Commits](https://github.com/vberlier/tokenstream/compare/v1.4.1...v1.4.2) --- updated-dependencies: - dependency-name: tokenstream dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 8 ++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index fd1d45a76..9ebc7cf88 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -694,7 +694,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "1.4.1" +version = "1.4.2" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "82fc536c064be3dfb78cea9fb5236d58b13a13f911eb17e6af9ab3482680fd01" +content-hash = "8ba4cb0f3579e33b922852f5be237f9c5276c10078660c5b277932246815e521" [metadata.files] atomicwrites = [ @@ -1251,8 +1251,8 @@ smmap = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] tokenstream = [ - {file = "tokenstream-1.4.1-py3-none-any.whl", hash = "sha256:66b42b059e1bda1b88dc54b63f4de935e1e8e2f1f746e06d5323e694d10d38fa"}, - {file = "tokenstream-1.4.1.tar.gz", hash = "sha256:a3e65dea39ca75a3cbe68880f325cd65a0b957f952137bc8bd2eeca8b4a44df7"}, + {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, + {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e64d9ecfc..f4e6b597d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,7 +24,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.67.0" -tokenstream = "1.4.1" +tokenstream = "1.4.2" [tool.poetry.dev-dependencies] black = "^22.3.0" From 781149ab7eb3d4d4d24859e53565b70ffdc86bcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jun 2022 12:27:52 +0000 Subject: [PATCH 0885/1554] chore(deps): bump beet from 0.67.0 to 0.67.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.67.0 to 0.67.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.67.0...v0.67.1) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 9ebc7cf88..0c8af0fdd 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.67.0" +version = "0.67.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.67.0-py3-none-any.whl", hash = "sha256:4e44e7278be50ebd8dec697e411ccdc377a24308e21cdb197f071dfbe1e1cde7"}, - {file = "beet-0.67.0.tar.gz", hash = "sha256:f6796b7a8e8241aabbbf5b7e15403e87645055b4ec952bb9cfc0a5c0ba52d48d"}, + {file = "beet-0.67.1-py3-none-any.whl", hash = "sha256:1b849bef4133012f3f058ea7a56a2250b4afd9bc2bdf785c7d381bf3b2a7bca3"}, + {file = "beet-0.67.1.tar.gz", hash = "sha256:cd874be2e4894be467043bebd6477b04ccebb8c52e5d5957db539371dd47c4b2"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, From ff61f0004816e2a0500e878905935f318d3df0ca Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 00:22:30 +0200 Subject: [PATCH 0886/1554] feat: default to minecraft 1.19 --- .../src/data/demo/functions/foo.mcfunction | 1 - .../{basic_1.19 => basic_1_18}/beet.yml | 2 +- .../src/data/demo/functions/foo.mcfunction | 1 + packages/mecha/mecha/api.py | 4 +- packages/mecha/mecha/cli.py | 2 +- packages/mecha/mecha/parse.py | 2 +- packages/mecha/mecha/resources/patches.json | 2 +- packages/mecha/mecha/spec.py | 2 +- .../resources/command_examples.mcfunction | 8 +- ... => examples__build_basic_1_18__0.pack.md} | 2 +- .../snapshots/parse__command_examples__0.txt | 3248 ++++++++--------- .../snapshots/parse__command_examples__1.txt | 6 +- .../tests/snapshots/spec__prototypes__0.json | 895 ++--- 13 files changed, 2094 insertions(+), 2081 deletions(-) delete mode 100644 packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction rename packages/mecha/examples/{basic_1.19 => basic_1_18}/beet.yml (76%) create mode 100644 packages/mecha/examples/basic_1_18/src/data/demo/functions/foo.mcfunction rename packages/mecha/tests/snapshots/{examples__build_basic_1_19__0.pack.md => examples__build_basic_1_18__0.pack.md} (86%) diff --git a/packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction deleted file mode 100644 index 8642e0565..000000000 --- a/packages/mecha/examples/basic_1.19/src/data/demo/functions/foo.mcfunction +++ /dev/null @@ -1 +0,0 @@ -locate structure demo:thingy diff --git a/packages/mecha/examples/basic_1.19/beet.yml b/packages/mecha/examples/basic_1_18/beet.yml similarity index 76% rename from packages/mecha/examples/basic_1.19/beet.yml rename to packages/mecha/examples/basic_1_18/beet.yml index 2339c64a5..1a6f9a59b 100644 --- a/packages/mecha/examples/basic_1.19/beet.yml +++ b/packages/mecha/examples/basic_1_18/beet.yml @@ -4,4 +4,4 @@ pipeline: - mecha meta: mecha: - version: 1.19 + version: 1.18 diff --git a/packages/mecha/examples/basic_1_18/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_1_18/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..be7ae0a41 --- /dev/null +++ b/packages/mecha/examples/basic_1_18/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +locate endcity diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index d6bcd36a5..a01b027f5 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -85,7 +85,7 @@ def dump(self, node: AstRoot, f: BufferedWriter): class MechaOptions(BaseModel): """Mecha options.""" - version: VersionNumber = "1.18" + version: VersionNumber = "1.19" multiline: bool = False formatting: Formatting = "dense" readonly: Optional[bool] = None @@ -99,7 +99,7 @@ class Mecha: """Class exposing the command api.""" ctx: InitVar[Optional[Context]] = None - version: InitVar[VersionNumber] = "1.18" + version: InitVar[VersionNumber] = "1.19" multiline: InitVar[bool] = False formatting: InitVar[Formatting] = "dense" readonly: bool = False diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py index be1e24fee..800907b98 100644 --- a/packages/mecha/mecha/cli.py +++ b/packages/mecha/mecha/cli.py @@ -44,7 +44,7 @@ def validate(ctx: Context): "-m", "--minecraft", metavar="VERSION", - default="1.18", + default="1.19", help="Minecraft version.", ) @click.option( diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 642140b0f..78ba4a9d0 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -454,7 +454,7 @@ def get_default_parsers() -> Dict[str, Parser]: } -def get_parsers(version: VersionNumber = "1.18") -> Dict[str, Parser]: +def get_parsers(version: VersionNumber = "1.19") -> Dict[str, Parser]: """Return parsers for a specific version.""" version = split_version(version) diff --git a/packages/mecha/mecha/resources/patches.json b/packages/mecha/mecha/resources/patches.json index 4e041a457..7052926b9 100644 --- a/packages/mecha/mecha/resources/patches.json +++ b/packages/mecha/mecha/resources/patches.json @@ -1,6 +1,6 @@ [ { - "versions": ["1.16", "1.17", "1.18"], + "versions": ["1.16", "1.17", "1.18", "1.19"], "config": { "type": "root", "children": { diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 231318bb2..4b13ae286 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -28,7 +28,7 @@ class CommandSpec: multiline: bool = False tree: CommandTree = extra_field( - default_factory=lambda: CommandTree.load_from(version="1.18") + default_factory=lambda: CommandTree.load_from(version="1.19") ) prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) diff --git a/packages/mecha/tests/resources/command_examples.mcfunction b/packages/mecha/tests/resources/command_examples.mcfunction index 2078ea156..3893612bc 100644 --- a/packages/mecha/tests/resources/command_examples.mcfunction +++ b/packages/mecha/tests/resources/command_examples.mcfunction @@ -40,11 +40,11 @@ execute facing ^1 ^ ^ run tp ~ ~ ~ execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 ~ ~ execute as @e[type=!player] at @s facing entity @p feet run tp @s ^ ^ ^1 -execute in the_end run locate endcity +execute in the_end run locate structure endcity execute in minecraft:the_nether positioned as @s run tp ~ ~ ~ execute in minecraft:the_nether run tp ~ ~ ~ execute in minecraft:the_nether run tp ~ ~ ~5 -execute positioned 0 64 0 run locate village +execute positioned 0 64 0 run locate structure village execute as @e[type=sheep] at @s rotated as @p run tp @s ^ ^ ^1 execute as @e[type=sheep] positioned as @s rotated as @p run tp @s ^ ^ ^1 execute as @a at @s if block ~ ~-1 ~ #wool run kill @s @@ -101,7 +101,7 @@ kill @e[type=!player] kill @e[distance=..10,type=creeper] kill @e[type=arrow,nbt={inBlockState: {Name: "minecraft:target"}}] # locate -locate mansion +locate structure mansion # msg msg @a Hi # particle @@ -146,6 +146,6 @@ weather rain # other scoreboard players operation #sie_1_flags_delta integer = #sie_1_flags integer scoreboard players set ✔ foo 42 -execute at @e[type=armor_stand, name="ctf", tag=!FlagBearer] run particle block_marker barrier ~ ~.8 ~ 0 0 0 0 1 force +execute at @e[type=armor_stand,name="ctf",tag=!FlagBearer] run particle block_marker barrier ~ ~.8 ~ 0 0 0 0 1 force execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 execute if entity @s[distance=..0.00000001] run function demo:foo diff --git a/packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md similarity index 86% rename from packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md rename to packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md index 2dbf79f33..25baa77c9 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_1_19__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md @@ -18,5 +18,5 @@ `@function demo:foo` ```mcfunction -locate structure demo:thingy +locate endcity ``` diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 48d4c481e..a3a20985a 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6331, lineno=152, colno=1) + end_location: SourceLocation(pos=6359, lineno=152, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -1578,12 +1578,12 @@ value: 1 location: SourceLocation(pos=1728, lineno=43, colno=1) - end_location: SourceLocation(pos=1765, lineno=43, colno=38) + end_location: SourceLocation(pos=1775, lineno=43, colno=48) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=1736, lineno=43, colno=9) - end_location: SourceLocation(pos=1765, lineno=43, colno=38) + end_location: SourceLocation(pos=1775, lineno=43, colno=48) identifier: 'execute:in:dimension:subcommand' arguments: @@ -1594,459 +1594,459 @@ path: 'the_end' location: SourceLocation(pos=1747, lineno=43, colno=20) - end_location: SourceLocation(pos=1765, lineno=43, colno=38) + end_location: SourceLocation(pos=1775, lineno=43, colno=48) identifier: 'execute:run:subcommand' arguments: location: SourceLocation(pos=1751, lineno=43, colno=24) - end_location: SourceLocation(pos=1765, lineno=43, colno=38) - identifier: 'locate:structure' + end_location: SourceLocation(pos=1775, lineno=43, colno=48) + identifier: 'locate:structure:structure' arguments: - location: SourceLocation(pos=1758, lineno=43, colno=31) - end_location: SourceLocation(pos=1765, lineno=43, colno=38) + location: SourceLocation(pos=1768, lineno=43, colno=41) + end_location: SourceLocation(pos=1775, lineno=43, colno=48) is_tag: False namespace: None path: 'endcity' - location: SourceLocation(pos=1766, lineno=44, colno=1) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1776, lineno=44, colno=1) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1774, lineno=44, colno=9) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1784, lineno=44, colno=9) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=1777, lineno=44, colno=12) - end_location: SourceLocation(pos=1797, lineno=44, colno=32) + location: SourceLocation(pos=1787, lineno=44, colno=12) + end_location: SourceLocation(pos=1807, lineno=44, colno=32) is_tag: False namespace: 'minecraft' path: 'the_nether' - location: SourceLocation(pos=1798, lineno=44, colno=33) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1808, lineno=44, colno=33) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) identifier: 'execute:positioned:as:targets:subcommand' arguments: - location: SourceLocation(pos=1812, lineno=44, colno=47) - end_location: SourceLocation(pos=1814, lineno=44, colno=49) + location: SourceLocation(pos=1822, lineno=44, colno=47) + end_location: SourceLocation(pos=1824, lineno=44, colno=49) variable: 's' arguments: - location: SourceLocation(pos=1815, lineno=44, colno=50) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1825, lineno=44, colno=50) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=1819, lineno=44, colno=54) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1829, lineno=44, colno=54) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) identifier: 'tp:location' arguments: - location: SourceLocation(pos=1822, lineno=44, colno=57) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1832, lineno=44, colno=57) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) x: - location: SourceLocation(pos=1822, lineno=44, colno=57) - end_location: SourceLocation(pos=1823, lineno=44, colno=58) + location: SourceLocation(pos=1832, lineno=44, colno=57) + end_location: SourceLocation(pos=1833, lineno=44, colno=58) type: 'relative' value: 0 y: - location: SourceLocation(pos=1824, lineno=44, colno=59) - end_location: SourceLocation(pos=1825, lineno=44, colno=60) + location: SourceLocation(pos=1834, lineno=44, colno=59) + end_location: SourceLocation(pos=1835, lineno=44, colno=60) type: 'relative' value: 0 z: - location: SourceLocation(pos=1826, lineno=44, colno=61) - end_location: SourceLocation(pos=1827, lineno=44, colno=62) + location: SourceLocation(pos=1836, lineno=44, colno=61) + end_location: SourceLocation(pos=1837, lineno=44, colno=62) type: 'relative' value: 0 - location: SourceLocation(pos=1828, lineno=45, colno=1) - end_location: SourceLocation(pos=1872, lineno=45, colno=45) + location: SourceLocation(pos=1838, lineno=45, colno=1) + end_location: SourceLocation(pos=1882, lineno=45, colno=45) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1836, lineno=45, colno=9) - end_location: SourceLocation(pos=1872, lineno=45, colno=45) + location: SourceLocation(pos=1846, lineno=45, colno=9) + end_location: SourceLocation(pos=1882, lineno=45, colno=45) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=1839, lineno=45, colno=12) - end_location: SourceLocation(pos=1859, lineno=45, colno=32) + location: SourceLocation(pos=1849, lineno=45, colno=12) + end_location: SourceLocation(pos=1869, lineno=45, colno=32) is_tag: False namespace: 'minecraft' path: 'the_nether' - location: SourceLocation(pos=1860, lineno=45, colno=33) - end_location: SourceLocation(pos=1872, lineno=45, colno=45) + location: SourceLocation(pos=1870, lineno=45, colno=33) + end_location: SourceLocation(pos=1882, lineno=45, colno=45) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=1864, lineno=45, colno=37) - end_location: SourceLocation(pos=1872, lineno=45, colno=45) + location: SourceLocation(pos=1874, lineno=45, colno=37) + end_location: SourceLocation(pos=1882, lineno=45, colno=45) identifier: 'tp:location' arguments: - location: SourceLocation(pos=1867, lineno=45, colno=40) - end_location: SourceLocation(pos=1872, lineno=45, colno=45) + location: SourceLocation(pos=1877, lineno=45, colno=40) + end_location: SourceLocation(pos=1882, lineno=45, colno=45) x: - location: SourceLocation(pos=1867, lineno=45, colno=40) - end_location: SourceLocation(pos=1868, lineno=45, colno=41) + location: SourceLocation(pos=1877, lineno=45, colno=40) + end_location: SourceLocation(pos=1878, lineno=45, colno=41) type: 'relative' value: 0 y: - location: SourceLocation(pos=1869, lineno=45, colno=42) - end_location: SourceLocation(pos=1870, lineno=45, colno=43) + location: SourceLocation(pos=1879, lineno=45, colno=42) + end_location: SourceLocation(pos=1880, lineno=45, colno=43) type: 'relative' value: 0 z: - location: SourceLocation(pos=1871, lineno=45, colno=44) - end_location: SourceLocation(pos=1872, lineno=45, colno=45) + location: SourceLocation(pos=1881, lineno=45, colno=44) + end_location: SourceLocation(pos=1882, lineno=45, colno=45) type: 'relative' value: 0 - location: SourceLocation(pos=1873, lineno=46, colno=1) - end_location: SourceLocation(pos=1918, lineno=46, colno=46) + location: SourceLocation(pos=1883, lineno=46, colno=1) + end_location: SourceLocation(pos=1928, lineno=46, colno=46) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1881, lineno=46, colno=9) - end_location: SourceLocation(pos=1918, lineno=46, colno=46) + location: SourceLocation(pos=1891, lineno=46, colno=9) + end_location: SourceLocation(pos=1928, lineno=46, colno=46) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=1884, lineno=46, colno=12) - end_location: SourceLocation(pos=1904, lineno=46, colno=32) + location: SourceLocation(pos=1894, lineno=46, colno=12) + end_location: SourceLocation(pos=1914, lineno=46, colno=32) is_tag: False namespace: 'minecraft' path: 'the_nether' - location: SourceLocation(pos=1905, lineno=46, colno=33) - end_location: SourceLocation(pos=1918, lineno=46, colno=46) + location: SourceLocation(pos=1915, lineno=46, colno=33) + end_location: SourceLocation(pos=1928, lineno=46, colno=46) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=1909, lineno=46, colno=37) - end_location: SourceLocation(pos=1918, lineno=46, colno=46) + location: SourceLocation(pos=1919, lineno=46, colno=37) + end_location: SourceLocation(pos=1928, lineno=46, colno=46) identifier: 'tp:location' arguments: - location: SourceLocation(pos=1912, lineno=46, colno=40) - end_location: SourceLocation(pos=1918, lineno=46, colno=46) + location: SourceLocation(pos=1922, lineno=46, colno=40) + end_location: SourceLocation(pos=1928, lineno=46, colno=46) x: - location: SourceLocation(pos=1912, lineno=46, colno=40) - end_location: SourceLocation(pos=1913, lineno=46, colno=41) + location: SourceLocation(pos=1922, lineno=46, colno=40) + end_location: SourceLocation(pos=1923, lineno=46, colno=41) type: 'relative' value: 0 y: - location: SourceLocation(pos=1914, lineno=46, colno=42) - end_location: SourceLocation(pos=1915, lineno=46, colno=43) + location: SourceLocation(pos=1924, lineno=46, colno=42) + end_location: SourceLocation(pos=1925, lineno=46, colno=43) type: 'relative' value: 0 z: - location: SourceLocation(pos=1916, lineno=46, colno=44) - end_location: SourceLocation(pos=1918, lineno=46, colno=46) + location: SourceLocation(pos=1926, lineno=46, colno=44) + end_location: SourceLocation(pos=1928, lineno=46, colno=46) type: 'relative' value: 5 - location: SourceLocation(pos=1919, lineno=47, colno=1) - end_location: SourceLocation(pos=1963, lineno=47, colno=45) + location: SourceLocation(pos=1929, lineno=47, colno=1) + end_location: SourceLocation(pos=1983, lineno=47, colno=55) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1927, lineno=47, colno=9) - end_location: SourceLocation(pos=1963, lineno=47, colno=45) + location: SourceLocation(pos=1937, lineno=47, colno=9) + end_location: SourceLocation(pos=1983, lineno=47, colno=55) identifier: 'execute:positioned:pos:subcommand' arguments: - location: SourceLocation(pos=1938, lineno=47, colno=20) - end_location: SourceLocation(pos=1944, lineno=47, colno=26) + location: SourceLocation(pos=1948, lineno=47, colno=20) + end_location: SourceLocation(pos=1954, lineno=47, colno=26) x: - location: SourceLocation(pos=1938, lineno=47, colno=20) - end_location: SourceLocation(pos=1939, lineno=47, colno=21) + location: SourceLocation(pos=1948, lineno=47, colno=20) + end_location: SourceLocation(pos=1949, lineno=47, colno=21) type: 'absolute' value: 0 y: - location: SourceLocation(pos=1940, lineno=47, colno=22) - end_location: SourceLocation(pos=1942, lineno=47, colno=24) + location: SourceLocation(pos=1950, lineno=47, colno=22) + end_location: SourceLocation(pos=1952, lineno=47, colno=24) type: 'absolute' value: 64 z: - location: SourceLocation(pos=1943, lineno=47, colno=25) - end_location: SourceLocation(pos=1944, lineno=47, colno=26) + location: SourceLocation(pos=1953, lineno=47, colno=25) + end_location: SourceLocation(pos=1954, lineno=47, colno=26) type: 'absolute' value: 0 - location: SourceLocation(pos=1945, lineno=47, colno=27) - end_location: SourceLocation(pos=1963, lineno=47, colno=45) + location: SourceLocation(pos=1955, lineno=47, colno=27) + end_location: SourceLocation(pos=1983, lineno=47, colno=55) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=1949, lineno=47, colno=31) - end_location: SourceLocation(pos=1963, lineno=47, colno=45) - identifier: 'locate:structure' + location: SourceLocation(pos=1959, lineno=47, colno=31) + end_location: SourceLocation(pos=1983, lineno=47, colno=55) + identifier: 'locate:structure:structure' arguments: - location: SourceLocation(pos=1956, lineno=47, colno=38) - end_location: SourceLocation(pos=1963, lineno=47, colno=45) + location: SourceLocation(pos=1976, lineno=47, colno=48) + end_location: SourceLocation(pos=1983, lineno=47, colno=55) is_tag: False namespace: None path: 'village' - location: SourceLocation(pos=1964, lineno=48, colno=1) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=1984, lineno=48, colno=1) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=1972, lineno=48, colno=9) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=1992, lineno=48, colno=9) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=1975, lineno=48, colno=12) - end_location: SourceLocation(pos=1989, lineno=48, colno=26) + location: SourceLocation(pos=1995, lineno=48, colno=12) + end_location: SourceLocation(pos=2009, lineno=48, colno=26) variable: 'e' arguments: - location: SourceLocation(pos=1978, lineno=48, colno=15) - end_location: SourceLocation(pos=1988, lineno=48, colno=25) + location: SourceLocation(pos=1998, lineno=48, colno=15) + end_location: SourceLocation(pos=2008, lineno=48, colno=25) inverted: False key: - location: SourceLocation(pos=1978, lineno=48, colno=15) - end_location: SourceLocation(pos=1982, lineno=48, colno=19) + location: SourceLocation(pos=1998, lineno=48, colno=15) + end_location: SourceLocation(pos=2002, lineno=48, colno=19) value: 'type' value: - location: SourceLocation(pos=1983, lineno=48, colno=20) - end_location: SourceLocation(pos=1988, lineno=48, colno=25) + location: SourceLocation(pos=2003, lineno=48, colno=20) + end_location: SourceLocation(pos=2008, lineno=48, colno=25) is_tag: False namespace: None path: 'sheep' - location: SourceLocation(pos=1990, lineno=48, colno=27) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=2010, lineno=48, colno=27) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=1993, lineno=48, colno=30) - end_location: SourceLocation(pos=1995, lineno=48, colno=32) + location: SourceLocation(pos=2013, lineno=48, colno=30) + end_location: SourceLocation(pos=2015, lineno=48, colno=32) variable: 's' arguments: - location: SourceLocation(pos=1996, lineno=48, colno=33) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=2016, lineno=48, colno=33) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) identifier: 'execute:rotated:as:targets:subcommand' arguments: - location: SourceLocation(pos=2007, lineno=48, colno=44) - end_location: SourceLocation(pos=2009, lineno=48, colno=46) + location: SourceLocation(pos=2027, lineno=48, colno=44) + end_location: SourceLocation(pos=2029, lineno=48, colno=46) variable: 'p' arguments: - location: SourceLocation(pos=2010, lineno=48, colno=47) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=2030, lineno=48, colno=47) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2014, lineno=48, colno=51) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=2034, lineno=48, colno=51) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) identifier: 'tp:targets:location' arguments: - location: SourceLocation(pos=2017, lineno=48, colno=54) - end_location: SourceLocation(pos=2019, lineno=48, colno=56) + location: SourceLocation(pos=2037, lineno=48, colno=54) + end_location: SourceLocation(pos=2039, lineno=48, colno=56) variable: 's' arguments: - location: SourceLocation(pos=2020, lineno=48, colno=57) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=2040, lineno=48, colno=57) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) x: - location: SourceLocation(pos=2020, lineno=48, colno=57) - end_location: SourceLocation(pos=2021, lineno=48, colno=58) + location: SourceLocation(pos=2040, lineno=48, colno=57) + end_location: SourceLocation(pos=2041, lineno=48, colno=58) type: 'local' value: 0 y: - location: SourceLocation(pos=2022, lineno=48, colno=59) - end_location: SourceLocation(pos=2023, lineno=48, colno=60) + location: SourceLocation(pos=2042, lineno=48, colno=59) + end_location: SourceLocation(pos=2043, lineno=48, colno=60) type: 'local' value: 0 z: - location: SourceLocation(pos=2024, lineno=48, colno=61) - end_location: SourceLocation(pos=2026, lineno=48, colno=63) + location: SourceLocation(pos=2044, lineno=48, colno=61) + end_location: SourceLocation(pos=2046, lineno=48, colno=63) type: 'local' value: 1 - location: SourceLocation(pos=2027, lineno=49, colno=1) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2047, lineno=49, colno=1) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2035, lineno=49, colno=9) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2055, lineno=49, colno=9) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2038, lineno=49, colno=12) - end_location: SourceLocation(pos=2052, lineno=49, colno=26) + location: SourceLocation(pos=2058, lineno=49, colno=12) + end_location: SourceLocation(pos=2072, lineno=49, colno=26) variable: 'e' arguments: - location: SourceLocation(pos=2041, lineno=49, colno=15) - end_location: SourceLocation(pos=2051, lineno=49, colno=25) + location: SourceLocation(pos=2061, lineno=49, colno=15) + end_location: SourceLocation(pos=2071, lineno=49, colno=25) inverted: False key: - location: SourceLocation(pos=2041, lineno=49, colno=15) - end_location: SourceLocation(pos=2045, lineno=49, colno=19) + location: SourceLocation(pos=2061, lineno=49, colno=15) + end_location: SourceLocation(pos=2065, lineno=49, colno=19) value: 'type' value: - location: SourceLocation(pos=2046, lineno=49, colno=20) - end_location: SourceLocation(pos=2051, lineno=49, colno=25) + location: SourceLocation(pos=2066, lineno=49, colno=20) + end_location: SourceLocation(pos=2071, lineno=49, colno=25) is_tag: False namespace: None path: 'sheep' - location: SourceLocation(pos=2053, lineno=49, colno=27) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2073, lineno=49, colno=27) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) identifier: 'execute:positioned:as:targets:subcommand' arguments: - location: SourceLocation(pos=2067, lineno=49, colno=41) - end_location: SourceLocation(pos=2069, lineno=49, colno=43) + location: SourceLocation(pos=2087, lineno=49, colno=41) + end_location: SourceLocation(pos=2089, lineno=49, colno=43) variable: 's' arguments: - location: SourceLocation(pos=2070, lineno=49, colno=44) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2090, lineno=49, colno=44) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) identifier: 'execute:rotated:as:targets:subcommand' arguments: - location: SourceLocation(pos=2081, lineno=49, colno=55) - end_location: SourceLocation(pos=2083, lineno=49, colno=57) + location: SourceLocation(pos=2101, lineno=49, colno=55) + end_location: SourceLocation(pos=2103, lineno=49, colno=57) variable: 'p' arguments: - location: SourceLocation(pos=2084, lineno=49, colno=58) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2104, lineno=49, colno=58) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2088, lineno=49, colno=62) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2108, lineno=49, colno=62) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) identifier: 'tp:targets:location' arguments: - location: SourceLocation(pos=2091, lineno=49, colno=65) - end_location: SourceLocation(pos=2093, lineno=49, colno=67) + location: SourceLocation(pos=2111, lineno=49, colno=65) + end_location: SourceLocation(pos=2113, lineno=49, colno=67) variable: 's' arguments: - location: SourceLocation(pos=2094, lineno=49, colno=68) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2114, lineno=49, colno=68) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) x: - location: SourceLocation(pos=2094, lineno=49, colno=68) - end_location: SourceLocation(pos=2095, lineno=49, colno=69) + location: SourceLocation(pos=2114, lineno=49, colno=68) + end_location: SourceLocation(pos=2115, lineno=49, colno=69) type: 'local' value: 0 y: - location: SourceLocation(pos=2096, lineno=49, colno=70) - end_location: SourceLocation(pos=2097, lineno=49, colno=71) + location: SourceLocation(pos=2116, lineno=49, colno=70) + end_location: SourceLocation(pos=2117, lineno=49, colno=71) type: 'local' value: 0 z: - location: SourceLocation(pos=2098, lineno=49, colno=72) - end_location: SourceLocation(pos=2100, lineno=49, colno=74) + location: SourceLocation(pos=2118, lineno=49, colno=72) + end_location: SourceLocation(pos=2120, lineno=49, colno=74) type: 'local' value: 1 - location: SourceLocation(pos=2101, lineno=50, colno=1) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2121, lineno=50, colno=1) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2109, lineno=50, colno=9) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2129, lineno=50, colno=9) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2112, lineno=50, colno=12) - end_location: SourceLocation(pos=2114, lineno=50, colno=14) + location: SourceLocation(pos=2132, lineno=50, colno=12) + end_location: SourceLocation(pos=2134, lineno=50, colno=14) variable: 'a' arguments: - location: SourceLocation(pos=2115, lineno=50, colno=15) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2135, lineno=50, colno=15) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=2118, lineno=50, colno=18) - end_location: SourceLocation(pos=2120, lineno=50, colno=20) + location: SourceLocation(pos=2138, lineno=50, colno=18) + end_location: SourceLocation(pos=2140, lineno=50, colno=20) variable: 's' arguments: - location: SourceLocation(pos=2121, lineno=50, colno=21) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2141, lineno=50, colno=21) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) identifier: 'execute:if:block:pos:block:subcommand' arguments: - location: SourceLocation(pos=2130, lineno=50, colno=30) - end_location: SourceLocation(pos=2137, lineno=50, colno=37) + location: SourceLocation(pos=2150, lineno=50, colno=30) + end_location: SourceLocation(pos=2157, lineno=50, colno=37) x: - location: SourceLocation(pos=2130, lineno=50, colno=30) - end_location: SourceLocation(pos=2131, lineno=50, colno=31) + location: SourceLocation(pos=2150, lineno=50, colno=30) + end_location: SourceLocation(pos=2151, lineno=50, colno=31) type: 'relative' value: 0 y: - location: SourceLocation(pos=2132, lineno=50, colno=32) - end_location: SourceLocation(pos=2135, lineno=50, colno=35) + location: SourceLocation(pos=2152, lineno=50, colno=32) + end_location: SourceLocation(pos=2155, lineno=50, colno=35) type: 'relative' value: -1 z: - location: SourceLocation(pos=2136, lineno=50, colno=36) - end_location: SourceLocation(pos=2137, lineno=50, colno=37) + location: SourceLocation(pos=2156, lineno=50, colno=36) + end_location: SourceLocation(pos=2157, lineno=50, colno=37) type: 'relative' value: 0 - location: SourceLocation(pos=2138, lineno=50, colno=38) - end_location: SourceLocation(pos=2143, lineno=50, colno=43) + location: SourceLocation(pos=2158, lineno=50, colno=38) + end_location: SourceLocation(pos=2163, lineno=50, colno=43) identifier: - location: SourceLocation(pos=2138, lineno=50, colno=38) - end_location: SourceLocation(pos=2143, lineno=50, colno=43) + location: SourceLocation(pos=2158, lineno=50, colno=38) + end_location: SourceLocation(pos=2163, lineno=50, colno=43) is_tag: True namespace: None path: 'wool' @@ -2054,401 +2054,401 @@ data_tags: None - location: SourceLocation(pos=2144, lineno=50, colno=44) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2164, lineno=50, colno=44) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2148, lineno=50, colno=48) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2168, lineno=50, colno=48) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=2153, lineno=50, colno=53) - end_location: SourceLocation(pos=2155, lineno=50, colno=55) + location: SourceLocation(pos=2173, lineno=50, colno=53) + end_location: SourceLocation(pos=2175, lineno=50, colno=55) variable: 's' arguments: - location: SourceLocation(pos=2156, lineno=51, colno=1) - end_location: SourceLocation(pos=2184, lineno=51, colno=29) + location: SourceLocation(pos=2176, lineno=51, colno=1) + end_location: SourceLocation(pos=2204, lineno=51, colno=29) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2164, lineno=51, colno=9) - end_location: SourceLocation(pos=2184, lineno=51, colno=29) + location: SourceLocation(pos=2184, lineno=51, colno=9) + end_location: SourceLocation(pos=2204, lineno=51, colno=29) identifier: 'execute:if:score:target:targetObjective:=:source:sourceObjective' arguments: - location: SourceLocation(pos=2173, lineno=51, colno=18) - end_location: SourceLocation(pos=2175, lineno=51, colno=20) + location: SourceLocation(pos=2193, lineno=51, colno=18) + end_location: SourceLocation(pos=2195, lineno=51, colno=20) variable: 's' arguments: - location: SourceLocation(pos=2176, lineno=51, colno=21) - end_location: SourceLocation(pos=2177, lineno=51, colno=22) + location: SourceLocation(pos=2196, lineno=51, colno=21) + end_location: SourceLocation(pos=2197, lineno=51, colno=22) value: 'A' - location: SourceLocation(pos=2180, lineno=51, colno=25) - end_location: SourceLocation(pos=2182, lineno=51, colno=27) + location: SourceLocation(pos=2200, lineno=51, colno=25) + end_location: SourceLocation(pos=2202, lineno=51, colno=27) variable: 's' arguments: - location: SourceLocation(pos=2183, lineno=51, colno=28) - end_location: SourceLocation(pos=2184, lineno=51, colno=29) + location: SourceLocation(pos=2203, lineno=51, colno=28) + end_location: SourceLocation(pos=2204, lineno=51, colno=29) value: 'B' - location: SourceLocation(pos=2185, lineno=52, colno=1) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2205, lineno=52, colno=1) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2193, lineno=52, colno=9) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2213, lineno=52, colno=9) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2196, lineno=52, colno=12) - end_location: SourceLocation(pos=2198, lineno=52, colno=14) + location: SourceLocation(pos=2216, lineno=52, colno=12) + end_location: SourceLocation(pos=2218, lineno=52, colno=14) variable: 'a' arguments: - location: SourceLocation(pos=2199, lineno=52, colno=15) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2219, lineno=52, colno=15) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) identifier: 'execute:if:data:entity:source:path:subcommand' arguments: - location: SourceLocation(pos=2214, lineno=52, colno=30) - end_location: SourceLocation(pos=2216, lineno=52, colno=32) + location: SourceLocation(pos=2234, lineno=52, colno=30) + end_location: SourceLocation(pos=2236, lineno=52, colno=32) variable: 's' arguments: - location: SourceLocation(pos=2217, lineno=52, colno=33) - end_location: SourceLocation(pos=2285, lineno=52, colno=101) + location: SourceLocation(pos=2237, lineno=52, colno=33) + end_location: SourceLocation(pos=2305, lineno=52, colno=101) components: - location: SourceLocation(pos=2217, lineno=52, colno=33) - end_location: SourceLocation(pos=2226, lineno=52, colno=42) + location: SourceLocation(pos=2237, lineno=52, colno=33) + end_location: SourceLocation(pos=2246, lineno=52, colno=42) value: 'Inventory' - location: SourceLocation(pos=2226, lineno=52, colno=42) - end_location: SourceLocation(pos=2238, lineno=52, colno=54) + location: SourceLocation(pos=2246, lineno=52, colno=42) + end_location: SourceLocation(pos=2258, lineno=52, colno=54) index: - location: SourceLocation(pos=2227, lineno=52, colno=43) - end_location: SourceLocation(pos=2237, lineno=52, colno=53) + location: SourceLocation(pos=2247, lineno=52, colno=43) + end_location: SourceLocation(pos=2257, lineno=52, colno=53) entries: - location: SourceLocation(pos=2228, lineno=52, colno=44) - end_location: SourceLocation(pos=2236, lineno=52, colno=52) + location: SourceLocation(pos=2248, lineno=52, colno=44) + end_location: SourceLocation(pos=2256, lineno=52, colno=52) key: - location: SourceLocation(pos=2228, lineno=52, colno=44) - end_location: SourceLocation(pos=2232, lineno=52, colno=48) + location: SourceLocation(pos=2248, lineno=52, colno=44) + end_location: SourceLocation(pos=2252, lineno=52, colno=48) value: 'Slot' value: - location: SourceLocation(pos=2234, lineno=52, colno=50) - end_location: SourceLocation(pos=2236, lineno=52, colno=52) + location: SourceLocation(pos=2254, lineno=52, colno=50) + end_location: SourceLocation(pos=2256, lineno=52, colno=52) value: Byte(0) - location: SourceLocation(pos=2239, lineno=52, colno=55) - end_location: SourceLocation(pos=2242, lineno=52, colno=58) + location: SourceLocation(pos=2259, lineno=52, colno=55) + end_location: SourceLocation(pos=2262, lineno=52, colno=58) value: 'tag' - location: SourceLocation(pos=2243, lineno=52, colno=59) - end_location: SourceLocation(pos=2255, lineno=52, colno=71) + location: SourceLocation(pos=2263, lineno=52, colno=59) + end_location: SourceLocation(pos=2275, lineno=52, colno=71) value: 'Enchantments' - location: SourceLocation(pos=2255, lineno=52, colno=71) - end_location: SourceLocation(pos=2285, lineno=52, colno=101) + location: SourceLocation(pos=2275, lineno=52, colno=71) + end_location: SourceLocation(pos=2305, lineno=52, colno=101) index: - location: SourceLocation(pos=2256, lineno=52, colno=72) - end_location: SourceLocation(pos=2284, lineno=52, colno=100) + location: SourceLocation(pos=2276, lineno=52, colno=72) + end_location: SourceLocation(pos=2304, lineno=52, colno=100) entries: - location: SourceLocation(pos=2257, lineno=52, colno=73) - end_location: SourceLocation(pos=2283, lineno=52, colno=99) + location: SourceLocation(pos=2277, lineno=52, colno=73) + end_location: SourceLocation(pos=2303, lineno=52, colno=99) key: - location: SourceLocation(pos=2257, lineno=52, colno=73) - end_location: SourceLocation(pos=2259, lineno=52, colno=75) + location: SourceLocation(pos=2277, lineno=52, colno=73) + end_location: SourceLocation(pos=2279, lineno=52, colno=75) value: 'id' value: - location: SourceLocation(pos=2261, lineno=52, colno=77) - end_location: SourceLocation(pos=2283, lineno=52, colno=99) + location: SourceLocation(pos=2281, lineno=52, colno=77) + end_location: SourceLocation(pos=2303, lineno=52, colno=99) value: String('minecraft:efficiency') - location: SourceLocation(pos=2286, lineno=52, colno=102) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2306, lineno=52, colno=102) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2290, lineno=52, colno=106) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2310, lineno=52, colno=106) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) identifier: 'tp:targets:location' arguments: - location: SourceLocation(pos=2293, lineno=52, colno=109) - end_location: SourceLocation(pos=2295, lineno=52, colno=111) + location: SourceLocation(pos=2313, lineno=52, colno=109) + end_location: SourceLocation(pos=2315, lineno=52, colno=111) variable: 's' arguments: - location: SourceLocation(pos=2296, lineno=52, colno=112) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2316, lineno=52, colno=112) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) x: - location: SourceLocation(pos=2296, lineno=52, colno=112) - end_location: SourceLocation(pos=2297, lineno=52, colno=113) + location: SourceLocation(pos=2316, lineno=52, colno=112) + end_location: SourceLocation(pos=2317, lineno=52, colno=113) type: 'absolute' value: 0 y: - location: SourceLocation(pos=2298, lineno=52, colno=114) - end_location: SourceLocation(pos=2300, lineno=52, colno=116) + location: SourceLocation(pos=2318, lineno=52, colno=114) + end_location: SourceLocation(pos=2320, lineno=52, colno=116) type: 'absolute' value: 64 z: - location: SourceLocation(pos=2301, lineno=52, colno=117) - end_location: SourceLocation(pos=2302, lineno=52, colno=118) + location: SourceLocation(pos=2321, lineno=52, colno=117) + end_location: SourceLocation(pos=2322, lineno=52, colno=118) type: 'absolute' value: 0 - location: SourceLocation(pos=2303, lineno=53, colno=1) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2323, lineno=53, colno=1) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2311, lineno=53, colno=9) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2331, lineno=53, colno=9) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2314, lineno=53, colno=12) - end_location: SourceLocation(pos=2316, lineno=53, colno=14) + location: SourceLocation(pos=2334, lineno=53, colno=12) + end_location: SourceLocation(pos=2336, lineno=53, colno=14) variable: 'a' arguments: - location: SourceLocation(pos=2317, lineno=53, colno=15) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2337, lineno=53, colno=15) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=2320, lineno=53, colno=18) - end_location: SourceLocation(pos=2322, lineno=53, colno=20) + location: SourceLocation(pos=2340, lineno=53, colno=18) + end_location: SourceLocation(pos=2342, lineno=53, colno=20) variable: 's' arguments: - location: SourceLocation(pos=2323, lineno=53, colno=21) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2343, lineno=53, colno=21) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) identifier: 'execute:anchored:anchor:subcommand' arguments: - location: SourceLocation(pos=2332, lineno=53, colno=30) - end_location: SourceLocation(pos=2336, lineno=53, colno=34) + location: SourceLocation(pos=2352, lineno=53, colno=30) + end_location: SourceLocation(pos=2356, lineno=53, colno=34) value: 'eyes' - location: SourceLocation(pos=2337, lineno=53, colno=35) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2357, lineno=53, colno=35) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2341, lineno=53, colno=39) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2361, lineno=53, colno=39) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) identifier: 'particle:name:pos' arguments: - location: SourceLocation(pos=2350, lineno=53, colno=48) - end_location: SourceLocation(pos=2355, lineno=53, colno=53) + location: SourceLocation(pos=2370, lineno=53, colno=48) + end_location: SourceLocation(pos=2375, lineno=53, colno=53) name: - location: SourceLocation(pos=2350, lineno=53, colno=48) - end_location: SourceLocation(pos=2355, lineno=53, colno=53) + location: SourceLocation(pos=2370, lineno=53, colno=48) + end_location: SourceLocation(pos=2375, lineno=53, colno=53) is_tag: False namespace: None path: 'smoke' parameters: None - location: SourceLocation(pos=2356, lineno=53, colno=54) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2376, lineno=53, colno=54) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) x: - location: SourceLocation(pos=2356, lineno=53, colno=54) - end_location: SourceLocation(pos=2357, lineno=53, colno=55) + location: SourceLocation(pos=2376, lineno=53, colno=54) + end_location: SourceLocation(pos=2377, lineno=53, colno=55) type: 'local' value: 0 y: - location: SourceLocation(pos=2358, lineno=53, colno=56) - end_location: SourceLocation(pos=2359, lineno=53, colno=57) + location: SourceLocation(pos=2378, lineno=53, colno=56) + end_location: SourceLocation(pos=2379, lineno=53, colno=57) type: 'local' value: 0 z: - location: SourceLocation(pos=2360, lineno=53, colno=58) - end_location: SourceLocation(pos=2362, lineno=53, colno=60) + location: SourceLocation(pos=2380, lineno=53, colno=58) + end_location: SourceLocation(pos=2382, lineno=53, colno=60) type: 'local' value: 3 - location: SourceLocation(pos=2363, lineno=54, colno=1) - end_location: SourceLocation(pos=2457, lineno=54, colno=95) + location: SourceLocation(pos=2383, lineno=54, colno=1) + end_location: SourceLocation(pos=2477, lineno=54, colno=95) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2371, lineno=54, colno=9) - end_location: SourceLocation(pos=2457, lineno=54, colno=95) + location: SourceLocation(pos=2391, lineno=54, colno=9) + end_location: SourceLocation(pos=2477, lineno=54, colno=95) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2374, lineno=54, colno=12) - end_location: SourceLocation(pos=2386, lineno=54, colno=24) + location: SourceLocation(pos=2394, lineno=54, colno=12) + end_location: SourceLocation(pos=2406, lineno=54, colno=24) variable: 'e' arguments: - location: SourceLocation(pos=2377, lineno=54, colno=15) - end_location: SourceLocation(pos=2385, lineno=54, colno=23) + location: SourceLocation(pos=2397, lineno=54, colno=15) + end_location: SourceLocation(pos=2405, lineno=54, colno=23) inverted: False key: - location: SourceLocation(pos=2377, lineno=54, colno=15) - end_location: SourceLocation(pos=2381, lineno=54, colno=19) + location: SourceLocation(pos=2397, lineno=54, colno=15) + end_location: SourceLocation(pos=2401, lineno=54, colno=19) value: 'type' value: - location: SourceLocation(pos=2382, lineno=54, colno=20) - end_location: SourceLocation(pos=2385, lineno=54, colno=23) + location: SourceLocation(pos=2402, lineno=54, colno=20) + end_location: SourceLocation(pos=2405, lineno=54, colno=23) is_tag: False namespace: None path: 'pig' - location: SourceLocation(pos=2387, lineno=54, colno=25) - end_location: SourceLocation(pos=2457, lineno=54, colno=95) + location: SourceLocation(pos=2407, lineno=54, colno=25) + end_location: SourceLocation(pos=2477, lineno=54, colno=95) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=2390, lineno=54, colno=28) - end_location: SourceLocation(pos=2392, lineno=54, colno=30) + location: SourceLocation(pos=2410, lineno=54, colno=28) + end_location: SourceLocation(pos=2412, lineno=54, colno=30) variable: 's' arguments: - location: SourceLocation(pos=2393, lineno=54, colno=31) - end_location: SourceLocation(pos=2457, lineno=54, colno=95) + location: SourceLocation(pos=2413, lineno=54, colno=31) + end_location: SourceLocation(pos=2477, lineno=54, colno=95) identifier: 'execute:store:success:entity:target:path:byte:scale:subcommand' arguments: - location: SourceLocation(pos=2414, lineno=54, colno=52) - end_location: SourceLocation(pos=2416, lineno=54, colno=54) + location: SourceLocation(pos=2434, lineno=54, colno=52) + end_location: SourceLocation(pos=2436, lineno=54, colno=54) variable: 's' arguments: - location: SourceLocation(pos=2417, lineno=54, colno=55) - end_location: SourceLocation(pos=2423, lineno=54, colno=61) + location: SourceLocation(pos=2437, lineno=54, colno=55) + end_location: SourceLocation(pos=2443, lineno=54, colno=61) components: - location: SourceLocation(pos=2417, lineno=54, colno=55) - end_location: SourceLocation(pos=2423, lineno=54, colno=61) + location: SourceLocation(pos=2437, lineno=54, colno=55) + end_location: SourceLocation(pos=2443, lineno=54, colno=61) value: 'Saddle' - location: SourceLocation(pos=2429, lineno=54, colno=67) - end_location: SourceLocation(pos=2430, lineno=54, colno=68) + location: SourceLocation(pos=2449, lineno=54, colno=67) + end_location: SourceLocation(pos=2450, lineno=54, colno=68) value: 1 - location: SourceLocation(pos=2431, lineno=54, colno=69) - end_location: SourceLocation(pos=2457, lineno=54, colno=95) + location: SourceLocation(pos=2451, lineno=54, colno=69) + end_location: SourceLocation(pos=2477, lineno=54, colno=95) identifier: 'execute:if:entity:entities' arguments: - location: SourceLocation(pos=2441, lineno=54, colno=79) - end_location: SourceLocation(pos=2457, lineno=54, colno=95) + location: SourceLocation(pos=2461, lineno=54, colno=79) + end_location: SourceLocation(pos=2477, lineno=54, colno=95) variable: 'p' arguments: - location: SourceLocation(pos=2444, lineno=54, colno=82) - end_location: SourceLocation(pos=2456, lineno=54, colno=94) + location: SourceLocation(pos=2464, lineno=54, colno=82) + end_location: SourceLocation(pos=2476, lineno=54, colno=94) inverted: False key: - location: SourceLocation(pos=2444, lineno=54, colno=82) - end_location: SourceLocation(pos=2452, lineno=54, colno=90) + location: SourceLocation(pos=2464, lineno=54, colno=82) + end_location: SourceLocation(pos=2472, lineno=54, colno=90) value: 'distance' value: - location: SourceLocation(pos=2453, lineno=54, colno=91) - end_location: SourceLocation(pos=2456, lineno=54, colno=94) + location: SourceLocation(pos=2473, lineno=54, colno=91) + end_location: SourceLocation(pos=2476, lineno=54, colno=94) min: None max: 5 - location: SourceLocation(pos=2458, lineno=55, colno=1) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2478, lineno=55, colno=1) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2466, lineno=55, colno=9) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2486, lineno=55, colno=9) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2469, lineno=55, colno=12) - end_location: SourceLocation(pos=2471, lineno=55, colno=14) + location: SourceLocation(pos=2489, lineno=55, colno=12) + end_location: SourceLocation(pos=2491, lineno=55, colno=14) variable: 'a' arguments: - location: SourceLocation(pos=2472, lineno=55, colno=15) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2492, lineno=55, colno=15) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=2475, lineno=55, colno=18) - end_location: SourceLocation(pos=2477, lineno=55, colno=20) + location: SourceLocation(pos=2495, lineno=55, colno=18) + end_location: SourceLocation(pos=2497, lineno=55, colno=20) variable: 's' arguments: - location: SourceLocation(pos=2478, lineno=55, colno=21) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2498, lineno=55, colno=21) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) identifier: 'execute:if:block:pos:block:subcommand' arguments: - location: SourceLocation(pos=2487, lineno=55, colno=30) - end_location: SourceLocation(pos=2492, lineno=55, colno=35) + location: SourceLocation(pos=2507, lineno=55, colno=30) + end_location: SourceLocation(pos=2512, lineno=55, colno=35) x: - location: SourceLocation(pos=2487, lineno=55, colno=30) - end_location: SourceLocation(pos=2488, lineno=55, colno=31) + location: SourceLocation(pos=2507, lineno=55, colno=30) + end_location: SourceLocation(pos=2508, lineno=55, colno=31) type: 'relative' value: 0 y: - location: SourceLocation(pos=2489, lineno=55, colno=32) - end_location: SourceLocation(pos=2490, lineno=55, colno=33) + location: SourceLocation(pos=2509, lineno=55, colno=32) + end_location: SourceLocation(pos=2510, lineno=55, colno=33) type: 'relative' value: 0 z: - location: SourceLocation(pos=2491, lineno=55, colno=34) - end_location: SourceLocation(pos=2492, lineno=55, colno=35) + location: SourceLocation(pos=2511, lineno=55, colno=34) + end_location: SourceLocation(pos=2512, lineno=55, colno=35) type: 'relative' value: 0 - location: SourceLocation(pos=2493, lineno=55, colno=36) - end_location: SourceLocation(pos=2498, lineno=55, colno=41) + location: SourceLocation(pos=2513, lineno=55, colno=36) + end_location: SourceLocation(pos=2518, lineno=55, colno=41) identifier: - location: SourceLocation(pos=2493, lineno=55, colno=36) - end_location: SourceLocation(pos=2498, lineno=55, colno=41) + location: SourceLocation(pos=2513, lineno=55, colno=36) + end_location: SourceLocation(pos=2518, lineno=55, colno=41) is_tag: False namespace: None path: 'water' @@ -2456,529 +2456,529 @@ data_tags: None - location: SourceLocation(pos=2499, lineno=55, colno=42) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2519, lineno=55, colno=42) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2503, lineno=55, colno=46) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2523, lineno=55, colno=46) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) identifier: 'say:message' arguments: - location: SourceLocation(pos=2507, lineno=55, colno=50) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2527, lineno=55, colno=50) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) fragments: - location: SourceLocation(pos=2507, lineno=55, colno=50) - end_location: SourceLocation(pos=2528, lineno=55, colno=71) + location: SourceLocation(pos=2527, lineno=55, colno=50) + end_location: SourceLocation(pos=2548, lineno=55, colno=71) value: '"My feet are soaked!"' - location: SourceLocation(pos=2529, lineno=56, colno=1) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2549, lineno=56, colno=1) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2537, lineno=56, colno=9) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2557, lineno=56, colno=9) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2540, lineno=56, colno=12) - end_location: SourceLocation(pos=2542, lineno=56, colno=14) + location: SourceLocation(pos=2560, lineno=56, colno=12) + end_location: SourceLocation(pos=2562, lineno=56, colno=14) variable: 'a' arguments: - location: SourceLocation(pos=2543, lineno=56, colno=15) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2563, lineno=56, colno=15) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) identifier: 'execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand' arguments: - location: SourceLocation(pos=2556, lineno=56, colno=28) - end_location: SourceLocation(pos=2558, lineno=56, colno=30) + location: SourceLocation(pos=2576, lineno=56, colno=28) + end_location: SourceLocation(pos=2578, lineno=56, colno=30) variable: 's' arguments: - location: SourceLocation(pos=2559, lineno=56, colno=31) - end_location: SourceLocation(pos=2563, lineno=56, colno=35) + location: SourceLocation(pos=2579, lineno=56, colno=31) + end_location: SourceLocation(pos=2583, lineno=56, colno=35) value: 'test' - location: SourceLocation(pos=2566, lineno=56, colno=38) - end_location: SourceLocation(pos=2568, lineno=56, colno=40) + location: SourceLocation(pos=2586, lineno=56, colno=38) + end_location: SourceLocation(pos=2588, lineno=56, colno=40) variable: 's' arguments: - location: SourceLocation(pos=2569, lineno=56, colno=41) - end_location: SourceLocation(pos=2573, lineno=56, colno=45) + location: SourceLocation(pos=2589, lineno=56, colno=41) + end_location: SourceLocation(pos=2593, lineno=56, colno=45) value: 'test' - location: SourceLocation(pos=2574, lineno=56, colno=46) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2594, lineno=56, colno=46) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2578, lineno=56, colno=50) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2598, lineno=56, colno=50) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) identifier: 'say:message' arguments: - location: SourceLocation(pos=2582, lineno=56, colno=54) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2602, lineno=56, colno=54) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) fragments: - location: SourceLocation(pos=2582, lineno=56, colno=54) - end_location: SourceLocation(pos=2598, lineno=56, colno=70) + location: SourceLocation(pos=2602, lineno=56, colno=54) + end_location: SourceLocation(pos=2618, lineno=56, colno=70) value: '"Score is reset"' - location: SourceLocation(pos=2599, lineno=57, colno=1) - end_location: SourceLocation(pos=2695, lineno=57, colno=97) + location: SourceLocation(pos=2619, lineno=57, colno=1) + end_location: SourceLocation(pos=2715, lineno=57, colno=97) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2607, lineno=57, colno=9) - end_location: SourceLocation(pos=2695, lineno=57, colno=97) + location: SourceLocation(pos=2627, lineno=57, colno=9) + end_location: SourceLocation(pos=2715, lineno=57, colno=97) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=2610, lineno=57, colno=12) - end_location: SourceLocation(pos=2612, lineno=57, colno=14) + location: SourceLocation(pos=2630, lineno=57, colno=12) + end_location: SourceLocation(pos=2632, lineno=57, colno=14) variable: 'p' arguments: - location: SourceLocation(pos=2613, lineno=57, colno=15) - end_location: SourceLocation(pos=2695, lineno=57, colno=97) + location: SourceLocation(pos=2633, lineno=57, colno=15) + end_location: SourceLocation(pos=2715, lineno=57, colno=97) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2616, lineno=57, colno=18) - end_location: SourceLocation(pos=2641, lineno=57, colno=43) + location: SourceLocation(pos=2636, lineno=57, colno=18) + end_location: SourceLocation(pos=2661, lineno=57, colno=43) variable: 'e' arguments: - location: SourceLocation(pos=2619, lineno=57, colno=21) - end_location: SourceLocation(pos=2627, lineno=57, colno=29) + location: SourceLocation(pos=2639, lineno=57, colno=21) + end_location: SourceLocation(pos=2647, lineno=57, colno=29) inverted: False key: - location: SourceLocation(pos=2619, lineno=57, colno=21) - end_location: SourceLocation(pos=2623, lineno=57, colno=25) + location: SourceLocation(pos=2639, lineno=57, colno=21) + end_location: SourceLocation(pos=2643, lineno=57, colno=25) value: 'type' value: - location: SourceLocation(pos=2624, lineno=57, colno=26) - end_location: SourceLocation(pos=2627, lineno=57, colno=29) + location: SourceLocation(pos=2644, lineno=57, colno=26) + end_location: SourceLocation(pos=2647, lineno=57, colno=29) is_tag: False namespace: None path: 'pig' - location: SourceLocation(pos=2628, lineno=57, colno=30) - end_location: SourceLocation(pos=2640, lineno=57, colno=42) + location: SourceLocation(pos=2648, lineno=57, colno=30) + end_location: SourceLocation(pos=2660, lineno=57, colno=42) inverted: False key: - location: SourceLocation(pos=2628, lineno=57, colno=30) - end_location: SourceLocation(pos=2636, lineno=57, colno=38) + location: SourceLocation(pos=2648, lineno=57, colno=30) + end_location: SourceLocation(pos=2656, lineno=57, colno=38) value: 'distance' value: - location: SourceLocation(pos=2637, lineno=57, colno=39) - end_location: SourceLocation(pos=2640, lineno=57, colno=42) + location: SourceLocation(pos=2657, lineno=57, colno=39) + end_location: SourceLocation(pos=2660, lineno=57, colno=42) min: None max: 3 - location: SourceLocation(pos=2642, lineno=57, colno=44) - end_location: SourceLocation(pos=2695, lineno=57, colno=97) + location: SourceLocation(pos=2662, lineno=57, colno=44) + end_location: SourceLocation(pos=2715, lineno=57, colno=97) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2646, lineno=57, colno=48) - end_location: SourceLocation(pos=2695, lineno=57, colno=97) + location: SourceLocation(pos=2666, lineno=57, colno=48) + end_location: SourceLocation(pos=2715, lineno=57, colno=97) identifier: 'data:merge:entity:target:nbt' arguments: - location: SourceLocation(pos=2664, lineno=57, colno=66) - end_location: SourceLocation(pos=2666, lineno=57, colno=68) + location: SourceLocation(pos=2684, lineno=57, colno=66) + end_location: SourceLocation(pos=2686, lineno=57, colno=68) variable: 's' arguments: - location: SourceLocation(pos=2667, lineno=57, colno=69) - end_location: SourceLocation(pos=2695, lineno=57, colno=97) + location: SourceLocation(pos=2687, lineno=57, colno=69) + end_location: SourceLocation(pos=2715, lineno=57, colno=97) entries: - location: SourceLocation(pos=2668, lineno=57, colno=70) - end_location: SourceLocation(pos=2694, lineno=57, colno=96) + location: SourceLocation(pos=2688, lineno=57, colno=70) + end_location: SourceLocation(pos=2714, lineno=57, colno=96) key: - location: SourceLocation(pos=2668, lineno=57, colno=70) - end_location: SourceLocation(pos=2674, lineno=57, colno=76) + location: SourceLocation(pos=2688, lineno=57, colno=70) + end_location: SourceLocation(pos=2694, lineno=57, colno=76) value: 'Motion' value: - location: SourceLocation(pos=2676, lineno=57, colno=78) - end_location: SourceLocation(pos=2694, lineno=57, colno=96) + location: SourceLocation(pos=2696, lineno=57, colno=78) + end_location: SourceLocation(pos=2714, lineno=57, colno=96) elements: - location: SourceLocation(pos=2677, lineno=57, colno=79) - end_location: SourceLocation(pos=2681, lineno=57, colno=83) + location: SourceLocation(pos=2697, lineno=57, colno=79) + end_location: SourceLocation(pos=2701, lineno=57, colno=83) value: Double(0.0) - location: SourceLocation(pos=2683, lineno=57, colno=85) - end_location: SourceLocation(pos=2687, lineno=57, colno=89) + location: SourceLocation(pos=2703, lineno=57, colno=85) + end_location: SourceLocation(pos=2707, lineno=57, colno=89) value: Double(2.0) - location: SourceLocation(pos=2689, lineno=57, colno=91) - end_location: SourceLocation(pos=2693, lineno=57, colno=95) + location: SourceLocation(pos=2709, lineno=57, colno=91) + end_location: SourceLocation(pos=2713, lineno=57, colno=95) value: Double(0.0) - location: SourceLocation(pos=2696, lineno=58, colno=1) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2716, lineno=58, colno=1) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2704, lineno=58, colno=9) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2724, lineno=58, colno=9) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2707, lineno=58, colno=12) - end_location: SourceLocation(pos=2709, lineno=58, colno=14) + location: SourceLocation(pos=2727, lineno=58, colno=12) + end_location: SourceLocation(pos=2729, lineno=58, colno=14) variable: 'p' arguments: - location: SourceLocation(pos=2710, lineno=58, colno=15) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2730, lineno=58, colno=15) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=2713, lineno=58, colno=18) - end_location: SourceLocation(pos=2715, lineno=58, colno=20) + location: SourceLocation(pos=2733, lineno=58, colno=18) + end_location: SourceLocation(pos=2735, lineno=58, colno=20) variable: 's' arguments: - location: SourceLocation(pos=2716, lineno=58, colno=21) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2736, lineno=58, colno=21) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2720, lineno=58, colno=25) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2740, lineno=58, colno=25) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) identifier: 'teleport:targets:location:rotation' arguments: - location: SourceLocation(pos=2729, lineno=58, colno=34) - end_location: SourceLocation(pos=2731, lineno=58, colno=36) + location: SourceLocation(pos=2749, lineno=58, colno=34) + end_location: SourceLocation(pos=2751, lineno=58, colno=36) variable: 's' arguments: - location: SourceLocation(pos=2732, lineno=58, colno=37) - end_location: SourceLocation(pos=2737, lineno=58, colno=42) + location: SourceLocation(pos=2752, lineno=58, colno=37) + end_location: SourceLocation(pos=2757, lineno=58, colno=42) x: - location: SourceLocation(pos=2732, lineno=58, colno=37) - end_location: SourceLocation(pos=2733, lineno=58, colno=38) + location: SourceLocation(pos=2752, lineno=58, colno=37) + end_location: SourceLocation(pos=2753, lineno=58, colno=38) type: 'relative' value: 0 y: - location: SourceLocation(pos=2734, lineno=58, colno=39) - end_location: SourceLocation(pos=2735, lineno=58, colno=40) + location: SourceLocation(pos=2754, lineno=58, colno=39) + end_location: SourceLocation(pos=2755, lineno=58, colno=40) type: 'relative' value: 0 z: - location: SourceLocation(pos=2736, lineno=58, colno=41) - end_location: SourceLocation(pos=2737, lineno=58, colno=42) + location: SourceLocation(pos=2756, lineno=58, colno=41) + end_location: SourceLocation(pos=2757, lineno=58, colno=42) type: 'relative' value: 0 - location: SourceLocation(pos=2738, lineno=58, colno=43) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2758, lineno=58, colno=43) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) x: - location: SourceLocation(pos=2738, lineno=58, colno=43) - end_location: SourceLocation(pos=2741, lineno=58, colno=46) + location: SourceLocation(pos=2758, lineno=58, colno=43) + end_location: SourceLocation(pos=2761, lineno=58, colno=46) type: 'relative' value: 10 y: - location: SourceLocation(pos=2742, lineno=58, colno=47) - end_location: SourceLocation(pos=2743, lineno=58, colno=48) + location: SourceLocation(pos=2762, lineno=58, colno=47) + end_location: SourceLocation(pos=2763, lineno=58, colno=48) type: 'relative' value: 0 - location: SourceLocation(pos=2744, lineno=59, colno=1) - end_location: SourceLocation(pos=2794, lineno=59, colno=51) + location: SourceLocation(pos=2764, lineno=59, colno=1) + end_location: SourceLocation(pos=2814, lineno=59, colno=51) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2752, lineno=59, colno=9) - end_location: SourceLocation(pos=2794, lineno=59, colno=51) + location: SourceLocation(pos=2772, lineno=59, colno=9) + end_location: SourceLocation(pos=2814, lineno=59, colno=51) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=2755, lineno=59, colno=12) - end_location: SourceLocation(pos=2775, lineno=59, colno=32) + location: SourceLocation(pos=2775, lineno=59, colno=12) + end_location: SourceLocation(pos=2795, lineno=59, colno=32) is_tag: False namespace: 'minecraft' path: 'the_nether' - location: SourceLocation(pos=2776, lineno=59, colno=33) - end_location: SourceLocation(pos=2794, lineno=59, colno=51) + location: SourceLocation(pos=2796, lineno=59, colno=33) + end_location: SourceLocation(pos=2814, lineno=59, colno=51) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2780, lineno=59, colno=37) - end_location: SourceLocation(pos=2794, lineno=59, colno=51) + location: SourceLocation(pos=2800, lineno=59, colno=37) + end_location: SourceLocation(pos=2814, lineno=59, colno=51) identifier: 'teleport:location' arguments: - location: SourceLocation(pos=2789, lineno=59, colno=46) - end_location: SourceLocation(pos=2794, lineno=59, colno=51) + location: SourceLocation(pos=2809, lineno=59, colno=46) + end_location: SourceLocation(pos=2814, lineno=59, colno=51) x: - location: SourceLocation(pos=2789, lineno=59, colno=46) - end_location: SourceLocation(pos=2790, lineno=59, colno=47) + location: SourceLocation(pos=2809, lineno=59, colno=46) + end_location: SourceLocation(pos=2810, lineno=59, colno=47) type: 'relative' value: 0 y: - location: SourceLocation(pos=2791, lineno=59, colno=48) - end_location: SourceLocation(pos=2792, lineno=59, colno=49) + location: SourceLocation(pos=2811, lineno=59, colno=48) + end_location: SourceLocation(pos=2812, lineno=59, colno=49) type: 'relative' value: 0 z: - location: SourceLocation(pos=2793, lineno=59, colno=50) - end_location: SourceLocation(pos=2794, lineno=59, colno=51) + location: SourceLocation(pos=2813, lineno=59, colno=50) + end_location: SourceLocation(pos=2814, lineno=59, colno=51) type: 'relative' value: 0 - location: SourceLocation(pos=2795, lineno=60, colno=1) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2815, lineno=60, colno=1) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2803, lineno=60, colno=9) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2823, lineno=60, colno=9) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2806, lineno=60, colno=12) - end_location: SourceLocation(pos=2808, lineno=60, colno=14) + location: SourceLocation(pos=2826, lineno=60, colno=12) + end_location: SourceLocation(pos=2828, lineno=60, colno=14) variable: 'a' arguments: - location: SourceLocation(pos=2809, lineno=60, colno=15) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2829, lineno=60, colno=15) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=2812, lineno=60, colno=18) - end_location: SourceLocation(pos=2829, lineno=60, colno=35) + location: SourceLocation(pos=2832, lineno=60, colno=18) + end_location: SourceLocation(pos=2849, lineno=60, colno=35) is_tag: False namespace: 'minecraft' path: 'the_end' - location: SourceLocation(pos=2830, lineno=60, colno=36) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2850, lineno=60, colno=36) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2834, lineno=60, colno=40) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2854, lineno=60, colno=40) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) identifier: 'teleport:location' arguments: - location: SourceLocation(pos=2843, lineno=60, colno=49) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2863, lineno=60, colno=49) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) x: - location: SourceLocation(pos=2843, lineno=60, colno=49) - end_location: SourceLocation(pos=2845, lineno=60, colno=51) + location: SourceLocation(pos=2863, lineno=60, colno=49) + end_location: SourceLocation(pos=2865, lineno=60, colno=51) type: 'absolute' value: 84 y: - location: SourceLocation(pos=2846, lineno=60, colno=52) - end_location: SourceLocation(pos=2848, lineno=60, colno=54) + location: SourceLocation(pos=2866, lineno=60, colno=52) + end_location: SourceLocation(pos=2868, lineno=60, colno=54) type: 'absolute' value: 57 z: - location: SourceLocation(pos=2849, lineno=60, colno=55) - end_location: SourceLocation(pos=2851, lineno=60, colno=57) + location: SourceLocation(pos=2869, lineno=60, colno=55) + end_location: SourceLocation(pos=2871, lineno=60, colno=57) type: 'absolute' value: 79 - location: SourceLocation(pos=2852, lineno=61, colno=1) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2872, lineno=61, colno=1) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2860, lineno=61, colno=9) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2880, lineno=61, colno=9) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) identifier: 'execute:as:targets:subcommand' arguments: - location: SourceLocation(pos=2863, lineno=61, colno=12) - end_location: SourceLocation(pos=2868, lineno=61, colno=17) + location: SourceLocation(pos=2883, lineno=61, colno=12) + end_location: SourceLocation(pos=2888, lineno=61, colno=17) value: 'Alice' - location: SourceLocation(pos=2869, lineno=61, colno=18) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2889, lineno=61, colno=18) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) identifier: 'execute:in:dimension:subcommand' arguments: - location: SourceLocation(pos=2872, lineno=61, colno=21) - end_location: SourceLocation(pos=2891, lineno=61, colno=40) + location: SourceLocation(pos=2892, lineno=61, colno=21) + end_location: SourceLocation(pos=2911, lineno=61, colno=40) is_tag: False namespace: 'minecraft' path: 'overworld' - location: SourceLocation(pos=2892, lineno=61, colno=41) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2912, lineno=61, colno=41) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2896, lineno=61, colno=45) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2916, lineno=61, colno=45) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) identifier: 'teleport:location' arguments: - location: SourceLocation(pos=2905, lineno=61, colno=54) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2925, lineno=61, colno=54) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) x: - location: SourceLocation(pos=2905, lineno=61, colno=54) - end_location: SourceLocation(pos=2908, lineno=61, colno=57) + location: SourceLocation(pos=2925, lineno=61, colno=54) + end_location: SourceLocation(pos=2928, lineno=61, colno=57) type: 'absolute' value: 251 y: - location: SourceLocation(pos=2909, lineno=61, colno=58) - end_location: SourceLocation(pos=2911, lineno=61, colno=60) + location: SourceLocation(pos=2929, lineno=61, colno=58) + end_location: SourceLocation(pos=2931, lineno=61, colno=60) type: 'absolute' value: 64 z: - location: SourceLocation(pos=2912, lineno=61, colno=61) - end_location: SourceLocation(pos=2916, lineno=61, colno=65) + location: SourceLocation(pos=2932, lineno=61, colno=61) + end_location: SourceLocation(pos=2936, lineno=61, colno=65) type: 'absolute' value: -160 - location: SourceLocation(pos=2917, lineno=62, colno=1) - end_location: SourceLocation(pos=2988, lineno=62, colno=72) + location: SourceLocation(pos=2937, lineno=62, colno=1) + end_location: SourceLocation(pos=3008, lineno=62, colno=72) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=2925, lineno=62, colno=9) - end_location: SourceLocation(pos=2988, lineno=62, colno=72) + location: SourceLocation(pos=2945, lineno=62, colno=9) + end_location: SourceLocation(pos=3008, lineno=62, colno=72) identifier: 'execute:store:result:score:targets:objective:subcommand' arguments: - location: SourceLocation(pos=2944, lineno=62, colno=28) - end_location: SourceLocation(pos=2949, lineno=62, colno=33) + location: SourceLocation(pos=2964, lineno=62, colno=28) + end_location: SourceLocation(pos=2969, lineno=62, colno=33) value: '#temp' - location: SourceLocation(pos=2950, lineno=62, colno=34) - end_location: SourceLocation(pos=2956, lineno=62, colno=40) + location: SourceLocation(pos=2970, lineno=62, colno=34) + end_location: SourceLocation(pos=2976, lineno=62, colno=40) value: 'global' - location: SourceLocation(pos=2957, lineno=62, colno=41) - end_location: SourceLocation(pos=2988, lineno=62, colno=72) + location: SourceLocation(pos=2977, lineno=62, colno=41) + end_location: SourceLocation(pos=3008, lineno=62, colno=72) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=2961, lineno=62, colno=45) - end_location: SourceLocation(pos=2988, lineno=62, colno=72) + location: SourceLocation(pos=2981, lineno=62, colno=45) + end_location: SourceLocation(pos=3008, lineno=62, colno=72) identifier: 'data:get:storage:target:path' arguments: - location: SourceLocation(pos=2978, lineno=62, colno=62) - end_location: SourceLocation(pos=2984, lineno=62, colno=68) + location: SourceLocation(pos=2998, lineno=62, colno=62) + end_location: SourceLocation(pos=3004, lineno=62, colno=68) is_tag: False namespace: None path: 'global' - location: SourceLocation(pos=2985, lineno=62, colno=69) - end_location: SourceLocation(pos=2988, lineno=62, colno=72) + location: SourceLocation(pos=3005, lineno=62, colno=69) + end_location: SourceLocation(pos=3008, lineno=62, colno=72) components: - location: SourceLocation(pos=2985, lineno=62, colno=69) - end_location: SourceLocation(pos=2988, lineno=62, colno=72) + location: SourceLocation(pos=3005, lineno=62, colno=69) + end_location: SourceLocation(pos=3008, lineno=62, colno=72) value: 'foo' - location: SourceLocation(pos=3002, lineno=64, colno=1) - end_location: SourceLocation(pos=3031, lineno=64, colno=30) + location: SourceLocation(pos=3022, lineno=64, colno=1) + end_location: SourceLocation(pos=3051, lineno=64, colno=30) identifier: 'experience:query:targets:levels' arguments: - location: SourceLocation(pos=3019, lineno=64, colno=18) - end_location: SourceLocation(pos=3024, lineno=64, colno=23) + location: SourceLocation(pos=3039, lineno=64, colno=18) + end_location: SourceLocation(pos=3044, lineno=64, colno=23) value: 'Steve' - location: SourceLocation(pos=3039, lineno=66, colno=1) - end_location: SourceLocation(pos=3131, lineno=66, colno=93) + location: SourceLocation(pos=3059, lineno=66, colno=1) + end_location: SourceLocation(pos=3151, lineno=66, colno=93) identifier: 'fill:from:to:block:replace:filter' arguments: - location: SourceLocation(pos=3044, lineno=66, colno=6) - end_location: SourceLocation(pos=3055, lineno=66, colno=17) + location: SourceLocation(pos=3064, lineno=66, colno=6) + end_location: SourceLocation(pos=3075, lineno=66, colno=17) x: - location: SourceLocation(pos=3044, lineno=66, colno=6) - end_location: SourceLocation(pos=3046, lineno=66, colno=8) + location: SourceLocation(pos=3064, lineno=66, colno=6) + end_location: SourceLocation(pos=3066, lineno=66, colno=8) type: 'absolute' value: 52 y: - location: SourceLocation(pos=3047, lineno=66, colno=9) - end_location: SourceLocation(pos=3049, lineno=66, colno=11) + location: SourceLocation(pos=3067, lineno=66, colno=9) + end_location: SourceLocation(pos=3069, lineno=66, colno=11) type: 'absolute' value: 63 z: - location: SourceLocation(pos=3050, lineno=66, colno=12) - end_location: SourceLocation(pos=3055, lineno=66, colno=17) + location: SourceLocation(pos=3070, lineno=66, colno=12) + end_location: SourceLocation(pos=3075, lineno=66, colno=17) type: 'absolute' value: -1516 - location: SourceLocation(pos=3056, lineno=66, colno=18) - end_location: SourceLocation(pos=3067, lineno=66, colno=29) + location: SourceLocation(pos=3076, lineno=66, colno=18) + end_location: SourceLocation(pos=3087, lineno=66, colno=29) x: - location: SourceLocation(pos=3056, lineno=66, colno=18) - end_location: SourceLocation(pos=3058, lineno=66, colno=20) + location: SourceLocation(pos=3076, lineno=66, colno=18) + end_location: SourceLocation(pos=3078, lineno=66, colno=20) type: 'absolute' value: 33 y: - location: SourceLocation(pos=3059, lineno=66, colno=21) - end_location: SourceLocation(pos=3061, lineno=66, colno=23) + location: SourceLocation(pos=3079, lineno=66, colno=21) + end_location: SourceLocation(pos=3081, lineno=66, colno=23) type: 'absolute' value: 73 z: - location: SourceLocation(pos=3062, lineno=66, colno=24) - end_location: SourceLocation(pos=3067, lineno=66, colno=29) + location: SourceLocation(pos=3082, lineno=66, colno=24) + end_location: SourceLocation(pos=3087, lineno=66, colno=29) type: 'absolute' value: -1536 - location: SourceLocation(pos=3068, lineno=66, colno=30) - end_location: SourceLocation(pos=3088, lineno=66, colno=50) + location: SourceLocation(pos=3088, lineno=66, colno=30) + end_location: SourceLocation(pos=3108, lineno=66, colno=50) identifier: - location: SourceLocation(pos=3068, lineno=66, colno=30) - end_location: SourceLocation(pos=3088, lineno=66, colno=50) + location: SourceLocation(pos=3088, lineno=66, colno=30) + end_location: SourceLocation(pos=3108, lineno=66, colno=50) is_tag: False namespace: 'minecraft' path: 'gold_block' @@ -2986,12 +2986,12 @@ data_tags: None - location: SourceLocation(pos=3097, lineno=66, colno=59) - end_location: SourceLocation(pos=3131, lineno=66, colno=93) + location: SourceLocation(pos=3117, lineno=66, colno=59) + end_location: SourceLocation(pos=3151, lineno=66, colno=93) identifier: - location: SourceLocation(pos=3097, lineno=66, colno=59) - end_location: SourceLocation(pos=3131, lineno=66, colno=93) + location: SourceLocation(pos=3117, lineno=66, colno=59) + end_location: SourceLocation(pos=3151, lineno=66, colno=93) is_tag: False namespace: 'minecraft' path: 'orange_glazed_terracotta' @@ -2999,59 +2999,59 @@ data_tags: None - location: SourceLocation(pos=3132, lineno=67, colno=1) - end_location: SourceLocation(pos=3164, lineno=67, colno=33) + location: SourceLocation(pos=3152, lineno=67, colno=1) + end_location: SourceLocation(pos=3184, lineno=67, colno=33) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=3137, lineno=67, colno=6) - end_location: SourceLocation(pos=3148, lineno=67, colno=17) + location: SourceLocation(pos=3157, lineno=67, colno=6) + end_location: SourceLocation(pos=3168, lineno=67, colno=17) x: - location: SourceLocation(pos=3137, lineno=67, colno=6) - end_location: SourceLocation(pos=3140, lineno=67, colno=9) + location: SourceLocation(pos=3157, lineno=67, colno=6) + end_location: SourceLocation(pos=3160, lineno=67, colno=9) type: 'relative' value: -3 y: - location: SourceLocation(pos=3141, lineno=67, colno=10) - end_location: SourceLocation(pos=3144, lineno=67, colno=13) + location: SourceLocation(pos=3161, lineno=67, colno=10) + end_location: SourceLocation(pos=3164, lineno=67, colno=13) type: 'relative' value: -3 z: - location: SourceLocation(pos=3145, lineno=67, colno=14) - end_location: SourceLocation(pos=3148, lineno=67, colno=17) + location: SourceLocation(pos=3165, lineno=67, colno=14) + end_location: SourceLocation(pos=3168, lineno=67, colno=17) type: 'relative' value: -3 - location: SourceLocation(pos=3149, lineno=67, colno=18) - end_location: SourceLocation(pos=3158, lineno=67, colno=27) + location: SourceLocation(pos=3169, lineno=67, colno=18) + end_location: SourceLocation(pos=3178, lineno=67, colno=27) x: - location: SourceLocation(pos=3149, lineno=67, colno=18) - end_location: SourceLocation(pos=3151, lineno=67, colno=20) + location: SourceLocation(pos=3169, lineno=67, colno=18) + end_location: SourceLocation(pos=3171, lineno=67, colno=20) type: 'relative' value: 3 y: - location: SourceLocation(pos=3152, lineno=67, colno=21) - end_location: SourceLocation(pos=3155, lineno=67, colno=24) + location: SourceLocation(pos=3172, lineno=67, colno=21) + end_location: SourceLocation(pos=3175, lineno=67, colno=24) type: 'relative' value: -1 z: - location: SourceLocation(pos=3156, lineno=67, colno=25) - end_location: SourceLocation(pos=3158, lineno=67, colno=27) + location: SourceLocation(pos=3176, lineno=67, colno=25) + end_location: SourceLocation(pos=3178, lineno=67, colno=27) type: 'relative' value: 3 - location: SourceLocation(pos=3159, lineno=67, colno=28) - end_location: SourceLocation(pos=3164, lineno=67, colno=33) + location: SourceLocation(pos=3179, lineno=67, colno=28) + end_location: SourceLocation(pos=3184, lineno=67, colno=33) identifier: - location: SourceLocation(pos=3159, lineno=67, colno=28) - end_location: SourceLocation(pos=3164, lineno=67, colno=33) + location: SourceLocation(pos=3179, lineno=67, colno=28) + end_location: SourceLocation(pos=3184, lineno=67, colno=33) is_tag: False namespace: None path: 'water' @@ -3059,59 +3059,59 @@ data_tags: None - location: SourceLocation(pos=3165, lineno=68, colno=1) - end_location: SourceLocation(pos=3211, lineno=68, colno=47) + location: SourceLocation(pos=3185, lineno=68, colno=1) + end_location: SourceLocation(pos=3231, lineno=68, colno=47) identifier: 'fill:from:to:block:hollow' arguments: - location: SourceLocation(pos=3170, lineno=68, colno=6) - end_location: SourceLocation(pos=3179, lineno=68, colno=15) + location: SourceLocation(pos=3190, lineno=68, colno=6) + end_location: SourceLocation(pos=3199, lineno=68, colno=15) x: - location: SourceLocation(pos=3170, lineno=68, colno=6) - end_location: SourceLocation(pos=3173, lineno=68, colno=9) + location: SourceLocation(pos=3190, lineno=68, colno=6) + end_location: SourceLocation(pos=3193, lineno=68, colno=9) type: 'relative' value: -3 y: - location: SourceLocation(pos=3174, lineno=68, colno=10) - end_location: SourceLocation(pos=3175, lineno=68, colno=11) + location: SourceLocation(pos=3194, lineno=68, colno=10) + end_location: SourceLocation(pos=3195, lineno=68, colno=11) type: 'relative' value: 0 z: - location: SourceLocation(pos=3176, lineno=68, colno=12) - end_location: SourceLocation(pos=3179, lineno=68, colno=15) + location: SourceLocation(pos=3196, lineno=68, colno=12) + end_location: SourceLocation(pos=3199, lineno=68, colno=15) type: 'relative' value: -4 - location: SourceLocation(pos=3180, lineno=68, colno=16) - end_location: SourceLocation(pos=3188, lineno=68, colno=24) + location: SourceLocation(pos=3200, lineno=68, colno=16) + end_location: SourceLocation(pos=3208, lineno=68, colno=24) x: - location: SourceLocation(pos=3180, lineno=68, colno=16) - end_location: SourceLocation(pos=3182, lineno=68, colno=18) + location: SourceLocation(pos=3200, lineno=68, colno=16) + end_location: SourceLocation(pos=3202, lineno=68, colno=18) type: 'relative' value: 3 y: - location: SourceLocation(pos=3183, lineno=68, colno=19) - end_location: SourceLocation(pos=3185, lineno=68, colno=21) + location: SourceLocation(pos=3203, lineno=68, colno=19) + end_location: SourceLocation(pos=3205, lineno=68, colno=21) type: 'relative' value: 4 z: - location: SourceLocation(pos=3186, lineno=68, colno=22) - end_location: SourceLocation(pos=3188, lineno=68, colno=24) + location: SourceLocation(pos=3206, lineno=68, colno=22) + end_location: SourceLocation(pos=3208, lineno=68, colno=24) type: 'relative' value: 4 - location: SourceLocation(pos=3189, lineno=68, colno=25) - end_location: SourceLocation(pos=3204, lineno=68, colno=40) + location: SourceLocation(pos=3209, lineno=68, colno=25) + end_location: SourceLocation(pos=3224, lineno=68, colno=40) identifier: - location: SourceLocation(pos=3189, lineno=68, colno=25) - end_location: SourceLocation(pos=3204, lineno=68, colno=40) + location: SourceLocation(pos=3209, lineno=68, colno=25) + end_location: SourceLocation(pos=3224, lineno=68, colno=40) is_tag: False namespace: 'minecraft' path: 'stone' @@ -3119,59 +3119,59 @@ data_tags: None - location: SourceLocation(pos=3212, lineno=69, colno=1) - end_location: SourceLocation(pos=3249, lineno=69, colno=38) + location: SourceLocation(pos=3232, lineno=69, colno=1) + end_location: SourceLocation(pos=3269, lineno=69, colno=38) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=3217, lineno=69, colno=6) - end_location: SourceLocation(pos=3231, lineno=69, colno=20) + location: SourceLocation(pos=3237, lineno=69, colno=6) + end_location: SourceLocation(pos=3251, lineno=69, colno=20) x: - location: SourceLocation(pos=3217, lineno=69, colno=6) - end_location: SourceLocation(pos=3221, lineno=69, colno=10) + location: SourceLocation(pos=3237, lineno=69, colno=6) + end_location: SourceLocation(pos=3241, lineno=69, colno=10) type: 'relative' value: -15 y: - location: SourceLocation(pos=3222, lineno=69, colno=11) - end_location: SourceLocation(pos=3226, lineno=69, colno=15) + location: SourceLocation(pos=3242, lineno=69, colno=11) + end_location: SourceLocation(pos=3246, lineno=69, colno=15) type: 'relative' value: -15 z: - location: SourceLocation(pos=3227, lineno=69, colno=16) - end_location: SourceLocation(pos=3231, lineno=69, colno=20) + location: SourceLocation(pos=3247, lineno=69, colno=16) + end_location: SourceLocation(pos=3251, lineno=69, colno=20) type: 'relative' value: -15 - location: SourceLocation(pos=3232, lineno=69, colno=21) - end_location: SourceLocation(pos=3243, lineno=69, colno=32) + location: SourceLocation(pos=3252, lineno=69, colno=21) + end_location: SourceLocation(pos=3263, lineno=69, colno=32) x: - location: SourceLocation(pos=3232, lineno=69, colno=21) - end_location: SourceLocation(pos=3235, lineno=69, colno=24) + location: SourceLocation(pos=3252, lineno=69, colno=21) + end_location: SourceLocation(pos=3255, lineno=69, colno=24) type: 'relative' value: 15 y: - location: SourceLocation(pos=3236, lineno=69, colno=25) - end_location: SourceLocation(pos=3239, lineno=69, colno=28) + location: SourceLocation(pos=3256, lineno=69, colno=25) + end_location: SourceLocation(pos=3259, lineno=69, colno=28) type: 'relative' value: 15 z: - location: SourceLocation(pos=3240, lineno=69, colno=29) - end_location: SourceLocation(pos=3243, lineno=69, colno=32) + location: SourceLocation(pos=3260, lineno=69, colno=29) + end_location: SourceLocation(pos=3263, lineno=69, colno=32) type: 'relative' value: 15 - location: SourceLocation(pos=3244, lineno=69, colno=33) - end_location: SourceLocation(pos=3249, lineno=69, colno=38) + location: SourceLocation(pos=3264, lineno=69, colno=33) + end_location: SourceLocation(pos=3269, lineno=69, colno=38) identifier: - location: SourceLocation(pos=3244, lineno=69, colno=33) - end_location: SourceLocation(pos=3249, lineno=69, colno=38) + location: SourceLocation(pos=3264, lineno=69, colno=33) + end_location: SourceLocation(pos=3269, lineno=69, colno=38) is_tag: False namespace: None path: 'stone' @@ -3179,1288 +3179,1288 @@ data_tags: None - location: SourceLocation(pos=3250, lineno=70, colno=1) - end_location: SourceLocation(pos=3334, lineno=70, colno=85) + location: SourceLocation(pos=3270, lineno=70, colno=1) + end_location: SourceLocation(pos=3354, lineno=70, colno=85) identifier: 'fill:from:to:block' arguments: - location: SourceLocation(pos=3255, lineno=70, colno=6) - end_location: SourceLocation(pos=3262, lineno=70, colno=13) + location: SourceLocation(pos=3275, lineno=70, colno=6) + end_location: SourceLocation(pos=3282, lineno=70, colno=13) x: - location: SourceLocation(pos=3255, lineno=70, colno=6) - end_location: SourceLocation(pos=3258, lineno=70, colno=9) + location: SourceLocation(pos=3275, lineno=70, colno=6) + end_location: SourceLocation(pos=3278, lineno=70, colno=9) type: 'relative' value: -1 y: - location: SourceLocation(pos=3259, lineno=70, colno=10) - end_location: SourceLocation(pos=3260, lineno=70, colno=11) + location: SourceLocation(pos=3279, lineno=70, colno=10) + end_location: SourceLocation(pos=3280, lineno=70, colno=11) type: 'relative' value: 0 z: - location: SourceLocation(pos=3261, lineno=70, colno=12) - end_location: SourceLocation(pos=3262, lineno=70, colno=13) + location: SourceLocation(pos=3281, lineno=70, colno=12) + end_location: SourceLocation(pos=3282, lineno=70, colno=13) type: 'relative' value: 0 - location: SourceLocation(pos=3263, lineno=70, colno=14) - end_location: SourceLocation(pos=3269, lineno=70, colno=20) + location: SourceLocation(pos=3283, lineno=70, colno=14) + end_location: SourceLocation(pos=3289, lineno=70, colno=20) x: - location: SourceLocation(pos=3263, lineno=70, colno=14) - end_location: SourceLocation(pos=3265, lineno=70, colno=16) + location: SourceLocation(pos=3283, lineno=70, colno=14) + end_location: SourceLocation(pos=3285, lineno=70, colno=16) type: 'relative' value: 1 y: - location: SourceLocation(pos=3266, lineno=70, colno=17) - end_location: SourceLocation(pos=3267, lineno=70, colno=18) + location: SourceLocation(pos=3286, lineno=70, colno=17) + end_location: SourceLocation(pos=3287, lineno=70, colno=18) type: 'relative' value: 0 z: - location: SourceLocation(pos=3268, lineno=70, colno=19) - end_location: SourceLocation(pos=3269, lineno=70, colno=20) + location: SourceLocation(pos=3288, lineno=70, colno=19) + end_location: SourceLocation(pos=3289, lineno=70, colno=20) type: 'relative' value: 0 - location: SourceLocation(pos=3270, lineno=70, colno=21) - end_location: SourceLocation(pos=3334, lineno=70, colno=85) + location: SourceLocation(pos=3290, lineno=70, colno=21) + end_location: SourceLocation(pos=3354, lineno=70, colno=85) identifier: - location: SourceLocation(pos=3270, lineno=70, colno=21) - end_location: SourceLocation(pos=3303, lineno=70, colno=54) + location: SourceLocation(pos=3290, lineno=70, colno=21) + end_location: SourceLocation(pos=3323, lineno=70, colno=54) is_tag: False namespace: 'minecraft' path: 'prismarine_brick_stairs' block_states: - location: SourceLocation(pos=3304, lineno=70, colno=55) - end_location: SourceLocation(pos=3316, lineno=70, colno=67) + location: SourceLocation(pos=3324, lineno=70, colno=55) + end_location: SourceLocation(pos=3336, lineno=70, colno=67) key: - location: SourceLocation(pos=3304, lineno=70, colno=55) - end_location: SourceLocation(pos=3310, lineno=70, colno=61) + location: SourceLocation(pos=3324, lineno=70, colno=55) + end_location: SourceLocation(pos=3330, lineno=70, colno=61) value: 'facing' value: - location: SourceLocation(pos=3311, lineno=70, colno=62) - end_location: SourceLocation(pos=3316, lineno=70, colno=67) + location: SourceLocation(pos=3331, lineno=70, colno=62) + end_location: SourceLocation(pos=3336, lineno=70, colno=67) value: 'south' - location: SourceLocation(pos=3317, lineno=70, colno=68) - end_location: SourceLocation(pos=3333, lineno=70, colno=84) + location: SourceLocation(pos=3337, lineno=70, colno=68) + end_location: SourceLocation(pos=3353, lineno=70, colno=84) key: - location: SourceLocation(pos=3317, lineno=70, colno=68) - end_location: SourceLocation(pos=3328, lineno=70, colno=79) + location: SourceLocation(pos=3337, lineno=70, colno=68) + end_location: SourceLocation(pos=3348, lineno=70, colno=79) value: 'waterlogged' value: - location: SourceLocation(pos=3329, lineno=70, colno=80) - end_location: SourceLocation(pos=3333, lineno=70, colno=84) + location: SourceLocation(pos=3349, lineno=70, colno=80) + end_location: SourceLocation(pos=3353, lineno=70, colno=84) value: 'true' data_tags: None - location: SourceLocation(pos=3346, lineno=72, colno=1) - end_location: SourceLocation(pos=3374, lineno=72, colno=29) + location: SourceLocation(pos=3366, lineno=72, colno=1) + end_location: SourceLocation(pos=3394, lineno=72, colno=29) identifier: 'function:name' arguments: - location: SourceLocation(pos=3355, lineno=72, colno=10) - end_location: SourceLocation(pos=3374, lineno=72, colno=29) + location: SourceLocation(pos=3375, lineno=72, colno=10) + end_location: SourceLocation(pos=3394, lineno=72, colno=29) is_tag: False namespace: 'custom' path: 'example/test' - location: SourceLocation(pos=3375, lineno=73, colno=1) - end_location: SourceLocation(pos=3404, lineno=73, colno=30) + location: SourceLocation(pos=3395, lineno=73, colno=1) + end_location: SourceLocation(pos=3424, lineno=73, colno=30) identifier: 'function:name' arguments: - location: SourceLocation(pos=3384, lineno=73, colno=10) - end_location: SourceLocation(pos=3404, lineno=73, colno=30) + location: SourceLocation(pos=3404, lineno=73, colno=10) + end_location: SourceLocation(pos=3424, lineno=73, colno=30) is_tag: True namespace: 'custom' path: 'example/test' - location: SourceLocation(pos=3416, lineno=75, colno=1) - end_location: SourceLocation(pos=3433, lineno=75, colno=18) + location: SourceLocation(pos=3436, lineno=75, colno=1) + end_location: SourceLocation(pos=3453, lineno=75, colno=18) identifier: 'gamemode:creative' arguments: - location: SourceLocation(pos=3434, lineno=76, colno=1) - end_location: SourceLocation(pos=3454, lineno=76, colno=21) + location: SourceLocation(pos=3454, lineno=76, colno=1) + end_location: SourceLocation(pos=3474, lineno=76, colno=21) identifier: 'gamemode:survival:target' arguments: - location: SourceLocation(pos=3452, lineno=76, colno=19) - end_location: SourceLocation(pos=3454, lineno=76, colno=21) + location: SourceLocation(pos=3472, lineno=76, colno=19) + end_location: SourceLocation(pos=3474, lineno=76, colno=21) variable: 'a' arguments: - location: SourceLocation(pos=3466, lineno=78, colno=1) - end_location: SourceLocation(pos=3496, lineno=78, colno=31) + location: SourceLocation(pos=3486, lineno=78, colno=1) + end_location: SourceLocation(pos=3516, lineno=78, colno=31) identifier: 'gamerule:doDaylightCycle:value' arguments: - location: SourceLocation(pos=3491, lineno=78, colno=26) - end_location: SourceLocation(pos=3496, lineno=78, colno=31) + location: SourceLocation(pos=3511, lineno=78, colno=26) + end_location: SourceLocation(pos=3516, lineno=78, colno=31) value: False - location: SourceLocation(pos=3497, lineno=79, colno=1) - end_location: SourceLocation(pos=3531, lineno=79, colno=35) + location: SourceLocation(pos=3517, lineno=79, colno=1) + end_location: SourceLocation(pos=3551, lineno=79, colno=35) identifier: 'gamerule:naturalRegeneration:value' arguments: - location: SourceLocation(pos=3526, lineno=79, colno=30) - end_location: SourceLocation(pos=3531, lineno=79, colno=35) + location: SourceLocation(pos=3546, lineno=79, colno=30) + end_location: SourceLocation(pos=3551, lineno=79, colno=35) value: False - location: SourceLocation(pos=3532, lineno=80, colno=1) - end_location: SourceLocation(pos=3558, lineno=80, colno=27) + location: SourceLocation(pos=3552, lineno=80, colno=1) + end_location: SourceLocation(pos=3578, lineno=80, colno=27) identifier: 'gamerule:mobGriefing:value' arguments: - location: SourceLocation(pos=3553, lineno=80, colno=22) - end_location: SourceLocation(pos=3558, lineno=80, colno=27) + location: SourceLocation(pos=3573, lineno=80, colno=22) + end_location: SourceLocation(pos=3578, lineno=80, colno=27) value: False - location: SourceLocation(pos=3559, lineno=81, colno=1) - end_location: SourceLocation(pos=3588, lineno=81, colno=30) + location: SourceLocation(pos=3579, lineno=81, colno=1) + end_location: SourceLocation(pos=3608, lineno=81, colno=30) identifier: 'gamerule:doWeatherCycle:value' arguments: - location: SourceLocation(pos=3583, lineno=81, colno=25) - end_location: SourceLocation(pos=3588, lineno=81, colno=30) + location: SourceLocation(pos=3603, lineno=81, colno=25) + end_location: SourceLocation(pos=3608, lineno=81, colno=30) value: False - location: SourceLocation(pos=3589, lineno=82, colno=1) - end_location: SourceLocation(pos=3616, lineno=82, colno=28) + location: SourceLocation(pos=3609, lineno=82, colno=1) + end_location: SourceLocation(pos=3636, lineno=82, colno=28) identifier: 'gamerule:keepInventory:value' arguments: - location: SourceLocation(pos=3612, lineno=82, colno=24) - end_location: SourceLocation(pos=3616, lineno=82, colno=28) + location: SourceLocation(pos=3632, lineno=82, colno=24) + end_location: SourceLocation(pos=3636, lineno=82, colno=28) value: True - location: SourceLocation(pos=3617, lineno=83, colno=1) - end_location: SourceLocation(pos=3650, lineno=83, colno=34) + location: SourceLocation(pos=3637, lineno=83, colno=1) + end_location: SourceLocation(pos=3670, lineno=83, colno=34) identifier: 'gamerule:commandBlockOutput:value' arguments: - location: SourceLocation(pos=3645, lineno=83, colno=29) - end_location: SourceLocation(pos=3650, lineno=83, colno=34) + location: SourceLocation(pos=3665, lineno=83, colno=29) + end_location: SourceLocation(pos=3670, lineno=83, colno=34) value: False - location: SourceLocation(pos=3651, lineno=84, colno=1) - end_location: SourceLocation(pos=3676, lineno=84, colno=26) + location: SourceLocation(pos=3671, lineno=84, colno=1) + end_location: SourceLocation(pos=3696, lineno=84, colno=26) identifier: 'gamerule:doInsomnia:value' arguments: - location: SourceLocation(pos=3671, lineno=84, colno=21) - end_location: SourceLocation(pos=3676, lineno=84, colno=26) + location: SourceLocation(pos=3691, lineno=84, colno=21) + end_location: SourceLocation(pos=3696, lineno=84, colno=26) value: False - location: SourceLocation(pos=3684, lineno=86, colno=1) - end_location: SourceLocation(pos=3760, lineno=86, colno=77) + location: SourceLocation(pos=3704, lineno=86, colno=1) + end_location: SourceLocation(pos=3780, lineno=86, colno=77) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3689, lineno=86, colno=6) - end_location: SourceLocation(pos=3691, lineno=86, colno=8) + location: SourceLocation(pos=3709, lineno=86, colno=6) + end_location: SourceLocation(pos=3711, lineno=86, colno=8) variable: 'p' arguments: - location: SourceLocation(pos=3692, lineno=86, colno=9) - end_location: SourceLocation(pos=3758, lineno=86, colno=75) + location: SourceLocation(pos=3712, lineno=86, colno=9) + end_location: SourceLocation(pos=3778, lineno=86, colno=75) identifier: - location: SourceLocation(pos=3692, lineno=86, colno=9) - end_location: SourceLocation(pos=3715, lineno=86, colno=32) + location: SourceLocation(pos=3712, lineno=86, colno=9) + end_location: SourceLocation(pos=3735, lineno=86, colno=32) is_tag: False namespace: 'minecraft' path: 'diamond_sword' data_tags: - location: SourceLocation(pos=3715, lineno=86, colno=32) - end_location: SourceLocation(pos=3758, lineno=86, colno=75) + location: SourceLocation(pos=3735, lineno=86, colno=32) + end_location: SourceLocation(pos=3778, lineno=86, colno=75) entries: - location: SourceLocation(pos=3716, lineno=86, colno=33) - end_location: SourceLocation(pos=3757, lineno=86, colno=74) + location: SourceLocation(pos=3736, lineno=86, colno=33) + end_location: SourceLocation(pos=3777, lineno=86, colno=74) key: - location: SourceLocation(pos=3716, lineno=86, colno=33) - end_location: SourceLocation(pos=3723, lineno=86, colno=40) + location: SourceLocation(pos=3736, lineno=86, colno=33) + end_location: SourceLocation(pos=3743, lineno=86, colno=40) value: 'display' value: - location: SourceLocation(pos=3725, lineno=86, colno=42) - end_location: SourceLocation(pos=3757, lineno=86, colno=74) + location: SourceLocation(pos=3745, lineno=86, colno=42) + end_location: SourceLocation(pos=3777, lineno=86, colno=74) entries: - location: SourceLocation(pos=3726, lineno=86, colno=43) - end_location: SourceLocation(pos=3756, lineno=86, colno=73) + location: SourceLocation(pos=3746, lineno=86, colno=43) + end_location: SourceLocation(pos=3776, lineno=86, colno=73) key: - location: SourceLocation(pos=3726, lineno=86, colno=43) - end_location: SourceLocation(pos=3730, lineno=86, colno=47) + location: SourceLocation(pos=3746, lineno=86, colno=43) + end_location: SourceLocation(pos=3750, lineno=86, colno=47) value: 'Lore' value: - location: SourceLocation(pos=3732, lineno=86, colno=49) - end_location: SourceLocation(pos=3756, lineno=86, colno=73) + location: SourceLocation(pos=3752, lineno=86, colno=49) + end_location: SourceLocation(pos=3776, lineno=86, colno=73) elements: - location: SourceLocation(pos=3733, lineno=86, colno=50) - end_location: SourceLocation(pos=3755, lineno=86, colno=72) + location: SourceLocation(pos=3753, lineno=86, colno=50) + end_location: SourceLocation(pos=3775, lineno=86, colno=72) value: String('"A legendary weapon"') - location: SourceLocation(pos=3759, lineno=86, colno=76) - end_location: SourceLocation(pos=3760, lineno=86, colno=77) + location: SourceLocation(pos=3779, lineno=86, colno=76) + end_location: SourceLocation(pos=3780, lineno=86, colno=77) value: 1 - location: SourceLocation(pos=3761, lineno=87, colno=1) - end_location: SourceLocation(pos=3811, lineno=87, colno=51) + location: SourceLocation(pos=3781, lineno=87, colno=1) + end_location: SourceLocation(pos=3831, lineno=87, colno=51) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3766, lineno=87, colno=6) - end_location: SourceLocation(pos=3768, lineno=87, colno=8) + location: SourceLocation(pos=3786, lineno=87, colno=6) + end_location: SourceLocation(pos=3788, lineno=87, colno=8) variable: 'a' arguments: - location: SourceLocation(pos=3769, lineno=87, colno=9) - end_location: SourceLocation(pos=3809, lineno=87, colno=49) + location: SourceLocation(pos=3789, lineno=87, colno=9) + end_location: SourceLocation(pos=3829, lineno=87, colno=49) identifier: - location: SourceLocation(pos=3769, lineno=87, colno=9) - end_location: SourceLocation(pos=3775, lineno=87, colno=15) + location: SourceLocation(pos=3789, lineno=87, colno=9) + end_location: SourceLocation(pos=3795, lineno=87, colno=15) is_tag: False namespace: None path: 'potion' data_tags: - location: SourceLocation(pos=3775, lineno=87, colno=15) - end_location: SourceLocation(pos=3809, lineno=87, colno=49) + location: SourceLocation(pos=3795, lineno=87, colno=15) + end_location: SourceLocation(pos=3829, lineno=87, colno=49) entries: - location: SourceLocation(pos=3776, lineno=87, colno=16) - end_location: SourceLocation(pos=3808, lineno=87, colno=48) + location: SourceLocation(pos=3796, lineno=87, colno=16) + end_location: SourceLocation(pos=3828, lineno=87, colno=48) key: - location: SourceLocation(pos=3776, lineno=87, colno=16) - end_location: SourceLocation(pos=3782, lineno=87, colno=22) + location: SourceLocation(pos=3796, lineno=87, colno=16) + end_location: SourceLocation(pos=3802, lineno=87, colno=22) value: 'Potion' value: - location: SourceLocation(pos=3784, lineno=87, colno=24) - end_location: SourceLocation(pos=3808, lineno=87, colno=48) + location: SourceLocation(pos=3804, lineno=87, colno=24) + end_location: SourceLocation(pos=3828, lineno=87, colno=48) value: String('minecraft:night_vision') - location: SourceLocation(pos=3810, lineno=87, colno=50) - end_location: SourceLocation(pos=3811, lineno=87, colno=51) + location: SourceLocation(pos=3830, lineno=87, colno=50) + end_location: SourceLocation(pos=3831, lineno=87, colno=51) value: 1 - location: SourceLocation(pos=3812, lineno=88, colno=1) - end_location: SourceLocation(pos=3889, lineno=88, colno=78) + location: SourceLocation(pos=3832, lineno=88, colno=1) + end_location: SourceLocation(pos=3909, lineno=88, colno=78) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3817, lineno=88, colno=6) - end_location: SourceLocation(pos=3819, lineno=88, colno=8) + location: SourceLocation(pos=3837, lineno=88, colno=6) + end_location: SourceLocation(pos=3839, lineno=88, colno=8) variable: 'r' arguments: - location: SourceLocation(pos=3820, lineno=88, colno=9) - end_location: SourceLocation(pos=3887, lineno=88, colno=76) + location: SourceLocation(pos=3840, lineno=88, colno=9) + end_location: SourceLocation(pos=3907, lineno=88, colno=76) identifier: - location: SourceLocation(pos=3820, lineno=88, colno=9) - end_location: SourceLocation(pos=3833, lineno=88, colno=22) + location: SourceLocation(pos=3840, lineno=88, colno=9) + end_location: SourceLocation(pos=3853, lineno=88, colno=22) is_tag: False namespace: None path: 'diamond_sword' data_tags: - location: SourceLocation(pos=3833, lineno=88, colno=22) - end_location: SourceLocation(pos=3887, lineno=88, colno=76) + location: SourceLocation(pos=3853, lineno=88, colno=22) + end_location: SourceLocation(pos=3907, lineno=88, colno=76) entries: - location: SourceLocation(pos=3834, lineno=88, colno=23) - end_location: SourceLocation(pos=3886, lineno=88, colno=75) + location: SourceLocation(pos=3854, lineno=88, colno=23) + end_location: SourceLocation(pos=3906, lineno=88, colno=75) key: - location: SourceLocation(pos=3834, lineno=88, colno=23) - end_location: SourceLocation(pos=3846, lineno=88, colno=35) + location: SourceLocation(pos=3854, lineno=88, colno=23) + end_location: SourceLocation(pos=3866, lineno=88, colno=35) value: 'Enchantments' value: - location: SourceLocation(pos=3848, lineno=88, colno=37) - end_location: SourceLocation(pos=3886, lineno=88, colno=75) + location: SourceLocation(pos=3868, lineno=88, colno=37) + end_location: SourceLocation(pos=3906, lineno=88, colno=75) elements: - location: SourceLocation(pos=3849, lineno=88, colno=38) - end_location: SourceLocation(pos=3885, lineno=88, colno=74) + location: SourceLocation(pos=3869, lineno=88, colno=38) + end_location: SourceLocation(pos=3905, lineno=88, colno=74) entries: - location: SourceLocation(pos=3850, lineno=88, colno=39) - end_location: SourceLocation(pos=3875, lineno=88, colno=64) + location: SourceLocation(pos=3870, lineno=88, colno=39) + end_location: SourceLocation(pos=3895, lineno=88, colno=64) key: - location: SourceLocation(pos=3850, lineno=88, colno=39) - end_location: SourceLocation(pos=3852, lineno=88, colno=41) + location: SourceLocation(pos=3870, lineno=88, colno=39) + end_location: SourceLocation(pos=3872, lineno=88, colno=41) value: 'id' value: - location: SourceLocation(pos=3854, lineno=88, colno=43) - end_location: SourceLocation(pos=3875, lineno=88, colno=64) + location: SourceLocation(pos=3874, lineno=88, colno=43) + end_location: SourceLocation(pos=3895, lineno=88, colno=64) value: String('minecraft:sharpness') - location: SourceLocation(pos=3877, lineno=88, colno=66) - end_location: SourceLocation(pos=3884, lineno=88, colno=73) + location: SourceLocation(pos=3897, lineno=88, colno=66) + end_location: SourceLocation(pos=3904, lineno=88, colno=73) key: - location: SourceLocation(pos=3877, lineno=88, colno=66) - end_location: SourceLocation(pos=3880, lineno=88, colno=69) + location: SourceLocation(pos=3897, lineno=88, colno=66) + end_location: SourceLocation(pos=3900, lineno=88, colno=69) value: 'lvl' value: - location: SourceLocation(pos=3882, lineno=88, colno=71) - end_location: SourceLocation(pos=3884, lineno=88, colno=73) + location: SourceLocation(pos=3902, lineno=88, colno=71) + end_location: SourceLocation(pos=3904, lineno=88, colno=73) value: Int(10) - location: SourceLocation(pos=3888, lineno=88, colno=77) - end_location: SourceLocation(pos=3889, lineno=88, colno=78) + location: SourceLocation(pos=3908, lineno=88, colno=77) + end_location: SourceLocation(pos=3909, lineno=88, colno=78) value: 1 - location: SourceLocation(pos=3890, lineno=89, colno=1) - end_location: SourceLocation(pos=3953, lineno=89, colno=64) + location: SourceLocation(pos=3910, lineno=89, colno=1) + end_location: SourceLocation(pos=3973, lineno=89, colno=64) identifier: 'give:targets:item' arguments: - location: SourceLocation(pos=3895, lineno=89, colno=6) - end_location: SourceLocation(pos=3897, lineno=89, colno=8) + location: SourceLocation(pos=3915, lineno=89, colno=6) + end_location: SourceLocation(pos=3917, lineno=89, colno=8) variable: 's' arguments: - location: SourceLocation(pos=3898, lineno=89, colno=9) - end_location: SourceLocation(pos=3953, lineno=89, colno=64) + location: SourceLocation(pos=3918, lineno=89, colno=9) + end_location: SourceLocation(pos=3973, lineno=89, colno=64) identifier: - location: SourceLocation(pos=3898, lineno=89, colno=9) - end_location: SourceLocation(pos=3921, lineno=89, colno=32) + location: SourceLocation(pos=3918, lineno=89, colno=9) + end_location: SourceLocation(pos=3941, lineno=89, colno=32) is_tag: False namespace: 'minecraft' path: 'diamond_block' data_tags: - location: SourceLocation(pos=3921, lineno=89, colno=32) - end_location: SourceLocation(pos=3953, lineno=89, colno=64) + location: SourceLocation(pos=3941, lineno=89, colno=32) + end_location: SourceLocation(pos=3973, lineno=89, colno=64) entries: - location: SourceLocation(pos=3922, lineno=89, colno=33) - end_location: SourceLocation(pos=3952, lineno=89, colno=63) + location: SourceLocation(pos=3942, lineno=89, colno=33) + end_location: SourceLocation(pos=3972, lineno=89, colno=63) key: - location: SourceLocation(pos=3922, lineno=89, colno=33) - end_location: SourceLocation(pos=3932, lineno=89, colno=43) + location: SourceLocation(pos=3942, lineno=89, colno=33) + end_location: SourceLocation(pos=3952, lineno=89, colno=43) value: 'CanPlaceOn' value: - location: SourceLocation(pos=3934, lineno=89, colno=45) - end_location: SourceLocation(pos=3952, lineno=89, colno=63) + location: SourceLocation(pos=3954, lineno=89, colno=45) + end_location: SourceLocation(pos=3972, lineno=89, colno=63) elements: - location: SourceLocation(pos=3935, lineno=89, colno=46) - end_location: SourceLocation(pos=3951, lineno=89, colno=62) + location: SourceLocation(pos=3955, lineno=89, colno=46) + end_location: SourceLocation(pos=3971, lineno=89, colno=62) value: String('minecraft:dirt') - location: SourceLocation(pos=3954, lineno=90, colno=1) - end_location: SourceLocation(pos=4071, lineno=90, colno=118) + location: SourceLocation(pos=3974, lineno=90, colno=1) + end_location: SourceLocation(pos=4091, lineno=90, colno=118) identifier: 'give:targets:item:count' arguments: - location: SourceLocation(pos=3959, lineno=90, colno=6) - end_location: SourceLocation(pos=3961, lineno=90, colno=8) + location: SourceLocation(pos=3979, lineno=90, colno=6) + end_location: SourceLocation(pos=3981, lineno=90, colno=8) variable: 'a' arguments: - location: SourceLocation(pos=3962, lineno=90, colno=9) - end_location: SourceLocation(pos=4069, lineno=90, colno=116) + location: SourceLocation(pos=3982, lineno=90, colno=9) + end_location: SourceLocation(pos=4089, lineno=90, colno=116) identifier: - location: SourceLocation(pos=3962, lineno=90, colno=9) - end_location: SourceLocation(pos=3968, lineno=90, colno=15) + location: SourceLocation(pos=3982, lineno=90, colno=9) + end_location: SourceLocation(pos=3988, lineno=90, colno=15) is_tag: False namespace: None path: 'potion' data_tags: - location: SourceLocation(pos=3968, lineno=90, colno=15) - end_location: SourceLocation(pos=4069, lineno=90, colno=116) + location: SourceLocation(pos=3988, lineno=90, colno=15) + end_location: SourceLocation(pos=4089, lineno=90, colno=116) entries: - location: SourceLocation(pos=3969, lineno=90, colno=16) - end_location: SourceLocation(pos=4021, lineno=90, colno=68) + location: SourceLocation(pos=3989, lineno=90, colno=16) + end_location: SourceLocation(pos=4041, lineno=90, colno=68) key: - location: SourceLocation(pos=3969, lineno=90, colno=16) - end_location: SourceLocation(pos=3981, lineno=90, colno=28) + location: SourceLocation(pos=3989, lineno=90, colno=16) + end_location: SourceLocation(pos=4001, lineno=90, colno=28) value: 'Enchantments' value: - location: SourceLocation(pos=3983, lineno=90, colno=30) - end_location: SourceLocation(pos=4021, lineno=90, colno=68) + location: SourceLocation(pos=4003, lineno=90, colno=30) + end_location: SourceLocation(pos=4041, lineno=90, colno=68) elements: - location: SourceLocation(pos=3984, lineno=90, colno=31) - end_location: SourceLocation(pos=4020, lineno=90, colno=67) + location: SourceLocation(pos=4004, lineno=90, colno=31) + end_location: SourceLocation(pos=4040, lineno=90, colno=67) entries: - location: SourceLocation(pos=3985, lineno=90, colno=32) - end_location: SourceLocation(pos=4010, lineno=90, colno=57) + location: SourceLocation(pos=4005, lineno=90, colno=32) + end_location: SourceLocation(pos=4030, lineno=90, colno=57) key: - location: SourceLocation(pos=3985, lineno=90, colno=32) - end_location: SourceLocation(pos=3987, lineno=90, colno=34) + location: SourceLocation(pos=4005, lineno=90, colno=32) + end_location: SourceLocation(pos=4007, lineno=90, colno=34) value: 'id' value: - location: SourceLocation(pos=3989, lineno=90, colno=36) - end_location: SourceLocation(pos=4010, lineno=90, colno=57) + location: SourceLocation(pos=4009, lineno=90, colno=36) + end_location: SourceLocation(pos=4030, lineno=90, colno=57) value: String('minecraft:knockback') - location: SourceLocation(pos=4012, lineno=90, colno=59) - end_location: SourceLocation(pos=4019, lineno=90, colno=66) + location: SourceLocation(pos=4032, lineno=90, colno=59) + end_location: SourceLocation(pos=4039, lineno=90, colno=66) key: - location: SourceLocation(pos=4012, lineno=90, colno=59) - end_location: SourceLocation(pos=4015, lineno=90, colno=62) + location: SourceLocation(pos=4032, lineno=90, colno=59) + end_location: SourceLocation(pos=4035, lineno=90, colno=62) value: 'lvl' value: - location: SourceLocation(pos=4017, lineno=90, colno=64) - end_location: SourceLocation(pos=4019, lineno=90, colno=66) + location: SourceLocation(pos=4037, lineno=90, colno=64) + end_location: SourceLocation(pos=4039, lineno=90, colno=66) value: Int(10) - location: SourceLocation(pos=4023, lineno=90, colno=70) - end_location: SourceLocation(pos=4068, lineno=90, colno=115) + location: SourceLocation(pos=4043, lineno=90, colno=70) + end_location: SourceLocation(pos=4088, lineno=90, colno=115) key: - location: SourceLocation(pos=4023, lineno=90, colno=70) - end_location: SourceLocation(pos=4042, lineno=90, colno=89) + location: SourceLocation(pos=4043, lineno=90, colno=70) + end_location: SourceLocation(pos=4062, lineno=90, colno=89) value: 'CustomPotionEffects' value: - location: SourceLocation(pos=4044, lineno=90, colno=91) - end_location: SourceLocation(pos=4068, lineno=90, colno=115) + location: SourceLocation(pos=4064, lineno=90, colno=91) + end_location: SourceLocation(pos=4088, lineno=90, colno=115) elements: - location: SourceLocation(pos=4045, lineno=90, colno=92) - end_location: SourceLocation(pos=4067, lineno=90, colno=114) + location: SourceLocation(pos=4065, lineno=90, colno=92) + end_location: SourceLocation(pos=4087, lineno=90, colno=114) entries: - location: SourceLocation(pos=4046, lineno=90, colno=93) - end_location: SourceLocation(pos=4052, lineno=90, colno=99) + location: SourceLocation(pos=4066, lineno=90, colno=93) + end_location: SourceLocation(pos=4072, lineno=90, colno=99) key: - location: SourceLocation(pos=4046, lineno=90, colno=93) - end_location: SourceLocation(pos=4048, lineno=90, colno=95) + location: SourceLocation(pos=4066, lineno=90, colno=93) + end_location: SourceLocation(pos=4068, lineno=90, colno=95) value: 'Id' value: - location: SourceLocation(pos=4050, lineno=90, colno=97) - end_location: SourceLocation(pos=4052, lineno=90, colno=99) + location: SourceLocation(pos=4070, lineno=90, colno=97) + end_location: SourceLocation(pos=4072, lineno=90, colno=99) value: Int(20) - location: SourceLocation(pos=4054, lineno=90, colno=101) - end_location: SourceLocation(pos=4066, lineno=90, colno=113) + location: SourceLocation(pos=4074, lineno=90, colno=101) + end_location: SourceLocation(pos=4086, lineno=90, colno=113) key: - location: SourceLocation(pos=4054, lineno=90, colno=101) - end_location: SourceLocation(pos=4063, lineno=90, colno=110) + location: SourceLocation(pos=4074, lineno=90, colno=101) + end_location: SourceLocation(pos=4083, lineno=90, colno=110) value: 'Amplifier' value: - location: SourceLocation(pos=4065, lineno=90, colno=112) - end_location: SourceLocation(pos=4066, lineno=90, colno=113) + location: SourceLocation(pos=4085, lineno=90, colno=112) + end_location: SourceLocation(pos=4086, lineno=90, colno=113) value: Int(1) - location: SourceLocation(pos=4070, lineno=90, colno=117) - end_location: SourceLocation(pos=4071, lineno=90, colno=118) + location: SourceLocation(pos=4090, lineno=90, colno=117) + end_location: SourceLocation(pos=4091, lineno=90, colno=118) value: 1 - location: SourceLocation(pos=4079, lineno=92, colno=1) - end_location: SourceLocation(pos=4149, lineno=92, colno=71) + location: SourceLocation(pos=4099, lineno=92, colno=1) + end_location: SourceLocation(pos=4169, lineno=92, colno=71) identifier: 'item:replace:block:pos:slot:with:item:count' arguments: - location: SourceLocation(pos=4098, lineno=92, colno=20) - end_location: SourceLocation(pos=4104, lineno=92, colno=26) + location: SourceLocation(pos=4118, lineno=92, colno=20) + end_location: SourceLocation(pos=4124, lineno=92, colno=26) x: - location: SourceLocation(pos=4098, lineno=92, colno=20) - end_location: SourceLocation(pos=4099, lineno=92, colno=21) + location: SourceLocation(pos=4118, lineno=92, colno=20) + end_location: SourceLocation(pos=4119, lineno=92, colno=21) type: 'relative' value: 0 y: - location: SourceLocation(pos=4100, lineno=92, colno=22) - end_location: SourceLocation(pos=4102, lineno=92, colno=24) + location: SourceLocation(pos=4120, lineno=92, colno=22) + end_location: SourceLocation(pos=4122, lineno=92, colno=24) type: 'relative' value: 2 z: - location: SourceLocation(pos=4103, lineno=92, colno=25) - end_location: SourceLocation(pos=4104, lineno=92, colno=26) + location: SourceLocation(pos=4123, lineno=92, colno=25) + end_location: SourceLocation(pos=4124, lineno=92, colno=26) type: 'relative' value: 0 - location: SourceLocation(pos=4105, lineno=92, colno=27) - end_location: SourceLocation(pos=4117, lineno=92, colno=39) + location: SourceLocation(pos=4125, lineno=92, colno=27) + end_location: SourceLocation(pos=4137, lineno=92, colno=39) value: 'container.26' - location: SourceLocation(pos=4123, lineno=92, colno=45) - end_location: SourceLocation(pos=4147, lineno=92, colno=69) + location: SourceLocation(pos=4143, lineno=92, colno=45) + end_location: SourceLocation(pos=4167, lineno=92, colno=69) identifier: - location: SourceLocation(pos=4123, lineno=92, colno=45) - end_location: SourceLocation(pos=4147, lineno=92, colno=69) + location: SourceLocation(pos=4143, lineno=92, colno=45) + end_location: SourceLocation(pos=4167, lineno=92, colno=69) is_tag: False namespace: 'minecraft' path: 'spruce_sapling' data_tags: None - location: SourceLocation(pos=4148, lineno=92, colno=70) - end_location: SourceLocation(pos=4149, lineno=92, colno=71) + location: SourceLocation(pos=4168, lineno=92, colno=70) + end_location: SourceLocation(pos=4169, lineno=92, colno=71) value: 4 - location: SourceLocation(pos=4150, lineno=93, colno=1) - end_location: SourceLocation(pos=4213, lineno=93, colno=64) + location: SourceLocation(pos=4170, lineno=93, colno=1) + end_location: SourceLocation(pos=4233, lineno=93, colno=64) identifier: 'item:replace:entity:targets:slot:with:item:count' arguments: - location: SourceLocation(pos=4170, lineno=93, colno=21) - end_location: SourceLocation(pos=4172, lineno=93, colno=23) + location: SourceLocation(pos=4190, lineno=93, colno=21) + end_location: SourceLocation(pos=4192, lineno=93, colno=23) variable: 'p' arguments: - location: SourceLocation(pos=4173, lineno=93, colno=24) - end_location: SourceLocation(pos=4181, lineno=93, colno=32) + location: SourceLocation(pos=4193, lineno=93, colno=24) + end_location: SourceLocation(pos=4201, lineno=93, colno=32) value: 'hotbar.8' - location: SourceLocation(pos=4187, lineno=93, colno=38) - end_location: SourceLocation(pos=4211, lineno=93, colno=62) + location: SourceLocation(pos=4207, lineno=93, colno=38) + end_location: SourceLocation(pos=4231, lineno=93, colno=62) identifier: - location: SourceLocation(pos=4187, lineno=93, colno=38) - end_location: SourceLocation(pos=4211, lineno=93, colno=62) + location: SourceLocation(pos=4207, lineno=93, colno=38) + end_location: SourceLocation(pos=4231, lineno=93, colno=62) is_tag: False namespace: 'minecraft' path: 'spruce_sapling' data_tags: None - location: SourceLocation(pos=4212, lineno=93, colno=63) - end_location: SourceLocation(pos=4213, lineno=93, colno=64) + location: SourceLocation(pos=4232, lineno=93, colno=63) + end_location: SourceLocation(pos=4233, lineno=93, colno=64) value: 4 - location: SourceLocation(pos=4214, lineno=94, colno=1) - end_location: SourceLocation(pos=4282, lineno=94, colno=69) + location: SourceLocation(pos=4234, lineno=94, colno=1) + end_location: SourceLocation(pos=4302, lineno=94, colno=69) identifier: 'item:replace:entity:targets:slot:from:entity:source:sourceSlot' arguments: - location: SourceLocation(pos=4234, lineno=94, colno=21) - end_location: SourceLocation(pos=4236, lineno=94, colno=23) + location: SourceLocation(pos=4254, lineno=94, colno=21) + end_location: SourceLocation(pos=4256, lineno=94, colno=23) variable: 's' arguments: - location: SourceLocation(pos=4237, lineno=94, colno=24) - end_location: SourceLocation(pos=4251, lineno=94, colno=38) + location: SourceLocation(pos=4257, lineno=94, colno=24) + end_location: SourceLocation(pos=4271, lineno=94, colno=38) value: 'weapon.offhand' - location: SourceLocation(pos=4264, lineno=94, colno=51) - end_location: SourceLocation(pos=4266, lineno=94, colno=53) + location: SourceLocation(pos=4284, lineno=94, colno=51) + end_location: SourceLocation(pos=4286, lineno=94, colno=53) variable: 's' arguments: - location: SourceLocation(pos=4267, lineno=94, colno=54) - end_location: SourceLocation(pos=4282, lineno=94, colno=69) + location: SourceLocation(pos=4287, lineno=94, colno=54) + end_location: SourceLocation(pos=4302, lineno=94, colno=69) value: 'weapon.mainhand' - location: SourceLocation(pos=4290, lineno=96, colno=1) - end_location: SourceLocation(pos=4297, lineno=96, colno=8) + location: SourceLocation(pos=4310, lineno=96, colno=1) + end_location: SourceLocation(pos=4317, lineno=96, colno=8) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4295, lineno=96, colno=6) - end_location: SourceLocation(pos=4297, lineno=96, colno=8) + location: SourceLocation(pos=4315, lineno=96, colno=6) + end_location: SourceLocation(pos=4317, lineno=96, colno=8) variable: 's' arguments: - location: SourceLocation(pos=4298, lineno=97, colno=1) - end_location: SourceLocation(pos=4308, lineno=97, colno=11) + location: SourceLocation(pos=4318, lineno=97, colno=1) + end_location: SourceLocation(pos=4328, lineno=97, colno=11) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4303, lineno=97, colno=6) - end_location: SourceLocation(pos=4308, lineno=97, colno=11) + location: SourceLocation(pos=4323, lineno=97, colno=6) + end_location: SourceLocation(pos=4328, lineno=97, colno=11) value: 'Steve' - location: SourceLocation(pos=4309, lineno=98, colno=1) - end_location: SourceLocation(pos=4327, lineno=98, colno=19) + location: SourceLocation(pos=4329, lineno=98, colno=1) + end_location: SourceLocation(pos=4347, lineno=98, colno=19) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4314, lineno=98, colno=6) - end_location: SourceLocation(pos=4327, lineno=98, colno=19) + location: SourceLocation(pos=4334, lineno=98, colno=6) + end_location: SourceLocation(pos=4347, lineno=98, colno=19) variable: 'e' arguments: - location: SourceLocation(pos=4317, lineno=98, colno=9) - end_location: SourceLocation(pos=4326, lineno=98, colno=18) + location: SourceLocation(pos=4337, lineno=98, colno=9) + end_location: SourceLocation(pos=4346, lineno=98, colno=18) inverted: False key: - location: SourceLocation(pos=4317, lineno=98, colno=9) - end_location: SourceLocation(pos=4321, lineno=98, colno=13) + location: SourceLocation(pos=4337, lineno=98, colno=9) + end_location: SourceLocation(pos=4341, lineno=98, colno=13) value: 'type' value: - location: SourceLocation(pos=4322, lineno=98, colno=14) - end_location: SourceLocation(pos=4326, lineno=98, colno=18) + location: SourceLocation(pos=4342, lineno=98, colno=14) + end_location: SourceLocation(pos=4346, lineno=98, colno=18) is_tag: False namespace: None path: 'item' - location: SourceLocation(pos=4328, lineno=99, colno=1) - end_location: SourceLocation(pos=4350, lineno=99, colno=23) + location: SourceLocation(pos=4348, lineno=99, colno=1) + end_location: SourceLocation(pos=4370, lineno=99, colno=23) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4333, lineno=99, colno=6) - end_location: SourceLocation(pos=4350, lineno=99, colno=23) + location: SourceLocation(pos=4353, lineno=99, colno=6) + end_location: SourceLocation(pos=4370, lineno=99, colno=23) variable: 'e' arguments: - location: SourceLocation(pos=4336, lineno=99, colno=9) - end_location: SourceLocation(pos=4349, lineno=99, colno=22) + location: SourceLocation(pos=4356, lineno=99, colno=9) + end_location: SourceLocation(pos=4369, lineno=99, colno=22) inverted: False key: - location: SourceLocation(pos=4336, lineno=99, colno=9) - end_location: SourceLocation(pos=4344, lineno=99, colno=17) + location: SourceLocation(pos=4356, lineno=99, colno=9) + end_location: SourceLocation(pos=4364, lineno=99, colno=17) value: 'distance' value: - location: SourceLocation(pos=4345, lineno=99, colno=18) - end_location: SourceLocation(pos=4349, lineno=99, colno=22) + location: SourceLocation(pos=4365, lineno=99, colno=18) + end_location: SourceLocation(pos=4369, lineno=99, colno=22) min: None max: 10 - location: SourceLocation(pos=4351, lineno=100, colno=1) - end_location: SourceLocation(pos=4372, lineno=100, colno=22) + location: SourceLocation(pos=4371, lineno=100, colno=1) + end_location: SourceLocation(pos=4392, lineno=100, colno=22) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4356, lineno=100, colno=6) - end_location: SourceLocation(pos=4372, lineno=100, colno=22) + location: SourceLocation(pos=4376, lineno=100, colno=6) + end_location: SourceLocation(pos=4392, lineno=100, colno=22) variable: 'e' arguments: - location: SourceLocation(pos=4359, lineno=100, colno=9) - end_location: SourceLocation(pos=4371, lineno=100, colno=21) + location: SourceLocation(pos=4379, lineno=100, colno=9) + end_location: SourceLocation(pos=4391, lineno=100, colno=21) inverted: True key: - location: SourceLocation(pos=4359, lineno=100, colno=9) - end_location: SourceLocation(pos=4363, lineno=100, colno=13) + location: SourceLocation(pos=4379, lineno=100, colno=9) + end_location: SourceLocation(pos=4383, lineno=100, colno=13) value: 'type' value: - location: SourceLocation(pos=4365, lineno=100, colno=15) - end_location: SourceLocation(pos=4371, lineno=100, colno=21) + location: SourceLocation(pos=4385, lineno=100, colno=15) + end_location: SourceLocation(pos=4391, lineno=100, colno=21) is_tag: False namespace: None path: 'player' - location: SourceLocation(pos=4373, lineno=101, colno=1) - end_location: SourceLocation(pos=4408, lineno=101, colno=36) + location: SourceLocation(pos=4393, lineno=101, colno=1) + end_location: SourceLocation(pos=4428, lineno=101, colno=36) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4378, lineno=101, colno=6) - end_location: SourceLocation(pos=4408, lineno=101, colno=36) + location: SourceLocation(pos=4398, lineno=101, colno=6) + end_location: SourceLocation(pos=4428, lineno=101, colno=36) variable: 'e' arguments: - location: SourceLocation(pos=4381, lineno=101, colno=9) - end_location: SourceLocation(pos=4394, lineno=101, colno=22) + location: SourceLocation(pos=4401, lineno=101, colno=9) + end_location: SourceLocation(pos=4414, lineno=101, colno=22) inverted: False key: - location: SourceLocation(pos=4381, lineno=101, colno=9) - end_location: SourceLocation(pos=4389, lineno=101, colno=17) + location: SourceLocation(pos=4401, lineno=101, colno=9) + end_location: SourceLocation(pos=4409, lineno=101, colno=17) value: 'distance' value: - location: SourceLocation(pos=4390, lineno=101, colno=18) - end_location: SourceLocation(pos=4394, lineno=101, colno=22) + location: SourceLocation(pos=4410, lineno=101, colno=18) + end_location: SourceLocation(pos=4414, lineno=101, colno=22) min: None max: 10 - location: SourceLocation(pos=4395, lineno=101, colno=23) - end_location: SourceLocation(pos=4407, lineno=101, colno=35) + location: SourceLocation(pos=4415, lineno=101, colno=23) + end_location: SourceLocation(pos=4427, lineno=101, colno=35) inverted: False key: - location: SourceLocation(pos=4395, lineno=101, colno=23) - end_location: SourceLocation(pos=4399, lineno=101, colno=27) + location: SourceLocation(pos=4415, lineno=101, colno=23) + end_location: SourceLocation(pos=4419, lineno=101, colno=27) value: 'type' value: - location: SourceLocation(pos=4400, lineno=101, colno=28) - end_location: SourceLocation(pos=4407, lineno=101, colno=35) + location: SourceLocation(pos=4420, lineno=101, colno=28) + end_location: SourceLocation(pos=4427, lineno=101, colno=35) is_tag: False namespace: None path: 'creeper' - location: SourceLocation(pos=4409, lineno=102, colno=1) - end_location: SourceLocation(pos=4475, lineno=102, colno=67) + location: SourceLocation(pos=4429, lineno=102, colno=1) + end_location: SourceLocation(pos=4495, lineno=102, colno=67) identifier: 'kill:targets' arguments: - location: SourceLocation(pos=4414, lineno=102, colno=6) - end_location: SourceLocation(pos=4475, lineno=102, colno=67) + location: SourceLocation(pos=4434, lineno=102, colno=6) + end_location: SourceLocation(pos=4495, lineno=102, colno=67) variable: 'e' arguments: - location: SourceLocation(pos=4417, lineno=102, colno=9) - end_location: SourceLocation(pos=4427, lineno=102, colno=19) + location: SourceLocation(pos=4437, lineno=102, colno=9) + end_location: SourceLocation(pos=4447, lineno=102, colno=19) inverted: False key: - location: SourceLocation(pos=4417, lineno=102, colno=9) - end_location: SourceLocation(pos=4421, lineno=102, colno=13) + location: SourceLocation(pos=4437, lineno=102, colno=9) + end_location: SourceLocation(pos=4441, lineno=102, colno=13) value: 'type' value: - location: SourceLocation(pos=4422, lineno=102, colno=14) - end_location: SourceLocation(pos=4427, lineno=102, colno=19) + location: SourceLocation(pos=4442, lineno=102, colno=14) + end_location: SourceLocation(pos=4447, lineno=102, colno=19) is_tag: False namespace: None path: 'arrow' - location: SourceLocation(pos=4428, lineno=102, colno=20) - end_location: SourceLocation(pos=4474, lineno=102, colno=66) + location: SourceLocation(pos=4448, lineno=102, colno=20) + end_location: SourceLocation(pos=4494, lineno=102, colno=66) inverted: False key: - location: SourceLocation(pos=4428, lineno=102, colno=20) - end_location: SourceLocation(pos=4431, lineno=102, colno=23) + location: SourceLocation(pos=4448, lineno=102, colno=20) + end_location: SourceLocation(pos=4451, lineno=102, colno=23) value: 'nbt' value: - location: SourceLocation(pos=4432, lineno=102, colno=24) - end_location: SourceLocation(pos=4474, lineno=102, colno=66) + location: SourceLocation(pos=4452, lineno=102, colno=24) + end_location: SourceLocation(pos=4494, lineno=102, colno=66) entries: - location: SourceLocation(pos=4433, lineno=102, colno=25) - end_location: SourceLocation(pos=4473, lineno=102, colno=65) + location: SourceLocation(pos=4453, lineno=102, colno=25) + end_location: SourceLocation(pos=4493, lineno=102, colno=65) key: - location: SourceLocation(pos=4433, lineno=102, colno=25) - end_location: SourceLocation(pos=4445, lineno=102, colno=37) + location: SourceLocation(pos=4453, lineno=102, colno=25) + end_location: SourceLocation(pos=4465, lineno=102, colno=37) value: 'inBlockState' value: - location: SourceLocation(pos=4447, lineno=102, colno=39) - end_location: SourceLocation(pos=4473, lineno=102, colno=65) + location: SourceLocation(pos=4467, lineno=102, colno=39) + end_location: SourceLocation(pos=4493, lineno=102, colno=65) entries: - location: SourceLocation(pos=4448, lineno=102, colno=40) - end_location: SourceLocation(pos=4472, lineno=102, colno=64) + location: SourceLocation(pos=4468, lineno=102, colno=40) + end_location: SourceLocation(pos=4492, lineno=102, colno=64) key: - location: SourceLocation(pos=4448, lineno=102, colno=40) - end_location: SourceLocation(pos=4452, lineno=102, colno=44) + location: SourceLocation(pos=4468, lineno=102, colno=40) + end_location: SourceLocation(pos=4472, lineno=102, colno=44) value: 'Name' value: - location: SourceLocation(pos=4454, lineno=102, colno=46) - end_location: SourceLocation(pos=4472, lineno=102, colno=64) + location: SourceLocation(pos=4474, lineno=102, colno=46) + end_location: SourceLocation(pos=4492, lineno=102, colno=64) value: String('minecraft:target') - location: SourceLocation(pos=4485, lineno=104, colno=1) - end_location: SourceLocation(pos=4499, lineno=104, colno=15) - identifier: 'locate:structure' + location: SourceLocation(pos=4505, lineno=104, colno=1) + end_location: SourceLocation(pos=4529, lineno=104, colno=25) + identifier: 'locate:structure:structure' arguments: - location: SourceLocation(pos=4492, lineno=104, colno=8) - end_location: SourceLocation(pos=4499, lineno=104, colno=15) + location: SourceLocation(pos=4522, lineno=104, colno=18) + end_location: SourceLocation(pos=4529, lineno=104, colno=25) is_tag: False namespace: None path: 'mansion' - location: SourceLocation(pos=4506, lineno=106, colno=1) - end_location: SourceLocation(pos=4515, lineno=106, colno=10) + location: SourceLocation(pos=4536, lineno=106, colno=1) + end_location: SourceLocation(pos=4545, lineno=106, colno=10) identifier: 'msg:targets:message' arguments: - location: SourceLocation(pos=4510, lineno=106, colno=5) - end_location: SourceLocation(pos=4512, lineno=106, colno=7) + location: SourceLocation(pos=4540, lineno=106, colno=5) + end_location: SourceLocation(pos=4542, lineno=106, colno=7) variable: 'a' arguments: - location: SourceLocation(pos=4513, lineno=106, colno=8) - end_location: SourceLocation(pos=4515, lineno=106, colno=10) + location: SourceLocation(pos=4543, lineno=106, colno=8) + end_location: SourceLocation(pos=4545, lineno=106, colno=10) fragments: - location: SourceLocation(pos=4513, lineno=106, colno=8) - end_location: SourceLocation(pos=4515, lineno=106, colno=10) + location: SourceLocation(pos=4543, lineno=106, colno=8) + end_location: SourceLocation(pos=4545, lineno=106, colno=10) value: 'Hi' - location: SourceLocation(pos=4527, lineno=108, colno=1) - end_location: SourceLocation(pos=4556, lineno=108, colno=30) + location: SourceLocation(pos=4557, lineno=108, colno=1) + end_location: SourceLocation(pos=4586, lineno=108, colno=30) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4536, lineno=108, colno=10) - end_location: SourceLocation(pos=4556, lineno=108, colno=30) + location: SourceLocation(pos=4566, lineno=108, colno=10) + end_location: SourceLocation(pos=4586, lineno=108, colno=30) name: - location: SourceLocation(pos=4536, lineno=108, colno=10) - end_location: SourceLocation(pos=4540, lineno=108, colno=14) + location: SourceLocation(pos=4566, lineno=108, colno=10) + end_location: SourceLocation(pos=4570, lineno=108, colno=14) is_tag: False namespace: None path: 'dust' parameters: - location: SourceLocation(pos=4541, lineno=108, colno=15) - end_location: SourceLocation(pos=4556, lineno=108, colno=30) + location: SourceLocation(pos=4571, lineno=108, colno=15) + end_location: SourceLocation(pos=4586, lineno=108, colno=30) red: - location: SourceLocation(pos=4541, lineno=108, colno=15) - end_location: SourceLocation(pos=4544, lineno=108, colno=18) + location: SourceLocation(pos=4571, lineno=108, colno=15) + end_location: SourceLocation(pos=4574, lineno=108, colno=18) value: 1.0 green: - location: SourceLocation(pos=4545, lineno=108, colno=19) - end_location: SourceLocation(pos=4548, lineno=108, colno=22) + location: SourceLocation(pos=4575, lineno=108, colno=19) + end_location: SourceLocation(pos=4578, lineno=108, colno=22) value: 0.5 blue: - location: SourceLocation(pos=4549, lineno=108, colno=23) - end_location: SourceLocation(pos=4552, lineno=108, colno=26) + location: SourceLocation(pos=4579, lineno=108, colno=23) + end_location: SourceLocation(pos=4582, lineno=108, colno=26) value: 0.5 size: - location: SourceLocation(pos=4553, lineno=108, colno=27) - end_location: SourceLocation(pos=4556, lineno=108, colno=30) + location: SourceLocation(pos=4583, lineno=108, colno=27) + end_location: SourceLocation(pos=4586, lineno=108, colno=30) value: 1.0 - location: SourceLocation(pos=4557, lineno=109, colno=1) - end_location: SourceLocation(pos=4615, lineno=109, colno=59) + location: SourceLocation(pos=4587, lineno=109, colno=1) + end_location: SourceLocation(pos=4645, lineno=109, colno=59) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4566, lineno=109, colno=10) - end_location: SourceLocation(pos=4615, lineno=109, colno=59) + location: SourceLocation(pos=4596, lineno=109, colno=10) + end_location: SourceLocation(pos=4645, lineno=109, colno=59) name: - location: SourceLocation(pos=4566, lineno=109, colno=10) - end_location: SourceLocation(pos=4587, lineno=109, colno=31) + location: SourceLocation(pos=4596, lineno=109, colno=10) + end_location: SourceLocation(pos=4617, lineno=109, colno=31) is_tag: False namespace: None path: 'dust_color_transition' parameters: - location: SourceLocation(pos=4588, lineno=109, colno=32) - end_location: SourceLocation(pos=4615, lineno=109, colno=59) + location: SourceLocation(pos=4618, lineno=109, colno=32) + end_location: SourceLocation(pos=4645, lineno=109, colno=59) red: - location: SourceLocation(pos=4588, lineno=109, colno=32) - end_location: SourceLocation(pos=4591, lineno=109, colno=35) + location: SourceLocation(pos=4618, lineno=109, colno=32) + end_location: SourceLocation(pos=4621, lineno=109, colno=35) value: 1.0 green: - location: SourceLocation(pos=4592, lineno=109, colno=36) - end_location: SourceLocation(pos=4595, lineno=109, colno=39) + location: SourceLocation(pos=4622, lineno=109, colno=36) + end_location: SourceLocation(pos=4625, lineno=109, colno=39) value: 0.0 blue: - location: SourceLocation(pos=4596, lineno=109, colno=40) - end_location: SourceLocation(pos=4599, lineno=109, colno=43) + location: SourceLocation(pos=4626, lineno=109, colno=40) + end_location: SourceLocation(pos=4629, lineno=109, colno=43) value: 0.0 size: - location: SourceLocation(pos=4600, lineno=109, colno=44) - end_location: SourceLocation(pos=4603, lineno=109, colno=47) + location: SourceLocation(pos=4630, lineno=109, colno=44) + end_location: SourceLocation(pos=4633, lineno=109, colno=47) value: 1.0 end_red: - location: SourceLocation(pos=4604, lineno=109, colno=48) - end_location: SourceLocation(pos=4607, lineno=109, colno=51) + location: SourceLocation(pos=4634, lineno=109, colno=48) + end_location: SourceLocation(pos=4637, lineno=109, colno=51) value: 0.0 end_green: - location: SourceLocation(pos=4608, lineno=109, colno=52) - end_location: SourceLocation(pos=4611, lineno=109, colno=55) + location: SourceLocation(pos=4638, lineno=109, colno=52) + end_location: SourceLocation(pos=4641, lineno=109, colno=55) value: 0.0 end_blue: - location: SourceLocation(pos=4612, lineno=109, colno=56) - end_location: SourceLocation(pos=4615, lineno=109, colno=59) + location: SourceLocation(pos=4642, lineno=109, colno=56) + end_location: SourceLocation(pos=4645, lineno=109, colno=59) value: 1.0 - location: SourceLocation(pos=4616, lineno=110, colno=1) - end_location: SourceLocation(pos=4664, lineno=110, colno=49) + location: SourceLocation(pos=4646, lineno=110, colno=1) + end_location: SourceLocation(pos=4694, lineno=110, colno=49) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4625, lineno=110, colno=10) - end_location: SourceLocation(pos=4664, lineno=110, colno=49) + location: SourceLocation(pos=4655, lineno=110, colno=10) + end_location: SourceLocation(pos=4694, lineno=110, colno=49) name: - location: SourceLocation(pos=4625, lineno=110, colno=10) - end_location: SourceLocation(pos=4630, lineno=110, colno=15) + location: SourceLocation(pos=4655, lineno=110, colno=10) + end_location: SourceLocation(pos=4660, lineno=110, colno=15) is_tag: False namespace: None path: 'block' parameters: - location: SourceLocation(pos=4631, lineno=110, colno=16) - end_location: SourceLocation(pos=4664, lineno=110, colno=49) + location: SourceLocation(pos=4661, lineno=110, colno=16) + end_location: SourceLocation(pos=4694, lineno=110, colno=49) block: - location: SourceLocation(pos=4631, lineno=110, colno=16) - end_location: SourceLocation(pos=4664, lineno=110, colno=49) + location: SourceLocation(pos=4661, lineno=110, colno=16) + end_location: SourceLocation(pos=4694, lineno=110, colno=49) identifier: - location: SourceLocation(pos=4631, lineno=110, colno=16) - end_location: SourceLocation(pos=4652, lineno=110, colno=37) + location: SourceLocation(pos=4661, lineno=110, colno=16) + end_location: SourceLocation(pos=4682, lineno=110, colno=37) is_tag: False namespace: 'minecraft' path: 'grass_block' block_states: - location: SourceLocation(pos=4653, lineno=110, colno=38) - end_location: SourceLocation(pos=4663, lineno=110, colno=48) + location: SourceLocation(pos=4683, lineno=110, colno=38) + end_location: SourceLocation(pos=4693, lineno=110, colno=48) key: - location: SourceLocation(pos=4653, lineno=110, colno=38) - end_location: SourceLocation(pos=4658, lineno=110, colno=43) + location: SourceLocation(pos=4683, lineno=110, colno=38) + end_location: SourceLocation(pos=4688, lineno=110, colno=43) value: 'snowy' value: - location: SourceLocation(pos=4659, lineno=110, colno=44) - end_location: SourceLocation(pos=4663, lineno=110, colno=48) + location: SourceLocation(pos=4689, lineno=110, colno=44) + end_location: SourceLocation(pos=4693, lineno=110, colno=48) value: 'true' data_tags: None - location: SourceLocation(pos=4665, lineno=111, colno=1) - end_location: SourceLocation(pos=4720, lineno=111, colno=56) + location: SourceLocation(pos=4695, lineno=111, colno=1) + end_location: SourceLocation(pos=4750, lineno=111, colno=56) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4674, lineno=111, colno=10) - end_location: SourceLocation(pos=4720, lineno=111, colno=56) + location: SourceLocation(pos=4704, lineno=111, colno=10) + end_location: SourceLocation(pos=4750, lineno=111, colno=56) name: - location: SourceLocation(pos=4674, lineno=111, colno=10) - end_location: SourceLocation(pos=4686, lineno=111, colno=22) + location: SourceLocation(pos=4704, lineno=111, colno=10) + end_location: SourceLocation(pos=4716, lineno=111, colno=22) is_tag: False namespace: None path: 'falling_dust' parameters: - location: SourceLocation(pos=4687, lineno=111, colno=23) - end_location: SourceLocation(pos=4720, lineno=111, colno=56) + location: SourceLocation(pos=4717, lineno=111, colno=23) + end_location: SourceLocation(pos=4750, lineno=111, colno=56) block: - location: SourceLocation(pos=4687, lineno=111, colno=23) - end_location: SourceLocation(pos=4720, lineno=111, colno=56) + location: SourceLocation(pos=4717, lineno=111, colno=23) + end_location: SourceLocation(pos=4750, lineno=111, colno=56) identifier: - location: SourceLocation(pos=4687, lineno=111, colno=23) - end_location: SourceLocation(pos=4708, lineno=111, colno=44) + location: SourceLocation(pos=4717, lineno=111, colno=23) + end_location: SourceLocation(pos=4738, lineno=111, colno=44) is_tag: False namespace: 'minecraft' path: 'grass_block' block_states: - location: SourceLocation(pos=4709, lineno=111, colno=45) - end_location: SourceLocation(pos=4719, lineno=111, colno=55) + location: SourceLocation(pos=4739, lineno=111, colno=45) + end_location: SourceLocation(pos=4749, lineno=111, colno=55) key: - location: SourceLocation(pos=4709, lineno=111, colno=45) - end_location: SourceLocation(pos=4714, lineno=111, colno=50) + location: SourceLocation(pos=4739, lineno=111, colno=45) + end_location: SourceLocation(pos=4744, lineno=111, colno=50) value: 'snowy' value: - location: SourceLocation(pos=4715, lineno=111, colno=51) - end_location: SourceLocation(pos=4719, lineno=111, colno=55) + location: SourceLocation(pos=4745, lineno=111, colno=51) + end_location: SourceLocation(pos=4749, lineno=111, colno=55) value: 'true' data_tags: None - location: SourceLocation(pos=4721, lineno=112, colno=1) - end_location: SourceLocation(pos=4750, lineno=112, colno=30) + location: SourceLocation(pos=4751, lineno=112, colno=1) + end_location: SourceLocation(pos=4780, lineno=112, colno=30) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4730, lineno=112, colno=10) - end_location: SourceLocation(pos=4750, lineno=112, colno=30) + location: SourceLocation(pos=4760, lineno=112, colno=10) + end_location: SourceLocation(pos=4780, lineno=112, colno=30) name: - location: SourceLocation(pos=4730, lineno=112, colno=10) - end_location: SourceLocation(pos=4734, lineno=112, colno=14) + location: SourceLocation(pos=4760, lineno=112, colno=10) + end_location: SourceLocation(pos=4764, lineno=112, colno=14) is_tag: False namespace: None path: 'item' parameters: - location: SourceLocation(pos=4735, lineno=112, colno=15) - end_location: SourceLocation(pos=4750, lineno=112, colno=30) + location: SourceLocation(pos=4765, lineno=112, colno=15) + end_location: SourceLocation(pos=4780, lineno=112, colno=30) item: - location: SourceLocation(pos=4735, lineno=112, colno=15) - end_location: SourceLocation(pos=4750, lineno=112, colno=30) + location: SourceLocation(pos=4765, lineno=112, colno=15) + end_location: SourceLocation(pos=4780, lineno=112, colno=30) identifier: - location: SourceLocation(pos=4735, lineno=112, colno=15) - end_location: SourceLocation(pos=4750, lineno=112, colno=30) + location: SourceLocation(pos=4765, lineno=112, colno=15) + end_location: SourceLocation(pos=4780, lineno=112, colno=30) is_tag: False namespace: 'minecraft' path: 'apple' data_tags: None - location: SourceLocation(pos=4751, lineno=113, colno=1) - end_location: SourceLocation(pos=4799, lineno=113, colno=49) + location: SourceLocation(pos=4781, lineno=113, colno=1) + end_location: SourceLocation(pos=4829, lineno=113, colno=49) identifier: 'particle:name' arguments: - location: SourceLocation(pos=4760, lineno=113, colno=10) - end_location: SourceLocation(pos=4799, lineno=113, colno=49) + location: SourceLocation(pos=4790, lineno=113, colno=10) + end_location: SourceLocation(pos=4829, lineno=113, colno=49) name: - location: SourceLocation(pos=4760, lineno=113, colno=10) - end_location: SourceLocation(pos=4769, lineno=113, colno=19) + location: SourceLocation(pos=4790, lineno=113, colno=10) + end_location: SourceLocation(pos=4799, lineno=113, colno=19) is_tag: False namespace: None path: 'vibration' parameters: - location: SourceLocation(pos=4770, lineno=113, colno=20) - end_location: SourceLocation(pos=4799, lineno=113, colno=49) + location: SourceLocation(pos=4800, lineno=113, colno=20) + end_location: SourceLocation(pos=4829, lineno=113, colno=49) x1: - location: SourceLocation(pos=4770, lineno=113, colno=20) - end_location: SourceLocation(pos=4773, lineno=113, colno=23) + location: SourceLocation(pos=4800, lineno=113, colno=20) + end_location: SourceLocation(pos=4803, lineno=113, colno=23) value: 0.0 y1: - location: SourceLocation(pos=4774, lineno=113, colno=24) - end_location: SourceLocation(pos=4778, lineno=113, colno=28) + location: SourceLocation(pos=4804, lineno=113, colno=24) + end_location: SourceLocation(pos=4808, lineno=113, colno=28) value: 64.0 z1: - location: SourceLocation(pos=4779, lineno=113, colno=29) - end_location: SourceLocation(pos=4782, lineno=113, colno=32) + location: SourceLocation(pos=4809, lineno=113, colno=29) + end_location: SourceLocation(pos=4812, lineno=113, colno=32) value: 0.0 x2: - location: SourceLocation(pos=4783, lineno=113, colno=33) - end_location: SourceLocation(pos=4786, lineno=113, colno=36) + location: SourceLocation(pos=4813, lineno=113, colno=33) + end_location: SourceLocation(pos=4816, lineno=113, colno=36) value: 5.0 y2: - location: SourceLocation(pos=4787, lineno=113, colno=37) - end_location: SourceLocation(pos=4791, lineno=113, colno=41) + location: SourceLocation(pos=4817, lineno=113, colno=37) + end_location: SourceLocation(pos=4821, lineno=113, colno=41) value: 64.0 z2: - location: SourceLocation(pos=4792, lineno=113, colno=42) - end_location: SourceLocation(pos=4795, lineno=113, colno=45) + location: SourceLocation(pos=4822, lineno=113, colno=42) + end_location: SourceLocation(pos=4825, lineno=113, colno=45) value: 0.0 duration: - location: SourceLocation(pos=4796, lineno=113, colno=46) - end_location: SourceLocation(pos=4799, lineno=113, colno=49) + location: SourceLocation(pos=4826, lineno=113, colno=46) + end_location: SourceLocation(pos=4829, lineno=113, colno=49) value: 200 - location: SourceLocation(pos=4800, lineno=114, colno=1) - end_location: SourceLocation(pos=4855, lineno=114, colno=56) + location: SourceLocation(pos=4830, lineno=114, colno=1) + end_location: SourceLocation(pos=4885, lineno=114, colno=56) identifier: 'particle:name:pos' arguments: - location: SourceLocation(pos=4809, lineno=114, colno=10) - end_location: SourceLocation(pos=4848, lineno=114, colno=49) + location: SourceLocation(pos=4839, lineno=114, colno=10) + end_location: SourceLocation(pos=4878, lineno=114, colno=49) name: - location: SourceLocation(pos=4809, lineno=114, colno=10) - end_location: SourceLocation(pos=4818, lineno=114, colno=19) + location: SourceLocation(pos=4839, lineno=114, colno=10) + end_location: SourceLocation(pos=4848, lineno=114, colno=19) is_tag: False namespace: None path: 'vibration' parameters: - location: SourceLocation(pos=4819, lineno=114, colno=20) - end_location: SourceLocation(pos=4848, lineno=114, colno=49) + location: SourceLocation(pos=4849, lineno=114, colno=20) + end_location: SourceLocation(pos=4878, lineno=114, colno=49) x1: - location: SourceLocation(pos=4819, lineno=114, colno=20) - end_location: SourceLocation(pos=4822, lineno=114, colno=23) + location: SourceLocation(pos=4849, lineno=114, colno=20) + end_location: SourceLocation(pos=4852, lineno=114, colno=23) value: 0.0 y1: - location: SourceLocation(pos=4823, lineno=114, colno=24) - end_location: SourceLocation(pos=4827, lineno=114, colno=28) + location: SourceLocation(pos=4853, lineno=114, colno=24) + end_location: SourceLocation(pos=4857, lineno=114, colno=28) value: 64.0 z1: - location: SourceLocation(pos=4828, lineno=114, colno=29) - end_location: SourceLocation(pos=4831, lineno=114, colno=32) + location: SourceLocation(pos=4858, lineno=114, colno=29) + end_location: SourceLocation(pos=4861, lineno=114, colno=32) value: 0.0 x2: - location: SourceLocation(pos=4832, lineno=114, colno=33) - end_location: SourceLocation(pos=4835, lineno=114, colno=36) + location: SourceLocation(pos=4862, lineno=114, colno=33) + end_location: SourceLocation(pos=4865, lineno=114, colno=36) value: 5.0 y2: - location: SourceLocation(pos=4836, lineno=114, colno=37) - end_location: SourceLocation(pos=4840, lineno=114, colno=41) + location: SourceLocation(pos=4866, lineno=114, colno=37) + end_location: SourceLocation(pos=4870, lineno=114, colno=41) value: 64.0 z2: - location: SourceLocation(pos=4841, lineno=114, colno=42) - end_location: SourceLocation(pos=4844, lineno=114, colno=45) + location: SourceLocation(pos=4871, lineno=114, colno=42) + end_location: SourceLocation(pos=4874, lineno=114, colno=45) value: 0.0 duration: - location: SourceLocation(pos=4845, lineno=114, colno=46) - end_location: SourceLocation(pos=4848, lineno=114, colno=49) + location: SourceLocation(pos=4875, lineno=114, colno=46) + end_location: SourceLocation(pos=4878, lineno=114, colno=49) value: 200 - location: SourceLocation(pos=4849, lineno=114, colno=50) - end_location: SourceLocation(pos=4855, lineno=114, colno=56) + location: SourceLocation(pos=4879, lineno=114, colno=50) + end_location: SourceLocation(pos=4885, lineno=114, colno=56) x: - location: SourceLocation(pos=4849, lineno=114, colno=50) - end_location: SourceLocation(pos=4850, lineno=114, colno=51) + location: SourceLocation(pos=4879, lineno=114, colno=50) + end_location: SourceLocation(pos=4880, lineno=114, colno=51) type: 'local' value: 0 y: - location: SourceLocation(pos=4851, lineno=114, colno=52) - end_location: SourceLocation(pos=4852, lineno=114, colno=53) + location: SourceLocation(pos=4881, lineno=114, colno=52) + end_location: SourceLocation(pos=4882, lineno=114, colno=53) type: 'local' value: 0 z: - location: SourceLocation(pos=4853, lineno=114, colno=54) - end_location: SourceLocation(pos=4855, lineno=114, colno=56) + location: SourceLocation(pos=4883, lineno=114, colno=54) + end_location: SourceLocation(pos=4885, lineno=114, colno=56) type: 'local' value: 3 - location: SourceLocation(pos=4867, lineno=116, colno=1) - end_location: SourceLocation(pos=4900, lineno=116, colno=34) + location: SourceLocation(pos=4897, lineno=116, colno=1) + end_location: SourceLocation(pos=4930, lineno=116, colno=34) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=4876, lineno=116, colno=10) - end_location: SourceLocation(pos=4881, lineno=116, colno=15) + location: SourceLocation(pos=4906, lineno=116, colno=10) + end_location: SourceLocation(pos=4911, lineno=116, colno=15) x: - location: SourceLocation(pos=4876, lineno=116, colno=10) - end_location: SourceLocation(pos=4877, lineno=116, colno=11) + location: SourceLocation(pos=4906, lineno=116, colno=10) + end_location: SourceLocation(pos=4907, lineno=116, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=4878, lineno=116, colno=12) - end_location: SourceLocation(pos=4879, lineno=116, colno=13) + location: SourceLocation(pos=4908, lineno=116, colno=12) + end_location: SourceLocation(pos=4909, lineno=116, colno=13) type: 'relative' value: 0 z: - location: SourceLocation(pos=4880, lineno=116, colno=14) - end_location: SourceLocation(pos=4881, lineno=116, colno=15) + location: SourceLocation(pos=4910, lineno=116, colno=14) + end_location: SourceLocation(pos=4911, lineno=116, colno=15) type: 'relative' value: 0 - location: SourceLocation(pos=4882, lineno=116, colno=16) - end_location: SourceLocation(pos=4900, lineno=116, colno=34) + location: SourceLocation(pos=4912, lineno=116, colno=16) + end_location: SourceLocation(pos=4930, lineno=116, colno=34) identifier: - location: SourceLocation(pos=4882, lineno=116, colno=16) - end_location: SourceLocation(pos=4887, lineno=116, colno=21) + location: SourceLocation(pos=4912, lineno=116, colno=16) + end_location: SourceLocation(pos=4917, lineno=116, colno=21) is_tag: False namespace: None path: 'chest' block_states: - location: SourceLocation(pos=4888, lineno=116, colno=22) - end_location: SourceLocation(pos=4899, lineno=116, colno=33) + location: SourceLocation(pos=4918, lineno=116, colno=22) + end_location: SourceLocation(pos=4929, lineno=116, colno=33) key: - location: SourceLocation(pos=4888, lineno=116, colno=22) - end_location: SourceLocation(pos=4894, lineno=116, colno=28) + location: SourceLocation(pos=4918, lineno=116, colno=22) + end_location: SourceLocation(pos=4924, lineno=116, colno=28) value: 'facing' value: - location: SourceLocation(pos=4895, lineno=116, colno=29) - end_location: SourceLocation(pos=4899, lineno=116, colno=33) + location: SourceLocation(pos=4925, lineno=116, colno=29) + end_location: SourceLocation(pos=4929, lineno=116, colno=33) value: 'east' data_tags: None - location: SourceLocation(pos=4901, lineno=117, colno=1) - end_location: SourceLocation(pos=4974, lineno=117, colno=74) + location: SourceLocation(pos=4931, lineno=117, colno=1) + end_location: SourceLocation(pos=5004, lineno=117, colno=74) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=4910, lineno=117, colno=10) - end_location: SourceLocation(pos=4917, lineno=117, colno=17) + location: SourceLocation(pos=4940, lineno=117, colno=10) + end_location: SourceLocation(pos=4947, lineno=117, colno=17) x: - location: SourceLocation(pos=4910, lineno=117, colno=10) - end_location: SourceLocation(pos=4911, lineno=117, colno=11) + location: SourceLocation(pos=4940, lineno=117, colno=10) + end_location: SourceLocation(pos=4941, lineno=117, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=4912, lineno=117, colno=12) - end_location: SourceLocation(pos=4913, lineno=117, colno=13) + location: SourceLocation(pos=4942, lineno=117, colno=12) + end_location: SourceLocation(pos=4943, lineno=117, colno=13) type: 'relative' value: 0 z: - location: SourceLocation(pos=4914, lineno=117, colno=14) - end_location: SourceLocation(pos=4917, lineno=117, colno=17) + location: SourceLocation(pos=4944, lineno=117, colno=14) + end_location: SourceLocation(pos=4947, lineno=117, colno=17) type: 'relative' value: -1 - location: SourceLocation(pos=4918, lineno=117, colno=18) - end_location: SourceLocation(pos=4974, lineno=117, colno=74) + location: SourceLocation(pos=4948, lineno=117, colno=18) + end_location: SourceLocation(pos=5004, lineno=117, colno=74) identifier: - location: SourceLocation(pos=4918, lineno=117, colno=18) - end_location: SourceLocation(pos=4928, lineno=117, colno=28) + location: SourceLocation(pos=4948, lineno=117, colno=18) + end_location: SourceLocation(pos=4958, lineno=117, colno=28) is_tag: False namespace: None path: 'birch_sign' @@ -4468,984 +4468,984 @@ data_tags: - location: SourceLocation(pos=4928, lineno=117, colno=28) - end_location: SourceLocation(pos=4974, lineno=117, colno=74) + location: SourceLocation(pos=4958, lineno=117, colno=28) + end_location: SourceLocation(pos=5004, lineno=117, colno=74) entries: - location: SourceLocation(pos=4929, lineno=117, colno=29) - end_location: SourceLocation(pos=4948, lineno=117, colno=48) + location: SourceLocation(pos=4959, lineno=117, colno=29) + end_location: SourceLocation(pos=4978, lineno=117, colno=48) key: - location: SourceLocation(pos=4929, lineno=117, colno=29) - end_location: SourceLocation(pos=4934, lineno=117, colno=34) + location: SourceLocation(pos=4959, lineno=117, colno=29) + end_location: SourceLocation(pos=4964, lineno=117, colno=34) value: 'Text1' value: - location: SourceLocation(pos=4936, lineno=117, colno=36) - end_location: SourceLocation(pos=4948, lineno=117, colno=48) + location: SourceLocation(pos=4966, lineno=117, colno=36) + end_location: SourceLocation(pos=4978, lineno=117, colno=48) value: String('"My chest"') - location: SourceLocation(pos=4950, lineno=117, colno=50) - end_location: SourceLocation(pos=4973, lineno=117, colno=73) + location: SourceLocation(pos=4980, lineno=117, colno=50) + end_location: SourceLocation(pos=5003, lineno=117, colno=73) key: - location: SourceLocation(pos=4950, lineno=117, colno=50) - end_location: SourceLocation(pos=4955, lineno=117, colno=55) + location: SourceLocation(pos=4980, lineno=117, colno=50) + end_location: SourceLocation(pos=4985, lineno=117, colno=55) value: 'Text2' value: - location: SourceLocation(pos=4957, lineno=117, colno=57) - end_location: SourceLocation(pos=4973, lineno=117, colno=73) + location: SourceLocation(pos=4987, lineno=117, colno=57) + end_location: SourceLocation(pos=5003, lineno=117, colno=73) value: String('"Do not open!"') - location: SourceLocation(pos=4975, lineno=118, colno=1) - end_location: SourceLocation(pos=5012, lineno=118, colno=38) + location: SourceLocation(pos=5005, lineno=118, colno=1) + end_location: SourceLocation(pos=5042, lineno=118, colno=38) identifier: 'setblock:pos:block' arguments: - location: SourceLocation(pos=4984, lineno=118, colno=10) - end_location: SourceLocation(pos=4990, lineno=118, colno=16) + location: SourceLocation(pos=5014, lineno=118, colno=10) + end_location: SourceLocation(pos=5020, lineno=118, colno=16) x: - location: SourceLocation(pos=4984, lineno=118, colno=10) - end_location: SourceLocation(pos=4985, lineno=118, colno=11) + location: SourceLocation(pos=5014, lineno=118, colno=10) + end_location: SourceLocation(pos=5015, lineno=118, colno=11) type: 'relative' value: 0 y: - location: SourceLocation(pos=4986, lineno=118, colno=12) - end_location: SourceLocation(pos=4988, lineno=118, colno=14) + location: SourceLocation(pos=5016, lineno=118, colno=12) + end_location: SourceLocation(pos=5018, lineno=118, colno=14) type: 'relative' value: 2 z: - location: SourceLocation(pos=4989, lineno=118, colno=15) - end_location: SourceLocation(pos=4990, lineno=118, colno=16) + location: SourceLocation(pos=5019, lineno=118, colno=15) + end_location: SourceLocation(pos=5020, lineno=118, colno=16) type: 'relative' value: 0 - location: SourceLocation(pos=4991, lineno=118, colno=17) - end_location: SourceLocation(pos=5012, lineno=118, colno=38) + location: SourceLocation(pos=5021, lineno=118, colno=17) + end_location: SourceLocation(pos=5042, lineno=118, colno=38) identifier: - location: SourceLocation(pos=4991, lineno=118, colno=17) - end_location: SourceLocation(pos=5002, lineno=118, colno=28) + location: SourceLocation(pos=5021, lineno=118, colno=17) + end_location: SourceLocation(pos=5032, lineno=118, colno=28) is_tag: False namespace: None path: 'quartz_slab' block_states: - location: SourceLocation(pos=5003, lineno=118, colno=29) - end_location: SourceLocation(pos=5011, lineno=118, colno=37) + location: SourceLocation(pos=5033, lineno=118, colno=29) + end_location: SourceLocation(pos=5041, lineno=118, colno=37) key: - location: SourceLocation(pos=5003, lineno=118, colno=29) - end_location: SourceLocation(pos=5007, lineno=118, colno=33) + location: SourceLocation(pos=5033, lineno=118, colno=29) + end_location: SourceLocation(pos=5037, lineno=118, colno=33) value: 'type' value: - location: SourceLocation(pos=5008, lineno=118, colno=34) - end_location: SourceLocation(pos=5011, lineno=118, colno=37) + location: SourceLocation(pos=5038, lineno=118, colno=34) + end_location: SourceLocation(pos=5041, lineno=118, colno=37) value: 'top' data_tags: None - location: SourceLocation(pos=5029, lineno=120, colno=1) - end_location: SourceLocation(pos=5062, lineno=120, colno=34) + location: SourceLocation(pos=5059, lineno=120, colno=1) + end_location: SourceLocation(pos=5092, lineno=120, colno=34) identifier: 'spreadplayers:center:spreadDistance:maxRange:respectTeams:targets' arguments: - location: SourceLocation(pos=5043, lineno=120, colno=15) - end_location: SourceLocation(pos=5046, lineno=120, colno=18) + location: SourceLocation(pos=5073, lineno=120, colno=15) + end_location: SourceLocation(pos=5076, lineno=120, colno=18) x: - location: SourceLocation(pos=5043, lineno=120, colno=15) - end_location: SourceLocation(pos=5044, lineno=120, colno=16) + location: SourceLocation(pos=5073, lineno=120, colno=15) + end_location: SourceLocation(pos=5074, lineno=120, colno=16) type: 'absolute' value: 0 y: - location: SourceLocation(pos=5045, lineno=120, colno=17) - end_location: SourceLocation(pos=5046, lineno=120, colno=18) + location: SourceLocation(pos=5075, lineno=120, colno=17) + end_location: SourceLocation(pos=5076, lineno=120, colno=18) type: 'absolute' value: 0 - location: SourceLocation(pos=5047, lineno=120, colno=19) - end_location: SourceLocation(pos=5050, lineno=120, colno=22) + location: SourceLocation(pos=5077, lineno=120, colno=19) + end_location: SourceLocation(pos=5080, lineno=120, colno=22) value: 200 - location: SourceLocation(pos=5051, lineno=120, colno=23) - end_location: SourceLocation(pos=5054, lineno=120, colno=26) + location: SourceLocation(pos=5081, lineno=120, colno=23) + end_location: SourceLocation(pos=5084, lineno=120, colno=26) value: 500 - location: SourceLocation(pos=5055, lineno=120, colno=27) - end_location: SourceLocation(pos=5059, lineno=120, colno=31) + location: SourceLocation(pos=5085, lineno=120, colno=27) + end_location: SourceLocation(pos=5089, lineno=120, colno=31) value: True - location: SourceLocation(pos=5060, lineno=120, colno=32) - end_location: SourceLocation(pos=5062, lineno=120, colno=34) + location: SourceLocation(pos=5090, lineno=120, colno=32) + end_location: SourceLocation(pos=5092, lineno=120, colno=34) variable: 'a' arguments: - location: SourceLocation(pos=5072, lineno=122, colno=1) - end_location: SourceLocation(pos=5102, lineno=122, colno=31) + location: SourceLocation(pos=5102, lineno=122, colno=1) + end_location: SourceLocation(pos=5132, lineno=122, colno=31) identifier: 'summon:entity:pos' arguments: - location: SourceLocation(pos=5079, lineno=122, colno=8) - end_location: SourceLocation(pos=5093, lineno=122, colno=22) + location: SourceLocation(pos=5109, lineno=122, colno=8) + end_location: SourceLocation(pos=5123, lineno=122, colno=22) is_tag: False namespace: None path: 'lightning_bolt' - location: SourceLocation(pos=5094, lineno=122, colno=23) - end_location: SourceLocation(pos=5102, lineno=122, colno=31) + location: SourceLocation(pos=5124, lineno=122, colno=23) + end_location: SourceLocation(pos=5132, lineno=122, colno=31) x: - location: SourceLocation(pos=5094, lineno=122, colno=23) - end_location: SourceLocation(pos=5098, lineno=122, colno=27) + location: SourceLocation(pos=5124, lineno=122, colno=23) + end_location: SourceLocation(pos=5128, lineno=122, colno=27) type: 'relative' value: -10 y: - location: SourceLocation(pos=5099, lineno=122, colno=28) - end_location: SourceLocation(pos=5100, lineno=122, colno=29) + location: SourceLocation(pos=5129, lineno=122, colno=28) + end_location: SourceLocation(pos=5130, lineno=122, colno=29) type: 'relative' value: 0 z: - location: SourceLocation(pos=5101, lineno=122, colno=30) - end_location: SourceLocation(pos=5102, lineno=122, colno=31) + location: SourceLocation(pos=5131, lineno=122, colno=30) + end_location: SourceLocation(pos=5132, lineno=122, colno=31) type: 'relative' value: 0 - location: SourceLocation(pos=5103, lineno=123, colno=1) - end_location: SourceLocation(pos=5179, lineno=123, colno=77) + location: SourceLocation(pos=5133, lineno=123, colno=1) + end_location: SourceLocation(pos=5209, lineno=123, colno=77) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=5110, lineno=123, colno=8) - end_location: SourceLocation(pos=5117, lineno=123, colno=15) + location: SourceLocation(pos=5140, lineno=123, colno=8) + end_location: SourceLocation(pos=5147, lineno=123, colno=15) is_tag: False namespace: None path: 'creeper' - location: SourceLocation(pos=5118, lineno=123, colno=16) - end_location: SourceLocation(pos=5123, lineno=123, colno=21) + location: SourceLocation(pos=5148, lineno=123, colno=16) + end_location: SourceLocation(pos=5153, lineno=123, colno=21) x: - location: SourceLocation(pos=5118, lineno=123, colno=16) - end_location: SourceLocation(pos=5119, lineno=123, colno=17) + location: SourceLocation(pos=5148, lineno=123, colno=16) + end_location: SourceLocation(pos=5149, lineno=123, colno=17) type: 'relative' value: 0 y: - location: SourceLocation(pos=5120, lineno=123, colno=18) - end_location: SourceLocation(pos=5121, lineno=123, colno=19) + location: SourceLocation(pos=5150, lineno=123, colno=18) + end_location: SourceLocation(pos=5151, lineno=123, colno=19) type: 'relative' value: 0 z: - location: SourceLocation(pos=5122, lineno=123, colno=20) - end_location: SourceLocation(pos=5123, lineno=123, colno=21) + location: SourceLocation(pos=5152, lineno=123, colno=20) + end_location: SourceLocation(pos=5153, lineno=123, colno=21) type: 'relative' value: 0 - location: SourceLocation(pos=5124, lineno=123, colno=22) - end_location: SourceLocation(pos=5179, lineno=123, colno=77) + location: SourceLocation(pos=5154, lineno=123, colno=22) + end_location: SourceLocation(pos=5209, lineno=123, colno=77) entries: - location: SourceLocation(pos=5125, lineno=123, colno=23) - end_location: SourceLocation(pos=5136, lineno=123, colno=34) + location: SourceLocation(pos=5155, lineno=123, colno=23) + end_location: SourceLocation(pos=5166, lineno=123, colno=34) key: - location: SourceLocation(pos=5125, lineno=123, colno=23) - end_location: SourceLocation(pos=5132, lineno=123, colno=30) + location: SourceLocation(pos=5155, lineno=123, colno=23) + end_location: SourceLocation(pos=5162, lineno=123, colno=30) value: 'powered' value: - location: SourceLocation(pos=5134, lineno=123, colno=32) - end_location: SourceLocation(pos=5136, lineno=123, colno=34) + location: SourceLocation(pos=5164, lineno=123, colno=32) + end_location: SourceLocation(pos=5166, lineno=123, colno=34) value: Byte(1) - location: SourceLocation(pos=5138, lineno=123, colno=36) - end_location: SourceLocation(pos=5178, lineno=123, colno=76) + location: SourceLocation(pos=5168, lineno=123, colno=36) + end_location: SourceLocation(pos=5208, lineno=123, colno=76) key: - location: SourceLocation(pos=5138, lineno=123, colno=36) - end_location: SourceLocation(pos=5148, lineno=123, colno=46) + location: SourceLocation(pos=5168, lineno=123, colno=36) + end_location: SourceLocation(pos=5178, lineno=123, colno=46) value: 'CustomName' value: - location: SourceLocation(pos=5150, lineno=123, colno=48) - end_location: SourceLocation(pos=5178, lineno=123, colno=76) + location: SourceLocation(pos=5180, lineno=123, colno=48) + end_location: SourceLocation(pos=5208, lineno=123, colno=76) value: String('{"text":"Powered Creeper"}') - location: SourceLocation(pos=5180, lineno=124, colno=1) - end_location: SourceLocation(pos=5289, lineno=124, colno=110) + location: SourceLocation(pos=5210, lineno=124, colno=1) + end_location: SourceLocation(pos=5319, lineno=124, colno=110) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=5187, lineno=124, colno=8) - end_location: SourceLocation(pos=5193, lineno=124, colno=14) + location: SourceLocation(pos=5217, lineno=124, colno=8) + end_location: SourceLocation(pos=5223, lineno=124, colno=14) is_tag: False namespace: None path: 'spider' - location: SourceLocation(pos=5194, lineno=124, colno=15) - end_location: SourceLocation(pos=5199, lineno=124, colno=20) + location: SourceLocation(pos=5224, lineno=124, colno=15) + end_location: SourceLocation(pos=5229, lineno=124, colno=20) x: - location: SourceLocation(pos=5194, lineno=124, colno=15) - end_location: SourceLocation(pos=5195, lineno=124, colno=16) + location: SourceLocation(pos=5224, lineno=124, colno=15) + end_location: SourceLocation(pos=5225, lineno=124, colno=16) type: 'relative' value: 0 y: - location: SourceLocation(pos=5196, lineno=124, colno=17) - end_location: SourceLocation(pos=5197, lineno=124, colno=18) + location: SourceLocation(pos=5226, lineno=124, colno=17) + end_location: SourceLocation(pos=5227, lineno=124, colno=18) type: 'relative' value: 0 z: - location: SourceLocation(pos=5198, lineno=124, colno=19) - end_location: SourceLocation(pos=5199, lineno=124, colno=20) + location: SourceLocation(pos=5228, lineno=124, colno=19) + end_location: SourceLocation(pos=5229, lineno=124, colno=20) type: 'relative' value: 0 - location: SourceLocation(pos=5200, lineno=124, colno=21) - end_location: SourceLocation(pos=5289, lineno=124, colno=110) + location: SourceLocation(pos=5230, lineno=124, colno=21) + end_location: SourceLocation(pos=5319, lineno=124, colno=110) entries: - location: SourceLocation(pos=5201, lineno=124, colno=22) - end_location: SourceLocation(pos=5288, lineno=124, colno=109) + location: SourceLocation(pos=5231, lineno=124, colno=22) + end_location: SourceLocation(pos=5318, lineno=124, colno=109) key: - location: SourceLocation(pos=5201, lineno=124, colno=22) - end_location: SourceLocation(pos=5211, lineno=124, colno=32) + location: SourceLocation(pos=5231, lineno=124, colno=22) + end_location: SourceLocation(pos=5241, lineno=124, colno=32) value: 'Passengers' value: - location: SourceLocation(pos=5213, lineno=124, colno=34) - end_location: SourceLocation(pos=5288, lineno=124, colno=109) + location: SourceLocation(pos=5243, lineno=124, colno=34) + end_location: SourceLocation(pos=5318, lineno=124, colno=109) elements: - location: SourceLocation(pos=5214, lineno=124, colno=35) - end_location: SourceLocation(pos=5287, lineno=124, colno=108) + location: SourceLocation(pos=5244, lineno=124, colno=35) + end_location: SourceLocation(pos=5317, lineno=124, colno=108) entries: - location: SourceLocation(pos=5215, lineno=124, colno=36) - end_location: SourceLocation(pos=5239, lineno=124, colno=60) + location: SourceLocation(pos=5245, lineno=124, colno=36) + end_location: SourceLocation(pos=5269, lineno=124, colno=60) key: - location: SourceLocation(pos=5215, lineno=124, colno=36) - end_location: SourceLocation(pos=5217, lineno=124, colno=38) + location: SourceLocation(pos=5245, lineno=124, colno=36) + end_location: SourceLocation(pos=5247, lineno=124, colno=38) value: 'id' value: - location: SourceLocation(pos=5219, lineno=124, colno=40) - end_location: SourceLocation(pos=5239, lineno=124, colno=60) + location: SourceLocation(pos=5249, lineno=124, colno=40) + end_location: SourceLocation(pos=5269, lineno=124, colno=60) value: String('minecraft:skeleton') - location: SourceLocation(pos=5241, lineno=124, colno=62) - end_location: SourceLocation(pos=5286, lineno=124, colno=107) + location: SourceLocation(pos=5271, lineno=124, colno=62) + end_location: SourceLocation(pos=5316, lineno=124, colno=107) key: - location: SourceLocation(pos=5241, lineno=124, colno=62) - end_location: SourceLocation(pos=5250, lineno=124, colno=71) + location: SourceLocation(pos=5271, lineno=124, colno=62) + end_location: SourceLocation(pos=5280, lineno=124, colno=71) value: 'HandItems' value: - location: SourceLocation(pos=5252, lineno=124, colno=73) - end_location: SourceLocation(pos=5286, lineno=124, colno=107) + location: SourceLocation(pos=5282, lineno=124, colno=73) + end_location: SourceLocation(pos=5316, lineno=124, colno=107) elements: - location: SourceLocation(pos=5253, lineno=124, colno=74) - end_location: SourceLocation(pos=5285, lineno=124, colno=106) + location: SourceLocation(pos=5283, lineno=124, colno=74) + end_location: SourceLocation(pos=5315, lineno=124, colno=106) entries: - location: SourceLocation(pos=5254, lineno=124, colno=75) - end_location: SourceLocation(pos=5273, lineno=124, colno=94) + location: SourceLocation(pos=5284, lineno=124, colno=75) + end_location: SourceLocation(pos=5303, lineno=124, colno=94) key: - location: SourceLocation(pos=5254, lineno=124, colno=75) - end_location: SourceLocation(pos=5256, lineno=124, colno=77) + location: SourceLocation(pos=5284, lineno=124, colno=75) + end_location: SourceLocation(pos=5286, lineno=124, colno=77) value: 'id' value: - location: SourceLocation(pos=5258, lineno=124, colno=79) - end_location: SourceLocation(pos=5273, lineno=124, colno=94) + location: SourceLocation(pos=5288, lineno=124, colno=79) + end_location: SourceLocation(pos=5303, lineno=124, colno=94) value: String('minecraft:bow') - location: SourceLocation(pos=5275, lineno=124, colno=96) - end_location: SourceLocation(pos=5284, lineno=124, colno=105) + location: SourceLocation(pos=5305, lineno=124, colno=96) + end_location: SourceLocation(pos=5314, lineno=124, colno=105) key: - location: SourceLocation(pos=5275, lineno=124, colno=96) - end_location: SourceLocation(pos=5280, lineno=124, colno=101) + location: SourceLocation(pos=5305, lineno=124, colno=96) + end_location: SourceLocation(pos=5310, lineno=124, colno=101) value: 'Count' value: - location: SourceLocation(pos=5282, lineno=124, colno=103) - end_location: SourceLocation(pos=5284, lineno=124, colno=105) + location: SourceLocation(pos=5312, lineno=124, colno=103) + end_location: SourceLocation(pos=5314, lineno=124, colno=105) value: Byte(1) - location: SourceLocation(pos=5290, lineno=125, colno=1) - end_location: SourceLocation(pos=5415, lineno=125, colno=126) + location: SourceLocation(pos=5320, lineno=125, colno=1) + end_location: SourceLocation(pos=5445, lineno=125, colno=126) identifier: 'summon:entity:pos:nbt' arguments: - location: SourceLocation(pos=5297, lineno=125, colno=8) - end_location: SourceLocation(pos=5305, lineno=125, colno=16) + location: SourceLocation(pos=5327, lineno=125, colno=8) + end_location: SourceLocation(pos=5335, lineno=125, colno=16) is_tag: False namespace: None path: 'villager' - location: SourceLocation(pos=5306, lineno=125, colno=17) - end_location: SourceLocation(pos=5311, lineno=125, colno=22) + location: SourceLocation(pos=5336, lineno=125, colno=17) + end_location: SourceLocation(pos=5341, lineno=125, colno=22) x: - location: SourceLocation(pos=5306, lineno=125, colno=17) - end_location: SourceLocation(pos=5307, lineno=125, colno=18) + location: SourceLocation(pos=5336, lineno=125, colno=17) + end_location: SourceLocation(pos=5337, lineno=125, colno=18) type: 'relative' value: 0 y: - location: SourceLocation(pos=5308, lineno=125, colno=19) - end_location: SourceLocation(pos=5309, lineno=125, colno=20) + location: SourceLocation(pos=5338, lineno=125, colno=19) + end_location: SourceLocation(pos=5339, lineno=125, colno=20) type: 'relative' value: 0 z: - location: SourceLocation(pos=5310, lineno=125, colno=21) - end_location: SourceLocation(pos=5311, lineno=125, colno=22) + location: SourceLocation(pos=5340, lineno=125, colno=21) + end_location: SourceLocation(pos=5341, lineno=125, colno=22) type: 'relative' value: 0 - location: SourceLocation(pos=5312, lineno=125, colno=23) - end_location: SourceLocation(pos=5415, lineno=125, colno=126) + location: SourceLocation(pos=5342, lineno=125, colno=23) + end_location: SourceLocation(pos=5445, lineno=125, colno=126) entries: - location: SourceLocation(pos=5313, lineno=125, colno=24) - end_location: SourceLocation(pos=5414, lineno=125, colno=125) + location: SourceLocation(pos=5343, lineno=125, colno=24) + end_location: SourceLocation(pos=5444, lineno=125, colno=125) key: - location: SourceLocation(pos=5313, lineno=125, colno=24) - end_location: SourceLocation(pos=5319, lineno=125, colno=30) + location: SourceLocation(pos=5343, lineno=125, colno=24) + end_location: SourceLocation(pos=5349, lineno=125, colno=30) value: 'Offers' value: - location: SourceLocation(pos=5321, lineno=125, colno=32) - end_location: SourceLocation(pos=5414, lineno=125, colno=125) + location: SourceLocation(pos=5351, lineno=125, colno=32) + end_location: SourceLocation(pos=5444, lineno=125, colno=125) entries: - location: SourceLocation(pos=5322, lineno=125, colno=33) - end_location: SourceLocation(pos=5413, lineno=125, colno=124) + location: SourceLocation(pos=5352, lineno=125, colno=33) + end_location: SourceLocation(pos=5443, lineno=125, colno=124) key: - location: SourceLocation(pos=5322, lineno=125, colno=33) - end_location: SourceLocation(pos=5329, lineno=125, colno=40) + location: SourceLocation(pos=5352, lineno=125, colno=33) + end_location: SourceLocation(pos=5359, lineno=125, colno=40) value: 'Recipes' value: - location: SourceLocation(pos=5331, lineno=125, colno=42) - end_location: SourceLocation(pos=5413, lineno=125, colno=124) + location: SourceLocation(pos=5361, lineno=125, colno=42) + end_location: SourceLocation(pos=5443, lineno=125, colno=124) elements: - location: SourceLocation(pos=5332, lineno=125, colno=43) - end_location: SourceLocation(pos=5412, lineno=125, colno=123) + location: SourceLocation(pos=5362, lineno=125, colno=43) + end_location: SourceLocation(pos=5442, lineno=125, colno=123) entries: - location: SourceLocation(pos=5333, lineno=125, colno=44) - end_location: SourceLocation(pos=5360, lineno=125, colno=71) + location: SourceLocation(pos=5363, lineno=125, colno=44) + end_location: SourceLocation(pos=5390, lineno=125, colno=71) key: - location: SourceLocation(pos=5333, lineno=125, colno=44) - end_location: SourceLocation(pos=5336, lineno=125, colno=47) + location: SourceLocation(pos=5363, lineno=125, colno=44) + end_location: SourceLocation(pos=5366, lineno=125, colno=47) value: 'buy' value: - location: SourceLocation(pos=5338, lineno=125, colno=49) - end_location: SourceLocation(pos=5360, lineno=125, colno=71) + location: SourceLocation(pos=5368, lineno=125, colno=49) + end_location: SourceLocation(pos=5390, lineno=125, colno=71) entries: - location: SourceLocation(pos=5339, lineno=125, colno=50) - end_location: SourceLocation(pos=5349, lineno=125, colno=60) + location: SourceLocation(pos=5369, lineno=125, colno=50) + end_location: SourceLocation(pos=5379, lineno=125, colno=60) key: - location: SourceLocation(pos=5339, lineno=125, colno=50) - end_location: SourceLocation(pos=5341, lineno=125, colno=52) + location: SourceLocation(pos=5369, lineno=125, colno=50) + end_location: SourceLocation(pos=5371, lineno=125, colno=52) value: 'id' value: - location: SourceLocation(pos=5343, lineno=125, colno=54) - end_location: SourceLocation(pos=5349, lineno=125, colno=60) + location: SourceLocation(pos=5373, lineno=125, colno=54) + end_location: SourceLocation(pos=5379, lineno=125, colno=60) value: String('dirt') - location: SourceLocation(pos=5351, lineno=125, colno=62) - end_location: SourceLocation(pos=5359, lineno=125, colno=70) + location: SourceLocation(pos=5381, lineno=125, colno=62) + end_location: SourceLocation(pos=5389, lineno=125, colno=70) key: - location: SourceLocation(pos=5351, lineno=125, colno=62) - end_location: SourceLocation(pos=5356, lineno=125, colno=67) + location: SourceLocation(pos=5381, lineno=125, colno=62) + end_location: SourceLocation(pos=5386, lineno=125, colno=67) value: 'Count' value: - location: SourceLocation(pos=5358, lineno=125, colno=69) - end_location: SourceLocation(pos=5359, lineno=125, colno=70) + location: SourceLocation(pos=5388, lineno=125, colno=69) + end_location: SourceLocation(pos=5389, lineno=125, colno=70) value: Int(1) - location: SourceLocation(pos=5362, lineno=125, colno=73) - end_location: SourceLocation(pos=5393, lineno=125, colno=104) + location: SourceLocation(pos=5392, lineno=125, colno=73) + end_location: SourceLocation(pos=5423, lineno=125, colno=104) key: - location: SourceLocation(pos=5362, lineno=125, colno=73) - end_location: SourceLocation(pos=5366, lineno=125, colno=77) + location: SourceLocation(pos=5392, lineno=125, colno=73) + end_location: SourceLocation(pos=5396, lineno=125, colno=77) value: 'sell' value: - location: SourceLocation(pos=5368, lineno=125, colno=79) - end_location: SourceLocation(pos=5393, lineno=125, colno=104) + location: SourceLocation(pos=5398, lineno=125, colno=79) + end_location: SourceLocation(pos=5423, lineno=125, colno=104) entries: - location: SourceLocation(pos=5369, lineno=125, colno=80) - end_location: SourceLocation(pos=5382, lineno=125, colno=93) + location: SourceLocation(pos=5399, lineno=125, colno=80) + end_location: SourceLocation(pos=5412, lineno=125, colno=93) key: - location: SourceLocation(pos=5369, lineno=125, colno=80) - end_location: SourceLocation(pos=5371, lineno=125, colno=82) + location: SourceLocation(pos=5399, lineno=125, colno=80) + end_location: SourceLocation(pos=5401, lineno=125, colno=82) value: 'id' value: - location: SourceLocation(pos=5373, lineno=125, colno=84) - end_location: SourceLocation(pos=5382, lineno=125, colno=93) + location: SourceLocation(pos=5403, lineno=125, colno=84) + end_location: SourceLocation(pos=5412, lineno=125, colno=93) value: String('diamond') - location: SourceLocation(pos=5384, lineno=125, colno=95) - end_location: SourceLocation(pos=5392, lineno=125, colno=103) + location: SourceLocation(pos=5414, lineno=125, colno=95) + end_location: SourceLocation(pos=5422, lineno=125, colno=103) key: - location: SourceLocation(pos=5384, lineno=125, colno=95) - end_location: SourceLocation(pos=5389, lineno=125, colno=100) + location: SourceLocation(pos=5414, lineno=125, colno=95) + end_location: SourceLocation(pos=5419, lineno=125, colno=100) value: 'Count' value: - location: SourceLocation(pos=5391, lineno=125, colno=102) - end_location: SourceLocation(pos=5392, lineno=125, colno=103) + location: SourceLocation(pos=5421, lineno=125, colno=102) + end_location: SourceLocation(pos=5422, lineno=125, colno=103) value: Int(1) - location: SourceLocation(pos=5395, lineno=125, colno=106) - end_location: SourceLocation(pos=5411, lineno=125, colno=122) + location: SourceLocation(pos=5425, lineno=125, colno=106) + end_location: SourceLocation(pos=5441, lineno=125, colno=122) key: - location: SourceLocation(pos=5395, lineno=125, colno=106) - end_location: SourceLocation(pos=5404, lineno=125, colno=115) + location: SourceLocation(pos=5425, lineno=125, colno=106) + end_location: SourceLocation(pos=5434, lineno=125, colno=115) value: 'rewardExp' value: - location: SourceLocation(pos=5406, lineno=125, colno=117) - end_location: SourceLocation(pos=5411, lineno=125, colno=122) + location: SourceLocation(pos=5436, lineno=125, colno=117) + end_location: SourceLocation(pos=5441, lineno=125, colno=122) value: Byte(0) - location: SourceLocation(pos=5427, lineno=127, colno=1) - end_location: SourceLocation(pos=5441, lineno=127, colno=15) + location: SourceLocation(pos=5457, lineno=127, colno=1) + end_location: SourceLocation(pos=5471, lineno=127, colno=15) identifier: 'teleport:destination' arguments: - location: SourceLocation(pos=5436, lineno=127, colno=10) - end_location: SourceLocation(pos=5441, lineno=127, colno=15) + location: SourceLocation(pos=5466, lineno=127, colno=10) + end_location: SourceLocation(pos=5471, lineno=127, colno=15) value: 'Alice' - location: SourceLocation(pos=5442, lineno=128, colno=1) - end_location: SourceLocation(pos=5456, lineno=128, colno=15) + location: SourceLocation(pos=5472, lineno=128, colno=1) + end_location: SourceLocation(pos=5486, lineno=128, colno=15) identifier: 'teleport:targets:destination' arguments: - location: SourceLocation(pos=5451, lineno=128, colno=10) - end_location: SourceLocation(pos=5453, lineno=128, colno=12) + location: SourceLocation(pos=5481, lineno=128, colno=10) + end_location: SourceLocation(pos=5483, lineno=128, colno=12) variable: 'a' arguments: - location: SourceLocation(pos=5454, lineno=128, colno=13) - end_location: SourceLocation(pos=5456, lineno=128, colno=15) + location: SourceLocation(pos=5484, lineno=128, colno=13) + end_location: SourceLocation(pos=5486, lineno=128, colno=15) variable: 's' arguments: - location: SourceLocation(pos=5457, lineno=129, colno=1) - end_location: SourceLocation(pos=5476, lineno=129, colno=20) + location: SourceLocation(pos=5487, lineno=129, colno=1) + end_location: SourceLocation(pos=5506, lineno=129, colno=20) identifier: 'teleport:location' arguments: - location: SourceLocation(pos=5466, lineno=129, colno=10) - end_location: SourceLocation(pos=5476, lineno=129, colno=20) + location: SourceLocation(pos=5496, lineno=129, colno=10) + end_location: SourceLocation(pos=5506, lineno=129, colno=20) x: - location: SourceLocation(pos=5466, lineno=129, colno=10) - end_location: SourceLocation(pos=5469, lineno=129, colno=13) + location: SourceLocation(pos=5496, lineno=129, colno=10) + end_location: SourceLocation(pos=5499, lineno=129, colno=13) type: 'absolute' value: 100 y: - location: SourceLocation(pos=5470, lineno=129, colno=14) - end_location: SourceLocation(pos=5472, lineno=129, colno=16) + location: SourceLocation(pos=5500, lineno=129, colno=14) + end_location: SourceLocation(pos=5502, lineno=129, colno=16) type: 'relative' value: 3 z: - location: SourceLocation(pos=5473, lineno=129, colno=17) - end_location: SourceLocation(pos=5476, lineno=129, colno=20) + location: SourceLocation(pos=5503, lineno=129, colno=17) + end_location: SourceLocation(pos=5506, lineno=129, colno=20) type: 'absolute' value: 100 - location: SourceLocation(pos=5487, lineno=131, colno=1) - end_location: SourceLocation(pos=5515, lineno=131, colno=29) + location: SourceLocation(pos=5517, lineno=131, colno=1) + end_location: SourceLocation(pos=5545, lineno=131, colno=29) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5495, lineno=131, colno=9) - end_location: SourceLocation(pos=5497, lineno=131, colno=11) + location: SourceLocation(pos=5525, lineno=131, colno=9) + end_location: SourceLocation(pos=5527, lineno=131, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5498, lineno=131, colno=12) - end_location: SourceLocation(pos=5515, lineno=131, colno=29) + location: SourceLocation(pos=5528, lineno=131, colno=12) + end_location: SourceLocation(pos=5545, lineno=131, colno=29) value: 'text to display' - location: SourceLocation(pos=5516, lineno=132, colno=1) - end_location: SourceLocation(pos=5562, lineno=132, colno=47) + location: SourceLocation(pos=5546, lineno=132, colno=1) + end_location: SourceLocation(pos=5592, lineno=132, colno=47) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5524, lineno=132, colno=9) - end_location: SourceLocation(pos=5526, lineno=132, colno=11) + location: SourceLocation(pos=5554, lineno=132, colno=9) + end_location: SourceLocation(pos=5556, lineno=132, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5527, lineno=132, colno=12) - end_location: SourceLocation(pos=5562, lineno=132, colno=47) + location: SourceLocation(pos=5557, lineno=132, colno=12) + end_location: SourceLocation(pos=5592, lineno=132, colno=47) entries: - location: SourceLocation(pos=5528, lineno=132, colno=13) - end_location: SourceLocation(pos=5546, lineno=132, colno=31) + location: SourceLocation(pos=5558, lineno=132, colno=13) + end_location: SourceLocation(pos=5576, lineno=132, colno=31) key: - location: SourceLocation(pos=5528, lineno=132, colno=13) - end_location: SourceLocation(pos=5534, lineno=132, colno=19) + location: SourceLocation(pos=5558, lineno=132, colno=13) + end_location: SourceLocation(pos=5564, lineno=132, colno=19) value: 'text' value: - location: SourceLocation(pos=5535, lineno=132, colno=20) - end_location: SourceLocation(pos=5546, lineno=132, colno=31) + location: SourceLocation(pos=5565, lineno=132, colno=20) + end_location: SourceLocation(pos=5576, lineno=132, colno=31) value: 'I am blue' - location: SourceLocation(pos=5547, lineno=132, colno=32) - end_location: SourceLocation(pos=5561, lineno=132, colno=46) + location: SourceLocation(pos=5577, lineno=132, colno=32) + end_location: SourceLocation(pos=5591, lineno=132, colno=46) key: - location: SourceLocation(pos=5547, lineno=132, colno=32) - end_location: SourceLocation(pos=5554, lineno=132, colno=39) + location: SourceLocation(pos=5577, lineno=132, colno=32) + end_location: SourceLocation(pos=5584, lineno=132, colno=39) value: 'color' value: - location: SourceLocation(pos=5555, lineno=132, colno=40) - end_location: SourceLocation(pos=5561, lineno=132, colno=46) + location: SourceLocation(pos=5585, lineno=132, colno=40) + end_location: SourceLocation(pos=5591, lineno=132, colno=46) value: 'blue' - location: SourceLocation(pos=5563, lineno=133, colno=1) - end_location: SourceLocation(pos=5612, lineno=133, colno=50) + location: SourceLocation(pos=5593, lineno=133, colno=1) + end_location: SourceLocation(pos=5642, lineno=133, colno=50) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5571, lineno=133, colno=9) - end_location: SourceLocation(pos=5573, lineno=133, colno=11) + location: SourceLocation(pos=5601, lineno=133, colno=9) + end_location: SourceLocation(pos=5603, lineno=133, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5574, lineno=133, colno=12) - end_location: SourceLocation(pos=5612, lineno=133, colno=50) + location: SourceLocation(pos=5604, lineno=133, colno=12) + end_location: SourceLocation(pos=5642, lineno=133, colno=50) entries: - location: SourceLocation(pos=5575, lineno=133, colno=13) - end_location: SourceLocation(pos=5593, lineno=133, colno=31) + location: SourceLocation(pos=5605, lineno=133, colno=13) + end_location: SourceLocation(pos=5623, lineno=133, colno=31) key: - location: SourceLocation(pos=5575, lineno=133, colno=13) - end_location: SourceLocation(pos=5581, lineno=133, colno=19) + location: SourceLocation(pos=5605, lineno=133, colno=13) + end_location: SourceLocation(pos=5611, lineno=133, colno=19) value: 'text' value: - location: SourceLocation(pos=5582, lineno=133, colno=20) - end_location: SourceLocation(pos=5593, lineno=133, colno=31) + location: SourceLocation(pos=5612, lineno=133, colno=20) + end_location: SourceLocation(pos=5623, lineno=133, colno=31) value: 'I am blue' - location: SourceLocation(pos=5594, lineno=133, colno=32) - end_location: SourceLocation(pos=5611, lineno=133, colno=49) + location: SourceLocation(pos=5624, lineno=133, colno=32) + end_location: SourceLocation(pos=5641, lineno=133, colno=49) key: - location: SourceLocation(pos=5594, lineno=133, colno=32) - end_location: SourceLocation(pos=5601, lineno=133, colno=39) + location: SourceLocation(pos=5624, lineno=133, colno=32) + end_location: SourceLocation(pos=5631, lineno=133, colno=39) value: 'color' value: - location: SourceLocation(pos=5602, lineno=133, colno=40) - end_location: SourceLocation(pos=5611, lineno=133, colno=49) + location: SourceLocation(pos=5632, lineno=133, colno=40) + end_location: SourceLocation(pos=5641, lineno=133, colno=49) value: '#5555ff' - location: SourceLocation(pos=5613, lineno=134, colno=1) - end_location: SourceLocation(pos=5694, lineno=134, colno=82) + location: SourceLocation(pos=5643, lineno=134, colno=1) + end_location: SourceLocation(pos=5724, lineno=134, colno=82) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5621, lineno=134, colno=9) - end_location: SourceLocation(pos=5623, lineno=134, colno=11) + location: SourceLocation(pos=5651, lineno=134, colno=9) + end_location: SourceLocation(pos=5653, lineno=134, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5624, lineno=134, colno=12) - end_location: SourceLocation(pos=5694, lineno=134, colno=82) + location: SourceLocation(pos=5654, lineno=134, colno=12) + end_location: SourceLocation(pos=5724, lineno=134, colno=82) entries: - location: SourceLocation(pos=5625, lineno=134, colno=13) - end_location: SourceLocation(pos=5643, lineno=134, colno=31) + location: SourceLocation(pos=5655, lineno=134, colno=13) + end_location: SourceLocation(pos=5673, lineno=134, colno=31) key: - location: SourceLocation(pos=5625, lineno=134, colno=13) - end_location: SourceLocation(pos=5631, lineno=134, colno=19) + location: SourceLocation(pos=5655, lineno=134, colno=13) + end_location: SourceLocation(pos=5661, lineno=134, colno=19) value: 'text' value: - location: SourceLocation(pos=5632, lineno=134, colno=20) - end_location: SourceLocation(pos=5643, lineno=134, colno=31) + location: SourceLocation(pos=5662, lineno=134, colno=20) + end_location: SourceLocation(pos=5673, lineno=134, colno=31) value: 'Hover me!' - location: SourceLocation(pos=5644, lineno=134, colno=32) - end_location: SourceLocation(pos=5693, lineno=134, colno=81) + location: SourceLocation(pos=5674, lineno=134, colno=32) + end_location: SourceLocation(pos=5723, lineno=134, colno=81) key: - location: SourceLocation(pos=5644, lineno=134, colno=32) - end_location: SourceLocation(pos=5656, lineno=134, colno=44) + location: SourceLocation(pos=5674, lineno=134, colno=32) + end_location: SourceLocation(pos=5686, lineno=134, colno=44) value: 'hoverEvent' value: - location: SourceLocation(pos=5657, lineno=134, colno=45) - end_location: SourceLocation(pos=5693, lineno=134, colno=81) + location: SourceLocation(pos=5687, lineno=134, colno=45) + end_location: SourceLocation(pos=5723, lineno=134, colno=81) entries: - location: SourceLocation(pos=5658, lineno=134, colno=46) - end_location: SourceLocation(pos=5678, lineno=134, colno=66) + location: SourceLocation(pos=5688, lineno=134, colno=46) + end_location: SourceLocation(pos=5708, lineno=134, colno=66) key: - location: SourceLocation(pos=5658, lineno=134, colno=46) - end_location: SourceLocation(pos=5666, lineno=134, colno=54) + location: SourceLocation(pos=5688, lineno=134, colno=46) + end_location: SourceLocation(pos=5696, lineno=134, colno=54) value: 'action' value: - location: SourceLocation(pos=5667, lineno=134, colno=55) - end_location: SourceLocation(pos=5678, lineno=134, colno=66) + location: SourceLocation(pos=5697, lineno=134, colno=55) + end_location: SourceLocation(pos=5708, lineno=134, colno=66) value: 'show_text' - location: SourceLocation(pos=5679, lineno=134, colno=67) - end_location: SourceLocation(pos=5692, lineno=134, colno=80) + location: SourceLocation(pos=5709, lineno=134, colno=67) + end_location: SourceLocation(pos=5722, lineno=134, colno=80) key: - location: SourceLocation(pos=5679, lineno=134, colno=67) - end_location: SourceLocation(pos=5686, lineno=134, colno=74) + location: SourceLocation(pos=5709, lineno=134, colno=67) + end_location: SourceLocation(pos=5716, lineno=134, colno=74) value: 'value' value: - location: SourceLocation(pos=5687, lineno=134, colno=75) - end_location: SourceLocation(pos=5692, lineno=134, colno=80) + location: SourceLocation(pos=5717, lineno=134, colno=75) + end_location: SourceLocation(pos=5722, lineno=134, colno=80) value: 'Hi!' - location: SourceLocation(pos=5695, lineno=135, colno=1) - end_location: SourceLocation(pos=5720, lineno=135, colno=26) + location: SourceLocation(pos=5725, lineno=135, colno=1) + end_location: SourceLocation(pos=5750, lineno=135, colno=26) identifier: 'tellraw:targets:message' arguments: - location: SourceLocation(pos=5703, lineno=135, colno=9) - end_location: SourceLocation(pos=5705, lineno=135, colno=11) + location: SourceLocation(pos=5733, lineno=135, colno=9) + end_location: SourceLocation(pos=5735, lineno=135, colno=11) variable: 'a' arguments: - location: SourceLocation(pos=5706, lineno=135, colno=12) - end_location: SourceLocation(pos=5720, lineno=135, colno=26) + location: SourceLocation(pos=5736, lineno=135, colno=12) + end_location: SourceLocation(pos=5750, lineno=135, colno=26) value: 'Text1\nText2' - location: SourceLocation(pos=5728, lineno=137, colno=1) - end_location: SourceLocation(pos=5742, lineno=137, colno=15) + location: SourceLocation(pos=5758, lineno=137, colno=1) + end_location: SourceLocation(pos=5772, lineno=137, colno=15) identifier: 'time:set:time' arguments: - location: SourceLocation(pos=5737, lineno=137, colno=10) - end_location: SourceLocation(pos=5742, lineno=137, colno=15) + location: SourceLocation(pos=5767, lineno=137, colno=10) + end_location: SourceLocation(pos=5772, lineno=137, colno=15) value: 1000 unit: 'tick' - location: SourceLocation(pos=5743, lineno=138, colno=1) - end_location: SourceLocation(pos=5755, lineno=138, colno=13) + location: SourceLocation(pos=5773, lineno=138, colno=1) + end_location: SourceLocation(pos=5785, lineno=138, colno=13) identifier: 'time:set:day' arguments: - location: SourceLocation(pos=5756, lineno=139, colno=1) - end_location: SourceLocation(pos=5771, lineno=139, colno=16) + location: SourceLocation(pos=5786, lineno=139, colno=1) + end_location: SourceLocation(pos=5801, lineno=139, colno=16) identifier: 'time:add:time' arguments: - location: SourceLocation(pos=5765, lineno=139, colno=10) - end_location: SourceLocation(pos=5771, lineno=139, colno=16) + location: SourceLocation(pos=5795, lineno=139, colno=10) + end_location: SourceLocation(pos=5801, lineno=139, colno=16) value: 24000 unit: 'tick' - location: SourceLocation(pos=5780, lineno=141, colno=1) - end_location: SourceLocation(pos=5857, lineno=141, colno=78) + location: SourceLocation(pos=5810, lineno=141, colno=1) + end_location: SourceLocation(pos=5887, lineno=141, colno=78) identifier: 'title:targets:subtitle:title' arguments: - location: SourceLocation(pos=5786, lineno=141, colno=7) - end_location: SourceLocation(pos=5788, lineno=141, colno=9) + location: SourceLocation(pos=5816, lineno=141, colno=7) + end_location: SourceLocation(pos=5818, lineno=141, colno=9) variable: 'a' arguments: - location: SourceLocation(pos=5798, lineno=141, colno=19) - end_location: SourceLocation(pos=5857, lineno=141, colno=78) + location: SourceLocation(pos=5828, lineno=141, colno=19) + end_location: SourceLocation(pos=5887, lineno=141, colno=78) entries: - location: SourceLocation(pos=5799, lineno=141, colno=20) - end_location: SourceLocation(pos=5827, lineno=141, colno=48) + location: SourceLocation(pos=5829, lineno=141, colno=20) + end_location: SourceLocation(pos=5857, lineno=141, colno=48) key: - location: SourceLocation(pos=5799, lineno=141, colno=20) - end_location: SourceLocation(pos=5805, lineno=141, colno=26) + location: SourceLocation(pos=5829, lineno=141, colno=20) + end_location: SourceLocation(pos=5835, lineno=141, colno=26) value: 'text' value: - location: SourceLocation(pos=5806, lineno=141, colno=27) - end_location: SourceLocation(pos=5827, lineno=141, colno=48) + location: SourceLocation(pos=5836, lineno=141, colno=27) + end_location: SourceLocation(pos=5857, lineno=141, colno=48) value: 'The story begins...' - location: SourceLocation(pos=5828, lineno=141, colno=49) - end_location: SourceLocation(pos=5842, lineno=141, colno=63) + location: SourceLocation(pos=5858, lineno=141, colno=49) + end_location: SourceLocation(pos=5872, lineno=141, colno=63) key: - location: SourceLocation(pos=5828, lineno=141, colno=49) - end_location: SourceLocation(pos=5835, lineno=141, colno=56) + location: SourceLocation(pos=5858, lineno=141, colno=49) + end_location: SourceLocation(pos=5865, lineno=141, colno=56) value: 'color' value: - location: SourceLocation(pos=5836, lineno=141, colno=57) - end_location: SourceLocation(pos=5842, lineno=141, colno=63) + location: SourceLocation(pos=5866, lineno=141, colno=57) + end_location: SourceLocation(pos=5872, lineno=141, colno=63) value: 'gray' - location: SourceLocation(pos=5843, lineno=141, colno=64) - end_location: SourceLocation(pos=5856, lineno=141, colno=77) + location: SourceLocation(pos=5873, lineno=141, colno=64) + end_location: SourceLocation(pos=5886, lineno=141, colno=77) key: - location: SourceLocation(pos=5843, lineno=141, colno=64) - end_location: SourceLocation(pos=5851, lineno=141, colno=72) + location: SourceLocation(pos=5873, lineno=141, colno=64) + end_location: SourceLocation(pos=5881, lineno=141, colno=72) value: 'italic' value: - location: SourceLocation(pos=5852, lineno=141, colno=73) - end_location: SourceLocation(pos=5856, lineno=141, colno=77) + location: SourceLocation(pos=5882, lineno=141, colno=73) + end_location: SourceLocation(pos=5886, lineno=141, colno=77) value: True - location: SourceLocation(pos=5858, lineno=142, colno=1) - end_location: SourceLocation(pos=5905, lineno=142, colno=48) + location: SourceLocation(pos=5888, lineno=142, colno=1) + end_location: SourceLocation(pos=5935, lineno=142, colno=48) identifier: 'title:targets:title:title' arguments: - location: SourceLocation(pos=5864, lineno=142, colno=7) - end_location: SourceLocation(pos=5866, lineno=142, colno=9) + location: SourceLocation(pos=5894, lineno=142, colno=7) + end_location: SourceLocation(pos=5896, lineno=142, colno=9) variable: 'a' arguments: - location: SourceLocation(pos=5873, lineno=142, colno=16) - end_location: SourceLocation(pos=5905, lineno=142, colno=48) + location: SourceLocation(pos=5903, lineno=142, colno=16) + end_location: SourceLocation(pos=5935, lineno=142, colno=48) entries: - location: SourceLocation(pos=5874, lineno=142, colno=17) - end_location: SourceLocation(pos=5892, lineno=142, colno=35) + location: SourceLocation(pos=5904, lineno=142, colno=17) + end_location: SourceLocation(pos=5922, lineno=142, colno=35) key: - location: SourceLocation(pos=5874, lineno=142, colno=17) - end_location: SourceLocation(pos=5880, lineno=142, colno=23) + location: SourceLocation(pos=5904, lineno=142, colno=17) + end_location: SourceLocation(pos=5910, lineno=142, colno=23) value: 'text' value: - location: SourceLocation(pos=5881, lineno=142, colno=24) - end_location: SourceLocation(pos=5892, lineno=142, colno=35) + location: SourceLocation(pos=5911, lineno=142, colno=24) + end_location: SourceLocation(pos=5922, lineno=142, colno=35) value: 'Chapter I' - location: SourceLocation(pos=5893, lineno=142, colno=36) - end_location: SourceLocation(pos=5904, lineno=142, colno=47) + location: SourceLocation(pos=5923, lineno=142, colno=36) + end_location: SourceLocation(pos=5934, lineno=142, colno=47) key: - location: SourceLocation(pos=5893, lineno=142, colno=36) - end_location: SourceLocation(pos=5899, lineno=142, colno=42) + location: SourceLocation(pos=5923, lineno=142, colno=36) + end_location: SourceLocation(pos=5929, lineno=142, colno=42) value: 'bold' value: - location: SourceLocation(pos=5900, lineno=142, colno=43) - end_location: SourceLocation(pos=5904, lineno=142, colno=47) + location: SourceLocation(pos=5930, lineno=142, colno=43) + end_location: SourceLocation(pos=5934, lineno=142, colno=47) value: True - location: SourceLocation(pos=5916, lineno=144, colno=1) - end_location: SourceLocation(pos=5934, lineno=144, colno=19) + location: SourceLocation(pos=5946, lineno=144, colno=1) + end_location: SourceLocation(pos=5964, lineno=144, colno=19) identifier: 'weather:clear:duration' arguments: - location: SourceLocation(pos=5930, lineno=144, colno=15) - end_location: SourceLocation(pos=5934, lineno=144, colno=19) + location: SourceLocation(pos=5960, lineno=144, colno=15) + end_location: SourceLocation(pos=5964, lineno=144, colno=19) value: 1200 - location: SourceLocation(pos=5935, lineno=145, colno=1) - end_location: SourceLocation(pos=5947, lineno=145, colno=13) + location: SourceLocation(pos=5965, lineno=145, colno=1) + end_location: SourceLocation(pos=5977, lineno=145, colno=13) identifier: 'weather:rain' arguments: - location: SourceLocation(pos=5956, lineno=147, colno=1) - end_location: SourceLocation(pos=6034, lineno=147, colno=79) + location: SourceLocation(pos=5986, lineno=147, colno=1) + end_location: SourceLocation(pos=6064, lineno=147, colno=79) identifier: 'scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective' arguments: - location: SourceLocation(pos=5985, lineno=147, colno=30) - end_location: SourceLocation(pos=6003, lineno=147, colno=48) + location: SourceLocation(pos=6015, lineno=147, colno=30) + end_location: SourceLocation(pos=6033, lineno=147, colno=48) value: '#sie_1_flags_delta' - location: SourceLocation(pos=6004, lineno=147, colno=49) - end_location: SourceLocation(pos=6011, lineno=147, colno=56) + location: SourceLocation(pos=6034, lineno=147, colno=49) + end_location: SourceLocation(pos=6041, lineno=147, colno=56) value: 'integer' - location: SourceLocation(pos=6012, lineno=147, colno=57) - end_location: SourceLocation(pos=6013, lineno=147, colno=58) + location: SourceLocation(pos=6042, lineno=147, colno=57) + end_location: SourceLocation(pos=6043, lineno=147, colno=58) value: '=' - location: SourceLocation(pos=6014, lineno=147, colno=59) - end_location: SourceLocation(pos=6026, lineno=147, colno=71) + location: SourceLocation(pos=6044, lineno=147, colno=59) + end_location: SourceLocation(pos=6056, lineno=147, colno=71) value: '#sie_1_flags' - location: SourceLocation(pos=6027, lineno=147, colno=72) - end_location: SourceLocation(pos=6034, lineno=147, colno=79) + location: SourceLocation(pos=6057, lineno=147, colno=72) + end_location: SourceLocation(pos=6064, lineno=147, colno=79) value: 'integer' - location: SourceLocation(pos=6035, lineno=148, colno=1) - end_location: SourceLocation(pos=6066, lineno=148, colno=32) + location: SourceLocation(pos=6065, lineno=148, colno=1) + end_location: SourceLocation(pos=6096, lineno=148, colno=32) identifier: 'scoreboard:players:set:targets:objective:score' arguments: - location: SourceLocation(pos=6058, lineno=148, colno=24) - end_location: SourceLocation(pos=6059, lineno=148, colno=25) + location: SourceLocation(pos=6088, lineno=148, colno=24) + end_location: SourceLocation(pos=6089, lineno=148, colno=25) value: '✔' - location: SourceLocation(pos=6060, lineno=148, colno=26) - end_location: SourceLocation(pos=6063, lineno=148, colno=29) + location: SourceLocation(pos=6090, lineno=148, colno=26) + end_location: SourceLocation(pos=6093, lineno=148, colno=29) value: 'foo' - location: SourceLocation(pos=6064, lineno=148, colno=30) - end_location: SourceLocation(pos=6066, lineno=148, colno=32) + location: SourceLocation(pos=6094, lineno=148, colno=30) + end_location: SourceLocation(pos=6096, lineno=148, colno=32) value: 42 - location: SourceLocation(pos=6067, lineno=149, colno=1) - end_location: SourceLocation(pos=6185, lineno=149, colno=119) + location: SourceLocation(pos=6097, lineno=149, colno=1) + end_location: SourceLocation(pos=6213, lineno=149, colno=117) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=6075, lineno=149, colno=9) - end_location: SourceLocation(pos=6185, lineno=149, colno=119) + location: SourceLocation(pos=6105, lineno=149, colno=9) + end_location: SourceLocation(pos=6213, lineno=149, colno=117) identifier: 'execute:at:targets:subcommand' arguments: - location: SourceLocation(pos=6078, lineno=149, colno=12) - end_location: SourceLocation(pos=6127, lineno=149, colno=61) + location: SourceLocation(pos=6108, lineno=149, colno=12) + end_location: SourceLocation(pos=6155, lineno=149, colno=59) variable: 'e' arguments: - location: SourceLocation(pos=6081, lineno=149, colno=15) - end_location: SourceLocation(pos=6097, lineno=149, colno=31) + location: SourceLocation(pos=6111, lineno=149, colno=15) + end_location: SourceLocation(pos=6127, lineno=149, colno=31) inverted: False key: - location: SourceLocation(pos=6081, lineno=149, colno=15) - end_location: SourceLocation(pos=6085, lineno=149, colno=19) + location: SourceLocation(pos=6111, lineno=149, colno=15) + end_location: SourceLocation(pos=6115, lineno=149, colno=19) value: 'type' value: - location: SourceLocation(pos=6086, lineno=149, colno=20) - end_location: SourceLocation(pos=6097, lineno=149, colno=31) + location: SourceLocation(pos=6116, lineno=149, colno=20) + end_location: SourceLocation(pos=6127, lineno=149, colno=31) is_tag: False namespace: None path: 'armor_stand' - location: SourceLocation(pos=6099, lineno=149, colno=33) - end_location: SourceLocation(pos=6109, lineno=149, colno=43) + location: SourceLocation(pos=6128, lineno=149, colno=32) + end_location: SourceLocation(pos=6138, lineno=149, colno=42) inverted: False key: - location: SourceLocation(pos=6099, lineno=149, colno=33) - end_location: SourceLocation(pos=6103, lineno=149, colno=37) + location: SourceLocation(pos=6128, lineno=149, colno=32) + end_location: SourceLocation(pos=6132, lineno=149, colno=36) value: 'name' value: - location: SourceLocation(pos=6104, lineno=149, colno=38) - end_location: SourceLocation(pos=6109, lineno=149, colno=43) + location: SourceLocation(pos=6133, lineno=149, colno=37) + end_location: SourceLocation(pos=6138, lineno=149, colno=42) value: 'ctf' - location: SourceLocation(pos=6111, lineno=149, colno=45) - end_location: SourceLocation(pos=6126, lineno=149, colno=60) + location: SourceLocation(pos=6139, lineno=149, colno=43) + end_location: SourceLocation(pos=6154, lineno=149, colno=58) inverted: True key: - location: SourceLocation(pos=6111, lineno=149, colno=45) - end_location: SourceLocation(pos=6114, lineno=149, colno=48) + location: SourceLocation(pos=6139, lineno=149, colno=43) + end_location: SourceLocation(pos=6142, lineno=149, colno=46) value: 'tag' value: - location: SourceLocation(pos=6116, lineno=149, colno=50) - end_location: SourceLocation(pos=6126, lineno=149, colno=60) + location: SourceLocation(pos=6144, lineno=149, colno=48) + end_location: SourceLocation(pos=6154, lineno=149, colno=58) value: 'FlagBearer' - location: SourceLocation(pos=6128, lineno=149, colno=62) - end_location: SourceLocation(pos=6185, lineno=149, colno=119) + location: SourceLocation(pos=6156, lineno=149, colno=60) + end_location: SourceLocation(pos=6213, lineno=149, colno=117) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=6132, lineno=149, colno=66) - end_location: SourceLocation(pos=6185, lineno=149, colno=119) + location: SourceLocation(pos=6160, lineno=149, colno=64) + end_location: SourceLocation(pos=6213, lineno=149, colno=117) identifier: 'particle:name:pos:delta:speed:count:force' arguments: - location: SourceLocation(pos=6141, lineno=149, colno=75) - end_location: SourceLocation(pos=6161, lineno=149, colno=95) + location: SourceLocation(pos=6169, lineno=149, colno=73) + end_location: SourceLocation(pos=6189, lineno=149, colno=93) name: - location: SourceLocation(pos=6141, lineno=149, colno=75) - end_location: SourceLocation(pos=6153, lineno=149, colno=87) + location: SourceLocation(pos=6169, lineno=149, colno=73) + end_location: SourceLocation(pos=6181, lineno=149, colno=85) is_tag: False namespace: None path: 'block_marker' parameters: - location: SourceLocation(pos=6154, lineno=149, colno=88) - end_location: SourceLocation(pos=6161, lineno=149, colno=95) + location: SourceLocation(pos=6182, lineno=149, colno=86) + end_location: SourceLocation(pos=6189, lineno=149, colno=93) block: - location: SourceLocation(pos=6154, lineno=149, colno=88) - end_location: SourceLocation(pos=6161, lineno=149, colno=95) + location: SourceLocation(pos=6182, lineno=149, colno=86) + end_location: SourceLocation(pos=6189, lineno=149, colno=93) identifier: - location: SourceLocation(pos=6154, lineno=149, colno=88) - end_location: SourceLocation(pos=6161, lineno=149, colno=95) + location: SourceLocation(pos=6182, lineno=149, colno=86) + end_location: SourceLocation(pos=6189, lineno=149, colno=93) is_tag: False namespace: None path: 'barrier' @@ -5453,149 +5453,149 @@ data_tags: None - location: SourceLocation(pos=6162, lineno=149, colno=96) - end_location: SourceLocation(pos=6169, lineno=149, colno=103) + location: SourceLocation(pos=6190, lineno=149, colno=94) + end_location: SourceLocation(pos=6197, lineno=149, colno=101) x: - location: SourceLocation(pos=6162, lineno=149, colno=96) - end_location: SourceLocation(pos=6163, lineno=149, colno=97) + location: SourceLocation(pos=6190, lineno=149, colno=94) + end_location: SourceLocation(pos=6191, lineno=149, colno=95) type: 'relative' value: 0 y: - location: SourceLocation(pos=6164, lineno=149, colno=98) - end_location: SourceLocation(pos=6167, lineno=149, colno=101) + location: SourceLocation(pos=6192, lineno=149, colno=96) + end_location: SourceLocation(pos=6195, lineno=149, colno=99) type: 'relative' value: 0.8 z: - location: SourceLocation(pos=6168, lineno=149, colno=102) - end_location: SourceLocation(pos=6169, lineno=149, colno=103) + location: SourceLocation(pos=6196, lineno=149, colno=100) + end_location: SourceLocation(pos=6197, lineno=149, colno=101) type: 'relative' value: 0 - location: SourceLocation(pos=6170, lineno=149, colno=104) - end_location: SourceLocation(pos=6175, lineno=149, colno=109) + location: SourceLocation(pos=6198, lineno=149, colno=102) + end_location: SourceLocation(pos=6203, lineno=149, colno=107) x: - location: SourceLocation(pos=6170, lineno=149, colno=104) - end_location: SourceLocation(pos=6171, lineno=149, colno=105) + location: SourceLocation(pos=6198, lineno=149, colno=102) + end_location: SourceLocation(pos=6199, lineno=149, colno=103) type: 'absolute' value: 0 y: - location: SourceLocation(pos=6172, lineno=149, colno=106) - end_location: SourceLocation(pos=6173, lineno=149, colno=107) + location: SourceLocation(pos=6200, lineno=149, colno=104) + end_location: SourceLocation(pos=6201, lineno=149, colno=105) type: 'absolute' value: 0 z: - location: SourceLocation(pos=6174, lineno=149, colno=108) - end_location: SourceLocation(pos=6175, lineno=149, colno=109) + location: SourceLocation(pos=6202, lineno=149, colno=106) + end_location: SourceLocation(pos=6203, lineno=149, colno=107) type: 'absolute' value: 0 - location: SourceLocation(pos=6176, lineno=149, colno=110) - end_location: SourceLocation(pos=6177, lineno=149, colno=111) + location: SourceLocation(pos=6204, lineno=149, colno=108) + end_location: SourceLocation(pos=6205, lineno=149, colno=109) value: 0 - location: SourceLocation(pos=6178, lineno=149, colno=112) - end_location: SourceLocation(pos=6179, lineno=149, colno=113) + location: SourceLocation(pos=6206, lineno=149, colno=110) + end_location: SourceLocation(pos=6207, lineno=149, colno=111) value: 1 - location: SourceLocation(pos=6186, lineno=150, colno=1) - end_location: SourceLocation(pos=6264, lineno=150, colno=79) + location: SourceLocation(pos=6214, lineno=150, colno=1) + end_location: SourceLocation(pos=6292, lineno=150, colno=79) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=6194, lineno=150, colno=9) - end_location: SourceLocation(pos=6264, lineno=150, colno=79) + location: SourceLocation(pos=6222, lineno=150, colno=9) + end_location: SourceLocation(pos=6292, lineno=150, colno=79) identifier: 'execute:store:result:score:targets:objective:subcommand' arguments: - location: SourceLocation(pos=6213, lineno=150, colno=28) - end_location: SourceLocation(pos=6215, lineno=150, colno=30) + location: SourceLocation(pos=6241, lineno=150, colno=28) + end_location: SourceLocation(pos=6243, lineno=150, colno=30) variable: 's' arguments: - location: SourceLocation(pos=6216, lineno=150, colno=31) - end_location: SourceLocation(pos=6228, lineno=150, colno=43) + location: SourceLocation(pos=6244, lineno=150, colno=31) + end_location: SourceLocation(pos=6256, lineno=150, colno=43) value: 'smithed.data' - location: SourceLocation(pos=6229, lineno=150, colno=44) - end_location: SourceLocation(pos=6264, lineno=150, colno=79) + location: SourceLocation(pos=6257, lineno=150, colno=44) + end_location: SourceLocation(pos=6292, lineno=150, colno=79) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=6233, lineno=150, colno=48) - end_location: SourceLocation(pos=6264, lineno=150, colno=79) + location: SourceLocation(pos=6261, lineno=150, colno=48) + end_location: SourceLocation(pos=6292, lineno=150, colno=79) identifier: 'clear:targets:item:maxCount' arguments: - location: SourceLocation(pos=6239, lineno=150, colno=54) - end_location: SourceLocation(pos=6241, lineno=150, colno=56) + location: SourceLocation(pos=6267, lineno=150, colno=54) + end_location: SourceLocation(pos=6269, lineno=150, colno=56) variable: 's' arguments: - location: SourceLocation(pos=6242, lineno=150, colno=57) - end_location: SourceLocation(pos=6262, lineno=150, colno=77) + location: SourceLocation(pos=6270, lineno=150, colno=57) + end_location: SourceLocation(pos=6290, lineno=150, colno=77) identifier: - location: SourceLocation(pos=6242, lineno=150, colno=57) - end_location: SourceLocation(pos=6262, lineno=150, colno=77) + location: SourceLocation(pos=6270, lineno=150, colno=57) + end_location: SourceLocation(pos=6290, lineno=150, colno=77) is_tag: True namespace: 'smithed' path: 'crafter/all' data_tags: None - location: SourceLocation(pos=6263, lineno=150, colno=78) - end_location: SourceLocation(pos=6264, lineno=150, colno=79) + location: SourceLocation(pos=6291, lineno=150, colno=78) + end_location: SourceLocation(pos=6292, lineno=150, colno=79) value: 0 - location: SourceLocation(pos=6265, lineno=151, colno=1) - end_location: SourceLocation(pos=6330, lineno=151, colno=66) + location: SourceLocation(pos=6293, lineno=151, colno=1) + end_location: SourceLocation(pos=6358, lineno=151, colno=66) identifier: 'execute:subcommand' arguments: - location: SourceLocation(pos=6273, lineno=151, colno=9) - end_location: SourceLocation(pos=6330, lineno=151, colno=66) + location: SourceLocation(pos=6301, lineno=151, colno=9) + end_location: SourceLocation(pos=6358, lineno=151, colno=66) identifier: 'execute:if:entity:entities:subcommand' arguments: - location: SourceLocation(pos=6283, lineno=151, colno=19) - end_location: SourceLocation(pos=6308, lineno=151, colno=44) + location: SourceLocation(pos=6311, lineno=151, colno=19) + end_location: SourceLocation(pos=6336, lineno=151, colno=44) variable: 's' arguments: - location: SourceLocation(pos=6286, lineno=151, colno=22) - end_location: SourceLocation(pos=6307, lineno=151, colno=43) + location: SourceLocation(pos=6314, lineno=151, colno=22) + end_location: SourceLocation(pos=6335, lineno=151, colno=43) inverted: False key: - location: SourceLocation(pos=6286, lineno=151, colno=22) - end_location: SourceLocation(pos=6294, lineno=151, colno=30) + location: SourceLocation(pos=6314, lineno=151, colno=22) + end_location: SourceLocation(pos=6322, lineno=151, colno=30) value: 'distance' value: - location: SourceLocation(pos=6295, lineno=151, colno=31) - end_location: SourceLocation(pos=6307, lineno=151, colno=43) + location: SourceLocation(pos=6323, lineno=151, colno=31) + end_location: SourceLocation(pos=6335, lineno=151, colno=43) min: None max: 1e-08 - location: SourceLocation(pos=6309, lineno=151, colno=45) - end_location: SourceLocation(pos=6330, lineno=151, colno=66) + location: SourceLocation(pos=6337, lineno=151, colno=45) + end_location: SourceLocation(pos=6358, lineno=151, colno=66) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=6313, lineno=151, colno=49) - end_location: SourceLocation(pos=6330, lineno=151, colno=66) + location: SourceLocation(pos=6341, lineno=151, colno=49) + end_location: SourceLocation(pos=6358, lineno=151, colno=66) identifier: 'function:name' arguments: - location: SourceLocation(pos=6322, lineno=151, colno=58) - end_location: SourceLocation(pos=6330, lineno=151, colno=66) + location: SourceLocation(pos=6350, lineno=151, colno=58) + end_location: SourceLocation(pos=6358, lineno=151, colno=66) is_tag: False namespace: 'demo' path: 'foo' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index c180600ba..25fb84518 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -32,11 +32,11 @@ execute facing ^1 ^ ^ run tp ~ ~ ~ execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 execute as @e at @s facing 0 64 0 run tp @s ^ ^ ^1 ~ ~ execute as @e[type=!player] at @s facing entity @p feet run tp @s ^ ^ ^1 -execute in the_end run locate endcity +execute in the_end run locate structure endcity execute in minecraft:the_nether positioned as @s run tp ~ ~ ~ execute in minecraft:the_nether run tp ~ ~ ~ execute in minecraft:the_nether run tp ~ ~ ~5 -execute positioned 0 64 0 run locate village +execute positioned 0 64 0 run locate structure village execute as @e[type=sheep] at @s rotated as @p run tp @s ^ ^ ^1 execute as @e[type=sheep] positioned as @s rotated as @p run tp @s ^ ^ ^1 execute as @a at @s if block ~ ~-1 ~ #wool run kill @s @@ -84,7 +84,7 @@ kill @e[distance=..10] kill @e[type=!player] kill @e[distance=..10, type=creeper] kill @e[type=arrow, nbt={inBlockState: {Name: "minecraft:target"}}] -locate mansion +locate structure mansion msg @a Hi particle dust 1.0 0.5 0.5 1.0 particle dust_color_transition 1.0 0.0 0.0 1.0 0.0 0.0 1.0 diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json index 38ebc00a4..393bf34b8 100644 --- a/packages/mecha/tests/snapshots/spec__prototypes__0.json +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -1,321 +1,218 @@ [ + "advancement:grant:targets:everything", + "advancement:grant:targets:from:advancement", "advancement:grant:targets:only:advancement", "advancement:grant:targets:only:advancement:criterion", - "advancement:grant:targets:from:advancement", - "advancement:grant:targets:until:advancement", "advancement:grant:targets:through:advancement", - "advancement:grant:targets:everything", + "advancement:grant:targets:until:advancement", + "advancement:revoke:targets:everything", + "advancement:revoke:targets:from:advancement", "advancement:revoke:targets:only:advancement", "advancement:revoke:targets:only:advancement:criterion", - "advancement:revoke:targets:from:advancement", - "advancement:revoke:targets:until:advancement", "advancement:revoke:targets:through:advancement", - "advancement:revoke:targets:everything", - "attribute:target:attribute:get", - "attribute:target:attribute:get:scale", - "attribute:target:attribute:base:set:value", + "advancement:revoke:targets:until:advancement", "attribute:target:attribute:base:get", "attribute:target:attribute:base:get:scale", + "attribute:target:attribute:base:set:value", + "attribute:target:attribute:get", + "attribute:target:attribute:get:scale", "attribute:target:attribute:modifier:add:uuid:name:value:add", "attribute:target:attribute:modifier:add:uuid:name:value:multiply", "attribute:target:attribute:modifier:add:uuid:name:value:multiply_base", "attribute:target:attribute:modifier:remove:uuid", "attribute:target:attribute:modifier:value:get:uuid", "attribute:target:attribute:modifier:value:get:uuid:scale", - "execute:subcommand", - "execute:run:subcommand", - "execute:if:block:pos:block", - "execute:if:block:pos:block:subcommand", - "execute:if:score:target:targetObjective:=:source:sourceObjective", - "execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand", - "execute:if:score:target:targetObjective:<:source:sourceObjective", - "execute:if:score:target:targetObjective:<:source:sourceObjective:subcommand", - "execute:if:score:target:targetObjective:<=:source:sourceObjective", - "execute:if:score:target:targetObjective:<=:source:sourceObjective:subcommand", - "execute:if:score:target:targetObjective:>:source:sourceObjective", - "execute:if:score:target:targetObjective:>:source:sourceObjective:subcommand", - "execute:if:score:target:targetObjective:>=:source:sourceObjective", - "execute:if:score:target:targetObjective:>=:source:sourceObjective:subcommand", - "execute:if:score:target:targetObjective:matches:range", - "execute:if:score:target:targetObjective:matches:range:subcommand", - "execute:if:blocks:start:end:destination:all", - "execute:if:blocks:start:end:destination:all:subcommand", - "execute:if:blocks:start:end:destination:masked", - "execute:if:blocks:start:end:destination:masked:subcommand", - "execute:if:entity:entities", - "execute:if:entity:entities:subcommand", - "execute:if:predicate:predicate", - "execute:if:predicate:predicate:subcommand", - "execute:if:data:entity:source:path", - "execute:if:data:entity:source:path:subcommand", - "execute:if:data:block:sourcePos:path", - "execute:if:data:block:sourcePos:path:subcommand", - "execute:if:data:storage:source:path", - "execute:if:data:storage:source:path:subcommand", - "execute:unless:block:pos:block", - "execute:unless:block:pos:block:subcommand", - "execute:unless:score:target:targetObjective:=:source:sourceObjective", - "execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand", - "execute:unless:score:target:targetObjective:<:source:sourceObjective", - "execute:unless:score:target:targetObjective:<:source:sourceObjective:subcommand", - "execute:unless:score:target:targetObjective:<=:source:sourceObjective", - "execute:unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", - "execute:unless:score:target:targetObjective:>:source:sourceObjective", - "execute:unless:score:target:targetObjective:>:source:sourceObjective:subcommand", - "execute:unless:score:target:targetObjective:>=:source:sourceObjective", - "execute:unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", - "execute:unless:score:target:targetObjective:matches:range", - "execute:unless:score:target:targetObjective:matches:range:subcommand", - "execute:unless:blocks:start:end:destination:all", - "execute:unless:blocks:start:end:destination:all:subcommand", - "execute:unless:blocks:start:end:destination:masked", - "execute:unless:blocks:start:end:destination:masked:subcommand", - "execute:unless:entity:entities", - "execute:unless:entity:entities:subcommand", - "execute:unless:predicate:predicate", - "execute:unless:predicate:predicate:subcommand", - "execute:unless:data:entity:source:path", - "execute:unless:data:entity:source:path:subcommand", - "execute:unless:data:block:sourcePos:path", - "execute:unless:data:block:sourcePos:path:subcommand", - "execute:unless:data:storage:source:path", - "execute:unless:data:storage:source:path:subcommand", - "execute:as:targets:subcommand", - "execute:at:targets:subcommand", - "execute:store:result:score:targets:objective:subcommand", - "execute:store:result:bossbar:id:value:subcommand", - "execute:store:result:bossbar:id:max:subcommand", - "execute:store:result:entity:target:path:int:scale:subcommand", - "execute:store:result:entity:target:path:float:scale:subcommand", - "execute:store:result:entity:target:path:short:scale:subcommand", - "execute:store:result:entity:target:path:long:scale:subcommand", - "execute:store:result:entity:target:path:double:scale:subcommand", - "execute:store:result:entity:target:path:byte:scale:subcommand", - "execute:store:result:block:targetPos:path:int:scale:subcommand", - "execute:store:result:block:targetPos:path:float:scale:subcommand", - "execute:store:result:block:targetPos:path:short:scale:subcommand", - "execute:store:result:block:targetPos:path:long:scale:subcommand", - "execute:store:result:block:targetPos:path:double:scale:subcommand", - "execute:store:result:block:targetPos:path:byte:scale:subcommand", - "execute:store:result:storage:target:path:int:scale:subcommand", - "execute:store:result:storage:target:path:float:scale:subcommand", - "execute:store:result:storage:target:path:short:scale:subcommand", - "execute:store:result:storage:target:path:long:scale:subcommand", - "execute:store:result:storage:target:path:double:scale:subcommand", - "execute:store:result:storage:target:path:byte:scale:subcommand", - "execute:store:success:score:targets:objective:subcommand", - "execute:store:success:bossbar:id:value:subcommand", - "execute:store:success:bossbar:id:max:subcommand", - "execute:store:success:entity:target:path:int:scale:subcommand", - "execute:store:success:entity:target:path:float:scale:subcommand", - "execute:store:success:entity:target:path:short:scale:subcommand", - "execute:store:success:entity:target:path:long:scale:subcommand", - "execute:store:success:entity:target:path:double:scale:subcommand", - "execute:store:success:entity:target:path:byte:scale:subcommand", - "execute:store:success:block:targetPos:path:int:scale:subcommand", - "execute:store:success:block:targetPos:path:float:scale:subcommand", - "execute:store:success:block:targetPos:path:short:scale:subcommand", - "execute:store:success:block:targetPos:path:long:scale:subcommand", - "execute:store:success:block:targetPos:path:double:scale:subcommand", - "execute:store:success:block:targetPos:path:byte:scale:subcommand", - "execute:store:success:storage:target:path:int:scale:subcommand", - "execute:store:success:storage:target:path:float:scale:subcommand", - "execute:store:success:storage:target:path:short:scale:subcommand", - "execute:store:success:storage:target:path:long:scale:subcommand", - "execute:store:success:storage:target:path:double:scale:subcommand", - "execute:store:success:storage:target:path:byte:scale:subcommand", - "execute:positioned:pos:subcommand", - "execute:positioned:as:targets:subcommand", - "execute:rotated:rot:subcommand", - "execute:rotated:as:targets:subcommand", - "execute:facing:entity:targets:anchor:subcommand", - "execute:facing:pos:subcommand", - "execute:align:axes:subcommand", - "execute:anchored:anchor:subcommand", - "execute:in:dimension:subcommand", + "ban:targets", + "ban:targets:reason", + "ban-ip:target", + "ban-ip:target:reason", + "banlist", + "banlist:ips", + "banlist:players", "bossbar:add:id:name", - "bossbar:remove:id", + "bossbar:get:id:max", + "bossbar:get:id:players", + "bossbar:get:id:value", + "bossbar:get:id:visible", "bossbar:list", - "bossbar:set:id:name:name", - "bossbar:set:id:color:pink", + "bossbar:remove:id", "bossbar:set:id:color:blue", - "bossbar:set:id:color:red", "bossbar:set:id:color:green", - "bossbar:set:id:color:yellow", + "bossbar:set:id:color:pink", "bossbar:set:id:color:purple", + "bossbar:set:id:color:red", "bossbar:set:id:color:white", - "bossbar:set:id:style:progress", - "bossbar:set:id:style:notched_6", + "bossbar:set:id:color:yellow", + "bossbar:set:id:max:max", + "bossbar:set:id:name:name", + "bossbar:set:id:players", + "bossbar:set:id:players:targets", "bossbar:set:id:style:notched_10", "bossbar:set:id:style:notched_12", "bossbar:set:id:style:notched_20", + "bossbar:set:id:style:notched_6", + "bossbar:set:id:style:progress", "bossbar:set:id:value:value", - "bossbar:set:id:max:max", "bossbar:set:id:visible:visible", - "bossbar:set:id:players", - "bossbar:set:id:players:targets", - "bossbar:get:id:value", - "bossbar:get:id:max", - "bossbar:get:id:visible", - "bossbar:get:id:players", "clear", "clear:targets", "clear:targets:item", "clear:targets:item:maxCount", "clone:begin:end:destination", - "clone:begin:end:destination:replace", - "clone:begin:end:destination:replace:force", - "clone:begin:end:destination:replace:move", - "clone:begin:end:destination:replace:normal", - "clone:begin:end:destination:masked", - "clone:begin:end:destination:masked:force", - "clone:begin:end:destination:masked:move", - "clone:begin:end:destination:masked:normal", "clone:begin:end:destination:filtered:filter", "clone:begin:end:destination:filtered:filter:force", "clone:begin:end:destination:filtered:filter:move", "clone:begin:end:destination:filtered:filter:normal", - "data:merge:entity:target:nbt", - "data:merge:block:targetPos:nbt", - "data:merge:storage:target:nbt", - "data:get:entity:target", - "data:get:entity:target:path", - "data:get:entity:target:path:scale", + "clone:begin:end:destination:masked", + "clone:begin:end:destination:masked:force", + "clone:begin:end:destination:masked:move", + "clone:begin:end:destination:masked:normal", + "clone:begin:end:destination:replace", + "clone:begin:end:destination:replace:force", + "clone:begin:end:destination:replace:move", + "clone:begin:end:destination:replace:normal", "data:get:block:targetPos", "data:get:block:targetPos:path", "data:get:block:targetPos:path:scale", + "data:get:entity:target", + "data:get:entity:target:path", + "data:get:entity:target:path:scale", "data:get:storage:target", "data:get:storage:target:path", "data:get:storage:target:path:scale", - "data:remove:entity:target:path", - "data:remove:block:targetPos:path", - "data:remove:storage:target:path", - "data:modify:entity:target:targetPath:insert:index:from:entity:source", - "data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", - "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", - "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", - "data:modify:entity:target:targetPath:insert:index:from:storage:source", - "data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", - "data:modify:entity:target:targetPath:insert:index:value:value", - "data:modify:entity:target:targetPath:prepend:from:entity:source", - "data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", - "data:modify:entity:target:targetPath:prepend:from:block:sourcePos", - "data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", - "data:modify:entity:target:targetPath:prepend:from:storage:source", - "data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", - "data:modify:entity:target:targetPath:prepend:value:value", - "data:modify:entity:target:targetPath:append:from:entity:source", - "data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", - "data:modify:entity:target:targetPath:append:from:block:sourcePos", - "data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", - "data:modify:entity:target:targetPath:append:from:storage:source", - "data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", - "data:modify:entity:target:targetPath:append:value:value", - "data:modify:entity:target:targetPath:set:from:entity:source", - "data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", - "data:modify:entity:target:targetPath:set:from:block:sourcePos", - "data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", - "data:modify:entity:target:targetPath:set:from:storage:source", - "data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", - "data:modify:entity:target:targetPath:set:value:value", - "data:modify:entity:target:targetPath:merge:from:entity:source", - "data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", - "data:modify:entity:target:targetPath:merge:from:block:sourcePos", - "data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", - "data:modify:entity:target:targetPath:merge:from:storage:source", - "data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", - "data:modify:entity:target:targetPath:merge:value:value", - "data:modify:block:targetPos:targetPath:insert:index:from:entity:source", - "data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", + "data:merge:block:targetPos:nbt", + "data:merge:entity:target:nbt", + "data:merge:storage:target:nbt", + "data:modify:block:targetPos:targetPath:append:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:append:from:entity:source", + "data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:from:storage:source", + "data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:value:value", "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:from:entity:source", + "data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:insert:index:from:storage:source", "data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", "data:modify:block:targetPos:targetPath:insert:index:value:value", - "data:modify:block:targetPos:targetPath:prepend:from:entity:source", - "data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:entity:source", + "data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:storage:source", + "data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:value:value", "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:from:entity:source", + "data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:prepend:from:storage:source", "data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", "data:modify:block:targetPos:targetPath:prepend:value:value", - "data:modify:block:targetPos:targetPath:append:from:entity:source", - "data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", - "data:modify:block:targetPos:targetPath:append:from:block:sourcePos", - "data:modify:block:targetPos:targetPath:append:from:block:sourcePos:sourcePath", - "data:modify:block:targetPos:targetPath:append:from:storage:source", - "data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", - "data:modify:block:targetPos:targetPath:append:value:value", - "data:modify:block:targetPos:targetPath:set:from:entity:source", - "data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:set:from:block:sourcePos", "data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:set:from:entity:source", + "data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:set:from:storage:source", "data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", "data:modify:block:targetPos:targetPath:set:value:value", - "data:modify:block:targetPos:targetPath:merge:from:entity:source", - "data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", - "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", - "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", - "data:modify:block:targetPos:targetPath:merge:from:storage:source", - "data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", - "data:modify:block:targetPos:targetPath:merge:value:value", - "data:modify:storage:target:targetPath:insert:index:from:entity:source", - "data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:append:from:block:sourcePos", + "data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:append:from:entity:source", + "data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:append:from:storage:source", + "data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:value:value", + "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", + "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:insert:index:from:entity:source", + "data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:from:storage:source", + "data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:value:value", + "data:modify:entity:target:targetPath:merge:from:block:sourcePos", + "data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:merge:from:entity:source", + "data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:merge:from:storage:source", + "data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:value:value", + "data:modify:entity:target:targetPath:prepend:from:block:sourcePos", + "data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:prepend:from:entity:source", + "data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:from:storage:source", + "data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:value:value", + "data:modify:entity:target:targetPath:set:from:block:sourcePos", + "data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:set:from:entity:source", + "data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:set:from:storage:source", + "data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:value:value", + "data:modify:storage:target:targetPath:append:from:block:sourcePos", + "data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:append:from:entity:source", + "data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:append:from:storage:source", + "data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:value:value", "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:insert:index:from:entity:source", + "data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:insert:index:from:storage:source", "data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", "data:modify:storage:target:targetPath:insert:index:value:value", - "data:modify:storage:target:targetPath:prepend:from:entity:source", - "data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:merge:from:block:sourcePos", + "data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:merge:from:entity:source", + "data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:merge:from:storage:source", + "data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:value:value", "data:modify:storage:target:targetPath:prepend:from:block:sourcePos", "data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:prepend:from:entity:source", + "data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:prepend:from:storage:source", "data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", "data:modify:storage:target:targetPath:prepend:value:value", - "data:modify:storage:target:targetPath:append:from:entity:source", - "data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", - "data:modify:storage:target:targetPath:append:from:block:sourcePos", - "data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", - "data:modify:storage:target:targetPath:append:from:storage:source", - "data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", - "data:modify:storage:target:targetPath:append:value:value", - "data:modify:storage:target:targetPath:set:from:entity:source", - "data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:set:from:block:sourcePos", "data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:set:from:entity:source", + "data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:set:from:storage:source", "data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", "data:modify:storage:target:targetPath:set:value:value", - "data:modify:storage:target:targetPath:merge:from:entity:source", - "data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", - "data:modify:storage:target:targetPath:merge:from:block:sourcePos", - "data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", - "data:modify:storage:target:targetPath:merge:from:storage:source", - "data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", - "data:modify:storage:target:targetPath:merge:value:value", + "data:remove:block:targetPos:path", + "data:remove:entity:target:path", + "data:remove:storage:target:path", + "datapack:disable:name", "datapack:enable:name", "datapack:enable:name:after:existing", "datapack:enable:name:before:existing", - "datapack:enable:name:last", "datapack:enable:name:first", - "datapack:disable:name", + "datapack:enable:name:last", "datapack:list", "datapack:list:available", "datapack:list:enabled", + "debug:function:name", "debug:start", "debug:stop", - "debug:function:name", - "defaultgamemode:survival", - "defaultgamemode:creative", "defaultgamemode:adventure", + "defaultgamemode:creative", "defaultgamemode:spectator", + "defaultgamemode:survival", + "deop:targets", "difficulty", - "difficulty:peaceful", "difficulty:easy", - "difficulty:normal", "difficulty:hard", + "difficulty:normal", + "difficulty:peaceful", "effect:clear", "effect:clear:targets", "effect:clear:targets:effect", @@ -323,48 +220,150 @@ "effect:give:targets:effect:seconds", "effect:give:targets:effect:seconds:amplifier", "effect:give:targets:effect:seconds:amplifier:hideParticles", - "me:action", "enchant:targets:enchantment", "enchant:targets:enchantment:level", + "execute:subcommand", + "execute:align:axes:subcommand", + "execute:anchored:anchor:subcommand", + "execute:as:targets:subcommand", + "execute:at:targets:subcommand", + "execute:facing:entity:targets:anchor:subcommand", + "execute:facing:pos:subcommand", + "execute:if:block:pos:block", + "execute:if:block:pos:block:subcommand", + "execute:if:blocks:start:end:destination:all", + "execute:if:blocks:start:end:destination:all:subcommand", + "execute:if:blocks:start:end:destination:masked", + "execute:if:blocks:start:end:destination:masked:subcommand", + "execute:if:data:block:sourcePos:path", + "execute:if:data:block:sourcePos:path:subcommand", + "execute:if:data:entity:source:path", + "execute:if:data:entity:source:path:subcommand", + "execute:if:data:storage:source:path", + "execute:if:data:storage:source:path:subcommand", + "execute:if:entity:entities", + "execute:if:entity:entities:subcommand", + "execute:if:predicate:predicate", + "execute:if:predicate:predicate:subcommand", + "execute:if:score:target:targetObjective:<:source:sourceObjective", + "execute:if:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:<=:source:sourceObjective", + "execute:if:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:=:source:sourceObjective", + "execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>:source:sourceObjective", + "execute:if:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>=:source:sourceObjective", + "execute:if:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:matches:range", + "execute:if:score:target:targetObjective:matches:range:subcommand", + "execute:in:dimension:subcommand", + "execute:positioned:as:targets:subcommand", + "execute:positioned:pos:subcommand", + "execute:rotated:as:targets:subcommand", + "execute:rotated:rot:subcommand", + "execute:run:subcommand", + "execute:store:result:block:targetPos:path:byte:scale:subcommand", + "execute:store:result:block:targetPos:path:double:scale:subcommand", + "execute:store:result:block:targetPos:path:float:scale:subcommand", + "execute:store:result:block:targetPos:path:int:scale:subcommand", + "execute:store:result:block:targetPos:path:long:scale:subcommand", + "execute:store:result:block:targetPos:path:short:scale:subcommand", + "execute:store:result:bossbar:id:max:subcommand", + "execute:store:result:bossbar:id:value:subcommand", + "execute:store:result:entity:target:path:byte:scale:subcommand", + "execute:store:result:entity:target:path:double:scale:subcommand", + "execute:store:result:entity:target:path:float:scale:subcommand", + "execute:store:result:entity:target:path:int:scale:subcommand", + "execute:store:result:entity:target:path:long:scale:subcommand", + "execute:store:result:entity:target:path:short:scale:subcommand", + "execute:store:result:score:targets:objective:subcommand", + "execute:store:result:storage:target:path:byte:scale:subcommand", + "execute:store:result:storage:target:path:double:scale:subcommand", + "execute:store:result:storage:target:path:float:scale:subcommand", + "execute:store:result:storage:target:path:int:scale:subcommand", + "execute:store:result:storage:target:path:long:scale:subcommand", + "execute:store:result:storage:target:path:short:scale:subcommand", + "execute:store:success:block:targetPos:path:byte:scale:subcommand", + "execute:store:success:block:targetPos:path:double:scale:subcommand", + "execute:store:success:block:targetPos:path:float:scale:subcommand", + "execute:store:success:block:targetPos:path:int:scale:subcommand", + "execute:store:success:block:targetPos:path:long:scale:subcommand", + "execute:store:success:block:targetPos:path:short:scale:subcommand", + "execute:store:success:bossbar:id:max:subcommand", + "execute:store:success:bossbar:id:value:subcommand", + "execute:store:success:entity:target:path:byte:scale:subcommand", + "execute:store:success:entity:target:path:double:scale:subcommand", + "execute:store:success:entity:target:path:float:scale:subcommand", + "execute:store:success:entity:target:path:int:scale:subcommand", + "execute:store:success:entity:target:path:long:scale:subcommand", + "execute:store:success:entity:target:path:short:scale:subcommand", + "execute:store:success:score:targets:objective:subcommand", + "execute:store:success:storage:target:path:byte:scale:subcommand", + "execute:store:success:storage:target:path:double:scale:subcommand", + "execute:store:success:storage:target:path:float:scale:subcommand", + "execute:store:success:storage:target:path:int:scale:subcommand", + "execute:store:success:storage:target:path:long:scale:subcommand", + "execute:store:success:storage:target:path:short:scale:subcommand", + "execute:unless:block:pos:block", + "execute:unless:block:pos:block:subcommand", + "execute:unless:blocks:start:end:destination:all", + "execute:unless:blocks:start:end:destination:all:subcommand", + "execute:unless:blocks:start:end:destination:masked", + "execute:unless:blocks:start:end:destination:masked:subcommand", + "execute:unless:data:block:sourcePos:path", + "execute:unless:data:block:sourcePos:path:subcommand", + "execute:unless:data:entity:source:path", + "execute:unless:data:entity:source:path:subcommand", + "execute:unless:data:storage:source:path", + "execute:unless:data:storage:source:path:subcommand", + "execute:unless:entity:entities", + "execute:unless:entity:entities:subcommand", + "execute:unless:predicate:predicate", + "execute:unless:predicate:predicate:subcommand", + "execute:unless:score:target:targetObjective:<:source:sourceObjective", + "execute:unless:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:=:source:sourceObjective", + "execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>:source:sourceObjective", + "execute:unless:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:matches:range", + "execute:unless:score:target:targetObjective:matches:range:subcommand", "experience:add:targets:amount", - "experience:add:targets:amount:points", "experience:add:targets:amount:levels", + "experience:add:targets:amount:points", + "experience:query:targets:levels", + "experience:query:targets:points", "experience:set:targets:amount", - "experience:set:targets:amount:points", "experience:set:targets:amount:levels", - "experience:query:targets:points", - "experience:query:targets:levels", - "xp:add:targets:amount", - "xp:add:targets:amount:points", - "xp:add:targets:amount:levels", - "xp:set:targets:amount", - "xp:set:targets:amount:points", - "xp:set:targets:amount:levels", - "xp:query:targets:points", - "xp:query:targets:levels", + "experience:set:targets:amount:points", "fill:from:to:block", - "fill:from:to:block:replace", - "fill:from:to:block:replace:filter", + "fill:from:to:block:destroy", + "fill:from:to:block:hollow", "fill:from:to:block:keep", "fill:from:to:block:outline", - "fill:from:to:block:hollow", - "fill:from:to:block:destroy", + "fill:from:to:block:replace", + "fill:from:to:block:replace:filter", "forceload:add:from", "forceload:add:from:to", - "forceload:remove:from", - "forceload:remove:from:to", - "forceload:remove:all", "forceload:query", "forceload:query:pos", + "forceload:remove:all", + "forceload:remove:from", + "forceload:remove:from:to", "function:name", - "gamemode:survival", - "gamemode:survival:target", - "gamemode:creative", - "gamemode:creative:target", "gamemode:adventure", "gamemode:adventure:target", + "gamemode:creative", + "gamemode:creative:target", "gamemode:spectator", "gamemode:spectator:target", + "gamemode:survival", + "gamemode:survival:target", "gamerule:announceAdvancements", "gamerule:announceAdvancements:value", "gamerule:commandBlockOutput", @@ -395,6 +394,8 @@ "gamerule:doTileDrops:value", "gamerule:doTraderSpawning", "gamerule:doTraderSpawning:value", + "gamerule:doWardenSpawning", + "gamerule:doWardenSpawning:value", "gamerule:doWeatherCycle", "gamerule:doWeatherCycle:value", "gamerule:drowningDamage", @@ -439,101 +440,106 @@ "give:targets:item:count", "help", "help:command", - "item:replace:block:pos:slot:with:item", - "item:replace:block:pos:slot:with:item:count", + "item:modify:block:pos:slot:modifier", + "item:modify:entity:targets:slot:modifier", "item:replace:block:pos:slot:from:block:source:sourceSlot", "item:replace:block:pos:slot:from:block:source:sourceSlot:modifier", "item:replace:block:pos:slot:from:entity:source:sourceSlot", "item:replace:block:pos:slot:from:entity:source:sourceSlot:modifier", - "item:replace:entity:targets:slot:with:item", - "item:replace:entity:targets:slot:with:item:count", + "item:replace:block:pos:slot:with:item", + "item:replace:block:pos:slot:with:item:count", "item:replace:entity:targets:slot:from:block:source:sourceSlot", "item:replace:entity:targets:slot:from:block:source:sourceSlot:modifier", "item:replace:entity:targets:slot:from:entity:source:sourceSlot", "item:replace:entity:targets:slot:from:entity:source:sourceSlot:modifier", - "item:modify:block:pos:slot:modifier", - "item:modify:entity:targets:slot:modifier", + "item:replace:entity:targets:slot:with:item", + "item:replace:entity:targets:slot:with:item:count", + "jfr:start", + "jfr:stop", "kick:targets", "kick:targets:reason", "kill", "kill:targets", "list", "list:uuids", - "locate:structure", - "locatebiome:biome", - "loot:replace:entity:entities:slot:fish:loot_table:pos", - "loot:replace:entity:entities:slot:fish:loot_table:pos:tool", - "loot:replace:entity:entities:slot:fish:loot_table:pos:mainhand", - "loot:replace:entity:entities:slot:fish:loot_table:pos:offhand", - "loot:replace:entity:entities:slot:loot:loot_table", - "loot:replace:entity:entities:slot:kill:target", - "loot:replace:entity:entities:slot:mine:pos", - "loot:replace:entity:entities:slot:mine:pos:tool", - "loot:replace:entity:entities:slot:mine:pos:mainhand", - "loot:replace:entity:entities:slot:mine:pos:offhand", - "loot:replace:entity:entities:slot:count:fish:loot_table:pos", - "loot:replace:entity:entities:slot:count:fish:loot_table:pos:tool", - "loot:replace:entity:entities:slot:count:fish:loot_table:pos:mainhand", - "loot:replace:entity:entities:slot:count:fish:loot_table:pos:offhand", - "loot:replace:entity:entities:slot:count:loot:loot_table", - "loot:replace:entity:entities:slot:count:kill:target", - "loot:replace:entity:entities:slot:count:mine:pos", - "loot:replace:entity:entities:slot:count:mine:pos:tool", - "loot:replace:entity:entities:slot:count:mine:pos:mainhand", - "loot:replace:entity:entities:slot:count:mine:pos:offhand", - "loot:replace:block:targetPos:slot:fish:loot_table:pos", - "loot:replace:block:targetPos:slot:fish:loot_table:pos:tool", - "loot:replace:block:targetPos:slot:fish:loot_table:pos:mainhand", - "loot:replace:block:targetPos:slot:fish:loot_table:pos:offhand", - "loot:replace:block:targetPos:slot:loot:loot_table", - "loot:replace:block:targetPos:slot:kill:target", - "loot:replace:block:targetPos:slot:mine:pos", - "loot:replace:block:targetPos:slot:mine:pos:tool", - "loot:replace:block:targetPos:slot:mine:pos:mainhand", - "loot:replace:block:targetPos:slot:mine:pos:offhand", - "loot:replace:block:targetPos:slot:count:fish:loot_table:pos", - "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:tool", - "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:mainhand", - "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:offhand", - "loot:replace:block:targetPos:slot:count:loot:loot_table", - "loot:replace:block:targetPos:slot:count:kill:target", - "loot:replace:block:targetPos:slot:count:mine:pos", - "loot:replace:block:targetPos:slot:count:mine:pos:tool", - "loot:replace:block:targetPos:slot:count:mine:pos:mainhand", - "loot:replace:block:targetPos:slot:count:mine:pos:offhand", - "loot:insert:targetPos:fish:loot_table:pos", - "loot:insert:targetPos:fish:loot_table:pos:tool", - "loot:insert:targetPos:fish:loot_table:pos:mainhand", - "loot:insert:targetPos:fish:loot_table:pos:offhand", - "loot:insert:targetPos:loot:loot_table", - "loot:insert:targetPos:kill:target", - "loot:insert:targetPos:mine:pos", - "loot:insert:targetPos:mine:pos:tool", - "loot:insert:targetPos:mine:pos:mainhand", - "loot:insert:targetPos:mine:pos:offhand", + "locate:biome:biome", + "locate:poi:poi", + "locate:structure:structure", "loot:give:players:fish:loot_table:pos", - "loot:give:players:fish:loot_table:pos:tool", "loot:give:players:fish:loot_table:pos:mainhand", "loot:give:players:fish:loot_table:pos:offhand", - "loot:give:players:loot:loot_table", + "loot:give:players:fish:loot_table:pos:tool", "loot:give:players:kill:target", + "loot:give:players:loot:loot_table", "loot:give:players:mine:pos", - "loot:give:players:mine:pos:tool", "loot:give:players:mine:pos:mainhand", "loot:give:players:mine:pos:offhand", + "loot:give:players:mine:pos:tool", + "loot:insert:targetPos:fish:loot_table:pos", + "loot:insert:targetPos:fish:loot_table:pos:mainhand", + "loot:insert:targetPos:fish:loot_table:pos:offhand", + "loot:insert:targetPos:fish:loot_table:pos:tool", + "loot:insert:targetPos:kill:target", + "loot:insert:targetPos:loot:loot_table", + "loot:insert:targetPos:mine:pos", + "loot:insert:targetPos:mine:pos:mainhand", + "loot:insert:targetPos:mine:pos:offhand", + "loot:insert:targetPos:mine:pos:tool", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:mainhand", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:offhand", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:tool", + "loot:replace:block:targetPos:slot:count:kill:target", + "loot:replace:block:targetPos:slot:count:loot:loot_table", + "loot:replace:block:targetPos:slot:count:mine:pos", + "loot:replace:block:targetPos:slot:count:mine:pos:mainhand", + "loot:replace:block:targetPos:slot:count:mine:pos:offhand", + "loot:replace:block:targetPos:slot:count:mine:pos:tool", + "loot:replace:block:targetPos:slot:fish:loot_table:pos", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:mainhand", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:offhand", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:tool", + "loot:replace:block:targetPos:slot:kill:target", + "loot:replace:block:targetPos:slot:loot:loot_table", + "loot:replace:block:targetPos:slot:mine:pos", + "loot:replace:block:targetPos:slot:mine:pos:mainhand", + "loot:replace:block:targetPos:slot:mine:pos:offhand", + "loot:replace:block:targetPos:slot:mine:pos:tool", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:mainhand", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:offhand", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:tool", + "loot:replace:entity:entities:slot:count:kill:target", + "loot:replace:entity:entities:slot:count:loot:loot_table", + "loot:replace:entity:entities:slot:count:mine:pos", + "loot:replace:entity:entities:slot:count:mine:pos:mainhand", + "loot:replace:entity:entities:slot:count:mine:pos:offhand", + "loot:replace:entity:entities:slot:count:mine:pos:tool", + "loot:replace:entity:entities:slot:fish:loot_table:pos", + "loot:replace:entity:entities:slot:fish:loot_table:pos:mainhand", + "loot:replace:entity:entities:slot:fish:loot_table:pos:offhand", + "loot:replace:entity:entities:slot:fish:loot_table:pos:tool", + "loot:replace:entity:entities:slot:kill:target", + "loot:replace:entity:entities:slot:loot:loot_table", + "loot:replace:entity:entities:slot:mine:pos", + "loot:replace:entity:entities:slot:mine:pos:mainhand", + "loot:replace:entity:entities:slot:mine:pos:offhand", + "loot:replace:entity:entities:slot:mine:pos:tool", "loot:spawn:targetPos:fish:loot_table:pos", - "loot:spawn:targetPos:fish:loot_table:pos:tool", "loot:spawn:targetPos:fish:loot_table:pos:mainhand", "loot:spawn:targetPos:fish:loot_table:pos:offhand", - "loot:spawn:targetPos:loot:loot_table", + "loot:spawn:targetPos:fish:loot_table:pos:tool", "loot:spawn:targetPos:kill:target", + "loot:spawn:targetPos:loot:loot_table", "loot:spawn:targetPos:mine:pos", - "loot:spawn:targetPos:mine:pos:tool", "loot:spawn:targetPos:mine:pos:mainhand", "loot:spawn:targetPos:mine:pos:offhand", + "loot:spawn:targetPos:mine:pos:tool", + "me:action", "msg:targets:message", - "tell:targets:message", - "w:targets:message", + "op:targets", + "pardon:targets", + "pardon-ip:target", "particle:name", "particle:name:pos", "particle:name:pos:delta:speed:count", @@ -541,28 +547,25 @@ "particle:name:pos:delta:speed:count:force:viewers", "particle:name:pos:delta:speed:count:normal", "particle:name:pos:delta:speed:count:normal:viewers", - "placefeature:feature", - "placefeature:feature:pos", - "playsound:sound:master:targets", - "playsound:sound:master:targets:pos", - "playsound:sound:master:targets:pos:volume", - "playsound:sound:master:targets:pos:volume:pitch", - "playsound:sound:master:targets:pos:volume:pitch:minVolume", - "playsound:sound:music:targets", - "playsound:sound:music:targets:pos", - "playsound:sound:music:targets:pos:volume", - "playsound:sound:music:targets:pos:volume:pitch", - "playsound:sound:music:targets:pos:volume:pitch:minVolume", - "playsound:sound:record:targets", - "playsound:sound:record:targets:pos", - "playsound:sound:record:targets:pos:volume", - "playsound:sound:record:targets:pos:volume:pitch", - "playsound:sound:record:targets:pos:volume:pitch:minVolume", - "playsound:sound:weather:targets", - "playsound:sound:weather:targets:pos", - "playsound:sound:weather:targets:pos:volume", - "playsound:sound:weather:targets:pos:volume:pitch", - "playsound:sound:weather:targets:pos:volume:pitch:minVolume", + "perf:start", + "perf:stop", + "place:feature:feature", + "place:feature:feature:pos", + "place:jigsaw:pool:target:max_depth", + "place:jigsaw:pool:target:max_depth:position", + "place:structure:structure", + "place:structure:structure:pos", + "place:template:template", + "place:template:template:pos", + "place:template:template:pos:rotation", + "place:template:template:pos:rotation:mirror", + "place:template:template:pos:rotation:mirror:integrity", + "place:template:template:pos:rotation:mirror:integrity:seed", + "playsound:sound:ambient:targets", + "playsound:sound:ambient:targets:pos", + "playsound:sound:ambient:targets:pos:volume", + "playsound:sound:ambient:targets:pos:volume:pitch", + "playsound:sound:ambient:targets:pos:volume:pitch:minVolume", "playsound:sound:block:targets", "playsound:sound:block:targets:pos", "playsound:sound:block:targets:pos:volume", @@ -573,6 +576,16 @@ "playsound:sound:hostile:targets:pos:volume", "playsound:sound:hostile:targets:pos:volume:pitch", "playsound:sound:hostile:targets:pos:volume:pitch:minVolume", + "playsound:sound:master:targets", + "playsound:sound:master:targets:pos", + "playsound:sound:master:targets:pos:volume", + "playsound:sound:master:targets:pos:volume:pitch", + "playsound:sound:master:targets:pos:volume:pitch:minVolume", + "playsound:sound:music:targets", + "playsound:sound:music:targets:pos", + "playsound:sound:music:targets:pos:volume", + "playsound:sound:music:targets:pos:volume:pitch", + "playsound:sound:music:targets:pos:volume:pitch:minVolume", "playsound:sound:neutral:targets", "playsound:sound:neutral:targets:pos", "playsound:sound:neutral:targets:pos:volume", @@ -583,197 +596,197 @@ "playsound:sound:player:targets:pos:volume", "playsound:sound:player:targets:pos:volume:pitch", "playsound:sound:player:targets:pos:volume:pitch:minVolume", - "playsound:sound:ambient:targets", - "playsound:sound:ambient:targets:pos", - "playsound:sound:ambient:targets:pos:volume", - "playsound:sound:ambient:targets:pos:volume:pitch", - "playsound:sound:ambient:targets:pos:volume:pitch:minVolume", + "playsound:sound:record:targets", + "playsound:sound:record:targets:pos", + "playsound:sound:record:targets:pos:volume", + "playsound:sound:record:targets:pos:volume:pitch", + "playsound:sound:record:targets:pos:volume:pitch:minVolume", "playsound:sound:voice:targets", "playsound:sound:voice:targets:pos", "playsound:sound:voice:targets:pos:volume", "playsound:sound:voice:targets:pos:volume:pitch", "playsound:sound:voice:targets:pos:volume:pitch:minVolume", - "reload", - "recipe:give:targets:recipe", + "playsound:sound:weather:targets", + "playsound:sound:weather:targets:pos", + "playsound:sound:weather:targets:pos:volume", + "playsound:sound:weather:targets:pos:volume:pitch", + "playsound:sound:weather:targets:pos:volume:pitch:minVolume", + "publish", + "publish:port", "recipe:give:targets:*", - "recipe:take:targets:recipe", + "recipe:give:targets:recipe", "recipe:take:targets:*", + "recipe:take:targets:recipe", + "reload", + "save-all", + "save-all:flush", + "save-off", + "save-on", "say:message", + "schedule:clear:function", "schedule:function:function:time", "schedule:function:function:time:append", "schedule:function:function:time:replace", - "schedule:clear:function", - "scoreboard:objectives:list", "scoreboard:objectives:add:objective:criteria", "scoreboard:objectives:add:objective:criteria:displayName", + "scoreboard:objectives:list", "scoreboard:objectives:modify:objective:displayname:displayName", - "scoreboard:objectives:modify:objective:rendertype:integer", "scoreboard:objectives:modify:objective:rendertype:hearts", + "scoreboard:objectives:modify:objective:rendertype:integer", "scoreboard:objectives:remove:objective", "scoreboard:objectives:setdisplay:slot", "scoreboard:objectives:setdisplay:slot:objective", + "scoreboard:players:add:targets:objective:score", + "scoreboard:players:enable:targets:objective", + "scoreboard:players:get:target:objective", "scoreboard:players:list", "scoreboard:players:list:target", - "scoreboard:players:set:targets:objective:score", - "scoreboard:players:get:target:objective", - "scoreboard:players:add:targets:objective:score", + "scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective", "scoreboard:players:remove:targets:objective:score", "scoreboard:players:reset:targets", "scoreboard:players:reset:targets:objective", - "scoreboard:players:enable:targets:objective", - "scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective", + "scoreboard:players:set:targets:objective:score", "seed", "setblock:pos:block", "setblock:pos:block:destroy", "setblock:pos:block:keep", "setblock:pos:block:replace", + "setidletimeout:minutes", + "setworldspawn", + "setworldspawn:pos", + "setworldspawn:pos:angle", "spawnpoint", "spawnpoint:targets", "spawnpoint:targets:pos", "spawnpoint:targets:pos:angle", - "setworldspawn", - "setworldspawn:pos", - "setworldspawn:pos:angle", "spectate", "spectate:target", "spectate:target:player", "spreadplayers:center:spreadDistance:maxRange:respectTeams:targets", "spreadplayers:center:spreadDistance:maxRange:under:maxHeight:respectTeams:targets", + "stop", "stopsound:targets", "stopsound:targets:*:sound", - "stopsound:targets:master", - "stopsound:targets:master:sound", - "stopsound:targets:music", - "stopsound:targets:music:sound", - "stopsound:targets:record", - "stopsound:targets:record:sound", - "stopsound:targets:weather", - "stopsound:targets:weather:sound", + "stopsound:targets:ambient", + "stopsound:targets:ambient:sound", "stopsound:targets:block", "stopsound:targets:block:sound", "stopsound:targets:hostile", "stopsound:targets:hostile:sound", + "stopsound:targets:master", + "stopsound:targets:master:sound", + "stopsound:targets:music", + "stopsound:targets:music:sound", "stopsound:targets:neutral", "stopsound:targets:neutral:sound", "stopsound:targets:player", "stopsound:targets:player:sound", - "stopsound:targets:ambient", - "stopsound:targets:ambient:sound", + "stopsound:targets:record", + "stopsound:targets:record:sound", "stopsound:targets:voice", "stopsound:targets:voice:sound", + "stopsound:targets:weather", + "stopsound:targets:weather:sound", "summon:entity", "summon:entity:pos", "summon:entity:pos:nbt", "tag:targets:add:name", - "tag:targets:remove:name", "tag:targets:list", - "team:list", - "team:list:team", + "tag:targets:remove:name", "team:add:team", "team:add:team:displayName", - "team:remove:team", "team:empty:team", "team:join:team", "team:join:team:members", "team:leave:members", - "team:modify:team:displayName:displayName", + "team:list", + "team:list:team", + "team:modify:team:collisionRule:always", + "team:modify:team:collisionRule:never", + "team:modify:team:collisionRule:pushOtherTeams", + "team:modify:team:collisionRule:pushOwnTeam", "team:modify:team:color:value", + "team:modify:team:deathMessageVisibility:always", + "team:modify:team:deathMessageVisibility:hideForOtherTeams", + "team:modify:team:deathMessageVisibility:hideForOwnTeam", + "team:modify:team:deathMessageVisibility:never", + "team:modify:team:displayName:displayName", "team:modify:team:friendlyFire:allowed", - "team:modify:team:seeFriendlyInvisibles:allowed", - "team:modify:team:nametagVisibility:never", + "team:modify:team:nametagVisibility:always", "team:modify:team:nametagVisibility:hideForOtherTeams", "team:modify:team:nametagVisibility:hideForOwnTeam", - "team:modify:team:nametagVisibility:always", - "team:modify:team:deathMessageVisibility:never", - "team:modify:team:deathMessageVisibility:hideForOtherTeams", - "team:modify:team:deathMessageVisibility:hideForOwnTeam", - "team:modify:team:deathMessageVisibility:always", - "team:modify:team:collisionRule:never", - "team:modify:team:collisionRule:pushOwnTeam", - "team:modify:team:collisionRule:pushOtherTeams", - "team:modify:team:collisionRule:always", + "team:modify:team:nametagVisibility:never", "team:modify:team:prefix:prefix", + "team:modify:team:seeFriendlyInvisibles:allowed", "team:modify:team:suffix:suffix", + "team:remove:team", "teammsg:message", - "tm:message", - "teleport:location", "teleport:destination", + "teleport:location", + "teleport:targets:destination", "teleport:targets:location", - "teleport:targets:location:rotation", "teleport:targets:location:facing:entity:facingEntity", "teleport:targets:location:facing:entity:facingEntity:facingAnchor", "teleport:targets:location:facing:facingLocation", - "teleport:targets:destination", - "tp:location", - "tp:destination", - "tp:targets:location", - "tp:targets:location:rotation", - "tp:targets:location:facing:entity:facingEntity", - "tp:targets:location:facing:entity:facingEntity:facingAnchor", - "tp:targets:location:facing:facingLocation", - "tp:targets:destination", + "teleport:targets:location:rotation", + "tell:targets:message", "tellraw:targets:message", - "time:set:day", - "time:set:noon", - "time:set:night", - "time:set:midnight", - "time:set:time", "time:add:time", + "time:query:day", "time:query:daytime", "time:query:gametime", - "time:query:day", + "time:set:day", + "time:set:midnight", + "time:set:night", + "time:set:noon", + "time:set:time", + "title:targets:actionbar:title", "title:targets:clear", "title:targets:reset", - "title:targets:title:title", "title:targets:subtitle:title", - "title:targets:actionbar:title", "title:targets:times:fadeIn:stay:fadeOut", + "title:targets:title:title", + "tm:message", + "tp:destination", + "tp:location", + "tp:targets:destination", + "tp:targets:location", + "tp:targets:location:facing:entity:facingEntity", + "tp:targets:location:facing:entity:facingEntity:facingAnchor", + "tp:targets:location:facing:facingLocation", + "tp:targets:location:rotation", "trigger:objective", "trigger:objective:add:value", "trigger:objective:set:value", + "w:targets:message", "weather:clear", "weather:clear:duration", "weather:rain", "weather:rain:duration", "weather:thunder", "weather:thunder:duration", + "whitelist:add:targets", + "whitelist:list", + "whitelist:off", + "whitelist:on", + "whitelist:reload", + "whitelist:remove:targets", "worldborder:add:distance", "worldborder:add:distance:time", - "worldborder:set:distance", - "worldborder:set:distance:time", "worldborder:center:pos", "worldborder:damage:amount:damagePerBlock", "worldborder:damage:buffer:distance", "worldborder:get", + "worldborder:set:distance", + "worldborder:set:distance:time", "worldborder:warning:distance:distance", "worldborder:warning:time:time", - "jfr:start", - "jfr:stop", - "ban-ip:target", - "ban-ip:target:reason", - "banlist", - "banlist:ips", - "banlist:players", - "ban:targets", - "ban:targets:reason", - "deop:targets", - "op:targets", - "pardon:targets", - "pardon-ip:target", - "perf:start", - "perf:stop", - "save-all", - "save-all:flush", - "save-off", - "save-on", - "setidletimeout:minutes", - "stop", - "whitelist:on", - "whitelist:off", - "whitelist:list", - "whitelist:add:targets", - "whitelist:remove:targets", - "whitelist:reload", - "publish", - "publish:port" + "xp:add:targets:amount", + "xp:add:targets:amount:levels", + "xp:add:targets:amount:points", + "xp:query:targets:levels", + "xp:query:targets:points", + "xp:set:targets:amount", + "xp:set:targets:amount:levels", + "xp:set:targets:amount:points" ] From 324f9971096a37e62d3f0a9ae0b4db4695f36a62 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 17 Jun 2022 22:23:40 +0000 Subject: [PATCH 0887/1554] 0.53.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 4d5e42b6b..394981d1b 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.53.0 (2022-06-17) +### Feature +* Default to minecraft 1.19 ([`f9eda9c`](https://github.com/mcbeet/mecha/commit/f9eda9c63b9346b5b1fc17bd510cab7ab62772e8)) + ## v0.52.3 (2022-06-17) ### Fix * Handle nested redirects ([`179bdcd`](https://github.com/mcbeet/mecha/commit/179bdcdbb6e62caeed100285425f0b964aa9b30d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 08ccea3ed..09565682d 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.52.3" +__version__ = "0.53.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f4e6b597d..0acff6133 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.52.3" +version = "0.53.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5508a06fe6b959347e6a6a4757f65e8b58915395 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 02:11:08 +0200 Subject: [PATCH 0888/1554] feat: update beet to default to 1.19 --- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- .../tests/snapshots/examples__beet_project__0.pack.md | 4 ++-- .../snapshots/examples__markdown_README_md__0.pack.md | 2 +- ...ples__markdown_examples_append_modifier_txt__0.pack.md | 2 +- .../examples__markdown_examples_basic1_txt__0.pack.md | 2 +- .../examples__markdown_examples_basic2_txt__0.pack.md | 2 +- .../examples__markdown_examples_basic3_txt__0.pack.md | 2 +- ...amples__markdown_examples_code_fragments_md__0.pack.md | 2 +- .../examples__markdown_examples_combined_md__0.pack.md | 2 +- .../examples__markdown_examples_compact_txt__0.pack.md | 2 +- ...es__markdown_examples_download_fragment_txt__0.pack.md | 2 +- ...ples__markdown_examples_embedded_vs_text_md__0.pack.md | 2 +- ...ples__markdown_examples_empty_functions_txt__0.pack.md | 2 +- ...les__markdown_examples_escaped_fragment_txt__0.pack.md | 2 +- ...mples__markdown_examples_folded_sections_md__0.pack.md | 2 +- .../examples__markdown_examples_merge_lang_txt__0.pack.md | 2 +- ...mples__markdown_examples_merge_modifier_txt__0.pack.md | 2 +- ...les__markdown_examples_prepend_modifier_txt__0.pack.md | 2 +- ...amples__markdown_examples_readme_example_md__0.pack.md | 2 +- .../examples__markdown_examples_sound_txt__0.pack.md | 2 +- ...__markdown_examples_strip_final_newline_txt__0.pack.md | 2 +- ...arkdown_examples_with_links_inline_image_md__0.pack.md | 4 ++-- ...own_examples_with_links_lots_of_textures_md__0.pack.md | 2 +- ...n_examples_with_links_pack_icon_data_url_md__0.pack.md | 4 ++-- ...kdown_examples_with_links_pack_icon_link_md__0.pack.md | 2 +- ...down_examples_with_links_pack_local_icon_md__0.pack.md | 2 +- ...down_examples_with_links_structure_files_md__0.pack.md | 2 +- .../README.md | 2 +- .../README.md | 4 ++-- .../README.md | 2 +- .../README.md | 4 ++-- .../README.md | 2 +- .../README.md | 2 +- .../README.md | 2 +- .../tests/snapshots/examples__text_README_md__0.pack.txt | 2 +- ...xamples__text_examples_append_modifier_txt__0.pack.txt | 2 +- .../examples__text_examples_basic1_txt__0.pack.txt | 2 +- .../examples__text_examples_basic2_txt__0.pack.txt | 2 +- .../examples__text_examples_basic3_txt__0.pack.txt | 2 +- .../examples__text_examples_code_fragments_md__0.pack.txt | 2 +- .../examples__text_examples_combined_md__0.pack.txt | 2 +- .../examples__text_examples_compact_txt__0.pack.txt | 2 +- ...mples__text_examples_download_fragment_txt__0.pack.txt | 2 +- ...xamples__text_examples_embedded_vs_text_md__0.pack.txt | 2 +- ...xamples__text_examples_empty_functions_txt__0.pack.txt | 2 +- ...amples__text_examples_escaped_fragment_txt__0.pack.txt | 2 +- ...examples__text_examples_folded_sections_md__0.pack.txt | 2 +- .../examples__text_examples_merge_lang_txt__0.pack.txt | 2 +- ...examples__text_examples_merge_modifier_txt__0.pack.txt | 2 +- ...amples__text_examples_prepend_modifier_txt__0.pack.txt | 2 +- .../examples__text_examples_readme_example_md__0.pack.txt | 2 +- .../examples__text_examples_sound_txt__0.pack.txt | 2 +- ...les__text_examples_strip_final_newline_txt__0.pack.txt | 2 +- ...__text_examples_with_links_inline_image_md__0.pack.txt | 4 ++-- ...xt_examples_with_links_lots_of_textures_md__0.pack.txt | 2 +- ..._examples_with_links_pack_icon_data_url_md__0.pack.txt | 4 ++-- ...text_examples_with_links_pack_icon_link_md__0.pack.txt | 2 +- ...ext_examples_with_links_pack_local_icon_md__0.pack.txt | 2 +- ...ext_examples_with_links_structure_files_md__0.pack.txt | 2 +- .../lectern/tests/snapshots/messaging__build_0__0.pack.md | 2 +- .../lectern/tests/snapshots/messaging__build_1__0.pack.md | 4 ++-- .../lectern/tests/snapshots/messaging__build_2__0.pack.md | 2 +- .../lectern/tests/snapshots/messaging__build_3__0.pack.md | 2 +- .../lectern/tests/snapshots/messaging__build_4__0.pack.md | 2 +- .../lectern/tests/snapshots/messaging__build_5__0.pack.md | 2 +- 66 files changed, 77 insertions(+), 77 deletions(-) diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 3bce3ce2b..cf0702ad5 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.67.0" +version = "0.68.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -784,7 +784,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "6f9836914f61fbde4fd7512b651c7ab88442a8b9d0064972cf6a600726c5271e" +content-hash = "6e48ec349c0e4f301fb3acd02094b00324fe0ab79adfffa7aaffeef9afcff7a0" [metadata.files] atomicwrites = [ @@ -796,8 +796,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] beet = [ - {file = "beet-0.67.0-py3-none-any.whl", hash = "sha256:4e44e7278be50ebd8dec697e411ccdc377a24308e21cdb197f071dfbe1e1cde7"}, - {file = "beet-0.67.0.tar.gz", hash = "sha256:f6796b7a8e8241aabbbf5b7e15403e87645055b4ec952bb9cfc0a5c0ba52d48d"}, + {file = "beet-0.68.1-py3-none-any.whl", hash = "sha256:49f865161831eab37202f5b74f99e97bafc0c8fc9375032a2bed93fff95e1aab"}, + {file = "beet-0.68.1.tar.gz", hash = "sha256:92fccb6448a64f02fb7c92d2cafa253afc9482b4b0f9bdf1de6344ae4205f05b"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 878ff7a10..909b0f702 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.67.0" +beet = ">=0.68.1" markdown-it-py = "^2.1.0" click = "^8.1.3" diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 5039cd2b7..381b0d0bb 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -496,7 +496,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index 67f9c983f..a8fb338c0 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md index 5c5a1e81a..d3258720d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md index 2fcc15730..a1784517d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md index 5bf484877..371d4c090 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md index 71924a031..2906cfbdd 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md index 1edeeab19..2b4f7e7d1 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md index 6fc880279..a79f34d39 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md @@ -38,7 +38,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md index 5a8c68d99..ed6a43b2d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md index 625f98c2f..64885221e 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md index 31a1904c1..f370f312a 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md index 5248ee81c..a9e4286e9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md index 2dcac83ec..e7a18ce30 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md index 2fcc15730..a1784517d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md index e6e13887b..3918d9348 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md index 2c773be2c..55f81eafd 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md index 402c25990..a0628070e 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md index dd7d2598f..bae050dfb 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md index e55d98dc6..fc9b7bcf7 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md index 0c8966d54..559183a90 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md index 399ad9aa1..1b5b245c7 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md index a887cb5b5..3e8f64d08 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md index 5509e2369..3520ab21c 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md index 7ee8e4ade..0364b0547 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md index ed90b7f40..7c64844e3 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md index bd83decce..87b7a5873 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index 4564e477e..c555b06fb 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md index f16c4bfda..2c20caa64 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md index bb17eb677..c8abde25d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md index 2f6abf592..39177d55c 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -34,7 +34,7 @@ ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md index e3e8e9721..857b5c7fd 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md index e3e8e9721..857b5c7fd 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md index 8e5f34002..21f62cb83 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md @@ -9,7 +9,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt index ec8d2877e..db62f001f 100644 --- a/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_README_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt index 365148eb5..2e50f03c5 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_append_modifier_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt index 66d58fbb0..a3cdaffff 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_basic1_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt index 6a500b8dd..451ec4077 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_basic2_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt index 63046c0ec..db73d5f81 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_basic3_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt index 54384f6de..248e12f50 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_code_fragments_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt index 4ee023ff9..9deb9497d 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_combined_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt index 5d77f8df1..36600b657 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_compact_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt index cd40374dc..f2805a51d 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_download_fragment_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt index 1de14e754..cd04b7e81 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_embedded_vs_text_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt index 4f108f405..00b9a2792 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_empty_functions_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt index 2ee8668e0..983443015 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_escaped_fragment_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt index 66d58fbb0..a3cdaffff 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_folded_sections_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt index 31a96e913..b8ad65b51 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_merge_lang_txt__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt index ddac8c95f..68d3871a8 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_merge_modifier_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt index e1c5ca414..39417f453 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_prepend_modifier_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt index 2155d78a4..201ad0d38 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_readme_example_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt index f3b9348c1..9820aa9af 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_sound_txt__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt index fa41f359b..e2705784b 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_strip_final_newline_txt__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt index b8d155cff..dba2ee96f 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_inline_image_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } @@ -18,7 +18,7 @@ UklGRsQ0AABXRUJQVlA4WAoAAAAQAAAAKwEAKwEAQUxQSBQCAAABCbdtJDkSZmq8yz/i1XXi34zo/wTE @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt index 24fcfc41c..2dfd1295b 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_lots_of_textures_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt index 46879c00a..e3e81cdc0 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_data_url_md__0.pack.txt @@ -1,7 +1,7 @@ @resource_pack pack.mcmeta { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } @@ -12,7 +12,7 @@ UklGRsQ0AABXRUJQVlA4WAoAAAAQAAAAKwEAKwEAQUxQSBQCAAABCbdtJDkSZmq8yz/i1XXi34zo/wTE @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt index 54fc69461..a58fb3d23 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_icon_link_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt index 3afcaa9f3..fff2f0b46 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_pack_local_icon_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt index 5b6bd0b5d..57b7a92fb 100644 --- a/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_structure_files_md__0.pack.txt @@ -1,7 +1,7 @@ @data_pack pack.mcmeta { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md index 821d60286..ca80b400a 100644 --- a/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md index b97b8a2da..f72d51b88 100644 --- a/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_1__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -15,7 +15,7 @@ ### demo -`@function demo:foo` +`@function(strip_final_newline) demo:foo` ```mcfunction say hello2 diff --git a/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md index 70e498860..cee2e8c44 100644 --- a/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_2__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md index 30c615461..156867c64 100644 --- a/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_3__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md index 18b5e7f3a..7d89c3e49 100644 --- a/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_4__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md index 3f89461bf..7a33c6423 100644 --- a/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } From 5a2a6b071253213dfad7a04c3d7a03a7e8635def Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 02:11:15 +0200 Subject: [PATCH 0889/1554] chore: update pyright --- packages/lectern/package-lock.json | 14 +++++++------- packages/lectern/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 30bbfd0b7..997dd959d 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.250" + "pyright": "^1.1.254" } }, "node_modules/pyright": { - "version": "1.1.250", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.250.tgz", - "integrity": "sha512-LZl5ZzE5P4YkobJTpUvDmxreNFhFUgyYnKwDdSEneP4ZtKI4rIi5AvQ9lEsr/uXdzO/w+P+XRWbmderC0Cc/Pw==", + "version": "1.1.254", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", + "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.250", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.250.tgz", - "integrity": "sha512-LZl5ZzE5P4YkobJTpUvDmxreNFhFUgyYnKwDdSEneP4ZtKI4rIi5AvQ9lEsr/uXdzO/w+P+XRWbmderC0Cc/Pw==", + "version": "1.1.254", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", + "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index cc597f4fb..ce423b29d 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.250" + "pyright": "^1.1.254" } } From 37299ae9ba86c055d344d3e027e576ef9f1f1418 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 00:12:19 +0000 Subject: [PATCH 0890/1554] 0.22.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index ca356cf92..a252e912f 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.22.0 (2022-06-18) +### Feature +* Update beet to default to 1.19 ([`4f2f2e9`](https://github.com/mcbeet/lectern/commit/4f2f2e901dbe6f80f5b000e2ee6abe78546b9f96)) + ## v0.21.2 (2022-04-29) ### Fix * Don't do fancy concatenation ([`8d7dd36`](https://github.com/mcbeet/lectern/commit/8d7dd367553524ca061e92edb6c78f9f0fd4ce4c)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index dbc581d06..47a8f795c 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.21.2" +__version__ = "0.22.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 909b0f702..066a3c706 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.21.2" +version = "0.22.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 30db1c78f8e5b857f42ef5e9a3b01af11cf2496c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 02:16:56 +0200 Subject: [PATCH 0891/1554] feat: use minecraft version config from beet directly --- packages/mecha/examples/basic_1_18/beet.yml | 4 +- packages/mecha/mecha/api.py | 25 +++++++++--- packages/mecha/mecha/cli.py | 6 +-- packages/mecha/mecha/config.py | 4 +- packages/mecha/mecha/parse.py | 12 ++---- packages/mecha/mecha/spec.py | 3 +- packages/mecha/mecha/utils.py | 17 +------- packages/mecha/poetry.lock | 40 +++++++++---------- packages/mecha/pyproject.toml | 4 +- .../examples__build_basic_1_18__0.pack.md | 13 ++++++ .../examples__build_basic__0.pack.md | 2 +- .../examples__build_basic_debug__0.pack.md | 2 +- ...s__build_basic_implicit_execute__0.pack.md | 2 +- .../examples__build_basic_lint__0.pack.md | 2 +- .../examples__build_basic_messages__0.pack.md | 2 +- ...examples__build_basic_multiline__0.pack.md | 2 +- ...s__build_basic_nested_resources__0.pack.md | 2 +- ...amples__build_basic_nested_yaml__0.pack.md | 2 +- .../examples__build_basic_nesting__0.pack.md | 2 +- .../examples__build_basic_preserve__0.pack.md | 2 +- .../examples__build_basic_readonly__0.pack.md | 2 +- ...__build_basic_relative_location__0.pack.md | 2 +- .../examples__build_basic_stats__0.pack.md | 2 +- .../examples__build_custom_command__0.pack.md | 2 +- ...amples__build_gather_objectives__0.pack.md | 2 +- .../examples__build_kitchen_sink__0.pack.md | 2 +- 26 files changed, 82 insertions(+), 78 deletions(-) diff --git a/packages/mecha/examples/basic_1_18/beet.yml b/packages/mecha/examples/basic_1_18/beet.yml index 1a6f9a59b..d468c854f 100644 --- a/packages/mecha/examples/basic_1_18/beet.yml +++ b/packages/mecha/examples/basic_1_18/beet.yml @@ -1,7 +1,5 @@ +minecraft: 1.18 data_pack: load: "src" pipeline: - mecha -meta: - mecha: - version: 1.18 diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index a01b027f5..49a01ecc5 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -26,8 +26,22 @@ overload, ) -from beet import Cache, Context, DataPack, Function, NamespaceFile, TextFileBase -from beet.core.utils import FileSystemPath, JsonDict, extra_field, import_from_string +from beet import ( + LATEST_MINECRAFT_VERSION, + Cache, + Context, + DataPack, + Function, + NamespaceFile, + TextFileBase, +) +from beet.core.utils import ( + FileSystemPath, + JsonDict, + VersionNumber, + extra_field, + import_from_string, +) from pydantic import BaseModel from tokenstream import InvalidSyntax, TokenStream from tokenstream.location import set_location @@ -45,7 +59,6 @@ from .parse import delegate, get_parsers from .serialize import Formatting, Serializer from .spec import CommandSpec -from .utils import VersionNumber AstNodeType = TypeVar("AstNodeType", bound=AstNode) TextFileType = TypeVar("TextFileType", bound=TextFileBase[Any]) @@ -85,7 +98,7 @@ def dump(self, node: AstRoot, f: BufferedWriter): class MechaOptions(BaseModel): """Mecha options.""" - version: VersionNumber = "1.19" + version: str = "" multiline: bool = False formatting: Formatting = "dense" readonly: Optional[bool] = None @@ -99,7 +112,7 @@ class Mecha: """Class exposing the command api.""" ctx: InitVar[Optional[Context]] = None - version: InitVar[VersionNumber] = "1.19" + version: InitVar[VersionNumber] = LATEST_MINECRAFT_VERSION multiline: InitVar[bool] = False formatting: InitVar[Formatting] = "dense" readonly: bool = False @@ -138,7 +151,7 @@ def __post_init__( ): if ctx: opts = ctx.validate("mecha", MechaOptions) - version = opts.version + version = opts.version or ctx.minecraft_version multiline = opts.multiline formatting = opts.formatting diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py index 800907b98..32383c49b 100644 --- a/packages/mecha/mecha/cli.py +++ b/packages/mecha/mecha/cli.py @@ -12,7 +12,7 @@ from typing import Optional, Tuple import click -from beet import Context, DataPack, Function, run_beet +from beet import LATEST_MINECRAFT_VERSION, Context, DataPack, Function, run_beet from beet.toolchain.cli import BeetCommand, LogHandler, error_handler, message_fence from mecha import __version__ @@ -44,7 +44,7 @@ def validate(ctx: Context): "-m", "--minecraft", metavar="VERSION", - default="1.19", + default=LATEST_MINECRAFT_VERSION, help="Minecraft version.", ) @click.option( @@ -94,12 +94,12 @@ def mecha( logger.addHandler(LogHandler()) config = { + "minecraft": minecraft, "require": stats * ["mecha.contrib.statistics"], "pipeline": ["mecha.cli.validate"], "meta": { "source": source, "mecha": { - "version": minecraft, "readonly": True, "cache": False, }, diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index ace7d9e65..d26b75f2c 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -9,11 +9,9 @@ from typing import Dict, Iterator, List, Literal, Optional, Set, Tuple, Union from beet import ErrorMessage -from beet.core.utils import FileSystemPath, JsonDict +from beet.core.utils import FileSystemPath, JsonDict, VersionNumber, split_version from pydantic import BaseModel -from .utils import VersionNumber, split_version - class CommandTree(BaseModel): """Deserialized representation of the command tree.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 78ba4a9d0..e5619c2d0 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -80,6 +80,8 @@ ) from uuid import UUID +from beet import LATEST_MINECRAFT_VERSION +from beet.core.utils import VersionNumber, split_version from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location @@ -158,13 +160,7 @@ from .config import CommandTree from .error import MechaError from .spec import CommandSpec, Parser -from .utils import ( - JsonQuoteHelper, - QuoteHelper, - VersionNumber, - split_version, - string_to_number, -) +from .utils import JsonQuoteHelper, QuoteHelper, string_to_number NUMBER_PATTERN: str = r"-?(?:\d+\.?\d*|\.\d+)" @@ -454,7 +450,7 @@ def get_default_parsers() -> Dict[str, Parser]: } -def get_parsers(version: VersionNumber = "1.19") -> Dict[str, Parser]: +def get_parsers(version: VersionNumber = LATEST_MINECRAFT_VERSION) -> Dict[str, Parser]: """Return parsers for a specific version.""" version = split_version(version) diff --git a/packages/mecha/mecha/spec.py b/packages/mecha/mecha/spec.py index 4b13ae286..fec216606 100644 --- a/packages/mecha/mecha/spec.py +++ b/packages/mecha/mecha/spec.py @@ -7,6 +7,7 @@ from dataclasses import dataclass from typing import Any, Dict, Protocol, Set, Tuple, Union +from beet import LATEST_MINECRAFT_VERSION from beet.core.utils import JsonDict, extra_field from tokenstream import TokenStream @@ -28,7 +29,7 @@ class CommandSpec: multiline: bool = False tree: CommandTree = extra_field( - default_factory=lambda: CommandTree.load_from(version="1.19") + default_factory=lambda: CommandTree.load_from(version=LATEST_MINECRAFT_VERSION) ) prototypes: Dict[str, CommandPrototype] = extra_field(default_factory=dict) diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index 193f2c39c..d4b787e2c 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -6,17 +6,14 @@ "normalize_whitespace", "string_to_number", "number_to_string", - "VersionNumber", - "split_version", "underline_code", ] import re from dataclasses import dataclass, field -from typing import Dict, Tuple, Union +from typing import Dict, Union -from beet.core.utils import normalize_string from tokenstream import InvalidSyntax, SourceLocation, Token, set_location from .error import MechaError @@ -28,9 +25,6 @@ WHITESPACE_REGEX = re.compile(r"\s+") -VersionNumber = Union[str, int, float, Tuple[Union[str, int], ...]] - - def normalize_whitespace(op: str) -> str: """Replace whitespace with underscores.""" return WHITESPACE_REGEX.sub("_", op).strip("_") @@ -49,15 +43,6 @@ def number_to_string(number: Union[int, float]) -> str: return value -def split_version(version: VersionNumber) -> Tuple[int, ...]: - """Break version number into a tuple of integers.""" - if isinstance(version, (int, float)): - version = str(version) - if isinstance(version, str): - version = tuple(normalize_string(version).split("_")) - return tuple(map(int, version)) - - class InvalidEscapeSequence(MechaError): """Raised when a QuotedStringHandler encounters an invalid escape sequence.""" diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 0c8af0fdd..c3090ce24 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.67.1" +version = "0.68.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -112,7 +112,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -314,36 +314,36 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.21.2" +version = "0.22.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.60.0" -click = ">=8.1.2,<9.0.0" -markdown-it-py = ">=1.1" +beet = ">=0.68.1" +click = ">=8.1.3,<9.0.0" +markdown-it-py = ">=2.1.0,<3.0.0" [[package]] name = "markdown-it-py" -version = "2.0.1" +version = "2.1.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false -python-versions = "~=3.6" +python-versions = ">=3.7" [package.dependencies] -attrs = ">=19,<22" mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] -rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "8ba4cb0f3579e33b922852f5be237f9c5276c10078660c5b277932246815e521" +content-hash = "20698329fd779d1474e12c34a3efbcc7059f2e4679e748b2432e25dc6d1a5194" [metadata.files] atomicwrites = [ @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.67.1-py3-none-any.whl", hash = "sha256:1b849bef4133012f3f058ea7a56a2250b4afd9bc2bdf785c7d381bf3b2a7bca3"}, - {file = "beet-0.67.1.tar.gz", hash = "sha256:cd874be2e4894be467043bebd6477b04ccebb8c52e5d5957db539371dd47c4b2"}, + {file = "beet-0.68.1-py3-none-any.whl", hash = "sha256:49f865161831eab37202f5b74f99e97bafc0c8fc9375032a2bed93fff95e1aab"}, + {file = "beet-0.68.1.tar.gz", hash = "sha256:92fccb6448a64f02fb7c92d2cafa253afc9482b4b0f9bdf1de6344ae4205f05b"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -918,8 +918,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, - {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, @@ -1003,12 +1003,12 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.21.2-py3-none-any.whl", hash = "sha256:ff395bd6ab5fc4851e7f17909f1a7f96f71a8e192529f26ff936ab202361e68d"}, - {file = "lectern-0.21.2.tar.gz", hash = "sha256:515a0bf602bdf90eca64416b05e79292f9137cb32e5a6ab9a1a9f82fa3ab99f0"}, + {file = "lectern-0.22.0-py3-none-any.whl", hash = "sha256:a6e50a770d8d31bfb4499bd6361973752286f0cd4f5d72df08953a464ea1e31b"}, + {file = "lectern-0.22.0.tar.gz", hash = "sha256:4c906ba45caf87021e2b1a0249b235e7bb1584c014c4d4f0f425678d21add874"}, ] markdown-it-py = [ - {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, - {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] markupsafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0acff6133..67094d752 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.67.0" +beet = ">=0.68.1" tokenstream = "1.4.2" [tool.poetry.dev-dependencies] @@ -32,7 +32,7 @@ pytest = "^7.1.2" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" -lectern = ">=0.20.1" +lectern = ">=0.22.0" [tool.poetry.scripts] mecha = "mecha.cli:main" diff --git a/packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md index 25baa77c9..333f6c4d0 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_1_18__0.pack.md @@ -20,3 +20,16 @@ ```mcfunction locate endcity ``` + +## Resource pack + +`@resource_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 8, + "description": "" + } +} +``` diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md index b1a5fdd79..6d5fff4af 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md index 6fef6ccf3..341aeb6ee 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md index fa154562b..d71d091f8 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index 9e63754a4..8229c170f 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md index 739f58af8..22df64992 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md index 65f702993..e91dcb077 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md index f8a2a0714..75185b681 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md index da1e4f9f4..c5811e629 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index 45c4bf83b..36af6d45f 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md index 2e0f0af84..ce4fe1abd 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md index 57f443cb6..d12fc99ab 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md index 14dfa5263..d1c60a211 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md index 22b8b4924..3369b0f56 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md index 2ea73f3d6..075e4c1ef 100644 --- a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md index e1766c5a8..f86686a77 100644 --- a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index c97001a89..108cc2a9f 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } From 502fb3578238ce5b26befaa7c54eebdc7974872d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 00:18:00 +0000 Subject: [PATCH 0892/1554] 0.54.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 394981d1b..ed911aa3e 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.0 (2022-06-18) +### Feature +* Use minecraft version config from beet directly ([`ed3f597`](https://github.com/mcbeet/mecha/commit/ed3f597ed62a38483c014b5e2e2a634ba2949dbf)) + ## v0.53.0 (2022-06-17) ### Feature * Default to minecraft 1.19 ([`f9eda9c`](https://github.com/mcbeet/mecha/commit/f9eda9c63b9346b5b1fc17bd510cab7ab62772e8)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 09565682d..272edbda5 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.53.0" +__version__ = "0.54.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 67094d752..ec6701469 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.53.0" +version = "0.54.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5ceab7dc1547a7951e7c6d0b73670e1c2f48d597 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 04:09:22 +0200 Subject: [PATCH 0893/1554] fix: make redirects conditional --- packages/mecha/mecha/parse.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index e5619c2d0..ab6e9e638 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -655,7 +655,10 @@ def parse_command(stream: TokenStream) -> AstCommand: if tree.executable and (not stream.peek() or stream.get("newline", "eof")): break subcommand_scope = tree.redirect if tree.redirect is not None else scope - with stream.provide(scope=subcommand_scope, line_indentation=level): + with stream.alternative(bool(target and target.children)), stream.provide( + scope=subcommand_scope, + line_indentation=level, + ): node = delegate("command", stream) arguments.append(node) end_location = node.end_location From b8b72b527bf2598b460e60395d089ed28a1081cf Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 02:10:04 +0000 Subject: [PATCH 0894/1554] 0.54.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index ed911aa3e..eddb76a7e 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.1 (2022-06-18) +### Fix +* Make redirects conditional ([`a0046bf`](https://github.com/mcbeet/mecha/commit/a0046bf9e4dc64edd9cde51f759bcfa5123fe4fe)) + ## v0.54.0 (2022-06-18) ### Feature * Use minecraft version config from beet directly ([`ed3f597`](https://github.com/mcbeet/mecha/commit/ed3f597ed62a38483c014b5e2e2a634ba2949dbf)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 272edbda5..b460aafff 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.0" +__version__ = "0.54.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ec6701469..0a4963b3d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.0" +version = "0.54.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From a66f3b47af0ae98280276220ff3808c3bf1e5e81 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 04:21:37 +0200 Subject: [PATCH 0895/1554] feat: add context managers --- packages/bolt/bolt/codegen.py | 37 + packages/bolt/bolt/parse.py | 50 +- packages/bolt/bolt/resources/commands.json | 34 + .../src/data/demo/functions/foo.mcfunction | 29 +- packages/bolt/poetry.lock | 36 +- packages/bolt/pyproject.toml | 6 +- packages/bolt/tests/conftest.py | 14 + .../tests/resources/bolt_examples.mcfunction | 18 +- .../tests/snapshots/bolt__parse_210__0.txt | 3 +- .../tests/snapshots/bolt__parse_211__0.txt | 72 + .../tests/snapshots/bolt__parse_211__1.txt | 50 + .../tests/snapshots/bolt__parse_212__0.txt | 7 + .../tests/snapshots/bolt__parse_213__0.txt | 5 + .../tests/snapshots/bolt__parse_214__0.txt | 5 + .../tests/snapshots/bolt__parse_215__0.txt | 49 + .../tests/snapshots/bolt__parse_215__1.txt | 19 + .../tests/snapshots/bolt__parse_216__0.txt | 59 + .../tests/snapshots/bolt__parse_216__1.txt | 21 + .../tests/snapshots/bolt__parse_98__0.txt | 7 +- .../tests/snapshots/bolt__parse_99__0.txt | 2 +- .../examples__build_bolt_basic__0.pack.md | 21 +- .../examples__build_bolt_chicken__0.pack.md | 2 +- .../examples__build_bolt_circular__0.pack.md | 2 +- .../examples__build_bolt_debug__0.pack.md | 2 +- .../examples__build_bolt_flat__0.pack.md | 2 +- .../examples__build_bolt_generated__0.pack.md | 2 +- .../examples__build_bolt_merge__0.pack.md | 2 +- ...mples__build_bolt_shadow_global__0.pack.md | 2 +- .../tests/snapshots/spec__prototypes__0.json | 1810 +++++++++++++++++ packages/bolt/tests/test_bolt.py | 14 +- packages/bolt/tests/test_sandbox.py | 8 +- packages/bolt/tests/test_spec.py | 8 + 32 files changed, 2303 insertions(+), 95 deletions(-) create mode 100644 packages/bolt/tests/conftest.py create mode 100644 packages/bolt/tests/snapshots/bolt__parse_211__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_211__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_212__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_213__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_214__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_215__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_215__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_216__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_216__1.txt create mode 100644 packages/bolt/tests/snapshots/spec__prototypes__0.json create mode 100644 packages/bolt/tests/test_spec.py diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index bc1e84e1f..fd9538b8b 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -56,6 +56,7 @@ AstList, AstLookup, AstSlice, + AstTarget, AstTargetAttribute, AstTargetIdentifier, AstTargetItem, @@ -570,6 +571,42 @@ def continue_statement( acc.statement("continue") return [] + @rule(AstCommand, identifier="with:subcommand") + def with_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + clauses: List[str] = [] + bindings: List[Tuple[str, AstTarget]] = [] + + subcommand = cast(AstCommand, node.arguments[0]) + body: Optional[AstNode] = None + + while not body: + value = yield from visit_single(subcommand.arguments[0], required=True) + + if isinstance(target := subcommand.arguments[1], AstTarget): + tmp = f"_bolt_with{len(bindings)}" + clauses.append(f"{value} as {tmp}") + bindings.append((tmp, target)) + else: + clauses.append(value) + + last_arg = subcommand.arguments[-1] + if isinstance(last_arg, AstRoot): + body = last_arg + elif isinstance(last_arg, AstCommand): + subcommand = last_arg + + acc.statement(f"with {', '.join(clauses)}:", lineno=node) + with acc.block(): + for tmp, target in bindings: + yield from visit_binding(target, "=", tmp, acc) + yield from visit_body(body, acc) + + return [] + @rule(AstCommand, identifier="import:module") @rule(AstCommand, identifier="import:module:as:alias") @rule(AstCommand, identifier="from:module:import:subcommand") diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 900bfcab9..791be6097 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -7,7 +7,6 @@ "get_stream_branch_scope", "UndefinedIdentifier", "create_bolt_root_parser", - "ExecuteIfConditionConstraint", "BranchScopeManager", "check_final_expression", "InterpolationParser", @@ -21,6 +20,7 @@ "parse_function_root", "parse_del_target", "parse_identifier", + "TrailingCommaParser", "ImportLocationConstraint", "ImportStatementHandler", "parse_python_import", @@ -48,7 +48,6 @@ from difflib import get_close_matches from typing import Any, Dict, List, Optional, Set, Tuple, cast -from beet.core.utils import required_field from mecha import ( AlternativeParser, AstChildren, @@ -128,9 +127,7 @@ def get_bolt_parsers( "root": create_bolt_root_parser(parsers["root"]), "nested_root": create_bolt_root_parser(parsers["nested_root"]), "command": UndefinedIdentifierErrorHandler( - ImportStatementHandler( - GlobalNonlocalHandler(ExecuteIfConditionConstraint(parsers["command"])) - ) + ImportStatementHandler(GlobalNonlocalHandler(parsers["command"])) ), "command:argument:bolt:if_block": delegate("bolt:if_block"), "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), @@ -138,6 +135,8 @@ def get_bolt_parsers( "command:argument:bolt:else_block": delegate("bolt:else_block"), "command:argument:bolt:statement": delegate("bolt:statement"), "command:argument:bolt:assignment_target": delegate("bolt:assignment_target"), + "command:argument:bolt:with_expression": delegate("bolt:with_expression"), + "command:argument:bolt:with_target": delegate("bolt:with_target"), "command:argument:bolt:import": delegate("bolt:import"), "command:argument:bolt:import_name": delegate("bolt:import_name"), "command:argument:bolt:global_name": delegate("bolt:global_name"), @@ -178,13 +177,17 @@ def get_bolt_parsers( "bolt:del_target": parse_del_target, "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), "bolt:identifier": parse_identifier, + "bolt:with_expression": TrailingCommaParser(delegate("bolt:expression")), + "bolt:with_target": TrailingCommaParser( + AssignmentTargetParser(allow_undefined_identifiers=True) + ), "bolt:import": AlternativeParser( [ ImportLocationConstraint(parsers["resource_location_or_tag"]), parse_python_import, ] ), - "bolt:import_name": parse_import_name, + "bolt:import_name": TrailingCommaParser(parse_import_name), "bolt:global_name": parse_name_list, "bolt:nonlocal_name": parse_name_list, "bolt:expression": delegate("bolt:disjunction"), @@ -432,21 +435,6 @@ def create_bolt_root_parser(parser: Parser): ) -@dataclass -class ExecuteIfConditionConstraint: - """Constraint that prevents inlining if conditions as execute subcommands.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - if isinstance(node := self.parser(stream), AstCommand): - if node.identifier == "execute:if:condition:body": - exc = InvalidSyntax("Can't inline conditions as execute subcommands.") - raise set_location(exc, node) - - return node - - @dataclass class BranchScopeManager: """Parser that manages accessible identifiers for conditional branches.""" @@ -626,7 +614,7 @@ def parse_decorator(stream: TokenStream) -> Any: class DecoratorResolver: """Parser for resolving decorators.""" - parser: Parser = required_field() + parser: Parser def __call__(self, stream: TokenStream) -> AstRoot: node: AstRoot = self.parser(stream) @@ -931,6 +919,19 @@ def parse_identifier(stream: TokenStream) -> AstIdentifier: return set_location(AstIdentifier(value=token.value), token) +@dataclass +class TrailingCommaParser: + """Parser for discarding trailing comma.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + with stream.syntax(comma=r","): + stream.get("comma") + return node + + @dataclass class ImportLocationConstraint: """Constraint for import location.""" @@ -996,9 +997,8 @@ def parse_python_import(stream: TokenStream) -> Any: def parse_import_name(stream: TokenStream) -> AstImportedIdentifier: """Parse import name.""" - with stream.syntax(name=IDENTIFIER_PATTERN, comma=r","): + with stream.syntax(name=IDENTIFIER_PATTERN): token = stream.expect("name") - stream.get("comma") return set_location(AstImportedIdentifier(value=token.value), token) @@ -1041,7 +1041,7 @@ def parse_name_list(stream: TokenStream) -> AstIdentifier: class FunctionRootBacktracker: """Parser for backtracking over function root nodes.""" - parser: Parser = required_field() + parser: Parser def __call__(self, stream: TokenStream) -> AstRoot: should_replace = False diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 89f607c1a..c52e257df 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -158,6 +158,40 @@ "type": "literal", "executable": true }, + "with": { + "type": "literal", + "children": { + "expression": { + "type": "argument", + "parser": "bolt:with_expression", + "redirect": ["with"], + "children": { + "as": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "parser": "bolt:with_target", + "redirect": ["with"], + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + }, + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + } + } + } + } + }, "import": { "type": "literal", "children": { diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 4d2057883..a59c6147c 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -381,15 +381,15 @@ x = 12 y = 23 z = 34 -tp @s f"~{x} ~{y} ~{z}" -tp @s f"~{x}" y f"~{z}" +setblock f"~{x} ~{y} ~{z}" stone +setblock f"~{x}" y f"~{z}" stone -tp @s x y z -tp @s ~x ~y ~z -tp @s ^x ^y ^z -tp @s -x -y -z -tp @s ~-x ~-y ~-z -tp @s ^-x ^-y ^-z +setblock x y z stone +setblock ~x ~y ~z stone +setblock ^x ^y ^z stone +setblock -x -y -z stone +setblock ~-x ~-y ~-z stone +setblock ^-x ^-y ^-z stone for i, x in enumerate("abc"): say f"{i} {x}" @@ -638,3 +638,16 @@ def testing_decorator(f): ]) or None def f(x): say f"inner {x}" + +from contextlib import suppress + +with suppress(ZeroDivisionError): + 1 / 0 + +from bolt import Runtime +runtime = ctx.inject(Runtime) + +with runtime.scope() as commands: + tellraw @p "hello" + +say commands[0] diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 6fac9602e..fd89c2ee1 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.67.0" +version = "0.68.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -314,16 +314,16 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.21.2" +version = "0.22.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.60.0" -click = ">=8.1.2,<9.0.0" -markdown-it-py = ">=1.1" +beet = ">=0.68.1" +click = ">=8.1.3,<9.0.0" +markdown-it-py = ">=2.1.0,<3.0.0" [[package]] name = "markdown-it-py" @@ -364,15 +364,15 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.52.2" +version = "0.54.1" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.67.0" -tokenstream = "1.4.1" +beet = ">=0.68.1" +tokenstream = "1.4.2" [[package]] name = "mypy-extensions" @@ -706,7 +706,7 @@ python-versions = ">=3.6" [[package]] name = "tokenstream" -version = "1.4.1" +version = "1.4.2" description = "A versatile token stream for handwritten parsers" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0727ac01b0e41167696ac756a365d64f3146f93c7472abe1cebd87a072d0aa7b" +content-hash = "dac87c089627cdbfb400346ad7a112f10c6441d4f286f59ed318a523ae39b590" [metadata.files] atomicwrites = [ @@ -837,8 +837,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.67.0-py3-none-any.whl", hash = "sha256:4e44e7278be50ebd8dec697e411ccdc377a24308e21cdb197f071dfbe1e1cde7"}, - {file = "beet-0.67.0.tar.gz", hash = "sha256:f6796b7a8e8241aabbbf5b7e15403e87645055b4ec952bb9cfc0a5c0ba52d48d"}, + {file = "beet-0.68.1-py3-none-any.whl", hash = "sha256:49f865161831eab37202f5b74f99e97bafc0c8fc9375032a2bed93fff95e1aab"}, + {file = "beet-0.68.1.tar.gz", hash = "sha256:92fccb6448a64f02fb7c92d2cafa253afc9482b4b0f9bdf1de6344ae4205f05b"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1017,8 +1017,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.21.2-py3-none-any.whl", hash = "sha256:ff395bd6ab5fc4851e7f17909f1a7f96f71a8e192529f26ff936ab202361e68d"}, - {file = "lectern-0.21.2.tar.gz", hash = "sha256:515a0bf602bdf90eca64416b05e79292f9137cb32e5a6ab9a1a9f82fa3ab99f0"}, + {file = "lectern-0.22.0-py3-none-any.whl", hash = "sha256:a6e50a770d8d31bfb4499bd6361973752286f0cd4f5d72df08953a464ea1e31b"}, + {file = "lectern-0.22.0.tar.gz", hash = "sha256:4c906ba45caf87021e2b1a0249b235e7bb1584c014c4d4f0f425678d21add874"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.52.2-py3-none-any.whl", hash = "sha256:69a49ec9273699d340eb4d8e63395f885437753b3503bec0eba5312f7303c52b"}, - {file = "mecha-0.52.2.tar.gz", hash = "sha256:c16cb38435710d249ec9dd1b277e875c446d39b6b48a2e7cf4390e821449392e"}, + {file = "mecha-0.54.1-py3-none-any.whl", hash = "sha256:e3ab536a1d98fd550f9552113c1fc062706309fe8a46e070f09c633dc092dca8"}, + {file = "mecha-0.54.1.tar.gz", hash = "sha256:85100af58169db44d7ca653675f545307cd27dbf4940166cedc78163f6ada38d"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1269,8 +1269,8 @@ smmap = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] tokenstream = [ - {file = "tokenstream-1.4.1-py3-none-any.whl", hash = "sha256:66b42b059e1bda1b88dc54b63f4de935e1e8e2f1f746e06d5323e694d10d38fa"}, - {file = "tokenstream-1.4.1.tar.gz", hash = "sha256:a3e65dea39ca75a3cbe68880f325cd65a0b957f952137bc8bd2eeca8b4a44df7"}, + {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, + {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index c84d123e3..70f66358e 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.67.0" -mecha = ">=0.52.2" +beet = ">=0.68.1" +mecha = ">=0.54.1" [tool.poetry.dev-dependencies] pytest = "^7.1.2" @@ -32,7 +32,7 @@ black = "^22.3.0" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" -lectern = ">=0.21.2" +lectern = ">=0.22.0" [tool.pytest.ini_options] addopts = "tests bolt --doctest-modules" diff --git a/packages/bolt/tests/conftest.py b/packages/bolt/tests/conftest.py new file mode 100644 index 000000000..e9fedc85a --- /dev/null +++ b/packages/bolt/tests/conftest.py @@ -0,0 +1,14 @@ +import pytest +from beet import run_beet + + +@pytest.fixture(scope="session") +def ctx(): + with run_beet({"require": ["bolt"]}) as ctx: + yield ctx + + +@pytest.fixture(scope="session") +def ctx_sandbox(): + with run_beet({"require": ["bolt.contrib.sandbox"]}) as ctx: + yield ctx diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 2ed4d0d86..654995529 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -783,4 +783,20 @@ def testing_decorator(): @testing_decorator @testing_decorator(1) def f(): - pass \ No newline at end of file + pass +### +with open("README.md") as f: + tellraw @p f.readline() +### +with: + pass +### +with None: +### +with None as: +### +with None, None, None: + pass +### +with None as x, None, None as y: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_210__0.txt b/packages/bolt/tests/snapshots/bolt__parse_210__0.txt index 2b3343023..f9768f6fa 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_210__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_210__0.txt @@ -4,7 +4,8 @@ def testing_decorator(): @testing_decorator @testing_decorator(1) def f(): - pass--- + pass +--- location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=93, lineno=7, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_211__0.txt b/packages/bolt/tests/snapshots/bolt__parse_211__0.txt new file mode 100644 index 000000000..b15685018 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_211__0.txt @@ -0,0 +1,72 @@ +with open("README.md") as f: + tellraw @p f.readline() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + identifier: 'with:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + identifier: 'with:expression:as:target:body' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'open' + arguments: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'README.md' + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=27, lineno=1, colno=28) + value: 'f' + rebind: False + + location: SourceLocation(pos=33, lineno=2, colno=5) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + commands: + + location: SourceLocation(pos=33, lineno=2, colno=5) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + identifier: 'tellraw:targets:message' + arguments: + + location: SourceLocation(pos=41, lineno=2, colno=13) + end_location: SourceLocation(pos=43, lineno=2, colno=15) + variable: 'p' + arguments: + + + location: SourceLocation(pos=44, lineno=2, colno=16) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + prefix: None + unpack: None + converter: 'json' + value: + + location: SourceLocation(pos=44, lineno=2, colno=16) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + value: + + location: SourceLocation(pos=44, lineno=2, colno=16) + end_location: SourceLocation(pos=54, lineno=2, colno=26) + name: 'readline' + value: + + location: SourceLocation(pos=44, lineno=2, colno=16) + end_location: SourceLocation(pos=45, lineno=2, colno=17) + value: 'f' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_211__1.txt b/packages/bolt/tests/snapshots/bolt__parse_211__1.txt new file mode 100644 index 000000000..8f83f887b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_211__1.txt @@ -0,0 +1,50 @@ +_bolt_lineno = [1, 12], [1, 2] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_json = _bolt_runtime.helpers['interpolate_json'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = open + _bolt_var1 = 'README.md' + _bolt_var0 = _bolt_var0(_bolt_var1) + with _bolt_var0 as _bolt_with0: + f = _bolt_with0 + _bolt_var2 = f + _bolt_var2 = _bolt_helper_get_attribute(_bolt_var2, 'readline') + _bolt_var2 = _bolt_var2() + _bolt_var2 = _bolt_helper_interpolate_json(_bolt_var2, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var2]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=44, lineno=2, colno=16) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + prefix: None + unpack: None + converter: 'json' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=41, lineno=2, colno=13) + end_location: SourceLocation(pos=43, lineno=2, colno=15) + variable: 'p' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=33, lineno=2, colno=5) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + identifier: 'tellraw:targets:message' + arguments: + + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=2, colno=28) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_212__0.txt b/packages/bolt/tests/snapshots/bolt__parse_212__0.txt new file mode 100644 index 000000000..e193b4448 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_212__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got invalid ':'. +# line 1, column 5 +# 1 | with: +# : ^ +# 2 | pass +with: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_213__0.txt b/packages/bolt/tests/snapshots/bolt__parse_213__0.txt new file mode 100644 index 000000000..df5e8b2a3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_213__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected non-empty block. +# line 1, column 10 +# 1 | with None: +# : ^ +with None: diff --git a/packages/bolt/tests/snapshots/bolt__parse_214__0.txt b/packages/bolt/tests/snapshots/bolt__parse_214__0.txt new file mode 100644 index 000000000..733619508 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_214__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected identifier but got invalid ':'. +# line 1, column 13 +# 1 | with None as: +# : ^ +with None as: diff --git a/packages/bolt/tests/snapshots/bolt__parse_215__0.txt b/packages/bolt/tests/snapshots/bolt__parse_215__0.txt new file mode 100644 index 000000000..87158f33b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_215__0.txt @@ -0,0 +1,49 @@ +with None, None, None: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'with:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'with:expression:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: None + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'with:expression:subcommand' + arguments: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: None + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'with:expression:body' + arguments: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: None + + location: SourceLocation(pos=27, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=27, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_215__1.txt b/packages/bolt/tests/snapshots/bolt__parse_215__1.txt new file mode 100644 index 000000000..1d4786a10 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_215__1.txt @@ -0,0 +1,19 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = None + _bolt_var1 = None + _bolt_var2 = None + with _bolt_var0, _bolt_var1, _bolt_var2: + pass +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=32, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_216__0.txt b/packages/bolt/tests/snapshots/bolt__parse_216__0.txt new file mode 100644 index 000000000..46ffeedc9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_216__0.txt @@ -0,0 +1,59 @@ +with None as x, None, None as y: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=2, colno=9) + identifier: 'with:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=41, lineno=2, colno=9) + identifier: 'with:expression:as:target:subcommand' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: None + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'x' + rebind: False + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=41, lineno=2, colno=9) + identifier: 'with:expression:subcommand' + arguments: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: None + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=41, lineno=2, colno=9) + identifier: 'with:expression:as:target:body' + arguments: + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + value: None + + location: SourceLocation(pos=30, lineno=1, colno=31) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 'y' + rebind: False + + location: SourceLocation(pos=37, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=37, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_216__1.txt b/packages/bolt/tests/snapshots/bolt__parse_216__1.txt new file mode 100644 index 000000000..50a4436af --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_216__1.txt @@ -0,0 +1,21 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = None + _bolt_var1 = None + _bolt_var2 = None + with _bolt_var0 as _bolt_with0, _bolt_var1, _bolt_var2 as _bolt_with1: + x = _bolt_with0 + y = _bolt_with1 + pass +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_98__0.txt b/packages/bolt/tests/snapshots/bolt__parse_98__0.txt index 21de2a29e..3fc75c2b2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_98__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_98__0.txt @@ -1,8 +1,7 @@ -#>ERROR Can't inline conditions as execute subcommands. -# line 1, column 7 +#>ERROR Expected literal 'block', literal 'blocks', literal 'data', literal 'entity', literal 'predicate' or literal 'score' but got literal '"foo"'. +# line 1, column 10 # 1 | at @s if "foo" == "bar": -# : ^^^^^^^^^^^^^^^^^^ +# : ^^^^^ # 2 | say yolo -# : ^^^^^^^^ at @s if "foo" == "bar": say yolo diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt index fc6c39b78..7a5b94b89 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 122 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 139870038..5b507bf12 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } @@ -198,14 +198,14 @@ execute at @s run particle minecraft:block minecraft:light_blue_concrete ~ ~1 ~ execute as @a[scores={foo=1..}] run scoreboard players remove @s foo 1 execute as @a[scores={bar=1..}] run scoreboard players remove @s bar 1 scoreboard players set @p tmp -8 -tp @s ~12 ~23 ~34 -tp @s ~12 23 ~34 -tp @s 12 23 34 -tp @s ~12 ~23 ~34 -tp @s ^12 ^23 ^34 -tp @s -12 -23 -34 -tp @s ~-12 ~-23 ~-34 -tp @s ^-12 ^-23 ^-34 +setblock ~12 ~23 ~34 stone +setblock ~12 23 ~34 stone +setblock 12 23 34 stone +setblock ~12 ~23 ~34 stone +setblock ^12 ^23 ^34 stone +setblock -12 -23 -34 stone +setblock ~-12 ~-23 ~-34 stone +setblock ^-12 ^-23 ^-34 stone say 0 a say 1 b say 2 c @@ -266,6 +266,7 @@ say inner dummy say dummy say dummy say dummy +say AstCommand(identifier='tellraw:targets:message', arguments=AstChildren((AstSelector(variable='p', arguments=AstChildren(())), AstJsonValue(value='hello')))) ``` `@function demo:import_a` @@ -638,7 +639,7 @@ say json loaded! ```json { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md index 341f5246b..4574e9c36 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md index 77be4cb9c..5de9576b4 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md index 29325227e..324d811d4 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md index 68ebbe0a3..50b6417b4 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md index a9fc9a91a..243a4cb77 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md index cfb90a622..a1c852406 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md index 9b3620f61..d281a94ab 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 9, + "pack_format": 10, "description": "" } } diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json new file mode 100644 index 000000000..6ef837800 --- /dev/null +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -0,0 +1,1810 @@ +[ + "advancement:grant:targets:everything", + "advancement:grant:targets:from:advancement", + "advancement:grant:targets:only:advancement", + "advancement:grant:targets:only:advancement:criterion", + "advancement:grant:targets:through:advancement", + "advancement:grant:targets:until:advancement", + "advancement:name:content", + "advancement:revoke:targets:everything", + "advancement:revoke:targets:from:advancement", + "advancement:revoke:targets:only:advancement", + "advancement:revoke:targets:only:advancement:criterion", + "advancement:revoke:targets:through:advancement", + "advancement:revoke:targets:until:advancement", + "align:axes:subcommand", + "anchored:anchor:subcommand", + "append:block_tag:name:content", + "append:entity_type_tag:name:content", + "append:fluid_tag:name:content", + "append:function:name:commands", + "append:function_tag:name:content", + "append:game_event_tag:name:content", + "append:item_tag:name:content", + "append:worldgen_biome_tag:name:content", + "append:worldgen_configured_carver_tag:name:content", + "append:worldgen_configured_structure_feature_tag:name:content", + "append:worldgen_placed_feature_tag:name:content", + "append:worldgen_structure_set_tag:name:content", + "as:targets:subcommand", + "at:targets:subcommand", + "attribute:target:attribute:base:get", + "attribute:target:attribute:base:get:scale", + "attribute:target:attribute:base:set:value", + "attribute:target:attribute:get", + "attribute:target:attribute:get:scale", + "attribute:target:attribute:modifier:add:uuid:name:value:add", + "attribute:target:attribute:modifier:add:uuid:name:value:multiply", + "attribute:target:attribute:modifier:add:uuid:name:value:multiply_base", + "attribute:target:attribute:modifier:remove:uuid", + "attribute:target:attribute:modifier:value:get:uuid", + "attribute:target:attribute:modifier:value:get:uuid:scale", + "ban-ip:target", + "ban-ip:target:reason", + "ban:targets", + "ban:targets:reason", + "banlist", + "banlist:ips", + "banlist:players", + "block_tag:name:content", + "blockstate:name:content", + "bossbar:add:id:name", + "bossbar:get:id:max", + "bossbar:get:id:players", + "bossbar:get:id:value", + "bossbar:get:id:visible", + "bossbar:list", + "bossbar:remove:id", + "bossbar:set:id:color:blue", + "bossbar:set:id:color:green", + "bossbar:set:id:color:pink", + "bossbar:set:id:color:purple", + "bossbar:set:id:color:red", + "bossbar:set:id:color:white", + "bossbar:set:id:color:yellow", + "bossbar:set:id:max:max", + "bossbar:set:id:name:name", + "bossbar:set:id:players", + "bossbar:set:id:players:targets", + "bossbar:set:id:style:notched_10", + "bossbar:set:id:style:notched_12", + "bossbar:set:id:style:notched_20", + "bossbar:set:id:style:notched_6", + "bossbar:set:id:style:progress", + "bossbar:set:id:value:value", + "bossbar:set:id:visible:visible", + "break", + "clear", + "clear:targets", + "clear:targets:item", + "clear:targets:item:maxCount", + "clone:begin:end:destination", + "clone:begin:end:destination:filtered:filter", + "clone:begin:end:destination:filtered:filter:force", + "clone:begin:end:destination:filtered:filter:move", + "clone:begin:end:destination:filtered:filter:normal", + "clone:begin:end:destination:masked", + "clone:begin:end:destination:masked:force", + "clone:begin:end:destination:masked:move", + "clone:begin:end:destination:masked:normal", + "clone:begin:end:destination:replace", + "clone:begin:end:destination:replace:force", + "clone:begin:end:destination:replace:move", + "clone:begin:end:destination:replace:normal", + "continue", + "data:get:block:targetPos", + "data:get:block:targetPos:path", + "data:get:block:targetPos:path:scale", + "data:get:entity:target", + "data:get:entity:target:path", + "data:get:entity:target:path:scale", + "data:get:storage:target", + "data:get:storage:target:path", + "data:get:storage:target:path:scale", + "data:merge:block:targetPos:nbt", + "data:merge:entity:target:nbt", + "data:merge:storage:target:nbt", + "data:modify:block:targetPos:targetPath:append:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:append:from:entity:source", + "data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:from:storage:source", + "data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:value:value", + "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:from:entity:source", + "data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:from:storage:source", + "data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:value:value", + "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:entity:source", + "data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:from:storage:source", + "data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:value:value", + "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:from:entity:source", + "data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:from:storage:source", + "data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:value:value", + "data:modify:block:targetPos:targetPath:set:from:block:sourcePos", + "data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:set:from:entity:source", + "data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:from:storage:source", + "data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:value:value", + "data:modify:entity:target:targetPath:append:from:block:sourcePos", + "data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:append:from:entity:source", + "data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:append:from:storage:source", + "data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:value:value", + "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", + "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:insert:index:from:entity:source", + "data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:from:storage:source", + "data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:value:value", + "data:modify:entity:target:targetPath:merge:from:block:sourcePos", + "data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:merge:from:entity:source", + "data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:merge:from:storage:source", + "data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:value:value", + "data:modify:entity:target:targetPath:prepend:from:block:sourcePos", + "data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:prepend:from:entity:source", + "data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:from:storage:source", + "data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:value:value", + "data:modify:entity:target:targetPath:set:from:block:sourcePos", + "data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:set:from:entity:source", + "data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", + "data:modify:entity:target:targetPath:set:from:storage:source", + "data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:value:value", + "data:modify:storage:target:targetPath:append:from:block:sourcePos", + "data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:append:from:entity:source", + "data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:append:from:storage:source", + "data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:value:value", + "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", + "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:insert:index:from:entity:source", + "data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:from:storage:source", + "data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:value:value", + "data:modify:storage:target:targetPath:merge:from:block:sourcePos", + "data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:merge:from:entity:source", + "data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:merge:from:storage:source", + "data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:value:value", + "data:modify:storage:target:targetPath:prepend:from:block:sourcePos", + "data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:prepend:from:entity:source", + "data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:from:storage:source", + "data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:value:value", + "data:modify:storage:target:targetPath:set:from:block:sourcePos", + "data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:set:from:entity:source", + "data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", + "data:modify:storage:target:targetPath:set:from:storage:source", + "data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:set:value:value", + "data:remove:block:targetPos:path", + "data:remove:entity:target:path", + "data:remove:storage:target:path", + "datapack:disable:name", + "datapack:enable:name", + "datapack:enable:name:after:existing", + "datapack:enable:name:before:existing", + "datapack:enable:name:first", + "datapack:enable:name:last", + "datapack:list", + "datapack:list:available", + "datapack:list:enabled", + "debug:function:name", + "debug:start", + "debug:stop", + "def:function:body", + "defaultgamemode:adventure", + "defaultgamemode:creative", + "defaultgamemode:spectator", + "defaultgamemode:survival", + "del", + "del:target", + "deop:targets", + "difficulty", + "difficulty:easy", + "difficulty:hard", + "difficulty:normal", + "difficulty:peaceful", + "dimension:name:content", + "dimension_type:name:content", + "effect:clear", + "effect:clear:targets", + "effect:clear:targets:effect", + "effect:give:targets:effect", + "effect:give:targets:effect:seconds", + "effect:give:targets:effect:seconds:amplifier", + "effect:give:targets:effect:seconds:amplifier:hideParticles", + "elif:condition:body", + "else:body", + "enchant:targets:enchantment", + "enchant:targets:enchantment:level", + "entity_type_tag:name:content", + "execute:advancement:grant:targets:everything", + "execute:advancement:grant:targets:from:advancement", + "execute:advancement:grant:targets:only:advancement", + "execute:advancement:grant:targets:only:advancement:criterion", + "execute:advancement:grant:targets:through:advancement", + "execute:advancement:grant:targets:until:advancement", + "execute:advancement:name:content", + "execute:advancement:revoke:targets:everything", + "execute:advancement:revoke:targets:from:advancement", + "execute:advancement:revoke:targets:only:advancement", + "execute:advancement:revoke:targets:only:advancement:criterion", + "execute:advancement:revoke:targets:through:advancement", + "execute:advancement:revoke:targets:until:advancement", + "execute:align:axes:subcommand", + "execute:anchored:anchor:subcommand", + "execute:append:block_tag:name:content", + "execute:append:entity_type_tag:name:content", + "execute:append:fluid_tag:name:content", + "execute:append:function:name:commands", + "execute:append:function_tag:name:content", + "execute:append:game_event_tag:name:content", + "execute:append:item_tag:name:content", + "execute:append:worldgen_biome_tag:name:content", + "execute:append:worldgen_configured_carver_tag:name:content", + "execute:append:worldgen_configured_structure_feature_tag:name:content", + "execute:append:worldgen_placed_feature_tag:name:content", + "execute:append:worldgen_structure_set_tag:name:content", + "execute:as:targets:subcommand", + "execute:at:targets:subcommand", + "execute:attribute:target:attribute:base:get", + "execute:attribute:target:attribute:base:get:scale", + "execute:attribute:target:attribute:base:set:value", + "execute:attribute:target:attribute:get", + "execute:attribute:target:attribute:get:scale", + "execute:attribute:target:attribute:modifier:add:uuid:name:value:add", + "execute:attribute:target:attribute:modifier:add:uuid:name:value:multiply", + "execute:attribute:target:attribute:modifier:add:uuid:name:value:multiply_base", + "execute:attribute:target:attribute:modifier:remove:uuid", + "execute:attribute:target:attribute:modifier:value:get:uuid", + "execute:attribute:target:attribute:modifier:value:get:uuid:scale", + "execute:ban-ip:target", + "execute:ban-ip:target:reason", + "execute:ban:targets", + "execute:ban:targets:reason", + "execute:banlist:ips", + "execute:banlist:players", + "execute:block_tag:name:content", + "execute:blockstate:name:content", + "execute:bossbar:add:id:name", + "execute:bossbar:get:id:max", + "execute:bossbar:get:id:players", + "execute:bossbar:get:id:value", + "execute:bossbar:get:id:visible", + "execute:bossbar:list", + "execute:bossbar:remove:id", + "execute:bossbar:set:id:color:blue", + "execute:bossbar:set:id:color:green", + "execute:bossbar:set:id:color:pink", + "execute:bossbar:set:id:color:purple", + "execute:bossbar:set:id:color:red", + "execute:bossbar:set:id:color:white", + "execute:bossbar:set:id:color:yellow", + "execute:bossbar:set:id:max:max", + "execute:bossbar:set:id:name:name", + "execute:bossbar:set:id:players", + "execute:bossbar:set:id:players:targets", + "execute:bossbar:set:id:style:notched_10", + "execute:bossbar:set:id:style:notched_12", + "execute:bossbar:set:id:style:notched_20", + "execute:bossbar:set:id:style:notched_6", + "execute:bossbar:set:id:style:progress", + "execute:bossbar:set:id:value:value", + "execute:bossbar:set:id:visible:visible", + "execute:clear:targets", + "execute:clear:targets:item", + "execute:clear:targets:item:maxCount", + "execute:clone:begin:end:destination", + "execute:clone:begin:end:destination:filtered:filter", + "execute:clone:begin:end:destination:filtered:filter:force", + "execute:clone:begin:end:destination:filtered:filter:move", + "execute:clone:begin:end:destination:filtered:filter:normal", + "execute:clone:begin:end:destination:masked", + "execute:clone:begin:end:destination:masked:force", + "execute:clone:begin:end:destination:masked:move", + "execute:clone:begin:end:destination:masked:normal", + "execute:clone:begin:end:destination:replace", + "execute:clone:begin:end:destination:replace:force", + "execute:clone:begin:end:destination:replace:move", + "execute:clone:begin:end:destination:replace:normal", + "execute:commands", + "execute:data:get:block:targetPos", + "execute:data:get:block:targetPos:path", + "execute:data:get:block:targetPos:path:scale", + "execute:data:get:entity:target", + "execute:data:get:entity:target:path", + "execute:data:get:entity:target:path:scale", + "execute:data:get:storage:target", + "execute:data:get:storage:target:path", + "execute:data:get:storage:target:path:scale", + "execute:data:merge:block:targetPos:nbt", + "execute:data:merge:entity:target:nbt", + "execute:data:merge:storage:target:nbt", + "execute:data:modify:block:targetPos:targetPath:append:from:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:append:from:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:from:entity:source", + "execute:data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:from:storage:source", + "execute:data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:value:value", + "execute:data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:from:entity:source", + "execute:data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:from:storage:source", + "execute:data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:value:value", + "execute:data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:from:entity:source", + "execute:data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:from:storage:source", + "execute:data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:value:value", + "execute:data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:from:entity:source", + "execute:data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:from:storage:source", + "execute:data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:value:value", + "execute:data:modify:block:targetPos:targetPath:set:from:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:from:entity:source", + "execute:data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:from:storage:source", + "execute:data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:value:value", + "execute:data:modify:entity:target:targetPath:append:from:block:sourcePos", + "execute:data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:append:from:entity:source", + "execute:data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:append:from:storage:source", + "execute:data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:append:value:value", + "execute:data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", + "execute:data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:from:entity:source", + "execute:data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:from:storage:source", + "execute:data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:value:value", + "execute:data:modify:entity:target:targetPath:merge:from:block:sourcePos", + "execute:data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:from:entity:source", + "execute:data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:from:storage:source", + "execute:data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:value:value", + "execute:data:modify:entity:target:targetPath:prepend:from:block:sourcePos", + "execute:data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:from:entity:source", + "execute:data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:from:storage:source", + "execute:data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:value:value", + "execute:data:modify:entity:target:targetPath:set:from:block:sourcePos", + "execute:data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:set:from:entity:source", + "execute:data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:set:from:storage:source", + "execute:data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:set:value:value", + "execute:data:modify:storage:target:targetPath:append:from:block:sourcePos", + "execute:data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:append:from:entity:source", + "execute:data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:append:from:storage:source", + "execute:data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:append:value:value", + "execute:data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", + "execute:data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:from:entity:source", + "execute:data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:from:storage:source", + "execute:data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:value:value", + "execute:data:modify:storage:target:targetPath:merge:from:block:sourcePos", + "execute:data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:from:entity:source", + "execute:data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:from:storage:source", + "execute:data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:value:value", + "execute:data:modify:storage:target:targetPath:prepend:from:block:sourcePos", + "execute:data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:from:entity:source", + "execute:data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:from:storage:source", + "execute:data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:value:value", + "execute:data:modify:storage:target:targetPath:set:from:block:sourcePos", + "execute:data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:set:from:entity:source", + "execute:data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:set:from:storage:source", + "execute:data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:set:value:value", + "execute:data:remove:block:targetPos:path", + "execute:data:remove:entity:target:path", + "execute:data:remove:storage:target:path", + "execute:datapack:disable:name", + "execute:datapack:enable:name", + "execute:datapack:enable:name:after:existing", + "execute:datapack:enable:name:before:existing", + "execute:datapack:enable:name:first", + "execute:datapack:enable:name:last", + "execute:datapack:list", + "execute:datapack:list:available", + "execute:datapack:list:enabled", + "execute:debug:function:name", + "execute:debug:start", + "execute:debug:stop", + "execute:defaultgamemode:adventure", + "execute:defaultgamemode:creative", + "execute:defaultgamemode:spectator", + "execute:defaultgamemode:survival", + "execute:deop:targets", + "execute:difficulty:easy", + "execute:difficulty:hard", + "execute:difficulty:normal", + "execute:difficulty:peaceful", + "execute:dimension:name:content", + "execute:dimension_type:name:content", + "execute:effect:clear", + "execute:effect:clear:targets", + "execute:effect:clear:targets:effect", + "execute:effect:give:targets:effect", + "execute:effect:give:targets:effect:seconds", + "execute:effect:give:targets:effect:seconds:amplifier", + "execute:effect:give:targets:effect:seconds:amplifier:hideParticles", + "execute:enchant:targets:enchantment", + "execute:enchant:targets:enchantment:level", + "execute:entity_type_tag:name:content", + "execute:expand:commands", + "execute:experience:add:targets:amount", + "execute:experience:add:targets:amount:levels", + "execute:experience:add:targets:amount:points", + "execute:experience:query:targets:levels", + "execute:experience:query:targets:points", + "execute:experience:set:targets:amount", + "execute:experience:set:targets:amount:levels", + "execute:experience:set:targets:amount:points", + "execute:facing:entity:targets:anchor:subcommand", + "execute:facing:pos:subcommand", + "execute:fill:from:to:block", + "execute:fill:from:to:block:destroy", + "execute:fill:from:to:block:hollow", + "execute:fill:from:to:block:keep", + "execute:fill:from:to:block:outline", + "execute:fill:from:to:block:replace", + "execute:fill:from:to:block:replace:filter", + "execute:fluid_tag:name:content", + "execute:font:name:content", + "execute:forceload:add:from", + "execute:forceload:add:from:to", + "execute:forceload:query", + "execute:forceload:query:pos", + "execute:forceload:remove:all", + "execute:forceload:remove:from", + "execute:forceload:remove:from:to", + "execute:function:name", + "execute:function:name:commands", + "execute:function:tag:name", + "execute:function_tag:name:content", + "execute:game_event_tag:name:content", + "execute:gamemode:adventure", + "execute:gamemode:adventure:target", + "execute:gamemode:creative", + "execute:gamemode:creative:target", + "execute:gamemode:spectator", + "execute:gamemode:spectator:target", + "execute:gamemode:survival", + "execute:gamemode:survival:target", + "execute:gamerule:announceAdvancements", + "execute:gamerule:announceAdvancements:value", + "execute:gamerule:commandBlockOutput", + "execute:gamerule:commandBlockOutput:value", + "execute:gamerule:disableElytraMovementCheck", + "execute:gamerule:disableElytraMovementCheck:value", + "execute:gamerule:disableRaids", + "execute:gamerule:disableRaids:value", + "execute:gamerule:doDaylightCycle", + "execute:gamerule:doDaylightCycle:value", + "execute:gamerule:doEntityDrops", + "execute:gamerule:doEntityDrops:value", + "execute:gamerule:doFireTick", + "execute:gamerule:doFireTick:value", + "execute:gamerule:doImmediateRespawn", + "execute:gamerule:doImmediateRespawn:value", + "execute:gamerule:doInsomnia", + "execute:gamerule:doInsomnia:value", + "execute:gamerule:doLimitedCrafting", + "execute:gamerule:doLimitedCrafting:value", + "execute:gamerule:doMobLoot", + "execute:gamerule:doMobLoot:value", + "execute:gamerule:doMobSpawning", + "execute:gamerule:doMobSpawning:value", + "execute:gamerule:doPatrolSpawning", + "execute:gamerule:doPatrolSpawning:value", + "execute:gamerule:doTileDrops", + "execute:gamerule:doTileDrops:value", + "execute:gamerule:doTraderSpawning", + "execute:gamerule:doTraderSpawning:value", + "execute:gamerule:doWardenSpawning", + "execute:gamerule:doWardenSpawning:value", + "execute:gamerule:doWeatherCycle", + "execute:gamerule:doWeatherCycle:value", + "execute:gamerule:drowningDamage", + "execute:gamerule:drowningDamage:value", + "execute:gamerule:fallDamage", + "execute:gamerule:fallDamage:value", + "execute:gamerule:fireDamage", + "execute:gamerule:fireDamage:value", + "execute:gamerule:forgiveDeadPlayers", + "execute:gamerule:forgiveDeadPlayers:value", + "execute:gamerule:freezeDamage", + "execute:gamerule:freezeDamage:value", + "execute:gamerule:keepInventory", + "execute:gamerule:keepInventory:value", + "execute:gamerule:logAdminCommands", + "execute:gamerule:logAdminCommands:value", + "execute:gamerule:maxCommandChainLength", + "execute:gamerule:maxCommandChainLength:value", + "execute:gamerule:maxEntityCramming", + "execute:gamerule:maxEntityCramming:value", + "execute:gamerule:mobGriefing", + "execute:gamerule:mobGriefing:value", + "execute:gamerule:naturalRegeneration", + "execute:gamerule:naturalRegeneration:value", + "execute:gamerule:playersSleepingPercentage", + "execute:gamerule:playersSleepingPercentage:value", + "execute:gamerule:randomTickSpeed", + "execute:gamerule:randomTickSpeed:value", + "execute:gamerule:reducedDebugInfo", + "execute:gamerule:reducedDebugInfo:value", + "execute:gamerule:sendCommandFeedback", + "execute:gamerule:sendCommandFeedback:value", + "execute:gamerule:showDeathMessages", + "execute:gamerule:showDeathMessages:value", + "execute:gamerule:spawnRadius", + "execute:gamerule:spawnRadius:value", + "execute:gamerule:spectatorsGenerateChunks", + "execute:gamerule:spectatorsGenerateChunks:value", + "execute:gamerule:universalAnger", + "execute:gamerule:universalAnger:value", + "execute:give:targets:item", + "execute:give:targets:item:count", + "execute:help:command", + "execute:if:block:pos:block", + "execute:if:block:pos:block:subcommand", + "execute:if:blocks:start:end:destination:all", + "execute:if:blocks:start:end:destination:all:subcommand", + "execute:if:blocks:start:end:destination:masked", + "execute:if:blocks:start:end:destination:masked:subcommand", + "execute:if:data:block:sourcePos:path", + "execute:if:data:block:sourcePos:path:subcommand", + "execute:if:data:entity:source:path", + "execute:if:data:entity:source:path:subcommand", + "execute:if:data:storage:source:path", + "execute:if:data:storage:source:path:subcommand", + "execute:if:entity:entities", + "execute:if:entity:entities:subcommand", + "execute:if:predicate:predicate", + "execute:if:predicate:predicate:subcommand", + "execute:if:score:target:targetObjective:<:source:sourceObjective", + "execute:if:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:<=:source:sourceObjective", + "execute:if:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:=:source:sourceObjective", + "execute:if:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>:source:sourceObjective", + "execute:if:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:>=:source:sourceObjective", + "execute:if:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:if:score:target:targetObjective:matches:range", + "execute:if:score:target:targetObjective:matches:range:subcommand", + "execute:in:dimension:subcommand", + "execute:item:modify:block:pos:slot:modifier", + "execute:item:modify:entity:targets:slot:modifier", + "execute:item:replace:block:pos:slot:from:block:source:sourceSlot", + "execute:item:replace:block:pos:slot:from:block:source:sourceSlot:modifier", + "execute:item:replace:block:pos:slot:from:entity:source:sourceSlot", + "execute:item:replace:block:pos:slot:from:entity:source:sourceSlot:modifier", + "execute:item:replace:block:pos:slot:with:item", + "execute:item:replace:block:pos:slot:with:item:count", + "execute:item:replace:entity:targets:slot:from:block:source:sourceSlot", + "execute:item:replace:entity:targets:slot:from:block:source:sourceSlot:modifier", + "execute:item:replace:entity:targets:slot:from:entity:source:sourceSlot", + "execute:item:replace:entity:targets:slot:from:entity:source:sourceSlot:modifier", + "execute:item:replace:entity:targets:slot:with:item", + "execute:item:replace:entity:targets:slot:with:item:count", + "execute:item_modifier:name:content", + "execute:item_tag:name:content", + "execute:jfr:start", + "execute:jfr:stop", + "execute:kick:targets", + "execute:kick:targets:reason", + "execute:kill:targets", + "execute:language:name:content", + "execute:list:uuids", + "execute:locate:biome:biome", + "execute:locate:poi:poi", + "execute:locate:structure:structure", + "execute:loot:give:players:fish:loot_table:pos", + "execute:loot:give:players:fish:loot_table:pos:mainhand", + "execute:loot:give:players:fish:loot_table:pos:offhand", + "execute:loot:give:players:fish:loot_table:pos:tool", + "execute:loot:give:players:kill:target", + "execute:loot:give:players:loot:loot_table", + "execute:loot:give:players:mine:pos", + "execute:loot:give:players:mine:pos:mainhand", + "execute:loot:give:players:mine:pos:offhand", + "execute:loot:give:players:mine:pos:tool", + "execute:loot:insert:targetPos:fish:loot_table:pos", + "execute:loot:insert:targetPos:fish:loot_table:pos:mainhand", + "execute:loot:insert:targetPos:fish:loot_table:pos:offhand", + "execute:loot:insert:targetPos:fish:loot_table:pos:tool", + "execute:loot:insert:targetPos:kill:target", + "execute:loot:insert:targetPos:loot:loot_table", + "execute:loot:insert:targetPos:mine:pos", + "execute:loot:insert:targetPos:mine:pos:mainhand", + "execute:loot:insert:targetPos:mine:pos:offhand", + "execute:loot:insert:targetPos:mine:pos:tool", + "execute:loot:replace:block:targetPos:slot:count:fish:loot_table:pos", + "execute:loot:replace:block:targetPos:slot:count:fish:loot_table:pos:mainhand", + "execute:loot:replace:block:targetPos:slot:count:fish:loot_table:pos:offhand", + "execute:loot:replace:block:targetPos:slot:count:fish:loot_table:pos:tool", + "execute:loot:replace:block:targetPos:slot:count:kill:target", + "execute:loot:replace:block:targetPos:slot:count:loot:loot_table", + "execute:loot:replace:block:targetPos:slot:count:mine:pos", + "execute:loot:replace:block:targetPos:slot:count:mine:pos:mainhand", + "execute:loot:replace:block:targetPos:slot:count:mine:pos:offhand", + "execute:loot:replace:block:targetPos:slot:count:mine:pos:tool", + "execute:loot:replace:block:targetPos:slot:fish:loot_table:pos", + "execute:loot:replace:block:targetPos:slot:fish:loot_table:pos:mainhand", + "execute:loot:replace:block:targetPos:slot:fish:loot_table:pos:offhand", + "execute:loot:replace:block:targetPos:slot:fish:loot_table:pos:tool", + "execute:loot:replace:block:targetPos:slot:kill:target", + "execute:loot:replace:block:targetPos:slot:loot:loot_table", + "execute:loot:replace:block:targetPos:slot:mine:pos", + "execute:loot:replace:block:targetPos:slot:mine:pos:mainhand", + "execute:loot:replace:block:targetPos:slot:mine:pos:offhand", + "execute:loot:replace:block:targetPos:slot:mine:pos:tool", + "execute:loot:replace:entity:entities:slot:count:fish:loot_table:pos", + "execute:loot:replace:entity:entities:slot:count:fish:loot_table:pos:mainhand", + "execute:loot:replace:entity:entities:slot:count:fish:loot_table:pos:offhand", + "execute:loot:replace:entity:entities:slot:count:fish:loot_table:pos:tool", + "execute:loot:replace:entity:entities:slot:count:kill:target", + "execute:loot:replace:entity:entities:slot:count:loot:loot_table", + "execute:loot:replace:entity:entities:slot:count:mine:pos", + "execute:loot:replace:entity:entities:slot:count:mine:pos:mainhand", + "execute:loot:replace:entity:entities:slot:count:mine:pos:offhand", + "execute:loot:replace:entity:entities:slot:count:mine:pos:tool", + "execute:loot:replace:entity:entities:slot:fish:loot_table:pos", + "execute:loot:replace:entity:entities:slot:fish:loot_table:pos:mainhand", + "execute:loot:replace:entity:entities:slot:fish:loot_table:pos:offhand", + "execute:loot:replace:entity:entities:slot:fish:loot_table:pos:tool", + "execute:loot:replace:entity:entities:slot:kill:target", + "execute:loot:replace:entity:entities:slot:loot:loot_table", + "execute:loot:replace:entity:entities:slot:mine:pos", + "execute:loot:replace:entity:entities:slot:mine:pos:mainhand", + "execute:loot:replace:entity:entities:slot:mine:pos:offhand", + "execute:loot:replace:entity:entities:slot:mine:pos:tool", + "execute:loot:spawn:targetPos:fish:loot_table:pos", + "execute:loot:spawn:targetPos:fish:loot_table:pos:mainhand", + "execute:loot:spawn:targetPos:fish:loot_table:pos:offhand", + "execute:loot:spawn:targetPos:fish:loot_table:pos:tool", + "execute:loot:spawn:targetPos:kill:target", + "execute:loot:spawn:targetPos:loot:loot_table", + "execute:loot:spawn:targetPos:mine:pos", + "execute:loot:spawn:targetPos:mine:pos:mainhand", + "execute:loot:spawn:targetPos:mine:pos:offhand", + "execute:loot:spawn:targetPos:mine:pos:tool", + "execute:loot_table:name:content", + "execute:me:action", + "execute:merge:advancement:name:content", + "execute:merge:block_tag:name:content", + "execute:merge:blockstate:name:content", + "execute:merge:dimension:name:content", + "execute:merge:dimension_type:name:content", + "execute:merge:entity_type_tag:name:content", + "execute:merge:fluid_tag:name:content", + "execute:merge:font:name:content", + "execute:merge:function_tag:name:content", + "execute:merge:game_event_tag:name:content", + "execute:merge:item_modifier:name:content", + "execute:merge:item_tag:name:content", + "execute:merge:language:name:content", + "execute:merge:loot_table:name:content", + "execute:merge:model:name:content", + "execute:merge:particle_file:name:content", + "execute:merge:predicate:name:content", + "execute:merge:recipe:name:content", + "execute:merge:shader:name:content", + "execute:merge:shader_post:name:content", + "execute:merge:texture_mcmeta:name:content", + "execute:merge:worldgen_biome:name:content", + "execute:merge:worldgen_biome_tag:name:content", + "execute:merge:worldgen_configured_carver:name:content", + "execute:merge:worldgen_configured_carver_tag:name:content", + "execute:merge:worldgen_configured_feature:name:content", + "execute:merge:worldgen_configured_structure_feature:name:content", + "execute:merge:worldgen_configured_structure_feature_tag:name:content", + "execute:merge:worldgen_configured_surface_builder:name:content", + "execute:merge:worldgen_density_function:name:content", + "execute:merge:worldgen_noise:name:content", + "execute:merge:worldgen_noise_settings:name:content", + "execute:merge:worldgen_placed_feature:name:content", + "execute:merge:worldgen_placed_feature_tag:name:content", + "execute:merge:worldgen_processor_list:name:content", + "execute:merge:worldgen_structure_set:name:content", + "execute:merge:worldgen_structure_set_tag:name:content", + "execute:merge:worldgen_template_pool:name:content", + "execute:model:name:content", + "execute:msg:targets:message", + "execute:op:targets", + "execute:pardon-ip:target", + "execute:pardon:targets", + "execute:particle:name", + "execute:particle:name:pos", + "execute:particle:name:pos:delta:speed:count", + "execute:particle:name:pos:delta:speed:count:force", + "execute:particle:name:pos:delta:speed:count:force:viewers", + "execute:particle:name:pos:delta:speed:count:normal", + "execute:particle:name:pos:delta:speed:count:normal:viewers", + "execute:particle_file:name:content", + "execute:perf:start", + "execute:perf:stop", + "execute:place:feature:feature", + "execute:place:feature:feature:pos", + "execute:place:jigsaw:pool:target:max_depth", + "execute:place:jigsaw:pool:target:max_depth:position", + "execute:place:structure:structure", + "execute:place:structure:structure:pos", + "execute:place:template:template", + "execute:place:template:template:pos", + "execute:place:template:template:pos:rotation", + "execute:place:template:template:pos:rotation:mirror", + "execute:place:template:template:pos:rotation:mirror:integrity", + "execute:place:template:template:pos:rotation:mirror:integrity:seed", + "execute:playsound:sound:ambient:targets", + "execute:playsound:sound:ambient:targets:pos", + "execute:playsound:sound:ambient:targets:pos:volume", + "execute:playsound:sound:ambient:targets:pos:volume:pitch", + "execute:playsound:sound:ambient:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:block:targets", + "execute:playsound:sound:block:targets:pos", + "execute:playsound:sound:block:targets:pos:volume", + "execute:playsound:sound:block:targets:pos:volume:pitch", + "execute:playsound:sound:block:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:hostile:targets", + "execute:playsound:sound:hostile:targets:pos", + "execute:playsound:sound:hostile:targets:pos:volume", + "execute:playsound:sound:hostile:targets:pos:volume:pitch", + "execute:playsound:sound:hostile:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:master:targets", + "execute:playsound:sound:master:targets:pos", + "execute:playsound:sound:master:targets:pos:volume", + "execute:playsound:sound:master:targets:pos:volume:pitch", + "execute:playsound:sound:master:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:music:targets", + "execute:playsound:sound:music:targets:pos", + "execute:playsound:sound:music:targets:pos:volume", + "execute:playsound:sound:music:targets:pos:volume:pitch", + "execute:playsound:sound:music:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:neutral:targets", + "execute:playsound:sound:neutral:targets:pos", + "execute:playsound:sound:neutral:targets:pos:volume", + "execute:playsound:sound:neutral:targets:pos:volume:pitch", + "execute:playsound:sound:neutral:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:player:targets", + "execute:playsound:sound:player:targets:pos", + "execute:playsound:sound:player:targets:pos:volume", + "execute:playsound:sound:player:targets:pos:volume:pitch", + "execute:playsound:sound:player:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:record:targets", + "execute:playsound:sound:record:targets:pos", + "execute:playsound:sound:record:targets:pos:volume", + "execute:playsound:sound:record:targets:pos:volume:pitch", + "execute:playsound:sound:record:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:voice:targets", + "execute:playsound:sound:voice:targets:pos", + "execute:playsound:sound:voice:targets:pos:volume", + "execute:playsound:sound:voice:targets:pos:volume:pitch", + "execute:playsound:sound:voice:targets:pos:volume:pitch:minVolume", + "execute:playsound:sound:weather:targets", + "execute:playsound:sound:weather:targets:pos", + "execute:playsound:sound:weather:targets:pos:volume", + "execute:playsound:sound:weather:targets:pos:volume:pitch", + "execute:playsound:sound:weather:targets:pos:volume:pitch:minVolume", + "execute:positioned:as:targets:subcommand", + "execute:positioned:pos:subcommand", + "execute:predicate:name:content", + "execute:prepend:block_tag:name:content", + "execute:prepend:entity_type_tag:name:content", + "execute:prepend:fluid_tag:name:content", + "execute:prepend:function:name:commands", + "execute:prepend:function_tag:name:content", + "execute:prepend:game_event_tag:name:content", + "execute:prepend:item_tag:name:content", + "execute:prepend:worldgen_biome_tag:name:content", + "execute:prepend:worldgen_configured_carver_tag:name:content", + "execute:prepend:worldgen_configured_structure_feature_tag:name:content", + "execute:prepend:worldgen_placed_feature_tag:name:content", + "execute:prepend:worldgen_structure_set_tag:name:content", + "execute:publish:port", + "execute:recipe:give:targets:*", + "execute:recipe:give:targets:recipe", + "execute:recipe:name:content", + "execute:recipe:take:targets:*", + "execute:recipe:take:targets:recipe", + "execute:rotated:as:targets:subcommand", + "execute:rotated:rot:subcommand", + "execute:run:subcommand", + "execute:save-all:flush", + "execute:say:message", + "execute:schedule:clear:function", + "execute:schedule:function:function:time", + "execute:schedule:function:function:time:append", + "execute:schedule:function:function:time:append:commands", + "execute:schedule:function:function:time:commands", + "execute:schedule:function:function:time:replace", + "execute:schedule:function:function:time:replace:commands", + "execute:scoreboard:objectives:add:objective:criteria", + "execute:scoreboard:objectives:add:objective:criteria:displayName", + "execute:scoreboard:objectives:list", + "execute:scoreboard:objectives:modify:objective:displayname:displayName", + "execute:scoreboard:objectives:modify:objective:rendertype:hearts", + "execute:scoreboard:objectives:modify:objective:rendertype:integer", + "execute:scoreboard:objectives:remove:objective", + "execute:scoreboard:objectives:setdisplay:slot", + "execute:scoreboard:objectives:setdisplay:slot:objective", + "execute:scoreboard:players:add:targets:objective:score", + "execute:scoreboard:players:enable:targets:objective", + "execute:scoreboard:players:get:target:objective", + "execute:scoreboard:players:list", + "execute:scoreboard:players:list:target", + "execute:scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective", + "execute:scoreboard:players:remove:targets:objective:score", + "execute:scoreboard:players:reset:targets", + "execute:scoreboard:players:reset:targets:objective", + "execute:scoreboard:players:set:targets:objective:score", + "execute:setblock:pos:block", + "execute:setblock:pos:block:destroy", + "execute:setblock:pos:block:keep", + "execute:setblock:pos:block:replace", + "execute:setidletimeout:minutes", + "execute:setworldspawn:pos", + "execute:setworldspawn:pos:angle", + "execute:shader:name:content", + "execute:shader_post:name:content", + "execute:spawnpoint:targets", + "execute:spawnpoint:targets:pos", + "execute:spawnpoint:targets:pos:angle", + "execute:spectate:target", + "execute:spectate:target:player", + "execute:spreadplayers:center:spreadDistance:maxRange:respectTeams:targets", + "execute:spreadplayers:center:spreadDistance:maxRange:under:maxHeight:respectTeams:targets", + "execute:stopsound:targets", + "execute:stopsound:targets:*:sound", + "execute:stopsound:targets:ambient", + "execute:stopsound:targets:ambient:sound", + "execute:stopsound:targets:block", + "execute:stopsound:targets:block:sound", + "execute:stopsound:targets:hostile", + "execute:stopsound:targets:hostile:sound", + "execute:stopsound:targets:master", + "execute:stopsound:targets:master:sound", + "execute:stopsound:targets:music", + "execute:stopsound:targets:music:sound", + "execute:stopsound:targets:neutral", + "execute:stopsound:targets:neutral:sound", + "execute:stopsound:targets:player", + "execute:stopsound:targets:player:sound", + "execute:stopsound:targets:record", + "execute:stopsound:targets:record:sound", + "execute:stopsound:targets:voice", + "execute:stopsound:targets:voice:sound", + "execute:stopsound:targets:weather", + "execute:stopsound:targets:weather:sound", + "execute:store:result:block:targetPos:path:byte:scale:subcommand", + "execute:store:result:block:targetPos:path:double:scale:subcommand", + "execute:store:result:block:targetPos:path:float:scale:subcommand", + "execute:store:result:block:targetPos:path:int:scale:subcommand", + "execute:store:result:block:targetPos:path:long:scale:subcommand", + "execute:store:result:block:targetPos:path:short:scale:subcommand", + "execute:store:result:bossbar:id:max:subcommand", + "execute:store:result:bossbar:id:value:subcommand", + "execute:store:result:entity:target:path:byte:scale:subcommand", + "execute:store:result:entity:target:path:double:scale:subcommand", + "execute:store:result:entity:target:path:float:scale:subcommand", + "execute:store:result:entity:target:path:int:scale:subcommand", + "execute:store:result:entity:target:path:long:scale:subcommand", + "execute:store:result:entity:target:path:short:scale:subcommand", + "execute:store:result:score:targets:objective:subcommand", + "execute:store:result:storage:target:path:byte:scale:subcommand", + "execute:store:result:storage:target:path:double:scale:subcommand", + "execute:store:result:storage:target:path:float:scale:subcommand", + "execute:store:result:storage:target:path:int:scale:subcommand", + "execute:store:result:storage:target:path:long:scale:subcommand", + "execute:store:result:storage:target:path:short:scale:subcommand", + "execute:store:success:block:targetPos:path:byte:scale:subcommand", + "execute:store:success:block:targetPos:path:double:scale:subcommand", + "execute:store:success:block:targetPos:path:float:scale:subcommand", + "execute:store:success:block:targetPos:path:int:scale:subcommand", + "execute:store:success:block:targetPos:path:long:scale:subcommand", + "execute:store:success:block:targetPos:path:short:scale:subcommand", + "execute:store:success:bossbar:id:max:subcommand", + "execute:store:success:bossbar:id:value:subcommand", + "execute:store:success:entity:target:path:byte:scale:subcommand", + "execute:store:success:entity:target:path:double:scale:subcommand", + "execute:store:success:entity:target:path:float:scale:subcommand", + "execute:store:success:entity:target:path:int:scale:subcommand", + "execute:store:success:entity:target:path:long:scale:subcommand", + "execute:store:success:entity:target:path:short:scale:subcommand", + "execute:store:success:score:targets:objective:subcommand", + "execute:store:success:storage:target:path:byte:scale:subcommand", + "execute:store:success:storage:target:path:double:scale:subcommand", + "execute:store:success:storage:target:path:float:scale:subcommand", + "execute:store:success:storage:target:path:int:scale:subcommand", + "execute:store:success:storage:target:path:long:scale:subcommand", + "execute:store:success:storage:target:path:short:scale:subcommand", + "execute:subcommand", + "execute:summon:entity", + "execute:summon:entity:pos", + "execute:summon:entity:pos:nbt", + "execute:tag:targets:add:name", + "execute:tag:targets:list", + "execute:tag:targets:remove:name", + "execute:team:add:team", + "execute:team:add:team:displayName", + "execute:team:empty:team", + "execute:team:join:team", + "execute:team:join:team:members", + "execute:team:leave:members", + "execute:team:list", + "execute:team:list:team", + "execute:team:modify:team:collisionRule:always", + "execute:team:modify:team:collisionRule:never", + "execute:team:modify:team:collisionRule:pushOtherTeams", + "execute:team:modify:team:collisionRule:pushOwnTeam", + "execute:team:modify:team:color:value", + "execute:team:modify:team:deathMessageVisibility:always", + "execute:team:modify:team:deathMessageVisibility:hideForOtherTeams", + "execute:team:modify:team:deathMessageVisibility:hideForOwnTeam", + "execute:team:modify:team:deathMessageVisibility:never", + "execute:team:modify:team:displayName:displayName", + "execute:team:modify:team:friendlyFire:allowed", + "execute:team:modify:team:nametagVisibility:always", + "execute:team:modify:team:nametagVisibility:hideForOtherTeams", + "execute:team:modify:team:nametagVisibility:hideForOwnTeam", + "execute:team:modify:team:nametagVisibility:never", + "execute:team:modify:team:prefix:prefix", + "execute:team:modify:team:seeFriendlyInvisibles:allowed", + "execute:team:modify:team:suffix:suffix", + "execute:team:remove:team", + "execute:teammsg:message", + "execute:teleport:destination", + "execute:teleport:location", + "execute:teleport:targets:destination", + "execute:teleport:targets:location", + "execute:teleport:targets:location:facing:entity:facingEntity", + "execute:teleport:targets:location:facing:entity:facingEntity:facingAnchor", + "execute:teleport:targets:location:facing:facingLocation", + "execute:teleport:targets:location:rotation", + "execute:tell:targets:message", + "execute:tellraw:targets:message", + "execute:texture_mcmeta:name:content", + "execute:time:add:time", + "execute:time:query:day", + "execute:time:query:daytime", + "execute:time:query:gametime", + "execute:time:set:day", + "execute:time:set:midnight", + "execute:time:set:night", + "execute:time:set:noon", + "execute:time:set:time", + "execute:title:targets:actionbar:title", + "execute:title:targets:clear", + "execute:title:targets:reset", + "execute:title:targets:subtitle:title", + "execute:title:targets:times:fadeIn:stay:fadeOut", + "execute:title:targets:title:title", + "execute:tm:message", + "execute:tp:destination", + "execute:tp:location", + "execute:tp:targets:destination", + "execute:tp:targets:location", + "execute:tp:targets:location:facing:entity:facingEntity", + "execute:tp:targets:location:facing:entity:facingEntity:facingAnchor", + "execute:tp:targets:location:facing:facingLocation", + "execute:tp:targets:location:rotation", + "execute:trigger:objective", + "execute:trigger:objective:add:value", + "execute:trigger:objective:set:value", + "execute:unless:block:pos:block", + "execute:unless:block:pos:block:subcommand", + "execute:unless:blocks:start:end:destination:all", + "execute:unless:blocks:start:end:destination:all:subcommand", + "execute:unless:blocks:start:end:destination:masked", + "execute:unless:blocks:start:end:destination:masked:subcommand", + "execute:unless:data:block:sourcePos:path", + "execute:unless:data:block:sourcePos:path:subcommand", + "execute:unless:data:entity:source:path", + "execute:unless:data:entity:source:path:subcommand", + "execute:unless:data:storage:source:path", + "execute:unless:data:storage:source:path:subcommand", + "execute:unless:entity:entities", + "execute:unless:entity:entities:subcommand", + "execute:unless:predicate:predicate", + "execute:unless:predicate:predicate:subcommand", + "execute:unless:score:target:targetObjective:<:source:sourceObjective", + "execute:unless:score:target:targetObjective:<:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective", + "execute:unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:=:source:sourceObjective", + "execute:unless:score:target:targetObjective:=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>:source:sourceObjective", + "execute:unless:score:target:targetObjective:>:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective", + "execute:unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "execute:unless:score:target:targetObjective:matches:range", + "execute:unless:score:target:targetObjective:matches:range:subcommand", + "execute:w:targets:message", + "execute:weather:clear", + "execute:weather:clear:duration", + "execute:weather:rain", + "execute:weather:rain:duration", + "execute:weather:thunder", + "execute:weather:thunder:duration", + "execute:whitelist:add:targets", + "execute:whitelist:list", + "execute:whitelist:off", + "execute:whitelist:on", + "execute:whitelist:reload", + "execute:whitelist:remove:targets", + "execute:worldborder:add:distance", + "execute:worldborder:add:distance:time", + "execute:worldborder:center:pos", + "execute:worldborder:damage:amount:damagePerBlock", + "execute:worldborder:damage:buffer:distance", + "execute:worldborder:get", + "execute:worldborder:set:distance", + "execute:worldborder:set:distance:time", + "execute:worldborder:warning:distance:distance", + "execute:worldborder:warning:time:time", + "execute:worldgen_biome:name:content", + "execute:worldgen_biome_tag:name:content", + "execute:worldgen_configured_carver:name:content", + "execute:worldgen_configured_carver_tag:name:content", + "execute:worldgen_configured_feature:name:content", + "execute:worldgen_configured_structure_feature:name:content", + "execute:worldgen_configured_structure_feature_tag:name:content", + "execute:worldgen_configured_surface_builder:name:content", + "execute:worldgen_density_function:name:content", + "execute:worldgen_noise:name:content", + "execute:worldgen_noise_settings:name:content", + "execute:worldgen_placed_feature:name:content", + "execute:worldgen_placed_feature_tag:name:content", + "execute:worldgen_processor_list:name:content", + "execute:worldgen_structure_set:name:content", + "execute:worldgen_structure_set_tag:name:content", + "execute:worldgen_template_pool:name:content", + "execute:xp:add:targets:amount", + "execute:xp:add:targets:amount:levels", + "execute:xp:add:targets:amount:points", + "execute:xp:query:targets:levels", + "execute:xp:query:targets:points", + "execute:xp:set:targets:amount", + "execute:xp:set:targets:amount:levels", + "execute:xp:set:targets:amount:points", + "expand:commands", + "experience:add:targets:amount", + "experience:add:targets:amount:levels", + "experience:add:targets:amount:points", + "experience:query:targets:levels", + "experience:query:targets:points", + "experience:set:targets:amount", + "experience:set:targets:amount:levels", + "experience:set:targets:amount:points", + "facing:entity:targets:anchor:subcommand", + "facing:pos:subcommand", + "fill:from:to:block", + "fill:from:to:block:destroy", + "fill:from:to:block:hollow", + "fill:from:to:block:keep", + "fill:from:to:block:outline", + "fill:from:to:block:replace", + "fill:from:to:block:replace:filter", + "fluid_tag:name:content", + "font:name:content", + "for:target:in:iterable:body", + "forceload:add:from", + "forceload:add:from:to", + "forceload:query", + "forceload:query:pos", + "forceload:remove:all", + "forceload:remove:from", + "forceload:remove:from:to", + "from:module:import:name", + "from:module:import:name:subcommand", + "from:module:import:subcommand", + "function:name", + "function:name:commands", + "function:tag:name", + "function_tag:name:content", + "game_event_tag:name:content", + "gamemode:adventure", + "gamemode:adventure:target", + "gamemode:creative", + "gamemode:creative:target", + "gamemode:spectator", + "gamemode:spectator:target", + "gamemode:survival", + "gamemode:survival:target", + "gamerule:announceAdvancements", + "gamerule:announceAdvancements:value", + "gamerule:commandBlockOutput", + "gamerule:commandBlockOutput:value", + "gamerule:disableElytraMovementCheck", + "gamerule:disableElytraMovementCheck:value", + "gamerule:disableRaids", + "gamerule:disableRaids:value", + "gamerule:doDaylightCycle", + "gamerule:doDaylightCycle:value", + "gamerule:doEntityDrops", + "gamerule:doEntityDrops:value", + "gamerule:doFireTick", + "gamerule:doFireTick:value", + "gamerule:doImmediateRespawn", + "gamerule:doImmediateRespawn:value", + "gamerule:doInsomnia", + "gamerule:doInsomnia:value", + "gamerule:doLimitedCrafting", + "gamerule:doLimitedCrafting:value", + "gamerule:doMobLoot", + "gamerule:doMobLoot:value", + "gamerule:doMobSpawning", + "gamerule:doMobSpawning:value", + "gamerule:doPatrolSpawning", + "gamerule:doPatrolSpawning:value", + "gamerule:doTileDrops", + "gamerule:doTileDrops:value", + "gamerule:doTraderSpawning", + "gamerule:doTraderSpawning:value", + "gamerule:doWardenSpawning", + "gamerule:doWardenSpawning:value", + "gamerule:doWeatherCycle", + "gamerule:doWeatherCycle:value", + "gamerule:drowningDamage", + "gamerule:drowningDamage:value", + "gamerule:fallDamage", + "gamerule:fallDamage:value", + "gamerule:fireDamage", + "gamerule:fireDamage:value", + "gamerule:forgiveDeadPlayers", + "gamerule:forgiveDeadPlayers:value", + "gamerule:freezeDamage", + "gamerule:freezeDamage:value", + "gamerule:keepInventory", + "gamerule:keepInventory:value", + "gamerule:logAdminCommands", + "gamerule:logAdminCommands:value", + "gamerule:maxCommandChainLength", + "gamerule:maxCommandChainLength:value", + "gamerule:maxEntityCramming", + "gamerule:maxEntityCramming:value", + "gamerule:mobGriefing", + "gamerule:mobGriefing:value", + "gamerule:naturalRegeneration", + "gamerule:naturalRegeneration:value", + "gamerule:playersSleepingPercentage", + "gamerule:playersSleepingPercentage:value", + "gamerule:randomTickSpeed", + "gamerule:randomTickSpeed:value", + "gamerule:reducedDebugInfo", + "gamerule:reducedDebugInfo:value", + "gamerule:sendCommandFeedback", + "gamerule:sendCommandFeedback:value", + "gamerule:showDeathMessages", + "gamerule:showDeathMessages:value", + "gamerule:spawnRadius", + "gamerule:spawnRadius:value", + "gamerule:spectatorsGenerateChunks", + "gamerule:spectatorsGenerateChunks:value", + "gamerule:universalAnger", + "gamerule:universalAnger:value", + "give:targets:item", + "give:targets:item:count", + "global:name", + "global:name:subcommand", + "global:subcommand", + "help", + "help:command", + "if:block:pos:block", + "if:block:pos:block:subcommand", + "if:blocks:start:end:destination:all", + "if:blocks:start:end:destination:all:subcommand", + "if:blocks:start:end:destination:masked", + "if:blocks:start:end:destination:masked:subcommand", + "if:condition:body", + "if:data:block:sourcePos:path", + "if:data:block:sourcePos:path:subcommand", + "if:data:entity:source:path", + "if:data:entity:source:path:subcommand", + "if:data:storage:source:path", + "if:data:storage:source:path:subcommand", + "if:entity:entities", + "if:entity:entities:subcommand", + "if:predicate:predicate", + "if:predicate:predicate:subcommand", + "if:score:target:targetObjective:<:source:sourceObjective", + "if:score:target:targetObjective:<:source:sourceObjective:subcommand", + "if:score:target:targetObjective:<=:source:sourceObjective", + "if:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "if:score:target:targetObjective:=:source:sourceObjective", + "if:score:target:targetObjective:=:source:sourceObjective:subcommand", + "if:score:target:targetObjective:>:source:sourceObjective", + "if:score:target:targetObjective:>:source:sourceObjective:subcommand", + "if:score:target:targetObjective:>=:source:sourceObjective", + "if:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "if:score:target:targetObjective:matches:range", + "if:score:target:targetObjective:matches:range:subcommand", + "import:module", + "import:module:as:alias", + "in:dimension:subcommand", + "item:modify:block:pos:slot:modifier", + "item:modify:entity:targets:slot:modifier", + "item:replace:block:pos:slot:from:block:source:sourceSlot", + "item:replace:block:pos:slot:from:block:source:sourceSlot:modifier", + "item:replace:block:pos:slot:from:entity:source:sourceSlot", + "item:replace:block:pos:slot:from:entity:source:sourceSlot:modifier", + "item:replace:block:pos:slot:with:item", + "item:replace:block:pos:slot:with:item:count", + "item:replace:entity:targets:slot:from:block:source:sourceSlot", + "item:replace:entity:targets:slot:from:block:source:sourceSlot:modifier", + "item:replace:entity:targets:slot:from:entity:source:sourceSlot", + "item:replace:entity:targets:slot:from:entity:source:sourceSlot:modifier", + "item:replace:entity:targets:slot:with:item", + "item:replace:entity:targets:slot:with:item:count", + "item_modifier:name:content", + "item_tag:name:content", + "jfr:start", + "jfr:stop", + "kick:targets", + "kick:targets:reason", + "kill", + "kill:targets", + "language:name:content", + "list", + "list:uuids", + "locate:biome:biome", + "locate:poi:poi", + "locate:structure:structure", + "loot:give:players:fish:loot_table:pos", + "loot:give:players:fish:loot_table:pos:mainhand", + "loot:give:players:fish:loot_table:pos:offhand", + "loot:give:players:fish:loot_table:pos:tool", + "loot:give:players:kill:target", + "loot:give:players:loot:loot_table", + "loot:give:players:mine:pos", + "loot:give:players:mine:pos:mainhand", + "loot:give:players:mine:pos:offhand", + "loot:give:players:mine:pos:tool", + "loot:insert:targetPos:fish:loot_table:pos", + "loot:insert:targetPos:fish:loot_table:pos:mainhand", + "loot:insert:targetPos:fish:loot_table:pos:offhand", + "loot:insert:targetPos:fish:loot_table:pos:tool", + "loot:insert:targetPos:kill:target", + "loot:insert:targetPos:loot:loot_table", + "loot:insert:targetPos:mine:pos", + "loot:insert:targetPos:mine:pos:mainhand", + "loot:insert:targetPos:mine:pos:offhand", + "loot:insert:targetPos:mine:pos:tool", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:mainhand", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:offhand", + "loot:replace:block:targetPos:slot:count:fish:loot_table:pos:tool", + "loot:replace:block:targetPos:slot:count:kill:target", + "loot:replace:block:targetPos:slot:count:loot:loot_table", + "loot:replace:block:targetPos:slot:count:mine:pos", + "loot:replace:block:targetPos:slot:count:mine:pos:mainhand", + "loot:replace:block:targetPos:slot:count:mine:pos:offhand", + "loot:replace:block:targetPos:slot:count:mine:pos:tool", + "loot:replace:block:targetPos:slot:fish:loot_table:pos", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:mainhand", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:offhand", + "loot:replace:block:targetPos:slot:fish:loot_table:pos:tool", + "loot:replace:block:targetPos:slot:kill:target", + "loot:replace:block:targetPos:slot:loot:loot_table", + "loot:replace:block:targetPos:slot:mine:pos", + "loot:replace:block:targetPos:slot:mine:pos:mainhand", + "loot:replace:block:targetPos:slot:mine:pos:offhand", + "loot:replace:block:targetPos:slot:mine:pos:tool", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:mainhand", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:offhand", + "loot:replace:entity:entities:slot:count:fish:loot_table:pos:tool", + "loot:replace:entity:entities:slot:count:kill:target", + "loot:replace:entity:entities:slot:count:loot:loot_table", + "loot:replace:entity:entities:slot:count:mine:pos", + "loot:replace:entity:entities:slot:count:mine:pos:mainhand", + "loot:replace:entity:entities:slot:count:mine:pos:offhand", + "loot:replace:entity:entities:slot:count:mine:pos:tool", + "loot:replace:entity:entities:slot:fish:loot_table:pos", + "loot:replace:entity:entities:slot:fish:loot_table:pos:mainhand", + "loot:replace:entity:entities:slot:fish:loot_table:pos:offhand", + "loot:replace:entity:entities:slot:fish:loot_table:pos:tool", + "loot:replace:entity:entities:slot:kill:target", + "loot:replace:entity:entities:slot:loot:loot_table", + "loot:replace:entity:entities:slot:mine:pos", + "loot:replace:entity:entities:slot:mine:pos:mainhand", + "loot:replace:entity:entities:slot:mine:pos:offhand", + "loot:replace:entity:entities:slot:mine:pos:tool", + "loot:spawn:targetPos:fish:loot_table:pos", + "loot:spawn:targetPos:fish:loot_table:pos:mainhand", + "loot:spawn:targetPos:fish:loot_table:pos:offhand", + "loot:spawn:targetPos:fish:loot_table:pos:tool", + "loot:spawn:targetPos:kill:target", + "loot:spawn:targetPos:loot:loot_table", + "loot:spawn:targetPos:mine:pos", + "loot:spawn:targetPos:mine:pos:mainhand", + "loot:spawn:targetPos:mine:pos:offhand", + "loot:spawn:targetPos:mine:pos:tool", + "loot_table:name:content", + "me:action", + "merge:advancement:name:content", + "merge:block_tag:name:content", + "merge:blockstate:name:content", + "merge:dimension:name:content", + "merge:dimension_type:name:content", + "merge:entity_type_tag:name:content", + "merge:fluid_tag:name:content", + "merge:font:name:content", + "merge:function_tag:name:content", + "merge:game_event_tag:name:content", + "merge:item_modifier:name:content", + "merge:item_tag:name:content", + "merge:language:name:content", + "merge:loot_table:name:content", + "merge:model:name:content", + "merge:particle_file:name:content", + "merge:predicate:name:content", + "merge:recipe:name:content", + "merge:shader:name:content", + "merge:shader_post:name:content", + "merge:texture_mcmeta:name:content", + "merge:worldgen_biome:name:content", + "merge:worldgen_biome_tag:name:content", + "merge:worldgen_configured_carver:name:content", + "merge:worldgen_configured_carver_tag:name:content", + "merge:worldgen_configured_feature:name:content", + "merge:worldgen_configured_structure_feature:name:content", + "merge:worldgen_configured_structure_feature_tag:name:content", + "merge:worldgen_configured_surface_builder:name:content", + "merge:worldgen_density_function:name:content", + "merge:worldgen_noise:name:content", + "merge:worldgen_noise_settings:name:content", + "merge:worldgen_placed_feature:name:content", + "merge:worldgen_placed_feature_tag:name:content", + "merge:worldgen_processor_list:name:content", + "merge:worldgen_structure_set:name:content", + "merge:worldgen_structure_set_tag:name:content", + "merge:worldgen_template_pool:name:content", + "model:name:content", + "msg:targets:message", + "nonlocal:name", + "nonlocal:name:subcommand", + "nonlocal:subcommand", + "op:targets", + "pardon-ip:target", + "pardon:targets", + "particle:name", + "particle:name:pos", + "particle:name:pos:delta:speed:count", + "particle:name:pos:delta:speed:count:force", + "particle:name:pos:delta:speed:count:force:viewers", + "particle:name:pos:delta:speed:count:normal", + "particle:name:pos:delta:speed:count:normal:viewers", + "particle_file:name:content", + "pass", + "perf:start", + "perf:stop", + "place:feature:feature", + "place:feature:feature:pos", + "place:jigsaw:pool:target:max_depth", + "place:jigsaw:pool:target:max_depth:position", + "place:structure:structure", + "place:structure:structure:pos", + "place:template:template", + "place:template:template:pos", + "place:template:template:pos:rotation", + "place:template:template:pos:rotation:mirror", + "place:template:template:pos:rotation:mirror:integrity", + "place:template:template:pos:rotation:mirror:integrity:seed", + "playsound:sound:ambient:targets", + "playsound:sound:ambient:targets:pos", + "playsound:sound:ambient:targets:pos:volume", + "playsound:sound:ambient:targets:pos:volume:pitch", + "playsound:sound:ambient:targets:pos:volume:pitch:minVolume", + "playsound:sound:block:targets", + "playsound:sound:block:targets:pos", + "playsound:sound:block:targets:pos:volume", + "playsound:sound:block:targets:pos:volume:pitch", + "playsound:sound:block:targets:pos:volume:pitch:minVolume", + "playsound:sound:hostile:targets", + "playsound:sound:hostile:targets:pos", + "playsound:sound:hostile:targets:pos:volume", + "playsound:sound:hostile:targets:pos:volume:pitch", + "playsound:sound:hostile:targets:pos:volume:pitch:minVolume", + "playsound:sound:master:targets", + "playsound:sound:master:targets:pos", + "playsound:sound:master:targets:pos:volume", + "playsound:sound:master:targets:pos:volume:pitch", + "playsound:sound:master:targets:pos:volume:pitch:minVolume", + "playsound:sound:music:targets", + "playsound:sound:music:targets:pos", + "playsound:sound:music:targets:pos:volume", + "playsound:sound:music:targets:pos:volume:pitch", + "playsound:sound:music:targets:pos:volume:pitch:minVolume", + "playsound:sound:neutral:targets", + "playsound:sound:neutral:targets:pos", + "playsound:sound:neutral:targets:pos:volume", + "playsound:sound:neutral:targets:pos:volume:pitch", + "playsound:sound:neutral:targets:pos:volume:pitch:minVolume", + "playsound:sound:player:targets", + "playsound:sound:player:targets:pos", + "playsound:sound:player:targets:pos:volume", + "playsound:sound:player:targets:pos:volume:pitch", + "playsound:sound:player:targets:pos:volume:pitch:minVolume", + "playsound:sound:record:targets", + "playsound:sound:record:targets:pos", + "playsound:sound:record:targets:pos:volume", + "playsound:sound:record:targets:pos:volume:pitch", + "playsound:sound:record:targets:pos:volume:pitch:minVolume", + "playsound:sound:voice:targets", + "playsound:sound:voice:targets:pos", + "playsound:sound:voice:targets:pos:volume", + "playsound:sound:voice:targets:pos:volume:pitch", + "playsound:sound:voice:targets:pos:volume:pitch:minVolume", + "playsound:sound:weather:targets", + "playsound:sound:weather:targets:pos", + "playsound:sound:weather:targets:pos:volume", + "playsound:sound:weather:targets:pos:volume:pitch", + "playsound:sound:weather:targets:pos:volume:pitch:minVolume", + "positioned:as:targets:subcommand", + "positioned:pos:subcommand", + "predicate:name:content", + "prepend:block_tag:name:content", + "prepend:entity_type_tag:name:content", + "prepend:fluid_tag:name:content", + "prepend:function:name:commands", + "prepend:function_tag:name:content", + "prepend:game_event_tag:name:content", + "prepend:item_tag:name:content", + "prepend:worldgen_biome_tag:name:content", + "prepend:worldgen_configured_carver_tag:name:content", + "prepend:worldgen_configured_structure_feature_tag:name:content", + "prepend:worldgen_placed_feature_tag:name:content", + "prepend:worldgen_structure_set_tag:name:content", + "publish", + "publish:port", + "recipe:give:targets:*", + "recipe:give:targets:recipe", + "recipe:name:content", + "recipe:take:targets:*", + "recipe:take:targets:recipe", + "reload", + "return", + "return:value", + "rotated:as:targets:subcommand", + "rotated:rot:subcommand", + "save-all", + "save-all:flush", + "save-off", + "save-on", + "say:message", + "schedule:clear:function", + "schedule:function:function:time", + "schedule:function:function:time:append", + "schedule:function:function:time:append:commands", + "schedule:function:function:time:commands", + "schedule:function:function:time:replace", + "schedule:function:function:time:replace:commands", + "scoreboard:objectives:add:objective:criteria", + "scoreboard:objectives:add:objective:criteria:displayName", + "scoreboard:objectives:list", + "scoreboard:objectives:modify:objective:displayname:displayName", + "scoreboard:objectives:modify:objective:rendertype:hearts", + "scoreboard:objectives:modify:objective:rendertype:integer", + "scoreboard:objectives:remove:objective", + "scoreboard:objectives:setdisplay:slot", + "scoreboard:objectives:setdisplay:slot:objective", + "scoreboard:players:add:targets:objective:score", + "scoreboard:players:enable:targets:objective", + "scoreboard:players:get:target:objective", + "scoreboard:players:list", + "scoreboard:players:list:target", + "scoreboard:players:operation:targets:targetObjective:operation:source:sourceObjective", + "scoreboard:players:remove:targets:objective:score", + "scoreboard:players:reset:targets", + "scoreboard:players:reset:targets:objective", + "scoreboard:players:set:targets:objective:score", + "seed", + "setblock:pos:block", + "setblock:pos:block:destroy", + "setblock:pos:block:keep", + "setblock:pos:block:replace", + "setidletimeout:minutes", + "setworldspawn", + "setworldspawn:pos", + "setworldspawn:pos:angle", + "shader:name:content", + "shader_post:name:content", + "spawnpoint", + "spawnpoint:targets", + "spawnpoint:targets:pos", + "spawnpoint:targets:pos:angle", + "spectate", + "spectate:target", + "spectate:target:player", + "spreadplayers:center:spreadDistance:maxRange:respectTeams:targets", + "spreadplayers:center:spreadDistance:maxRange:under:maxHeight:respectTeams:targets", + "statement", + "stop", + "stopsound:targets", + "stopsound:targets:*:sound", + "stopsound:targets:ambient", + "stopsound:targets:ambient:sound", + "stopsound:targets:block", + "stopsound:targets:block:sound", + "stopsound:targets:hostile", + "stopsound:targets:hostile:sound", + "stopsound:targets:master", + "stopsound:targets:master:sound", + "stopsound:targets:music", + "stopsound:targets:music:sound", + "stopsound:targets:neutral", + "stopsound:targets:neutral:sound", + "stopsound:targets:player", + "stopsound:targets:player:sound", + "stopsound:targets:record", + "stopsound:targets:record:sound", + "stopsound:targets:voice", + "stopsound:targets:voice:sound", + "stopsound:targets:weather", + "stopsound:targets:weather:sound", + "store:result:block:targetPos:path:byte:scale:subcommand", + "store:result:block:targetPos:path:double:scale:subcommand", + "store:result:block:targetPos:path:float:scale:subcommand", + "store:result:block:targetPos:path:int:scale:subcommand", + "store:result:block:targetPos:path:long:scale:subcommand", + "store:result:block:targetPos:path:short:scale:subcommand", + "store:result:bossbar:id:max:subcommand", + "store:result:bossbar:id:value:subcommand", + "store:result:entity:target:path:byte:scale:subcommand", + "store:result:entity:target:path:double:scale:subcommand", + "store:result:entity:target:path:float:scale:subcommand", + "store:result:entity:target:path:int:scale:subcommand", + "store:result:entity:target:path:long:scale:subcommand", + "store:result:entity:target:path:short:scale:subcommand", + "store:result:score:targets:objective:subcommand", + "store:result:storage:target:path:byte:scale:subcommand", + "store:result:storage:target:path:double:scale:subcommand", + "store:result:storage:target:path:float:scale:subcommand", + "store:result:storage:target:path:int:scale:subcommand", + "store:result:storage:target:path:long:scale:subcommand", + "store:result:storage:target:path:short:scale:subcommand", + "store:success:block:targetPos:path:byte:scale:subcommand", + "store:success:block:targetPos:path:double:scale:subcommand", + "store:success:block:targetPos:path:float:scale:subcommand", + "store:success:block:targetPos:path:int:scale:subcommand", + "store:success:block:targetPos:path:long:scale:subcommand", + "store:success:block:targetPos:path:short:scale:subcommand", + "store:success:bossbar:id:max:subcommand", + "store:success:bossbar:id:value:subcommand", + "store:success:entity:target:path:byte:scale:subcommand", + "store:success:entity:target:path:double:scale:subcommand", + "store:success:entity:target:path:float:scale:subcommand", + "store:success:entity:target:path:int:scale:subcommand", + "store:success:entity:target:path:long:scale:subcommand", + "store:success:entity:target:path:short:scale:subcommand", + "store:success:score:targets:objective:subcommand", + "store:success:storage:target:path:byte:scale:subcommand", + "store:success:storage:target:path:double:scale:subcommand", + "store:success:storage:target:path:float:scale:subcommand", + "store:success:storage:target:path:int:scale:subcommand", + "store:success:storage:target:path:long:scale:subcommand", + "store:success:storage:target:path:short:scale:subcommand", + "summon:entity", + "summon:entity:pos", + "summon:entity:pos:nbt", + "tag:targets:add:name", + "tag:targets:list", + "tag:targets:remove:name", + "team:add:team", + "team:add:team:displayName", + "team:empty:team", + "team:join:team", + "team:join:team:members", + "team:leave:members", + "team:list", + "team:list:team", + "team:modify:team:collisionRule:always", + "team:modify:team:collisionRule:never", + "team:modify:team:collisionRule:pushOtherTeams", + "team:modify:team:collisionRule:pushOwnTeam", + "team:modify:team:color:value", + "team:modify:team:deathMessageVisibility:always", + "team:modify:team:deathMessageVisibility:hideForOtherTeams", + "team:modify:team:deathMessageVisibility:hideForOwnTeam", + "team:modify:team:deathMessageVisibility:never", + "team:modify:team:displayName:displayName", + "team:modify:team:friendlyFire:allowed", + "team:modify:team:nametagVisibility:always", + "team:modify:team:nametagVisibility:hideForOtherTeams", + "team:modify:team:nametagVisibility:hideForOwnTeam", + "team:modify:team:nametagVisibility:never", + "team:modify:team:prefix:prefix", + "team:modify:team:seeFriendlyInvisibles:allowed", + "team:modify:team:suffix:suffix", + "team:remove:team", + "teammsg:message", + "teleport:destination", + "teleport:location", + "teleport:targets:destination", + "teleport:targets:location", + "teleport:targets:location:facing:entity:facingEntity", + "teleport:targets:location:facing:entity:facingEntity:facingAnchor", + "teleport:targets:location:facing:facingLocation", + "teleport:targets:location:rotation", + "tell:targets:message", + "tellraw:targets:message", + "texture_mcmeta:name:content", + "time:add:time", + "time:query:day", + "time:query:daytime", + "time:query:gametime", + "time:set:day", + "time:set:midnight", + "time:set:night", + "time:set:noon", + "time:set:time", + "title:targets:actionbar:title", + "title:targets:clear", + "title:targets:reset", + "title:targets:subtitle:title", + "title:targets:times:fadeIn:stay:fadeOut", + "title:targets:title:title", + "tm:message", + "tp:destination", + "tp:location", + "tp:targets:destination", + "tp:targets:location", + "tp:targets:location:facing:entity:facingEntity", + "tp:targets:location:facing:entity:facingEntity:facingAnchor", + "tp:targets:location:facing:facingLocation", + "tp:targets:location:rotation", + "trigger:objective", + "trigger:objective:add:value", + "trigger:objective:set:value", + "unless:block:pos:block", + "unless:block:pos:block:subcommand", + "unless:blocks:start:end:destination:all", + "unless:blocks:start:end:destination:all:subcommand", + "unless:blocks:start:end:destination:masked", + "unless:blocks:start:end:destination:masked:subcommand", + "unless:data:block:sourcePos:path", + "unless:data:block:sourcePos:path:subcommand", + "unless:data:entity:source:path", + "unless:data:entity:source:path:subcommand", + "unless:data:storage:source:path", + "unless:data:storage:source:path:subcommand", + "unless:entity:entities", + "unless:entity:entities:subcommand", + "unless:predicate:predicate", + "unless:predicate:predicate:subcommand", + "unless:score:target:targetObjective:<:source:sourceObjective", + "unless:score:target:targetObjective:<:source:sourceObjective:subcommand", + "unless:score:target:targetObjective:<=:source:sourceObjective", + "unless:score:target:targetObjective:<=:source:sourceObjective:subcommand", + "unless:score:target:targetObjective:=:source:sourceObjective", + "unless:score:target:targetObjective:=:source:sourceObjective:subcommand", + "unless:score:target:targetObjective:>:source:sourceObjective", + "unless:score:target:targetObjective:>:source:sourceObjective:subcommand", + "unless:score:target:targetObjective:>=:source:sourceObjective", + "unless:score:target:targetObjective:>=:source:sourceObjective:subcommand", + "unless:score:target:targetObjective:matches:range", + "unless:score:target:targetObjective:matches:range:subcommand", + "w:targets:message", + "weather:clear", + "weather:clear:duration", + "weather:rain", + "weather:rain:duration", + "weather:thunder", + "weather:thunder:duration", + "while:condition:body", + "whitelist:add:targets", + "whitelist:list", + "whitelist:off", + "whitelist:on", + "whitelist:reload", + "whitelist:remove:targets", + "with:expression:as:target:body", + "with:expression:as:target:subcommand", + "with:expression:body", + "with:expression:subcommand", + "with:subcommand", + "worldborder:add:distance", + "worldborder:add:distance:time", + "worldborder:center:pos", + "worldborder:damage:amount:damagePerBlock", + "worldborder:damage:buffer:distance", + "worldborder:get", + "worldborder:set:distance", + "worldborder:set:distance:time", + "worldborder:warning:distance:distance", + "worldborder:warning:time:time", + "worldgen_biome:name:content", + "worldgen_biome_tag:name:content", + "worldgen_configured_carver:name:content", + "worldgen_configured_carver_tag:name:content", + "worldgen_configured_feature:name:content", + "worldgen_configured_structure_feature:name:content", + "worldgen_configured_structure_feature_tag:name:content", + "worldgen_configured_surface_builder:name:content", + "worldgen_density_function:name:content", + "worldgen_noise:name:content", + "worldgen_noise_settings:name:content", + "worldgen_placed_feature:name:content", + "worldgen_placed_feature_tag:name:content", + "worldgen_processor_list:name:content", + "worldgen_structure_set:name:content", + "worldgen_structure_set_tag:name:content", + "worldgen_template_pool:name:content", + "xp:add:targets:amount", + "xp:add:targets:amount:levels", + "xp:add:targets:amount:points", + "xp:query:targets:levels", + "xp:query:targets:points", + "xp:set:targets:amount", + "xp:set:targets:amount:levels", + "xp:set:targets:amount:points", + "yield", + "yield:from:value", + "yield:value" +] diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py index b285d90d3..f90e608bf 100644 --- a/packages/bolt/tests/test_bolt.py +++ b/packages/bolt/tests/test_bolt.py @@ -1,7 +1,7 @@ from pathlib import Path import pytest -from beet import Context, Function, run_beet +from beet import Context, Function from mecha import AstNode, CompilationDatabase, CompilationUnit, DiagnosticError, Mecha from mecha.contrib.annotate_diagnostics import annotate_diagnostics from pytest_insta import SnapshotFixture @@ -16,20 +16,14 @@ ] -@pytest.fixture(scope="session") -def ctx_bolt(): - with run_beet({"require": ["bolt"]}) as ctx: - yield ctx - - @pytest.mark.parametrize( "source", params := BOLT_EXAMPLES, ids=range(len(params)), ) -def test_parse(snapshot: SnapshotFixture, ctx_bolt: Context, source: Function): - mc = ctx_bolt.inject(Mecha) - runtime = ctx_bolt.inject(Runtime) +def test_parse(snapshot: SnapshotFixture, ctx: Context, source: Function): + mc = ctx.inject(Mecha) + runtime = ctx.inject(Runtime) ast = None diagnostics = None diff --git a/packages/bolt/tests/test_sandbox.py b/packages/bolt/tests/test_sandbox.py index f69442bf0..440633fff 100644 --- a/packages/bolt/tests/test_sandbox.py +++ b/packages/bolt/tests/test_sandbox.py @@ -1,7 +1,7 @@ from pathlib import Path import pytest -from beet import Context, Function, run_beet +from beet import Context, Function from beet.core.utils import format_exc from mecha import CompilationError, DiagnosticError, Mecha from pytest_insta import SnapshotFixture @@ -14,12 +14,6 @@ ] -@pytest.fixture(scope="session") -def ctx_sandbox(): - with run_beet({"require": ["bolt.contrib.sandbox"]}) as ctx: - yield ctx - - @pytest.mark.parametrize( "source", params := SANDBOX_EXAMPLES, diff --git a/packages/bolt/tests/test_spec.py b/packages/bolt/tests/test_spec.py new file mode 100644 index 000000000..3a3130744 --- /dev/null +++ b/packages/bolt/tests/test_spec.py @@ -0,0 +1,8 @@ +from beet import Context +from mecha import Mecha +from pytest_insta import SnapshotFixture + + +def test_prototypes(snapshot: SnapshotFixture, ctx: Context): + mc = ctx.inject(Mecha) + assert snapshot("json") == list(sorted(mc.spec.prototypes)) From 5af4dd9e71654ed453619e4216dd3f0f1e5bcbe2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 02:23:14 +0000 Subject: [PATCH 0896/1554] 0.8.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 00e3183c0..9c5b5fd0f 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.0 (2022-06-18) +### Feature +* Add context managers ([`38e614e`](https://github.com/mcbeet/bolt/commit/38e614e8d38d1c62af019f2b5f08a78cff22ed0b)) + ## v0.7.2 (2022-06-17) ### Fix * Only restrict builtins when sandbox is active ([`8eefb0c`](https://github.com/mcbeet/bolt/commit/8eefb0cf1f5d6f3a6b0e472ffb1da0e6b60ba5e7)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e66bf1b13..d7cbdfc15 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.7.2" +__version__ = "0.8.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 70f66358e..0da75d085 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.7.2" +version = "0.8.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From c4f753b77d306e75a8e67fa0e2ba8a36edd8aefd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 05:11:25 +0200 Subject: [PATCH 0897/1554] feat: add serialization pack filter --- packages/lectern/lectern/serialize.py | 20 +++++++++++++++++--- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 28ee205ac..f015c2781 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -15,7 +15,17 @@ from mimetypes import guess_type from pathlib import Path from textwrap import indent -from typing import Any, Dict, Iterable, Iterator, Mapping, Optional, Type, Union +from typing import ( + Any, + Callable, + Dict, + Iterable, + Iterator, + Mapping, + Optional, + Type, + Union, +) from urllib.parse import urlparse from beet import DataPack, File, NamespaceFile, ResourcePack, TextFileBase @@ -125,9 +135,11 @@ class TextSerializer: """Document serializer that outputs plain text.""" escaped_regex: Optional["re.Pattern[str]"] + pack_filter: Callable[[Union[ResourcePack, DataPack]], bool] def __init__(self): self.escaped_regex = None + self.pack_filter = bool def get_escaped_regex( self, mapping: Mapping[Type[NamespaceFile], str] @@ -162,7 +174,7 @@ def serialize( (assets, "resource_pack"), (data, "data_pack"), ] - if pack + if self.pack_filter(pack) for directive_name, argument, file_instance in chain( ( (extra_directive, path, file_instance) @@ -210,9 +222,11 @@ class MarkdownSerializer: """Document serializer that outputs markdown and emits associated files.""" flat: bool + pack_filter: Callable[[Union[ResourcePack, DataPack]], bool] def __init__(self, flat: bool = False): self.flat = flat + self.pack_filter = bool @contextmanager def use_flat_format(self, flat: bool = True): @@ -241,7 +255,7 @@ def serialize( ("Data pack", "data_pack", data), ("Resource pack", "resource_pack", assets), ] - if pack + if self.pack_filter(pack) for text in self.serialize_pack( title, directive, diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index cf0702ad5..4b7ad7164 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.68.1" +version = "0.68.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -784,7 +784,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "6e48ec349c0e4f301fb3acd02094b00324fe0ab79adfffa7aaffeef9afcff7a0" +content-hash = "4754fdfdcdd612034248098986d88b7d259703e0ebb06e8ffa66efcdf11d6c51" [metadata.files] atomicwrites = [ @@ -796,8 +796,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] beet = [ - {file = "beet-0.68.1-py3-none-any.whl", hash = "sha256:49f865161831eab37202f5b74f99e97bafc0c8fc9375032a2bed93fff95e1aab"}, - {file = "beet-0.68.1.tar.gz", hash = "sha256:92fccb6448a64f02fb7c92d2cafa253afc9482b4b0f9bdf1de6344ae4205f05b"}, + {file = "beet-0.68.2-py3-none-any.whl", hash = "sha256:dddd10e0dc2114d7ecfa7bd919a5550ac7ef8621ce788996f38fd285614dde22"}, + {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 066a3c706..4a2373641 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.1" +beet = ">=0.68.2" markdown-it-py = "^2.1.0" click = "^8.1.3" From 7b928025902c2d02700799bbf8cc383cef1c5b12 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 03:12:39 +0000 Subject: [PATCH 0898/1554] 0.23.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index a252e912f..5d9dd4369 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.23.0 (2022-06-18) +### Feature +* Add serialization pack filter ([`c841d6b`](https://github.com/mcbeet/lectern/commit/c841d6b6eb7dea115c3d2a791f36cca672362aaf)) + ## v0.22.0 (2022-06-18) ### Feature * Update beet to default to 1.19 ([`4f2f2e9`](https://github.com/mcbeet/lectern/commit/4f2f2e901dbe6f80f5b000e2ee6abe78546b9f96)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 47a8f795c..40a4d083c 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.22.0" +__version__ = "0.23.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 4a2373641..942509fa9 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.22.0" +version = "0.23.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 7eb460802c6e55c3ec2ae853715da5ee801ae8b1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 05:39:03 +0200 Subject: [PATCH 0899/1554] feat: change serialization filter for pytest snapshots --- packages/lectern/lectern/document.py | 13 +- packages/lectern/lectern/pytest_plugin.py | 6 +- packages/lectern/lectern/serialize.py | 6 + .../examples__beet_project__0.pack.md | 722 +++++++----------- .../examples__markdown_README_md__0.pack.md | 390 ++++------ ...wn_examples_append_modifier_txt__0.pack.md | 34 +- ...s__markdown_examples_basic1_txt__0.pack.md | 44 +- ...s__markdown_examples_basic2_txt__0.pack.md | 66 +- ...s__markdown_examples_basic3_txt__0.pack.md | 44 +- ...down_examples_code_fragments_md__0.pack.md | 92 +-- ...__markdown_examples_combined_md__0.pack.md | 72 +- ...__markdown_examples_compact_txt__0.pack.md | 44 +- ..._examples_download_fragment_txt__0.pack.md | 32 +- ...wn_examples_embedded_vs_text_md__0.pack.md | 44 +- ...wn_examples_empty_functions_txt__0.pack.md | 50 +- ...n_examples_escaped_fragment_txt__0.pack.md | 40 +- ...own_examples_folded_sections_md__0.pack.md | 44 +- ...kdown_examples_html_comments_md__0.pack.md | 44 +- ...arkdown_examples_merge_lang_txt__0.pack.md | 38 +- ...own_examples_merge_modifier_txt__0.pack.md | 42 +- ...n_examples_prepend_modifier_txt__0.pack.md | 34 +- ...down_examples_readme_example_md__0.pack.md | 48 +- ...es__markdown_examples_sound_txt__0.pack.md | 46 +- ...xamples_strip_final_newline_txt__0.pack.md | 56 +- ...ples_with_links_inline_image_md__0.pack.md | 72 +- ..._with_links_lots_of_textures_md__0.pack.md | 220 ++---- ...ith_links_pack_icon_data_url_md__0.pack.md | 56 +- ...es_with_links_pack_icon_link_md__0.pack.md | 28 +- ...s_with_links_pack_local_icon_md__0.pack.md | 28 +- ...s_with_links_structure_files_md__0.pack.md | 26 +- ..._links_vanilla_font_data_url_md__0.pack.md | 498 ++++++------ ...ith_links_vanilla_font_local_md__0.pack.md | 498 ++++++------ .../README.md | 390 ++++------ .../README.md | 72 +- .../README.md | 220 ++---- .../README.md | 56 +- .../README.md | 28 +- .../README.md | 28 +- .../README.md | 26 +- .../README.md | 498 ++++++------ .../README.md | 498 ++++++------ 41 files changed, 2217 insertions(+), 3076 deletions(-) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 0f850e5ed..8abb192ec 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -13,7 +13,12 @@ from .directive import DirectiveRegistry from .extract import FragmentLoader, MarkdownExtractor, TextExtractor -from .serialize import ExternalFilesManager, MarkdownSerializer, TextSerializer +from .serialize import ( + ExternalFilesManager, + MarkdownSerializer, + TextSerializer, + snapshot_serialization_filter, +) @dataclass @@ -173,8 +178,14 @@ def save( self, path: FileSystemPath, external_files: Optional[FileSystemPath] = None, + snapshot: bool = False, ): """Save the serialized document at the specified location.""" + if snapshot: + self.text_serializer.pack_filter = snapshot_serialization_filter + self.markdown_serializer.flat = True + self.markdown_serializer.pack_filter = snapshot_serialization_filter + path = Path(path).resolve() if path.suffix == ".md": diff --git a/packages/lectern/lectern/pytest_plugin.py b/packages/lectern/lectern/pytest_plugin.py index 9947ede7f..f001ed69c 100644 --- a/packages/lectern/lectern/pytest_plugin.py +++ b/packages/lectern/lectern/pytest_plugin.py @@ -27,7 +27,7 @@ def load(self, path: Path) -> Document: return load_snapshot(path) def dump(self, path: Path, value: Document): - value.save(path) + value.save(path, snapshot=True) class FmtPackMarkdown(Fmt[Document]): extension = ".pack.md" @@ -36,7 +36,7 @@ def load(self, path: Path) -> Document: return load_snapshot(path) def dump(self, path: Path, value: Document): - value.save(path) + value.save(path, snapshot=True) class FmtPackMarkdownExternalFiles(Fmt[Document]): extension = ".pack.md_external_files" @@ -46,7 +46,7 @@ def load(self, path: Path) -> Document: def dump(self, path: Path, value: Document): path.mkdir(exist_ok=True) - value.save(path / "README.md", external_files=path) + value.save(path / "README.md", snapshot=True, external_files=path) def pytest_assertrepr_compare(config, op, left, right): diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index f015c2781..a232439d9 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -3,6 +3,7 @@ "MarkdownSerializer", "ExternalFilesManager", "SerializedFile", + "snapshot_serialization_filter", "EXTENSION_HIGHLIGHTING", ] @@ -41,6 +42,11 @@ } +def snapshot_serialization_filter(pack: Union[DataPack, ResourcePack]) -> bool: + """Filter that selects non-empty packs and empty packs with modified pack.mcmeta.""" + return bool(pack or pack.mcmeta != type(pack)().mcmeta) + + @dataclass class ExternalFilesManager: """Class responsible for saving external files.""" diff --git a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md index 381b0d0bb..5a0292070 100644 --- a/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__beet_project__0.pack.md @@ -2,531 +2,387 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### with_beet -- `@function with_beet:abc` - -
- - ```mcfunction - function with_beet:def - ``` +`@function with_beet:abc` -
+```mcfunction +function with_beet:def +``` -- `@function with_beet:def` +`@function with_beet:def` -
- - ```mcfunction - say relative - ``` - -
+```mcfunction +say relative +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` - -
- - ```mcfunction - say bar - ``` - -
- -- `@function demo:script_foo` - -
- - ```mcfunction - say something - - ``` - -
- -- `@function demo:script_0` - -
- - ```mcfunction - say 0 - ``` - -
- -- `@function demo:script_1` - -
- - ```mcfunction - say 1 - ``` - -
- -- `@function demo:script_2` - -
- - ```mcfunction - say 2 - ``` - -
- -- `@function demo:script_3` - -
- - ```mcfunction - say 3 - ``` - -
- -- `@function demo:script_4` - -
- - ```mcfunction - say 4 - ``` - -
- -- `@function demo:script_5` +`@function demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say 5 - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` -- `@function demo:script_6` +`@function demo:script_foo` -
+```mcfunction +say something - ```mcfunction - say 6 - ``` +``` -
+`@function demo:script_0` -- `@function demo:script_7` +```mcfunction +say 0 +``` -
+`@function demo:script_1` - ```mcfunction - say 7 - ``` +```mcfunction +say 1 +``` -
+`@function demo:script_2` -- `@function demo:script_8` +```mcfunction +say 2 +``` -
+`@function demo:script_3` - ```mcfunction - say 8 - ``` +```mcfunction +say 3 +``` -
+`@function demo:script_4` -- `@function demo:script_9` +```mcfunction +say 4 +``` -
+`@function demo:script_5` - ```mcfunction - say 9 +```mcfunction +say 5 +``` - ``` +`@function demo:script_6` -
+```mcfunction +say 6 +``` -- `@function demo:script_nested` +`@function demo:script_7` -
+```mcfunction +say 7 +``` - ```mcfunction - say wow - ``` +`@function demo:script_8` -
+```mcfunction +say 8 +``` -- `@function demo:script_please_avoid_this` +`@function demo:script_9` -
+```mcfunction +say 9 - ```mcfunction - say no - ``` +``` -
+`@function demo:script_nested` -- `@function demo:define_1` +```mcfunction +say wow +``` -
+`@function demo:script_please_avoid_this` - ```mcfunction - say azertyuiop - ``` +```mcfunction +say no +``` -
+`@function demo:define_1` -- `@function demo:define_2` +```mcfunction +say azertyuiop +``` -
+`@function demo:define_2` - ```mcfunction - say azertyuiopqsdfghjklm - ``` +```mcfunction +say azertyuiopqsdfghjklm +``` -
+`@function demo:define_3` -- `@function demo:define_3` - -
- - ```mcfunction - say 2 + 2 is 4 (end of citation) - ``` - -
+```mcfunction +say 2 + 2 is 4 (end of citation) +``` ### embedded -- `@function embedded:foo` - -
- - ```mcfunction - say foo - ``` +`@function embedded:foo` -
+```mcfunction +say foo +``` -- `@function embedded:bar` +`@function embedded:bar` -
- - ```mcfunction - say bar - ``` - -
+```mcfunction +say bar +``` ### custom -- `@function custom:hello` - -
- - ```mcfunction - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - say hello - say bye - ``` - -
+`@function custom:hello` + +```mcfunction +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +say hello +say bye +``` ### hello -- `@function hello:greetings` - -
+`@function hello:greetings` - ```mcfunction - say Hello, Alice! - say Hello, Bob! - ``` - -
+```mcfunction +say Hello, Alice! +say Hello, Bob! +``` ### from_script -- `@function from_script:hello` - -
+`@function from_script:hello` - ```mcfunction - say hello - ``` +```mcfunction +say hello +``` -
+`@function from_script:thing` -- `@function from_script:thing` - -
- - ```mcfunction - say 0 - say 1 - say 2 - say 3 - say 4 - say 5 - say 6 - say 7 - say 8 - say 9 - ``` - -
+```mcfunction +say 0 +say 1 +say 2 +say 3 +say 4 +say 5 +say 6 +say 7 +say 8 +say 9 +``` ### minecraft -- `@loot_table minecraft:blocks/yellow_shulker_box` - -
- - ```json - { - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:air" - ], - "nbt": "{drop_contents:1b}" - } - } - ] - }, - { - "type": "minecraft:item", - "name": "minecraft:yellow_shulker_box", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Lock", - "target": "BlockEntityTag.Lock", - "op": "replace" - }, - { - "source": "LootTable", - "target": "BlockEntityTag.LootTable", - "op": "replace" - }, - { - "source": "LootTableSeed", - "target": "BlockEntityTag.LootTableSeed", - "op": "replace" - } - ] - }, - { - "function": "minecraft:set_contents", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ] +`@loot_table minecraft:blocks/yellow_shulker_box` + +```json +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:air" + ], + "nbt": "{drop_contents:1b}" } - ] - } - ] - } - ] - } - ] - } - ``` - -
- -- `@function_tag minecraft:tick` - -
+ } + ] + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] + } + ] + } + ] + } + ] +} +``` - ```json - { - "values": [ - "isolated:thing" - ] - } - ``` +`@function_tag minecraft:tick` -
+```json +{ + "values": [ + "isolated:thing" + ] +} +``` ### isolated -- `@function isolated:thing` - -
- - ```mcfunction - say this is not affected - ``` - -
- -- `@function isolated:plugin_test/foo` - -
- - ```mcfunction - say running isolated:plugin_test/foo - say hello - ``` - -
+`@function isolated:thing` -- `@function isolated:plugin_test/foo_copy` +```mcfunction +say this is not affected +``` -
+`@function isolated:plugin_test/foo` - ```mcfunction - say running isolated:plugin_test/foo - say hello - ``` +```mcfunction +say running isolated:plugin_test/foo +say hello +``` -
+`@function isolated:plugin_test/foo_copy` -- `@function isolated:message_demo` +```mcfunction +say running isolated:plugin_test/foo +say hello +``` -
+`@function isolated:message_demo` - ```mcfunction - tellraw @a ["", {"text": "hello", "color": "red"}] - ``` - -
+```mcfunction +tellraw @a ["", {"text": "hello", "color": "red"}] +``` ## Resource pack -- `@resource_pack pack.mcmeta` - -
+`@resource_pack pack.mcmeta` - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
- -- `@resource_pack pack.png` +} +``` -
+`@resource_pack pack.png` - ![resource_pack.png](data:image/png;base64,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) - -
+![resource_pack.png](data:image/png;base64,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) ### minecraft -- `@resource_pack assets/minecraft/sounds.json` - -
+`@resource_pack assets/minecraft/sounds.json` - ```json - { - "block.note_block.bit_1": { - "sounds": [ - "block/note_block/bit_1" - ], - "subtitle": "subtitles.block.note_block.note" - } +```json +{ + "block.note_block.bit_1": { + "sounds": [ + "block/note_block/bit_1" + ], + "subtitle": "subtitles.block.note_block.note" } - ``` - -
+} +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md index a8fb338c0..59446c560 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_README_md__0.pack.md @@ -2,260 +2,204 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](data:image/png;base64,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) +`@data_pack pack.png` -
+![data_pack.png](data:image/png;base64,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) ### tutorial -- `@function tutorial:greeting` - -
- - ```mcfunction - say This is added before. - say Hello, world! - say This is added afterwards. - ``` - -
- -- `@function tutorial:obtained_dead_bush` +`@function tutorial:greeting` -
+```mcfunction +say This is added before. +say Hello, world! +say This is added afterwards. +``` - ```mcfunction - say You obtained a dead bush! - ``` +`@function tutorial:obtained_dead_bush` -
+```mcfunction +say You obtained a dead bush! +``` -- `@function tutorial:hidden` +`@function tutorial:hidden` -
+```mcfunction +say This will not appear in the rendered markdown. +``` - ```mcfunction - say This will not appear in the rendered markdown. - ``` +`@function tutorial:also_hidden` -
+```mcfunction +say This is also hidden. +``` -- `@function tutorial:also_hidden` +`@function(strip_final_newline) tutorial:stripped` -
+```mcfunction +say This function doesn't have a final newline. +``` - ```mcfunction - say This is also hidden. - ``` +`@advancement tutorial:obtained_dead_bush` -
- -- `@function(strip_final_newline) tutorial:stripped` +```json +{ + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } +} +``` -
+`@function_tag(strip_final_newline) tutorial:something_else` - ```mcfunction - say This function doesn't have a final newline. - ``` +```json +{ + "values": ["tutorial:stripped"] +} +``` -
+`@function_tag tutorial:from_github` -- `@advancement tutorial:obtained_dead_bush` +```json +say foo +``` -
+### minecraft - ```json - { - "criteria": { - "dead_bush": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ +`@function_tag minecraft:load` + +```json +{ + "values": [ + "tutorial:greeting", + "#tutorial:something_else" + ] +} +``` + +`@loot_table minecraft:blocks/diamond_ore` + +```json +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] +} +``` + +`@loot_table minecraft:blocks/yellow_shulker_box` + +```json +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, { - "item": "minecraft:dead_bush" + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] } ] } - } - }, - "requirements": [ - [ - "dead_bush" ] - ], - "rewards": { - "function": "tutorial:obtained_dead_bush" } - } - ``` - -
- -- `@function_tag(strip_final_newline) tutorial:something_else` - -
- - ```json - { - "values": ["tutorial:stripped"] - } - ``` - -
- -- `@function_tag tutorial:from_github` - -
- - ```json - say foo - ``` - -
- -### minecraft - -- `@function_tag minecraft:load` - -
- - ```json - { - "values": [ - "tutorial:greeting", - "#tutorial:something_else" - ] - } - ``` - -
- -- `@loot_table minecraft:blocks/diamond_ore` - -
- - ```json - { - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:dead_bush" - } - ] - } - ] - } - ``` - -
- -- `@loot_table minecraft:blocks/yellow_shulker_box` - -
- - ```json - { - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "item": "minecraft:air", - "nbt": "{drop_contents:1b}" - } - } - ] - }, - { - "type": "minecraft:item", - "name": "minecraft:yellow_shulker_box", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Lock", - "target": "BlockEntityTag.Lock", - "op": "replace" - }, - { - "source": "LootTable", - "target": "BlockEntityTag.LootTable", - "op": "replace" - }, - { - "source": "LootTableSeed", - "target": "BlockEntityTag.LootTableSeed", - "op": "replace" - } - ] - }, - { - "function": "minecraft:set_contents", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ``` - -
+ ] +} +``` ### text_in_block -- `@function text_in_block:foo` - -
- - ```mcfunction - say foo - ``` +`@function text_in_block:foo` -
+```mcfunction +say foo +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md index d3258720d..b65717a28 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_append_modifier_txt__0.pack.md @@ -2,30 +2,22 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:hello` - -
- - ```mcfunction - say hello - say world - ``` +`@function demo:hello` -
+```mcfunction +say hello +say world +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md index a1784517d..276446e43 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic1_txt__0.pack.md @@ -2,39 +2,27 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` +`@function demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say bar - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md index 371d4c090..c407effce 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic2_txt__0.pack.md @@ -2,47 +2,35 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - @functionn demo:foo - say still in the same function - @@@@ - @ @ @ - ``` - -
- -- `@function demo:bar` - -
- - ```mcfunction - say bar - @function demo:bar - say hello - @function demo:bar - say world - ``` - -
+`@function demo:foo` + +```mcfunction +say foo +@functionn demo:foo +say still in the same function +@@@@ +@ @ @ +``` + +`@function demo:bar` + +```mcfunction +say bar + @function demo:bar + say hello + @function demo:bar + say world +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md index 2906cfbdd..d5fdfeef6 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_basic3_txt__0.pack.md @@ -2,39 +2,27 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say overwrite - ``` - -
- -- `@function demo:bar` +`@function demo:foo` -
+```mcfunction +say overwrite +``` - ```mcfunction - say bar - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md index 2b4f7e7d1..3d5a1a494 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_code_fragments_md__0.pack.md @@ -2,79 +2,51 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` - -
- - ```mcfunction - say bar - ``` - -
- -- `@function demo:hidden_foo` - -
- - ```mcfunction - say hidden foo - ``` - -
- -- `@function demo:hidden_bar` +`@function demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say hidden bar - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` -- `@function demo:embedded_foo` +`@function demo:hidden_foo` -
+```mcfunction +say hidden foo +``` - ```mcfunction - say embedded foo - ``` +`@function demo:hidden_bar` -
+```mcfunction +say hidden bar +``` -- `@function demo:embedded_bar` +`@function demo:embedded_foo` -
+```mcfunction +say embedded foo +``` - ```mcfunction - say embedded bar - ``` +`@function demo:embedded_bar` -
+```mcfunction +say embedded bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md index a79f34d39..89dfa1df7 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_combined_md__0.pack.md @@ -2,63 +2,47 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "description": "hello", - "pack_format": 7 - } +```json +{ + "pack": { + "description": "hello", + "pack_format": 7 } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` +`@function demo:foo` -
+```mcfunction +say foo +``` ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@blockstate minecraft:grass_block` +`@blockstate minecraft:grass_block` -
- - ```json - { - "variants": { - "snowy=false": { "model": "block/grass_block" }, - "snowy=true": { "model": "block/grass_block_snow" } - } +```json +{ + "variants": { + "snowy=false": { "model": "block/grass_block" }, + "snowy=true": { "model": "block/grass_block_snow" } } - ``` - -
+} +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md index ed6a43b2d..6ea3d7f8d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_compact_txt__0.pack.md @@ -2,39 +2,27 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function(strip_final_newline) demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` +`@function(strip_final_newline) demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say bar - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md index 64885221e..604cdfb7d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_download_fragment_txt__0.pack.md @@ -2,29 +2,21 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` +`@function demo:foo` -
+```mcfunction +say foo +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md index f370f312a..3f0624fc9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_embedded_vs_text_md__0.pack.md @@ -2,39 +2,27 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### evst -- `@function evst:thing1` - -
- - ```mcfunction - @function this is invalid - ``` - -
- -- `@function evst:thing2` +`@function evst:thing1` -
+```mcfunction +@function this is invalid +``` - ```mcfunction - @function this is invalid - ``` +`@function evst:thing2` -
+```mcfunction +@function this is invalid +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md index a9e4286e9..aeb7b8e13 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_empty_functions_txt__0.pack.md @@ -2,49 +2,33 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function(strip_final_newline) demo:foo` - -
- - ```mcfunction - - ``` - -
- -- `@function(strip_final_newline) demo:bar` - -
+`@function(strip_final_newline) demo:foo` - ```mcfunction +```mcfunction - ``` +``` -
+`@function(strip_final_newline) demo:bar` -- `@function(strip_final_newline) demo:thing` +```mcfunction -
+``` - ```mcfunction +`@function(strip_final_newline) demo:thing` - ``` +```mcfunction -
+``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md index e7a18ce30..a2cda9432 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_escaped_fragment_txt__0.pack.md @@ -2,33 +2,25 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - @function demo:foo - @@blah demo:foo - @function(@@) demo:bar - @@function(@@@) demo:bar - @function demo:bar - ``` +`@function demo:foo` -
+```mcfunction +@function demo:foo +@@blah demo:foo +@function(@@) demo:bar +@@function(@@@) demo:bar +@function demo:bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md index a1784517d..276446e43 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_folded_sections_md__0.pack.md @@ -2,39 +2,27 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` +`@function demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say bar - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md index 4f29741c1..dfa693d42 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_html_comments_md__0.pack.md @@ -2,39 +2,27 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "description": "My description", - "pack_format": 6 - } +```json +{ + "pack": { + "description": "My description", + "pack_format": 6 } - ``` - -
+} +``` ### demo -- `@function demo:foo` - -
- - ```mcfunction - say foo - ``` - -
- -- `@function demo:bar` +`@function demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say bar - ``` +`@function demo:bar` -
+```mcfunction +say bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md index 3918d9348..55a50cead 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_lang_txt__0.pack.md @@ -2,32 +2,24 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@language minecraft:custom` - -
- - ```json - { - "custom.foo": "foo", - "custom.bar": "bar" - } - ``` +`@language minecraft:custom` -
+```json +{ + "custom.foo": "foo", + "custom.bar": "bar" +} +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md index 55f81eafd..5074bc935 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_merge_modifier_txt__0.pack.md @@ -2,34 +2,26 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@function_tag minecraft:load` - -
- - ```json - { - "values": [ - "demo:foo", - "demo:bar" - ] - } - ``` +`@function_tag minecraft:load` -
+```json +{ + "values": [ + "demo:foo", + "demo:bar" + ] +} +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md index a0628070e..20ea210a9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_prepend_modifier_txt__0.pack.md @@ -2,30 +2,22 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function demo:hello` - -
- - ```mcfunction - say world - say hello - ``` +`@function demo:hello` -
+```mcfunction +say world +say hello +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md index bae050dfb..853b085c0 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_readme_example_md__0.pack.md @@ -2,43 +2,31 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### tutorial -- `@function tutorial:greeting` - -
- - ```mcfunction - say Hello, world! - ``` +`@function tutorial:greeting` -
+```mcfunction +say Hello, world! +``` ### minecraft -- `@function_tag minecraft:load` - -
- - ```json - { - "values": ["tutorial:greeting"] - } - ``` +`@function_tag minecraft:load` -
+```json +{ + "values": ["tutorial:greeting"] +} +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md index fc9b7bcf7..75d4cee02 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_sound_txt__0.pack.md @@ -2,38 +2,30 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@resource_pack assets/minecraft/sounds.json` +`@resource_pack assets/minecraft/sounds.json` -
- - ```json - { - "block.note_block.bit_1": { - "sounds": [ - "block/note_block/bit_1" - ], - "subtitle": "subtitles.block.note_block.note" - } +```json +{ + "block.note_block.bit_1": { + "sounds": [ + "block/note_block/bit_1" + ], + "subtitle": "subtitles.block.note_block.note" } - ``` - -
+} +``` -- [`@sound minecraft:block/note_block/bit_1`](data:audio/ogg;base64,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AJABAMAYg5BBBiFjEEIIIYQQQggJAAAYcAAACDChDBQashIASAUAAAxSijEHpaQUKcWYcxBKSSlSijHnIJSSUsWYcxBKSam1ijHnIJSSUmudcxBKSam1GDvnIJSSUmsxhhBKSam1GGMMIZSSUmsx1lpKSam1GGvMtZSSUmsx1lprSq21GGutNeeUWmsx1lpzzgUAIDQ4AIAd2LA6wknRWGChISsBgDwAAEgpxhhjjDGlFGOMMcaYUooxxhhjjDHGGGOMMaYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHmGGOMMcYYY8w5xhhjjDnmHGOMMcacc04AAFCBAwBAgI0imxOMBBUashIACAcAAIxhzDnnIJSQSqOUcxBCKCWVVhqlnIMSQikptZY5JyWlUlJqLbbMOSkplZJSay12ElJqLaXWYqyxg5BSa6m1FmONHYRSWootxhpz7SCUklprMcZaayilpdhirLHWmkMpqbUWY60151xSai3GWmvNteeSUmsxxlprrbmn1mKssdZcc+89tRZjjbXmnHvOBQCYPDgAQCXYOMNK0lnhaHChISsBgNwAAEYpxpxzDkIIIYQQQgiVUow55xyEEEIIIYQQKqUYc845CCGEEEIIIWSMOeccdBBCCCGEEELIGHPOOQghhBBCCCGE0DnnHIQQQgghhFBCKaVzzjkHIYQQQgghhFBK5xyEEEIIIYQSSiillM45CCGEEEIIpYRSSikhhBBCCCGEEkoppZRSOgghhBBCCKWUUkoppYQQQgghhBBKKaWUUkoJIYQQQgghlFJKKaWUEkIIIYQSSimllFJKKSWEEEIIoZRSSimllFJKCCGEUkoppZRSSimllBBCKCGUUkoppZRSSikhhBJKKKWUUkoppZRSQggllFJKKaWUUkoppYQQQiillFJKKaWUUkoJIZRSSimllFJKKaWUUgAA0IEDAECAEZUWYqcZVx6BIwoZJqBCQ1YCAOEAAAAhlFJKKaWUUmokpZRSSimllFIjJaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSqWUUkoppZRSSimllFJKKaWUUkoppQCoywwHwOgJG2dYSTorHA0uNGQl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) +[`@sound minecraft:block/note_block/bit_1`](data:audio/ogg;base64,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AJABAMAYg5BBBiFjEEIIIYQQQggJAAAYcAAACDChDBQashIASAUAAAxSijEHpaQUKcWYcxBKSSlSijHnIJSSUsWYcxBKSam1ijHnIJSSUmudcxBKSam1GDvnIJSSUmsxhhBKSam1GGMMIZSSUmsx1lpKSam1GGvMtZSSUmsx1lprSq21GGutNeeUWmsx1lpzzgUAIDQ4AIAd2LA6wknRWGChISsBgDwAAEgpxhhjjDGlFGOMMcaYUooxxhhjjDHGGGOMMaYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHmGGOMMcYYY8w5xhhjjDnmHGOMMcacc04AAFCBAwBAgI0imxOMBBUashIACAcAAIxhzDnnIJSQSqOUcxBCKCWVVhqlnIMSQikptZY5JyWlUlJqLbbMOSkplZJSay12ElJqLaXWYqyxg5BSa6m1FmONHYRSWootxhpz7SCUklprMcZaayilpdhirLHWmkMpqbUWY60151xSai3GWmvNteeSUmsxxlprrbmn1mKssdZcc+89tRZjjbXmnHvOBQCYPDgAQCXYOMNK0lnhaHChISsBgNwAAEYpxpxzDkIIIYQQQgiVUow55xyEEEIIIYQQKqUYc845CCGEEEIIIWSMOeccdBBCCCGEEELIGHPOOQghhBBCCCGE0DnnHIQQQgghhFBCKaVzzjkHIYQQQgghhFBK5xyEEEIIIYQSSiillM45CCGEEEIIpYRSSikhhBBCCCGEEkoppZRSOgghhBBCCKWUUkoppYQQQgghhBBKKaWUUkoJIYQQQgghlFJKKaWUEkIIIYQSSimllFJKKSWEEEIIoZRSSimllFJKCCGEUkoppZRSSimllBBCKCGUUkoppZRSSikhhBJKKKWUUkoppZRSQggllFJKKaWUUkoppYQQQiillFJKKaWUUkoJIZRSSimllFJKKaWUUgAA0IEDAECAEZUWYqcZVx6BIwoZJqBCQ1YCAOEAAAAhlFJKKaWUUmokpZRSSimllFIjJaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSqWUUkoppZRSSimllFJKKaWUUkoppQCoywwHwOgJG2dYSTorHA0uNGQl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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md index 559183a90..d40f720a3 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_strip_final_newline_txt__0.pack.md @@ -2,49 +2,33 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### demo -- `@function(strip_final_newline) demo:hello` - -
- - ```mcfunction - say hello - ``` - -
- -- `@function(strip_final_newline) demo:foo` - -
- - ```mcfunction - say foo - ``` +`@function(strip_final_newline) demo:hello` -
+```mcfunction +say hello +``` -- `@function(strip_final_newline) demo:bar` +`@function(strip_final_newline) demo:foo` -
+```mcfunction +say foo +``` - ```mcfunction - say bar - ``` +`@function(strip_final_newline) demo:bar` -
+```mcfunction +say bar +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md index 1b5b245c7..49a52abd5 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_inline_image_md__0.pack.md @@ -2,72 +2,48 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` +} +``` -
+`@data_pack pack.png` - ![data_pack.png](data:image/png;base64,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) - -
+![data_pack.png](data:image/png;base64,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) ## Resource pack -- `@resource_pack pack.mcmeta` - -
+`@resource_pack pack.mcmeta` - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### foo -- `@texture foo:hello` +`@texture foo:hello` -
- - ![texture.png](data:image/png;base64,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) - -
+![texture.png](data:image/png;base64,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) ### bar -- `@texture bar:hello` - -
+`@texture bar:hello` - ![texture.png](data:image/png;base64,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) - -
+![texture.png](data:image/png;base64,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) ### baz -- `@texture baz:hello` - -
- - ![texture.png](data:image/png;base64,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) +`@texture baz:hello` -
+![texture.png](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md index 3e8f64d08..5d915fbe3 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_lots_of_textures_md__0.pack.md @@ -2,219 +2,115 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@texture minecraft:block/green_concrete_powder` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACLklEQVQoUwXByXLcNhAA0EY3NoLbsGxLti+55ZDKPZ/jz8gnR2VpRhyuAAF05z31698/lWr4IhFGpZtheb6HMKZ8BmEBYD8mAIHSZd74ctiPgFBqBWMB9LNUbIYYxiuMqZ3S9Ao56fgMrvuU7Nvbheu9A3BNwJIFqj+f3oW63MOVQNu6PQHEKJ3X2fbfVmGnS7lK1s1whqE+P5p2Sst7EKEIW2VDmL2r59oqNueGACsSOgAp2cVobi9FitXatGPWqilRxU2LaG2j4KoVlstgrRdpRXT0vU8n10ylFK4CCpzzpFU8r5wg9HwecJ2kC3PoeLk31y7pou6WMdMVFRGklG/fEqrmeVcgrBSiItTkrkM1rQJk7+25IDn4+pNFlDDEqJ6fVQT2z2C9DreC/ZfNhup8BSBhGL4eSFI5t8Pej3790NaLwtoM+7HU/VPjPmM+KCUik0rlc21TrPO7BQ3nkabXLNlJofXRTq+7sYTtwH4o81uZXi6uFZEQKEfnrDaGjINSL0Xyx1/H8vDMlf7+50Wqazqcf9P0I54bkQauzAwsfK62n5RgWh7qOnQ8WBtj06EESjfR8Wy7cU8xlFJME4/7aNvEEJXyNfrxdbYeMF/QTklhvf9XmMs2B661H71zZBwCa6kmH05RAbbzW4c56X3WTahNi9YDEUzfU8myzVJKQbeSqQAKTSJ7ASokfTVdQRRmRumF6fGmjas2wO0lLR/D9mhvPxZEvT0aY/f/AVjYaSiNzb00AAAAAElFTkSuQmCC) - -
- -- `@texture minecraft:block/green_concrete` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAoklEQVQoz3WRyxHAIAhEtxhCLZISMP3XkQOouI4zHBg+7luEdYl4v2fLPZMRGi1EL6ajOjdH8akJmnNpTGuttxRUVF1iez+1fC55mguial3MxaaaLzPkDYQ7ASpPpUCtUsx7VFoEGWHkju/iLqxwd7/wwAzHMtHi7lLZlYt1yY+rAK3e9zgdqBEvVR5ywqbP/2r7fp6V5ohq81AA9KYzW9blB2ZZyT6my4nWAAAAAElFTkSuQmCC) - -
- -- `@texture minecraft:block/green_glazed_terracotta` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABMklEQVQoz12SvUoDURCF71OsteYHe58hYCobCaggJMVikUpIEwRJl8YyVRo7fZcETFIkr+MXvuWsCMPunbnnzJyZO6V+v8F2xxM2fOpiOX98PWCv6+7ss7f52RPELaD54RC6m/TvX65DGIwun98qCPPvfr28EFa8Bo0PIWSgcMaLivQQcOEQL0ETwra7AxGycg2aCITp6srzWZK6URK0peTDxEC3BISC5vQXTQq+KAGtNlsC2fSggebC3FwHDRlVaCPSNo1jbkEQkCHaySqvZHx2KUezjsKogB6CRRngbMs0qpJmBLRDLxlo3ogDd+R2euqx4JlgAnBEMdFcp0vfwZZagtGg06LqCd4+dpoKzId2cXwdc0c3LlCbgdasBjw5fP91aSIrN8uXbXOZQ8h6a1nvX8UXRs8wRVstAAAAAElFTkSuQmCC) - -
- -- `@texture minecraft:block/green_shulker_box` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABDElEQVQoz3VS2Q6CQAzc/xCPwP6Jxihq4gFR8Ii8eEX8/0en2+5SgiZNmLKdttPWpGe7eQxhAITvQ9jiYtOTwv7//GgNPtODnRV2VcWwWWnhCi4ULikGTIPccPAre/dh/Bzw8ppkdQRbVQnCUNaAJBF1tHsNYBxB9u5rF2GTPDEgESEEtS3/9LgaFyQCNOiWdHrtsgyvoZAilK+Otk9pQ/rx6UU0a6A399AFwnFFxrtYCCFrkzv080NDoXSHlJrAY+WW1reR207yb1AtDc0e/Bv1pmfVKsJ7cASZtx9Ud6wNgcfKJwCtchoK83AB0LnbA45vH46MlMFtDq7sHB/vD2pQDsZHLvhEGLPX/7+0ZtOv+bCbWwAAAABJRU5ErkJggg==) - -
- -- `@texture minecraft:block/green_stained_glass_pane_top` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPklEQVR42mNgwANS642eJVYZPGMgF4AMiCvTp8wAilwA0kyxASBXDFwYgFwwsAYMvBeGQUocHF5IrjHEawAAqHU+aprkHnQAAAAASUVORK5CYII=) - -
- -- `@texture minecraft:block/green_stained_glass` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4y2NIqzdeTAlmgDLSyMRYDZhNiQGzKXHBbGp5YdSAEWPAbEoMmE0TL5CNAYkBjWW6vToCAAAAAElFTkSuQmCC) - -
- -- `@texture minecraft:block/green_terracotta` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUUlEQVQ4EQXBwQEcNxADMHCkatxKfu6/Et9qGCD//f1TCoDIjJloa99z7lHs97QFQsSFiLlHYHnivY+WsLtmxpzjvWcEVF2J1+p7tKgiICaj2C1IRg62qDthzuiW1qIliZPYVgsYgj60iikGk8iMMwdUva4W6t7jzgEtZhD3TLytiC26zgwAIN6uIAmhW/ces1tJFABtKcfQaqtblIlJzMT3PZfoW1UwM2B37dQ4dldLi7eaiJg5LuQMeN/HFouxr6jMOIOgSES897nQXS0TWARQSbTP24BMaJ0z5hy3+0hIKMS9F3zfP3KNmBMV+x7h/Z6qW6QkVYN675HgmkTCLqwkMtFg1yUKJWjQaovIHHnP7iqCCEXiZgIgE93KHX6fWt/vJ1hrjECZO1KuVhOK30/FbgUE0cTNgG61a3+VGbciEHquYMQMb6mKqLKrqogo/gcV6vrcd5o15AAAAABJRU5ErkJggg==) - -
- -- `@texture minecraft:block/green_wool` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABjUlEQVQoFT3S51KCQQyF4b0KPrCAgjejiNhQVIoNe8eC5bfX7bOGYWZnyGZzTt7kI7VOlzYvquvHy62T5Z3b+YO3YuNsqX1e23+udMfltX5DvnM/5wiag3ravZvfe6qMfvM5+igUbV0tOvFMKV49WmkO63y3rxeSot6kJLt9s9D/Lok7D3OulOLuS9kZ/JTYybDOHUgPXqcyMTClwMgETtRkhEkpEWnkWdYAlLjXeivtUQ03pPVhPeffCpCeEjg/BOGqNNYgI9ZQn+agQUmweVlNMe7he/YG42jI22ye7IogasxgvMTDmaVUaIWVH9eYTRJ57zPnE509AAPt7g0MC1feNHi0FftW5knxAA4DaPN423vMstn3sXGmQZG46pX7jHMKjyCDAfgoiM1DqQlIm0x+stljxYl5bJBf5PVX/b/oBgrxdOiA0c3HBurKkpL9DEa1eZI7gPj4BHgUIaEJdJAWLRZgTiz7X/njK5IKYtv0ZgZbQmX9fAHjTP6xZuAt6y5LpiFXseaeYh56T3/wfd3gVVhWmQAAAABJRU5ErkJggg==) - -
- -- `@texture minecraft:block/grindstone_pivot` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4y2PwN5L4jw1HmEEwjM2ACyArhmmw0xTCMASnASDFyBpB2EpFEC5G0AXoikEGGMjxYbgCrwHotoMMQPcKTgNAimGakDHMQIIuGAWjYFAAAEsaXKFOwPwFAAAAAElFTkSuQmCC) - -
- -- `@texture minecraft:block/grindstone_round` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVQ4y+2SwQkAIQwELdcC/FuCfxuwAfvLMcJC8HPJvU+QFTGTbEyZc9re26T+jJa3xaPWmo0xzu69W631aBigAAEEXGvlKvCQMACvAHxmzmELZMECgQJIgX9qYqoHPPK+CVZFKYAvP9VELNwVSFPfeH8hd+FBIpNGVzs8yv8qD2Su/2cwWvHkAAAAAElFTkSuQmCC) - -
- -- `@texture minecraft:block/grindstone_side` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVQ4y+2S0QkAIQxDHdcB/HcE/13ABdzPI0KkxPZugSuUaqjPEk1jjDXnXKhc233v/ST0pIGmWuvO1tpJaqWUnViHADTwEJsVCP0TwKoTEBYC9HY7tgXDhwsAqt6Yc96pk7kAiLbJAxDsAvgK2qxmhiZyAoVY91lxmQtQ9zmBNRI1BLwdstDwGb0vTI3fmFr644oHfph7ITBuISIAAAAASUVORK5CYII=) - -
- -- `@texture minecraft:block/hay_block_side` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4y5WTvQkCQRSEXyEighhpoIEFGBpaiw2YCYaHJWh0uakFWNTKO/iOYW5XMFhm3/8ybzZu50V597tyv8wHTPvz2o422HeriZ154YmJ3iCTvVEOynvkhSQCWkicApATz+OmPE7r0h2WA3LS5lz3s2o8MfSJOsH9Hudl0SIJMlsNRw4ohFUnsxZXUicNvJH6a3nhjn8xdGIr8dcLo6Y8JYu7kqukB7tmv6mLtNEHdlMH7BO16cFH3JU56ECFobJ26eoQlXbUFOh/wv8GOGyhVqikYvu2wC+PC1PqFZeh3AAAAABJRU5ErkJggg==) - -
- -- `@texture minecraft:block/hay_block_top` - -
- - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0klEQVQ4T22TsQ0DMQwDVX7pVTNAJgjSZYV0qdJnhMz0AR84gc+oMN62JJIS/fV5rv1xXfvrvh1L+9tl9Z5F3O+1LyULRIcE03IwL6amPPn73hoo750EUH3LGQiqgDPM5EGis2JFzy4ti4g7EfueQfaKEpI9rnvOpxkoeZJPkTO3AgrdPp82fbs73lKBDhAqUkEqOdmYHovB30fKd5trmvjE6i14K38uZM/5UjNeLnGy0oeGfED7HXhyqvBW8p85ADJpGhTOOEEr8OniwNTG5JRqf83aPKMvuldQAAAAAElFTkSuQmCC) +`@texture minecraft:block/green_concrete_powder` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACLklEQVQoUwXByXLcNhAA0EY3NoLbsGxLti+55ZDKPZ/jz8gnR2VpRhyuAAF05z31698/lWr4IhFGpZtheb6HMKZ8BmEBYD8mAIHSZd74ctiPgFBqBWMB9LNUbIYYxiuMqZ3S9Ao56fgMrvuU7Nvbheu9A3BNwJIFqj+f3oW63MOVQNu6PQHEKJ3X2fbfVmGnS7lK1s1whqE+P5p2Sst7EKEIW2VDmL2r59oqNueGACsSOgAp2cVobi9FitXatGPWqilRxU2LaG2j4KoVlstgrRdpRXT0vU8n10ylFK4CCpzzpFU8r5wg9HwecJ2kC3PoeLk31y7pou6WMdMVFRGklG/fEqrmeVcgrBSiItTkrkM1rQJk7+25IDn4+pNFlDDEqJ6fVQT2z2C9DreC/ZfNhup8BSBhGL4eSFI5t8Pej3790NaLwtoM+7HU/VPjPmM+KCUik0rlc21TrPO7BQ3nkabXLNlJofXRTq+7sYTtwH4o81uZXi6uFZEQKEfnrDaGjINSL0Xyx1/H8vDMlf7+50Wqazqcf9P0I54bkQauzAwsfK62n5RgWh7qOnQ8WBtj06EESjfR8Wy7cU8xlFJME4/7aNvEEJXyNfrxdbYeMF/QTklhvf9XmMs2B661H71zZBwCa6kmH05RAbbzW4c56X3WTahNi9YDEUzfU8myzVJKQbeSqQAKTSJ7ASokfTVdQRRmRumF6fGmjas2wO0lLR/D9mhvPxZEvT0aY/f/AVjYaSiNzb00AAAAAElFTkSuQmCC) -- `@texture minecraft:block/honey_block_bottom` +`@texture minecraft:block/green_concrete` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAoklEQVQoz3WRyxHAIAhEtxhCLZISMP3XkQOouI4zHBg+7luEdYl4v2fLPZMRGi1EL6ajOjdH8akJmnNpTGuttxRUVF1iez+1fC55mguial3MxaaaLzPkDYQ7ASpPpUCtUsx7VFoEGWHkju/iLqxwd7/wwAzHMtHi7lLZlYt1yY+rAK3e9zgdqBEvVR5ywqbP/2r7fp6V5ohq81AA9KYzW9blB2ZZyT6my4nWAAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMNJREFUOMt9k80JQkEMhAOePL67ZdiaZ3llvBqswl68WYAgCJLALJ/zsh6GzbKZye/G+3Zaic/9XJCd52s7rs/rUqf7BS/pIIggW9BdvBCZAiQkHpfDTlTZlIA/iJT4l0kiWKNHpUhHTjuUupM6UECBK4MuqpfgfdgJyGlWAt80yiph1pwuI9+FEvASOrIH4IKFR5xFZuo/Aj66zubiSGCMkZ2diTmZuzMWyT8NSfwvjD4WyZUdFCK5esDv687eAyenzxdCexZaW6y0mgAAAABJRU5ErkJggg==) +`@texture minecraft:block/green_glazed_terracotta` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABMklEQVQoz12SvUoDURCF71OsteYHe58hYCobCaggJMVikUpIEwRJl8YyVRo7fZcETFIkr+MXvuWsCMPunbnnzJyZO6V+v8F2xxM2fOpiOX98PWCv6+7ss7f52RPELaD54RC6m/TvX65DGIwun98qCPPvfr28EFa8Bo0PIWSgcMaLivQQcOEQL0ETwra7AxGycg2aCITp6srzWZK6URK0peTDxEC3BISC5vQXTQq+KAGtNlsC2fSggebC3FwHDRlVaCPSNo1jbkEQkCHaySqvZHx2KUezjsKogB6CRRngbMs0qpJmBLRDLxlo3ogDd+R2euqx4JlgAnBEMdFcp0vfwZZagtGg06LqCd4+dpoKzId2cXwdc0c3LlCbgdasBjw5fP91aSIrN8uXbXOZQ8h6a1nvX8UXRs8wRVstAAAAAElFTkSuQmCC) -- `@texture minecraft:block/honey_block_side` +`@texture minecraft:block/green_shulker_box` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABDElEQVQoz3VS2Q6CQAzc/xCPwP6Jxihq4gFR8Ii8eEX8/0en2+5SgiZNmLKdttPWpGe7eQxhAITvQ9jiYtOTwv7//GgNPtODnRV2VcWwWWnhCi4ULikGTIPccPAre/dh/Bzw8ppkdQRbVQnCUNaAJBF1tHsNYBxB9u5rF2GTPDEgESEEtS3/9LgaFyQCNOiWdHrtsgyvoZAilK+Otk9pQ/rx6UU0a6A399AFwnFFxrtYCCFrkzv080NDoXSHlJrAY+WW1reR207yb1AtDc0e/Bv1pmfVKsJ7cASZtx9Ud6wNgcfKJwCtchoK83AB0LnbA45vH46MlMFtDq7sHB/vD2pQDsZHLvhEGLPX/7+0ZtOv+bCbWwAAAABJRU5ErkJggg==) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMZJREFUOMuFk80NwjAUg31lB8ZgHXZgDjZgBmbIgQVYgCM7AEJCoBfpk1yTtger0YvtvL/qfd428Lns2ut+7HjcDu173XdUvFCc52nTQUwICyVyYMAZE4cIQpwTutizEGIEEOu7VEKhZ+AlFDlThJhCzhODTDFFnhE8cTkCd15OlqQ1Ii9nD+ArR7PWPC95sgej2tOYXfFlk7+0NK5CirvBaGVzKohHi6ZREGRT/ZE/gzkTRJkhXLkgL+d+IOcpiTnGXKxs7g+3G64wjFJPVQAAAABJRU5ErkJggg==) +`@texture minecraft:block/green_stained_glass_pane_top` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPklEQVR42mNgwANS642eJVYZPGMgF4AMiCvTp8wAilwA0kyxASBXDFwYgFwwsAYMvBeGQUocHF5IrjHEawAAqHU+aprkHnQAAAAASUVORK5CYII=) -- `@texture minecraft:block/honey_block_top` +`@texture minecraft:block/green_stained_glass` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4y2NIqzdeTAlmgDLSyMRYDZhNiQGzKXHBbGp5YdSAEWPAbEoMmE0TL5CNAYkBjWW6vToCAAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE+VktENAjEMQ/PLDoxx67ADc7ABM9wQJxZgAT7ZgUNICORIjlwrIPiI1GvzXDu9WI+bBfU8TVWv825Y6zfqdtnn3mPeLqEwmxVAE4rn9+uhzgcBhzvQYbDBJrVOWEXcUQl4Ps/tYgRRGYGNXQQ2doVz9IbCv0A6l0Ggs6iQz4NOQ2//Fy6Bbjg+/Q7OCF32T6/iQ04HfruD+G1ZKlDP6NYV5N9HmMJkBgE6cZi3Yo8wmYzgg1PbCmt2HXK4fYe/3Y71G0k0p/74OnvSAAAAAElFTkSuQmCC) +`@texture minecraft:block/green_terracotta` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUUlEQVQ4EQXBwQEcNxADMHCkatxKfu6/Et9qGCD//f1TCoDIjJloa99z7lHs97QFQsSFiLlHYHnivY+WsLtmxpzjvWcEVF2J1+p7tKgiICaj2C1IRg62qDthzuiW1qIliZPYVgsYgj60iikGk8iMMwdUva4W6t7jzgEtZhD3TLytiC26zgwAIN6uIAmhW/ces1tJFABtKcfQaqtblIlJzMT3PZfoW1UwM2B37dQ4dldLi7eaiJg5LuQMeN/HFouxr6jMOIOgSES897nQXS0TWARQSbTP24BMaJ0z5hy3+0hIKMS9F3zfP3KNmBMV+x7h/Z6qW6QkVYN675HgmkTCLqwkMtFg1yUKJWjQaovIHHnP7iqCCEXiZgIgE93KHX6fWt/vJ1hrjECZO1KuVhOK30/FbgUE0cTNgG61a3+VGbciEHquYMQMb6mKqLKrqogo/gcV6vrcd5o15AAAAABJRU5ErkJggg==) -- `@texture minecraft:block/honeycomb_block` +`@texture minecraft:block/green_wool` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABjUlEQVQoFT3S51KCQQyF4b0KPrCAgjejiNhQVIoNe8eC5bfX7bOGYWZnyGZzTt7kI7VOlzYvquvHy62T5Z3b+YO3YuNsqX1e23+udMfltX5DvnM/5wiag3ravZvfe6qMfvM5+igUbV0tOvFMKV49WmkO63y3rxeSot6kJLt9s9D/Lok7D3OulOLuS9kZ/JTYybDOHUgPXqcyMTClwMgETtRkhEkpEWnkWdYAlLjXeivtUQ03pPVhPeffCpCeEjg/BOGqNNYgI9ZQn+agQUmweVlNMe7he/YG42jI22ye7IogasxgvMTDmaVUaIWVH9eYTRJ57zPnE509AAPt7g0MC1feNHi0FftW5knxAA4DaPN423vMstn3sXGmQZG46pX7jHMKjyCDAfgoiM1DqQlIm0x+stljxYl5bJBf5PVX/b/oBgrxdOiA0c3HBurKkpL9DEa1eZI7gPj4BHgUIaEJdJAWLRZgTiz7X/njK5IKYtv0ZgZbQmX9fAHjTP6xZuAt6y5LpiFXseaeYh56T3/wfd3gVVhWmQAAAABJRU5ErkJggg==) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4jY2TsQ1CMQxELdEwBKuxABPQsQCbsAgVNQNQMAONkcN/0X3HAQrr6+dyts++2P248ed5637b++uyaxH/18MnwMEUD8wgc8jl+BJKyrjlilyKpHT1DW8JFKQ1f5x6goy1BAs+dKAXVHOc6zzArdIcIKSMQ6aorTRFW0IeNAsOZl2zDE3J4K1yMRPLe2alJMk+QUpPABmC+uIvH6iJckViOhPWqO0S6oNqJoMPlFz5YOaTnz5gA1MfrDQve562XPmgaxYflG9Dnrtib05rlmsKX069AAAAAElFTkSuQmCC) +`@texture minecraft:block/grindstone_pivot` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4y2PwN5L4jw1HmEEwjM2ACyArhmmw0xTCMASnASDFyBpB2EpFEC5G0AXoikEGGMjxYbgCrwHotoMMQPcKTgNAimGakDHMQIIuGAWjYFAAAEsaXKFOwPwFAAAAAElFTkSuQmCC) -- `@texture minecraft:block/hopper_inside` +`@texture minecraft:block/grindstone_round` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVQ4y+2SwQkAIQwELdcC/FuCfxuwAfvLMcJC8HPJvU+QFTGTbEyZc9re26T+jJa3xaPWmo0xzu69W631aBigAAEEXGvlKvCQMACvAHxmzmELZMECgQJIgX9qYqoHPPK+CVZFKYAvP9VELNwVSFPfeH8hd+FBIpNGVzs8yv8qD2Su/2cwWvHkAAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVQ4T42TSwqAMAxEe5supBvpwpWC97+T0kIkmYxJF4+Azbx+Ldd5PxG9Hx9svLBGTWv7BL8bAQtoUCTVCbB5UOv2K50CNrOERtXgdoxAJBhiEirQs2cCtwVcfgY9xNUwbsMIViR4E+4aMwnehBNIE4ZYOHyJbLlYl14ijmnCn4kFMGwEjCgovGDklo39eI+0AAAAAElFTkSuQmCC) +`@texture minecraft:block/grindstone_side` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVQ4y+2S0QkAIQxDHdcB/HcE/13ABdzPI0KkxPZugSuUaqjPEk1jjDXnXKhc233v/ST0pIGmWuvO1tpJaqWUnViHADTwEJsVCP0TwKoTEBYC9HY7tgXDhwsAqt6Yc96pk7kAiLbJAxDsAvgK2qxmhiZyAoVY91lxmQtQ9zmBNRI1BLwdstDwGb0vTI3fmFr644oHfph7ITBuISIAAAAASUVORK5CYII=) -- `@texture minecraft:block/hopper_outside` +`@texture minecraft:block/hay_block_side` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4y5WTvQkCQRSEXyEighhpoIEFGBpaiw2YCYaHJWh0uakFWNTKO/iOYW5XMFhm3/8ybzZu50V597tyv8wHTPvz2o422HeriZ154YmJ3iCTvVEOynvkhSQCWkicApATz+OmPE7r0h2WA3LS5lz3s2o8MfSJOsH9Hudl0SIJMlsNRw4ohFUnsxZXUicNvJH6a3nhjn8xdGIr8dcLo6Y8JYu7kqukB7tmv6mLtNEHdlMH7BO16cFH3JU56ECFobJ26eoQlXbUFOh/wv8GOGyhVqikYvu2wC+PC1PqFZeh3AAAAABJRU5ErkJggg==) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y6VSOQ6EMBDzh2hWKahYiYqt0kJJxf9fEJRIXjmjCWdhZS6biQO2dU3LPBfk+Aic0XkwiTEWML8KeETmerbm8JumpPBIlsw8z0MHrJgnrmcRYPAdxkdA132SRQh9Ba1rP8dgQkWNFV491yoT2TjzofKABLprxbTGl2C/bOCt1vq6Xf8v8AbuK9wBPGdbjmuPV4Il6X0tya7f/JHuYAdS88e7oGJfrwAAAABJRU5ErkJggg==) +`@texture minecraft:block/hay_block_top` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0klEQVQ4T22TsQ0DMQwDVX7pVTNAJgjSZYV0qdJnhMz0AR84gc+oMN62JJIS/fV5rv1xXfvrvh1L+9tl9Z5F3O+1LyULRIcE03IwL6amPPn73hoo750EUH3LGQiqgDPM5EGis2JFzy4ti4g7EfueQfaKEpI9rnvOpxkoeZJPkTO3AgrdPp82fbs73lKBDhAqUkEqOdmYHovB30fKd5trmvjE6i14K38uZM/5UjNeLnGy0oeGfED7HXhyqvBW8p85ADJpGhTOOEEr8OniwNTG5JRqf83aPKMvuldQAAAAAElFTkSuQmCC) -- `@texture minecraft:block/hopper_top` +`@texture minecraft:block/honey_block_bottom` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMNJREFUOMt9k80JQkEMhAOePL67ZdiaZ3llvBqswl68WYAgCJLALJ/zsh6GzbKZye/G+3Zaic/9XJCd52s7rs/rUqf7BS/pIIggW9BdvBCZAiQkHpfDTlTZlIA/iJT4l0kiWKNHpUhHTjuUupM6UECBK4MuqpfgfdgJyGlWAt80yiph1pwuI9+FEvASOrIH4IKFR5xFZuo/Aj66zubiSGCMkZ2diTmZuzMWyT8NSfwvjD4WyZUdFCK5esDv687eAyenzxdCexZaW6y0mgAAAABJRU5ErkJggg==) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4y2Pw9PD47+/vD8aRERFwnJ6YiIJh4jC1IAzSywBjkINBeuEGmJhY/Le3cyIKg9RiGACSYCASgNTCDQD5i1wDQHopNwAUwuQaANI7HAwY+Fig2ACqJWWyMxOl2RkAZowlDF2IQ5oAAAAASUVORK5CYII=) +`@texture minecraft:block/honey_block_side` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMZJREFUOMuFk80NwjAUg31lB8ZgHXZgDjZgBmbIgQVYgCM7AEJCoBfpk1yTtger0YvtvL/qfd428Lns2ut+7HjcDu173XdUvFCc52nTQUwICyVyYMAZE4cIQpwTutizEGIEEOu7VEKhZ+AlFDlThJhCzhODTDFFnhE8cTkCd15OlqQ1Ii9nD+ArR7PWPC95sgej2tOYXfFlk7+0NK5CirvBaGVzKohHi6ZREGRT/ZE/gzkTRJkhXLkgL+d+IOcpiTnGXKxs7g+3G64wjFJPVQAAAABJRU5ErkJggg==) -- `@texture minecraft:block/horn_coral_block` +`@texture minecraft:block/honey_block_top` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE+VktENAjEMQ/PLDoxx67ADc7ABM9wQJxZgAT7ZgUNICORIjlwrIPiI1GvzXDu9WI+bBfU8TVWv825Y6zfqdtnn3mPeLqEwmxVAE4rn9+uhzgcBhzvQYbDBJrVOWEXcUQl4Ps/tYgRRGYGNXQQ2doVz9IbCv0A6l0Ggs6iQz4NOQ2//Fy6Bbjg+/Q7OCF32T6/iQ04HfruD+G1ZKlDP6NYV5N9HmMJkBgE6cZi3Yo8wmYzgg1PbCmt2HXK4fYe/3Y71G0k0p/74OnvSAAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4y32SMQpCQRBDcyQbW8FWvJi38A6CpRewsrD5taWe4UsW3hICWgx/Z2eSmU2+Hpf9ejtv18/7OML5874b8e+Os7rwWg4j9zcJIHGeA3U9bWbRIICcXcup9E8CLikkWW/iye5ja4cA0ZgkEKCTc6YzQAmmOQMQhN2vfHuu3FPbATCisQVkA9ccPRkSpUBuskhMdrRw6Y5rSv/bonYo1YdUvK0Fakf4pt0+K9VttWmCEHAKrVb+1z+PTi20+gIxASeoLR8acJGe57tz7QROAqakTa102phPc3wBggHhFG101/IAAAAASUVORK5CYII=) +`@texture minecraft:block/honeycomb_block` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4jY2TsQ1CMQxELdEwBKuxABPQsQCbsAgVNQNQMAONkcN/0X3HAQrr6+dyts++2P248ed5637b++uyaxH/18MnwMEUD8wgc8jl+BJKyrjlilyKpHT1DW8JFKQ1f5x6goy1BAs+dKAXVHOc6zzArdIcIKSMQ6aorTRFW0IeNAsOZl2zDE3J4K1yMRPLe2alJMk+QUpPABmC+uIvH6iJckViOhPWqO0S6oNqJoMPlFz5YOaTnz5gA1MfrDQve562XPmgaxYflG9Dnrtib05rlmsKX069AAAAAElFTkSuQmCC) -- `@texture minecraft:block/horn_coral_fan` +`@texture minecraft:block/hopper_inside` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVQ4T42TSwqAMAxEe5supBvpwpWC97+T0kIkmYxJF4+Azbx+Ldd5PxG9Hx9svLBGTWv7BL8bAQtoUCTVCbB5UOv2K50CNrOERtXgdoxAJBhiEirQs2cCtwVcfgY9xNUwbsMIViR4E+4aMwnehBNIE4ZYOHyJbLlYl14ijmnCn4kFMGwEjCgovGDklo39eI+0AAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4y+2RPQqEUAyEPZLNtoK9F9tbeAfB0gtYWXiL9QxPRvjCvKeIrbBp8jeZTEhV/e0FNvWf9Bg8fuvkA8vQpnVuovaITCANKtbw9usywksSFWmwlVgEEMoTB5HAXmSrq4DQsaGGLS6T/E6Nk2W3ugoHkTvxkXOLg2m63LIfak432Sfkea2/GJXxBX5dgqhRL5fI77u5Au//Aj6TAAAAAElFTkSuQmCC) +`@texture minecraft:block/hopper_outside` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y6VSOQ6EMBDzh2hWKahYiYqt0kJJxf9fEJRIXjmjCWdhZS6biQO2dU3LPBfk+Aic0XkwiTEWML8KeETmerbm8JumpPBIlsw8z0MHrJgnrmcRYPAdxkdA132SRQh9Ba1rP8dgQkWNFV491yoT2TjzofKABLprxbTGl2C/bOCt1vq6Xf8v8AbuK9wBPGdbjmuPV4Il6X0tya7f/JHuYAdS88e7oGJfrwAAAABJRU5ErkJggg==) -- `@texture minecraft:block/horn_coral` +`@texture minecraft:block/hopper_top` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4y2Pw9PD47+/vD8aRERFwnJ6YiIJh4jC1IAzSywBjkINBeuEGmJhY/Le3cyIKg9RiGACSYCASgNTCDQD5i1wDQHopNwAUwuQaANI7HAwY+Fig2ACqJWWyMxOl2RkAZowlDF2IQ5oAAAAASUVORK5CYII=) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVQ4y82SPQqAMAyFPZKLq+AqXsxbeAfB0Qs4Obg4O+oZlG94EGsqdTNQ0ubnJS9plv1StrU+OaFtmcozCYDAY29uINznvkoDCEG4o4c2TwdASCBx7Ipb9SgdjzsgCgYEP525dDB6Tt6igf9R3VbGKQBpuoBGdAsE2IEJxHZCzOsWFKDpo+3UQ384KxfIG6boPlZKkowC8Wyvf0EB9sgmQFFI/kjeQD+JthJr/QITIhaSwEOMBwAAAABJRU5ErkJggg==) +`@texture minecraft:block/horn_coral_block` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4y32SMQpCQRBDcyQbW8FWvJi38A6CpRewsrD5taWe4UsW3hICWgx/Z2eSmU2+Hpf9ejtv18/7OML5874b8e+Os7rwWg4j9zcJIHGeA3U9bWbRIICcXcup9E8CLikkWW/iye5ja4cA0ZgkEKCTc6YzQAmmOQMQhN2vfHuu3FPbATCisQVkA9ccPRkSpUBuskhMdrRw6Y5rSv/bonYo1YdUvK0Fakf4pt0+K9VttWmCEHAKrVb+1z+PTi20+gIxASeoLR8acJGe57tz7QROAqakTa102phPc3wBggHhFG101/IAAAAASUVORK5CYII=) -- `@texture minecraft:block/ice` +`@texture minecraft:block/horn_coral_fan` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4y+2RPQqEUAyEPZLNtoK9F9tbeAfB0gtYWXiL9QxPRvjCvKeIrbBp8jeZTEhV/e0FNvWf9Bg8fuvkA8vQpnVuovaITCANKtbw9usywksSFWmwlVgEEMoTB5HAXmSrq4DQsaGGLS6T/E6Nk2W3ugoHkTvxkXOLg2m63LIfak432Sfkea2/GJXxBX5dgqhRL5fI77u5Au//Aj6TAAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4y42TMQ4CQQhFOb2VlTfwAjZWJmYbGw9g6VV0DZi/ef5lJxY/kwE+DB8mdqfXJBwu78L1MU/H27zcE/vzF2kX0h5OptPJ8suWvEogZ4cRuRIwsCPKzlMJ8gyv4sHUyJOWBm7wKiQzRlqtNGBCVt0SOUbPc22SyBGXBl0VgT4nyx9bI2T/Sbo/1+SfMXLOvp2+WGw7XBiq35EZUyK6qqPRdTsT7I3V/yEvL+i2znXp/kUWj0607ktzTzjSD5P1BaI086n9AAAAAElFTkSuQmCC) +`@texture minecraft:block/horn_coral` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVQ4y82SPQqAMAyFPZKLq+AqXsxbeAfB0Qs4Obg4O+oZlG94EGsqdTNQ0ubnJS9plv1StrU+OaFtmcozCYDAY29uINznvkoDCEG4o4c2TwdASCBx7Ipb9SgdjzsgCgYEP525dDB6Tt6igf9R3VbGKQBpuoBGdAsE2IEJxHZCzOsWFKDpo+3UQ384KxfIG6boPlZKkowC8Wyvf0EB9sgmQFFI/kjeQD+JthJr/QITIhaSwEOMBwAAAABJRU5ErkJggg==) -- `@texture minecraft:block/iron_bars` +`@texture minecraft:block/ice` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4y42TMQ4CQQhFOb2VlTfwAjZWJmYbGw9g6VV0DZi/ef5lJxY/kwE+DB8mdqfXJBwu78L1MU/H27zcE/vzF2kX0h5OptPJ8suWvEogZ4cRuRIwsCPKzlMJ8gyv4sHUyJOWBm7wKiQzRlqtNGBCVt0SOUbPc22SyBGXBl0VgT4nyx9bI2T/Sbo/1+SfMXLOvp2+WGw7XBiq35EZUyK6qqPRdTsT7I3V/yEvL+i2znXp/kUWj0607ktzTzjSD5P1BaI086n9AAAAAElFTkSuQmCC) - ![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAk0lEQVQ4y5WT0Q2AIAxEGZcvP/xzFzbANZgLc0RMI3e2NjGBtpzcA1K6o56178fWkwnMc85ubkRrbRFA7pcAdlFKGUKYM1HUqcC0gCI+jJktKTD/zES9PukNAixHBaJ+lz40KWBsV+jDmsfKFzBly8J2gYUZMLrRk4kDE7kQMAubXqQIsAlb3sR3QXGRb4EJeK/xAozELiCgYbMzAAAAAElFTkSuQmCC) +`@texture minecraft:block/iron_bars` -
+![texture.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAk0lEQVQ4y5WT0Q2AIAxEGZcvP/xzFzbANZgLc0RMI3e2NjGBtpzcA1K6o56178fWkwnMc85ubkRrbRFA7pcAdlFKGUKYM1HUqcC0gCI+jJktKTD/zES9PukNAixHBaJ+lz40KWBsV+jDmsfKFzBly8J2gYUZMLrRk4kDE7kQMAubXqQIsAlb3sR3QXGRb4EJeK/xAozELiCgYbMzAAAAAElFTkSuQmCC) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md index 3520ab21c..d38e5fc02 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_data_url_md__0.pack.md @@ -2,50 +2,34 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](data:image/png;base64,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) +`@data_pack pack.png` -
+![data_pack.png](data:image/png;base64,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) ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
- -- `@resource_pack pack.png` - -
+} +``` - ![resource_pack.png](data:image/png;base64,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) +`@resource_pack pack.png` -
+![resource_pack.png](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md index 0364b0547..a942d71d1 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_icon_link_md__0.pack.md @@ -2,25 +2,17 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](data:image/png;base64,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) +`@data_pack pack.png` -
+![data_pack.png](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md index 7c64844e3..9efd5d65d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_pack_local_icon_md__0.pack.md @@ -2,25 +2,17 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](data:image/png;base64,UklGRsQ0AABXRUJQVlA4WAoAAAAQAAAAKwEAKwEAQUxQSBQCAAABCbdtJDkSZmq8yz/i1XXi34zo/wTEIqHEgQMHDhw4cLCvpjhRE5yICRx5iEHk9BoOHExF1S4WtuPI/lK+0CX5lNnks5Tj3wpHkiTFDfX/R3PzBpoug2UiJgCC20aOpOkFmpvz7oW2H9A239DoGrg66viP4z+O/zj+4+aPhTW6hUUsrAvbhNPC2rsJp4W1dxNOC2vvJpwW1t5NOP1c7e1UryDbQKNbWF/ev3jT8f/Ef1JO3K2sC7wloun+BAK2TnCnBmTtlhaO/9sZfetEranqqrj3JaKWhwYVqhZUp3pQmWpCVaoLFak2VKP6IGspPWSFDiArngFZQRbIivxAVjgKsmJkkBW4g6xoImSFOCEr7gpZwWDIilBDVtgcsmL5kFVgAFlVD5BVigFZ9SGQVbQCWZU0kFXeA1k1R/Ckj1vVOP5v95ANEPDIj4Cn/+IivAYguCQBptZ9mVpPaGqdqqn1z6bW1ZvKa5jKAZnKl5nKLZrKw5rKWZvK75vqhTDVN2Kqx8ZUP5Kp3i1TfW6megJN9U+a6jU11ZdrqofZVL+3rd54SYCo7DFEJbUhKtcOUS0AENWZAFENExDVx4EE7SXXUgJcRylwDSXB/EqDuZUI8yoV5lQyzKd0mEsJMY9SYg4lxXilxVglxjilxhglx+eVHp+VJEBU8zNE9WRDVKs4RHWwQ1RjPez0+z+XHTyWJKD58kYDVlA4IIoyAAAQwQCdASosASwBPhUIgkEhBuPeBABRLG3cLjnAAzBjb/tf5VdzliDwn5R+zRaP8V+B/7N+3fzV/i33GeJvbfmnea/wf+u/yX+D/a74pepv+Pf5r/1f5j4A/0k/vP95/e3++/GX65fMV/Pf8d+zvvP/8n9dPf1/xfUC/y/+89af/Wf///3fCB+6XsC/tb6tX/B/ZT4M/6p/v/23/6XyBf0X+2/+H8///R9AH/j9QD9//YA/7XpL9V/77/Xf2G/Vny4/0X9s89fOh6O9s/jTv529fxP7x/w/Y5/Z95v5B/Tfr77Av4x/Gf9N+WfA27N5gvt59y/6HrpzSvy3UA8cf83+x/kmfa/9d+tHwBfyH+5fsx7tv+R/4P9H5uPq7/0f7D/O/IF/NP63/2Puf+df//+3/9of/n7sH7h/f+ZlREOBfYxOo+uj1ehXwWItW9UYZVVVVVWXbSK3cukV//OXuUy1NGZFMaizZSmoIxscsIxyKSS2t57Oq324QrdiDYuwBODcmeJGAQA5JgFO3iRgRSO7Yg0/TZHoXanlgIBEoR0+aPhyz8Xo7TgPRQegI51ruFuxBsXEzmChnEZBI6x5Bj/4AYDobOv959ht2T1orR9liwMQPIK9LRcp+fHki9kYZXbB3D9NTImWnyYZZA7rhr1pMKF5znr6y7BwP3DLTHjpBAjoRFNDpcorcRIlP7IX2zigXpyovqkV8PiFBdUIXfmjp1ZPwL35gPSMXEDnrHNqQW5TfbjV+5VBLiws7Y9mNnptrTZUAI8zkYiea96BwaDj21cus5hzKgkXNGAwFdPxxp2Gyax6qs6rAdOB1OHPf66jtoW2LwSnjxucqtnQej7wgJY2f0lX7RNQybbTVZmDhrICGD8LMackp7vqDHzfo985H6IU/X1L9BJ7Rr2pmhX1f0jUSoIsIc4WSO/A7zsiSN/DC70b7JNd3GJ/wK3Y7vEqz28xTWZ10Mgs680wA05q2LN556ZAesbZ4/Ml1s4TqFglEb44dxnfo6ga7zyPecQg59t3WS0Tk91v6VUHwHdGnPQIb441B0noeGuq3p6OUpzBHXyf5s9QygQi8BlPTFa7RrJwz4zSzVz1t92AGIL1cR6Eb4ogrQnUdOkg/ZiTmKYy81lIev+Hx+EmEuKxRUXpBGNE45a5BH8jyUY3/hlmlLltZ/4ATyl4boovUuho0DF41gNLHplt+f2Gq18GpP3zuaQCva+NfViQ56VtsSWDhLkfFJOd83T6p9g4WyqP/FgB6P4g1TwOTwq3dxr/voiLtpIIG0igmtnLSjwUWD6A3e3h7R90HS+Jm8muZr5bnq2ZtbuAhRRWlnHtY7a4gRzi/x9hkwGzcYC2bjTqhg0rMm0b+mGub4bW0PQrl838fD8rF3y8+QZ173y9K/4KsjbC6eaU+ddMKV320s627AsbeRIV85w2LXSICFgVojFkb8iXV8Ksek59JBBgOyaRm3karPbuWoMSoMqNrHVOch7mt3ICCfZaMxIBPyXj/29tKZABvl/23cAR4eIRUnnZ+drIiLzhCp0v56srFiOgRz8THicSOT7Yc8ynQ7V+XKHhyp9UC+O56KWv4gw6Zx6uv+lGHsUrq3s3uV8XaDd7481By3WIuEjTm5+Ef7doENTXrwx95xhx5i8GSdKvqUGDk+jyWHwz10y3Ozb8tsse2Qgik0JUHjRzmBhGVoHVcJizuK4XxWhPCbVQ9id+P+R7LllpwkvjFENmv6lRRGMf2N7VOgxhsh3WXRObdpaDSx4uDhH7lIaej0tZwc+4vkG+POrXIGlbi8h9yYk0N3vimsoI5Kuq5XK7YRsETMjNk+cWMapMQjbmemwuFSTeplnu9gafHQcbYN/uLmdDAy3/mtQFPNVtzfJX1C5PJAVqt+f4HB7dEu/dWdaLcSRDyYyyp0tpGahTa+iyvZaW3izVlQ1RlKLHyV2zkhQfHgnc44xsg1YPn2vCmgoO/QwcK3YU5EB5f0FLSkJAp/OO2WrzSTJKNtCx4VE9iLPfn9wFi36z2fEcViAczKa2HlNm8T1o1ILiftzWj1ePXlJ3M0hDs/PJgAD+/pFgCP/Q6TmCubCF89oDNcMwp1eFMSWGhbVxSafYaLfZfwwwUavEDcvqwDCW0GbM9Wx3q1FbWXbZASXQ1w3xsQOeztUQvd9XJufSQWGAN7Ah2j6x+av2QvYtG/42a7Gw+S5m901CfwjATI/l2cv9JOHWx8UebLLFWENGhtPYR60b2XGd0nBTyyIP0CXzHQDL+f4gzX9OFo5ROA3AjDiYsBygAAA1fyIxgQKzyA/QDpofVB9/17krndCpDO/0OjXo+RgRQ7SOq5FHOwDz+mMuDZQ5ZRYCPu6GBoRrPuGKMqY1Q4j8UvntAZrhmlclz4Og6+fSIkgIMojb8DPnrND8bUIIdhYhTeJp8qRQvGLEJ5a762jArDxKccNafFK8YMQe/gRsQBzol0YpKNnhZt/t7jh5Eac6HkgD+c5WHXmGR7bM7v/ald94Y42qfZWwzZCqGlXQ4UwIfuelB6KhadYE4OIuP8FrVPmcIymPbQtMfg4OTFp0P6PtnmlVxLfhIJbKXUeAKTPeQGLh2E8fQM2QSQkXLvxu/z4qNt6b8XXLSV+xNmNx3ZDQf/wLOrJb+mSc/FdGf+8g9P/8F1nfYF12G220tvZV7MV38KTVb8hTRKsEzhdyM7cSsBxrPccCYSfwGEXYxlFJkDQ/7CEKUm8oYADx/IjGBArPID9AOmh9UH3/XuSud0KkM7/IjECRBCngIfVc+AOd55yVsK57wg1Vyg20n8UMfwG8Nv17Twvg10ic2R8FCyE14Dt/JDD2u7dKLEb84IZtFPV2DIJdjdCwhW/7eJU8f9uYvql0hI7pk1K0GMklZ0nMaQv2+3UhT0+olYZHt/2IOVONaQAwIVgL8NPvU6eKCwaZRwCKrEh+V6dlT4s5Vdorp8z5oUm85wkD2bpzVFIpD57WCf7z1bcREO9kAaL2f1h6yBMiDcCHbsBdFT1gv9raL92CpfYLMoyVyU/IXz1I1kth4rRujzCPxCio7pg3xjPX+gO6sSoNBqqopJBg7GQ8nQ3kpM6FVWXINn1/RNfwLrTWvpXTKG9BwuHy4z3zP7DapaQRejJhpediRJu0vgJvlSRx7MRWmUwLGZzCmx+Jvfh4v/g+Ur9V1Y33P8owEKCnKwRDo84AO2uZ9aeOodP7Tw/5Cmt4Yhq80AvQ3Px6ghq2s5TFHc5ni0ZMN07T3Afg3UffRJ3/16rJrylQH/+HNYpYuoXO/NI7DryVA49aJlX31d+Bp6oABv8VUEC0UebsmiowLI/OPtyYWpomkc4iGG05sRI2FoJ2J+e86pIZgdOfRunkxlK3EHy6i/SxTm4ihAKMVsG9lQ5ysO5yquOhWs8bkEFmN8Ob7soeC57S5VUMazB5v7W5BKQ5rEdOlaTMi+XXy/pOG+WEMzY6oi34YILjNA4CoJup9WSB+Lm4PJnwGLAdKx0EeUYjqNMUfViSjPRSrbvMXNREfnJA+TKp+YCFnOAJDsKnXm73tPB89ovs2QkImSZs/iQ7I95gtt+Eca0C8D2OlKiwEr16fy7+dvavqm5shfEwFdcqwgQ2wJzLfV6V6Vs+/Xu0UmqfV1lD4pIYtV574bfVArRlytsLy5PIYxZsv5rQ8BU/QcelXH5nZVOwHM38bD3mXrpdFfcYpHyqKztgCTU3ZXKq5bT/a1OcVZKX2CzKJ2CawTuppJhEyMZPQ1KhAbGIIKVoUH2HMUwQYO1DJzuMd6yr7HB1TSJXxr8jw3kXrnYLEY6RxBod/A2Y6Sa3iMomDhUZpFbM118fWtudmbmeU0R1TtMvQWTi9hh7CaOhsxJOGMMeWlZ6/zE2WnxvOrv80k48XpC4QKQlN0tdSEwbTYkpA0t40SvG3D5XPpILC5cOsRA6lTOXQClDweHMzgZgYa7zbzF8VjgtWE6mrzQC9DLwn/xVYN2wH4O5ZmW8dzHnVLj1pSBoza2hh4i7dK38K1DLHW2qn/7RKqHahCngIfVgVMZ8F+NF+pqpfKRd+67+Onb7b5o/9ezqaWntHl2oaVDaANVTIAHSFgi0Yxl50wmpZdjZXueJ9nM3ixwJ2VU0s4AF3tKfQ9Hct66I7nVsG6uDvCNr2qM2bxfyWKeNuMx3pfrGcBBNBfCOfM1Lc4PEcg2ee/5f0pYdiG3I0N+r5+iovydAxRYYa+J6JDIGKbKqWIxhz27MUBfgdMXdfoHkTWPutQ9VWwBltcIABioLIfU0z9tEGA4vxhq5UuwgPNukdvzW1yEESxNu4RfRCR1gmsCmzX7rVpeWqdXNEfKs6CS6HjsRxUTqzMo/6znaAIL14uhlVWk7wRmA2+26FMcWBrgtaMGXPU/UW+gqSWzgp/3mIquIZUsLBZF9fQAmVRLPNsarP0Z3pUSIX91HQ6nU1wuC9Bx/4ctHyoQsdGUbX3MELvpWtqsWG1tTj86KLXIawKeOe2/R5en1oCcjqgZXWX6TxYOJDFhZ3TJ4qdOd/ui4pLbtU6H2froFY5axO3nmNfMoW9PqosPh8Q797cHxE2HMU4BTtZ3LGq72Dxs25I7o5WxFlZbsi4z6mlk6SWxqw7uLCod6Rbs4UZqRSK75kk15oe1aYiVPIDp8pGdnSF6ONm8hIbHj9Hf/BDh4zxmWzPyTFCNtV18L59qSeQnel2Xhi1w8K/IZ3oIUX9if10VWofv0JFbARr4ArMYmitBB/wjPIuAoUv2IZUSUKdZdzZ85SmFrTMZsdd+WMD0lr//LnjKNJBk0sbk0DpLSdDrQKRhB2psThUn6M/ThbWbjKTczV5px7jFB8xf9spqjOBE8EIDS8rS0dKebAQf8DRzXaFdc1QGa4ZDezqBkziyj/4Oas+hn3qyzKc0c7Dq67BPxSxGM6OUx834qRM0ZkOx89dMTf9uo+qSND1SW7oBSSUjvP9A9eqQzPYUrkuDf4ydonPA9QFsR9NBBzrZlJC5cetMLLCV4RF+mD8BNfC0pGEMscBIaRXli0d8fomNsAj59KkqfgkX4W/mni89C/8hbgB/rm2VH7hqXYhoRPZlmr3985XWYvkXUGz4zG5XmiGx9nIKk0WkDZns5QTt0V/1/gQ3Wi4WJryGz1lm/HuIFdrWHtIqqMoa/ice4v4hJOybys6pAk2THwa9cr6kcb9YqwCIKgywXXOGBggAq9oho42oiN5zSuoAysoqHrgp7qwtS4ivCqs91opcO+/iIYouDDObbH8vsg/0X7gqYBRy5tTJGmeKmCSSTRx2F0A6nAa0qIyhWRyQbyQ+iHtiS1cv/uIedqOKdEmPrCKR6BRLQM1yZnmRAtiuit2MkUu3LLuhno2ro77JUAn5H4FQdz9yHqbmUlDMxqYHw8v6Mhw2g2vuTwWkbqKrU7lx3pOyfAqLTWypd/xvjP3BCAm+djhzIDrBdo1pR1c/ezIl6lcvP5evsPfdTiLJ9bu0LBovND5GfI2t5WmnpXyIyqDGW2F8AsfAiLRVr9ZoQYUOAaA80FbvOehXiIkL+BPX3pNkVrLRTOTIbn3QcJ8+MecRah+D1heeiihl/7bnA+9OAiKF9Q9+CTj7xB6OSyAQk2v+qoqaD5UWk68hyNZnqpygEvPDvwSyMiIeGIpvaD3Meq7eOwh+cIOWH7aAXVVDcm2/Qchu/Z6q9uEJYU35dphHXAHW2s4uJpmVSgRP0JI1uuHmXDGNlHsIFSVh1ijbbxkyZje+U9uv8DwPd1Ll/35+jDwH2mnj6JXjWUazUa7FbgBQsqoVQD5/NT5jgLGdqGCbUITZzwKgsMdAPlmTF/bUbNxxCZ6TTK4So5lks80E82cQ4FfhufOh0VgL3UREgCINhCKfwORtACCxoS/B0XfWUPwVblRK9ExSMSSivgdrVTpk5gAyItEHY3cRBgRVELoI2A0O9+Qx+O83D+c3rHzZYQ5SwS57bAYRRt26QJUDxv6VfefmI5JF81oNXS/s7TmFzV+yyfRrrRdvD4OTBem8VtrW4Wc4ueoHFqYX6o4zF1zlSS0SBfh7OOsCF++88/78w+Mo6HuZ4qDu90wWjsczfZR97Dw0l300xF6TVoMCVgYtNoA360+r83GEYN3HJsA6k9Qt09QzC5dN3mJhz2bfBJHbr3X4rc6yc7CqBb4R9tUp7+U6MHBz7vbSG0agFM/epQD6Ifv78euShHCerjsPoO1GIKFOfyPdhWxM5qHwhvX7X0y5bgQy7lSfjs9JmXqj0mHV79r2Ke0PcPNpGmxKLecvffDY2756PdXDSmrIQdYk1AokSz7yuwaAe0tSlzCZgoXiq0XCPAd3jiqvVgkawwtHDmcPDYitXo1Us1t7IuZZEX2SRNLxuGh75cCU4IhYJkOmn1/KnvLYGHnjgEH72quyR2BgLE9AJA15g+RXzznm6zE4/pt5FI6sM217ShY1r3GePI9R1TtGIbYfoy/Y7MI5+3EmdGft4nqeCWZLj8bDCIHDyGY428YStSsiUJO+d1qS/wxrZPy1e15oa4Pmlf61eCC96sMuFbi1EszLv5DW76SoahwLvttpP2Fv2O7woq4hWdwrejT4cLhOF/pLe0eAHT2QGPOYKJjirOr6xhgEKCHlJ06uMBbnm0yOHl0BSOPMyB55KNHtZN4yd+hrc4JFy5eMODxnWD30l4IViv6Po3DZTT9bfgqAD+Ak+ICr5wU5Z4qcG1Oc8ovoBPckK724iKvYVwWsey2+Z/N7Du20X/dHUZaxVEZ/CCHLnACobV9BWnsaDF0XBHvuP3YLg4QbZ4lNwTzS9UTz7N7Z4fmxWncRV3U59kC6JQRGXCN6Ml8CxCcrkYo5th5Zwc5DqMshUztL2OYfnHgG6htbO/w34OJlq+dUZOBUqqM2V7HKn5+4/AOHuNpiRYVr2W5GpjvSLogTLdpmeixpV/DqAfp/oX4nNSpj1a6RZC35yT2FhPfguqcNtONYfKAWJb7UaWmEPcidyiX4rnN8JYrMDJlvq0Gl3qfAvmq+dMjNdB8tN+qGwECBsPkTas0cZPAuz/XUGYGkcQiGN8xJjQWMNrlqu5cTRzfb+DC1VkDwXofkH8n7Bw6Z8HAM6KooYkPZ76J20rGpAGsu+H6yZY9+1mtS0xqGBIspZuqLm/glaoL+13+nmN7U59vm7B3nloxB/2lzMoy0SqQ00reViaj1YVi8WU2UJO5CmZXGePAMFP+S3xUThQxS+X8GfZ/tE8DQ810hb83FJYyaA/wrSoy8/4iDwW+2ddviGxVvtf0EQ5AwOqqu+5frb0aqyldI9ojEGVbl2g4g9F7KIB8TA8QxlL31sr5m91C+O9f/K4Ixm+okEifuU246ynJqX1IDOyQelXGtTcmY5MIaR6TDq7MDhE2tBjaEnn6v1hl3vgLpg29hm2vaULGkMUg0DKpXzN7oCu+lXyLdL0cc7WdgomfGmY9DxrUnZSsswnJLc4/XIR+6dTq9HlbQ3PtQj2e4RH5hxdII/pIl0/LXd4lW8UrC80WxCYDHQF2c3SD7eCXs0pg/z9hc0a3g/k1kYTHJiUYJYZH1238pHxSmPCjgKJjhQYep1dkZ7xCLJ7WTeL4Vp7ML13paZ3gLHc1X4MUlJsWt90Umkl1Hwt5MuciJsCrWTvkPPgUieA2R9AtByFOlUgSXbe48pGembKnRffy2s/eBgMxqmz5+0SI77Atdp3elrRBkSQEGURs+VI29qWVJbSipDgEkQF/xC/6hlUO6OpL/p1wtDlamjic6+jpN6QLDLw2/bjOUUaIAChLeyq+qDp9x4fWJUNPS6+MHFP8NU40qPnDVs+SyuTNF6MP6/ybNqNq3GuPpIkuefzZu3JLQcCbfEvohDD3MlGV54z8O3AmacuHEo2IAChLeyq+q3gUJJPnl+GH1dAymgLjPtPcAN4fSD1uiZECnk1mMxdlQz5qDpXsHZ0hltODlCr9BtWi78aN6W35d6ZD1y8TllOirwxLAVdnkAhp/XfR0TDS/louY2vw6dinEc/T3PTwBMXaO2ZKi2ydA1d/prV7o71gtLxB0Lp+tkWlzrFslcILKnWRQceIr4BaO0iyKiymOdZhLFD9KBG2z6/ZfSwXZ/JeZBEitXH+DtWXTUBp8g1XeqIn5cHK31mXkOUQu18vMPa1OdaKojkZrAH+XIYjFI70LnYqXT0Kd2Qu2dogylvq1rddvF8fHTyMtD+J1BZEuZV1WJ40X5RwmvxmFzak91fy7JtlVDYmbcq1vJm3WpNPXRClXV0e8r2oV1wxvYrIRpS1K10finCUPb+ZdfydLJgYIQYgxi2UM7M9j7c8DYNtOOFWoQBCf/9d7E1l6hWad4JJMOTmjIwT3sBBd90YWufjOmVdn/B0806fiCZc2Mf7IEYw3UW3Df1zeS1tqXCDvavfZNpXGLvrR9aK2rfMMtDZnh3FY06pFvAXTCgbIpXgRYNUI9IVMxqKWO5qoJQjaF+kZff+Q97I8x/HyDZ6uOq/hrg3ym5WLt3jF3JHQlXVLZzUiDf65V2RRfQQn3xKkXRmngi7ls/p9Rd257M1IO1mt3gfgRcgm8QlcWya+DkrA1CjDt0nZLUdOIMF3GkAfNwAJcYNIZzUDfJH2LqK8uufJZXJlHprcapb3clJJSbQiL5C97m3tNgz6Y6J75ugQ/b/LyD3qckasTRDILWAfZSi/hckP4/HRkP4YvoxT9kTdk5asjsub5AIZQ4fWxyz/Kif48NUi5olstwxlzR1HRMNL+Wi3Incol/h76V+KZCIkNV32Jd3MyBiAOJcuzjKfKW0z2kaFN5CbAhtQOQjIegXtlxuPWhsRWr0xIbJ2IXwSKV4SrmoGNxQW7zrPUhUHw32OTzoVJIiYqoeWNaIFhpp8SmbOSTmECuoCAa9TRu71OnZryerxRUW2ToGrtdGM6SYA9fdl03HAMDfvxTSHOM4yEZLzKeLxHodO8SqVw2HXMRUAeSk2rUhfoAq3vNhfkQAny0A6GLi5dB/jOQl3zR1uzwmS5eLs/Cd3zD3XgmNeIPpAMsFsQjeqkWNNZ+7BAqS0MqvpdLgSBhwHVSEhYOWHvKLe+Zv8jbRY3FmBx+1k2OrSZQqaWFQdy0cjiHCnKrDWQHwdNZDSpYZZ8lEI88vkNfgYpuET3sjzDutvnTb4JGlNVWButhu9Z6CA7Uq26LSr3tKi+dqoxUqfZEs9EfOEEoekxSgKbMYPZJbnab2H4FlYqAIrKEJjN07xHlseUKAAGd+lOjI7EJ/4qn/HWPBoTL6G+rw+svYGjFn0q1BdunnC0HmZMwI/WgqvFtbLKQrJIzL2keNx5gjpYtm7sda1TLtNh/eGWed7fSh2S1ZO3NC0hTzWqZwqLzXCSuN95FPz2Q7p5EjvNMbhX/tYtle7/1kjLNVYEOog4Z/HJ5WHc1uTnnYcHCH1Hc1/jZuBHweW3Ewy+4d7d4sjjRLXm0cqp+8iFlaYPxDtZdbWx1iUyDNgTa2DioeeYNeYiwitH6AWAB/UrAYcLwKAx53Ookfr3L/OAO7nUDiOzDY2cyQ1NFUlmGgNAG1hSZRV33tQw95vdQLxa1Obqfb/Ou6sgsme1txpNyV8gAyK4cL26sTNHg7RlyRZKNtsaG6ScGhdcByhbnmjgcsahPjxRpXY6DBZywab19A1m3uQuUUFKDMitzxjytteTpWSEa6phtQ4miwFay9Y5ikTJcOqgQ+uC64xxYJoNB5sj6BRtlDCUrA0XrFG2+qpaJCxnZRxBRQR8KseVOan6eWLrWyYSOIsv93s8QLu5AxCiWllszOfgk/lHHcAC3/J/E6W4gg9oXAC3VdiIO1p/VCWpFvUD719ma5U8jn3S59z8uSLn9m7Xr5QnBm1ZJ/TKVef4bNrbFj/NJTcF17KdNkCeCJ83cosk7VcuBJUIn7WTaX/vOn8lDLe/G2xKyyixBZp3zK8E8DFTFqG/fJL3A8z3J6u2t3Lo5d/QEgfnTokz8/qvO74W7+6OiMxzroF1KR2TEbNj8A8+zmsM+byV+c93ygAs3GRlFQcsZhof+s1zS3HS/p/55XbdVoq4kdf+TKX1T/rV/5Jo9MtrYD+zIqc1IjymQkLjD5+TmaBg371lMXEpI8tc5OZKtk5akMYSzUSkp5PtOpA1V89yaOUNDnGfDQfIs1poWER87TY3aUZoueValWVzUAYeyp3D+cg1S0FDQStqW2VcjuaEQQBPQqO3w40ejmzWtN7dXxLSWZW7mjLzHW2XKtRn/WvheciKk+7k93G2o7nV8qZxVKvCo0PRExk2MN29v/4A7z9vPZ0VcytMH4h2sutrY6xKZBmwJtbBxUPPMGvMRYTKE5N+eqIfd9xBNoJDm4QE8FKnJLfUEBW41NdgtlRIk3T9Q/ksxruiGhWD+KzBDszN2o52SGHLs0qhSZVNUJYDTIkK/oOpmJ0ESMKrCoRVeGwYgNSjdCQ0F9AEFagZH986vebipw8bXg1DCop0NbYXYFx9S8u0F3HW0tp4DxDxQ7eHAFBjOosjFAfYeNtdwqtxYZdtPcYBWyjOS65tGCj64OYG6X37nc1CjaFcr/iqhJF7IqGAh8YQwZbxh2MTvwTJMNoAwOsWdutkB69z3iqlVHZIKjCtEirm1pg0uZ9TDibH/u7xPPwgFZlSOK+/tnO4I4v4VHoIdZLnKRSmX2WkEt+I4zL+NXtdJXpHf95yZSVRg316+AjCPo095qQQ1wRhHxw/jDan+ESx+aicl0Ff7pPFJ+w+hQ74z5GEJE9rqeVXIsD0xK2dwe10Ut3MD3pWFmXS2bGfkRJkoUPd13+MwJd9Q8i3QWFhh1oeIojYlrA0FLAdTO4yA85hASDbhNCrlLb/zQJZOz0d4np9y4pJhw1YiRzjqchmaXBAVxb3X+dCTZf039aEPzgtBEKlWBKN6Lij5x20PsNYHTp0LDHs7U6tBPhOSDE618id7hfeS6cPKw1Cgy/jX897m2lYkYfJH92stAoAPTehMghhfXLC2tld+dJBAeLr56V56em0p7BOgQSHOOo5RrFZIxosP2wlJVRhE9gMlghjDpKD+7TxDZJqrzT+gP+Z153H42nvKjCKdpF7TgZRldlgz3aFaH3SYF3rr+9/0BFdgAs0MT8guUWF4o+NJmf4W0pZRNk/9Yq5tx952fDndRbCDsl9611b/lJTsWvBLtfy9qGkPcqTWOEprUphnSUP0F34MUBvn0t/60PGB+BI2N5tpcoQTWqAY87JS5NCp6wcQh2YLPZroKVDBQSADl+Jw34MTn4afEp/yLSqZvXxN7fdjUdi9hL59GHt/4629OySfd9n6Fx1tusz5XTb4BLnLfN6jH4c6/+ma6AQJkuvmeM1oPocr/IXxooUkX78wNkQTC4XvnIu5bsCMjcIM0Yg3KpD1mHJyj8k8ByfalhYFmQNo53zqr4cccSs0tPYGOUNvaoG1nSe11cpCaz6E7CGR+U79WsS0ZSw0fCxCfLbr3YxF6oS3A/dgfqi4JnZdkOAktpZiWUC2wWfhCTE6lvgcYem2CBgIBzjiHPbfWKI5q9z+sItJ1d3wxob+DR7WjmvBTbhSA/7CdAkh8h5ulosefmbMDNL/W4uXWhrtr7molpfcrFb0c3aA4WDTOFZPmrOzAEJuVqh/xOxVjs7We3PqYcq8RKk6BCLe7sCgihXAFPapm5RaCMHR+5fNdhwg+Q3uzlcz4+w2aR/eboPJ1jnDMt717jMSjNcPLrW93kqmcpZxc6c7+oHq2piRZNeWy3Us5FOFVfvRO9CPr3UpAkqO1i2nfAFNYPxKrzy7ux+xgcsXJvXaVTP5Pg9Bfja0obXnfnNIl4ZhATOD0/U7eJdNFzUIBtNa3Tg0+ozD8Tne5d4OZoIjmE3BQHQ2+LuXHDf3zCiMw2UMjwgQ74YfKNSdmrybddXo29bjFQjKzCvHt1NxZXqRqh7T3K9kaSXUX2ZKB0ANcKJrY8pW85f7L2if9Xz/8GDfLxk41OSIjSAQUkziVnk3amKMBzUd3Syl66DgeGw76Toh2birREv+LYli9aCMVOnQGvZfrO9pqRiJMlCiHpHmGW4+FkiTuXoiOVpIsC9n23q9IKnXIll6Xm2RFyLrvcQeRnp+/+MBIwx/avROx8V3hh8hVL/ry2kLyWxHisymk92Xfc8R6+b/wfVBrFZS97/8K2oQNTXHZz1R7W/8jWiGSLCcKlzj/Qmvu/xT015M+r9hR8qskg+grWx7uosBu+xe8zTrhIS4+98lUlfMIcmY0eF1rntomGxjf2Cg0ggXk1NoDbxZ10P0AP7DdB9zGdBwCp2ShzIXzcNVrh0qcXWPJ9vzw8m1wX3Z9eE1zIkpChekz/w/R47mL6n4wB4VddUUfEoyMpME6ivrgCqsoE+dr0ndywWtO8+3k4KMcHFwS/vcBf7Wp0JnE2lsoiAKBBLQni41/H3ZH+BLXlgcLzAOFN6aZBqUaSolmga0iJwsAFkyV38mpYKCTbOCudfVxhBzQvY/gwIlEmhPXX6HV5QEDr+5hb+kpFAFRn/MxKVjo40TMO9mtgKvp3kX79Iv34G3A/9IfO0qPkAp6bXfT8W/b2Smc1/fddpB5yPi2Et1NKb9KgFVdHb6hxfkXt46ZF0E/R9+m/PehOkmzPNorKy58QpUmLiR3hhS30+OmnmCnKMRJn655BiFGyKYqzAKqXkmuBE3TldvtsnfVLnzBBgxvX60+yMk5rC/4yC9d6EoyYd3TSl7MHR6IchnGC+yMeqjyM7PUYj/ceL7UXqFFy+wjffo4S/hKk1OcIfoVvc+LDR771OAd5REVt3CPn9Z/7/5/BqD4WhG51Dq/B00lHX6SvGdj09W4NmueMUwzoPo53ww1PWjaDKwYbK/lEDZwy+THNlYaJr7IL35uXEQX7Lw8mvKBtxTBLW892oI7da6yGOKfJu08afPDVop7MzfYK/DB2R3+WG8C/7VV1UPg1GtQdMUIvV4/yax2ELNKkqHG6oqWQPsqJI7vNP90IK8kgLSujo5HN2jAFPjr8OgTgI8G4X07/dNXHBl0pZCVg1o+wWI+W59TDll8Gy25l/xc+S444kqxuNaucWoRCtH9vUdJjUfjbu6acsvl5YxIifMOyPaYL1RNw6Wc8T4Rb6wfN8e4JnByb2dHCu+gtsknZW6woDPl8VxPXtugCuKcDsQJKWa1Il6ymJYwsVPpicD06oqVbFx8Osb4PeEv9IubF1PbjArCrgl22FO8zTdmRh5Xxap7nOaJBt8X1gHaBM4OTezo4V30Ftkk7K3UrBQi7bvCQdi3cr9KNtAVef3/SYpz8Q0J1RGeEwWLFgSvSvHFUv1/TNwP22cYoROxjzFicvR3cw82uajtBJ3rtjkjzQ0XZQwEFeYeGKxqPuc01Vhq7g2ZXsQIomFE0jdrN31Z8h8HhdYvRd7M5hQ0bnAY60VZXyfZPfO/4GSvi9YSGikx4r1vmWb7/qulDYli6RhYgcLkoncOArocWtsbME0Z9A0nsEiETF/PE6yOXqMw1K3cOuwclQtFGM8aQ23CbN3+wABP9/xCUT/JEycmHZlzZW6ibBKZaOPtw5Xb21nbTpzLtpol4DqBfdSs5YKoiRb41KO3rC6+JGKYQKOyvge/0O9P+lBM28wzR7tWOeB3WTluOWTg7ASEtch5umwFpdsDmHscvB63GKiMdT1+xozxNj16p60cvAdQL7qWFHnn/jl8pYk/fGf0bERGgoQ9oDp3EGs07d5msrklema+IL4eJlmLZO4c27IYaQFzxcPbZ/D44zLi7cyzqWoz6/JnsQIesEPJaH+b5fRPnr6MRUT15rIgY3q/Thp0/4V4R12HjIksstVr4fEen5eeG7gGBJK4Z/slxx/H6/YL6n9qH703hkrUl39u9Au9N/fiC9IrFK+5Ai/zJPPHPbfpX6n+gIDvF2/GgJWrv/vKiNe4qw/R1KpnQ+RM+TYeN84eZunU9Tku+/re3Bpuikv6CGt7i/hB7mgd03r9aewYRXPmYImrUO4quV/Z8mwGg4axcPWQnah4p4ukHeXLseze4pH7lSJDHZlkHB/6mBA2R9tLZk7Be//fmoxvD1/tc9c9u+IWkHRH7w4yc5soCQGMwoRPg2WOQFbmY3DaNGm/+LJRPegaRRTd/EiAHNWtYATYY3+Pyi4lpq0eGKoU93fgENKUGQgi7/Tf7BqIIwspyxdnA8l3G5Xpye/x6U0XnVBAhlS5Syma/8KrGyWDxng3PhrFWIWWnEeOo8qAmkFggt5hX0Fbiat4BCm9rxCruQ22ZPL1oHahPAWReKw5w6TIeKja5WQEehWz0l03z5rUBEfBQPS2g6R6o2w79iXCoKLBD+auMk1akT28Rzcr7z4J0d5QYvINC5nMrzXUqgGrzq1trO9F66X9kmgBddeV/364xjXSsGf1ywZBgcY+BzS669xE0cV3N/PnavgKBE8LU/DdLKwBfHAA63A1fsXkJVLX/YrqysOt9J6byrHI1YssmoreQ/j5X9Op+joS1FB5+IZwegf2F4Q2MPECHji4s0JE0RcDgAVemrHUdR6TyH/+nY/Wv077EGq4Sb51yS5rWLkrlvxqRLSLQ4fc6GTdYIwWJO5RouXAFAOLPZNQ+14UjN52ltadALne6Pv6iPA7A28Ga/lXks0OXRWw2hGO6bYBUg1qZ+hzi8cPCz4ExmPkAsDtUBJ51dXWtYIHBoxiGowzwOUTKxQTWbcvYfHMJqizwBJIF7xwTueSStLNduvQa2sfVCcHq28Hlp6/P3CBM4lqRqMwfmkXDH4D+wOUoaTBMW4NCOUPrZJS2vDXhVmpkHwYtpVgJZMHWh8MjsnB2AkJa5D1dSJkpM8Sx4X27J6u9vchRUje053i0kQ6HGXCX47P99oIAmlDSYJji91gqiIPTOOrKkQMB7A27fSKeUzYI6OGyOfTksjd+HbWV4MPV3JqFxef+QQHdwGhDucuZApa7tqiasg9s5nAP+2yiEcTPHHuxo2rLJOVThalHLSA6Q5MKWtzmzA0B6Y34DPTsToilkrkw8PS5N2hZ7/UNoWfv2Wmn5jOLSzjKm60QogGl2xI/lXWjfhdJFTBc/zQrNR3MNTpGvmmPlNB1jTQctgrw7lrPIyF47nDX5Ibeg4tEwOg4AwvLpAkdXOpnNytIjxw6Ll3f8xavNNWxFVIm0Ic0OOjXqGrqnAwfrLN0phqkHkYbJBmrzujjt6s9c/Xpv0BRGqRc16He81mj9pqKl4p+0vHyZNNMNngTsVqlHrhaG60FnvibQrvbe90/2fatc2ycKoH6zmOW1kXuQSJ7CyIcotYBfg/Ud50fRajZT1APFm+BVxZnbV94reXQLQNq1lmOBsKhyV8j9rx+qEXYeG75cRePRb0c4tXPa9+p4Sh+GHpj9dH7RBD41PjQrAoo6bjh0BofV1671gWSQrZ75hBWwb0wx7ar7VPNRVbJPrpa6novePLZq5Zcik3hIcundYpS1o/gKu90imc6oynK+3lVrvyc56qpQ4rmBjfR1ZN6IorFWM6k2zeSOyPeYK48feuR0kNknkH4x7HHyqJ2leLS0w8mbk/gqr0linfRAXrDU3Y9hJIx8ldWXSm27WrreAy8lmi8SiG4FBYqwQ+y/lMD4L1K+nOgGNkACV16NjTQ8cLA9od5xPEQ70YhEP8Lj5TW2X+ctXJk7QrvyObxbAonAzRFPDOryvzG797DqY+nMeIRD/C4+U1tl/zlq5MnaFd+RzeLa1bRO+FWnLH5kXhjM8YN467Jz48PFaR4Npm3Ohyj0og63dtOq0BT0y2BUf8Ad55UwIBGQZ+SGj7FCMhjngmoMM/z9e6HhcMk8qIBAocsF6+D7OPduzQbbkHit2XYB29JGp8auZu2/0isUlwwDuRNXJJLBjv2WLiexJsaxq16bKIL4NPBNKaiZM93M1xe5682zc/GCa2w+Lnx5dyoU6i/vWks98V2AMi01IWs1aRsJJk9vfWuHsyqsXUZXiZNJVCNzIkGeCCA5xYQGqoxjgfgFCDyGGpXpQe2ztKlsecawag2plu0XF2khYrpHfLgKyEwA5RRwVD5SohZbTkB+9/Q/2amZx+khazC4Jo62vaxX8nkbeqcqQj/bvp1aDs/sE6wHuTbZaLrzgbdtbj/Y6qr8HmZMa+MF4+gV1tOfcqm2yOYelvlfLe05Yd0IyaOGLIFeKkHyeuhHLkJWRTfhC1Dm0/3Dfj0MjVYhIfFf7QSDNPVClEsRIa7zL8rVc1NNw49zfi7XKGAvisQSi7DxloIJBI8dhy6787ANE5y5B2DQt5wj7WpOykE+fdNrsicHeiXfnONfK67MeHvGtUblPwjqrpcHk/DSBB2DQd2Xo789zK4uPyqaIU3ZYJuLsjlhDy4IDhJbPeA6v2VqZWU6OJpblG7MPmHQAdWOiX4wyhlKy8gNa7moDDGnubOEA7CO/GHebIfoGPPxPf1Yk6VY1uLjCt+bLKeantRKfJxxcWhx2mnS9LEht4jsfdI0Mhfwzt/7wCAAAAVZYHOjhwO45Akc65bFRr6tsNczuDHOSIM8QiH+Fx8prbL5XuWcnah/f8jm8Wz0WJO57LHRA246KbMQtCweAEiN8hMEIeDNvw+g0OSvQSNJs8RkWwJiG3SfqJMeVw+az3Vmqd9XnDd80Rk9NJR+0HwuTyj7n/JTTOkdGkS1kf3VzzjZLvBzNBF2pW6UNulOMJa15BiwKcKJvocCVt3gYp+niE53ULLVdQ9e7rFHpJUBzFsPdcS1vnhY1FzkF4rEzcqDUzouahANprW3lkNRMe/cM99fFyiM12E6duWeKvUKbwdGWHTz/7A/iBjglmMDSi6NWa1UXTf8IJ2PXbrQk96ZDx5c+H2mBwdAWGr4VDwsdSuCJQieEhjVJc8q4r/egFX1oKirMFpbM0rbnuQMTOPLHKCg0eFuKrvf5j4/cgpSMciPc/cBzr8exBG7LJAj486w+sqSQsbinESIlLPjqF6PjLUC2N+wBQZmwVjJ6c/UVKiNL4nE3dZQ+pU2tnr0vPKweuXGL/fW13ixFP2pj1U3SgOK4eSuYacG2Ojcn8FVefxAoYyGS0nSpIws7YvyZfwk0AAACKhg9CJvzuFe9YEUl8GmWQlwo/+nY/Wv0/+dXYnphcTSxRw99txnWY6Lpee4xs/U/oFpWlx0v/L4asTctiS2sDbg3sLZMzBHA5iWIDbNs5n6/NJtZQZQ//hOZRq01aCKDULQMX204pESW2HZhvxPenFmq5nsA0lRhbWYP0IcAAAAAA==) +`@data_pack pack.png` -
+![data_pack.png](data:image/png;base64,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) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md index 87b7a5873..1a987653d 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_structure_files_md__0.pack.md @@ -2,25 +2,21 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### minecraft -- [`@structure minecraft:igloo/bottom`](data:application/octet-stream;base64,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) +[`@structure minecraft:igloo/bottom`](data:application/octet-stream;base64,H4sIAAAAAAAAAM2bTYwcRxXHa/pjvrz2Ov4kJEosKxFJRCLbiUCyFK3Xu3ZsyfYuG28IVsRQM1Mz02xPV1Nd4/HaRHL4EAJFxISvCCHiQJByQAgpcOFiE0UiQkbKAcHVEhfg5EMOHIhMVXe/md7e7qqySSRGGnlm+tev/u/Ve69nep+bCDWQE3kXiY0Qks+aeFbFs9FAdRJwj3skaor3VhPZQZvbaPbEiPGj62e9IYk4HoZIwqg5zznz2iOe0NUqco7iiBx5CsWPOnLO4CFBO/okIMzrPDHEF1oDgn0+QCmK0Eb0fkDXAtpZa+POWouRyBNrBh0CJ83d3HjSnol9ep4Mhf5WFBLSLVtjK+CYDSkro/ZuoFqcjvqDgEQR8EdOJHwDNU7TrtfzCIuDUKmi6vyQjgJ+7e3/vDJX2/mIjRpLIWGYezSQwBbkrK6eXBQvnSvPfPbWXy8sXvra11f/9ei7731jErEVHHTpcF8U4nGwr02DUTQRtguE9ajv03GL4aBPxC5WV7zOgETC7GwFNY9j3z/ur3tBXxxqHKesQ7rz/djLCpo5GZwf+cIKbvsEuWj7fDuiLJQCE+kozotty5Rx7C9Q6nfpWGoX7Iy0vAg7InMENRYJ5gOZG/Is6/k0O2ZPCCcWGQ0XBpKNXAk//etdl+SzgnYui4gJO0QcWyFfGXmMdCt1ZHldtGPoBaTDcI8fPu/5Pu4Tlgnaz/704Pe2/XKpe/X20w+fe+CHN21kp541UPU0lV5U07yOH9d+u8N955UXHoX3FVQ7RXA0EBniouqJOB/nr8rPm6dIj0vV4pAlrHqs8mkRvUXhWRAlu4eaqLrU6wnpDVRbIR0vTCvFRjWR3qtRvAM1Gzmj5KUw22BkjFn32IWwIuqpPVqvIHdBhvmhxN09U3cZ5SIgrZ5PooFYyomI7wOdBueeKS2SnWG/K32988UbibldU3N9sc8tkTGU38HSYon6UvAME1i3ItrHCuVxpse7ff07X718/dxbfxBFIsN6kpNhEi25V9vnZWXlEsSBBIFnA9nLNIo39Pp3/xJv4JF9yUZev/IqgkYkTU3MO0leOsdFTt2+XUFbF3Cw7HXWVsNTlHIRh5nn0rRaxBzXUTNktCdqW27x9qmPHV/WmY1cn5wnvnRV1CBfD0kWCn3sBZFYrS5bZFIEwl1RYaIRUbYOKfd5saKsRnGw3vZFcxNeQfu1YkQ8hbNh6uwRJ3Fy7lb677/T9FW05Bc3teT63bfk8sY298ahwy/987Vf5RobytTorcOPffEz3zrx8uVvNgerX/752yaNzaz3/zn8xU3z3n/k4+n985d1vf/l4McP/e1Ls4re/9P5N1+/8tjCW7//8AffHrmnf3L3vR9U1Td6sXviBecymF08xFN67nd/fPVzM+89DvR9F+mw7ZEn4mVF4L2gJy8aMqQR2nhB+f+/gNw7rc/ErVbBdeRTf186OHzz6Es/en/31d/s/fCY0LtARdky2QekmNvi8T9cUl7r9cwuKaoO+s617/8jTbW77aBJ/zvKCF5bpJRFaENLfTffUm/cuHHHLRV97C21qG06RW1zR65tfnDjxvtJAKvx+bE3HyRngKEK7KMQJvKSk7S6i5iKAWMZMHaGqZQwToaxShg3w9glTNXATk1hxzKIDzDZ+DgljKXQA4xtwGTj45YwroEdVXyAqSmYSV9QxAcYVf4Ao8ofYGzFfgGjyh9gVPkDjCo+wKjyxzGIDzCq/AFGlT/AqPIHGFV8gFHlDzCq+ACjyh/XID7AqPIHGFX+AJONT7WEUcUHGFX+AFNV1CkwqvyJ/c5prpUwjgHjGjBVA6amYCrpEyliCEzFgLEM1qorGMtAj1Vgp15Q7zo7toFftoFftoFfjoEex8COa2DHNfDLNfDLNdBTNch5YFQ5D4wq54FR5TwwqpxHaQ5lNed7ODCq3gKMqvcCUzVYS9V7Kymjq1NLs+/AqK5NwGT3veh7i06PVWCnqL50dmwDv+wCv/Jxtgv0FF27dXocA79cAzuugV9ugV9ljMqvakHO5+0Ao8p5YFyDtVTXU2BUOY9g3wwY1XdsYHR1aiP1dyRgdHVqa/YdGF2d2pp9B0aVh5aBHstgLctgLdtgrYl2A0alxzbQ4xjocQzWcgzWcg3WAkZX7zo9roEeuA+kq/d87ZQxqtoBRlU7wOhqx9FoBkZ3z8HRaAZGd8/B0Wi2Uka1p8Do6kvnOzAq34HR3U/I+150fTf1XdcTdPEBRlfvuvgAo7ufkI9P/nclMLr7CTrfHQPfgdH1H53vwOjuFehyAxjdvQJdbgCj65k6v1wDv1wDv1wDv1wDv6yU091ncw3yxzXIH91a8Js6G8NGCeMYMNkYNkuYmoKZ/I3QgMnm/JYSxjaw4xgwKr+AqRowKt9tA822gWbbQLNtoNk20Dz544QBo9ovYFS+A6PyHRiV78CofAdG5btroNkt0DxTwmQ1by1hspq3lTBZzbMlv81VmoFRxRkYXb3nf6MV1UX+N2wZo6t3nV+WgV+WgV/A6Opd57ttoMc20GMb6LEL9GwvuS+hq2XdXgCjq2Wd78DoalnnOzC6WtZpdg00uwaa3QI995T8Ns/q2VHC6OrU1ugBRhVDYHS1bGvyxyrwq4zR1anOL8vAL6vAr50l9wqymneVMLpa1mm2DTTbBZqLalm3F06BX2WMrk51fjkGfjkFfuX3wjXQ7Bpodg00uwaa3QLNRfuV/12Q3y+wtZFJhuAayI0HVJB8JJM/s5lZkwGJeB05p2hnDRWNYeS/NuxOzdZRfUg47mKOkZtaqQ49xihDzpmlM8cqaJvXDygjx9JZaTkAFNIxYaQrHHIiOYGWPsSpeMQHctjsWYJZnwjrLJ3wSawJiUPaJchZnD87byNHqHw+SVD58guQq95FIj+WNxS8gJM+8/j63GXpjcTOSUyoiAZ0jD0mh8ACOdaFNg1ERZyNOnzESCueh0lNy2WEF7Py/LacRPKCfpteQOnhc7Evxd9isiHcMwmhe5Zc4E+hLZf2c/Fi/+H9+19MP3wS7Z58+Lh4vDA6cOBJMjl8KHM4PtSRkDwsHdmWcUTsQXrOwQ3rlFzhs5WxN9VZQc7xEfERZFIzCaPzrE95JTf9ujezdOjjaNAK48kwYYnjvtjn5fhtdnp5TPBaPDiINploMzIWMW4JRUHXQvWj4n0y6lSWsm5BvD8hmFqIfcI5kdrvhXG+2eyG04BMpgLvy8xZUd+TM2stOZ4WeXwK7cmd3Wozr7M2nUN8MFtlXkR8YaQQfCADMtxZK+MyBr2gJyquDHykAFRLuH96xpBG0Xox9XCBXQWemZpmUgFmIeHTKdPpUVmLTdRcZjQkTLYKwRAcceSIMhS9YMtYbCTzab8vZwd72I/Eh25ERcuYvhWtJvPWGRM4f7Lizox8RoNWG7Mov246c1c5NJ0CzuwOHvldceYmsQPs90SC07BU6wCHQohoK9jrD2Sr7OGOHBNNZU+GarPlI1oQkanvbZZZuEoyIyhlTMdbN9vzcfuj1J/swkeivyQmmaFHH3e7hBWtFsr/EyBzTHTtqOjUDm2PySbPS5bMZO4Y+36LU9YZlJ67MQRG5yr9j3MftrMaiY/8aRLnr92b9jK5TMbXZTin/MJ2Z/tSutcUr7ViZ+XlJm9zZoCjVlvsj09aByZGs58ehELPfngoRYvW23BdEH1/i5ynfS4ZShbfoD6J/guNrirjvjUAAA==) -- [`@structure minecraft:igloo/middle`](data:application/octet-stream;base64,H4sIAAAAAAAAAI2SwWrDMBBER3Kc2sqhPfXQT+m559JTrmFjr10RRTLSQqFfHxsi0gZaa0EHwdPMrBgDtNgk+80VgF+nRcNerFhOWKbF9uhCd0pmvjy2qKaQMpxHVaiTkPD1xU9GZaiA0f8wusALV621PKogjyrIs+aFzK146YI8uiBPidf9H6o/dl9j7r0W5mEixyK8VEU32LzTmfF8tp67SIO8JgmeD8do5zrBwHzEMHFcqtZg9zXrRBfGkXvUA7nEDbYDddaPqH2I8oks+XSTdNT3HOdUuzcS2nNMNnjAvOACT0G+1eQCAAA=) +[`@structure minecraft:igloo/middle`](data:application/octet-stream;base64,H4sIAAAAAAAAAI2SwWrDMBBER3Kc2sqhPfXQT+m559JTrmFjr10RRTLSQqFfHxsi0gZaa0EHwdPMrBgDtNgk+80VgF+nRcNerFhOWKbF9uhCd0pmvjy2qKaQMpxHVaiTkPD1xU9GZaiA0f8wusALV621PKogjyrIs+aFzK146YI8uiBPidf9H6o/dl9j7r0W5mEixyK8VEU32LzTmfF8tp67SIO8JgmeD8do5zrBwHzEMHFcqtZg9zXrRBfGkXvUA7nEDbYDddaPqH2I8oks+XSTdNT3HOdUuzcS2nNMNnjAvOACT0G+1eQCAAA=) -- [`@structure minecraft:igloo/top`](data:application/octet-stream;base64,H4sIAAAAAAAAAKWYwYrbMBCGFWuUOFn2UCiltG/SY9tLoZQell6D4iiJidcyskJon6SPW3k345isPTNLA94Q+7P+/x8NstYrpZYK2vKP00qp7likw6QjX6rc1bGMpWtV91mq+abyxbFdpR9/l0o3vsWb8KO1Mm200V3uGGNAwBiCmV2YTMBQfpCh/CAj8TMnmKwvEM/MBAyVHRkqOzJUdmSo7MhIsi8Ipp97AUPVBxmqPshQ9UGGqg8yVHZkqOwgyI4MlR0ZKjsyVHZkqOzIUL2BDFUfZKj6GEEuZKhcyFC5kKFyIUPlmgv8IEP5QYby031mjBYyQ63ZBMOtdTNmLmYj42QTDLduPK2tAoZbMzuGW384BgR+QOAHBFpGUGdkuD7kegMZqjeQ4fowY7SQ4fYAGaM1uzBcH2aCHssEPZYJeiwT9BjHgMAPCPyAQMsIaogM12PcvCPDrXWSedeMFjLcvk4zWhl+CxhuD6CZOe19CRhub8P5AcE4IBjHCOYCGe6ZK5kLYLSQ4fa0wGhpgZYWaGmBFgi0QKAFAi1cW4eMnnguD7Vg4nk67B8zwQxzzScYEDBGwAx7dTHxfFeE5z6/gKGy9+sL4RkZKjsyVHZkqOwg8AwCzyDwDALPIPBsRvzcesbnu4QBAWOYfr59Vk4xlJ9M4Cd7hZ8504e3e4kphut5LjsyVPZ+/RUwVHZkqOwg8AwCzyDwDALPIPBsBH6MwI8R+MF9C9erWtCrWjBfnJYWaGmBFgi0QKAFo1orpetNzFT+xfvjQ/nougLkn0+hfv6xVOZbdI/Pr0tzlZVb9eaxrF0R7C5+2iXOFi5T93j7g4+26kj47oujmvpHehgmv5h4Hv3+OvrGbSfW0GHO5etvH5ZglZhFYysXo+veAt8l6z9siv72OlJb+/P66UWxwqsDnbJw/en319NPf8t6v452U7mks/oZfONC9/I54Qdb7ZSOvsnV3TlZCZXf75Njs7NV6/LkyZ9dGJyY72yRhlOm9iEe0ghpsPpytdd/d9X39riOwTZb78Otuq7KqCCG06jzpNpGX7t19KE4jEW2ZRiTPB/K6NaFDY2L/fWP1+tVuT/E9T7Y3wiN+boNDM621+Fedt+L0jY2pHQ77+Ogaq0/dVXLfVGcmrKv69i4Kf+6a57xcQ/Obv9vXK3uvtpof7nQlr5OLfhB/QPXnps4tBgAAA==) +[`@structure minecraft:igloo/top`](data:application/octet-stream;base64,H4sIAAAAAAAAAKWYwYrbMBCGFWuUOFn2UCiltG/SY9tLoZQell6D4iiJidcyskJon6SPW3k345isPTNLA94Q+7P+/x8NstYrpZYK2vKP00qp7likw6QjX6rc1bGMpWtV91mq+abyxbFdpR9/l0o3vsWb8KO1Mm200V3uGGNAwBiCmV2YTMBQfpCh/CAj8TMnmKwvEM/MBAyVHRkqOzJUdmSo7MhIsi8Ipp97AUPVBxmqPshQ9UGGqg8yVHZkqOwgyI4MlR0ZKjsyVHZkqOzIUL2BDFUfZKj6GEEuZKhcyFC5kKFyIUPlmgv8IEP5QYby031mjBYyQ63ZBMOtdTNmLmYj42QTDLduPK2tAoZbMzuGW384BgR+QOAHBFpGUGdkuD7kegMZqjeQ4fowY7SQ4fYAGaM1uzBcH2aCHssEPZYJeiwT9BjHgMAPCPyAQMsIaogM12PcvCPDrXWSedeMFjLcvk4zWhl+CxhuD6CZOe19CRhub8P5AcE4IBjHCOYCGe6ZK5kLYLSQ4fa0wGhpgZYWaGmBFgi0QKAFAi1cW4eMnnguD7Vg4nk67B8zwQxzzScYEDBGwAx7dTHxfFeE5z6/gKGy9+sL4RkZKjsyVHZkqOwg8AwCzyDwDALPIPBsRvzcesbnu4QBAWOYfr59Vk4xlJ9M4Cd7hZ8504e3e4kphut5LjsyVPZ+/RUwVHZkqOwg8AwCzyDwDALPIPBsBH6MwI8R+MF9C9erWtCrWjBfnJYWaGmBFgi0QKAFo1orpetNzFT+xfvjQ/nougLkn0+hfv6xVOZbdI/Pr0tzlZVb9eaxrF0R7C5+2iXOFi5T93j7g4+26kj47oujmvpHehgmv5h4Hv3+OvrGbSfW0GHO5etvH5ZglZhFYysXo+veAt8l6z9siv72OlJb+/P66UWxwqsDnbJw/en319NPf8t6v452U7mks/oZfONC9/I54Qdb7ZSOvsnV3TlZCZXf75Njs7NV6/LkyZ9dGJyY72yRhlOm9iEe0ghpsPpytdd/d9X39riOwTZb78Otuq7KqCCG06jzpNpGX7t19KE4jEW2ZRiTPB/K6NaFDY2L/fWP1+tVuT/E9T7Y3wiN+boNDM621+Fedt+L0jY2pHQ77+Ogaq0/dVXLfVGcmrKv69i4Kf+6a57xcQ/Obv9vXK3uvtpof7nQlr5OLfhB/QPXnps4tBgAAA==) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md index 39ad3bad2..2327c4f18 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_data_url_md__0.pack.md @@ -2,271 +2,255 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 6, - "description": "" - } +```json +{ + "pack": { + "pack_format": 6, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@font minecraft:alt` - -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/ascii_sga.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - } - ] - } - ``` - -
- -- `@font minecraft:default` +`@font minecraft:alt` -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` - -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] +} +``` -- `@font minecraft:uniform` +`@font minecraft:default` -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` - ```json - { - "providers": [ - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` +`@font minecraft:uniform` -
+```json +{ + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` -- [`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8P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Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) +[`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8P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Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md index 39ad3bad2..2327c4f18 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_vanilla_font_local_md__0.pack.md @@ -2,271 +2,255 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 6, - "description": "" - } +```json +{ + "pack": { + "pack_format": 6, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@font minecraft:alt` - -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/ascii_sga.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - } - ] - } - ``` - -
- -- `@font minecraft:default` +`@font minecraft:alt` -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` - -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] +} +``` -- `@font minecraft:uniform` +`@font minecraft:default` -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` - ```json - { - "providers": [ - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` +`@font minecraft:uniform` -
+```json +{ + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` -- [`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8P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Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) +[`@glyph_sizes minecraft:glyph_sizes`](data:application/octet-stream;base64,Dw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PRCYWFxcXRDUkFxc0FjQWFiYWFhYWFhYWFjQ0JhYVFhYWFhYWFhYWFiYXFhYWFhYWFxYWFxYXFhYXFkYWExYXJBYWFhYWFRYWJhUWJhcWFhYWFhYVFhYXFhYWNUQkFw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw9EFxcWF0QWJQcmFhYPBxYkFyYmNSYWNCQkJhYWFhYWFhYWFhYWFxYWFhYWJiYmJgYWFhYWFhYWFhYWFhYXFhYWFhYWFhYXFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYmFhYWFhYXFxYWFhYWFhYWFhYGFxYWFhYWFhYWFhYWFhYWFhYWFhYWBwYWFiYmFhYmJiYmFiYXFgYGFhYmFiYWJhYVBiYWFgYGFhYWFhYWFhYWFxcXFxYWBgYWFhYWFhYWFhYWFxUXFRcVFhYWFhYWFhYXFxYXFhcXFhcWFhYWFhYlBgYWFhYWFhcXBgYWFhYWFhYXFRcWFhUmFhYmFhcGFhYWFhYWFxcXFhYWFRUXFRcXFxYWFxcWFhYWFhYWFhYVFjMkFUQXFxcXFwcXFxcWFiYmFhYWFhYWFhYWFhYWFhYWFhYXFxcXFhYWFhYWFhYWFhYXFxcWFhYWFhYWFhcXFhYGBhYWBgYWFgYGFhYGBhYWBgYWFgYGFhYWFhcVFhYWFhYXFiYWFhYWFhYWFhYWFhYWFhcWJRcWFQYGBgYGFhcXFhYWFgYWFgYXFxcXFhYXFxYWFhYWFhcXFhYXFhYXFhcXFhYWFhYWFiY1JhYWNhcXFxcXFxYWFxcXFhYXFhYWFhYWFhUVFRYVFhcWFhYXFhcXFxYWFhYWFhYWFhcmFhYWFxYWFxcXFxcXFycWFxYVFyYmJSYVFxUVFSQWNDQ0JSUWFiUlFxclJUQlJSVEJSUlJCQlJRUVFRUWNCVGFhcGFhUkFRUVFRUVFRUVFBUWFhUVNTUlJBYWFjQkJCQkFhYWFhYWFhYHFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcWFhYWFhYWFhcWFhYWFhYHBxYWBxYHFhYWBhYWBxYWFhYWFhYWFhYWFhYXFg8WFhYWFhYHFhYWFhYHBwcHBwcHFhYWFhYWFhYGFhYWFhUWBhUlJRYGAAA0FhYWNAAAAAAAMxUWNRYWFgAWABcXFRYWFhcWFhYWJhYXFhYWFhcWABYXFxcWFxcmFxYWFjUWFhYXFhYmFhY1JhYWFhYWFhYWFxYWFxYXFyUWFhYXFhYXFxcXFxcXFhYWFhYmFhUWFQcXFiYWFhYWBxYWFhcXFhYWJhYVFRYWFhYXFhYWFhYWFxYWFiYmFgcXFxYWFxcWFhYWBxYXFhYWFhYWFhYWFhYXFxcWFxYXBxcWFhYWFhYWFhYXFhcWFhYWFhYWFhYWFhcWFxYXFhcHFxYWFhYWFhYWFhYWJiYVBxcWFhYWJhcXFxYXFxcXFxcXFxcXFhYXFxYWFxYXFxcXFxcXFxcXFhYXFgYWFgcNHhcXFhYWFhYWFxcWFhcXFhYWFhcXFxcHBxcXFxcXFxYWFhYXFxcmFyYXFwcHFxcWFhYWFhYWFiYXFxYWFxcWFhcXFhYXFzUWFhYWFxcWFhYWFhYXFxYWFhYWFhYWFhYWFhYWFhYXFhcWFxcWFhYWFhYWFRYWFhYWFhcXFxcXFwcHFxcWFhcXFhYWFgcHBwcHBxcWFhcWFgcHBwcAAAAAAAAAAAAAAAAAFxYXFxYWFhYXFxYWFxYWFhYXFhcWFxYWFhcWFxYXFhYWFxUWFhcAACMjJCUkFRUAFxYXFxYXFRYXFxYVFxcWFhYXFxcVFhcWJxcXFxYXFxYWNhcXFhcXADQWAAAAAAAAFhYWFhYWFhYGFhYWFxcHFwYWFhYWFhYWFhYWFhcGFhYWFhYWFhYWFhYWFhYWFhZEFhY1FhYlFgAAAAAAAAAAFhcWFhYkJhYWJBYWJgYXJCUWBhYWJhYWFhcWAAAAAAAXFxdGFgAAAAAAAAAAAAAADw8PDwAAHBstFRc8NBU+KBdMPCw8SjpaWlpaNAAAeRcAJRckFjUWRBYmFhYWFhYWFhYWFxcXFxYWFhYGBhYWFgcWFhYWJhYaFhYWFhYWFhYWFhYXFhZaWlpaWlpaWloAJCUmFxYWFxcXFxU0NBcWGBYmFhYkJhcXFxYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXFhYXFhYWFhcXFxcXFhYWFhYWFhYWFgYeBhYWFgYGBgYGBhcWFxYWFhYWFhYWJRYWFhYWFhYWFhYWFgYWFhYWFxclJT08Wko6SkwPH1paWlpMWiYXOlofWlpaWhYXJCUmFxYXFhcXFxcXFiUWGjs0NDQ0FhYW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O0o9O19fXwoKDV9fWlpaWkpaKioKCl1aAAAAiGlqWzxZaUtLS0s7alpqAAAAOzssFRYWFhYWFhYWFhYWFhYWBhYWFgYWFgYWBhYGBgYGFgcGBgcWFgYGBjQ0NAYkFTMlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFgYGFhUFFRYVFSYWJhUWFhcXFxcVJhUWFhYXFicXFxcWFhYWBhYXFxYXFhUWFQYVFRUWFhUVJiYmFRUWFRYWFxYWFhYWBhUVFhYWFhYVFBcWFhYmJhYVFhYXFgYWFxYXFhUWFhYWFxUXFgcGFxUHFxcXFwcWBhYWFi0VFRcXFxcXFRcWJhcXFhYXFhYWFhYXFxcXFjwnFhUHFhYVFSYmFSYUFRUlFRUWFSQ2FxcXFyYWFSUVFhcXJhYmJhcXFiYWFhYWFhYWBgYGFgYGBxYWFwYWBgYGBxYWFhYWFhYWFhYWFhYWFhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhUWFhUWFRYWFhYWBhcWFiYmFhYWFhYWFiYWJhYmFiYWFxYXFhcWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcVFxUXFRcWFhYWFhYWFhYWFhcWFxUWFxYXFhcVFxUXFRUWFhcWFhYWFhYWFhUXFhYlFRUWFhUWFhYWFhYWFhcnFyYWFRYVFgYWBhYVFhYWFhYWFhYWFhYWFhYWFhYmJiYmFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFhYWFhcXFxcXFxcXFxcXFhcWFxYXFgYHFhUWFhYWFhYWFgYGBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYGBgYGBgYGBjU1FRUVFRYWBgYGBgYGBgYWFhYWFhYAAAYGBgYGBgAAFhYWFhYWFhYABwAHAAcABxcXFxcXFxcXBwcHBwcHFxcWFhYWFhY1NRYWFhYXFwAAFhYWFhYWFhYGBgYGBgYGBhYWFhYWFhYWBgYGBgYGBgYXFxcXFxcXFwcHBwcHBwcHFhYWFhYAFhYWFgYGFjQ1NBYWFhYWABYWBgYGBhYVFRYVJRYWAAAWFiYmBgYAFRUWFhYWFhYWFhYXFwcHBhYWNAAAFxcXABcXBgYHBxc0NAAPDw8PDw8PDw8PDw8PDw8PJSUWFhcHNQc0NDQ0FhYWFhcXFSU0Jhc0Dw8PDw8PDw8HByUHByUHBxVGExclFhYWFhYXJRZGExYWFhUGJhUXNBYXFgcWBiUPFRUzBhUzMw8PDw8PDwAAAAAADw8PDw8PJkQAACYmJiYmJiYmJkU0JiYkJiYmJiYmJiYmJiZFNAAVFRUWFQAAAAAAAAAAAAAAFhYWBxcXFxcXFxYWFgYXFycHFgcHFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYGBhYWFhYHBwcWFw4eDg4HHh4uFhYuFgc9FhYWFhYWAAAAAAAAAAAAAAAAAAAAFxcXBhYXFxYWBhcHBxcWBiYXBxYHFwcHFxYXFwcXFhYHBwcHFhYXFxYWFRYXFhYVFhYWBxcWFxYXFiwePT0XLDwWFhYGPDwGFgYWFx0HFR0AAAAWFhYWFgYWFhYWFhYWNRYXFxcHBwcXFxcXFhYWFzUWFxcXFxcHFxcXFzUWFxcWFjsWFgYGBx0AAAAAAAAAFiYWJgcmFhYWFhcXFxcHJgcmFxcWJhYmJhcXFxcHBxYVJhUmFxUHBxYWFhYWFkYkFhZGJBYHFhYHFgcWFgYHFxYmFiYHJhYWFhYGFwcHJiYXJhcmFhYHFwcXFxcXFxcXFxcXJh0HBwcHLBwtHQcHLRclFhYWFxcXFhYWFhYWFhcXFhYXFxYWJiUlFxcXFhcWFhYWNBYlFhcXFhYmFwcmFwcnJxYWFjQWFhYWFhYWFxc0FhYWFhYWFhYWFhYXFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYHByUWJhUWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxYWFxclJRYWFxYWFhYWFhYWFhYWFxcXFyYmJiYWFhcXFhYmNCYmJiYmJiYWFxcWFhcXJhYmFRcXFhYWFhYWFhYWFhYWFhYWFhYWFhY0BwcHGzsWOzsWGRksKhYqFkwXBhYmJiYmNTYUNhRHFEcUFhcXFxcXFwcXFgcWFDYUNkYkFhYXFwcX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HiwOHh0OHg8PLDstHi0OOxwOLS0sHR2ffJ98a21rbR8fHRwfHxwcHB8fHJsPDg8ODw8eDw4OHR4fLQ8ODw8ODiwsDh4OHg8sHiwODh0PHR8cHBwMHGhcAIhqKSkrKikpKSkpKioqLCksLEotHR0dHR08Hh4dHh08HR0dNycXFhcAAAAAAAAAAClXOw5LKysrHiwpLWoeK00ed1pJWTwdPStaaFo8LixMHi0rHQAAAAAAAAAAAAAAABYXBiUGOxYGSwY8BgVNBTsPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8P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Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFhYWFhYWAAAAAAAAAAAAAAAAFxcXFwcAAAAAADUWFwYtLS0tTQ0tLRcXFxcXFxcXFxYWFiQmABYkFhYmABcAJRYAFhYAFhYWFxYkFxYWFiYHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcFBxYXBQcWFwUHFhcWFxYXFhcWFxYXBgcGBwYHBgcGBwYHBgcGBxYXFhcFByUnJRcFBxYXBgcXFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhcGBxYXFhcWFwcWFxYXFhcWFwUHBQcVFxYXFxcXFwcHFxcVFwYWFwYWFwUHBgYXFhYGFhYXFxcWFgYXFhYGFxYWFhcWFxYWFxcXFy0XLRcXBy0WFxcWFwYXBwcHFBYWFhQWFgYWFgYGFTs7FxcXFRYWFhYWFxYWFhYWFxYWFhUXFxYWFhcXFxYWFxYWFhYWFRcHFwcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcnBycHBxUWFhYHFxcXFxcXFxcXFxcXFwYGBgYHBQUFBgcGBgYGBwYGBwYHBgcNDQ0HDQ0LDQ0NCxcHBgUGBQYGBgQGBAYGBgYFBQUFBgYGBgYGBQUFBgcHBwYGBgYGBwcHBwcHBwcHDw8PDwcHBwcHBwcHBwcXFxYWFhYeHh4eFhYXFxYWFxcXFxcXBxcHBwcHFxcXFxcXHx8fHwcHBwcHBwcHBwcHBwcHBwcHBw0NDQ0NDQcPDw8PDw8HBzc3Hh4AAAAAAAAAAAAAAAAAAAAADR8NDQ0NHQ0fDR8fDw8PDw4OHw4PDx8PDg8fDh8ODw8OHw4ODx8vDg8vDw8fDR8fPy8vDB8fDS8MDQ0PDQ0NDQAADQ4ODB8fDA8fHz8ODw8PDw8fHw8PDw8PDw8fHx8fHx8fDw0MDw8MDwwfHy8PDw8fDw8PDg8PAAAAAAAAAAAPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx4sLh0+Hg8eHh4PHy4PAAAPDw8PDw8PDw8PDw8PDw8Pzaytzc3djS0tzQAAAAAAABcGFwYXBgcAAAAAAAAAAAB4iIgRAh4eHh4eHh4eHh4eHh4eHh6cnR4eLh4PDy4eD2hoeABoeGiIWXh4eWh5aFlpaFlpeWhpAGlZaWkAAAAAJQcmNSUAJQcVByUHFQclByUXByQXFhc1FxYXBQdEJxYXBQcmJxYXBQcWFwUHFhcGBxYXBQcWFwUHFhcWFxYXFhcXFwYHFxcGBxcXBgcXFwYHFhcGBxYXBgcWFwYHFhcGBxYXBQcWFwUHFhcGBxYXBQcmJwYHFhcFByUnBgcWFxYXFhcFBwYHFhcmFyYXAAAPAFdaLDsdHmicNjs9NC40HTxbTDw9TDs7PDt4eCwtPUstLjwsPDxMLi1KTT08HR0tTS49PCwtLR4sLDyMHTdZD2hMS0pLSktLTHlJO2g9TEtLS1tbOkw7LTtMS4yINy08PBM2JRQ0FhYWFhYWFhYlFiUHBhYHBxYHFgcWBxcHBhYWBwcHNgcHFgcWBxYWBwcHJQcGBgcHFhYmBycWFhckJA8WFRcWJycWFSUWBgYGBgcGFRYGFxUHFRUHFRYWFgYAAAAkJCQkJBUAACQVFRYGFQAAFRUlFiUVAAAWJEQAAAA7Ly08iD0uADMWJhYmFhYAAAAAAAAAAAAADw8PDxYPDw==) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md index c555b06fb..2de3901b9 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_README_md__0.pack.md_external_files/README.md @@ -2,260 +2,204 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](pack.png) +`@data_pack pack.png` -
+![data_pack.png](pack.png) ### tutorial -- `@function tutorial:greeting` - -
- - ```mcfunction - say This is added before. - say Hello, world! - say This is added afterwards. - ``` - -
- -- `@function tutorial:obtained_dead_bush` +`@function tutorial:greeting` -
+```mcfunction +say This is added before. +say Hello, world! +say This is added afterwards. +``` - ```mcfunction - say You obtained a dead bush! - ``` +`@function tutorial:obtained_dead_bush` -
+```mcfunction +say You obtained a dead bush! +``` -- `@function tutorial:hidden` +`@function tutorial:hidden` -
+```mcfunction +say This will not appear in the rendered markdown. +``` - ```mcfunction - say This will not appear in the rendered markdown. - ``` +`@function tutorial:also_hidden` -
+```mcfunction +say This is also hidden. +``` -- `@function tutorial:also_hidden` +`@function(strip_final_newline) tutorial:stripped` -
+```mcfunction +say This function doesn't have a final newline. +``` - ```mcfunction - say This is also hidden. - ``` +`@advancement tutorial:obtained_dead_bush` -
- -- `@function(strip_final_newline) tutorial:stripped` +```json +{ + "criteria": { + "dead_bush": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:dead_bush" + } + ] + } + } + }, + "requirements": [ + [ + "dead_bush" + ] + ], + "rewards": { + "function": "tutorial:obtained_dead_bush" + } +} +``` -
+`@function_tag(strip_final_newline) tutorial:something_else` - ```mcfunction - say This function doesn't have a final newline. - ``` +```json +{ + "values": ["tutorial:stripped"] +} +``` -
+`@function_tag tutorial:from_github` -- `@advancement tutorial:obtained_dead_bush` +```json +say foo +``` -
+### minecraft - ```json - { - "criteria": { - "dead_bush": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ +`@function_tag minecraft:load` + +```json +{ + "values": [ + "tutorial:greeting", + "#tutorial:something_else" + ] +} +``` + +`@loot_table minecraft:blocks/diamond_ore` + +```json +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ] + } + ] +} +``` + +`@loot_table minecraft:blocks/yellow_shulker_box` + +```json +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "item": "minecraft:air", + "nbt": "{drop_contents:1b}" + } + } + ] + }, { - "item": "minecraft:dead_bush" + "type": "minecraft:item", + "name": "minecraft:yellow_shulker_box", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Lock", + "target": "BlockEntityTag.Lock", + "op": "replace" + }, + { + "source": "LootTable", + "target": "BlockEntityTag.LootTable", + "op": "replace" + }, + { + "source": "LootTableSeed", + "target": "BlockEntityTag.LootTableSeed", + "op": "replace" + } + ] + }, + { + "function": "minecraft:set_contents", + "entries": [ + { + "type": "minecraft:dynamic", + "name": "minecraft:contents" + } + ] + } + ] } ] } - } - }, - "requirements": [ - [ - "dead_bush" ] - ], - "rewards": { - "function": "tutorial:obtained_dead_bush" } - } - ``` - -
- -- `@function_tag(strip_final_newline) tutorial:something_else` - -
- - ```json - { - "values": ["tutorial:stripped"] - } - ``` - -
- -- `@function_tag tutorial:from_github` - -
- - ```json - say foo - ``` - -
- -### minecraft - -- `@function_tag minecraft:load` - -
- - ```json - { - "values": [ - "tutorial:greeting", - "#tutorial:something_else" - ] - } - ``` - -
- -- `@loot_table minecraft:blocks/diamond_ore` - -
- - ```json - { - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:dead_bush" - } - ] - } - ] - } - ``` - -
- -- `@loot_table minecraft:blocks/yellow_shulker_box` - -
- - ```json - { - "type": "minecraft:block", - "pools": [ - { - "rolls": 1, - "entries": [ - { - "type": "minecraft:alternatives", - "children": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents", - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "item": "minecraft:air", - "nbt": "{drop_contents:1b}" - } - } - ] - }, - { - "type": "minecraft:item", - "name": "minecraft:yellow_shulker_box", - "functions": [ - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Lock", - "target": "BlockEntityTag.Lock", - "op": "replace" - }, - { - "source": "LootTable", - "target": "BlockEntityTag.LootTable", - "op": "replace" - }, - { - "source": "LootTableSeed", - "target": "BlockEntityTag.LootTableSeed", - "op": "replace" - } - ] - }, - { - "function": "minecraft:set_contents", - "entries": [ - { - "type": "minecraft:dynamic", - "name": "minecraft:contents" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ``` - -
+ ] +} +``` ### text_in_block -- `@function text_in_block:foo` - -
- - ```mcfunction - say foo - ``` +`@function text_in_block:foo` -
+```mcfunction +say foo +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md index 2c20caa64..74e883d5b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_inline_image_md__0.pack.md_external_files/README.md @@ -2,72 +2,48 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` +} +``` -
+`@data_pack pack.png` - ![data_pack.png](pack.png) - -
+![data_pack.png](pack.png) ## Resource pack -- `@resource_pack pack.mcmeta` - -
+`@resource_pack pack.mcmeta` - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### foo -- `@texture foo:hello` +`@texture foo:hello` -
- - ![texture.png](hello.png) - -
+![texture.png](hello.png) ### bar -- `@texture bar:hello` - -
+`@texture bar:hello` - ![texture.png](hello_1.png) - -
+![texture.png](hello_1.png) ### baz -- `@texture baz:hello` - -
- - ![texture.png](hello_2.png) +`@texture baz:hello` -
+![texture.png](hello_2.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md index c8abde25d..80744e331 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_lots_of_textures_md__0.pack.md_external_files/README.md @@ -2,219 +2,115 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@texture minecraft:block/green_concrete_powder` - -
- - ![texture.png](green_concrete_powder.png) - -
- -- `@texture minecraft:block/green_concrete` - -
- - ![texture.png](green_concrete.png) - -
- -- `@texture minecraft:block/green_glazed_terracotta` - -
- - ![texture.png](green_glazed_terracotta.png) - -
- -- `@texture minecraft:block/green_shulker_box` - -
- - ![texture.png](green_shulker_box.png) - -
- -- `@texture minecraft:block/green_stained_glass_pane_top` - -
- - ![texture.png](green_stained_glass_pane_top.png) - -
- -- `@texture minecraft:block/green_stained_glass` - -
- - ![texture.png](green_stained_glass.png) - -
- -- `@texture minecraft:block/green_terracotta` - -
- - ![texture.png](green_terracotta.png) - -
- -- `@texture minecraft:block/green_wool` - -
- - ![texture.png](green_wool.png) - -
- -- `@texture minecraft:block/grindstone_pivot` - -
- - ![texture.png](grindstone_pivot.png) - -
- -- `@texture minecraft:block/grindstone_round` - -
- - ![texture.png](grindstone_round.png) - -
- -- `@texture minecraft:block/grindstone_side` - -
- - ![texture.png](grindstone_side.png) - -
- -- `@texture minecraft:block/hay_block_side` - -
- - ![texture.png](hay_block_side.png) - -
- -- `@texture minecraft:block/hay_block_top` - -
- - ![texture.png](hay_block_top.png) +`@texture minecraft:block/green_concrete_powder` -
+![texture.png](green_concrete_powder.png) -- `@texture minecraft:block/honey_block_bottom` +`@texture minecraft:block/green_concrete` -
+![texture.png](green_concrete.png) - ![texture.png](honey_block_bottom.png) +`@texture minecraft:block/green_glazed_terracotta` -
+![texture.png](green_glazed_terracotta.png) -- `@texture minecraft:block/honey_block_side` +`@texture minecraft:block/green_shulker_box` -
+![texture.png](green_shulker_box.png) - ![texture.png](honey_block_side.png) +`@texture minecraft:block/green_stained_glass_pane_top` -
+![texture.png](green_stained_glass_pane_top.png) -- `@texture minecraft:block/honey_block_top` +`@texture minecraft:block/green_stained_glass` -
+![texture.png](green_stained_glass.png) - ![texture.png](honey_block_top.png) +`@texture minecraft:block/green_terracotta` -
+![texture.png](green_terracotta.png) -- `@texture minecraft:block/honeycomb_block` +`@texture minecraft:block/green_wool` -
+![texture.png](green_wool.png) - ![texture.png](honeycomb_block.png) +`@texture minecraft:block/grindstone_pivot` -
+![texture.png](grindstone_pivot.png) -- `@texture minecraft:block/hopper_inside` +`@texture minecraft:block/grindstone_round` -
+![texture.png](grindstone_round.png) - ![texture.png](hopper_inside.png) +`@texture minecraft:block/grindstone_side` -
+![texture.png](grindstone_side.png) -- `@texture minecraft:block/hopper_outside` +`@texture minecraft:block/hay_block_side` -
+![texture.png](hay_block_side.png) - ![texture.png](hopper_outside.png) +`@texture minecraft:block/hay_block_top` -
+![texture.png](hay_block_top.png) -- `@texture minecraft:block/hopper_top` +`@texture minecraft:block/honey_block_bottom` -
+![texture.png](honey_block_bottom.png) - ![texture.png](hopper_top.png) +`@texture minecraft:block/honey_block_side` -
+![texture.png](honey_block_side.png) -- `@texture minecraft:block/horn_coral_block` +`@texture minecraft:block/honey_block_top` -
+![texture.png](honey_block_top.png) - ![texture.png](horn_coral_block.png) +`@texture minecraft:block/honeycomb_block` -
+![texture.png](honeycomb_block.png) -- `@texture minecraft:block/horn_coral_fan` +`@texture minecraft:block/hopper_inside` -
+![texture.png](hopper_inside.png) - ![texture.png](horn_coral_fan.png) +`@texture minecraft:block/hopper_outside` -
+![texture.png](hopper_outside.png) -- `@texture minecraft:block/horn_coral` +`@texture minecraft:block/hopper_top` -
+![texture.png](hopper_top.png) - ![texture.png](horn_coral.png) +`@texture minecraft:block/horn_coral_block` -
+![texture.png](horn_coral_block.png) -- `@texture minecraft:block/ice` +`@texture minecraft:block/horn_coral_fan` -
+![texture.png](horn_coral_fan.png) - ![texture.png](ice.png) +`@texture minecraft:block/horn_coral` -
+![texture.png](horn_coral.png) -- `@texture minecraft:block/iron_bars` +`@texture minecraft:block/ice` -
+![texture.png](ice.png) - ![texture.png](iron_bars.png) +`@texture minecraft:block/iron_bars` -
+![texture.png](iron_bars.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md index 39177d55c..5b4cf0df0 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_data_url_md__0.pack.md_external_files/README.md @@ -2,50 +2,34 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](pack.png) +`@data_pack pack.png` -
+![data_pack.png](pack.png) ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 9, - "description": "" - } +```json +{ + "pack": { + "pack_format": 9, + "description": "" } - ``` - -
- -- `@resource_pack pack.png` - -
+} +``` - ![resource_pack.png](pack_1.png) +`@resource_pack pack.png` -
+![resource_pack.png](pack_1.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md index 857b5c7fd..f980e8f50 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_icon_link_md__0.pack.md_external_files/README.md @@ -2,25 +2,17 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](pack.png) +`@data_pack pack.png` -
+![data_pack.png](pack.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md index 857b5c7fd..f980e8f50 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_pack_local_icon_md__0.pack.md_external_files/README.md @@ -2,25 +2,17 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
- -- `@data_pack pack.png` - -
+} +``` - ![data_pack.png](pack.png) +`@data_pack pack.png` -
+![data_pack.png](pack.png) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md index 21f62cb83..11a2a777b 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_structure_files_md__0.pack.md_external_files/README.md @@ -2,25 +2,21 @@ ## Data pack -- `@data_pack pack.mcmeta` +`@data_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 10, - "description": "" - } +```json +{ + "pack": { + "pack_format": 10, + "description": "" } - ``` - -
+} +``` ### minecraft -- [`@structure minecraft:igloo/bottom`](bottom.nbt) +[`@structure minecraft:igloo/bottom`](bottom.nbt) -- [`@structure minecraft:igloo/middle`](middle.nbt) +[`@structure minecraft:igloo/middle`](middle.nbt) -- [`@structure minecraft:igloo/top`](top.nbt) +[`@structure minecraft:igloo/top`](top.nbt) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/README.md index 2e51c28c0..b49620e32 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_data_url_md__0.pack.md_external_files/README.md @@ -2,271 +2,255 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 6, - "description": "" - } +```json +{ + "pack": { + "pack_format": 6, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@font minecraft:alt` - -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/ascii_sga.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - } - ] - } - ``` - -
- -- `@font minecraft:default` +`@font minecraft:alt` -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` - -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] +} +``` -- `@font minecraft:uniform` +`@font minecraft:default` -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` - ```json - { - "providers": [ - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` +`@font minecraft:uniform` -
+```json +{ + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` -- [`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) +[`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md index 2e51c28c0..b49620e32 100644 --- a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_vanilla_font_local_md__0.pack.md_external_files/README.md @@ -2,271 +2,255 @@ ## Resource pack -- `@resource_pack pack.mcmeta` +`@resource_pack pack.mcmeta` -
- - ```json - { - "pack": { - "pack_format": 6, - "description": "" - } +```json +{ + "pack": { + "pack_format": 6, + "description": "" } - ``` - -
+} +``` ### minecraft -- `@font minecraft:alt` - -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/ascii_sga.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - } - ] - } - ``` - -
- -- `@font minecraft:default` +`@font minecraft:alt` -
- - ```json - { - "providers": [ - { - "type": "bitmap", - "file": "minecraft:font/nonlatin_european.png", - "ascent": 7, - "chars": [ - "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", - "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", - "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", - "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", - "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", - "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", - "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", - "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", - "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", - "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", - "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", - "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", - "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", - "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", - "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", - "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", - "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", - "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", - "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", - "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", - "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", - "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", - "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", - "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", - "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", - "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", - "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", - "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", - "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", - "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", - "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", - "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", - "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", - "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", - "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", - "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", - "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", - "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", - "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", - "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", - "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", - "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", - "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", - "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", - "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", - "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", - "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", - "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", - "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", - "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", - "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", - "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", - "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", - "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", - "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", - "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", - "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", - "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", - "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", - "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", - "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", - "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", - "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", - "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", - "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/accented.png", - "height": 12, - "ascent": 10, - "chars": [ - "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", - "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", - "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", - "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", - "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", - "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", - "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", - "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", - "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", - "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", - "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", - "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", - "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", - "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", - "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", - "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", - "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", - "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", - "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", - "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", - "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", - "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", - "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", - "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", - "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", - "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", - "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", - "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", - "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", - "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", - "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", - "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", - "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", - "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", - "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", - "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", - "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", - "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", - "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", - "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", - "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", - "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", - "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", - "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", - "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", - "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", - "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", - "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", - "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", - "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", - "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", - "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", - "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", - "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", - "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", - "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", - "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", - "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", - "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", - "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", - "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", - "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", - "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", - "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", - "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", - "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", - "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", - "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", - "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", - "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", - "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", - "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", - "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", - "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", - "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" - ] - }, - { - "type": "bitmap", - "file": "minecraft:font/ascii.png", - "ascent": 7, - "chars": [ - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", - "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", - "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", - "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", - "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", - "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", - "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", - "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", - "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", - "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", - "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" - ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` - -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/ascii_sga.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + } + ] +} +``` -- `@font minecraft:uniform` +`@font minecraft:default` -
+```json +{ + "providers": [ + { + "type": "bitmap", + "file": "minecraft:font/nonlatin_european.png", + "ascent": 7, + "chars": [ + "\u00a1\u2030\u00ad\u00b7\u20b4\u2260\u00bf\u00d7\u00d8\u00de\u04bb\u00f0\u00f8\u00fe\u0391\u0392", + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3", + "\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba", + "\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u0402", + "\u0405\u0406\u0408\u0409\u040a\u040b\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041a", + "\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a", + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u043a\u043b", + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b", + "\u044c\u044d\u044e\u044f\u0454\u0455\u0456\u0458\u0459\u045a\u2013\u2014\u2018\u2019\u201c\u201d", + "\u201e\u2026\u204a\u2190\u2191\u2192\u2193\u21c4\uff0b\u018f\u0259\u025b\u026a\u04ae\u04af\u04e8", + "\u04e9\u02bb\u02cc\u037e\u0138\u1e9e\u00df\u20bd\u20ac\u0462\u0463\u0474\u0475\u04c0\u0472\u0473", + "\u2070\u00b9\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u2071\u2122", + "\u0294\u0295\u29c8\u2694\u2620\u049a\u049b\u0492\u0493\u04b0\u04b1\u04d8\u04d9\u0496\u0497\u04a2", + "\u04a3\u04ba\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05db\u05dc\u05de\u05dd", + "\u05e0\u05df\u05e1\u05e2\u05e4\u05e3\u05e6\u05e5\u05e7\u05e8\u00a2\u00a4\u00a5\u00a9\u00ae\u00b5", + "\u00b6\u00bc\u00bd\u00be\u0387\u2010\u201a\u2020\u2021\u2022\u2031\u2032\u2033\u2034\u2035\u2036", + "\u2037\u2039\u203a\u203b\u203c\u203d\u2042\u2048\u2049\u204b\u204e\u204f\u2051\u2052\u2057\u2117", + "\u2212\u2213\u221e\u2600\u2601\u2608\u0404\u2632\u2635\u263d\u2640\u2642\u26a5\u2660\u2663\u2665", + "\u2666\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2680\u2681\u2682\u2683\u2684\u2685\u02ac\u26a1", + "\u26cf\u2714\u2744\u274c\u2764\u2b50\u2e18\u2e2e\u2e35\u2e38\u2e41\u2e4b\u295d\u1614\u0190\u07c8", + "\u03db\u3125\u2c6f\u15fa\u0186\u15e1\u018e\u2132\u2141\ua7b0\ua780\u0500\ua779\u1d1a\u27d8\u2229", + "\u0245\u2144\u0250\u0254\u01dd\u025f\u1d77\u0265\u1d09\u027e\u029e\ua781\u026f\u0279\u0287\u028c", + "\u028d\u028e\u0531\u0532\u0533\u0534\u0536\u0537\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540", + "\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054b\u054c\u054d\u054e\u054f\u0550\u0551", + "\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a", + "\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a", + "\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u05e9\u05ea\u0538", + "\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0588\u058f\u00af\u017f\u01b7\u0292\u01f7\u01bf\u021c", + "\u021d\u0224\u0225\u02d9\ua75a\ua75b\u2011\u214b\u23cf\u23e9\u23ea\u23ed\u23ee\u23ef\u23f4\u23f5", + "\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u2b58\u25b2\u25b6\u25bc\u25c0\u25cf\u25e6\u25d8", + "\u2693\u26e8\u0132\u0133\u01c9\ua728\ua729\ua739\ua73b\ufb00\ufb01\ufb02\ufb03\ufb05\ufffd\u0535", + "\u054a\u16a0\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af", + "\u16b0\u16b1\u16b2\u16b3\u16b4\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0", + "\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0", + "\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0", + "\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0", + "\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u263a\u263b\u00a6\u2639\u05da\u05f3\u05f4\u05f0", + "\u05f1\u05f2\u05be\u05c3\u05c6\u00b4\u00a8\u1d00\u0299\u1d04\u1d05\u1d07\ua730\u0262\u029c\u1d0a", + "\u1d0b\u029f\u1d0d\u0274\u1d0f\u1d18\ua7af\u0280\ua731\u1d1b\u1d1c\u1d20\u1d21\u028f\u1d22\u00a7", + "\u0271\u0273\u0272\u0288\u0256\u0261\u02a1\u0255\u0291\u0278\u029d\u02a2\u027b\u0281\u0266\u028b", + "\u0270\u026c\u026e\u0298\u01c0\u01c3\u01c2\u01c1\u0253\u0257\u1d91\u0284\u0260\u029b\u0267\u026b", + "\u0268\u0289\u028a\u0258\u0275\u0264\u025c\u025e\u0251\u0252\u025a\u025d\u0181\u0189\u0191\u01a9", + "\u01b2\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae", + "\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be", + "\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6", + "\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6", + "\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6", + "\u10f7\u10f8\u10f9\u10fa\u10fb\u10fc\u10fd\u10fe\u10ff\ufb4a\ufb2b\ufb4e\ufb44\ufb3b\ufb1f\ufb1d", + "\ufb4b\ufb35\ufb4c\ufb31\ua727\ua726\u027a\u2c71\u02a0\u0297\u0296\u026d\u0277\u027f\u0285\u0286", + "\u0293\u029a\u20aa\u20be\u058a\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d21\u2d07\u2d08\u2d09", + "\u2d0a\u2d0b\u2d0c\u2d22\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d23\u2d13\u2d14\u2d15\u2d16\u2d17", + "\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d24\u2d1f\u2d20\u2d25\u215b\u215c\u215d\u215e\u2153", + "\u2154\u2709\u2602\u2614\u2604\u26c4\u2603\u231b\u231a\u2690\u270e\u2763\u2664\u2667\u2661\u2662", + "\u26c8\u2630\u2631\u2633\u2634\u2636\u2637\u2194\u21d2\u21cf\u21d4\u21f5\u2200\u2203\u2204\u2209", + "\u220b\u220c\u2282\u2283\u2284\u2285\u2227\u2228\u22bb\u22bc\u22bd\u2225\u2262\u22c6\u2211\u22a4", + "\u22a5\u22a2\u22a8\u2254\u2201\u2234\u2235\u221b\u221c\u2202\u22c3\u2286\u2287\u25a1\u25b3\u25b7", + "\u25bd\u25c1\u25c6\u25c7\u25cb\u25ce\u2606\u2605\u2718\u2080\u2081\u2082\u2083\u2084\u2085\u2086", + "\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u222b\u222e\u221d\u2300\u2302\u2318\u3012\u027c", + "\u0184\u0185\u1e9f\u023d\u019a\u019b\u0220\u019e\u019f\u01a7\u01a8\u01aa\u01b8\u01b9\u01bb\u01bc", + "\u01bd\u01be\u0221\u0234\u0235\u0236\u023a\u2c65\u023b\u023c\u0246\u0247\u023e\u2c66\u0241\u0242", + "\u0243\u0244\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u1e9c\u1e9d\u1efc\u1efd\u1efe\u1eff", + "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d", + "\ud800\udf3e\ud800\udf3f\ud800\udf40\ud800\udf41\ud800\udf42\ud800\udf43\ud800\udf44\ud800\udf45\ud800\udf46\ud800\udf47\ud800\udf48\ud800\udf49\ud800\udf4a\ud83c\udf27\ud83d\udd25\ud83c\udf0a", + "\u2150\u2151\u2155\u2156\u2157\u2159\u215a\u215f\u2189\ud83d\udde1\ud83c\udff9\ud83e\ude93\ud83d\udd31\ud83c\udfa3\ud83e\uddea\u2697", + "\u2bea\u2beb\u2c6d\ud83d\udee1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/accented.png", + "height": 12, + "ascent": 10, + "chars": [ + "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf", + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3", + "\u00e4\u00e5\u00e6\u00e7\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f9\u00fa", + "\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b", + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b", + "\u011c\u011d\u1e20\u1e21\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129", + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c", + "\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d", + "\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d", + "\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d", + "\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d", + "\u017e\u01fc\u01fd\u01fe\u01ff\u0218\u0219\u021a\u021b\u0386\u0388\u0389\u038a\u038c\u038e\u038f", + "\u0390\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03ca\u03cb\u03cc\u03cd\u03ce\u0400\u0401\u0403", + "\u0407\u040c\u040d\u040e\u0419\u0439\u0450\u0451\u0452\u0453\u0457\u045b\u045c\u045d\u045e\u045f", + "\u0490\u0491\u1e02\u1e03\u1e0a\u1e0b\u1e1e\u1e1f\u1e22\u1e23\u1e30\u1e31\u1e40\u1e41\u1e56\u1e57", + "\u1e60\u1e61\u1e6a\u1e6b\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u00e8\u00e9\u00ea\u00eb", + "\u0149\u01e7\u01eb\u040f\u1e0d\u1e25\u1e5b\u1e6d\u1e92\u1eca\u1ecb\u1ecc\u1ecd\u1ee4\u1ee5\u2116", + "\u0207\u0194\u0263\u0283\u2047\u01f1\u01f2\u01f3\u01c4\u01c5\u01c6\u01c7\u01c8\u01ca\u01cb\u01cc", + "\u2139\u1d6b\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua73a\ua73c\ua73d\ua74e\ua74f\ua760\ua761", + "\ufb04\ufb06\u16a1\u16b5\u01a0\u01a1\u01af\u01b0\u1eae\u1eaf\u1ea4\u1ea5\u1ebe\u1ebf\u1ed1\u1eda", + "\u1edb\u1ee8\u1ee9\u1eb0\u1eb1\u1ea6\u1ea7\u1ec0\u1ec1\u1ed3\u1edc\u1edd\u1eea\u1eeb\u1ea2\u1ea3", + "\u1eb2\u1eb3\u1ea8\u1ea9\u1eba\u1ebb\u1ed5\u1ede\u1ec2\u1ec3\u1ec8\u1ec9\u1ece\u1ecf\u1ed4\u1edf", + "\u1ee6\u1ee7\u1eec\u1eed\u1ef6\u1ef7\u1ea0\u1ea1\u1eb6\u1eb7\u1eac\u1ead\u1eb8\u1eb9\u1ec6\u1ec7", + "\u1ed8\u1ed9\u1ee2\u1ee3\u1ef0\u1ef1\u1ef4\u1ef5\u1ed0\u0195\u1eaa\u1eab\u1ed6\u1ed7\u1eef\u261e", + "\u261c\u262e\u1eb4\u1eb5\u1ebc\u1ebd\u1ec4\u1ec5\u1ed2\u1ee0\u1ee1\u1eee\u1ef8\u1ef9\u0498\u0499", + "\u04a0\u04a1\u04aa\u04ab\u01f6\u26a0\u24ea\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468", + "\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u24b6\u24b7\u24b8\u24b9\u24ba", + "\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca", + "\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da", + "\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u0327", + "\u0282\u0290\u0276\u01cd\u01ce\u01de\u01df\u01fa\u01fb\u0202\u0203\u0226\u0227\u01e0\u01e1\u1e00", + "\u1e01\u0200\u0201\u1e06\u1e07\u1e04\u1e05\u1d6c\u1e08\u1e09\u1e10\u1e11\u1e12\u1e13\u1e0e\u1e0f", + "\u1e0c\u1d6d\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1c\u1e1d\u0228\u0229\u1e1a\u1e1b\u0204\u0205", + "\u0206\u1d6e\u01f4\u01f5\u01e6\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u021e\u021f\u1e24\u1e96\u1e2e", + "\u1e2f\u020a\u020b\u01cf\u01d0\u0208\u0209\u1e2c\u1e2d\u01f0\u0237\u01e8\u01e9\u1e32\u1e33\u1e34", + "\u1e35\u1e3a\u1e3b\u1e3c\u1e3d\u1e36\u1e37\u1e38\u1e39\u2c62\u1e3e\u1e3f\u1e42\u1e43\u1d6f\u1e44", + "\u1e45\u1e46\u1e47\u1e4a\u1e4b\u01f8\u01f9\u1e48\u1e49\u1d70\u01ec\u01ed\u022c\u022d\u1e4c\u1e4d", + "\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u020e\u020f\u022a\u022b\u01d1\u01d2\u022e\u022f\u0230\u0231", + "\u020c\u020d\u01ea\u1e54\u1e55\u1d71\u0212\u0213\u1e58\u1e59\u1e5c\u1e5d\u1e5e\u1e5f\u0210\u0211", + "\u1e5a\u1d73\u1d72\u1e64\u1e65\u1e66\u1e67\u1e62\u1e63\u1e68\u1e69\u1d74\u1e70\u1e71\u1e6e\u1e6f", + "\u1e6c\u1e97\u1d75\u1e72\u1e73\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u01d3\u01d4\u01d5\u01d6\u01d7", + "\u01d8\u01d9\u01da\u01db\u01dc\u1e74\u1e75\u0214\u0215\u0216\u1e7e\u1e7f\u1e7c\u1e7d\u1e86\u1e87", + "\u1e88\u1e89\u1e98\u1e8c\u1e8d\u1e8a\u1e8b\u0232\u0233\u1e8e\u1e8f\u1e99\u1e94\u1e95\u1e90\u1e91", + "\u1e93\u1d76\u01ee\u01ef\u1e9b\ua73e\ua73f\u01e2\u01e3\u1d7a\u1efb\u1d02\u1d14\uab63\u0238\u02a3", + "\u02a5\u02a4\u02a9\u02aa\u02ab\u0239\u02a8\u02a6\u02a7\uab50\uab51\u20a7\u1efa\ufb2e\ufb2f\u0180", + "\u0182\u0183\u0187\u0188\u018a\u018b\u018c\u0193\u01e4\u01e5\u0197\u0196\u0269\u0198\u0199\u019d", + "\u01a4\u01a5\u027d\u01a6\u01ac\u01ad\u01ab\u01ae\u0217\u01b1\u019c\u01b3\u01b4\u01b5\u01b6\u01a2", + "\u01a3\u0222\u0223\u02ad\u02ae\u02af\ufb14\ufb15\ufb17\ufb16\ufb13\u04d0\u04d1\u04d2\u04d3\u04f6", + "\u04f7\u0494\u0495\u04d6\u04d7\u04bc\u04bd\u04be\u04bf\u04da\u04db\u04dc\u04dd\u04c1\u04c2\u04de", + "\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04ea\u04eb\u04f0\u04f1\u04ee\u04ef\u04f2\u04f3\u04f4", + "\u04f5\u04f8\u04f9\u04ec\u04ed\u0476\u0477\u04d4\u04fa\u0502\ua682\ua680\ua688\u052a\u052c\ua684", + "\u0504\u0510\u04e0\u0506\u048a\u04c3\u049e\u049c\u051e\u051a\u04c5\u052e\u0512\u0520\u0508\u0514", + "\u04cd\u04c9\u0528\u04c7\u04a4\u0522\u050a\u04a8\u0524\u04a6\u048e\u0516\u050c\ua690\u04ac\ua68a", + "\ua68c\u050e\u04b2\u04fc\u04fe\u0526\ua694\u04b4\ua68e\u04b6\u04cb\u04b8\ua692\ua696\ua686\u048c", + "\u0518\u051c\u04d5\u04fb\u0503\ua683\ua681\ua689\u052b\u052d\ua685\u0505\u0511\u04e1\u0507\u048b", + "\u04c4\u049f\u049d\u051f\u051b\u04c6\u052f\u0513\u0521\u0509\u0515\u04ce\u04ca\u0529\u04c8\u04a5", + "\u0523\u050b\u04a9\u0525\u04a7\u048f\u0517\u050d\ua691\u04ad\ua68b\ua68d\u050f\u04b3\u04fd\u04ff", + "\u0527\ua695\u04b5\ua68f\u04b7\u04cc\u04b9\ua693\ua697\ua687\u048d\u0519\u051d\u1f08\u1f00\u1f09", + "\u1f01\u1f0a\u1f02\u1f0b\u1f03\u1f0c\u1f04\u1f0d\u1f05\u1f0e\u1f06\u1f0f\u1f07\u1fba\u1f70\u1fb8", + "\u1fb0\u1fb9\u1fb1\u1fbb\u1f71\u1f88\u1f80\u1f89\u1f81\u1f8a\u1f82\u1f8b\u1f83\u1f8c\u1f84\u1f8d", + "\u1f85\u1f8e\u1f86\u1f8f\u1f87\u1fbc\u1fb4\u1fb6\u1fb7\u1fb2\u1fb3\u1f18\u1f10\u1f19\u1f11\u1f1a", + "\u1f12\u1f1b\u1f13\u1f1c\u1f14\u1f1d\u1f15\u1fc8\u1fc9\u1f72\u1f73\u1f28\u1f20\u1fca\u1f74\u1f29", + "\u1f21\u1f2a\u1f22\u1f2b\u1f23\u1f2c\u1f24\u1f2d\u1f25\u1f2e\u1f26\u1f2f\u1f27\u1f98\u1f90\u1f99", + "\u1f91\u1f9a\u1f92\u1f9b\u1f93\u1f9c\u1f94\u1f9d\u1f95\u1f9e\u1f96\u1f9f\u1f97\u1fcb\u1f75\u1fcc", + "\u1fc3\u1fc2\u1fc4\u1fc6\u1fc7\u1fda\u1f76\u1fdb\u1f77\u1f38\u1f30\u1f39\u1f31\u1f3a\u1f32\u1f3b", + "\u1f33\u1f3c\u1f34\u1f3d\u1f35\u1f3e\u1f36\u1f3f\u1f37\u1fd8\u1fd0\u1fd9\u1fd1\u1fd2\u1fd3\u1fd6", + "\u1fd7\u1ff8\u1f78\u1ff9\u1f79\u1f48\u1f40\u1f49\u1f41\u1f4a\u1f42\u1f4b\u1f43\u1f4c\u1f44\u1f4d", + "\u1f45\u1fec\u1fe4\u1fe5\u1fea\u1f7a\u1feb\u1f7b\u1f59\u1f51\u1f5b\u1f53\u1f5d\u1f55\u1f5f\u1f57", + "\u1fe8\u1fe0\u1fe9\u1fe1\u03d3\u03d4\u1fe2\u1fe3\u1fe7\u1f50\u1f52\u1f54\u1fe6\u1f56\u1ffa\u1f7c", + "\u1ffb\u1f7d\u1f68\u1f60\u1f69\u1f61\u1f6a\u1f62\u1f6b\u1f63\u1f6c\u1f64\u1f6d\u1f65\u1f6e\u1f66", + "\u1f6f\u1f67\u1fa8\u1fa0\u1fa9\u1fa1\u1faa\u1fa2\u1fab\u1fa3\u1fac\u1fa4\u1fad\u1fa5\u1fae\u1fa6", + "\u1faf\u1fa7\u1ffc\u1ff3\u1ff2\u1ff4\u1ff6\u1ff7\u262f\u2610\u2611\u2612\u018d\u01ba\u2c7e\u023f", + "\u2c7f\u0240\u1d80\ua7c4\ua794\u1d81\u1d82\u1d83\ua795\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a", + "\u1d8b\u1d8c\u1d8d\ua7c6\u1d8e\u1d8f\u1d90\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a", + "\u1e9a\u2152\u2158\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + ] + }, + { + "type": "bitmap", + "file": "minecraft:font/ascii.png", + "ascent": 7, + "chars": [ + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f", + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f", + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f", + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f", + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f", + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00a3\u0000\u0000\u0192", + "\u0000\u0000\u0000\u0000\u0000\u0000\u00aa\u00ba\u0000\u0000\u00ac\u0000\u0000\u0000\u00ab\u00bb", + "\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510", + "\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567", + "\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", + "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000" + ] + }, + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` - ```json - { - "providers": [ - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" - } - ] - } - ``` +`@font minecraft:uniform` -
+```json +{ + "providers": [ + { + "type": "legacy_unicode", + "sizes": "minecraft:font/glyph_sizes.bin", + "template": "minecraft:font/unicode_page_%s.png" + } + ] +} +``` -- [`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) +[`@glyph_sizes minecraft:glyph_sizes`](glyph_sizes.bin) From 236b4ee5bdecdbaadffe818a1b127a319dc071a7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 03:39:46 +0000 Subject: [PATCH 0900/1554] 0.24.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 5d9dd4369..64e676124 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.24.0 (2022-06-18) +### Feature +* Change serialization filter for pytest snapshots ([`aea38cf`](https://github.com/mcbeet/lectern/commit/aea38cfd2db89b8d4470fa0805b54b5e2752d231)) + ## v0.23.0 (2022-06-18) ### Feature * Add serialization pack filter ([`c841d6b`](https://github.com/mcbeet/lectern/commit/c841d6b6eb7dea115c3d2a791f36cca672362aaf)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 40a4d083c..4f28edb83 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.23.0" +__version__ = "0.24.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 942509fa9..cafe87d35 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.23.0" +version = "0.24.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From b47e94cfa39545d5b0d75747895a2d18ca5c24eb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 05:44:11 +0200 Subject: [PATCH 0901/1554] fix: update lectern for new snapshot settings --- packages/mecha/poetry.lock | 16 ++++++++-------- packages/mecha/pyproject.toml | 4 ++-- packages/mecha/tests/test_examples.py | 4 +--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index c3090ce24..97809b81a 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.68.1" +version = "0.68.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -314,14 +314,14 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.22.0" +version = "0.24.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.68.1" +beet = ">=0.68.2" click = ">=8.1.3,<9.0.0" markdown-it-py = ">=2.1.0,<3.0.0" @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "20698329fd779d1474e12c34a3efbcc7059f2e4679e748b2432e25dc6d1a5194" +content-hash = "acce0738de22ed8569b757afa9eee6ba9c2b6cf0d506cfa59cb0137afaddcc71" [metadata.files] atomicwrites = [ @@ -825,8 +825,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.68.1-py3-none-any.whl", hash = "sha256:49f865161831eab37202f5b74f99e97bafc0c8fc9375032a2bed93fff95e1aab"}, - {file = "beet-0.68.1.tar.gz", hash = "sha256:92fccb6448a64f02fb7c92d2cafa253afc9482b4b0f9bdf1de6344ae4205f05b"}, + {file = "beet-0.68.2-py3-none-any.whl", hash = "sha256:dddd10e0dc2114d7ecfa7bd919a5550ac7ef8621ce788996f38fd285614dde22"}, + {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1003,8 +1003,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.22.0-py3-none-any.whl", hash = "sha256:a6e50a770d8d31bfb4499bd6361973752286f0cd4f5d72df08953a464ea1e31b"}, - {file = "lectern-0.22.0.tar.gz", hash = "sha256:4c906ba45caf87021e2b1a0249b235e7bb1584c014c4d4f0f425678d21add874"}, + {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, + {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0a4963b3d..9b6583c38 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.1" +beet = ">=0.68.2" tokenstream = "1.4.2" [tool.poetry.dev-dependencies] @@ -32,7 +32,7 @@ pytest = "^7.1.2" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" -lectern = ">=0.22.0" +lectern = ">=0.24.0" [tool.poetry.scripts] mecha = "mecha.cli:main" diff --git a/packages/mecha/tests/test_examples.py b/packages/mecha/tests/test_examples.py index 3c1013e50..ceffab1dd 100644 --- a/packages/mecha/tests/test_examples.py +++ b/packages/mecha/tests/test_examples.py @@ -9,6 +9,4 @@ @pytest.mark.parametrize("directory", os.listdir("examples")) def test_build(snapshot: SnapshotFixture, directory: str): with run_beet(directory=f"examples/{directory}") as ctx: - document = ctx.inject(Document) - document.markdown_serializer.flat = True - assert snapshot("pack.md") == document + assert snapshot("pack.md") == ctx.inject(Document) From 985f8419e2fe445d8fee4048221c27ce0155cac4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 03:45:23 +0000 Subject: [PATCH 0902/1554] 0.54.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index eddb76a7e..7610455f4 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.2 (2022-06-18) +### Fix +* Update lectern for new snapshot settings ([`00ff0cf`](https://github.com/mcbeet/mecha/commit/00ff0cfe83bf9f84596c231338a9916a65d6dd4c)) + ## v0.54.1 (2022-06-18) ### Fix * Make redirects conditional ([`a0046bf`](https://github.com/mcbeet/mecha/commit/a0046bf9e4dc64edd9cde51f759bcfa5123fe4fe)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index b460aafff..565c908f8 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.1" +__version__ = "0.54.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9b6583c38..7f1838c8f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.1" +version = "0.54.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 4d30b089c6c897f39388baee60a961d13153f5e1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 18 Jun 2022 05:48:13 +0200 Subject: [PATCH 0903/1554] fix: update deps for new snapshot settings --- packages/bolt/poetry.lock | 24 ++++++++++++------------ packages/bolt/pyproject.toml | 6 +++--- packages/bolt/tests/test_examples.py | 4 +--- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index fd89c2ee1..d41b054fb 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.68.1" +version = "0.68.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -314,14 +314,14 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "lectern" -version = "0.22.0" +version = "0.24.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.68.1" +beet = ">=0.68.2" click = ">=8.1.3,<9.0.0" markdown-it-py = ">=2.1.0,<3.0.0" @@ -364,14 +364,14 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.54.1" +version = "0.54.2" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.68.1" +beet = ">=0.68.2" tokenstream = "1.4.2" [[package]] @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "dac87c089627cdbfb400346ad7a112f10c6441d4f286f59ed318a523ae39b590" +content-hash = "229f643d3d8cbcad0301696e66c85753b52c2f93f6a9378349493665dbb95602" [metadata.files] atomicwrites = [ @@ -837,8 +837,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.68.1-py3-none-any.whl", hash = "sha256:49f865161831eab37202f5b74f99e97bafc0c8fc9375032a2bed93fff95e1aab"}, - {file = "beet-0.68.1.tar.gz", hash = "sha256:92fccb6448a64f02fb7c92d2cafa253afc9482b4b0f9bdf1de6344ae4205f05b"}, + {file = "beet-0.68.2-py3-none-any.whl", hash = "sha256:dddd10e0dc2114d7ecfa7bd919a5550ac7ef8621ce788996f38fd285614dde22"}, + {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1017,8 +1017,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.22.0-py3-none-any.whl", hash = "sha256:a6e50a770d8d31bfb4499bd6361973752286f0cd4f5d72df08953a464ea1e31b"}, - {file = "lectern-0.22.0.tar.gz", hash = "sha256:4c906ba45caf87021e2b1a0249b235e7bb1584c014c4d4f0f425678d21add874"}, + {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, + {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.54.1-py3-none-any.whl", hash = "sha256:e3ab536a1d98fd550f9552113c1fc062706309fe8a46e070f09c633dc092dca8"}, - {file = "mecha-0.54.1.tar.gz", hash = "sha256:85100af58169db44d7ca653675f545307cd27dbf4940166cedc78163f6ada38d"}, + {file = "mecha-0.54.2-py3-none-any.whl", hash = "sha256:338454b003d60d555f9ded2c5b51ec3711a2a098d72f9d6e553a3ea7250431d7"}, + {file = "mecha-0.54.2.tar.gz", hash = "sha256:2f10d4e5b8ae66b4f7ccf21a9aa59c8615ac739b20d78a2f3a83b99f60988fe6"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 0da75d085..34540f29c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.1" -mecha = ">=0.54.1" +beet = ">=0.68.2" +mecha = ">=0.54.2" [tool.poetry.dev-dependencies] pytest = "^7.1.2" @@ -32,7 +32,7 @@ black = "^22.3.0" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" -lectern = ">=0.22.0" +lectern = ">=0.24.0" [tool.pytest.ini_options] addopts = "tests bolt --doctest-modules" diff --git a/packages/bolt/tests/test_examples.py b/packages/bolt/tests/test_examples.py index 3c1013e50..ceffab1dd 100644 --- a/packages/bolt/tests/test_examples.py +++ b/packages/bolt/tests/test_examples.py @@ -9,6 +9,4 @@ @pytest.mark.parametrize("directory", os.listdir("examples")) def test_build(snapshot: SnapshotFixture, directory: str): with run_beet(directory=f"examples/{directory}") as ctx: - document = ctx.inject(Document) - document.markdown_serializer.flat = True - assert snapshot("pack.md") == document + assert snapshot("pack.md") == ctx.inject(Document) From 2cf9a96683a0d04750bd1fb47f908b6fe7842392 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jun 2022 03:49:29 +0000 Subject: [PATCH 0904/1554] 0.8.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 9c5b5fd0f..e29783af5 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.1 (2022-06-18) +### Fix +* Update deps for new snapshot settings ([`6739b2b`](https://github.com/mcbeet/bolt/commit/6739b2bb0d4521de90e6162f40033d37b2550fcd)) + ## v0.8.0 (2022-06-18) ### Feature * Add context managers ([`38e614e`](https://github.com/mcbeet/bolt/commit/38e614e8d38d1c62af019f2b5f08a78cff22ed0b)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index d7cbdfc15..e6f04bf9d 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.0" +__version__ = "0.8.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 34540f29c..916f2cec7 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.8.0" +version = "0.8.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From c5a6bb276bb7e764f12987305ef8ebce4c5ff305 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 12:31:40 +0000 Subject: [PATCH 0905/1554] chore(deps-dev): bump pyright from 1.1.254 to 1.1.255 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.254 to 1.1.255. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.255/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 0622a4a71..383d3c72e 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.254" + "pyright": "^1.1.255" } }, "node_modules/pyright": { - "version": "1.1.254", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", - "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", + "version": "1.1.255", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.255.tgz", + "integrity": "sha512-pAec1Mqyq0l0+C6JH7o7Va0oWyZVACEFgP2cWD9DU/C1epoqZAt/PCRbae/7fFfn7ZGew5tiTMdtO/2RZO/cRg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.254", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", - "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", + "version": "1.1.255", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.255.tgz", + "integrity": "sha512-pAec1Mqyq0l0+C6JH7o7Va0oWyZVACEFgP2cWD9DU/C1epoqZAt/PCRbae/7fFfn7ZGew5tiTMdtO/2RZO/cRg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index ce423b29d..6e3926552 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.254" + "pyright": "^1.1.255" } } From 9dece8b2f731eddc9e591b704740071b07c7ff3e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 21 Jun 2022 23:57:00 +0200 Subject: [PATCH 0906/1554] fix: allow compilation step to return None to abort --- packages/mecha/mecha/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 49a01ecc5..c7a06e1af 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -444,7 +444,8 @@ def compile( continue with self.steps[step].use_diagnostics(compilation_unit.diagnostics): compilation_unit.ast = self.steps[step](compilation_unit.ast) - self.database.enqueue(function, step + 1) + if compilation_unit.ast: + self.database.enqueue(function, step + 1) elif not readonly: if not compilation_unit.ast: From ac62635b6b3b077b79912c21b878933d81a69fad Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 21 Jun 2022 21:57:46 +0000 Subject: [PATCH 0907/1554] 0.54.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 7610455f4..017e261a3 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.3 (2022-06-21) +### Fix +* Allow compilation step to return None to abort ([`8f3ce64`](https://github.com/mcbeet/mecha/commit/8f3ce64708607078736090370b166af215a48f5b)) + ## v0.54.2 (2022-06-18) ### Fix * Update lectern for new snapshot settings ([`00ff0cf`](https://github.com/mcbeet/mecha/commit/00ff0cfe83bf9f84596c231338a9916a65d6dd4c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 565c908f8..828f2be6b 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.2" +__version__ = "0.54.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 7f1838c8f..597f9f22c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.2" +version = "0.54.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5fe18b59ed3995d3473f839f4b45a2df770fa53e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 24 Jun 2022 18:10:56 +0200 Subject: [PATCH 0908/1554] fix: remove leftover extern plugin --- packages/bolt/bolt/contrib/extern.py | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 packages/bolt/bolt/contrib/extern.py diff --git a/packages/bolt/bolt/contrib/extern.py b/packages/bolt/bolt/contrib/extern.py deleted file mode 100644 index 344e10e0a..000000000 --- a/packages/bolt/bolt/contrib/extern.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Plugin for handling bolt modules outside data packs.""" - - -__all__ = [ - "ExternOptions", - "extern", -] - - -from typing import Dict, Optional, Union - -from beet import Context, ListOption, configurable -from pydantic import BaseModel - - -class ExternOptions(BaseModel): - namespace: Optional[str] = None - modules: Union[ListOption[str], Dict[str, ListOption[str]]] = {} - - -def beet_default(ctx: Context): - ctx.require(extern) - - -@configurable(validator=ExternOptions) -def extern(ctx: Context, opts: ExternOptions): - """Plugin for handling bolt modules outside data packs.""" From 520ab30fb5930260038ecb4ffd4e8128f2878f67 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 24 Jun 2022 16:11:44 +0000 Subject: [PATCH 0909/1554] 0.8.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index e29783af5..877e9795d 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.8.2 (2022-06-24) +### Fix +* Remove leftover extern plugin ([`42cc659`](https://github.com/mcbeet/bolt/commit/42cc6590bfef34cc4573ed8d2fe8404cf26c9f34)) + ## v0.8.1 (2022-06-18) ### Fix * Update deps for new snapshot settings ([`6739b2b`](https://github.com/mcbeet/bolt/commit/6739b2bb0d4521de90e6162f40033d37b2550fcd)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e6f04bf9d..61389ab46 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.1" +__version__ = "0.8.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 916f2cec7..1c71c4b1f 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.8.1" +version = "0.8.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From b65b691306713c05e46a994e5c9494664d79a651 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 24 Jun 2022 18:22:43 +0200 Subject: [PATCH 0910/1554] chore: update mecha --- packages/bolt/poetry.lock | 8 ++++---- packages/bolt/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index d41b054fb..5b064a2b8 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.54.2" +version = "0.54.3" description = "A powerful Minecraft command library" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "229f643d3d8cbcad0301696e66c85753b52c2f93f6a9378349493665dbb95602" +content-hash = "315f87451fb9ea3c24fcd67e4eae0f61e0673e627d85e4382b0ae32ec92be9f0" [metadata.files] atomicwrites = [ @@ -1071,8 +1071,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.54.2-py3-none-any.whl", hash = "sha256:338454b003d60d555f9ded2c5b51ec3711a2a098d72f9d6e553a3ea7250431d7"}, - {file = "mecha-0.54.2.tar.gz", hash = "sha256:2f10d4e5b8ae66b4f7ccf21a9aa59c8615ac739b20d78a2f3a83b99f60988fe6"}, + {file = "mecha-0.54.3-py3-none-any.whl", hash = "sha256:2aacfa8252229cc1f8377587aea2d3c4e85c6ff8497e159ed4a30901d27e8443"}, + {file = "mecha-0.54.3.tar.gz", hash = "sha256:7a78cdd3427f1240ee1fa7f905db4096d283dbe3f557641b5cc0b9b4a307ef27"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 1c71c4b1f..551e7c78c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.68.2" -mecha = ">=0.54.2" +mecha = ">=0.54.3" [tool.poetry.dev-dependencies] pytest = "^7.1.2" From e048affb7b56a6dcc805c9ae80fea62ded85b51a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 24 Jun 2022 18:23:02 +0200 Subject: [PATCH 0911/1554] chore: add type stubs for pathspec --- packages/bolt/typings/pathspec.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/bolt/typings/pathspec.py diff --git a/packages/bolt/typings/pathspec.py b/packages/bolt/typings/pathspec.py new file mode 100644 index 000000000..367777e80 --- /dev/null +++ b/packages/bolt/typings/pathspec.py @@ -0,0 +1,3 @@ +from typing import Any + +PathSpec = Any From 2484521c1fe76cfc6239ea864b3d5c169bbbe954 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 24 Jun 2022 18:23:48 +0200 Subject: [PATCH 0912/1554] fix: minor visual changes --- packages/bolt/bolt/runtime.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index a98a32f0c..2766530e6 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -230,12 +230,12 @@ def get_module( code = None module = CompiledModule( - target, - code, - refs, - output, - compilation_unit.resource_location, - set(self.globals), + ast=target, + code=code, + refs=refs, + output=output, + resource_location=compilation_unit.resource_location, + globals=set(self.globals), ) self.modules[current] = module @@ -302,7 +302,7 @@ def import_module(self, resource_location: str) -> CompiledModule: try: module = self.get_module(resource_location) except KeyError: - msg = f"Couldn't import {resource_location!r}." + msg = f'Couldn\'t import "{resource_location}".' raise ImportError(msg) from None if not module.executing: self.get_output(module) @@ -315,7 +315,7 @@ def from_module_import(self, resource_location: str, *args: str) -> Any: try: values = [module.namespace[name] for name in args] except KeyError as exc: - msg = f"Couldn't import {exc} from {resource_location!r}." + msg = f'Couldn\'t import {exc} from "{resource_location}".' raise ImportError(msg) from None return values[0] if len(values) == 1 else values @@ -441,7 +441,7 @@ def module_root(self, node: AstModuleRoot, result: List[str]): command = node.commands[0] name = command.identifier.partition(":")[0] raise set_location( - Diagnostic("warn", f"Standalone {name!r} command in module."), + Diagnostic("warn", f'Standalone "{name}" command in module.'), command, command.arguments[0] if command.arguments else command, ) From 1ffafe32d141c7158758ee5c099e6518441a02fb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 24 Jun 2022 19:12:57 +0200 Subject: [PATCH 0913/1554] feat: add compiled module execution hooks --- packages/bolt/bolt/runtime.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 2766530e6..96791db67 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -87,6 +87,8 @@ class CompiledModule: globals: Set[str] namespace: JsonDict = field(default_factory=dict) executing: bool = False + executed: bool = False + execution_hooks: List[Callable[[], Any]] = field(default_factory=list) class Runtime: @@ -243,6 +245,11 @@ def get_module( def get_output(self, module: CompiledModule) -> AstRoot: """Run the module and return the output ast.""" + if not module.executed: + module.executed = True + for hook in module.execution_hooks: + hook() + if not module.code or not module.output: return module.ast if module.output in module.namespace: From bd6e3dfc869a86f4533f725fed88b2c17b4266ec Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 24 Jun 2022 19:20:30 +0200 Subject: [PATCH 0914/1554] feat: add bolt.contrib.lazy --- packages/bolt/bolt/contrib/lazy.py | 77 +++++++++++++++++++ packages/bolt/examples/bolt_lazy/beet.yml | 10 +++ .../bolt_lazy/src/data/demo/modules/foo.bolt | 1 + .../src/data/demo/modules/hello1.lazy.bolt | 2 + .../src/data/demo/modules/hello2.lazy.bolt | 2 + .../examples__build_bolt_lazy__0.pack.md | 22 ++++++ 6 files changed, 114 insertions(+) create mode 100644 packages/bolt/bolt/contrib/lazy.py create mode 100644 packages/bolt/examples/bolt_lazy/beet.yml create mode 100644 packages/bolt/examples/bolt_lazy/src/data/demo/modules/foo.bolt create mode 100644 packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello1.lazy.bolt create mode 100644 packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello2.lazy.bolt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md diff --git a/packages/bolt/bolt/contrib/lazy.py b/packages/bolt/bolt/contrib/lazy.py new file mode 100644 index 000000000..675a47e3a --- /dev/null +++ b/packages/bolt/bolt/contrib/lazy.py @@ -0,0 +1,77 @@ +"""Plugin for importing bolt modules lazily.""" + + +__all__ = [ + "LazyFilter", + "BoltLazyOptions", + "bolt_lazy", +] + + +from dataclasses import dataclass +from functools import partial +from typing import Any + +from beet import Context, ListOption, TextFileBase, configurable +from beet.core.utils import required_field +from mecha import CompilationDatabase, Mecha, Visitor, rule +from pathspec import PathSpec +from pydantic import BaseModel + +from bolt import AstModuleRoot, Runtime + + +class BoltLazyOptions(BaseModel): + match: ListOption[str] = ListOption() + + +def beet_default(ctx: Context): + ctx.require(bolt_lazy) + + +@configurable(validator=BoltLazyOptions) +def bolt_lazy(ctx: Context, opts: BoltLazyOptions): + """Plugin for importing bolt modules lazily.""" + mc = ctx.inject(Mecha) + runtime = ctx.inject(Runtime) + + mc.steps.insert( + mc.steps.index(runtime.evaluate), + LazyFilter( + runtime=runtime, + database=mc.database, + path_spec=PathSpec.from_lines("gitwildmatch", opts.match.entries()), + ), + ) + + +@dataclass +class LazyFilter(Visitor): + """Visitor that filters lazy modules from the compilation by matching resource location.""" + + runtime: Runtime = required_field() + database: CompilationDatabase = required_field() + path_spec: PathSpec = required_field() + + @rule(AstModuleRoot) + def lazy_module(self, node: AstModuleRoot): + module = self.runtime.get_module(node) + path = module.resource_location + + if path and self.path_spec.match_file(path): + module.execution_hooks.append( + partial( + self.restore_lazy, + self.database.current, + node, + self.database.step + 1, + ) + ) + return None + + return node + + def restore_lazy(self, key: TextFileBase[Any], node: AstModuleRoot, step: int): + compilation_unit = self.database[key] + compilation_unit.ast = node + self.database.enqueue(key, step) diff --git a/packages/bolt/examples/bolt_lazy/beet.yml b/packages/bolt/examples/bolt_lazy/beet.yml new file mode 100644 index 000000000..81be69ebb --- /dev/null +++ b/packages/bolt/examples/bolt_lazy/beet.yml @@ -0,0 +1,10 @@ +require: + - bolt + - bolt.contrib.lazy +data_pack: + load: "src" +pipeline: + - mecha +meta: + bolt_lazy: + match: "*.lazy" diff --git a/packages/bolt/examples/bolt_lazy/src/data/demo/modules/foo.bolt b/packages/bolt/examples/bolt_lazy/src/data/demo/modules/foo.bolt new file mode 100644 index 000000000..905f2167f --- /dev/null +++ b/packages/bolt/examples/bolt_lazy/src/data/demo/modules/foo.bolt @@ -0,0 +1 @@ +import ./hello1.lazy as _ diff --git a/packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello1.lazy.bolt b/packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello1.lazy.bolt new file mode 100644 index 000000000..74ee6a307 --- /dev/null +++ b/packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello1.lazy.bolt @@ -0,0 +1,2 @@ +function ./hello1: + say hello1 diff --git a/packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello2.lazy.bolt b/packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello2.lazy.bolt new file mode 100644 index 000000000..babb9d474 --- /dev/null +++ b/packages/bolt/examples/bolt_lazy/src/data/demo/modules/hello2.lazy.bolt @@ -0,0 +1,2 @@ +function ./hello2: + say hello2 diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md new file mode 100644 index 000000000..e2010c0a2 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:hello1` + +```mcfunction +say hello1 +``` From 54be55f29648df3cc1a8abea0797b143b7a7a0e3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 24 Jun 2022 17:21:54 +0000 Subject: [PATCH 0915/1554] 0.9.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 8 ++++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 877e9795d..7d40be330 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.9.0 (2022-06-24) +### Feature +* Add bolt.contrib.lazy ([`c9f12f3`](https://github.com/mcbeet/bolt/commit/c9f12f360c70ca031acfe5f9b2f0213bc7c3fdff)) +* Add compiled module execution hooks ([`0a91936`](https://github.com/mcbeet/bolt/commit/0a91936a8172ad7b2b246c38b931cac8da6a27d2)) + +### Fix +* Minor visual changes ([`0ab3519`](https://github.com/mcbeet/bolt/commit/0ab35197e9d8f8532c39faf4b2a03caa938077bc)) + ## v0.8.2 (2022-06-24) ### Fix * Remove leftover extern plugin ([`42cc659`](https://github.com/mcbeet/bolt/commit/42cc6590bfef34cc4573ed8d2fe8404cf26c9f34)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 61389ab46..6d50f2d4a 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.2" +__version__ = "0.9.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 551e7c78c..88cef7e3e 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.8.2" +version = "0.9.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From d27f7208ead636c697aaaac2edcccbc4ddaa14ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 13:32:31 +0000 Subject: [PATCH 0916/1554] chore(deps-dev): bump black from 22.3.0 to 22.6.0 Bumps [black](https://github.com/psf/black) from 22.3.0 to 22.6.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.3.0...22.6.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 52 +++++++++++++++++------------------ packages/mecha/pyproject.toml | 2 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 97809b81a..89de4d6cc 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -44,7 +44,7 @@ image = ["pillow"] [[package]] name = "black" -version = "22.3.0" +version = "22.6.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -55,7 +55,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -813,7 +813,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "acce0738de22ed8569b757afa9eee6ba9c2b6cf0d506cfa59cb0137afaddcc71" +content-hash = "0980036e7f466ce6cea3ad2a2231bdae74bb94d6f52d4dd9f547d52370c38b4a" [metadata.files] atomicwrites = [ @@ -829,29 +829,29 @@ beet = [ {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, ] black = [ - {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, - {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, - {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, - {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, - {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, - {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, - {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, - {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, - {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, - {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, - {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, - {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, - {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, - {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, - {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, - {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, - {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, - {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, - {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, + {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, + {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, + {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, + {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, + {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, + {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, + {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, + {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, + {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, + {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, + {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, + {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, + {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, + {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, + {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, + {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, + {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, ] bleach = [ {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 597f9f22c..4228f47a7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.68.2" tokenstream = "1.4.2" [tool.poetry.dev-dependencies] -black = "^22.3.0" +black = "^22.6.0" pytest = "^7.1.2" isort = "^5.10.1" python-semantic-release = "^7.28.1" From c393b2919e49cfb29fb3e696ffcb636b9b95a283 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 12:39:17 +0000 Subject: [PATCH 0917/1554] chore(deps-dev): bump pyright from 1.1.255 to 1.1.256 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.255 to 1.1.256. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.256/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 383d3c72e..efc416dcc 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.255" + "pyright": "^1.1.256" } }, "node_modules/pyright": { - "version": "1.1.255", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.255.tgz", - "integrity": "sha512-pAec1Mqyq0l0+C6JH7o7Va0oWyZVACEFgP2cWD9DU/C1epoqZAt/PCRbae/7fFfn7ZGew5tiTMdtO/2RZO/cRg==", + "version": "1.1.256", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.256.tgz", + "integrity": "sha512-5IVvr8BHFTORT+rvGBQVdXWwQRQdx30aM+cw6wY37tan7cXnkgcfufhKOCPQ8P+88QO8cdgK6gwTYfM4u6umdg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.255", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.255.tgz", - "integrity": "sha512-pAec1Mqyq0l0+C6JH7o7Va0oWyZVACEFgP2cWD9DU/C1epoqZAt/PCRbae/7fFfn7ZGew5tiTMdtO/2RZO/cRg==", + "version": "1.1.256", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.256.tgz", + "integrity": "sha512-5IVvr8BHFTORT+rvGBQVdXWwQRQdx30aM+cw6wY37tan7cXnkgcfufhKOCPQ8P+88QO8cdgK6gwTYfM4u6umdg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 6e3926552..3925ac0f8 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.255" + "pyright": "^1.1.256" } } From b40e1e740cbcc82825334dd7c5aaa11b0f0159e3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 2 Jul 2022 17:35:32 +0200 Subject: [PATCH 0918/1554] fix: allow ast node interpolation directly --- packages/bolt/bolt/helpers.py | 8 ++++++++ .../bolt_basic/src/data/demo/functions/foo.mcfunction | 1 + .../tests/snapshots/examples__build_bolt_basic__0.pack.md | 1 + 3 files changed, 10 insertions(+) diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 026bc8d7d..fe0bcb8ce 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -186,6 +186,8 @@ def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: @internal @wraps(f) def wrapper(obj: Any, node: AstNode) -> AstNode: + if isinstance(obj, AstNode): + return set_location(obj, node) return set_location(f(obj), node) return wrapper @@ -199,6 +201,8 @@ class JsonObjectConverter: @internal def __call__(self, obj: Any, node: AstNode) -> AstNode: + if isinstance(obj, AstNode): + return set_location(obj, node) if isinstance(node := self.json_converter(obj, node), AstJsonObject): return node raise ValueError(f"Invalid json object of type {type(obj)!r}.") @@ -212,6 +216,8 @@ class NbtCompoundConverter: @internal def __call__(self, obj: Any, node: AstNode) -> AstNode: + if isinstance(obj, AstNode): + return set_location(obj, node) if isinstance(node := self.nbt_converter(obj, node), AstNbtCompound): return node raise ValueError(f"Invalid nbt compound of type {type(obj)!r}.") @@ -226,6 +232,8 @@ class EntityConverter: @internal def __call__(self, obj: Any, node: AstNode) -> AstNode: + if isinstance(obj, AstNode): + return set_location(obj, node) if isinstance(obj, str): if obj.count("-") == 4: return self.uuid_converter(obj, node) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index a59c6147c..6de38715d 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -650,4 +650,5 @@ runtime = ctx.inject(Runtime) with runtime.scope() as commands: tellraw @p "hello" +say repr(commands[0]) say commands[0] diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 5b507bf12..8e7585c38 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -267,6 +267,7 @@ say dummy say dummy say dummy say AstCommand(identifier='tellraw:targets:message', arguments=AstChildren((AstSelector(variable='p', arguments=AstChildren(())), AstJsonValue(value='hello')))) +say tellraw @p "hello" ``` `@function demo:import_a` From 044afa58d5f043134bde8c82325356be091e4829 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 2 Jul 2022 16:09:53 +0000 Subject: [PATCH 0919/1554] 0.9.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 7d40be330..5dbe067b8 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.9.1 (2022-07-02) +### Fix +* Allow ast node interpolation directly ([`ffa076e`](https://github.com/mcbeet/bolt/commit/ffa076efa635be32c735371e2761da954385abbf)) + ## v0.9.0 (2022-06-24) ### Feature * Add bolt.contrib.lazy ([`c9f12f3`](https://github.com/mcbeet/bolt/commit/c9f12f360c70ca031acfe5f9b2f0213bc7c3fdff)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 6d50f2d4a..d7d68a0e5 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.9.0" +__version__ = "0.9.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 88cef7e3e..831e67cfd 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.9.0" +version = "0.9.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From b208c6fc4f8dfd19c7d1b60892ad4da71976e6c3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 7 Jul 2022 20:36:45 +0200 Subject: [PATCH 0920/1554] fix: don't hardcode some hookable parsers --- packages/mecha/mecha/parse.py | 198 ++++++++++++------ ...nt_examples_minecraft_component_1_0__0.txt | 2 +- ...nt_examples_minecraft_component_1_1__0.txt | 2 +- 3 files changed, 140 insertions(+), 62 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index ab6e9e638..3b1d1af5f 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -23,9 +23,11 @@ "parse_string_argument", "Vector2Parser", "Vector3Parser", - "JsonParser", "TypeConstraint", + "JsonParser", + "JsonObjectParser", "NbtParser", + "NbtCompoundParser", "AdjacentConstraint", "ResourceLocationParser", "NoTagConstraint", @@ -168,7 +170,14 @@ def get_default_parsers() -> Dict[str, Parser]: """Return the default parsers.""" json_parser = JsonParser() + json_parser.object_entry_parser = delegate("json_object_entry") + json_parser.array_element_parser = delegate("json_array_element") + json_parser.recursive_parser = delegate("json") + nbt_parser = NbtParser() + nbt_parser.compound_entry_parser = delegate("nbt_compound_entry") + nbt_parser.list_or_array_element_parser = delegate("nbt_list_or_array_element") + nbt_parser.recursive_parser = delegate("nbt") return { ################################################################################ @@ -186,24 +195,16 @@ def get_default_parsers() -> Dict[str, Parser]: "json": json_parser, "json_object_entry": json_parser.parse_object_entry, "json_array_element": delegate("json"), - "json_object": TypeConstraint( - parser=delegate("json"), - type=AstJsonObject, - message="Expected json object.", - ), + "json_object": JsonObjectParser(delegate("json")), "nbt": nbt_parser, "nbt_compound_entry": nbt_parser.parse_compound_entry, "nbt_list_or_array_element": delegate("nbt"), - "nbt_compound": TypeConstraint( - parser=delegate("nbt"), - type=AstNbtCompound, - message="Expected nbt compound.", + "nbt_compound": NbtCompoundParser(delegate("nbt")), + "adjacent_nbt_compound": AdjacentConstraint(delegate("nbt_compound"), r"\{"), + "nbt_path": NbtPathParser( + integer_parser=delegate("integer"), + nbt_compound_parser=delegate("nbt_compound"), ), - "adjacent_nbt_compound": AdjacentConstraint( - parser=delegate("nbt_compound"), - hint=r"\{", - ), - "nbt_path": NbtPathParser(), "range": RangeParser(), "integer_range": IntegerRangeConstraint(delegate("range")), "resource_location_or_tag": CommentDisambiguation(ResourceLocationParser()), @@ -227,26 +228,36 @@ def get_default_parsers() -> Dict[str, Parser]: resource_location_parser=delegate("resource_location_or_tag"), block_states_parser=AdjacentConstraint( parser=MultilineParser( - BlockStatesParser(key_parser=StringParser(type="phrase")) + BlockStatesParser( + key_parser=StringParser(type="phrase"), + value_parser=delegate("phrase"), + ) ), hint=r"\[", ), + data_tags_parser=delegate("adjacent_nbt_compound"), ), "block_state": BlockParser( resource_location_parser=delegate("resource_location"), block_states_parser=AdjacentConstraint( parser=MultilineParser( - BlockStatesParser(key_parser=StringParser(type="phrase")) + BlockStatesParser( + key_parser=StringParser(type="phrase"), + value_parser=delegate("phrase"), + ) ), hint=r"\[", ), + data_tags_parser=delegate("adjacent_nbt_compound"), ), "item_predicate": ItemParser( resource_location_parser=delegate("resource_location_or_tag"), + data_tags_parser=delegate("adjacent_nbt_compound"), ), "item_slot": BasicLiteralParser(AstItemSlot), "item_stack": ItemParser( resource_location_parser=delegate("resource_location"), + data_tags_parser=delegate("adjacent_nbt_compound"), ), "message": parse_message, "block_pos": Vector3Parser(coordinate_parser=delegate("coordinate")), @@ -875,37 +886,75 @@ def __call__(self, stream: TokenStream) -> AstVector3: return set_location(node, x, z) +@dataclass +class TypeConstraint: + """Constraint that only allows specific instances.""" + + parser: Parser + type: Union[Type[Any], Tuple[Type[Any], ...]] + message: str + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + + if not isinstance(node, self.type): + raise node.emit_error(InvalidSyntax(self.message)) + + return node + + @dataclass class JsonParser: """Parser for json values.""" + curly_pattern: str = r"\{|\}" + bracket_pattern: str = r"\[|\]" + string_pattern: str = r'"(?:\\.|[^\\\n])*?"' + number_pattern: str = r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" + colon_pattern: str = r":" + comma_pattern: str = r"," + null_pattern: str = r"\bnull\b" + true_pattern: str = r"\btrue\b" + false_pattern: str = r"\bfalse\b" + + object_entry_parser: Parser = field(init=False) + array_element_parser: Parser = field(init=False) + recursive_parser: Parser = field(init=False) + quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) + def __post_init__(self): + self.object_entry_parser = self.parse_object_entry + self.array_element_parser = self + self.recursive_parser = self + def __call__(self, stream: TokenStream) -> AstJson: with stream.syntax( - curly=r"\{|\}", - bracket=r"\[|\]", - string=r'"(?:\\.|[^\\\n])*?"', - number=r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b", - colon=r":", - comma=r",", - literal=r"\w+", + curly=self.curly_pattern, + bracket=self.bracket_pattern, + string=self.string_pattern, + number=self.number_pattern, + colon=self.colon_pattern, + comma=self.comma_pattern, + null=self.null_pattern, + true=self.true_pattern, + false=self.false_pattern, ): curly, bracket, string, number, null, true, false = stream.expect( ("curly", "{"), ("bracket", "["), "string", "number", - ("literal", "null"), - ("literal", "true"), - ("literal", "false"), + "null", + "true", + "false", ) if curly: entries: List[AstJsonObjectEntry] = [] for _ in stream.peek_until(("curly", "}")): - entries.append(delegate("json_object_entry", stream)) + entries.append(self.object_entry_parser(stream)) if not stream.get("comma"): stream.expect(("curly", "}")) @@ -918,7 +967,7 @@ def __call__(self, stream: TokenStream) -> AstJson: elements: List[AstJson] = [] for _ in stream.peek_until(("bracket", "]")): - elements.append(delegate("json_array_element", stream)) + elements.append(self.array_element_parser(stream)) if not stream.get("comma"): stream.expect(("bracket", "]")) @@ -949,33 +998,38 @@ def parse_object_entry(self, stream: TokenStream) -> AstJsonObjectEntry: stream.expect("colon") - value_node = delegate("json", stream) + value_node = self.recursive_parser(stream) entry_node = AstJsonObjectEntry(key=key_node, value=value_node) return set_location(entry_node, key_node, value_node) @dataclass -class TypeConstraint: - """Constraint that only allows specific instances.""" - - parser: Parser - type: Union[Type[Any], Tuple[Type[Any], ...]] - message: str +class JsonObjectParser(TypeConstraint): + """Parser for json objects.""" - def __call__(self, stream: TokenStream) -> Any: - node = self.parser(stream) - - if not isinstance(node, self.type): - raise node.emit_error(InvalidSyntax(self.message)) - - return node + parser: Parser = field(default_factory=JsonParser) + type: Type[AstJsonObject] = AstJsonObject + message: str = "Expected json object." @dataclass class NbtParser: """Parser for nbt tags.""" + array_pattern: str = r"\[[BIL];" + curly_pattern: str = r"\{|\}" + bracket_pattern: str = r"\[|\]" + quoted_string_pattern: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" + number_pattern: str = r"[+-]?(?:[0-9]*?\.[0-9]+|[0-9]+\.[0-9]*?|[1-9][0-9]*|0)(?:[eE][+-]?[0-9]+)?[bslfdBSLFD]?\b" + string_pattern: str = r"[a-zA-Z0-9._+-]+" + colon_pattern: str = r":" + comma_pattern: str = r"," + + compound_entry_parser: Parser = field(init=False) + list_or_array_element_parser: Parser = field(init=False) + recursive_parser: Parser = field(init=False) + number_suffixes: Dict[str, Type[Any]] = field( default_factory=lambda: { # type: ignore "b": Byte, @@ -1001,16 +1055,21 @@ class NbtParser: ) ) + def __post_init__(self): + self.compound_entry_parser = self.parse_compound_entry + self.list_or_array_element_parser = self + self.recursive_parser = self + def __call__(self, stream: TokenStream) -> AstNbt: with stream.syntax( - array=r"\[[BIL];", - curly=r"\{|\}", - bracket=r"\[|\]", - quoted_string=r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'", - number=r"[+-]?(?:[0-9]*?\.[0-9]+|[0-9]+\.[0-9]*?|[1-9][0-9]*|0)(?:[eE][+-]?[0-9]+)?[bslfdBSLFD]?\b", - string=r"[a-zA-Z0-9._+-]+", - colon=r":", - comma=r",", + array=self.array_pattern, + curly=self.curly_pattern, + bracket=self.bracket_pattern, + quoted_string=self.quoted_string_pattern, + number=self.number_pattern, + string=self.string_pattern, + colon=self.colon_pattern, + comma=self.comma_pattern, ): curly, bracket, array, number, string, quoted_string = stream.expect( ("curly", "{"), @@ -1025,7 +1084,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: entries: List[AstNbtCompoundEntry] = [] for _ in stream.peek_until(("curly", "}")): - entries.append(delegate("nbt_compound_entry", stream)) + entries.append(self.compound_entry_parser(stream)) if not stream.get("comma"): stream.expect(("curly", "}")) @@ -1038,7 +1097,7 @@ def __call__(self, stream: TokenStream) -> AstNbt: elements: List[AstNbt] = [] for _ in stream.peek_until(("bracket", "]")): - elements.append(delegate("nbt_list_or_array_element", stream)) + elements.append(self.list_or_array_element_parser(stream)) if not stream.get("comma"): stream.expect(("bracket", "]")) @@ -1115,12 +1174,21 @@ def parse_compound_entry(self, stream: TokenStream) -> AstNbtCompoundEntry: stream.expect("colon") - value_node = delegate("nbt", stream) + value_node = self.recursive_parser(stream) entry_node = AstNbtCompoundEntry(key=key_node, value=value_node) return set_location(entry_node, key_node, value_node) +@dataclass +class NbtCompoundParser(TypeConstraint): + """Parser for nbt compounds.""" + + parser: Parser = field(default_factory=NbtParser) + type: Type[AstNbtCompound] = AstNbtCompound + message: str = "Expected nbt compound." + + @dataclass class AdjacentConstraint: """Constraint that ensures that there are no whitespace separators.""" @@ -1214,6 +1282,7 @@ class BlockParser: resource_location_parser: Parser block_states_parser: Parser + data_tags_parser: Parser def __call__(self, stream: TokenStream) -> AstBlock: identifier = self.resource_location_parser(stream) @@ -1226,7 +1295,7 @@ def __call__(self, stream: TokenStream) -> AstBlock: else: block_states = AstChildren[AstBlockState]() - data_tags = delegate("adjacent_nbt_compound", stream) + data_tags = self.data_tags_parser(stream) node = AstBlock( identifier=identifier, @@ -1241,6 +1310,7 @@ class BlockStatesParser: """Parser for minecraft block state.""" key_parser: Parser + value_parser: Parser def __call__(self, stream: TokenStream) -> AstChildren[AstBlockState]: block_states: List[AstBlockState] = [] @@ -1255,7 +1325,7 @@ def __call__(self, stream: TokenStream) -> AstChildren[AstBlockState]: for _ in stream.peek_until(("bracket", "]")): key_node = self.key_parser(stream) stream.expect("equal") - value_node = delegate("phrase", stream) + value_node = self.value_parser(stream) entry_node = AstBlockState(key=key_node, value=value_node) entry_node = set_location(entry_node, key_node, value_node) @@ -1273,13 +1343,14 @@ class ItemParser: """Parser for minecraft items.""" resource_location_parser: Parser + data_tags_parser: Parser def __call__(self, stream: TokenStream) -> AstItem: identifier = self.resource_location_parser(stream) location = identifier.location end_location = identifier.end_location - data_tags = delegate("adjacent_nbt_compound", stream) + data_tags = self.data_tags_parser(stream) node = AstItem(identifier=identifier, data_tags=data_tags) return set_location(node, location, data_tags if data_tags else end_location) @@ -1733,6 +1804,13 @@ def parse_message(stream: TokenStream) -> AstMessage: @dataclass class NbtPathParser: + """Parser for nbt paths.""" + + integer_parser: Parser = field( + default_factory=lambda: IntegerConstraint(NumericParser()) + ) + nbt_compound_parser: Parser = field(default_factory=NbtCompoundParser) + quote_helper: QuoteHelper = field( default_factory=lambda: QuoteHelper( escape_sequences={ @@ -1778,7 +1856,7 @@ def parse_modifiers(self, stream: TokenStream) -> Iterator[Any]: hint = stream.peek() if hint and hint.match(("curly", "{")): - yield delegate("nbt_compound", stream) + yield self.nbt_compound_parser(stream) return while bracket := stream.get(("bracket", "[")): @@ -1786,9 +1864,9 @@ def parse_modifiers(self, stream: TokenStream) -> Iterator[Any]: hint = stream.peek() if hint and hint.match(("curly", "{")): - index = delegate("nbt_compound", stream) + index = self.nbt_compound_parser(stream) elif hint and not hint.match(("bracket", "]")): - index = delegate("integer", stream) + index = self.integer_parser(stream) close_bracket = stream.expect(("bracket", "]")) diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt index 656eec621..63b5ebf34 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_0__0.txt @@ -6,4 +6,4 @@ wat --- Reported 1 error. -line 1, column 1: Expected bracket '[', curly '{', literal 'false', literal 'null', literal 'true', number or string but got literal 'wat'. \ No newline at end of file +line 1, column 1: Expected bracket '[', curly '{', false, null, number, string or true but got literal 'wat'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt index 83ac916d4..147029b8c 100644 --- a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_component_1_1__0.txt @@ -6,4 +6,4 @@ minecraft:component 1 1 --- Reported 1 error. -line 1, column 9: Expected bracket '[', curly '{', literal 'false', literal 'null', literal 'true', number or string but got bracket ']'. \ No newline at end of file +line 1, column 9: Expected bracket '[', curly '{', false, null, number, string or true but got bracket ']'. \ No newline at end of file From dfa18febe80e077e1279efaf950b75ade4728995 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 7 Jul 2022 18:37:45 +0000 Subject: [PATCH 0921/1554] 0.54.4 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 017e261a3..55dc86ad9 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.4 (2022-07-07) +### Fix +* Don't hardcode some hookable parsers ([`c18f839`](https://github.com/mcbeet/mecha/commit/c18f83979bc7ce0fbf396bcfe36fd81a5758be6d)) + ## v0.54.3 (2022-06-21) ### Fix * Allow compilation step to return None to abort ([`8f3ce64`](https://github.com/mcbeet/mecha/commit/8f3ce64708607078736090370b166af215a48f5b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 828f2be6b..17c993a48 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.3" +__version__ = "0.54.4" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 4228f47a7..54e6d4bc6 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.3" +version = "0.54.4" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3dcb2ad8aa7c637c6211f00d37f600a6b1da1bc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Jul 2022 12:27:55 +0000 Subject: [PATCH 0922/1554] chore(deps-dev): bump pyright from 1.1.256 to 1.1.257 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.256 to 1.1.257. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.257/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index efc416dcc..67573b55f 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.256" + "pyright": "^1.1.257" } }, "node_modules/pyright": { - "version": "1.1.256", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.256.tgz", - "integrity": "sha512-5IVvr8BHFTORT+rvGBQVdXWwQRQdx30aM+cw6wY37tan7cXnkgcfufhKOCPQ8P+88QO8cdgK6gwTYfM4u6umdg==", + "version": "1.1.257", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", + "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.256", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.256.tgz", - "integrity": "sha512-5IVvr8BHFTORT+rvGBQVdXWwQRQdx30aM+cw6wY37tan7cXnkgcfufhKOCPQ8P+88QO8cdgK6gwTYfM4u6umdg==", + "version": "1.1.257", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", + "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 3925ac0f8..e9a65459f 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.256" + "pyright": "^1.1.257" } } From d48271e2cabd67e8266f60acd793791611ef3c9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Jul 2022 04:56:00 +0000 Subject: [PATCH 0923/1554] build(deps-dev): bump pyright from 1.1.254 to 1.1.257 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.254 to 1.1.257. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.257/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 0703d5c20..8a87dc766 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.254" + "pyright": "^1.1.257" } }, "node_modules/pyright": { - "version": "1.1.254", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", - "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", + "version": "1.1.257", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", + "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.254", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", - "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", + "version": "1.1.257", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", + "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index ce423b29d..e9a65459f 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.254" + "pyright": "^1.1.257" } } From 5da46c2c7a78a64ffdfbe6667f7181f018762474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Jul 2022 04:57:27 +0000 Subject: [PATCH 0924/1554] build(deps-dev): bump black from 22.3.0 to 22.6.0 Bumps [black](https://github.com/psf/black) from 22.3.0 to 22.6.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.3.0...22.6.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/bolt/poetry.lock | 52 ++++++++++++++++++------------------ packages/bolt/pyproject.toml | 2 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 5b064a2b8..115d6b499 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -44,7 +44,7 @@ image = ["pillow"] [[package]] name = "black" -version = "22.3.0" +version = "22.6.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -55,7 +55,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "315f87451fb9ea3c24fcd67e4eae0f61e0673e627d85e4382b0ae32ec92be9f0" +content-hash = "d8d90c11afa1b306e69a02ca7ebed8d0a44c3e0bf7a930f97943c01aa19116ff" [metadata.files] atomicwrites = [ @@ -841,29 +841,29 @@ beet = [ {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, ] black = [ - {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, - {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, - {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, - {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, - {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, - {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, - {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, - {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, - {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, - {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, - {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, - {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, - {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, - {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, - {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, - {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, - {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, - {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, - {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, + {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, + {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, + {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, + {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, + {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, + {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, + {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, + {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, + {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, + {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, + {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, + {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, + {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, + {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, + {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, + {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, + {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, ] bleach = [ {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 831e67cfd..6d8c303ca 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -28,7 +28,7 @@ mecha = ">=0.54.3" [tool.poetry.dev-dependencies] pytest = "^7.1.2" -black = "^22.3.0" +black = "^22.6.0" isort = "^5.10.1" python-semantic-release = "^7.28.1" pytest-insta = "^0.1.11" From dab962a7cbb216fcb48ac4ecd984bbb0a66f36bf Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 8 Jul 2022 00:51:24 +0200 Subject: [PATCH 0925/1554] fix: missing executable check --- packages/mecha/mecha/parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 3b1d1af5f..3ce861973 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -623,7 +623,7 @@ def parse_command(stream: TokenStream) -> AstCommand: literal = None argument = None - if tree is child: + if tree is child and tree.executable: if stream.peek(): stream.expect("newline", "eof") reached_terminal = True From daba7900102f26f1c992ae5a07c493dc4f5f2ae9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 7 Jul 2022 22:52:14 +0000 Subject: [PATCH 0926/1554] 0.54.5 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 55dc86ad9..93cbf4472 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.5 (2022-07-07) +### Fix +* Missing executable check ([`d646789`](https://github.com/mcbeet/mecha/commit/d6467890aa8ee42d413d3c411309a4f255eb8a89)) + ## v0.54.4 (2022-07-07) ### Fix * Don't hardcode some hookable parsers ([`c18f839`](https://github.com/mcbeet/mecha/commit/c18f83979bc7ce0fbf396bcfe36fd81a5758be6d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 17c993a48..6a4334fdf 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.4" +__version__ = "0.54.5" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 54e6d4bc6..6f108eee1 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.4" +version = "0.54.5" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 25102d3e72cf92bb926f96938e5c63c1567cca0e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 7 Jul 2022 20:43:42 +0200 Subject: [PATCH 0927/1554] fix: update mecha --- packages/bolt/poetry.lock | 137 +++--------------- packages/bolt/pyproject.toml | 2 +- .../tests/snapshots/bolt__parse_180__0.txt | 2 +- 3 files changed, 24 insertions(+), 117 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 115d6b499..d9fc6353d 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.54.3" +version = "0.54.5" description = "A powerful Minecraft command library" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d8d90c11afa1b306e69a02ca7ebed8d0a44c3e0bf7a930f97943c01aa19116ff" +content-hash = "b6436d351c1a196182a0d422aea232775d367ae33d8ca1404bde0d14baff178e" [metadata.files] atomicwrites = [ @@ -865,10 +865,7 @@ black = [ {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, ] -bleach = [ - {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, - {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, -] +bleach = [] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, @@ -925,22 +922,13 @@ cffi = [ {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] +charset-normalizer = [] +click = [] click-help-colors = [ {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, ] -click-log = [ - {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, - {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, -] +click-log = [] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, @@ -969,10 +957,7 @@ cryptography = [ {file = "cryptography-37.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:315af6268de72bcfa0bb3401350ce7d921f216e6b60de12a363dad128d9d459f"}, {file = "cryptography-37.0.1.tar.gz", hash = "sha256:d610d0ee14dd9109006215c7c0de15eee91230b70a9bce2263461cf7c3720b83"}, ] -docutils = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, -] +docutils = [] dotty-dict = [ {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, ] @@ -980,10 +965,7 @@ gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -gitpython = [ - {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, -] +gitpython = [] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, @@ -1070,10 +1052,7 @@ mdurl = [ {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] -mecha = [ - {file = "mecha-0.54.3-py3-none-any.whl", hash = "sha256:2aacfa8252229cc1f8377587aea2d3c4e85c6ff8497e159ed4a30901d27e8443"}, - {file = "mecha-0.54.3.tar.gz", hash = "sha256:7a78cdd3427f1240ee1fa7f905db4096d283dbe3f557641b5cc0b9b4a307ef27"}, -] +mecha = [] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, @@ -1104,71 +1083,20 @@ numpy = [ {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, ] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] +packaging = [] +pathspec = [] pkginfo = [ {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, ] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] +platformdirs = [] +pluggy = [] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, -] +pycparser = [] +pydantic = [] pygments = [ {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, @@ -1232,18 +1160,9 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -readme-renderer = [ - {file = "readme_renderer-35.0-py3-none-any.whl", hash = "sha256:73b84905d091c31f36e50b4ae05ae2acead661f6a09a9abb4df7d2ddcdb6a698"}, - {file = "readme_renderer-35.0.tar.gz", hash = "sha256:a727999acfc222fc21d82a12ed48c957c4989785e5865807c65a487d21677497"}, -] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] +readme-renderer = [] +requests = [] +requests-toolbelt = [] rfc3986 = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -1276,10 +1195,7 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] +tomli = [] tomlkit = [ {file = "tomlkit-0.10.2-py3-none-any.whl", hash = "sha256:905cf92c2111ef80d355708f47ac24ad1b6fc2adc5107455940088c9bbecaedb"}, {file = "tomlkit-0.10.2.tar.gz", hash = "sha256:30d54c0b914e595f3d10a87888599eab5321a2a69abc773bbefff51599b72db6"}, @@ -1288,18 +1204,12 @@ tqdm = [ {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, ] -twine = [ - {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, - {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, -] +twine = [] typing-extensions = [ {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, -] +urllib3 = [] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -1370,7 +1280,4 @@ wrapt = [ {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] +zipp = [] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 6d8c303ca..c6fe2bd59 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.68.2" -mecha = ">=0.54.3" +mecha = ">=0.54.5" [tool.poetry.dev-dependencies] pytest = "^7.1.2" diff --git a/packages/bolt/tests/snapshots/bolt__parse_180__0.txt b/packages/bolt/tests/snapshots/bolt__parse_180__0.txt index 1e000a776..2c6cf7759 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_180__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_180__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', identifier, literal 'false', literal 'null', literal 'true', number or string but reached end of file. +#>ERROR Expected bracket '[', curly '{', false, identifier, null, number, string or true but reached end of file. # line 1, column 34 # 1 | merge function_tag minecraft:tick merge function_tag minecraft:tick From 3be86cc898d81363140f0f3feaca6ec5864d0060 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 8 Jul 2022 01:25:47 +0200 Subject: [PATCH 0928/1554] feat: start working on macro --- packages/bolt/bolt/ast.py | 60 ++++- packages/bolt/bolt/parse.py | 212 +++++++++++++----- packages/bolt/bolt/pattern.py | 25 +++ packages/bolt/bolt/resources/commands.json | 23 +- .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_74__0.txt | 2 +- .../tests/snapshots/spec__prototypes__0.json | 3 + 7 files changed, 265 insertions(+), 62 deletions(-) create mode 100644 packages/bolt/bolt/pattern.py diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 529c0950c..0c935e417 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -25,19 +25,34 @@ "AstDecorator", "AstFunctionSignature", "AstFunctionSignatureArgument", - "AstFunctionRoot", + "AstDeferredRoot", + "AstMacroLiteral", + "AstMacroArgument", + "AstMacroMatch", + "AstMacroMatchLiteral", + "AstMacroMatchArgument", "AstInterpolation", "AstImportedIdentifier", ] +import re from dataclasses import dataclass from typing import Any, Optional, Union from beet.core.utils import required_field -from mecha import AstChildren, AstNode, AstRoot +from mecha import ( + AstChildren, + AstJson, + AstLiteral, + AstNode, + AstResourceLocation, + AstRoot, +) from tokenstream import TokenStream +from .pattern import IDENTIFIER_PATTERN + @dataclass(frozen=True) class AstModuleRoot(AstRoot): @@ -238,12 +253,49 @@ class AstFunctionSignature(AstNode): @dataclass(frozen=True) -class AstFunctionRoot(AstNode): - """Ast function root node.""" +class AstDeferredRoot(AstNode): + """Ast deferred root node.""" stream: TokenStream = required_field() +@dataclass(frozen=True) +class AstMacroLiteral(AstLiteral): + """Ast macro literal node.""" + + parser = "bolt_macro_literal" + + +@dataclass(frozen=True) +class AstMacroArgument(AstLiteral): + """Ast macro argument node.""" + + parser = "bolt_macro_argument" + + regex = re.compile(IDENTIFIER_PATTERN) + + +@dataclass(frozen=True) +class AstMacroMatch(AstNode): + """Base node for macro match.""" + + +@dataclass(frozen=True) +class AstMacroMatchLiteral(AstMacroMatch): + """Ast macro match literal node.""" + + match: AstMacroLiteral = required_field() + + +@dataclass(frozen=True) +class AstMacroMatchArgument(AstMacroMatch): + """Ast macro match argument node.""" + + match_identifier: AstMacroArgument = required_field() + match_argument_parser: AstResourceLocation = required_field() + match_argument_properties: Optional[AstJson] = None + + @dataclass(frozen=True) class AstInterpolation(AstNode): """Ast interpolation node.""" diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 791be6097..b68adf8ca 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -4,20 +4,23 @@ "get_stream_pending_identifiers", "get_stream_identifiers_storage", "get_stream_pending_identifiers_storage", + "get_stream_deferred_locals", "get_stream_branch_scope", "UndefinedIdentifier", "create_bolt_root_parser", "BranchScopeManager", "check_final_expression", "InterpolationParser", + "DisableInterpolationParser", "parse_statement", "parse_decorator", "AssignmentTargetParser", "IfElseLoweringParser", "BreakContinueConstraint", "FlushPendingIdentifiersParser", + "parse_deferred_root", "parse_function_signature", - "parse_function_root", + "MacroMatchParser", "parse_del_target", "parse_identifier", "TrailingCommaParser", @@ -27,7 +30,7 @@ "parse_import_name", "GlobalNonlocalHandler", "parse_name_list", - "FunctionRootBacktracker", + "DeferredRootBacktracker", "FunctionConstraint", "BinaryParser", "UnaryParser", @@ -42,18 +45,19 @@ ] -import keyword import re from dataclasses import dataclass, field, replace from difflib import get_close_matches from typing import Any, Dict, List, Optional, Set, Tuple, cast from mecha import ( + AdjacentConstraint, AlternativeParser, AstChildren, AstCommand, AstResourceLocation, AstRoot, + BasicLiteralParser, CommentDisambiguation, CompilationDatabase, Parser, @@ -75,13 +79,13 @@ AstAttribute, AstCall, AstDecorator, + AstDeferredRoot, AstDict, AstDictItem, AstExpression, AstExpressionBinary, AstExpressionUnary, AstFormatString, - AstFunctionRoot, AstFunctionSignature, AstFunctionSignatureArgument, AstIdentifier, @@ -90,6 +94,11 @@ AstKeyword, AstList, AstLookup, + AstMacroArgument, + AstMacroLiteral, + AstMacroMatch, + AstMacroMatchArgument, + AstMacroMatchLiteral, AstSlice, AstTarget, AstTargetAttribute, @@ -100,17 +109,16 @@ AstUnpack, AstValue, ) - -KEYWORD_PATTERN: str = "|".join(rf"\b{kw}\b" for kw in keyword.kwlist) - -TRUE_PATTERN: str = r"\b[tT]rue\b" -FALSE_PATTERN: str = r"\b[fF]alse\b" -NULL_PATTERN: str = r"\b(?:null|None)\b" -IDENTIFIER_PATTERN: str = rf"(?!_bolt_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" -MODULE_PATTERN: str = rf"{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*" -STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" -NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" -RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" +from .pattern import ( + FALSE_PATTERN, + IDENTIFIER_PATTERN, + MODULE_PATTERN, + NULL_PATTERN, + NUMBER_PATTERN, + RESOURCE_LOCATION_PATTERN, + STRING_PATTERN, + TRUE_PATTERN, +) IMPORT_REGEX = re.compile(rf"^{MODULE_PATTERN}$") @@ -142,8 +150,10 @@ def get_bolt_parsers( "command:argument:bolt:global_name": delegate("bolt:global_name"), "command:argument:bolt:nonlocal_name": delegate("bolt:nonlocal_name"), "command:argument:bolt:expression": delegate("bolt:expression"), + "command:argument:bolt:deferred_root": delegate("bolt:deferred_root"), "command:argument:bolt:function_signature": delegate("bolt:function_signature"), - "command:argument:bolt:function_root": delegate("bolt:function_root"), + "command:argument:bolt:macro_name": delegate("bolt:macro_name"), + "command:argument:bolt:macro_match": delegate("bolt:macro_match"), "command:argument:bolt:del_target": delegate("bolt:del_target"), ################################################################################ # Bolt @@ -172,8 +182,23 @@ def get_bolt_parsers( allow_multiple=True, ), "bolt:augmented_assignment_target": AssignmentTargetParser(), + "bolt:deferred_root": parse_deferred_root, "bolt:function_signature": parse_function_signature, - "bolt:function_root": parse_function_root, + "bolt_macro_literal": delegate("bolt:macro_literal"), + "bolt:macro_literal": BasicLiteralParser(AstMacroLiteral), + "bolt_macro_argument": delegate("bolt:macro_argument"), + "bolt:macro_argument": BasicLiteralParser(AstMacroArgument), + "bolt:macro_name": delegate("bolt:macro_literal"), + "bolt:macro_match": MacroMatchParser( + literal_parser=delegate("bolt:macro_literal"), + argument_parser=delegate("bolt:macro_argument"), + resource_location_parser=DisableInterpolationParser( + delegate("resource_location") + ), + json_properties_parser=DisableInterpolationParser( + AdjacentConstraint(delegate("json_object"), r"\{") + ), + ), "bolt:del_target": parse_del_target, "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), "bolt:identifier": parse_identifier, @@ -374,6 +399,11 @@ def get_stream_pending_identifiers_storage(stream: TokenStream) -> Dict[str, str return stream.data.setdefault("pending_identifiers_storage", {}) +def get_stream_deferred_locals(stream: TokenStream) -> Set[str]: + """Return a set of identifiers that will be available in the next deferred root.""" + return stream.data.setdefault("deferred_locals", set()) + + def get_stream_branch_scope(stream: TokenStream) -> Set[str]: """Return the identifiers available inside the branch.""" return stream.data.setdefault("branch_scope", set()) @@ -410,7 +440,7 @@ def __str__(self) -> str: def create_bolt_root_parser(parser: Parser): """Return parser for the root node for bolt.""" return DecoratorResolver( - FunctionRootBacktracker( + DeferredRootBacktracker( FlushPendingIdentifiersParser( FunctionConstraint( BreakContinueConstraint( @@ -503,6 +533,8 @@ class InterpolationParser: final: bool = False def __call__(self, stream: TokenStream) -> Any: + if stream.data.get("disable_interpolation"): + return self.parser(stream) order = ["interpolation", "original"] if self.fallback: order.reverse() @@ -526,6 +558,17 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) +@dataclass +class DisableInterpolationParser: + """Parser that disables interpolation.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide(disable_interpolation=True): + return self.parser(stream) + + def parse_statement(stream: TokenStream) -> Any: """Parse statement.""" identifiers = get_stream_identifiers(stream) @@ -813,10 +856,41 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) +def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: + """Parse deferred root.""" + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + deferred_locals = get_stream_deferred_locals(stream) + + stream_copy = stream.copy() + + with stream.syntax(colon=r":"): + token = stream.expect("colon") + + with stream.syntax(statement=r"[^\s#].*"): + while consume_line_continuation(stream): + stream.expect("statement") + + stream_copy.data["identifiers"] = identifiers | pending_identifiers + stream_copy.data["pending_identifiers"] = set() + stream_copy.data["identifiers_storage"] = {loc: "local" for loc in deferred_locals} + stream_copy.data["pending_identifiers_storage"] = {} + stream_copy.data["deferred_locals"] = set() + stream_copy.data["branch_scope"] = set() + + pending_identifiers.clear() + deferred_locals.clear() + + node = AstDeferredRoot(stream=stream_copy) + return set_location(node, token, stream.current) + + def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: """Parse function signature.""" identifiers = get_stream_identifiers(stream) pending_identifiers = get_stream_pending_identifiers(stream) + deferred_locals = get_stream_deferred_locals(stream) + scoped_identifiers = set(identifiers) arguments: List[AstFunctionSignatureArgument] = [] @@ -854,34 +928,52 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: break identifiers.add(identifier.value) - pending_identifiers |= {arg.name for arg in arguments} + + args = {arg.name for arg in arguments} + pending_identifiers |= args + deferred_locals |= args node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) return set_location(node, identifier, stream.current) -def parse_function_root(stream: TokenStream) -> AstFunctionRoot: - """Parse function root.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) +@dataclass +class MacroMatchParser: + """Parser for macro matching.""" - stream_copy = stream.copy() + literal_parser: Parser + argument_parser: Parser + resource_location_parser: Parser + json_properties_parser: Parser - with stream.syntax(statement=r"[^\s#].*"): - token = stream.expect("statement") - while consume_line_continuation(stream): - stream.expect("statement") + def __call__(self, stream: TokenStream) -> AstMacroMatch: + pending_identifiers = get_stream_pending_identifiers(stream) + deferred_locals = get_stream_deferred_locals(stream) - stream_copy.data["identifiers"] = identifiers | pending_identifiers - stream_copy.data["pending_identifiers"] = set() - stream_copy.data["identifiers_storage"] = {} - stream_copy.data["pending_identifiers_storage"] = {} - stream_copy.data["branch_scope"] = set() + with stream.syntax(equal=r"(? AstTarget: @@ -1038,8 +1130,8 @@ def parse_name_list(stream: TokenStream) -> AstIdentifier: @dataclass -class FunctionRootBacktracker: - """Parser for backtracking over function root nodes.""" +class DeferredRootBacktracker: + """Parser for backtracking over deferred root nodes.""" parser: Parser @@ -1052,29 +1144,39 @@ def __call__(self, stream: TokenStream) -> AstRoot: identifiers = get_stream_identifiers(stream) for command in node.commands: - if command.identifier == "def:function:body": - if isinstance(function_root := command.arguments[-1], AstFunctionRoot): - should_replace = True + stack: List[AstCommand] = [command] - function_stream = function_root.stream - function_stream.data["identifiers"] |= identifiers - function_stream.data["function"] = True + while command.arguments and isinstance( + command := command.arguments[-1], AstCommand + ): + stack.append(command) - if isinstance(s := command.arguments[0], AstFunctionSignature): - function_stream.data["identifiers_storage"].update( - {arg.name: "local" for arg in s.arguments} - ) + command = stack.pop() + + if command.arguments and isinstance( + deferred_root := command.arguments[-1], AstDeferredRoot + ): + should_replace = True + deferred_stream = deferred_root.stream + deferred_stream.data["identifiers"] |= identifiers + deferred_stream.data["function"] = True + nested_root = delegate("nested_root", deferred_stream) + + command = replace( + command, + arguments=AstChildren([*command.arguments[:-1], nested_root]), + ) + while stack: + parent = stack.pop() command = replace( - command, - arguments=AstChildren( - [ - *command.arguments[:-1], - delegate("nested_root", function_root.stream), - ] - ), + parent, + arguments=AstChildren([*parent.arguments[:-1], command]), ) + elif stack: + command = stack[0] + commands.append(command) if should_replace: diff --git a/packages/bolt/bolt/pattern.py b/packages/bolt/bolt/pattern.py new file mode 100644 index 000000000..d1266829e --- /dev/null +++ b/packages/bolt/bolt/pattern.py @@ -0,0 +1,25 @@ +__all__ = [ + "KEYWORD_PATTERN", + "TRUE_PATTERN", + "FALSE_PATTERN", + "NULL_PATTERN", + "IDENTIFIER_PATTERN", + "MODULE_PATTERN", + "STRING_PATTERN", + "NUMBER_PATTERN", + "RESOURCE_LOCATION_PATTERN", +] + + +import keyword + +KEYWORD_PATTERN: str = "|".join(rf"\b{kw}\b" for kw in keyword.kwlist) + +TRUE_PATTERN: str = r"\b[tT]rue\b" +FALSE_PATTERN: str = r"\b[fF]alse\b" +NULL_PATTERN: str = r"\b(?:null|None)\b" +IDENTIFIER_PATTERN: str = rf"(?!_bolt_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" +MODULE_PATTERN: str = rf"{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*" +STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" +NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" +RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index c52e257df..6a473dbeb 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -15,7 +15,7 @@ "children": { "body": { "type": "argument", - "parser": "bolt:function_root", + "parser": "bolt:deferred_root", "executable": true } } @@ -54,6 +54,27 @@ } } }, + "macro": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "bolt:macro_name", + "children": { + "match": { + "type": "argument", + "parser": "bolt:macro_match", + "redirect": ["macro", "name"] + }, + "body": { + "type": "argument", + "parser": "bolt:deferred_root", + "executable": true + } + } + } + } + }, "del": { "type": "literal", "executable": true, diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index 1ea05ea93..b326a4412 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 147 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 148 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_74__0.txt b/packages/bolt/tests/snapshots/bolt__parse_74__0.txt index c1b3ae5bb..2b94a4611 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_74__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_74__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected statement but reached end of file. +#>ERROR Expected colon but reached end of file. # line 1, column 8 # 1 | def f() def f() diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 6ef837800..74b020f34 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -1386,6 +1386,9 @@ "loot:spawn:targetPos:mine:pos:offhand", "loot:spawn:targetPos:mine:pos:tool", "loot_table:name:content", + "macro:name:body", + "macro:name:match:subcommand", + "macro:name:subcommand", "me:action", "merge:advancement:name:content", "merge:block_tag:name:content", From 8274c8ab4216f2ec2334fb617fc79f841cab2d82 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Jul 2022 01:36:53 +0200 Subject: [PATCH 0929/1554] refactor: swap keys and values for codegen header --- packages/bolt/bolt/codegen.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index fd9538b8b..18a3467fa 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -28,7 +28,6 @@ overload, ) -from beet.core.utils import normalize_string from mecha import ( AstChildren, AstCommand, @@ -83,7 +82,7 @@ def get_source(self) -> str: """Return the source code.""" header = "".join( f"{variable} = {expression}\n" - for expression, variable in self.header.items() + for variable, expression in self.header.items() ) lines: List[str] = ["_bolt_lineno = "] @@ -105,12 +104,12 @@ def get_source(self) -> str: def helper(self, name: str, *args: Any) -> str: """Emit helper.""" - helper = f"_bolt_runtime.helpers[{name!r}]" + helper = f"_bolt_helper_{name}" if helper not in self.header: - self.header[helper] = f"_bolt_helper_{normalize_string(name)}" + self.header[helper] = f"_bolt_runtime.helpers[{name!r}]" - return f"{self.header[helper]}({', '.join(map(str, args))})" + return f"{helper}({', '.join(map(str, args))})" def replace(self, node: str, **kwargs: str) -> str: """Emit replace helper.""" @@ -118,8 +117,8 @@ def replace(self, node: str, **kwargs: str) -> str: def missing(self) -> str: """Emit missing sentinel.""" - self.header["_bolt_runtime.helpers['missing']"] = f"_bolt_helper_missing" - return f"_bolt_helper_missing" + self.header["_bolt_helper_missing"] = "_bolt_runtime.helpers['missing']" + return "_bolt_helper_missing" def children(self, nodes: Iterable[str]) -> str: """Emit children helper.""" From ac9f4b95ac918fb8f32cafb685d53a2b5b9e6054 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 9 Jul 2022 19:15:59 +0200 Subject: [PATCH 0930/1554] feat: working macro and tests --- packages/bolt/bolt/ast.py | 13 ++ packages/bolt/bolt/codegen.py | 73 ++++++++- packages/bolt/bolt/helpers.py | 41 +++++- packages/bolt/bolt/parse.py | 121 ++++++++++++++- packages/bolt/examples/bolt_macro/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 85 +++++++++++ .../tests/resources/bolt_examples.mcfunction | 70 +++++++++ .../tests/snapshots/bolt__parse_217__0.txt | 26 ++++ .../tests/snapshots/bolt__parse_217__1.txt | 16 ++ .../tests/snapshots/bolt__parse_218__0.txt | 33 +++++ .../tests/snapshots/bolt__parse_218__1.txt | 35 +++++ .../tests/snapshots/bolt__parse_219__0.txt | 105 +++++++++++++ .../tests/snapshots/bolt__parse_219__1.txt | 31 ++++ .../tests/snapshots/bolt__parse_220__0.txt | 47 ++++++ .../tests/snapshots/bolt__parse_220__1.txt | 36 +++++ .../tests/snapshots/bolt__parse_221__0.txt | 47 ++++++ .../tests/snapshots/bolt__parse_221__1.txt | 35 +++++ .../tests/snapshots/bolt__parse_222__0.txt | 13 ++ .../tests/snapshots/bolt__parse_223__0.txt | 13 ++ .../tests/snapshots/bolt__parse_224__0.txt | 7 + .../tests/snapshots/bolt__parse_225__0.txt | 7 + .../tests/snapshots/bolt__parse_226__0.txt | 72 +++++++++ .../tests/snapshots/bolt__parse_226__1.txt | 46 ++++++ .../tests/snapshots/bolt__parse_227__0.txt | 139 ++++++++++++++++++ .../tests/snapshots/bolt__parse_227__1.txt | 76 ++++++++++ .../tests/snapshots/bolt__parse_228__0.txt | 79 ++++++++++ .../tests/snapshots/bolt__parse_228__1.txt | 30 ++++ .../tests/snapshots/bolt__parse_229__0.txt | 54 +++++++ .../tests/snapshots/bolt__parse_229__1.txt | 56 +++++++ .../tests/snapshots/bolt__parse_230__0.txt | 8 + .../tests/snapshots/bolt__parse_231__0.txt | 57 +++++++ .../tests/snapshots/bolt__parse_231__1.txt | 49 ++++++ .../tests/snapshots/bolt__parse_232__0.txt | 7 + .../examples__build_bolt_macro__0.pack.md | 50 +++++++ 34 files changed, 1572 insertions(+), 11 deletions(-) create mode 100644 packages/bolt/examples/bolt_macro/beet.yml create mode 100644 packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_217__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_217__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_218__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_218__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_219__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_219__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_220__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_220__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_221__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_221__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_222__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_223__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_224__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_225__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_226__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_226__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_227__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_227__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_228__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_228__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_229__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_229__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_230__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_231__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_231__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_232__0.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 0c935e417..4668212c2 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -26,6 +26,8 @@ "AstFunctionSignature", "AstFunctionSignatureArgument", "AstDeferredRoot", + "AstMacro", + "AstMacroCall", "AstMacroLiteral", "AstMacroArgument", "AstMacroMatch", @@ -43,6 +45,7 @@ from beet.core.utils import required_field from mecha import ( AstChildren, + AstCommand, AstJson, AstLiteral, AstNode, @@ -259,6 +262,16 @@ class AstDeferredRoot(AstNode): stream: TokenStream = required_field() +@dataclass(frozen=True) +class AstMacro(AstCommand): + """Ast macro node.""" + + +@dataclass(frozen=True) +class AstMacroCall(AstCommand): + """Ast macro call node.""" + + @dataclass(frozen=True) class AstMacroLiteral(AstLiteral): """Ast macro literal node.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 18a3467fa..625dd7c14 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -54,6 +54,9 @@ AstKeyword, AstList, AstLookup, + AstMacro, + AstMacroCall, + AstMacroMatchArgument, AstSlice, AstTarget, AstTargetAttribute, @@ -72,6 +75,7 @@ class Accumulator: indentation: str = "" refs: List[Any] = field(default_factory=list) + macro_ids: Dict[str, int] = field(default_factory=dict) lines: List[str] = field(default_factory=list) counter: int = 0 header: Dict[str, str] = field(default_factory=dict) @@ -151,6 +155,19 @@ def make_variable(self) -> str: self.counter += 1 return name + def get_macro(self, name: str) -> str: + """Get macro.""" + if name not in self.macro_ids: + self.macro_ids[name] = len(self.macro_ids) + return f"_bolt_macro{self.macro_ids[name]}" + + def lineno(self, lineno: Any): + """Emit line number.""" + if isinstance(lineno, AstNode) and not lineno.location.unknown: + lineno = lineno.location.lineno + if isinstance(lineno, int): + self.lines.append(f"!lineno {lineno}\n") + @contextmanager def block(self): """Wrap statements in an indented block.""" @@ -163,12 +180,16 @@ def block(self): def statement(self, code: str, *, lineno: Any = None): """Emit statement.""" - if isinstance(lineno, AstNode) and not lineno.location.unknown: - lineno = lineno.location.lineno - if isinstance(lineno, int): - self.lines.append(f"!lineno {lineno}\n") + self.lineno(lineno) self.lines.append(f"{self.indentation}{code}\n") + @contextmanager + def function(self, name: str, *args: str): + """Emit function.""" + self.statement(f"def {name}({', '.join(args)}):") + with self.block(): + yield + @contextmanager def if_statement(self, condition: str): """Emit if statement.""" @@ -222,7 +243,10 @@ def add_static(self, *args: AstNode): def add_dynamic(self, *args: str): for arg in args: - self.acc.statement(f"_bolt_runtime.commands.append({arg})") + if arg.startswith("*"): + self.acc.statement(f"_bolt_runtime.commands.extend({arg[1:]})") + else: + self.acc.statement(f"_bolt_runtime.commands.append({arg})") class RootCommandCollector(CommandCollector): @@ -446,9 +470,7 @@ def function( for arg in signature.arguments ] - acc.statement(f"def {signature.name}({', '.join(arguments)}):") - - with acc.block(): + with acc.function(signature.name, *arguments): for arg in signature.arguments: if arg.default: acc.statement(f"if {arg.name} is {acc.missing()}:") @@ -495,6 +517,41 @@ def yield_statement( acc.statement(statement) return [] + @rule(AstMacro) + def macro( + self, + node: AstMacro, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + macro = acc.get_macro(node.identifier) + arguments = [ + arg.match_identifier.value + for arg in node.arguments + if isinstance(arg, AstMacroMatchArgument) + ] + + with acc.function(macro, *arguments): + yield from visit_body(cast(AstRoot, node.arguments[-1]), acc) + + return [] + + @rule(AstMacroCall) + def macro_call( + self, + node: AstMacroCall, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + macro = acc.get_macro(node.identifier) + result = yield from visit_generic(node, acc) + if result is None: + result = acc.make_ref(node) + + macro_call = acc.helper("macro_call", "_bolt_runtime", macro, result) + result = acc.make_variable() + acc.statement(f"{result} = {macro_call}", lineno=node) + + return [f"*{result}"] + @rule(AstCommand, identifier="del:target") def del_statement( self, diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index fe0bcb8ce..4548343a1 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -7,13 +7,14 @@ from functools import partial, wraps from importlib import import_module from types import TracebackType -from typing import Any, Callable, ContextManager, Dict, Optional, Type +from typing import Any, Callable, ContextManager, Dict, Generator, Optional, Type from uuid import UUID from mecha import ( AstBool, AstChildren, AstColor, + AstCommand, AstCoordinate, AstGamemode, AstGreedy, @@ -31,6 +32,7 @@ AstPlayerName, AstRange, AstResourceLocation, + AstRoot, AstScoreboardSlot, AstSortOrder, AstString, @@ -61,6 +63,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "get_rebind": get_rebind, "get_attribute": get_attribute, "import_module": python_import_module, + "macro_call": macro_call, "interpolate_bool": converter(AstBool.from_value), "interpolate_numeric": converter(AstNumber.from_value), "interpolate_coordinate": converter(AstCoordinate.from_value), @@ -180,6 +183,42 @@ def python_import_module(name: str): raise exc.with_traceback(tb) +@internal +def macro_call(runtime: Any, function: Any, command: AstCommand): + with runtime.scope() as output: + result = function(*command.arguments) + + if isinstance(result, Generator): + try: + while True: + node: Any = next(result) # type: ignore + if isinstance(node, AstRoot): + runtime.commands.extend(node.commands) + elif isinstance(node, AstCommand): + runtime.commands.append(node) + elif node: + msg = f'Emit invalid command of type {type(node)!r} from macro "{command.identifier}".' + raise TypeError(msg) + except StopIteration as exc: + result = exc.value + + if not result: + result = [] + elif isinstance(result, AstNode): + result = [result] + + for node in result: + if isinstance(node, AstRoot): + output.extend(node.commands) + elif isinstance(node, AstCommand): + output.append(node) + elif node: + msg = f'Return invalid command of type {type(node)!r} from macro "{command.identifier}".' + raise TypeError(msg) + + return output + + def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: internal(f) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index b68adf8ca..0d82994ce 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -6,6 +6,7 @@ "get_stream_pending_identifiers_storage", "get_stream_deferred_locals", "get_stream_branch_scope", + "get_stream_macro_scope", "UndefinedIdentifier", "create_bolt_root_parser", "BranchScopeManager", @@ -21,6 +22,7 @@ "parse_deferred_root", "parse_function_signature", "MacroMatchParser", + "MacroHandler", "parse_del_target", "parse_identifier", "TrailingCommaParser", @@ -50,20 +52,25 @@ from difflib import get_close_matches from typing import Any, Dict, List, Optional, Set, Tuple, cast +from beet.core.utils import JsonDict from mecha import ( AdjacentConstraint, AlternativeParser, AstChildren, AstCommand, + AstNode, AstResourceLocation, AstRoot, BasicLiteralParser, + CommandTree, CommentDisambiguation, CompilationDatabase, + MultilineParser, Parser, consume_line_continuation, delegate, get_stream_scope, + get_stream_spec, ) from mecha.contrib.relative_location import resolve_using_database from mecha.utils import ( @@ -94,7 +101,9 @@ AstKeyword, AstList, AstLookup, + AstMacro, AstMacroArgument, + AstMacroCall, AstMacroLiteral, AstMacroMatch, AstMacroMatchArgument, @@ -135,7 +144,9 @@ def get_bolt_parsers( "root": create_bolt_root_parser(parsers["root"]), "nested_root": create_bolt_root_parser(parsers["nested_root"]), "command": UndefinedIdentifierErrorHandler( - ImportStatementHandler(GlobalNonlocalHandler(parsers["command"])) + MacroHandler( + ImportStatementHandler(GlobalNonlocalHandler(parsers["command"])) + ) ), "command:argument:bolt:if_block": delegate("bolt:if_block"), "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), @@ -196,7 +207,7 @@ def get_bolt_parsers( delegate("resource_location") ), json_properties_parser=DisableInterpolationParser( - AdjacentConstraint(delegate("json_object"), r"\{") + AdjacentConstraint(MultilineParser(delegate("json_object")), r"\{") ), ), "bolt:del_target": parse_del_target, @@ -409,6 +420,11 @@ def get_stream_branch_scope(stream: TokenStream) -> Set[str]: return stream.data.setdefault("branch_scope", set()) +def get_stream_macro_scope(stream: TokenStream) -> Set[str]: + """Return the macro identifiers currently available.""" + return stream.data.setdefault("macro_scope", set()) + + class UndefinedIdentifier(InvalidSyntax): """Raised when an identifier is not defined.""" @@ -947,6 +963,7 @@ class MacroMatchParser: json_properties_parser: Parser def __call__(self, stream: TokenStream) -> AstMacroMatch: + spec = get_stream_spec(stream) pending_identifiers = get_stream_pending_identifiers(stream) deferred_locals = get_stream_deferred_locals(stream) @@ -969,6 +986,11 @@ def __call__(self, stream: TokenStream) -> AstMacroMatch: node.match_argument_properties or node.match_argument_parser, ) + parser_name = node.match_argument_parser.get_canonical_value() + if f"command:argument:{parser_name}" not in spec.parsers: + exc = InvalidSyntax(f'Unrecognized argument parser "{parser_name}".') + raise set_location(exc, node.match_argument_parser) + if commit.rollback: literal = self.literal_parser(stream) node = set_location(AstMacroMatchLiteral(match=literal), literal) @@ -976,6 +998,96 @@ def __call__(self, stream: TokenStream) -> AstMacroMatch: return node +@dataclass +class MacroHandler: + """Handle macros.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + + if not isinstance(node, AstCommand): + return node + + if node.identifier == "macro:name:subcommand": + node = self.create_macro(node) + self.inject_syntax(stream, node) + elif node.identifier in get_stream_macro_scope(stream): + call = AstMacroCall(identifier=node.identifier, arguments=node.arguments) + node = set_location(call, node) + + return node + + @classmethod + def create_macro(cls, command: AstCommand) -> AstMacro: + identifier_parts: List[str] = [] + arguments: List[AstNode] = [] + + node = command + while isinstance(subcommand := node.arguments[-1], AstCommand): + if isinstance(literal := node.arguments[0], AstMacroLiteral): + if literal.value == "macro": + exc = InvalidSyntax(f'Forbidden literal "{literal.value}".') + raise set_location(exc, literal) + identifier_parts.append(literal.value) + elif isinstance(literal := node.arguments[0], AstMacroMatchLiteral): + identifier_parts.append(literal.match.value) + elif isinstance(argument := node.arguments[0], AstMacroMatchArgument): + identifier_parts.append(argument.match_identifier.value) + arguments.append(node.arguments[0]) + node = subcommand + + arguments.append(node.arguments[0]) + + macro = AstMacro( + identifier=":".join(identifier_parts), + arguments=AstChildren(arguments), + ) + + return set_location(macro, command) + + @classmethod + def inject_syntax(cls, stream: TokenStream, *macros: AstMacro): + spec = get_stream_spec(stream) + macro_scope = get_stream_macro_scope(stream) + + # TODO: Find a way to memoize resulting command spec + if not stream.data.get("local_spec"): + stream.data["local_spec"] = True + spec = replace(spec, tree=spec.tree.copy(deep=True), prototypes={}) + stream.data["spec"] = spec + macro_scope = macro_scope.copy() + stream.data["macro_scope"] = macro_scope + + for macro in macros: + tree_root: JsonDict = {"type": "root"} + tree: JsonDict = tree_root + + for node in macro.arguments: + if isinstance(node, AstMacroLiteral): + child = {"type": "literal"} + tree["children"] = {node.value: child} + elif isinstance(node, AstMacroMatchLiteral): + child = {"type": "literal"} + tree["children"] = {node.match.value: child} + elif isinstance(node, AstMacroMatchArgument): + child = {"type": "argument"} + child["parser"] = node.match_argument_parser.get_canonical_value() + if properties := node.match_argument_properties: + child["properties"] = properties.evaluate() + tree["children"] = {node.match_identifier.value: child} + else: + tree["executable"] = True + break + tree = child + + spec.tree.extend(CommandTree.parse_obj(tree_root)) + macro_scope.add(macro.identifier) + + spec.update() + + def parse_del_target(stream: TokenStream) -> AstTarget: node = delegate("bolt:expression", stream) @@ -1141,7 +1253,9 @@ def __call__(self, stream: TokenStream) -> AstRoot: node: AstRoot = self.parser(stream) + spec = get_stream_spec(stream) identifiers = get_stream_identifiers(stream) + macro_scope = get_stream_macro_scope(stream) for command in node.commands: stack: List[AstCommand] = [command] @@ -1159,8 +1273,11 @@ def __call__(self, stream: TokenStream) -> AstRoot: should_replace = True deferred_stream = deferred_root.stream + deferred_stream.data["local_spec"] = False + deferred_stream.data["spec"] = spec deferred_stream.data["identifiers"] |= identifiers deferred_stream.data["function"] = True + deferred_stream.data["macro_scope"] = macro_scope nested_root = delegate("nested_root", deferred_stream) command = replace( diff --git a/packages/bolt/examples/bolt_macro/beet.yml b/packages/bolt/examples/bolt_macro/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_macro/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..ff5753c30 --- /dev/null +++ b/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,85 @@ +from mecha import AstCommand, AstChildren +from bolt import Runtime + +runtime = ctx.inject(Runtime) + +macro foo: + say macro foo + +foo + +macro foo bar=brigadier:integer: + if bar.value > 0: + say f"macro foo {bar.value}" + foo (bar.value - 1) + else: + foo + +foo 4 + +macro foo bar=brigadier:integer double: + foo (bar.value * 2) + +foo 3 double + +macro foo bar=brigadier:integer message=minecraft:message: + foo bar + say message + +foo 3 hello @a[ + scores = { + x = 42 + } +] + +macro setblock: + setblock air +macro setblock block=minecraft:block_state: + setblock ~ ~ ~ block +macro setblock pos=minecraft:block_pos: + setblock pos air + +setblock +setblock stone +setblock 1 2 3 +setblock 1 2 3 stone + +macro do_twice body=mecha:nested_root: + yield body + return body + +do_twice: + say this is repeated twice + +macro >> text=brigadier:string{"type": "greedy"}: + tellraw @p {"text": text.value} + +>> Custom symbols work +as @a run >> Even inside execute + +macro execute >> text=brigadier:string{"type": "greedy"}: + with runtime.scope() as subcommand: + >> text + return AstCommand(identifier="execute:run:subcommand", arguments=AstChildren(subcommand)) + +as @a >> Overload execute to allow implicit "run" + +macro tellraw + targets=minecraft:entity{ + "type": "players", + "amount": "multiple" + } + from + path=minecraft:resource_location: + tellraw targets {"text": f"from {path.get_canonical_value()}"} + +tellraw @s from ./dummy_message + +macro ! targets=minecraft:entity{"type": "entities", "amount": "multiple"} !: + macro rip: + kill targets + def do_it(): + rip + do_it() + +! @e ! diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 654995529..5cef25b8d 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -800,3 +800,73 @@ with None, None, None: ### with None as x, None, None as y: pass +### +macro foo: + pass +### +macro foo: + foo +foo +### +macro foo number=brigadier:integer text=brigadier:string{"type": "greedy"}: + print(number, text) +foo 42 this is fine really +### +macro foo: + bar +macro bar: + foo +### +macro foo: + macro bar: + foo + bar +### +def thing(): + macro bar: + pass + bar +bar +### +macro foo: + macro bar: + foo + bar +def thing(): + bar +### +macro foo bar=#brigadier:integer: + pass +### +macro foo bar=brigadier:does_not_exist: + pass +### +macro >> message=minecraft:message: + say message +>> hello @p +### +macro setblock block=minecraft:block_state: + setblock ~ ~ ~ block +setblock stone +setblock 1 2 3 stone +### +macro do_twice body=mecha:nested_root: + yield body + yield body +do_twice: + say hello +### +macro foo: + pass +as @p run foo +### +macro foo: + pass +as @p foo +### +macro execute foo: + pass +as @p foo +### +macro macro: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_217__0.txt b/packages/bolt/tests/snapshots/bolt__parse_217__0.txt new file mode 100644 index 000000000..89d0cce03 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_217__0.txt @@ -0,0 +1,26 @@ +macro foo: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_217__1.txt b/packages/bolt/tests/snapshots/bolt__parse_217__1.txt new file mode 100644 index 000000000..7c6ef884d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_217__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def _bolt_macro0(): + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_218__0.txt b/packages/bolt/tests/snapshots/bolt__parse_218__0.txt new file mode 100644 index 000000000..d87fbef04 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_218__0.txt @@ -0,0 +1,33 @@ +macro foo: + foo +foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + identifier: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + identifier: 'foo' + arguments: + + + location: SourceLocation(pos=19, lineno=3, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=4) + identifier: 'foo' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_218__1.txt b/packages/bolt/tests/snapshots/bolt__parse_218__1.txt new file mode 100644 index 000000000..e8faf2b7c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_218__1.txt @@ -0,0 +1,35 @@ +_bolt_lineno = [1, 7, 9], [1, 2, 3] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + def _bolt_macro0(): + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) + _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + identifier: 'foo' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=19, lineno=3, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=4) + identifier: 'foo' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_219__0.txt b/packages/bolt/tests/snapshots/bolt__parse_219__0.txt new file mode 100644 index 000000000..ef9b5e818 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_219__0.txt @@ -0,0 +1,105 @@ +macro foo number=brigadier:integer text=brigadier:string{"type": "greedy"}: + print(number, text) +foo 42 this is fine really +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=127, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=99, lineno=2, colno=24) + identifier: 'foo:number:text' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + match_identifier: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'number' + match_argument_parser: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + is_tag: False + namespace: 'brigadier' + path: 'integer' + match_argument_properties: None + + location: SourceLocation(pos=35, lineno=1, colno=36) + end_location: SourceLocation(pos=74, lineno=1, colno=75) + match_identifier: + + location: SourceLocation(pos=35, lineno=1, colno=36) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + value: 'text' + match_argument_parser: + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=56, lineno=1, colno=57) + is_tag: False + namespace: 'brigadier' + path: 'string' + match_argument_properties: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=74, lineno=1, colno=75) + entries: + + location: SourceLocation(pos=57, lineno=1, colno=58) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + key: + + location: SourceLocation(pos=57, lineno=1, colno=58) + end_location: SourceLocation(pos=63, lineno=1, colno=64) + value: 'type' + value: + + location: SourceLocation(pos=65, lineno=1, colno=66) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + value: 'greedy' + + location: SourceLocation(pos=80, lineno=2, colno=5) + end_location: SourceLocation(pos=99, lineno=2, colno=24) + commands: + + location: SourceLocation(pos=80, lineno=2, colno=5) + end_location: SourceLocation(pos=99, lineno=2, colno=24) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=80, lineno=2, colno=5) + end_location: SourceLocation(pos=99, lineno=2, colno=24) + value: + + location: SourceLocation(pos=80, lineno=2, colno=5) + end_location: SourceLocation(pos=85, lineno=2, colno=10) + value: 'print' + arguments: + + location: SourceLocation(pos=86, lineno=2, colno=11) + end_location: SourceLocation(pos=92, lineno=2, colno=17) + value: 'number' + + location: SourceLocation(pos=94, lineno=2, colno=19) + end_location: SourceLocation(pos=98, lineno=2, colno=23) + value: 'text' + + location: SourceLocation(pos=100, lineno=3, colno=1) + end_location: SourceLocation(pos=126, lineno=3, colno=27) + identifier: 'foo:number:text' + arguments: + + location: SourceLocation(pos=104, lineno=3, colno=5) + end_location: SourceLocation(pos=106, lineno=3, colno=7) + value: 42 + + location: SourceLocation(pos=107, lineno=3, colno=8) + end_location: SourceLocation(pos=126, lineno=3, colno=27) + value: 'this is fine really' diff --git a/packages/bolt/tests/snapshots/bolt__parse_219__1.txt b/packages/bolt/tests/snapshots/bolt__parse_219__1.txt new file mode 100644 index 000000000..71ff24891 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_219__1.txt @@ -0,0 +1,31 @@ +_bolt_lineno = [1, 7, 11], [1, 2, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + def _bolt_macro0(number, text): + _bolt_var0 = print + _bolt_var1 = number + _bolt_var2 = text + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2) + _bolt_var3 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var3) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var4)) +--- +output = _bolt_var5 +--- +_bolt_refs[0] + + location: SourceLocation(pos=100, lineno=3, colno=1) + end_location: SourceLocation(pos=126, lineno=3, colno=27) + identifier: 'foo:number:text' + arguments: + + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=127, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_220__0.txt b/packages/bolt/tests/snapshots/bolt__parse_220__0.txt new file mode 100644 index 000000000..82b20dd55 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_220__0.txt @@ -0,0 +1,47 @@ +macro foo: + bar +macro bar: + foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=4, colno=8) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + identifier: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + identifier: 'bar' + arguments: + + + location: SourceLocation(pos=19, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=4, colno=8) + identifier: 'bar' + arguments: + + location: SourceLocation(pos=25, lineno=3, colno=7) + end_location: SourceLocation(pos=28, lineno=3, colno=10) + value: 'bar' + + location: SourceLocation(pos=34, lineno=4, colno=5) + end_location: SourceLocation(pos=37, lineno=4, colno=8) + commands: + + location: SourceLocation(pos=34, lineno=4, colno=5) + end_location: SourceLocation(pos=37, lineno=4, colno=8) + identifier: 'foo' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_220__1.txt b/packages/bolt/tests/snapshots/bolt__parse_220__1.txt new file mode 100644 index 000000000..01b9124c8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_220__1.txt @@ -0,0 +1,36 @@ +_bolt_lineno = [1, 7, 10], [1, 2, 4] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + def _bolt_macro0(): + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) + def _bolt_macro1(): + _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + identifier: 'bar' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=34, lineno=4, colno=5) + end_location: SourceLocation(pos=37, lineno=4, colno=8) + identifier: 'foo' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=37, lineno=4, colno=8) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_221__0.txt b/packages/bolt/tests/snapshots/bolt__parse_221__0.txt new file mode 100644 index 000000000..9df5bcd44 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_221__0.txt @@ -0,0 +1,47 @@ +macro foo: + macro bar: + foo + bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + identifier: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + identifier: 'bar' + arguments: + + location: SourceLocation(pos=21, lineno=2, colno=11) + end_location: SourceLocation(pos=24, lineno=2, colno=14) + value: 'bar' + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + identifier: 'foo' + arguments: + + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + identifier: 'bar' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_221__1.txt b/packages/bolt/tests/snapshots/bolt__parse_221__1.txt new file mode 100644 index 000000000..51ab5a792 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_221__1.txt @@ -0,0 +1,35 @@ +_bolt_lineno = [1, 8, 10], [1, 3, 4] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + def _bolt_macro0(): + def _bolt_macro1(): + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) + _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=37, lineno=3, colno=12) + identifier: 'foo' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=42, lineno=4, colno=5) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + identifier: 'bar' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=8) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_222__0.txt b/packages/bolt/tests/snapshots/bolt__parse_222__0.txt new file mode 100644 index 000000000..6e4ec88ee --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_222__0.txt @@ -0,0 +1,13 @@ +def thing(): + macro bar: + pass + bar +#>ERROR Identifier 'bar' is not defined. +# line 5, column 1 +# 3 | pass +# 4 | bar +# 5 | bar +# : ^^^ +# Notes: +# - Expected assignment but got newline '\n'. +bar diff --git a/packages/bolt/tests/snapshots/bolt__parse_223__0.txt b/packages/bolt/tests/snapshots/bolt__parse_223__0.txt new file mode 100644 index 000000000..4fca1ef1b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_223__0.txt @@ -0,0 +1,13 @@ +macro foo: + macro bar: + foo + bar +def thing(): +#>ERROR Identifier 'bar' is not defined. +# line 6, column 5 +# 5 | def thing(): +# 6 | bar +# : ^^^ +# Notes: +# - Expected assignment but got newline '\n'. + bar diff --git a/packages/bolt/tests/snapshots/bolt__parse_224__0.txt b/packages/bolt/tests/snapshots/bolt__parse_224__0.txt new file mode 100644 index 000000000..06b9f1339 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_224__0.txt @@ -0,0 +1,7 @@ +#>ERROR Specifying a tag is not allowed '#brigadier:integer'. +# line 1, column 15 +# 1 | macro foo bar=#brigadier:integer: +# : ^^^^^^^^^^^^^^^^^^ +# 2 | pass +macro foo bar=#brigadier:integer: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_225__0.txt b/packages/bolt/tests/snapshots/bolt__parse_225__0.txt new file mode 100644 index 000000000..e9dbe8962 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_225__0.txt @@ -0,0 +1,7 @@ +#>ERROR Unrecognized argument parser "brigadier:does_not_exist". +# line 1, column 15 +# 1 | macro foo bar=brigadier:does_not_exist: +# : ^^^^^^^^^^^^^^^^^^^^^^^^ +# 2 | pass +macro foo bar=brigadier:does_not_exist: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_226__0.txt b/packages/bolt/tests/snapshots/bolt__parse_226__0.txt new file mode 100644 index 000000000..fd39d4550 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_226__0.txt @@ -0,0 +1,72 @@ +macro >> message=minecraft:message: + say message +>> hello @p +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=63, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + identifier: '>>:message' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: '>>' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + match_identifier: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'message' + match_argument_parser: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + is_tag: False + namespace: 'minecraft' + path: 'message' + match_argument_properties: None + + location: SourceLocation(pos=40, lineno=2, colno=5) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + commands: + + location: SourceLocation(pos=40, lineno=2, colno=5) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=44, lineno=2, colno=9) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=44, lineno=2, colno=9) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + value: 'message' + + location: SourceLocation(pos=52, lineno=3, colno=1) + end_location: SourceLocation(pos=63, lineno=3, colno=12) + identifier: '>>:message' + arguments: + + location: SourceLocation(pos=55, lineno=3, colno=4) + end_location: SourceLocation(pos=63, lineno=3, colno=12) + fragments: + + location: SourceLocation(pos=55, lineno=3, colno=4) + end_location: SourceLocation(pos=61, lineno=3, colno=10) + value: 'hello ' + + location: SourceLocation(pos=61, lineno=3, colno=10) + end_location: SourceLocation(pos=63, lineno=3, colno=12) + variable: 'p' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_226__1.txt b/packages/bolt/tests/snapshots/bolt__parse_226__1.txt new file mode 100644 index 000000000..e28770496 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_226__1.txt @@ -0,0 +1,46 @@ +_bolt_lineno = [1, 8, 11], [1, 2, 3] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +with _bolt_runtime.scope() as _bolt_var2: + def _bolt_macro0(message): + _bolt_var0 = message + _bolt_var0 = _bolt_helper_interpolate_message(_bolt_var0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var0]))) + _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[2]) + _bolt_runtime.commands.extend(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=44, lineno=2, colno=9) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=40, lineno=2, colno=5) + end_location: SourceLocation(pos=51, lineno=2, colno=16) + identifier: 'say:message' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=52, lineno=3, colno=1) + end_location: SourceLocation(pos=63, lineno=3, colno=12) + identifier: '>>:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=63, lineno=3, colno=12) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_227__0.txt b/packages/bolt/tests/snapshots/bolt__parse_227__0.txt new file mode 100644 index 000000000..754386e19 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_227__0.txt @@ -0,0 +1,139 @@ +macro setblock block=minecraft:block_state: + setblock ~ ~ ~ block +setblock stone +setblock 1 2 3 stone +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=104, lineno=4, colno=21) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + identifier: 'setblock:block' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'setblock' + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + match_identifier: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'block' + match_argument_parser: + + location: SourceLocation(pos=21, lineno=1, colno=22) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + is_tag: False + namespace: 'minecraft' + path: 'block_state' + match_argument_properties: None + + location: SourceLocation(pos=48, lineno=2, colno=5) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + commands: + + location: SourceLocation(pos=48, lineno=2, colno=5) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=57, lineno=2, colno=14) + end_location: SourceLocation(pos=62, lineno=2, colno=19) + x: + + location: SourceLocation(pos=57, lineno=2, colno=14) + end_location: SourceLocation(pos=58, lineno=2, colno=15) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=59, lineno=2, colno=16) + end_location: SourceLocation(pos=60, lineno=2, colno=17) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=61, lineno=2, colno=18) + end_location: SourceLocation(pos=62, lineno=2, colno=19) + type: 'relative' + value: 0 + + location: SourceLocation(pos=63, lineno=2, colno=20) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + identifier: + + location: SourceLocation(pos=63, lineno=2, colno=20) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + prefix: None + unpack: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=63, lineno=2, colno=20) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + value: 'block' + block_states: + + data_tags: None + + location: SourceLocation(pos=69, lineno=3, colno=1) + end_location: SourceLocation(pos=83, lineno=3, colno=15) + identifier: 'setblock:block' + arguments: + + location: SourceLocation(pos=78, lineno=3, colno=10) + end_location: SourceLocation(pos=83, lineno=3, colno=15) + identifier: + + location: SourceLocation(pos=78, lineno=3, colno=10) + end_location: SourceLocation(pos=83, lineno=3, colno=15) + is_tag: False + namespace: None + path: 'stone' + block_states: + + data_tags: None + + location: SourceLocation(pos=84, lineno=4, colno=1) + end_location: SourceLocation(pos=104, lineno=4, colno=21) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=93, lineno=4, colno=10) + end_location: SourceLocation(pos=98, lineno=4, colno=15) + x: + + location: SourceLocation(pos=93, lineno=4, colno=10) + end_location: SourceLocation(pos=94, lineno=4, colno=11) + type: 'absolute' + value: 1 + y: + + location: SourceLocation(pos=95, lineno=4, colno=12) + end_location: SourceLocation(pos=96, lineno=4, colno=13) + type: 'absolute' + value: 2 + z: + + location: SourceLocation(pos=97, lineno=4, colno=14) + end_location: SourceLocation(pos=98, lineno=4, colno=15) + type: 'absolute' + value: 3 + + location: SourceLocation(pos=99, lineno=4, colno=16) + end_location: SourceLocation(pos=104, lineno=4, colno=21) + identifier: + + location: SourceLocation(pos=99, lineno=4, colno=16) + end_location: SourceLocation(pos=104, lineno=4, colno=21) + is_tag: False + namespace: None + path: 'stone' + block_states: + + data_tags: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_227__1.txt b/packages/bolt/tests/snapshots/bolt__parse_227__1.txt new file mode 100644 index 000000000..bcfbd1136 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_227__1.txt @@ -0,0 +1,76 @@ +_bolt_lineno = [1, 8, 11], [1, 2, 3] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +with _bolt_runtime.scope() as _bolt_var2: + def _bolt_macro0(block): + _bolt_var0 = block + _bolt_var0 = _bolt_helper_interpolate_resource_location(_bolt_var0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[2], _bolt_helper_replace(_bolt_refs[1], identifier=_bolt_var0)]))) + _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[4]) + _bolt_runtime.commands.extend(_bolt_var1) + _bolt_runtime.commands.append(_bolt_refs[5]) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=63, lineno=2, colno=20) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + prefix: None + unpack: None + converter: 'resource_location' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=63, lineno=2, colno=20) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + identifier: + + block_states: + + data_tags: None +_bolt_refs[2] + + location: SourceLocation(pos=57, lineno=2, colno=14) + end_location: SourceLocation(pos=62, lineno=2, colno=19) + x: + + y: + + z: + +_bolt_refs[3] + + location: SourceLocation(pos=48, lineno=2, colno=5) + end_location: SourceLocation(pos=68, lineno=2, colno=25) + identifier: 'setblock:pos:block' + arguments: + + +_bolt_refs[4] + + location: SourceLocation(pos=69, lineno=3, colno=1) + end_location: SourceLocation(pos=83, lineno=3, colno=15) + identifier: 'setblock:block' + arguments: + +_bolt_refs[5] + + location: SourceLocation(pos=84, lineno=4, colno=1) + end_location: SourceLocation(pos=104, lineno=4, colno=21) + identifier: 'setblock:pos:block' + arguments: + + +_bolt_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=104, lineno=4, colno=21) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_228__0.txt b/packages/bolt/tests/snapshots/bolt__parse_228__0.txt new file mode 100644 index 000000000..6081bf75c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_228__0.txt @@ -0,0 +1,79 @@ +macro do_twice body=mecha:nested_root: + yield body + yield body +do_twice: + say hello +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=15) + identifier: 'do_twice:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'do_twice' + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + match_identifier: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'body' + match_argument_parser: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + is_tag: False + namespace: 'mecha' + path: 'nested_root' + match_argument_properties: None + + location: SourceLocation(pos=43, lineno=2, colno=5) + end_location: SourceLocation(pos=68, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=43, lineno=2, colno=5) + end_location: SourceLocation(pos=53, lineno=2, colno=15) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=49, lineno=2, colno=11) + end_location: SourceLocation(pos=53, lineno=2, colno=15) + value: 'body' + + location: SourceLocation(pos=58, lineno=3, colno=5) + end_location: SourceLocation(pos=68, lineno=3, colno=15) + identifier: 'yield:value' + arguments: + + location: SourceLocation(pos=64, lineno=3, colno=11) + end_location: SourceLocation(pos=68, lineno=3, colno=15) + value: 'body' + + location: SourceLocation(pos=69, lineno=4, colno=1) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + identifier: 'do_twice:body' + arguments: + + location: SourceLocation(pos=83, lineno=5, colno=5) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + commands: + + location: SourceLocation(pos=83, lineno=5, colno=5) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=87, lineno=5, colno=9) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + fragments: + + location: SourceLocation(pos=87, lineno=5, colno=9) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_228__1.txt b/packages/bolt/tests/snapshots/bolt__parse_228__1.txt new file mode 100644 index 000000000..e48fd3e71 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_228__1.txt @@ -0,0 +1,30 @@ +_bolt_lineno = [1, 7, 9, 11], [1, 2, 3, 4] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + def _bolt_macro0(body): + _bolt_var0 = body + yield _bolt_var0 + _bolt_var1 = body + yield _bolt_var1 + _bolt_var2 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var2) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=69, lineno=4, colno=1) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + identifier: 'do_twice:body' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=92, lineno=5, colno=14) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_229__0.txt b/packages/bolt/tests/snapshots/bolt__parse_229__0.txt new file mode 100644 index 000000000..3dd22c61e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_229__0.txt @@ -0,0 +1,54 @@ +macro foo: + pass +as @p run foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=23, lineno=3, colno=4) + end_location: SourceLocation(pos=25, lineno=3, colno=6) + variable: 'p' + arguments: + + + location: SourceLocation(pos=26, lineno=3, colno=7) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=30, lineno=3, colno=11) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'foo' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_229__1.txt b/packages/bolt/tests/snapshots/bolt__parse_229__1.txt new file mode 100644 index 000000000..f6ecd5d20 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_229__1.txt @@ -0,0 +1,56 @@ +_bolt_lineno = [1, 8], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + def _bolt_macro0(): + pass + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[2], _bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([*_bolt_var0]))]))]))) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=30, lineno=3, colno=11) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'foo' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=26, lineno=3, colno=7) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'execute:run:subcommand' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=23, lineno=3, colno=4) + end_location: SourceLocation(pos=25, lineno=3, colno=6) + variable: 'p' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'execute:as:targets:subcommand' + arguments: + + +_bolt_refs[4] + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + identifier: 'execute:subcommand' + arguments: + +_bolt_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt new file mode 100644 index 000000000..84b9202e2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt @@ -0,0 +1,8 @@ +macro foo: + pass +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 122 other tokens but got literal 'foo'. +# line 3, column 7 +# 2 | pass +# 3 | as @p foo +# : ^^^ +as @p foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_231__0.txt b/packages/bolt/tests/snapshots/bolt__parse_231__0.txt new file mode 100644 index 000000000..3a3566aef --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_231__0.txt @@ -0,0 +1,57 @@ +macro execute foo: + pass +as @p foo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'execute:foo' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'execute' + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + match: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'foo' + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=31, lineno=3, colno=4) + end_location: SourceLocation(pos=33, lineno=3, colno=6) + variable: 'p' + arguments: + + + location: SourceLocation(pos=34, lineno=3, colno=7) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + identifier: 'execute:foo' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_231__1.txt b/packages/bolt/tests/snapshots/bolt__parse_231__1.txt new file mode 100644 index 000000000..c51241e4a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_231__1.txt @@ -0,0 +1,49 @@ +_bolt_lineno = [1, 8], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + def _bolt_macro0(): + pass + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], *_bolt_var0]))]))) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=34, lineno=3, colno=7) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + identifier: 'execute:foo' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=31, lineno=3, colno=4) + end_location: SourceLocation(pos=33, lineno=3, colno=6) + variable: 'p' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + identifier: 'execute:as:targets:subcommand' + arguments: + + +_bolt_refs[3] + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + identifier: 'execute:subcommand' + arguments: + +_bolt_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_232__0.txt b/packages/bolt/tests/snapshots/bolt__parse_232__0.txt new file mode 100644 index 000000000..e0bdd53c6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_232__0.txt @@ -0,0 +1,7 @@ +#>ERROR Forbidden literal "macro". +# line 1, column 7 +# 1 | macro macro: +# : ^^^^^ +# 2 | pass +macro macro: + pass diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md new file mode 100644 index 000000000..2b6680b73 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md @@ -0,0 +1,50 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say macro foo +say macro foo 4 +say macro foo 3 +say macro foo 2 +say macro foo 1 +say macro foo +say macro foo 6 +say macro foo 5 +say macro foo 4 +say macro foo 3 +say macro foo 2 +say macro foo 1 +say macro foo +say macro foo 3 +say macro foo 2 +say macro foo 1 +say macro foo +say hello @a[scores={x=42}] +setblock ~ ~ ~ air +setblock ~ ~ ~ stone +setblock 1 2 3 air +setblock 1 2 3 stone +say this is repeated twice +say this is repeated twice +tellraw @p {"text": "Custom symbols work"} +execute as @a run tellraw @p {"text": "Even inside execute"} +execute as @a run tellraw @p {"text": "Overload execute to allow implicit \"run\""} +tellraw @s {"text": "from demo:dummy_message"} +kill @e +``` From eec8820202a1bab945dba843b8ae86ad4f451bf5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 9 Jul 2022 17:23:33 +0000 Subject: [PATCH 0931/1554] 0.10.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 8 ++++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 5dbe067b8..bb19881d2 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.10.0 (2022-07-09) +### Feature +* Working macro and tests ([`a0ddfba`](https://github.com/mcbeet/bolt/commit/a0ddfbab5a46b173ec8a0bd46f8e78c76a098c85)) +* Start working on macro ([`e3bbb3e`](https://github.com/mcbeet/bolt/commit/e3bbb3e83dd2f60df2a4f8ca848782b7a83a2c84)) + +### Fix +* Update mecha ([`e6c77e9`](https://github.com/mcbeet/bolt/commit/e6c77e9d495e7de8dcc3326ea15c2edc767249f7)) + ## v0.9.1 (2022-07-02) ### Fix * Allow ast node interpolation directly ([`ffa076e`](https://github.com/mcbeet/bolt/commit/ffa076efa635be32c735371e2761da954385abbf)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index d7d68a0e5..e974bb257 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.9.1" +__version__ = "0.10.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index c6fe2bd59..77fa36a15 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.9.1" +version = "0.10.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From c7daf8a912bf1beee1e1d7e08677c62bc3a43fb3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 10 Jul 2022 00:04:01 +0200 Subject: [PATCH 0932/1554] feat: make it possible to run the lazy plugin multiple times --- packages/bolt/bolt/contrib/lazy.py | 54 ++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/packages/bolt/bolt/contrib/lazy.py b/packages/bolt/bolt/contrib/lazy.py index 675a47e3a..26bd2e619 100644 --- a/packages/bolt/bolt/contrib/lazy.py +++ b/packages/bolt/bolt/contrib/lazy.py @@ -2,18 +2,19 @@ __all__ = [ + "LazyExecution", "LazyFilter", "BoltLazyOptions", "bolt_lazy", ] -from dataclasses import dataclass +from dataclasses import InitVar, dataclass, field from functools import partial -from typing import Any +from typing import Any, List from beet import Context, ListOption, TextFileBase, configurable -from beet.core.utils import required_field +from beet.core.utils import extra_field, required_field from mecha import CompilationDatabase, Mecha, Visitor, rule from pathspec import PathSpec from pydantic import BaseModel @@ -32,17 +33,37 @@ def beet_default(ctx: Context): @configurable(validator=BoltLazyOptions) def bolt_lazy(ctx: Context, opts: BoltLazyOptions): """Plugin for importing bolt modules lazily.""" - mc = ctx.inject(Mecha) - runtime = ctx.inject(Runtime) + lazy = ctx.inject(LazyExecution) + lazy.register(*opts.match.entries()) - mc.steps.insert( - mc.steps.index(runtime.evaluate), - LazyFilter( - runtime=runtime, - database=mc.database, - path_spec=PathSpec.from_lines("gitwildmatch", opts.match.entries()), - ), - ) + +@dataclass +class LazyExecution: + """Service for managing lazy execution.""" + + ctx: InitVar[Context] + match: List[str] = field(default_factory=list) + path_spec: PathSpec = extra_field(init=False) + + def __post_init__(self, ctx: Context): + self.register() + + mc = ctx.inject(Mecha) + runtime = ctx.inject(Runtime) + + mc.steps.insert( + mc.steps.index(runtime.evaluate), + LazyFilter(runtime=runtime, database=mc.database, lazy=self), + ) + + def register(self, *match: str): + """Make the modules matching the specified patterns lazy.""" + self.match.extend(match) + self.path_spec = PathSpec.from_lines("gitwildmatch", self.match) + + def check(self, resource_location: str) -> bool: + """Check if the specified module is lazy.""" + return self.path_spec.match_file(resource_location) @dataclass @@ -51,14 +72,12 @@ class LazyFilter(Visitor): runtime: Runtime = required_field() database: CompilationDatabase = required_field() - path_spec: PathSpec = required_field() + lazy: LazyExecution = required_field() @rule(AstModuleRoot) def lazy_module(self, node: AstModuleRoot): module = self.runtime.get_module(node) - path = module.resource_location - - if path and self.path_spec.match_file(path): + if module.resource_location and self.lazy.check(module.resource_location): module.execution_hooks.append( partial( self.restore_lazy, @@ -68,7 +87,6 @@ def lazy_module(self, node: AstModuleRoot): ) ) return None - return node def restore_lazy(self, key: TextFileBase[Any], node: AstModuleRoot, step: int): From d86ed788dfe5568274402b3138fac059bc013de9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 10 Jul 2022 02:33:44 +0200 Subject: [PATCH 0933/1554] feat: extract module manager from runtime --- packages/bolt/bolt/__init__.py | 1 + packages/bolt/bolt/ast.py | 9 +- packages/bolt/bolt/codegen.py | 15 +- packages/bolt/bolt/contrib/debug_codegen.py | 10 +- packages/bolt/bolt/contrib/lazy.py | 19 +- packages/bolt/bolt/module.py | 256 +++++++++++++ packages/bolt/bolt/parse.py | 87 +++-- packages/bolt/bolt/runtime.py | 341 +++--------------- .../data/demo/functions/import_a.mcfunction | 4 +- .../data/demo/functions/import_b.mcfunction | 4 +- .../src/data/demo/functions/thing.mcfunction | 2 +- .../tests/snapshots/bolt__parse_119__0.txt | 2 +- .../tests/snapshots/bolt__parse_121__0.txt | 2 +- .../tests/snapshots/bolt__parse_123__0.txt | 2 +- .../tests/snapshots/bolt__parse_124__0.txt | 2 +- .../tests/snapshots/bolt__parse_125__0.txt | 2 +- .../tests/snapshots/bolt__parse_127__0.txt | 5 +- .../tests/snapshots/bolt__parse_128__0.txt | 5 +- .../tests/snapshots/bolt__parse_129__0.txt | 15 +- .../tests/snapshots/bolt__parse_158__0.txt | 2 +- .../tests/snapshots/bolt__parse_159__0.txt | 2 +- .../tests/snapshots/bolt__parse_187__0.txt | 2 +- .../tests/snapshots/bolt__parse_189__0.txt | 2 +- .../tests/snapshots/bolt__parse_195__0.txt | 2 +- .../tests/snapshots/bolt__parse_200__0.txt | 2 +- .../tests/snapshots/bolt__parse_208__0.txt | 5 +- .../tests/snapshots/bolt__parse_209__0.txt | 5 +- .../tests/snapshots/bolt__parse_222__0.txt | 2 +- .../tests/snapshots/bolt__parse_223__0.txt | 2 +- .../tests/snapshots/bolt__parse_30__0.txt | 2 +- .../tests/snapshots/bolt__parse_31__0.txt | 2 +- .../tests/snapshots/bolt__parse_52__0.txt | 2 +- .../tests/snapshots/bolt__parse_54__0.txt | 2 +- .../tests/snapshots/bolt__parse_56__0.txt | 2 +- .../tests/snapshots/bolt__parse_58__0.txt | 2 +- .../tests/snapshots/bolt__parse_59__0.txt | 2 +- .../tests/snapshots/bolt__parse_60__0.txt | 2 +- .../tests/snapshots/bolt__parse_61__0.txt | 2 +- .../tests/snapshots/bolt__parse_76__0.txt | 2 +- .../tests/snapshots/bolt__parse_78__0.txt | 2 +- .../tests/snapshots/bolt__parse_79__0.txt | 2 +- .../tests/snapshots/bolt__parse_80__0.txt | 2 +- .../tests/snapshots/bolt__parse_83__0.txt | 2 +- .../tests/snapshots/bolt__parse_85__0.txt | 2 +- .../tests/snapshots/bolt__parse_86__0.txt | 2 +- .../tests/snapshots/bolt__parse_88__0.txt | 2 +- .../tests/snapshots/bolt__parse_90__0.txt | 2 +- .../tests/snapshots/sandbox__run_8__0.txt | 2 +- packages/bolt/tests/test_bolt.py | 8 +- 49 files changed, 457 insertions(+), 398 deletions(-) create mode 100644 packages/bolt/bolt/module.py diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e974bb257..ebc087422 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -5,6 +5,7 @@ from .codegen import * from .helpers import * from .loop_info import * +from .module import * from .parse import * from .plugin import * from .runtime import * diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 4668212c2..0c728f810 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -34,7 +34,7 @@ "AstMacroMatchLiteral", "AstMacroMatchArgument", "AstInterpolation", - "AstImportedIdentifier", + "AstImportedItem", ] @@ -320,7 +320,8 @@ class AstInterpolation(AstNode): @dataclass(frozen=True) -class AstImportedIdentifier(AstNode): - """Ast imported identifier node.""" +class AstImportedItem(AstNode): + """Ast imported item node.""" - value: str = required_field() + name: str = required_field() + identifier: bool = True diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 625dd7c14..a34c37ef6 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -49,7 +49,7 @@ AstFormatString, AstFunctionSignature, AstIdentifier, - AstImportedIdentifier, + AstImportedItem, AstInterpolation, AstKeyword, AstList, @@ -67,6 +67,7 @@ AstUnpack, AstValue, ) +from .module import CodegenResult @dataclass @@ -408,18 +409,18 @@ def visit_binding( class Codegen(Visitor): """Code generator.""" - def __call__(self, node: AstRoot) -> Tuple[Optional[str], Optional[str], List[Any]]: # type: ignore + def __call__(self, node: AstRoot) -> CodegenResult: # type: ignore acc = Accumulator() result = self.invoke(node, acc) if result is None: - return None, None, acc.refs + return CodegenResult(refs=acc.refs) elif len(result) != 1: raise ValueError( f"Expected single result for {node.__class__.__name__} {result!r}." ) output = acc.make_variable() acc.statement(f"{output} = {result[0]}") - return acc.get_source(), output, acc.refs + return CodegenResult(source=acc.get_source(), output=output, refs=acc.refs) @rule(AstNode) def fallback( @@ -678,8 +679,8 @@ def import_statement( subcommand = cast(AstCommand, node.arguments[1]) while True: - if isinstance(name := subcommand.arguments[0], AstImportedIdentifier): - names.append(name.value) + if isinstance(item := subcommand.arguments[0], AstImportedItem): + names.append(item.name) if subcommand.identifier == "from:module:import:name:subcommand": subcommand = cast(AstCommand, subcommand.arguments[1]) else: @@ -696,7 +697,7 @@ def import_statement( acc.statement(f"{name} = {rhs}", lineno=node) elif node.identifier == "import:module:as:alias": - alias = cast(AstImportedIdentifier, node.arguments[1]).value + alias = cast(AstImportedItem, node.arguments[1]).name if module.namespace: acc.statement( diff --git a/packages/bolt/bolt/contrib/debug_codegen.py b/packages/bolt/bolt/contrib/debug_codegen.py index a693d16e2..f2dabdf4a 100644 --- a/packages/bolt/bolt/contrib/debug_codegen.py +++ b/packages/bolt/bolt/contrib/debug_codegen.py @@ -10,25 +10,25 @@ from beet import Context from beet.core.utils import required_field -from mecha import AstRoot, CompilationDatabase, Mecha, Visitor, rule +from mecha import AstRoot, Mecha, Visitor, rule from bolt import Runtime +from bolt.module import ModuleManager def beet_default(ctx: Context): mc = ctx.inject(Mecha) runtime = ctx.inject(Runtime) - mc.steps[:] = [DebugCodegenEmitter(runtime=runtime, database=mc.database)] + mc.steps[:] = [DebugCodegenEmitter(modules=runtime.modules)] @dataclass class DebugCodegenEmitter(Visitor): """Visitor that interrupts the compilation process and dumps the generated code.""" - runtime: Runtime = required_field() - database: CompilationDatabase = required_field() + modules: ModuleManager = required_field() @rule(AstRoot) def debug_codegen(self, node: AstRoot): - self.database.current.text = self.runtime.codegen(node)[0] or "" + self.modules.database.current.text = self.modules.codegen(node).source or "" return None diff --git a/packages/bolt/bolt/contrib/lazy.py b/packages/bolt/bolt/contrib/lazy.py index 26bd2e619..27a96ca77 100644 --- a/packages/bolt/bolt/contrib/lazy.py +++ b/packages/bolt/bolt/contrib/lazy.py @@ -15,11 +15,11 @@ from beet import Context, ListOption, TextFileBase, configurable from beet.core.utils import extra_field, required_field -from mecha import CompilationDatabase, Mecha, Visitor, rule +from mecha import Mecha, Visitor, rule from pathspec import PathSpec from pydantic import BaseModel -from bolt import AstModuleRoot, Runtime +from bolt import AstModuleRoot, ModuleManager, Runtime class BoltLazyOptions(BaseModel): @@ -53,7 +53,7 @@ def __post_init__(self, ctx: Context): mc.steps.insert( mc.steps.index(runtime.evaluate), - LazyFilter(runtime=runtime, database=mc.database, lazy=self), + LazyFilter(modules=runtime.modules, lazy=self), ) def register(self, *match: str): @@ -70,26 +70,25 @@ def check(self, resource_location: str) -> bool: class LazyFilter(Visitor): """Visitor that filters lazy modules from the compilation by matching resource location.""" - runtime: Runtime = required_field() - database: CompilationDatabase = required_field() + modules: ModuleManager = required_field() lazy: LazyExecution = required_field() @rule(AstModuleRoot) def lazy_module(self, node: AstModuleRoot): - module = self.runtime.get_module(node) + module = self.modules.get(node) if module.resource_location and self.lazy.check(module.resource_location): module.execution_hooks.append( partial( self.restore_lazy, - self.database.current, + self.modules.database.current, node, - self.database.step + 1, + self.modules.database.step + 1, ) ) return None return node def restore_lazy(self, key: TextFileBase[Any], node: AstModuleRoot, step: int): - compilation_unit = self.database[key] + compilation_unit = self.modules.database[key] compilation_unit.ast = node - self.database.enqueue(key, step) + self.modules.database.enqueue(key, step) diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py new file mode 100644 index 000000000..eb0e986ac --- /dev/null +++ b/packages/bolt/bolt/module.py @@ -0,0 +1,256 @@ +__all__ = [ + "Module", + "CompiledModule", + "ModuleManager", + "ModuleCacheBackend", + "CodegenResult", + "UnusableCompilationUnit", +] + + +import logging +import marshal +from contextlib import contextmanager +from dataclasses import dataclass, field +from io import BufferedReader, BufferedWriter +from pathlib import Path +from types import CodeType +from typing import Any, Callable, Dict, List, Optional, Set, Union + +from beet import TextFile, TextFileBase +from beet.core.utils import JsonDict, extra_field, import_from_string, required_field +from mecha import ( + AstCacheBackend, + AstRoot, + CompilationDatabase, + CompilationUnit, + Dispatcher, + MechaError, +) + +from .utils import rewrite_traceback + +logger = logging.getLogger("mecha") + + +class UnusableCompilationUnit(MechaError): + """Raised when a compilation unit lacks the necessary information to instantiate a module.""" + + message: str + compilation_unit: CompilationUnit + + def __init__(self, message: str, compilation_unit: CompilationUnit) -> None: + super().__init__(message, compilation_unit) + self.message = message + self.compilation_unit = compilation_unit + + def __str__(self) -> str: + return self.message + + +class Module(TextFile): + """Class representing a bolt module.""" + + scope = ("modules",) + extension = ".bolt" + + +@dataclass +class CompiledModule: + """Class holding the state of a compiled module.""" + + ast: AstRoot + code: Optional[CodeType] + refs: List[Any] + output: Optional[str] + resource_location: Optional[str] + globals: Set[str] + namespace: JsonDict = field(default_factory=dict) + executing: bool = False + executed: bool = False + execution_hooks: List[Callable[[], Any]] = field(default_factory=list) + + +@dataclass(frozen=True) +class CodegenResult: + source: Optional[str] = None + output: Optional[str] = None + refs: List[Any] = field(default_factory=list) + + +@dataclass(frozen=True) +class ModuleManager: + """Service that manages bolt modules.""" + + directory: Path = extra_field() + database: CompilationDatabase = extra_field() + codegen: Dispatcher[CodegenResult] = extra_field() + + registry: Dict[TextFileBase[Any], CompiledModule] = extra_field( + default_factory=dict + ) + stack: List[CompiledModule] = extra_field(default_factory=list) + globals: JsonDict = extra_field(default_factory=dict) + builtins: Set[str] = extra_field(default_factory=set) + + @property + def path(self) -> str: + """Return the current path.""" + if not self.stack: + raise ValueError("No module currently executing.") + if path := self.stack[-1].resource_location: + return path + raise ValueError("No resource location corresponding to the current module.") + + def get( + self, + target: Optional[Union[AstRoot, str]] = None, + current: Optional[TextFileBase[Any]] = None, + ) -> CompiledModule: + """Retrieve an executable module.""" + if self.stack and not target and not current: + return self.stack[-1] + + if isinstance(target, str): + current = self.database.index[target] + elif current is None: + current = self.database.current + + module = self.registry.get(current) + compilation_unit = self.database[current] + name = compilation_unit.resource_location or "" + + if module: + if isinstance(target, AstRoot) and module.ast is not target: + logger.debug("Code generation due to ast update for module %s.", name) + else: + return module + else: + if not isinstance(target, AstRoot): + target = compilation_unit.ast + if not target: + raise UnusableCompilationUnit( + f"No ast for module {name}.", compilation_unit + ) + logger.debug("Code generation for module %s.", name) + + result = self.codegen(target) + + if result.source and result.output: + filename = ( + str(self.directory / compilation_unit.filename) + if compilation_unit.filename + else name + ) + + code = compile(result.source, filename, "exec") + + else: + code = None + + module = CompiledModule( + ast=target, + code=code, + refs=result.refs, + output=result.output, + resource_location=compilation_unit.resource_location, + globals=set(self.globals), + ) + self.registry[current] = module + + return module + + def eval(self, module: CompiledModule) -> AstRoot: + """Run the module and return the output ast.""" + if not module.executed: + module.executed = True + for hook in module.execution_hooks: + hook() + + if not module.code or not module.output: + return module.ast + if module.output in module.namespace: + return module.namespace[module.output] + + if module.executing: + raise ValueError("Import cycle detected.") + + logger.debug("Evaluate module %s.", module.resource_location or "") + + module.namespace.update(self.globals) + module.namespace["_bolt_refs"] = module.refs + module.namespace["__name__"] = module.resource_location + module.namespace["__file__"] = module.code.co_filename + + self.stack.append(module) + module.executing = True + + try: + with self.error_handler(): + exec(module.code, module.namespace) + finally: + module.executing = False + self.stack.pop() + + return module.namespace[module.output] + + @contextmanager + def error_handler(self): + """Handle errors coming from compiled modules.""" + try: + yield + except Exception as exc: + raise rewrite_traceback(exc) from None + + +@dataclass +class ModuleCacheBackend(AstCacheBackend): + """Cache backend that also restores the generated modules.""" + + bolt_version: str = import_from_string("bolt.__version__") + + modules: ModuleManager = required_field(repr=False, hash=False, compare=False) + + def load_data(self, f: BufferedReader) -> JsonDict: + data = super().load_data(f) + if data["bolt"] != self.bolt_version: + raise ValueError("Version mismatch.") + return data + + def dump_data(self, data: JsonDict, f: BufferedWriter): + data["bolt"] = self.bolt_version + super().dump_data(data, f) + + def load(self, f: BufferedReader) -> AstRoot: + data = self.load_data(f) + ast = data["ast"] + + if data["globals"] != set(self.modules.globals): + raise ValueError("Globals mismatch.") + + self.modules.registry[self.modules.database.current] = CompiledModule( + ast=ast, + code=marshal.load(f), + refs=data["refs"], + output=data["output"], + resource_location=data["resource_location"], + globals=data["globals"], + ) + + return ast + + def dump(self, node: AstRoot, f: BufferedWriter): + module = self.modules.get(node) + + self.dump_data( + { + "ast": module.ast, + "refs": module.refs, + "output": module.output, + "resource_location": module.resource_location, + "globals": module.globals, + }, + f, + ) + + marshal.dump(module.code, f) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 0d82994ce..d89157dce 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -8,6 +8,7 @@ "get_stream_branch_scope", "get_stream_macro_scope", "UndefinedIdentifier", + "ToplevelHandler", "create_bolt_root_parser", "BranchScopeManager", "check_final_expression", @@ -96,7 +97,7 @@ AstFunctionSignature, AstFunctionSignatureArgument, AstIdentifier, - AstImportedIdentifier, + AstImportedItem, AstInterpolation, AstKeyword, AstList, @@ -108,6 +109,7 @@ AstMacroMatch, AstMacroMatchArgument, AstMacroMatchLiteral, + AstModuleRoot, AstSlice, AstTarget, AstTargetAttribute, @@ -118,6 +120,7 @@ AstUnpack, AstValue, ) +from .module import Module, ModuleManager from .pattern import ( FALSE_PATTERN, IDENTIFIER_PATTERN, @@ -133,19 +136,18 @@ def get_bolt_parsers( - parsers: Dict[str, Parser], - database: CompilationDatabase, + parsers: Dict[str, Parser], modules: ModuleManager ) -> Dict[str, Parser]: """Return the bolt parsers.""" return { ################################################################################ # Command ################################################################################ - "root": create_bolt_root_parser(parsers["root"]), + "root": ToplevelHandler(create_bolt_root_parser(parsers["root"]), modules), "nested_root": create_bolt_root_parser(parsers["nested_root"]), "command": UndefinedIdentifierErrorHandler( - MacroHandler( - ImportStatementHandler(GlobalNonlocalHandler(parsers["command"])) + ImportStatementHandler( + MacroHandler(GlobalNonlocalHandler(parsers["command"])) ) ), "command:argument:bolt:if_block": delegate("bolt:if_block"), @@ -320,7 +322,7 @@ def get_bolt_parsers( parse_dict_item, ] ), - "bolt:literal": LiteralParser(database), + "bolt:literal": LiteralParser(modules.database), ################################################################################ # Interpolation ################################################################################ @@ -437,7 +439,7 @@ def __init__(self, token: Token, identifiers: Set[str]): self.identifiers = identifiers def __str__(self) -> str: - msg = f"Identifier {self.token.value!r} is not defined." + msg = f'Identifier "{self.token.value}" is not defined.' if matches := get_close_matches(self.token.value, self.identifiers): matches = [repr(m) for m in matches] @@ -453,6 +455,30 @@ def __str__(self) -> str: return msg +@dataclass +class ToplevelHandler: + """Handle toplevel root node.""" + + parser: Parser + + modules: ModuleManager + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide( + identifiers=set(self.modules.globals) + | self.modules.builtins + | {"__name__"}, + ): + node = self.parser(stream) + + if isinstance(node, AstRoot) and isinstance( + self.modules.database.current, Module + ): + node = set_location(AstModuleRoot(commands=node.commands), node) + + return node + + def create_bolt_root_parser(parser: Parser): """Return parser for the root node for bolt.""" return DecoratorResolver( @@ -845,7 +871,7 @@ def __call__(self, stream: TokenStream) -> AstRoot: for command in node.commands: if command.identifier in ["break", "continue"]: exc = InvalidSyntax( - f"Can only use {command.identifier!r} in loops." + f'Can only use "{command.identifier}" in loops.' ) raise set_location(exc, command) @@ -1146,7 +1172,7 @@ def __call__(self, stream: TokenStream) -> Any: node: AstResourceLocation = self.parser(stream) if node.is_tag or node.namespace is None and not IMPORT_REGEX.match(node.path): - exc = InvalidSyntax(f"Invalid module location {node.get_value()!r}.") + exc = InvalidSyntax(f'Invalid module location "{node.get_value()}".') raise set_location(exc, node) return node @@ -1167,23 +1193,29 @@ def __call__(self, stream: TokenStream) -> Any: if isinstance(module := node.arguments[0], AstResourceLocation): if module.namespace: exc = InvalidSyntax( - f"Can't import {module.get_value()!r} without alias." + f'Can\'t import "{module.get_value()}" without alias.' ) raise set_location(exc, module) else: identifiers.add(module.path.partition(".")[0]) + elif node.identifier == "import:module:as:alias": - if isinstance(alias := node.arguments[1], AstImportedIdentifier): - identifiers.add(alias.value) - identifiers_storage.setdefault(alias.value, "local") + if isinstance(alias := node.arguments[1], AstImportedItem): + if not alias.identifier: + exc = InvalidSyntax(f'Invalid identifier "{alias.name}".') + raise set_location(exc, alias) + identifiers.add(alias.name) + identifiers_storage.setdefault(alias.name, "local") + elif node.identifier == "from:module:import:subcommand": subcommand = cast(AstCommand, node.arguments[1]) while True: - if isinstance( - name := subcommand.arguments[0], AstImportedIdentifier - ): - identifiers.add(name.value) - identifiers_storage.setdefault(name.value, "local") + if isinstance(item := subcommand.arguments[0], AstImportedItem): + if not item.identifier: + exc = InvalidSyntax(f'Invalid identifier "{item.name}".') + raise set_location(exc, item) + identifiers.add(item.name) + identifiers_storage.setdefault(item.name, "local") if subcommand.identifier == "from:module:import:name:subcommand": subcommand = cast(AstCommand, subcommand.arguments[1]) else: @@ -1199,11 +1231,18 @@ def parse_python_import(stream: TokenStream) -> Any: return set_location(AstResourceLocation(path=token.value), token) -def parse_import_name(stream: TokenStream) -> AstImportedIdentifier: +def parse_import_name(stream: TokenStream) -> AstImportedItem: """Parse import name.""" - with stream.syntax(name=IDENTIFIER_PATTERN): - token = stream.expect("name") - return set_location(AstImportedIdentifier(value=token.value), token) + with stream.syntax(name=IDENTIFIER_PATTERN, literal=AstMacroLiteral.regex.pattern): + token = stream.get("name") + + if token: + node = AstImportedItem(name=token.value) + else: + token = stream.expect("literal") + node = AstImportedItem(name=token.value, identifier=False) + + return set_location(node, token) @dataclass @@ -1319,7 +1358,7 @@ def __call__(self, stream: TokenStream) -> AstRoot: for command in node.commands: if command.identifier in self.command_identifiers: name, _, _ = command.identifier.partition(":") - exc = InvalidSyntax(f"Can only use {name!r} in functions.") + exc = InvalidSyntax(f'Can only use "{name}" in functions.') raise set_location(exc, command) return node diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 96791db67..91b05c49f 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -1,117 +1,63 @@ __all__ = [ "Runtime", - "Module", - "CompiledModule", - "ModuleCacheBackend", - "GlobalsInjection", - "ModuleRootParser", "Evaluator", - "ModuleRootSerializer", + "check_toplevel_commands", "UnusableCompilationUnit", ] import builtins -import logging -import marshal from contextlib import contextmanager -from dataclasses import dataclass, field +from dataclasses import dataclass from importlib.resources import read_text -from io import BufferedReader, BufferedWriter -from pathlib import Path -from types import CodeType from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union -from beet import BubbleException, Context, TextFile, TextFileBase, generate_tree -from beet.core.utils import JsonDict, import_from_string, required_field +from beet import BubbleException, Context, generate_tree +from beet.core.utils import JsonDict, required_field from mecha import ( - AstCacheBackend, AstCommand, AstRoot, CommandTree, - CompilationDatabase, CompilationError, - CompilationUnit, Diagnostic, DiagnosticCollection, Dispatcher, Mecha, - MechaError, - Parser, Visitor, rule, ) -from tokenstream import TokenStream, set_location +from tokenstream import set_location from .ast import AstModuleRoot from .codegen import Codegen from .helpers import get_bolt_helpers from .loop_info import loop_info +from .module import ( + CompiledModule, + Module, + ModuleCacheBackend, + ModuleManager, + UnusableCompilationUnit, +) from .parse import get_bolt_parsers -from .utils import internal, rewrite_traceback - -logger = logging.getLogger("mecha") - - -class UnusableCompilationUnit(MechaError): - """Raised when a compilation unit lacks the necessary information to instantiate a module.""" - - message: str - compilation_unit: CompilationUnit - - def __init__(self, message: str, compilation_unit: CompilationUnit) -> None: - super().__init__(message, compilation_unit) - self.message = message - self.compilation_unit = compilation_unit - - def __str__(self) -> str: - return self.message - - -class Module(TextFile): - """Class representing a bolt module.""" - - scope = ("modules",) - extension = ".bolt" - - -@dataclass -class CompiledModule: - """Class holding the state of a compiled module.""" - - ast: AstRoot - code: Optional[CodeType] - refs: List[Any] - output: Optional[str] - resource_location: Optional[str] - globals: Set[str] - namespace: JsonDict = field(default_factory=dict) - executing: bool = False - executed: bool = False - execution_hooks: List[Callable[[], Any]] = field(default_factory=list) +from .utils import internal class Runtime: """The bolt runtime.""" - modules: Dict[TextFileBase[Any], CompiledModule] - stack: List[CompiledModule] commands: List[AstCommand] helpers: Dict[str, Any] globals: JsonDict builtins: Set[str] - directory: Path - database: CompilationDatabase - codegen: Codegen + modules: ModuleManager evaluate: Dispatcher[AstRoot] def __init__(self, ctx: Union[Context, Mecha]): - self.modules = {} - self.stack = [] self.commands = [] self.helpers = get_bolt_helpers() - self.globals = {"ctx": None, "loop_info": loop_info} + self.globals = {"_bolt_runtime": self, "ctx": None, "loop_info": loop_info} self.builtins = {name for name in dir(builtins) if not name.startswith("_")} if isinstance(ctx, Context): @@ -136,12 +82,14 @@ def __init__(self, ctx: Union[Context, Mecha]): self.expose( "generate_tree", lambda *args, **kwargs: generate_tree( - kwargs.pop("root") if "root" in kwargs else self.get_path(), + root := kwargs.pop("root") + if "root" in kwargs + else self.modules.path, *args, name=( kwargs.pop("name") if "name" in kwargs - else ctx.generate["tree"][self.get_path()].format("tree_{incr}") + else ctx.generate["tree"][root].format("tree_{incr}") ), **kwargs, ), @@ -152,132 +100,31 @@ def __init__(self, ctx: Union[Context, Mecha]): else: mc = ctx - mc.cache_backend = ModuleCacheBackend(runtime=self) - - commands_json = read_text("bolt.resources", "commands.json") - mc.spec.add_commands(CommandTree.parse_raw(commands_json)) - mc.spec.parsers.update(get_bolt_parsers(mc.spec.parsers, mc.database)) - mc.spec.parsers["root"] = GlobalsInjection( - runtime=self, - parser=ModuleRootParser(mc.database, mc.spec.parsers["root"]), + self.modules = ModuleManager( + directory=mc.directory, + database=mc.database, + codegen=Codegen(), + globals=self.globals, + builtins=self.builtins, ) + self.evaluate = Evaluator(modules=self.modules) + mc.providers.append(Module) - self.directory = mc.directory - self.database = mc.database - self.codegen = Codegen() + commands_json = read_text("bolt.resources", "commands.json") + mc.spec.add_commands(CommandTree.parse_raw(commands_json)) + mc.spec.parsers.update(get_bolt_parsers(mc.spec.parsers, self.modules)) - self.evaluate = Evaluator(runtime=self) mc.steps.insert(0, self.evaluate) - mc.serialize.extend(ModuleRootSerializer()) - - def get_path(self) -> str: - """Return the current path.""" - if not self.stack: - raise ValueError("No module currently executing.") - if path := self.stack[-1].resource_location: - return path - raise ValueError("No resource location corresponding to the current module.") + mc.serialize.extend(check_toplevel_commands) + mc.cache_backend = ModuleCacheBackend(modules=self.modules) def expose(self, name: str, function: Callable[..., Any]): """Expose a utility function.""" self.globals[name] = lambda *args, **kwargs: function(*args, **kwargs) # type: ignore - def get_module( - self, - target: Optional[Union[AstRoot, str]] = None, - current: Optional[TextFileBase[Any]] = None, - ) -> CompiledModule: - """Retrieve an executable module.""" - if self.stack and not target and not current: - return self.stack[-1] - - if isinstance(target, str): - current = self.database.index[target] - elif current is None: - current = self.database.current - - module = self.modules.get(current) - compilation_unit = self.database[current] - name = compilation_unit.resource_location or "" - - if module: - if isinstance(target, AstRoot) and module.ast is not target: - logger.debug("Code generation due to ast update for module %s.", name) - else: - return module - else: - if not isinstance(target, AstRoot): - target = compilation_unit.ast - if not target: - raise UnusableCompilationUnit( - f"No ast for module {name}.", compilation_unit - ) - logger.debug("Code generation for module %s.", name) - - source, output, refs = self.codegen(target) - - if source and output: - filename = ( - str(self.directory / compilation_unit.filename) - if compilation_unit.filename - else name - ) - - code = compile(source, filename, "exec") - - else: - code = None - - module = CompiledModule( - ast=target, - code=code, - refs=refs, - output=output, - resource_location=compilation_unit.resource_location, - globals=set(self.globals), - ) - self.modules[current] = module - - return module - - def get_output(self, module: CompiledModule) -> AstRoot: - """Run the module and return the output ast.""" - if not module.executed: - module.executed = True - for hook in module.execution_hooks: - hook() - - if not module.code or not module.output: - return module.ast - if module.output in module.namespace: - return module.namespace[module.output] - - if module.executing: - raise ValueError("Import cycle detected.") - - logger.debug("Evaluate module %s.", module.resource_location or "") - - module.namespace.update(self.globals) - module.namespace["_bolt_runtime"] = self - module.namespace["_bolt_refs"] = module.refs - module.namespace["__name__"] = module.resource_location - module.namespace["__file__"] = module.code.co_filename - - self.stack.append(module) - module.executing = True - - try: - with self.error_handler(): - exec(module.code, module.namespace) - finally: - module.executing = False - self.stack.pop() - - return module.namespace[module.output] - @contextmanager def scope( self, @@ -295,24 +142,16 @@ def scope( finally: self.commands = previous_commands - @contextmanager - def error_handler(self): - """Handle errors coming from compiled modules.""" - try: - yield - except Exception as exc: - raise rewrite_traceback(exc) from None - @internal def import_module(self, resource_location: str) -> CompiledModule: """Import module.""" try: - module = self.get_module(resource_location) + module = self.modules.get(resource_location) except KeyError: msg = f'Couldn\'t import "{resource_location}".' raise ImportError(msg) from None if not module.executing: - self.get_output(module) + self.modules.eval(module) return module @internal @@ -332,99 +171,17 @@ def finalize(self, ctx: Context): ctx.data[Module].clear() -@dataclass -class ModuleCacheBackend(AstCacheBackend): - """Cache backend that also restores the generated modules.""" - - runtime: Runtime = required_field() - bolt_version: str = import_from_string("bolt.__version__") - - def load_data(self, f: BufferedReader) -> JsonDict: - data = super().load_data(f) - if data["bolt"] != self.bolt_version: - raise ValueError("Version mismatch.") - return data - - def dump_data(self, data: JsonDict, f: BufferedWriter): - data["bolt"] = self.bolt_version - super().dump_data(data, f) - - def load(self, f: BufferedReader) -> AstRoot: - data = self.load_data(f) - ast = data["ast"] - - if data["globals"] != set(self.runtime.globals): - raise ValueError("Globals mismatch.") - - self.runtime.modules[self.runtime.database.current] = CompiledModule( - ast=ast, - code=marshal.load(f), - refs=data["refs"], - output=data["output"], - resource_location=data["resource_location"], - globals=data["globals"], - ) - - return ast - - def dump(self, node: AstRoot, f: BufferedWriter): - module = self.runtime.get_module(node) - - self.dump_data( - { - "ast": module.ast, - "refs": module.refs, - "output": module.output, - "resource_location": module.resource_location, - "globals": module.globals, - }, - f, - ) - - marshal.dump(module.code, f) - - -@dataclass -class GlobalsInjection: - """Inject global identifiers.""" - - runtime: Runtime - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - with stream.provide( - identifiers=set(self.runtime.globals) - | self.runtime.builtins - | {"__name__"}, - ): - return self.parser(stream) - - -@dataclass -class ModuleRootParser: - """Parser for module root.""" - - database: CompilationDatabase - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - node = self.parser(stream) - if isinstance(node, AstRoot) and isinstance(self.database.current, Module): - node = set_location(AstModuleRoot(commands=node.commands), node) - return node - - @dataclass class Evaluator(Visitor): """Visitor that evaluates modules.""" - runtime: Runtime = required_field() + modules: ModuleManager = required_field() @rule(AstRoot) def root(self, node: AstRoot) -> AstRoot: - module = self.runtime.get_module(node) + module = self.modules.get(node) try: - return self.runtime.get_output(module) + return self.modules.eval(module) except BubbleException: raise except UnusableCompilationUnit as exc: @@ -439,16 +196,14 @@ def root(self, node: AstRoot) -> AstRoot: raise CompilationError(msg) from exc.with_traceback(tb) -class ModuleRootSerializer(Visitor): - """Serializer for checking that modules don't emit any commands.""" - - @rule(AstModuleRoot) - def module_root(self, node: AstModuleRoot, result: List[str]): - if node.commands: - command = node.commands[0] - name = command.identifier.partition(":")[0] - raise set_location( - Diagnostic("warn", f'Standalone "{name}" command in module.'), - command, - command.arguments[0] if command.arguments else command, - ) +@rule(AstModuleRoot) +def check_toplevel_commands(node: AstModuleRoot, result: List[str]): + """Emit diagnostic if module has toplevel commands.""" + if node.commands: + command = node.commands[0] + name = command.identifier.partition(":")[0] + raise set_location( + Diagnostic("warn", f'Standalone "{name}" command in module.'), + command, + command.arguments[0] if command.arguments else command, + ) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction index 474e599d1..ab181392b 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction @@ -8,9 +8,9 @@ def callback(): return foo def loga(f): - runtime.get_module().namespace["bar"] *= 2 + runtime.modules.get().namespace["bar"] *= 2 say __name__ - say runtime.get_path() + say runtime.modules.path say f() from ./import_b import logb diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction index 43ef2bf91..abcb53750 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction @@ -8,9 +8,9 @@ def callback(): return bar def logb(f): - runtime.get_module().namespace["foo"] *= 2 + runtime.modules.get().namespace["foo"] *= 2 say __name__ - say runtime.get_path() + say runtime.modules.path say f() from ./import_a import loga diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction index 3a7f3e18e..f48104d91 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction @@ -9,7 +9,7 @@ def do_stuff(a, b): return a + math.cos(b) def call_recursive(): - if score @s loop_again matches 1 function runtime.get_path() + if score @s loop_again matches 1 function runtime.modules.path def raw(cmd): runtime.commands.append(mc.parse(cmd, using="command")) diff --git a/packages/bolt/tests/snapshots/bolt__parse_119__0.txt b/packages/bolt/tests/snapshots/bolt__parse_119__0.txt index 566664cc2..8d35fc811 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_119__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_119__0.txt @@ -1,5 +1,5 @@ if True: -#>ERROR Can only use 'yield' in functions. +#>ERROR Can only use "yield" in functions. # line 2, column 5 # 1 | if True: # 2 | yield diff --git a/packages/bolt/tests/snapshots/bolt__parse_121__0.txt b/packages/bolt/tests/snapshots/bolt__parse_121__0.txt index 078fdc525..c55f968cb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_121__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_121__0.txt @@ -1,4 +1,4 @@ -#>ERROR Can't import 'demo:foo' without alias. +#>ERROR Can't import "demo:foo" without alias. # line 1, column 8 # 1 | import demo:foo # : ^^^^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_123__0.txt b/packages/bolt/tests/snapshots/bolt__parse_123__0.txt index 0f6473b28..794567059 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_123__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_123__0.txt @@ -1,4 +1,4 @@ -#>ERROR Invalid module location 'wat/is/that'. +#>ERROR Invalid module location "wat/is/that". # line 1, column 8 # 1 | import wat/is/that # : ^^^^^^^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_124__0.txt b/packages/bolt/tests/snapshots/bolt__parse_124__0.txt index 846353f25..e4db5c4a9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_124__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_124__0.txt @@ -1,4 +1,4 @@ -#>ERROR Invalid module location 'wat/is/that'. +#>ERROR Invalid module location "wat/is/that". # line 1, column 6 # 1 | from wat/is/that import foo # : ^^^^^^^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_125__0.txt b/packages/bolt/tests/snapshots/bolt__parse_125__0.txt index 2a9b6d942..69d92bb61 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_125__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_125__0.txt @@ -1,5 +1,5 @@ import math -#>ERROR Identifier 'mah' is not defined. +#>ERROR Identifier "mah" is not defined. # line 2, column 1 # 1 | import math # 2 | mah.sin(1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_127__0.txt b/packages/bolt/tests/snapshots/bolt__parse_127__0.txt index 494600590..ac64c9ce1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_127__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_127__0.txt @@ -16,10 +16,11 @@ m.sin(1) is_tag: False namespace: None path: 'math' - + location: SourceLocation(pos=15, lineno=1, colno=16) end_location: SourceLocation(pos=16, lineno=1, colno=17) - value: 'm' + name: 'm' + identifier: True location: SourceLocation(pos=17, lineno=2, colno=1) end_location: SourceLocation(pos=25, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt index 4a316d77a..5ad9f7da3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt @@ -21,10 +21,11 @@ say thing end_location: SourceLocation(pos=26, lineno=1, colno=27) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=26, lineno=1, colno=27) - value: 'thing' + name: 'thing' + identifier: True location: SourceLocation(pos=27, lineno=2, colno=1) end_location: SourceLocation(pos=36, lineno=2, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt index 96e3eb41c..8a5d54338 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt @@ -39,28 +39,31 @@ say a end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - + location: SourceLocation(pos=34, lineno=2, colno=26) end_location: SourceLocation(pos=35, lineno=2, colno=27) - value: 'a' + name: 'a' + identifier: True location: SourceLocation(pos=36, lineno=2, colno=28) end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:name:subcommand' arguments: - + location: SourceLocation(pos=36, lineno=2, colno=28) end_location: SourceLocation(pos=37, lineno=2, colno=29) - value: 'b' + name: 'b' + identifier: True location: SourceLocation(pos=38, lineno=2, colno=30) end_location: SourceLocation(pos=39, lineno=2, colno=31) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=38, lineno=2, colno=30) end_location: SourceLocation(pos=39, lineno=2, colno=31) - value: 'c' + name: 'c' + identifier: True location: SourceLocation(pos=40, lineno=3, colno=1) end_location: SourceLocation(pos=45, lineno=3, colno=6) diff --git a/packages/bolt/tests/snapshots/bolt__parse_158__0.txt b/packages/bolt/tests/snapshots/bolt__parse_158__0.txt index 401fcb9da..9410c68b5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_158__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_158__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 1 # 1 | foo.bar = 1 # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_159__0.txt b/packages/bolt/tests/snapshots/bolt__parse_159__0.txt index 2335ef90f..7b0c654a0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_159__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_159__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 1 # 1 | foo().bar = 1 # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_187__0.txt b/packages/bolt/tests/snapshots/bolt__parse_187__0.txt index 4e7539714..3ad6f1327 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_187__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_187__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'x' is not defined. +#>ERROR Identifier "x" is not defined. # line 1, column 8 # 1 | global x # : ^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_189__0.txt b/packages/bolt/tests/snapshots/bolt__parse_189__0.txt index ae12658e3..3eea35065 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_189__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_189__0.txt @@ -1,6 +1,6 @@ x = 1 def f(): -#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? +#>ERROR Identifier "xx" is not defined. Did you mean 'x'? # line 3, column 12 # 2 | def f(): # 3 | global xx diff --git a/packages/bolt/tests/snapshots/bolt__parse_195__0.txt b/packages/bolt/tests/snapshots/bolt__parse_195__0.txt index 47b76fd5c..e60aee050 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_195__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_195__0.txt @@ -1,5 +1,5 @@ for i in range(3): -#>ERROR Identifier 'parent' is not defined. +#>ERROR Identifier "parent" is not defined. # line 2, column 5 # 1 | for i in range(3): # 2 | parent[i] = f"param{i}" diff --git a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt index 18b0724fe..1d605bf29 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt @@ -1,6 +1,6 @@ a = 1 def f(): -#>ERROR Identifier 'a' is not defined. +#>ERROR Identifier "a" is not defined. # line 3, column 5 # 2 | def f(): # 3 | a += 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_208__0.txt b/packages/bolt/tests/snapshots/bolt__parse_208__0.txt index 6ead39115..ff5159e16 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_208__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_208__0.txt @@ -20,7 +20,8 @@ from PIL import Image end_location: SourceLocation(pos=21, lineno=1, colno=22) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=21, lineno=1, colno=22) - value: 'Image' + name: 'Image' + identifier: True diff --git a/packages/bolt/tests/snapshots/bolt__parse_209__0.txt b/packages/bolt/tests/snapshots/bolt__parse_209__0.txt index cfc970f42..5630a1b63 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_209__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_209__0.txt @@ -20,7 +20,8 @@ from PIL.Image import Image end_location: SourceLocation(pos=27, lineno=1, colno=28) identifier: 'from:module:import:name' arguments: - + location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=27, lineno=1, colno=28) - value: 'Image' + name: 'Image' + identifier: True diff --git a/packages/bolt/tests/snapshots/bolt__parse_222__0.txt b/packages/bolt/tests/snapshots/bolt__parse_222__0.txt index 6e4ec88ee..056c0aa75 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_222__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_222__0.txt @@ -2,7 +2,7 @@ def thing(): macro bar: pass bar -#>ERROR Identifier 'bar' is not defined. +#>ERROR Identifier "bar" is not defined. # line 5, column 1 # 3 | pass # 4 | bar diff --git a/packages/bolt/tests/snapshots/bolt__parse_223__0.txt b/packages/bolt/tests/snapshots/bolt__parse_223__0.txt index 4fca1ef1b..0a461f863 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_223__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_223__0.txt @@ -3,7 +3,7 @@ macro foo: foo bar def thing(): -#>ERROR Identifier 'bar' is not defined. +#>ERROR Identifier "bar" is not defined. # line 6, column 5 # 5 | def thing(): # 6 | bar diff --git a/packages/bolt/tests/snapshots/bolt__parse_30__0.txt b/packages/bolt/tests/snapshots/bolt__parse_30__0.txt index 388d21465..1a1bbbd88 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_30__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_30__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 1 # 1 | foo # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_31__0.txt b/packages/bolt/tests/snapshots/bolt__parse_31__0.txt index a9a51d480..c101ef99e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_31__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_31__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 11 # 1 | "hello" + foo # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_52__0.txt b/packages/bolt/tests/snapshots/bolt__parse_52__0.txt index 27f7819c1..0827cfca7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_52__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_52__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 7 # 1 | foo = foo # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_54__0.txt b/packages/bolt/tests/snapshots/bolt__parse_54__0.txt index 9dc998ba7..0b79c6900 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_54__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_54__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 12 # 1 | for foo in foo: # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_56__0.txt b/packages/bolt/tests/snapshots/bolt__parse_56__0.txt index 1d4f62438..46de59111 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_56__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_56__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 1 # 1 | foo += "hey" # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt index 428e86669..f3707feb9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'the' is not defined. Did you mean 'hex'? +#>ERROR Identifier "the" is not defined. Did you mean 'hex'? # line 1, column 7 # 1 | wat = the = "f" # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_59__0.txt b/packages/bolt/tests/snapshots/bolt__parse_59__0.txt index 881a78c30..ee3218944 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_59__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_59__0.txt @@ -1,4 +1,4 @@ -#>ERROR Can only use 'break' in loops. +#>ERROR Can only use "break" in loops. # line 1, column 1 # 1 | break # : ^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_60__0.txt b/packages/bolt/tests/snapshots/bolt__parse_60__0.txt index a2e2bba79..bc64fe012 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_60__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_60__0.txt @@ -1,4 +1,4 @@ -#>ERROR Can only use 'continue' in loops. +#>ERROR Can only use "continue" in loops. # line 1, column 1 # 1 | continue # : ^^^^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_61__0.txt b/packages/bolt/tests/snapshots/bolt__parse_61__0.txt index b4c290a84..591ca44db 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_61__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_61__0.txt @@ -1,5 +1,5 @@ if true: -#>ERROR Can only use 'break' in loops. +#>ERROR Can only use "break" in loops. # line 2, column 5 # 1 | if true: # 2 | break diff --git a/packages/bolt/tests/snapshots/bolt__parse_76__0.txt b/packages/bolt/tests/snapshots/bolt__parse_76__0.txt index 55fc54fed..5424c21e0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_76__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_76__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'a' is not defined. +#>ERROR Identifier "a" is not defined. # line 1, column 9 # 1 | def f(a=a): # : ^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_78__0.txt b/packages/bolt/tests/snapshots/bolt__parse_78__0.txt index 0424f5b36..dda5a1648 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_78__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_78__0.txt @@ -2,7 +2,7 @@ def f(a, b): def g(c): a + b c -#>ERROR Identifier 'g' is not defined. +#>ERROR Identifier "g" is not defined. # line 5, column 1 # 3 | a + b # 4 | c diff --git a/packages/bolt/tests/snapshots/bolt__parse_79__0.txt b/packages/bolt/tests/snapshots/bolt__parse_79__0.txt index e692a356f..d2d3e9bf8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_79__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_79__0.txt @@ -1,7 +1,7 @@ def f(a, b): def g(c): a + b -#>ERROR Identifier 'c' is not defined. +#>ERROR Identifier "c" is not defined. # line 4, column 7 # 3 | a + b # 4 | f(c) diff --git a/packages/bolt/tests/snapshots/bolt__parse_80__0.txt b/packages/bolt/tests/snapshots/bolt__parse_80__0.txt index ef7d69339..c4b834eb1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_80__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_80__0.txt @@ -7,7 +7,7 @@ def foo(something): dat # this is a comment x = "hello" -#>ERROR Identifier 'somehng' is not defined. Did you mean 'something'? +#>ERROR Identifier "somehng" is not defined. Did you mean 'something'? # line 10, column 18 # 9 | x = "hello" # 10 | for i in somehng: diff --git a/packages/bolt/tests/snapshots/bolt__parse_83__0.txt b/packages/bolt/tests/snapshots/bolt__parse_83__0.txt index 1e085b412..b6378ca41 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_83__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_83__0.txt @@ -1,7 +1,7 @@ def foo(): bar() + thing def bar(): -#>ERROR Identifier 'thin' is not defined. Did you mean 'thing'? +#>ERROR Identifier "thin" is not defined. Did you mean 'thing'? # line 4, column 13 # 3 | def bar(): # 4 | foo() + thin diff --git a/packages/bolt/tests/snapshots/bolt__parse_85__0.txt b/packages/bolt/tests/snapshots/bolt__parse_85__0.txt index 7ae67654b..af54fde1a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_85__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_85__0.txt @@ -1,4 +1,4 @@ -#>ERROR Can only use 'return' in functions. +#>ERROR Can only use "return" in functions. # line 1, column 1 # 1 | return "hello" # : ^^^^^^^^^^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_86__0.txt b/packages/bolt/tests/snapshots/bolt__parse_86__0.txt index 773e7171f..09a3361d7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_86__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_86__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 1, column 8 # 1 | return foo # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_88__0.txt b/packages/bolt/tests/snapshots/bolt__parse_88__0.txt index 8959523ff..fab349863 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_88__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_88__0.txt @@ -1,6 +1,6 @@ def f(): foo = 0 -#>ERROR Identifier 'foo' is not defined. +#>ERROR Identifier "foo" is not defined. # line 3, column 3 # 2 | foo = 0 # 3 | f(foo) diff --git a/packages/bolt/tests/snapshots/bolt__parse_90__0.txt b/packages/bolt/tests/snapshots/bolt__parse_90__0.txt index 0292421c9..cea53168e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_90__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_90__0.txt @@ -1,5 +1,5 @@ def f(x): -#>ERROR Identifier 'xx' is not defined. Did you mean 'x'? +#>ERROR Identifier "xx" is not defined. Did you mean 'x'? # line 2, column 16 # 1 | def f(x): # 2 | tellraw @a xx diff --git a/packages/bolt/tests/snapshots/sandbox__run_8__0.txt b/packages/bolt/tests/snapshots/sandbox__run_8__0.txt index f9e4b1aa4..e28f15f27 100644 --- a/packages/bolt/tests/snapshots/sandbox__run_8__0.txt +++ b/packages/bolt/tests/snapshots/sandbox__run_8__0.txt @@ -2,4 +2,4 @@ open("/etc/passwd") --- Reported 1 error. -File "demo:foo", line 1, column 1: Identifier 'open' is not defined. \ No newline at end of file +File "demo:foo", line 1, column 1: Identifier "open" is not defined. \ No newline at end of file diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py index f90e608bf..fced7b7ab 100644 --- a/packages/bolt/tests/test_bolt.py +++ b/packages/bolt/tests/test_bolt.py @@ -35,11 +35,11 @@ def test_parse(snapshot: SnapshotFixture, ctx: Context, source: Function): if ast: assert snapshot() == f"{source.text}---\n{ast.dump()}\n" - text, output, refs = runtime.codegen(ast) - text = text or "# Nothing\n" - assert snapshot() == f"{text}---\noutput = {output}\n---\n" + "".join( + result = runtime.modules.codegen(ast) + text = result.source or "# Nothing\n" + assert snapshot() == f"{text}---\noutput = {result.output}\n---\n" + "".join( f"_bolt_refs[{i}]\n{obj.dump(shallow=True) if isinstance(obj, AstNode) else repr(obj)}\n" - for i, obj in enumerate(refs) + for i, obj in enumerate(result.refs) ) elif diagnostics: database = CompilationDatabase() From a600c7c703578d015eef3002ff9fb252423b5f35 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 10 Jul 2022 03:54:52 +0200 Subject: [PATCH 0934/1554] feat: turn module manager into a mapping --- packages/bolt/bolt/contrib/lazy.py | 2 +- packages/bolt/bolt/module.py | 93 +++++++++++-------- packages/bolt/bolt/runtime.py | 12 ++- .../data/demo/functions/import_a.mcfunction | 4 +- .../data/demo/functions/import_b.mcfunction | 4 +- .../src/data/demo/functions/thing.mcfunction | 2 +- 6 files changed, 68 insertions(+), 49 deletions(-) diff --git a/packages/bolt/bolt/contrib/lazy.py b/packages/bolt/bolt/contrib/lazy.py index 27a96ca77..10a17bbcd 100644 --- a/packages/bolt/bolt/contrib/lazy.py +++ b/packages/bolt/bolt/contrib/lazy.py @@ -75,7 +75,7 @@ class LazyFilter(Visitor): @rule(AstModuleRoot) def lazy_module(self, node: AstModuleRoot): - module = self.modules.get(node) + module = self.modules.for_current_ast(node) if module.resource_location and self.lazy.check(module.resource_location): module.execution_hooks.append( partial( diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index eb0e986ac..f7c64ec22 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -15,7 +15,7 @@ from io import BufferedReader, BufferedWriter from pathlib import Path from types import CodeType -from typing import Any, Callable, Dict, List, Optional, Set, Union +from typing import Any, Callable, Dict, Iterator, List, Mapping, Optional, Set, Union from beet import TextFile, TextFileBase from beet.core.utils import JsonDict, extra_field, import_from_string, required_field @@ -79,8 +79,8 @@ class CodegenResult: @dataclass(frozen=True) -class ModuleManager: - """Service that manages bolt modules.""" +class ModuleManager(Mapping[TextFileBase[Any], CompiledModule]): + """Container for managing bolt modules.""" directory: Path = extra_field() database: CompilationDatabase = extra_field() @@ -94,47 +94,58 @@ class ModuleManager: builtins: Set[str] = extra_field(default_factory=set) @property - def path(self) -> str: - """Return the current path.""" + def current(self) -> CompiledModule: + """Return the currently executing module.""" + if not self.stack: + raise ValueError("No module currently executing.") + return self.stack[-1] + + @property + def current_path(self) -> str: + """Return the path corresponding to the currently executing module.""" if not self.stack: raise ValueError("No module currently executing.") if path := self.stack[-1].resource_location: return path - raise ValueError("No resource location corresponding to the current module.") - - def get( - self, - target: Optional[Union[AstRoot, str]] = None, - current: Optional[TextFileBase[Any]] = None, - ) -> CompiledModule: - """Retrieve an executable module.""" - if self.stack and not target and not current: - return self.stack[-1] - - if isinstance(target, str): - current = self.database.index[target] - elif current is None: - current = self.database.current - - module = self.registry.get(current) + raise ValueError( + "Currently executing module has no associated resource location." + ) + + def for_current_ast(self, node: AstRoot) -> CompiledModule: + """Return executable module for the current ast.""" + current = self.database.current + compilation_unit = self.database[current] name = compilation_unit.resource_location or "" - if module: - if isinstance(target, AstRoot) and module.ast is not target: - logger.debug("Code generation due to ast update for module %s.", name) - else: + if module := self.registry.get(current): + if module.ast is node: return module - else: - if not isinstance(target, AstRoot): - target = compilation_unit.ast - if not target: - raise UnusableCompilationUnit( - f"No ast for module {name}.", compilation_unit - ) - logger.debug("Code generation for module %s.", name) + logger.debug('Evict stale module "%s" due to ast update.', name) + del self.registry[current] + + compilation_unit.ast = node + return self[current] + + def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: + if isinstance(current, str): + current = self.database.index[current] - result = self.codegen(target) + if module := self.registry.get(current): + return module + + compilation_unit = self.database[current] + node = compilation_unit.ast + name = compilation_unit.resource_location or "" + + if not node: + raise UnusableCompilationUnit( + f"No ast for module {name}.", compilation_unit + ) + + logger.debug('Code generation for module "%s".', name) + + result = self.codegen(node) if result.source and result.output: filename = ( @@ -149,7 +160,7 @@ def get( code = None module = CompiledModule( - ast=target, + ast=node, code=code, refs=result.refs, output=result.output, @@ -160,6 +171,12 @@ def get( return module + def __iter__(self) -> Iterator[TextFileBase[Any]]: + return iter(self.database) + + def __len__(self) -> int: + return len(self.database) + def eval(self, module: CompiledModule) -> AstRoot: """Run the module and return the output ast.""" if not module.executed: @@ -175,7 +192,7 @@ def eval(self, module: CompiledModule) -> AstRoot: if module.executing: raise ValueError("Import cycle detected.") - logger.debug("Evaluate module %s.", module.resource_location or "") + logger.debug('Evaluate module "%s".', module.resource_location or "") module.namespace.update(self.globals) module.namespace["_bolt_refs"] = module.refs @@ -240,7 +257,7 @@ def load(self, f: BufferedReader) -> AstRoot: return ast def dump(self, node: AstRoot, f: BufferedWriter): - module = self.modules.get(node) + module = self.modules.for_current_ast(node) self.dump_data( { diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 91b05c49f..907e4dd77 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -82,9 +82,11 @@ def __init__(self, ctx: Union[Context, Mecha]): self.expose( "generate_tree", lambda *args, **kwargs: generate_tree( - root := kwargs.pop("root") - if "root" in kwargs - else self.modules.path, + ( + root := kwargs.pop("root") + if "root" in kwargs + else self.modules.current_path + ), *args, name=( kwargs.pop("name") @@ -146,7 +148,7 @@ def scope( def import_module(self, resource_location: str) -> CompiledModule: """Import module.""" try: - module = self.modules.get(resource_location) + module = self.modules[resource_location] except KeyError: msg = f'Couldn\'t import "{resource_location}".' raise ImportError(msg) from None @@ -179,7 +181,7 @@ class Evaluator(Visitor): @rule(AstRoot) def root(self, node: AstRoot) -> AstRoot: - module = self.modules.get(node) + module = self.modules.for_current_ast(node) try: return self.modules.eval(module) except BubbleException: diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction index ab181392b..05054aabf 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_a.mcfunction @@ -8,9 +8,9 @@ def callback(): return foo def loga(f): - runtime.modules.get().namespace["bar"] *= 2 + runtime.modules.current.namespace["bar"] *= 2 say __name__ - say runtime.modules.path + say runtime.modules.current_path say f() from ./import_b import logb diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction index abcb53750..a45182afb 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/import_b.mcfunction @@ -8,9 +8,9 @@ def callback(): return bar def logb(f): - runtime.modules.get().namespace["foo"] *= 2 + runtime.modules.current.namespace["foo"] *= 2 say __name__ - say runtime.modules.path + say runtime.modules.current_path say f() from ./import_a import loga diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction index f48104d91..31069cc02 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/thing.mcfunction @@ -9,7 +9,7 @@ def do_stuff(a, b): return a + math.cos(b) def call_recursive(): - if score @s loop_again matches 1 function runtime.modules.path + if score @s loop_again matches 1 function runtime.modules.current_path def raw(cmd): runtime.commands.append(mc.parse(cmd, using="command")) From 9f9b213181cb7e059631baacc54922c48ae12d35 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 10 Jul 2022 01:55:44 +0000 Subject: [PATCH 0935/1554] 0.11.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 6 ++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index bb19881d2..a6ced140a 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,12 @@ +## v0.11.0 (2022-07-10) +### Feature +* Turn module manager into a mapping ([`3c486eb`](https://github.com/mcbeet/bolt/commit/3c486eb6d9ce6c9a47ec16c14342fa98db6fbfd7)) +* Extract module manager from runtime ([`20e7499`](https://github.com/mcbeet/bolt/commit/20e74995ab2b44505a494e352f94d1c756ba0ec6)) +* Make it possible to run the lazy plugin multiple times ([`87df070`](https://github.com/mcbeet/bolt/commit/87df070d2f528a95c06b14fb2a8b3e019e80651c)) + ## v0.10.0 (2022-07-09) ### Feature * Working macro and tests ([`a0ddfba`](https://github.com/mcbeet/bolt/commit/a0ddfbab5a46b173ec8a0bd46f8e78c76a098c85)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index ebc087422..47c8bcebc 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.10.0" +__version__ = "0.11.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 77fa36a15..d61be1fe8 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.10.0" +version = "0.11.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 26d5b2405423f781f6728be36d6458ba1ea23696 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 13 Jul 2022 02:50:12 +0200 Subject: [PATCH 0936/1554] feat: add macro imports --- packages/bolt/bolt/ast.py | 17 ++ packages/bolt/bolt/codegen.py | 103 ++++++--- packages/bolt/bolt/contrib/lazy.py | 2 +- packages/bolt/bolt/module.py | 177 +++++++++++---- packages/bolt/bolt/parse.py | 206 ++++++++++-------- packages/bolt/bolt/runtime.py | 4 +- packages/bolt/bolt/utils.py | 17 +- .../src/data/demo/functions/bar.mcfunction | 29 +++ .../src/data/demo/functions/foo.mcfunction | 7 + .../tests/snapshots/bolt__parse_128__0.txt | 15 +- .../tests/snapshots/bolt__parse_128__1.txt | 2 +- .../tests/snapshots/bolt__parse_129__0.txt | 45 ++-- .../tests/snapshots/bolt__parse_189__0.txt | 2 +- .../tests/snapshots/bolt__parse_208__0.txt | 15 +- .../tests/snapshots/bolt__parse_208__1.txt | 5 +- .../tests/snapshots/bolt__parse_209__0.txt | 15 +- .../tests/snapshots/bolt__parse_209__1.txt | 5 +- .../tests/snapshots/bolt__parse_58__0.txt | 2 +- .../tests/snapshots/bolt__parse_80__0.txt | 2 +- .../tests/snapshots/bolt__parse_83__0.txt | 2 +- .../tests/snapshots/bolt__parse_90__0.txt | 2 +- .../examples__build_bolt_macro__0.pack.md | 36 +++ 22 files changed, 474 insertions(+), 236 deletions(-) create mode 100644 packages/bolt/examples/bolt_macro/src/data/demo/functions/bar.mcfunction diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 0c728f810..be556f73e 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -34,7 +34,9 @@ "AstMacroMatchLiteral", "AstMacroMatchArgument", "AstInterpolation", + "AstFromImport", "AstImportedItem", + "AstImportedMacro", ] @@ -319,9 +321,24 @@ class AstInterpolation(AstNode): value: AstExpression = required_field() +@dataclass(frozen=True) +class AstFromImport(AstCommand): + """Ast from import node.""" + + identifier: str = "" + + @dataclass(frozen=True) class AstImportedItem(AstNode): """Ast imported item node.""" name: str = required_field() identifier: bool = True + + +@dataclass(frozen=True) +class AstImportedMacro(AstNode): + """Ast imported macro node.""" + + name: str = required_field() + declaration: AstMacro = required_field() diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index a34c37ef6..7373bf95d 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -13,7 +13,7 @@ from contextlib import contextmanager -from dataclasses import dataclass, field, fields +from dataclasses import dataclass, field, fields, replace from typing import ( Any, Dict, @@ -24,6 +24,7 @@ Optional, Tuple, Type, + Union, cast, overload, ) @@ -47,9 +48,11 @@ AstExpressionBinary, AstExpressionUnary, AstFormatString, + AstFromImport, AstFunctionSignature, AstIdentifier, AstImportedItem, + AstImportedMacro, AstInterpolation, AstKeyword, AstList, @@ -67,7 +70,7 @@ AstUnpack, AstValue, ) -from .module import CodegenResult +from .module import CodegenResult, MacroLibrary @dataclass @@ -76,6 +79,7 @@ class Accumulator: indentation: str = "" refs: List[Any] = field(default_factory=list) + macros: MacroLibrary = field(default_factory=dict) macro_ids: Dict[str, int] = field(default_factory=dict) lines: List[str] = field(default_factory=list) counter: int = 0 @@ -156,6 +160,23 @@ def make_variable(self) -> str: self.counter += 1 return name + def make_macro(self, node: AstMacro) -> str: + """Add macro to macro library.""" + macro = self.get_macro(node.identifier) + group = node.identifier.partition(":")[0] + self.macros.setdefault(group, {})[macro, node] = None + return macro + + def import_macro(self, resource_location: str, node: AstImportedMacro) -> str: + """Import macro into macro library.""" + macro = self.get_macro(node.declaration.identifier) + group = node.declaration.identifier.partition(":")[0] + self.macros.setdefault(group, {})[macro, node.declaration] = ( + resource_location, + node.name, + ) + return macro + def get_macro(self, name: str) -> str: """Get macro.""" if name not in self.macro_ids: @@ -189,7 +210,10 @@ def function(self, name: str, *args: str): """Emit function.""" self.statement(f"def {name}({', '.join(args)}):") with self.block(): + previous_macros = self.macros + self.macros = {k: dict(v) for k, v in self.macros.items()} yield + self.macros = previous_macros @contextmanager def if_statement(self, condition: str): @@ -412,15 +436,24 @@ class Codegen(Visitor): def __call__(self, node: AstRoot) -> CodegenResult: # type: ignore acc = Accumulator() result = self.invoke(node, acc) + if result is None: - return CodegenResult(refs=acc.refs) - elif len(result) != 1: + return CodegenResult() + + if len(result) != 1: raise ValueError( f"Expected single result for {node.__class__.__name__} {result!r}." ) + output = acc.make_variable() acc.statement(f"{output} = {result[0]}") - return CodegenResult(source=acc.get_source(), output=output, refs=acc.refs) + + return CodegenResult( + source=acc.get_source(), + output=output, + refs=acc.refs, + macros=acc.macros, + ) @rule(AstNode) def fallback( @@ -524,7 +557,9 @@ def macro( node: AstMacro, acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - macro = acc.get_macro(node.identifier) + macro = acc.make_macro( + replace(node, arguments=AstChildren(node.arguments[:-1])) + ) arguments = [ arg.match_identifier.value for arg in node.arguments @@ -666,7 +701,6 @@ def with_statement( @rule(AstCommand, identifier="import:module") @rule(AstCommand, identifier="import:module:as:alias") - @rule(AstCommand, identifier="from:module:import:subcommand") def import_statement( self, node: AstCommand, @@ -674,29 +708,7 @@ def import_statement( ) -> Optional[List[str]]: module = cast(AstResourceLocation, node.arguments[0]) - if node.identifier == "from:module:import:subcommand": - names: List[str] = [] - subcommand = cast(AstCommand, node.arguments[1]) - - while True: - if isinstance(item := subcommand.arguments[0], AstImportedItem): - names.append(item.name) - if subcommand.identifier == "from:module:import:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break - - if module.namespace: - acc.statement( - f"{', '.join(names)} = _bolt_runtime.from_module_import({module.get_value()!r}, {', '.join(map(repr, names))})", - lineno=node, - ) - else: - for name in names: - rhs = acc.get_attribute(acc.import_module(module.path), name) - acc.statement(f"{name} = {rhs}", lineno=node) - - elif node.identifier == "import:module:as:alias": + if node.identifier == "import:module:as:alias": alias = cast(AstImportedItem, node.arguments[1]).name if module.namespace: @@ -719,6 +731,37 @@ def import_statement( return [] + @rule(AstFromImport) + def from_import_statement( + self, + node: AstFromImport, + acc: Accumulator, + ) -> Optional[List[str]]: + module = cast(AstResourceLocation, node.arguments[0]) + items = cast( + AstChildren[Union[AstImportedItem, AstImportedMacro]], node.arguments[1:] + ) + names = [item.name for item in items] + + if module.namespace: + full_path = module.get_value() + targets: List[str] = [] + for item in items: + if isinstance(item, AstImportedMacro): + targets.append(acc.import_macro(full_path, item)) + else: + targets.append(item.name) + stmt = f"{', '.join(targets)} = _bolt_runtime.from_module_import({full_path!r}, {', '.join(map(repr, names))})" + acc.statement(stmt, lineno=node) + else: + stmt = f"_bolt_from_import = {acc.import_module(module.path)}" + acc.statement(stmt, lineno=node) + for name in names: + rhs = acc.get_attribute("_bolt_from_import", name) + acc.statement(f"{name} = {rhs}", lineno=node) + + return [] + @rule(AstCommand, identifier="global:subcommand") @rule(AstCommand, identifier="nonlocal:subcommand") def global_nonlocal_statement( diff --git a/packages/bolt/bolt/contrib/lazy.py b/packages/bolt/bolt/contrib/lazy.py index 10a17bbcd..cebe3d116 100644 --- a/packages/bolt/bolt/contrib/lazy.py +++ b/packages/bolt/bolt/contrib/lazy.py @@ -75,7 +75,7 @@ class LazyFilter(Visitor): @rule(AstModuleRoot) def lazy_module(self, node: AstModuleRoot): - module = self.modules.for_current_ast(node) + module = self.modules.match_ast(node) if module.resource_location and self.lazy.check(module.resource_location): module.execution_hooks.append( partial( diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index f7c64ec22..d034fe052 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -3,6 +3,7 @@ "CompiledModule", "ModuleManager", "ModuleCacheBackend", + "MacroLibrary", "CodegenResult", "UnusableCompilationUnit", ] @@ -15,7 +16,20 @@ from io import BufferedReader, BufferedWriter from pathlib import Path from types import CodeType -from typing import Any, Callable, Dict, Iterator, List, Mapping, Optional, Set, Union +from typing import ( + Any, + Callable, + Dict, + Iterator, + List, + Mapping, + Optional, + Protocol, + Set, + Tuple, + Union, + cast, +) from beet import TextFile, TextFileBase from beet.core.utils import JsonDict, extra_field, import_from_string, required_field @@ -24,17 +38,19 @@ AstRoot, CompilationDatabase, CompilationUnit, + DiagnosticError, Dispatcher, MechaError, ) -from .utils import rewrite_traceback +from .ast import AstMacro +from .utils import internal, rewrite_traceback logger = logging.getLogger("mecha") class UnusableCompilationUnit(MechaError): - """Raised when a compilation unit lacks the necessary information to instantiate a module.""" + """Raised when a compilation unit can not be used to instantiate a module.""" message: str compilation_unit: CompilationUnit @@ -55,6 +71,9 @@ class Module(TextFile): extension = ".bolt" +MacroLibrary = Dict[str, Dict[Tuple[str, AstMacro], Optional[Tuple[str, str]]]] + + @dataclass class CompiledModule: """Class holding the state of a compiled module.""" @@ -62,6 +81,7 @@ class CompiledModule: ast: AstRoot code: Optional[CodeType] refs: List[Any] + macros: MacroLibrary output: Optional[str] resource_location: Optional[str] globals: Set[str] @@ -76,6 +96,20 @@ class CodegenResult: source: Optional[str] = None output: Optional[str] = None refs: List[Any] = field(default_factory=list) + macros: MacroLibrary = field(default_factory=dict) + + +class ModuleParseCallback(Protocol): + """Callback required by the module manager for parsing.""" + + def __call__( + self, + source: TextFileBase[Any], + *, + filename: Optional[str], + resource_location: Optional[str], + ) -> AstRoot: + ... @dataclass(frozen=True) @@ -85,11 +119,13 @@ class ModuleManager(Mapping[TextFileBase[Any], CompiledModule]): directory: Path = extra_field() database: CompilationDatabase = extra_field() codegen: Dispatcher[CodegenResult] = extra_field() + parse_callback: ModuleParseCallback = extra_field() registry: Dict[TextFileBase[Any], CompiledModule] = extra_field( default_factory=dict ) stack: List[CompiledModule] = extra_field(default_factory=list) + parse_stack: List[TextFileBase[Any]] = extra_field(default_factory=list) globals: JsonDict = extra_field(default_factory=dict) builtins: Set[str] = extra_field(default_factory=set) @@ -111,58 +147,77 @@ def current_path(self) -> str: "Currently executing module has no associated resource location." ) - def for_current_ast(self, node: AstRoot) -> CompiledModule: + def match_ast( + self, + node: AstRoot, + current: Optional[Union[TextFileBase[Any], str]] = None, + ) -> CompiledModule: """Return executable module for the current ast.""" - current = self.database.current + if not current: + current = self.database.current + elif isinstance(current, str): + current = self.database.index[current] compilation_unit = self.database[current] - name = compilation_unit.resource_location or "" - - if module := self.registry.get(current): - if module.ast is node: - return module - logger.debug('Evict stale module "%s" due to ast update.', name) - del self.registry[current] - compilation_unit.ast = node + return self[current] def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: if isinstance(current, str): current = self.database.index[current] - if module := self.registry.get(current): - return module - compilation_unit = self.database[current] - node = compilation_unit.ast name = compilation_unit.resource_location or "" - if not node: - raise UnusableCompilationUnit( - f"No ast for module {name}.", compilation_unit - ) + if module := self.registry.get(current): + if ( + module.executed + or not compilation_unit.ast + or module.ast is compilation_unit.ast + ): + return module + logger.debug('Code generation due to ast update for module "%s".', name) + + elif not compilation_unit.ast: + previous = self.database.current + self.database.current = current + try: + compilation_unit.ast = self.parse_callback( + current, + filename=compilation_unit.filename, + resource_location=compilation_unit.resource_location, + ) + except DiagnosticError: + raise UnusableCompilationUnit("Parsing failed.", compilation_unit) + finally: + self.database.current = previous + return self[current] - logger.debug('Code generation for module "%s".', name) + else: + logger.debug('Code generation for module "%s".', name) - result = self.codegen(node) + result = self.codegen(compilation_unit.ast) if result.source and result.output: - filename = ( - str(self.directory / compilation_unit.filename) - if compilation_unit.filename - else name + code = compile( + source=result.source, + filename=( + str(self.directory / compilation_unit.filename) + if compilation_unit.filename + else name + ), + mode="exec", ) - code = compile(result.source, filename, "exec") - else: code = None module = CompiledModule( - ast=node, + ast=compilation_unit.ast, code=code, refs=result.refs, + macros=result.macros, output=result.output, resource_location=compilation_unit.resource_location, globals=set(self.globals), @@ -177,6 +232,19 @@ def __iter__(self) -> Iterator[TextFileBase[Any]]: def __len__(self) -> int: return len(self.database) + def get(self, current: Union[TextFileBase[Any], str]) -> Optional[CompiledModule]: + """Return executable module if exists.""" + if isinstance(current, str): + if current not in self.database.index: + return None + current = self.database.index[current] + + if current not in self.database: + return None + + return self[current] + + @internal def eval(self, module: CompiledModule) -> AstRoot: """Run the module and return the output ast.""" if not module.executed: @@ -203,8 +271,9 @@ def eval(self, module: CompiledModule) -> AstRoot: module.executing = True try: - with self.error_handler(): - exec(module.code, module.namespace) + exec(module.code, module.namespace) + except Exception as exc: + raise rewrite_traceback(exc) from None finally: module.executing = False self.stack.pop() @@ -212,12 +281,24 @@ def eval(self, module: CompiledModule) -> AstRoot: return module.namespace[module.output] @contextmanager - def error_handler(self): - """Handle errors coming from compiled modules.""" + def parse_push(self, current: TextFileBase[Any]): + """Push the current file onto the parse stack.""" + if current in self.parse_stack: + stack = " -> ".join( + f'"{self.database[entry].resource_location or ""}"' + for entry in self.parse_stack + [current] + ) + raise UnusableCompilationUnit( + f"Cyclic parsing dependency {stack}.", + compilation_unit=self.database[current], + ) + + self.parse_stack.append(current) + try: yield - except Exception as exc: - raise rewrite_traceback(exc) from None + finally: + self.parse_stack.pop() @dataclass @@ -230,8 +311,20 @@ class ModuleCacheBackend(AstCacheBackend): def load_data(self, f: BufferedReader) -> JsonDict: data = super().load_data(f) + if data["bolt"] != self.bolt_version: raise ValueError("Version mismatch.") + if data["globals"] != set(self.modules.globals): + raise ValueError("Globals mismatch.") + + for group, exports in cast(MacroLibrary, data["macros"]).items(): + for (_, macro), extern in exports.items(): + if extern: + resource_location, name = extern + macros = self.modules[resource_location].macros + if group not in macros or (name, macro) not in macros[group]: + raise ValueError("Macro mismatch.") + return data def dump_data(self, data: JsonDict, f: BufferedWriter): @@ -240,29 +333,27 @@ def dump_data(self, data: JsonDict, f: BufferedWriter): def load(self, f: BufferedReader) -> AstRoot: data = self.load_data(f) - ast = data["ast"] - - if data["globals"] != set(self.modules.globals): - raise ValueError("Globals mismatch.") self.modules.registry[self.modules.database.current] = CompiledModule( - ast=ast, + ast=data["ast"], code=marshal.load(f), refs=data["refs"], + macros=data["macros"], output=data["output"], resource_location=data["resource_location"], globals=data["globals"], ) - return ast + return data["ast"] def dump(self, node: AstRoot, f: BufferedWriter): - module = self.modules.for_current_ast(node) + module = self.modules.match_ast(node) self.dump_data( { "ast": module.ast, "refs": module.refs, + "macros": module.macros, "output": module.output, "resource_location": module.resource_location, "globals": module.globals, diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index d89157dce..e874bc42b 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -7,9 +7,10 @@ "get_stream_deferred_locals", "get_stream_branch_scope", "get_stream_macro_scope", - "UndefinedIdentifier", "ToplevelHandler", "create_bolt_root_parser", + "UndefinedIdentifier", + "UndefinedIdentifierErrorHandler", "BranchScopeManager", "check_final_expression", "InterpolationParser", @@ -44,14 +45,12 @@ "PrimaryParser", "parse_dict_item", "LiteralParser", - "UndefinedIdentifierErrorHandler", ] import re from dataclasses import dataclass, field, replace -from difflib import get_close_matches -from typing import Any, Dict, List, Optional, Set, Tuple, cast +from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, cast from beet.core.utils import JsonDict from mecha import ( @@ -94,10 +93,12 @@ AstExpressionBinary, AstExpressionUnary, AstFormatString, + AstFromImport, AstFunctionSignature, AstFunctionSignatureArgument, AstIdentifier, AstImportedItem, + AstImportedMacro, AstInterpolation, AstKeyword, AstList, @@ -120,7 +121,7 @@ AstUnpack, AstValue, ) -from .module import Module, ModuleManager +from .module import Module, ModuleManager, UnusableCompilationUnit from .pattern import ( FALSE_PATTERN, IDENTIFIER_PATTERN, @@ -131,6 +132,7 @@ STRING_PATTERN, TRUE_PATTERN, ) +from .utils import suggest_typo IMPORT_REGEX = re.compile(rf"^{MODULE_PATTERN}$") @@ -147,7 +149,8 @@ def get_bolt_parsers( "nested_root": create_bolt_root_parser(parsers["nested_root"]), "command": UndefinedIdentifierErrorHandler( ImportStatementHandler( - MacroHandler(GlobalNonlocalHandler(parsers["command"])) + parser=MacroHandler(GlobalNonlocalHandler(parsers["command"])), + modules=modules, ) ), "command:argument:bolt:if_block": delegate("bolt:if_block"), @@ -427,34 +430,6 @@ def get_stream_macro_scope(stream: TokenStream) -> Set[str]: return stream.data.setdefault("macro_scope", set()) -class UndefinedIdentifier(InvalidSyntax): - """Raised when an identifier is not defined.""" - - token: Token - identifiers: Set[str] - - def __init__(self, token: Token, identifiers: Set[str]): - super().__init__(token, identifiers) - self.token = token - self.identifiers = identifiers - - def __str__(self) -> str: - msg = f'Identifier "{self.token.value}" is not defined.' - - if matches := get_close_matches(self.token.value, self.identifiers): - matches = [repr(m) for m in matches] - - if len(matches) == 1: - suggestion = f"{matches[0]}" - else: - *head, before_last, last = matches - suggestion = ", ".join(head + [f"{before_last} or {last}"]) - - msg += f" Did you mean {suggestion}?" - - return msg - - @dataclass class ToplevelHandler: """Handle toplevel root node.""" @@ -464,7 +439,7 @@ class ToplevelHandler: modules: ModuleManager def __call__(self, stream: TokenStream) -> Any: - with stream.provide( + with self.modules.parse_push(self.modules.database.current), stream.provide( identifiers=set(self.modules.globals) | self.modules.builtins | {"__name__"}, @@ -507,6 +482,43 @@ def create_bolt_root_parser(parser: Parser): ) +class UndefinedIdentifier(InvalidSyntax): + """Raised when an identifier is not defined.""" + + identifier: str + possible_identifiers: Iterable[str] + + def __init__(self, identifier: str, identifiers: Iterable[str]): + super().__init__(identifier, identifiers) + self.identifier = identifier + self.identifiers = identifiers + + def __str__(self) -> str: + msg = f'Identifier "{self.identifier}" is not defined.' + if suggestion := suggest_typo(self.identifier, self.identifiers): + msg += f" Did you mean {suggestion}?" + return msg + + +@dataclass +class UndefinedIdentifierErrorHandler: + """Parser that provides hints for errors involving undefined identifiers.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + try: + return self.parser(stream) + except UndefinedIdentifier: + raise + except InvalidSyntax as exc: + for alt in exc.alternatives.get(UndefinedIdentifier, []): + if alt.end_location.pos + 1 >= exc.location.pos: # kind of a cheat + alt.notes.append(str(exc)) + raise alt from None + raise + + @dataclass class BranchScopeManager: """Parser that manages accessible identifiers for conditional branches.""" @@ -770,7 +782,7 @@ def __call__(self, stream: TokenStream) -> AstTarget: if not with_storage: pending_identifiers_storage[token.value] = "local" elif not rebind: - exc = UndefinedIdentifier(token, set(identifiers_storage)) + exc = UndefinedIdentifier(token.value, list(identifiers_storage)) if is_defined and not with_storage: exc.notes.append( f"Use 'global {token.value}' or 'nonlocal {token.value}' to mutate the variable defined in outer scope." @@ -1104,10 +1116,11 @@ def inject_syntax(cls, stream: TokenStream, *macros: AstMacro): child["properties"] = properties.evaluate() tree["children"] = {node.match_identifier.value: child} else: - tree["executable"] = True break tree = child + tree["executable"] = True + spec.tree.extend(CommandTree.parse_obj(tree_root)) macro_scope.add(macro.identifier) @@ -1143,7 +1156,7 @@ def parse_identifier(stream: TokenStream) -> AstIdentifier: token = stream.expect("identifier") if token.value not in identifiers: - exc = UndefinedIdentifier(token, set(identifiers)) + exc = UndefinedIdentifier(token.value, list(identifiers)) raise set_location(exc, token) return set_location(AstIdentifier(value=token.value), token) @@ -1183,45 +1196,79 @@ class ImportStatementHandler: """Handle import statements.""" parser: Parser + modules: ModuleManager def __call__(self, stream: TokenStream) -> Any: + if isinstance(node := self.parser(stream), AstCommand): + if node.identifier in ["import:module", "import:module:as:alias"]: + return self.handle_import(stream, node) + elif node.identifier == "from:module:import:subcommand": + return self.handle_from_import(stream, node) + return node + + def handle_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: identifiers = get_stream_identifiers(stream) identifiers_storage = get_stream_identifiers_storage(stream) - if isinstance(node := self.parser(stream), AstCommand): - if node.identifier == "import:module": - if isinstance(module := node.arguments[0], AstResourceLocation): - if module.namespace: - exc = InvalidSyntax( - f'Can\'t import "{module.get_value()}" without alias.' - ) - raise set_location(exc, module) - else: - identifiers.add(module.path.partition(".")[0]) + if node.identifier == "import:module": + if isinstance(module := node.arguments[0], AstResourceLocation): + if module.namespace: + message = f'Can\'t import "{module.get_value()}" without alias.' + raise set_location(InvalidSyntax(message), module) + identifiers.add(module.path.partition(".")[0]) + + elif node.identifier == "import:module:as:alias": + if isinstance(alias := node.arguments[1], AstImportedItem): + if not alias.identifier: + exc = InvalidSyntax(f'Invalid identifier "{alias.name}".') + raise set_location(exc, alias) + identifiers.add(alias.name) + identifiers_storage.setdefault(alias.name, "local") - elif node.identifier == "import:module:as:alias": - if isinstance(alias := node.arguments[1], AstImportedItem): - if not alias.identifier: - exc = InvalidSyntax(f'Invalid identifier "{alias.name}".') - raise set_location(exc, alias) - identifiers.add(alias.name) - identifiers_storage.setdefault(alias.name, "local") + return node - elif node.identifier == "from:module:import:subcommand": - subcommand = cast(AstCommand, node.arguments[1]) - while True: - if isinstance(item := subcommand.arguments[0], AstImportedItem): - if not item.identifier: - exc = InvalidSyntax(f'Invalid identifier "{item.name}".') - raise set_location(exc, item) - identifiers.add(item.name) - identifiers_storage.setdefault(item.name, "local") - if subcommand.identifier == "from:module:import:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break + def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: + identifiers = get_stream_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) - return node + module = cast(AstResourceLocation, node.arguments[0]) + + try: + compiled_module = ( + isinstance(module := node.arguments[0], AstResourceLocation) + and bool(module.namespace) + and self.modules.get(module.get_value()) + ) + except UnusableCompilationUnit: + compiled_module = None + + arguments: List[AstNode] = [module] + macros: List[AstMacro] = [] + + subcommand = cast(AstCommand, node.arguments[1]) + while True: + if isinstance(item := subcommand.arguments[0], AstImportedItem): + if compiled_module and item.name in compiled_module.macros: + for name, macro in compiled_module.macros[item.name]: + imported_macro = AstImportedMacro(name=name, declaration=macro) + arguments.append(set_location(imported_macro, item)) + macros.append(macro) + elif item.identifier: + arguments.append(item) + identifiers.add(item.name) + identifiers_storage.setdefault(item.name, "local") + else: + exc = InvalidSyntax(f'Invalid identifier "{item.name}".') + raise set_location(exc, item) + if subcommand.identifier == "from:module:import:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break + + if macros: + MacroHandler.inject_syntax(stream, *macros) + + return set_location(AstFromImport(arguments=AstChildren(arguments)), node) def parse_python_import(stream: TokenStream) -> Any: @@ -1233,7 +1280,7 @@ def parse_python_import(stream: TokenStream) -> Any: def parse_import_name(stream: TokenStream) -> AstImportedItem: """Parse import name.""" - with stream.syntax(name=IDENTIFIER_PATTERN, literal=AstMacroLiteral.regex.pattern): + with stream.syntax(name=IDENTIFIER_PATTERN, literal=r"[^#:\s]+(? Any: node = AstValue(value=value) # type: ignore return set_location(node, stream.current) - - -@dataclass -class UndefinedIdentifierErrorHandler: - """Parser that provides hints for errors involving undefined identifiers.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - try: - return self.parser(stream) - except UndefinedIdentifier: - raise - except InvalidSyntax as exc: - for alt in exc.alternatives.get(UndefinedIdentifier, []): - if alt.end_location.pos + 1 >= exc.location.pos: # kind of a cheat - alt.notes.append(str(exc)) - raise alt from None - raise diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 907e4dd77..ddac160bf 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -2,7 +2,6 @@ "Runtime", "Evaluator", "check_toplevel_commands", - "UnusableCompilationUnit", ] @@ -106,6 +105,7 @@ def __init__(self, ctx: Union[Context, Mecha]): directory=mc.directory, database=mc.database, codegen=Codegen(), + parse_callback=mc.parse, globals=self.globals, builtins=self.builtins, ) @@ -181,7 +181,7 @@ class Evaluator(Visitor): @rule(AstRoot) def root(self, node: AstRoot) -> AstRoot: - module = self.modules.for_current_ast(node) + module = self.modules.match_ast(node) try: return self.modules.eval(module) except BubbleException: diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py index ad742d4df..1c90f3cda 100644 --- a/packages/bolt/bolt/utils.py +++ b/packages/bolt/bolt/utils.py @@ -1,14 +1,16 @@ __all__ = [ "rewrite_traceback", "fake_traceback", + "suggest_typo", "internal", "INTERNAL_CODE", ] from bisect import bisect +from difflib import get_close_matches from types import CodeType, TracebackType -from typing import List, Set, TypeVar +from typing import Iterable, List, Optional, Set, TypeVar from mecha.utils import string_to_number @@ -69,3 +71,16 @@ def fake_traceback(exc: Exception, tb: TracebackType, lineno: int) -> TracebackT exec(code, {"_bolt_exc": exc}) except Exception as exc: return exc.__traceback__.tb_next # type: ignore + + +def suggest_typo(wrong: str, possibilities: Iterable[str]) -> Optional[str]: + if matches := get_close_matches(wrong, possibilities): + matches = [f'"{m}"' for m in matches] + + if len(matches) == 1: + return matches[0] + else: + *head, before_last, last = matches + return ", ".join(head + [f"{before_last} or {last}"]) + + return None diff --git a/packages/bolt/examples/bolt_macro/src/data/demo/functions/bar.mcfunction b/packages/bolt/examples/bolt_macro/src/data/demo/functions/bar.mcfunction new file mode 100644 index 000000000..97d2732b7 --- /dev/null +++ b/packages/bolt/examples/bolt_macro/src/data/demo/functions/bar.mcfunction @@ -0,0 +1,29 @@ +from ./foo import foo, setblock, do_twice, >>, execute, tellraw, ! + +foo +foo 4 +foo 3 double +foo 3 hello @a[ + scores = { + x = 42 + } +] + +setblock +setblock stone +setblock 1 2 3 +setblock 1 2 3 stone + +do_twice: + say this is repeated twice + +>> Custom symbols work +as @a run >> Even inside execute +as @a >> Overload execute to allow implicit "run" + +tellraw @s from ./dummy_message + +! @e ! + +from ./foo import abc +abc 42 diff --git a/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction index ff5753c30..626aaedc8 100644 --- a/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_macro/src/data/demo/functions/foo.mcfunction @@ -83,3 +83,10 @@ macro ! targets=minecraft:entity{"type": "entities", "amount": "multiple"} !: do_it() ! @e ! + +macro abc num1=brigadier:integer: + macro def num2=brigadier:integer: + say num2 + def num1 + +abc 42 diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt index 5ad9f7da3..773dbee08 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_128__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_128__0.txt @@ -5,10 +5,10 @@ say thing location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=3, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'from:module:import:subcommand' + identifier: '' arguments: location: SourceLocation(pos=5, lineno=1, colno=6) @@ -16,16 +16,11 @@ say thing is_tag: False namespace: 'demo' path: 'foo' - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=21, lineno=1, colno=22) - end_location: SourceLocation(pos=26, lineno=1, colno=27) - name: 'thing' - identifier: True + name: 'thing' + identifier: True location: SourceLocation(pos=27, lineno=2, colno=1) end_location: SourceLocation(pos=36, lineno=2, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt index 9fcf2d19a..852c6fd5c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_128__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_128__1.txt @@ -32,5 +32,5 @@ _bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=37, lineno=3, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt index 8a5d54338..0bdedc151 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt @@ -23,10 +23,10 @@ say a location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=39, lineno=2, colno=31) commands: - + location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:subcommand' + identifier: '' arguments: location: SourceLocation(pos=18, lineno=2, colno=10) @@ -34,36 +34,21 @@ say a is_tag: False namespace: 'demo' path: 'foo' - + location: SourceLocation(pos=34, lineno=2, colno=26) + end_location: SourceLocation(pos=35, lineno=2, colno=27) + name: 'a' + identifier: True + + location: SourceLocation(pos=36, lineno=2, colno=28) + end_location: SourceLocation(pos=37, lineno=2, colno=29) + name: 'b' + identifier: True + + location: SourceLocation(pos=38, lineno=2, colno=30) end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:name:subcommand' - arguments: - - location: SourceLocation(pos=34, lineno=2, colno=26) - end_location: SourceLocation(pos=35, lineno=2, colno=27) - name: 'a' - identifier: True - - location: SourceLocation(pos=36, lineno=2, colno=28) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:name:subcommand' - arguments: - - location: SourceLocation(pos=36, lineno=2, colno=28) - end_location: SourceLocation(pos=37, lineno=2, colno=29) - name: 'b' - identifier: True - - location: SourceLocation(pos=38, lineno=2, colno=30) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=38, lineno=2, colno=30) - end_location: SourceLocation(pos=39, lineno=2, colno=31) - name: 'c' - identifier: True + name: 'c' + identifier: True location: SourceLocation(pos=40, lineno=3, colno=1) end_location: SourceLocation(pos=45, lineno=3, colno=6) diff --git a/packages/bolt/tests/snapshots/bolt__parse_189__0.txt b/packages/bolt/tests/snapshots/bolt__parse_189__0.txt index 3eea35065..68bf2b273 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_189__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_189__0.txt @@ -1,6 +1,6 @@ x = 1 def f(): -#>ERROR Identifier "xx" is not defined. Did you mean 'x'? +#>ERROR Identifier "xx" is not defined. Did you mean "x"? # line 3, column 12 # 2 | def f(): # 3 | global xx diff --git a/packages/bolt/tests/snapshots/bolt__parse_208__0.txt b/packages/bolt/tests/snapshots/bolt__parse_208__0.txt index ff5159e16..beb4c8d5b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_208__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_208__0.txt @@ -4,10 +4,10 @@ from PIL import Image location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=1, colno=22) - identifier: 'from:module:import:subcommand' + identifier: '' arguments: location: SourceLocation(pos=5, lineno=1, colno=6) @@ -15,13 +15,8 @@ from PIL import Image is_tag: False namespace: None path: 'PIL' - + location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=21, lineno=1, colno=22) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=21, lineno=1, colno=22) - name: 'Image' - identifier: True + name: 'Image' + identifier: True diff --git a/packages/bolt/tests/snapshots/bolt__parse_208__1.txt b/packages/bolt/tests/snapshots/bolt__parse_208__1.txt index 9db588d43..b312658f7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_208__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_208__1.txt @@ -4,7 +4,8 @@ _bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var0: - Image = _bolt_helper_get_attribute(_bolt_helper_import_module('PIL'), 'Image') + _bolt_from_import = _bolt_helper_import_module('PIL') + Image = _bolt_helper_get_attribute(_bolt_from_import, 'Image') _bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- output = _bolt_var1 @@ -14,4 +15,4 @@ _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=22, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_209__0.txt b/packages/bolt/tests/snapshots/bolt__parse_209__0.txt index 5630a1b63..14c838f5b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_209__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_209__0.txt @@ -4,10 +4,10 @@ from PIL.Image import Image location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=27, lineno=1, colno=28) - identifier: 'from:module:import:subcommand' + identifier: '' arguments: location: SourceLocation(pos=5, lineno=1, colno=6) @@ -15,13 +15,8 @@ from PIL.Image import Image is_tag: False namespace: None path: 'PIL.Image' - + location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=27, lineno=1, colno=28) - identifier: 'from:module:import:name' - arguments: - - location: SourceLocation(pos=22, lineno=1, colno=23) - end_location: SourceLocation(pos=27, lineno=1, colno=28) - name: 'Image' - identifier: True + name: 'Image' + identifier: True diff --git a/packages/bolt/tests/snapshots/bolt__parse_209__1.txt b/packages/bolt/tests/snapshots/bolt__parse_209__1.txt index 2e25e0706..a97cade89 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_209__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_209__1.txt @@ -4,7 +4,8 @@ _bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var0: - Image = _bolt_helper_get_attribute(_bolt_helper_import_module('PIL.Image'), 'Image') + _bolt_from_import = _bolt_helper_import_module('PIL.Image') + Image = _bolt_helper_get_attribute(_bolt_from_import, 'Image') _bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- output = _bolt_var1 @@ -14,4 +15,4 @@ _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt index f3707feb9..4fec1ba47 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier "the" is not defined. Did you mean 'hex'? +#>ERROR Identifier "the" is not defined. Did you mean "hex"? # line 1, column 7 # 1 | wat = the = "f" # : ^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_80__0.txt b/packages/bolt/tests/snapshots/bolt__parse_80__0.txt index c4b834eb1..d01c324be 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_80__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_80__0.txt @@ -7,7 +7,7 @@ def foo(something): dat # this is a comment x = "hello" -#>ERROR Identifier "somehng" is not defined. Did you mean 'something'? +#>ERROR Identifier "somehng" is not defined. Did you mean "something"? # line 10, column 18 # 9 | x = "hello" # 10 | for i in somehng: diff --git a/packages/bolt/tests/snapshots/bolt__parse_83__0.txt b/packages/bolt/tests/snapshots/bolt__parse_83__0.txt index b6378ca41..ca7943240 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_83__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_83__0.txt @@ -1,7 +1,7 @@ def foo(): bar() + thing def bar(): -#>ERROR Identifier "thin" is not defined. Did you mean 'thing'? +#>ERROR Identifier "thin" is not defined. Did you mean "thing"? # line 4, column 13 # 3 | def bar(): # 4 | foo() + thin diff --git a/packages/bolt/tests/snapshots/bolt__parse_90__0.txt b/packages/bolt/tests/snapshots/bolt__parse_90__0.txt index cea53168e..ccce20026 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_90__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_90__0.txt @@ -1,5 +1,5 @@ def f(x): -#>ERROR Identifier "xx" is not defined. Did you mean 'x'? +#>ERROR Identifier "xx" is not defined. Did you mean "x"? # line 2, column 16 # 1 | def f(x): # 2 | tellraw @a xx diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md index 2b6680b73..165300253 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md @@ -15,6 +15,41 @@ ### demo +`@function demo:bar` + +```mcfunction +say macro foo +say macro foo 4 +say macro foo 3 +say macro foo 2 +say macro foo 1 +say macro foo +say macro foo 6 +say macro foo 5 +say macro foo 4 +say macro foo 3 +say macro foo 2 +say macro foo 1 +say macro foo +say macro foo 3 +say macro foo 2 +say macro foo 1 +say macro foo +say hello @a[scores={x=42}] +setblock ~ ~ ~ air +setblock ~ ~ ~ stone +setblock 1 2 3 air +setblock 1 2 3 stone +say this is repeated twice +say this is repeated twice +tellraw @p {"text": "Custom symbols work"} +execute as @a run tellraw @p {"text": "Even inside execute"} +execute as @a run tellraw @p {"text": "Overload execute to allow implicit \"run\""} +tellraw @s {"text": "from demo:dummy_message"} +kill @e +say 42 +``` + `@function demo:foo` ```mcfunction @@ -47,4 +82,5 @@ execute as @a run tellraw @p {"text": "Even inside execute"} execute as @a run tellraw @p {"text": "Overload execute to allow implicit \"run\""} tellraw @s {"text": "from demo:dummy_message"} kill @e +say 42 ``` From a17766990752d539bd89154ef78c6c31c0f79044 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 13 Jul 2022 00:52:36 +0000 Subject: [PATCH 0937/1554] 0.12.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index a6ced140a..11fd18e41 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.12.0 (2022-07-13) +### Feature +* Add macro imports ([`e8ca750`](https://github.com/mcbeet/bolt/commit/e8ca750c6664ffa610b09c17d00cb7f9eed445c8)) + ## v0.11.0 (2022-07-10) ### Feature * Turn module manager into a mapping ([`3c486eb`](https://github.com/mcbeet/bolt/commit/3c486eb6d9ce6c9a47ec16c14342fa98db6fbfd7)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 47c8bcebc..63fc4cfde 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.11.0" +__version__ = "0.12.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index d61be1fe8..dea279ce9 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.11.0" +version = "0.12.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 1c3a0961d4143ffbae816e4babda4960a6ce22c6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 14 Jul 2022 18:38:07 +0200 Subject: [PATCH 0938/1554] fix: minor tweaks --- packages/bolt/bolt/module.py | 12 ++++++------ packages/bolt/bolt/parse.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index d034fe052..14d2ea934 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -139,9 +139,7 @@ def current(self) -> CompiledModule: @property def current_path(self) -> str: """Return the path corresponding to the currently executing module.""" - if not self.stack: - raise ValueError("No module currently executing.") - if path := self.stack[-1].resource_location: + if path := self.current.resource_location: return path raise ValueError( "Currently executing module has no associated resource location." @@ -177,7 +175,7 @@ def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: or module.ast is compilation_unit.ast ): return module - logger.debug('Code generation due to ast update for module "%s".', name) + logger.warning('Code generation due to ast update for module "%s".', name) elif not compilation_unit.ast: previous = self.database.current @@ -188,8 +186,10 @@ def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: filename=compilation_unit.filename, resource_location=compilation_unit.resource_location, ) - except DiagnosticError: - raise UnusableCompilationUnit("Parsing failed.", compilation_unit) + except DiagnosticError as exc: + raise UnusableCompilationUnit( + "Parsing failed.", compilation_unit + ) from exc finally: self.database.current = previous return self[current] diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index e874bc42b..c2896d338 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1065,7 +1065,7 @@ def create_macro(cls, command: AstCommand) -> AstMacro: node = command while isinstance(subcommand := node.arguments[-1], AstCommand): if isinstance(literal := node.arguments[0], AstMacroLiteral): - if literal.value == "macro": + if literal.value in ["macro", "from"]: exc = InvalidSyntax(f'Forbidden literal "{literal.value}".') raise set_location(exc, literal) identifier_parts.append(literal.value) From 07264dbce3655ff0037f421adcb6853469343855 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 15 Jul 2022 02:25:24 +0200 Subject: [PATCH 0939/1554] fix: make command tree updates lazy --- packages/bolt/bolt/parse.py | 49 ++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index c2896d338..5d17125c4 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -52,7 +52,7 @@ from dataclasses import dataclass, field, replace from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, cast -from beet.core.utils import JsonDict +from beet.core.utils import JsonDict, log_time from mecha import ( AdjacentConstraint, AlternativeParser, @@ -430,6 +430,11 @@ def get_stream_macro_scope(stream: TokenStream) -> Set[str]: return stream.data.setdefault("macro_scope", set()) +def get_stream_pending_macros(stream: TokenStream) -> List[AstMacro]: + """Return pending macro declarations.""" + return stream.data.setdefault("pending_macros", []) + + @dataclass class ToplevelHandler: """Handle toplevel root node.""" @@ -1043,6 +1048,22 @@ class MacroHandler: parser: Parser def __call__(self, stream: TokenStream) -> Any: + scope = get_stream_scope(stream) + pending_macros = get_stream_pending_macros(stream) + + should_flush = not ( + scope[0] in ["macro", "from"] + if scope + else ( + (token := stream.peek()) + and token.match(("literal", "macro"), ("literal", "from")) + ) + ) + + if should_flush and pending_macros: + self.inject_syntax(stream, *pending_macros) + pending_macros.clear() + node = self.parser(stream) if not isinstance(node, AstCommand): @@ -1050,7 +1071,9 @@ def __call__(self, stream: TokenStream) -> Any: if node.identifier == "macro:name:subcommand": node = self.create_macro(node) - self.inject_syntax(stream, node) + pending_macros.append( + replace(node, arguments=AstChildren(node.arguments[:-1])) + ) elif node.identifier in get_stream_macro_scope(stream): call = AstMacroCall(identifier=node.identifier, arguments=node.arguments) node = set_location(call, node) @@ -1230,6 +1253,7 @@ def handle_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: identifiers = get_stream_identifiers(stream) identifiers_storage = get_stream_identifiers_storage(stream) + pending_macros = get_stream_pending_macros(stream) module = cast(AstResourceLocation, node.arguments[0]) @@ -1243,7 +1267,6 @@ def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstComman compiled_module = None arguments: List[AstNode] = [module] - macros: List[AstMacro] = [] subcommand = cast(AstCommand, node.arguments[1]) while True: @@ -1252,7 +1275,7 @@ def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstComman for name, macro in compiled_module.macros[item.name]: imported_macro = AstImportedMacro(name=name, declaration=macro) arguments.append(set_location(imported_macro, item)) - macros.append(macro) + pending_macros.append(macro) elif item.identifier: arguments.append(item) identifiers.add(item.name) @@ -1265,9 +1288,6 @@ def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstComman else: break - if macros: - MacroHandler.inject_syntax(stream, *macros) - return set_location(AstFromImport(arguments=AstChildren(arguments)), node) @@ -1339,10 +1359,6 @@ def __call__(self, stream: TokenStream) -> AstRoot: node: AstRoot = self.parser(stream) - spec = get_stream_spec(stream) - identifiers = get_stream_identifiers(stream) - macro_scope = get_stream_macro_scope(stream) - for command in node.commands: stack: List[AstCommand] = [command] @@ -1358,12 +1374,17 @@ def __call__(self, stream: TokenStream) -> AstRoot: ): should_replace = True + if pending_macros := get_stream_pending_macros(stream): + MacroHandler.inject_syntax(stream, *pending_macros) + pending_macros.clear() + deferred_stream = deferred_root.stream deferred_stream.data["local_spec"] = False - deferred_stream.data["spec"] = spec - deferred_stream.data["identifiers"] |= identifiers + deferred_stream.data["spec"] = get_stream_spec(stream) + deferred_stream.data["identifiers"] |= get_stream_identifiers(stream) deferred_stream.data["function"] = True - deferred_stream.data["macro_scope"] = macro_scope + deferred_stream.data["macro_scope"] = get_stream_macro_scope(stream) + deferred_stream.data["pending_macros"] = [] nested_root = delegate("nested_root", deferred_stream) command = replace( From 28e4ef68eafcfd75b7cf554c9e1cf01f4721965a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 15 Jul 2022 04:05:47 +0200 Subject: [PATCH 0940/1554] fix: memoize command trees --- packages/bolt/bolt/ast.py | 27 ++++- packages/bolt/bolt/parse.py | 114 +++++++++--------- .../bolt/examples/bolt_macro_perf/beet.yml | 6 + .../src/data/demo/functions/export.mcfunction | 4 + .../src/data/demo/functions/func1.mcfunction | 8 ++ .../src/data/demo/functions/func2.mcfunction | 7 ++ .../src/data/demo/functions/lib.mcfunction | 13 ++ ...examples__build_bolt_macro_perf__0.pack.md | 44 +++++++ 8 files changed, 167 insertions(+), 56 deletions(-) create mode 100644 packages/bolt/examples/bolt_macro_perf/beet.yml create mode 100644 packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/export.mcfunction create mode 100644 packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func1.mcfunction create mode 100644 packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func2.mcfunction create mode 100644 packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/lib.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index be556f73e..643ce2ea4 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -44,7 +44,7 @@ from dataclasses import dataclass from typing import Any, Optional, Union -from beet.core.utils import required_field +from beet.core.utils import JsonDict, required_field from mecha import ( AstChildren, AstCommand, @@ -268,6 +268,31 @@ class AstDeferredRoot(AstNode): class AstMacro(AstCommand): """Ast macro node.""" + def get_command_tree(self) -> JsonDict: + tree_root: JsonDict = {"type": "root"} + tree: JsonDict = tree_root + + for node in self.arguments: + if isinstance(node, AstMacroLiteral): + child = {"type": "literal"} + tree["children"] = {node.value: child} + elif isinstance(node, AstMacroMatchLiteral): + child = {"type": "literal"} + tree["children"] = {node.match.value: child} + elif isinstance(node, AstMacroMatchArgument): + child = {"type": "argument"} + child["parser"] = node.match_argument_parser.get_canonical_value() + if properties := node.match_argument_properties: + child["properties"] = properties.evaluate() + tree["children"] = {node.match_identifier.value: child} + else: + break + tree = child + + tree["executable"] = True + + return tree_root + @dataclass(frozen=True) class AstMacroCall(AstCommand): diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 5d17125c4..7af156a4e 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -7,6 +7,7 @@ "get_stream_deferred_locals", "get_stream_branch_scope", "get_stream_macro_scope", + "get_stream_pending_macros", "ToplevelHandler", "create_bolt_root_parser", "UndefinedIdentifier", @@ -50,9 +51,9 @@ import re from dataclasses import dataclass, field, replace -from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, cast +from typing import Any, Dict, FrozenSet, Iterable, List, Optional, Set, Tuple, cast -from beet.core.utils import JsonDict, log_time +from beet.core.utils import extra_field from mecha import ( AdjacentConstraint, AlternativeParser, @@ -62,6 +63,7 @@ AstResourceLocation, AstRoot, BasicLiteralParser, + CommandSpec, CommandTree, CommentDisambiguation, CompilationDatabase, @@ -141,17 +143,20 @@ def get_bolt_parsers( parsers: Dict[str, Parser], modules: ModuleManager ) -> Dict[str, Parser]: """Return the bolt parsers.""" + macro_handler = MacroHandler(parsers["command"]) + return { ################################################################################ # Command ################################################################################ - "root": ToplevelHandler(create_bolt_root_parser(parsers["root"]), modules), - "nested_root": create_bolt_root_parser(parsers["nested_root"]), + "root": ToplevelHandler( + parser=create_bolt_root_parser(parsers["root"], macro_handler), + modules=modules, + macro_handler=macro_handler, + ), + "nested_root": create_bolt_root_parser(parsers["nested_root"], macro_handler), "command": UndefinedIdentifierErrorHandler( - ImportStatementHandler( - parser=MacroHandler(GlobalNonlocalHandler(parsers["command"])), - modules=modules, - ) + ImportStatementHandler(GlobalNonlocalHandler(macro_handler), modules) ), "command:argument:bolt:if_block": delegate("bolt:if_block"), "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), @@ -425,9 +430,9 @@ def get_stream_branch_scope(stream: TokenStream) -> Set[str]: return stream.data.setdefault("branch_scope", set()) -def get_stream_macro_scope(stream: TokenStream) -> Set[str]: +def get_stream_macro_scope(stream: TokenStream) -> Dict[str, AstMacro]: """Return the macro identifiers currently available.""" - return stream.data.setdefault("macro_scope", set()) + return stream.data.setdefault("macro_scope", {}) def get_stream_pending_macros(stream: TokenStream) -> List[AstMacro]: @@ -442,6 +447,7 @@ class ToplevelHandler: parser: Parser modules: ModuleManager + macro_handler: "MacroHandler" def __call__(self, stream: TokenStream) -> Any: with self.modules.parse_push(self.modules.database.current), stream.provide( @@ -451,6 +457,8 @@ def __call__(self, stream: TokenStream) -> Any: ): node = self.parser(stream) + self.macro_handler.cache_local_spec(stream) + if isinstance(node, AstRoot) and isinstance( self.modules.database.current, Module ): @@ -459,11 +467,11 @@ def __call__(self, stream: TokenStream) -> Any: return node -def create_bolt_root_parser(parser: Parser): +def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): """Return parser for the root node for bolt.""" return DecoratorResolver( DeferredRootBacktracker( - FlushPendingIdentifiersParser( + parser=FlushPendingIdentifiersParser( FunctionConstraint( BreakContinueConstraint( parser=IfElseLoweringParser(parser), @@ -482,7 +490,8 @@ def create_bolt_root_parser(parser: Parser): "nonlocal:subcommand", }, ) - ) + ), + macro_handler=macro_handler, ) ) @@ -1046,23 +1055,21 @@ class MacroHandler: """Handle macros.""" parser: Parser + spec_cache: Dict[FrozenSet[AstMacro], CommandSpec] = extra_field( + default_factory=dict + ) def __call__(self, stream: TokenStream) -> Any: - scope = get_stream_scope(stream) - pending_macros = get_stream_pending_macros(stream) - should_flush = not ( scope[0] in ["macro", "from"] - if scope + if (scope := get_stream_scope(stream)) else ( (token := stream.peek()) and token.match(("literal", "macro"), ("literal", "from")) ) ) - - if should_flush and pending_macros: - self.inject_syntax(stream, *pending_macros) - pending_macros.clear() + if should_flush: + self.flush_pending_macros(stream) node = self.parser(stream) @@ -1071,7 +1078,7 @@ def __call__(self, stream: TokenStream) -> Any: if node.identifier == "macro:name:subcommand": node = self.create_macro(node) - pending_macros.append( + get_stream_pending_macros(stream).append( replace(node, arguments=AstChildren(node.arguments[:-1])) ) elif node.identifier in get_stream_macro_scope(stream): @@ -1080,8 +1087,7 @@ def __call__(self, stream: TokenStream) -> Any: return node - @classmethod - def create_macro(cls, command: AstCommand) -> AstMacro: + def create_macro(self, command: AstCommand) -> AstMacro: identifier_parts: List[str] = [] arguments: List[AstNode] = [] @@ -1108,12 +1114,31 @@ def create_macro(cls, command: AstCommand) -> AstMacro: return set_location(macro, command) - @classmethod - def inject_syntax(cls, stream: TokenStream, *macros: AstMacro): - spec = get_stream_spec(stream) + def flush_pending_macros(self, stream: TokenStream): + if pending_macros := get_stream_pending_macros(stream): + self.inject_syntax(stream, *pending_macros) + pending_macros.clear() + + def cache_local_spec(self, stream: TokenStream): + if stream.data.get("local_spec"): + scope_key = frozenset(get_stream_macro_scope(stream).values()) + self.spec_cache[scope_key] = get_stream_spec(stream) + stream.data["local_spec"] = False + + def inject_syntax(self, stream: TokenStream, *macros: AstMacro): macro_scope = get_stream_macro_scope(stream) - # TODO: Find a way to memoize resulting command spec + scope_key = frozenset(macros) | frozenset(macro_scope.values()) + if spec := self.spec_cache.get(scope_key): + stream.data["local_spec"] = False + stream.data["spec"] = spec + stream.data["macro_scope"] = { + macro.identifier: macro for macro in scope_key + } + return + + spec = get_stream_spec(stream) + if not stream.data.get("local_spec"): stream.data["local_spec"] = True spec = replace(spec, tree=spec.tree.copy(deep=True), prototypes={}) @@ -1122,30 +1147,8 @@ def inject_syntax(cls, stream: TokenStream, *macros: AstMacro): stream.data["macro_scope"] = macro_scope for macro in macros: - tree_root: JsonDict = {"type": "root"} - tree: JsonDict = tree_root - - for node in macro.arguments: - if isinstance(node, AstMacroLiteral): - child = {"type": "literal"} - tree["children"] = {node.value: child} - elif isinstance(node, AstMacroMatchLiteral): - child = {"type": "literal"} - tree["children"] = {node.match.value: child} - elif isinstance(node, AstMacroMatchArgument): - child = {"type": "argument"} - child["parser"] = node.match_argument_parser.get_canonical_value() - if properties := node.match_argument_properties: - child["properties"] = properties.evaluate() - tree["children"] = {node.match_identifier.value: child} - else: - break - tree = child - - tree["executable"] = True - - spec.tree.extend(CommandTree.parse_obj(tree_root)) - macro_scope.add(macro.identifier) + spec.tree.extend(CommandTree.parse_obj(macro.get_command_tree())) + macro_scope[macro.identifier] = macro spec.update() @@ -1352,6 +1355,7 @@ class DeferredRootBacktracker: """Parser for backtracking over deferred root nodes.""" parser: Parser + macro_handler: MacroHandler def __call__(self, stream: TokenStream) -> AstRoot: should_replace = False @@ -1374,9 +1378,7 @@ def __call__(self, stream: TokenStream) -> AstRoot: ): should_replace = True - if pending_macros := get_stream_pending_macros(stream): - MacroHandler.inject_syntax(stream, *pending_macros) - pending_macros.clear() + self.macro_handler.flush_pending_macros(stream) deferred_stream = deferred_root.stream deferred_stream.data["local_spec"] = False @@ -1387,6 +1389,8 @@ def __call__(self, stream: TokenStream) -> AstRoot: deferred_stream.data["pending_macros"] = [] nested_root = delegate("nested_root", deferred_stream) + self.macro_handler.cache_local_spec(deferred_stream) + command = replace( command, arguments=AstChildren([*command.arguments[:-1], nested_root]), diff --git a/packages/bolt/examples/bolt_macro_perf/beet.yml b/packages/bolt/examples/bolt_macro_perf/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_macro_perf/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/export.mcfunction b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/export.mcfunction new file mode 100644 index 000000000..9cf403809 --- /dev/null +++ b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/export.mcfunction @@ -0,0 +1,4 @@ +# Importing macros doesn't cause a command tree update when there is no code below + +from ./lib import foo1, foo2 +from ./lib import foo3 diff --git a/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func1.mcfunction b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func1.mcfunction new file mode 100644 index 000000000..7593c5e37 --- /dev/null +++ b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func1.mcfunction @@ -0,0 +1,8 @@ +# Importing multiple macros in a row will update the command tree in a single batch + +from ./lib import foo1, foo2 +from ./lib import foo3 + +foo1 +foo2 +foo3 diff --git a/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func2.mcfunction b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func2.mcfunction new file mode 100644 index 000000000..1388fe44a --- /dev/null +++ b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/func2.mcfunction @@ -0,0 +1,7 @@ +# If multiple scopes end up using the same set of macros they will share the same underlying command spec + +from ./export import foo1, foo2, foo3 + +foo1 +foo2 +foo3 diff --git a/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/lib.mcfunction b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/lib.mcfunction new file mode 100644 index 000000000..887e5383c --- /dev/null +++ b/packages/bolt/examples/bolt_macro_perf/src/data/demo/functions/lib.mcfunction @@ -0,0 +1,13 @@ +# Defining multiple macros in a row will update the command tree in a single batch + +macro foo1: + say foo1 + +macro foo2: + say foo2 + +macro foo3: + say foo3 + +macro foo4: + say foo4 diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md new file mode 100644 index 000000000..dab1ed917 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md @@ -0,0 +1,44 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function(strip_final_newline) demo:export` + +```mcfunction + +``` + +`@function demo:func1` + +```mcfunction +say foo1 +say foo2 +say foo3 +``` + +`@function demo:func2` + +```mcfunction +say foo1 +say foo2 +say foo3 +``` + +`@function(strip_final_newline) demo:lib` + +```mcfunction + +``` From fa930e18c6e148ac6b6c2c80deb160b298d6300a Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 15 Jul 2022 02:06:46 +0000 Subject: [PATCH 0941/1554] 0.12.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 6 ++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 11fd18e41..8fc526b66 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,12 @@ +## v0.12.1 (2022-07-15) +### Fix +* Memoize command trees ([`8c8911a`](https://github.com/mcbeet/bolt/commit/8c8911ae16e3c2829c0e33dbc3a2fab248505b81)) +* Make command tree updates lazy ([`ec17f74`](https://github.com/mcbeet/bolt/commit/ec17f7479072a63e8e81a8c17163d69c680a9b5e)) +* Minor tweaks ([`35a537e`](https://github.com/mcbeet/bolt/commit/35a537e9a4a6e471a17cfc99b8776bdc3135fd88)) + ## v0.12.0 (2022-07-13) ### Feature * Add macro imports ([`e8ca750`](https://github.com/mcbeet/bolt/commit/e8ca750c6664ffa610b09c17d00cb7f9eed445c8)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 63fc4cfde..80cd11869 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.0" +__version__ = "0.12.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index dea279ce9..5e22378bf 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.12.0" +version = "0.12.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From e4c69e7e31e00ff293ee8731c0c8d82ad59aa279 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 15 Jul 2022 04:09:11 +0200 Subject: [PATCH 0942/1554] fix: update beet --- packages/bolt/poetry.lock | 9 +++---- packages/bolt/pyproject.toml | 2 +- .../tests/snapshots/spec__prototypes__0.json | 24 +++++++++---------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index d9fc6353d..60d4b1e80 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.68.2" +version = "0.68.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "b6436d351c1a196182a0d422aea232775d367ae33d8ca1404bde0d14baff178e" +content-hash = "207701a862ad8a8416404f743fe1acdf9c94516498da161e1ef9b712136c0688" [metadata.files] atomicwrites = [ @@ -836,10 +836,7 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -beet = [ - {file = "beet-0.68.2-py3-none-any.whl", hash = "sha256:dddd10e0dc2114d7ecfa7bd919a5550ac7ef8621ce788996f38fd285614dde22"}, - {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, -] +beet = [] black = [ {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 5e22378bf..42433bebd 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,7 +23,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.2" +beet = ">=0.68.3" mecha = ">=0.54.5" [tool.poetry.dev-dependencies] diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 74b020f34..7e115c467 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -23,9 +23,9 @@ "append:item_tag:name:content", "append:worldgen_biome_tag:name:content", "append:worldgen_configured_carver_tag:name:content", - "append:worldgen_configured_structure_feature_tag:name:content", "append:worldgen_placed_feature_tag:name:content", "append:worldgen_structure_set_tag:name:content", + "append:worldgen_structure_tag:name:content", "as:targets:subcommand", "at:targets:subcommand", "attribute:target:attribute:base:get", @@ -275,9 +275,9 @@ "execute:append:item_tag:name:content", "execute:append:worldgen_biome_tag:name:content", "execute:append:worldgen_configured_carver_tag:name:content", - "execute:append:worldgen_configured_structure_feature_tag:name:content", "execute:append:worldgen_placed_feature_tag:name:content", "execute:append:worldgen_structure_set_tag:name:content", + "execute:append:worldgen_structure_tag:name:content", "execute:as:targets:subcommand", "execute:at:targets:subcommand", "execute:attribute:target:attribute:base:get", @@ -762,8 +762,6 @@ "execute:merge:worldgen_configured_carver:name:content", "execute:merge:worldgen_configured_carver_tag:name:content", "execute:merge:worldgen_configured_feature:name:content", - "execute:merge:worldgen_configured_structure_feature:name:content", - "execute:merge:worldgen_configured_structure_feature_tag:name:content", "execute:merge:worldgen_configured_surface_builder:name:content", "execute:merge:worldgen_density_function:name:content", "execute:merge:worldgen_noise:name:content", @@ -771,8 +769,10 @@ "execute:merge:worldgen_placed_feature:name:content", "execute:merge:worldgen_placed_feature_tag:name:content", "execute:merge:worldgen_processor_list:name:content", + "execute:merge:worldgen_structure:name:content", "execute:merge:worldgen_structure_set:name:content", "execute:merge:worldgen_structure_set_tag:name:content", + "execute:merge:worldgen_structure_tag:name:content", "execute:merge:worldgen_template_pool:name:content", "execute:model:name:content", "execute:msg:targets:message", @@ -863,9 +863,9 @@ "execute:prepend:item_tag:name:content", "execute:prepend:worldgen_biome_tag:name:content", "execute:prepend:worldgen_configured_carver_tag:name:content", - "execute:prepend:worldgen_configured_structure_feature_tag:name:content", "execute:prepend:worldgen_placed_feature_tag:name:content", "execute:prepend:worldgen_structure_set_tag:name:content", + "execute:prepend:worldgen_structure_tag:name:content", "execute:publish:port", "execute:recipe:give:targets:*", "execute:recipe:give:targets:recipe", @@ -1112,8 +1112,6 @@ "execute:worldgen_configured_carver:name:content", "execute:worldgen_configured_carver_tag:name:content", "execute:worldgen_configured_feature:name:content", - "execute:worldgen_configured_structure_feature:name:content", - "execute:worldgen_configured_structure_feature_tag:name:content", "execute:worldgen_configured_surface_builder:name:content", "execute:worldgen_density_function:name:content", "execute:worldgen_noise:name:content", @@ -1121,8 +1119,10 @@ "execute:worldgen_placed_feature:name:content", "execute:worldgen_placed_feature_tag:name:content", "execute:worldgen_processor_list:name:content", + "execute:worldgen_structure:name:content", "execute:worldgen_structure_set:name:content", "execute:worldgen_structure_set_tag:name:content", + "execute:worldgen_structure_tag:name:content", "execute:worldgen_template_pool:name:content", "execute:xp:add:targets:amount", "execute:xp:add:targets:amount:levels", @@ -1416,8 +1416,6 @@ "merge:worldgen_configured_carver:name:content", "merge:worldgen_configured_carver_tag:name:content", "merge:worldgen_configured_feature:name:content", - "merge:worldgen_configured_structure_feature:name:content", - "merge:worldgen_configured_structure_feature_tag:name:content", "merge:worldgen_configured_surface_builder:name:content", "merge:worldgen_density_function:name:content", "merge:worldgen_noise:name:content", @@ -1425,8 +1423,10 @@ "merge:worldgen_placed_feature:name:content", "merge:worldgen_placed_feature_tag:name:content", "merge:worldgen_processor_list:name:content", + "merge:worldgen_structure:name:content", "merge:worldgen_structure_set:name:content", "merge:worldgen_structure_set_tag:name:content", + "merge:worldgen_structure_tag:name:content", "merge:worldgen_template_pool:name:content", "model:name:content", "msg:targets:message", @@ -1521,9 +1521,9 @@ "prepend:item_tag:name:content", "prepend:worldgen_biome_tag:name:content", "prepend:worldgen_configured_carver_tag:name:content", - "prepend:worldgen_configured_structure_feature_tag:name:content", "prepend:worldgen_placed_feature_tag:name:content", "prepend:worldgen_structure_set_tag:name:content", + "prepend:worldgen_structure_tag:name:content", "publish", "publish:port", "recipe:give:targets:*", @@ -1787,8 +1787,6 @@ "worldgen_configured_carver:name:content", "worldgen_configured_carver_tag:name:content", "worldgen_configured_feature:name:content", - "worldgen_configured_structure_feature:name:content", - "worldgen_configured_structure_feature_tag:name:content", "worldgen_configured_surface_builder:name:content", "worldgen_density_function:name:content", "worldgen_noise:name:content", @@ -1796,8 +1794,10 @@ "worldgen_placed_feature:name:content", "worldgen_placed_feature_tag:name:content", "worldgen_processor_list:name:content", + "worldgen_structure:name:content", "worldgen_structure_set:name:content", "worldgen_structure_set_tag:name:content", + "worldgen_structure_tag:name:content", "worldgen_template_pool:name:content", "xp:add:targets:amount", "xp:add:targets:amount:levels", From 162eacc833987bf09ff87db72efb478542eeb7ac Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 15 Jul 2022 02:10:30 +0000 Subject: [PATCH 0943/1554] 0.12.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 8fc526b66..b03b9d759 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.12.2 (2022-07-15) +### Fix +* Update beet ([`a4f2f97`](https://github.com/mcbeet/bolt/commit/a4f2f97feef98d9c9f624ffc82a3d8e5ff282337)) + ## v0.12.1 (2022-07-15) ### Fix * Memoize command trees ([`8c8911a`](https://github.com/mcbeet/bolt/commit/8c8911ae16e3c2829c0e33dbc3a2fab248505b81)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 80cd11869..129624070 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.1" +__version__ = "0.12.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 42433bebd..9108c6799 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.12.1" +version = "0.12.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From b779d0ae7378a0ba6a262ba48f440235de5a7ae5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 17 Jul 2022 03:31:10 +0200 Subject: [PATCH 0944/1554] feat: add proc macro --- packages/bolt/bolt/__init__.py | 1 + packages/bolt/bolt/ast.py | 22 ++ packages/bolt/bolt/codegen.py | 46 +++- packages/bolt/bolt/helpers.py | 37 +-- packages/bolt/bolt/macro.py | 52 ++++ packages/bolt/bolt/module.py | 29 +- packages/bolt/bolt/parse.py | 256 +++++++++++++++--- packages/bolt/bolt/resources/commands.json | 11 + packages/bolt/bolt/runtime.py | 42 +-- .../bolt/examples/bolt_proc_macro/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 19 ++ .../src/data/demo/functions/util.mcfunction | 27 ++ .../tests/resources/bolt_examples.mcfunction | 14 + .../tests/snapshots/bolt__parse_122__0.txt | 2 +- .../tests/snapshots/bolt__parse_138__1.txt | 6 +- .../tests/snapshots/bolt__parse_233__0.txt | 72 +++++ .../tests/snapshots/bolt__parse_233__1.txt | 18 ++ .../tests/snapshots/bolt__parse_234__0.txt | 80 ++++++ .../tests/snapshots/bolt__parse_234__1.txt | 18 ++ .../tests/snapshots/bolt__parse_235__0.txt | 139 ++++++++++ .../tests/snapshots/bolt__parse_235__1.txt | 22 ++ .../tests/snapshots/bolt__parse_236__0.txt | 7 + .../tests/snapshots/bolt__parse_41__1.txt | 6 +- .../tests/snapshots/bolt__parse_44__1.txt | 12 +- .../tests/snapshots/bolt__parse_45__1.txt | 6 +- .../tests/snapshots/bolt__parse_46__1.txt | 12 +- .../tests/snapshots/bolt__parse_63__1.txt | 6 +- ...examples__build_bolt_proc_macro__0.pack.md | 49 ++++ .../tests/snapshots/spec__prototypes__0.json | 1 + packages/bolt/tests/test_bolt.py | 4 + 30 files changed, 886 insertions(+), 136 deletions(-) create mode 100644 packages/bolt/bolt/macro.py create mode 100644 packages/bolt/examples/bolt_proc_macro/beet.yml create mode 100644 packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_233__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_233__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_234__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_234__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_235__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_235__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_236__0.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 129624070..529c3b4cf 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -5,6 +5,7 @@ from .codegen import * from .helpers import * from .loop_info import * +from .macro import * from .module import * from .parse import * from .plugin import * diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 643ce2ea4..de38971f2 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -33,6 +33,9 @@ "AstMacroMatch", "AstMacroMatchLiteral", "AstMacroMatchArgument", + "AstProcMacro", + "AstProcMacroMarker", + "AstProcMacroResult", "AstInterpolation", "AstFromImport", "AstImportedItem", @@ -305,6 +308,8 @@ class AstMacroLiteral(AstLiteral): parser = "bolt_macro_literal" + regex = re.compile(r"[^#:\s()]+") + @dataclass(frozen=True) class AstMacroArgument(AstLiteral): @@ -336,6 +341,23 @@ class AstMacroMatchArgument(AstMacroMatch): match_argument_properties: Optional[AstJson] = None +@dataclass(frozen=True) +class AstProcMacro(AstMacro): + """Ast proc macro node.""" + + +@dataclass(frozen=True) +class AstProcMacroMarker(AstNode): + """Ast proc macro marker node.""" + + +@dataclass(frozen=True) +class AstProcMacroResult(AstNode): + """Ast proc macro result node.""" + + commands: AstChildren[AstCommand] = required_field() + + @dataclass(frozen=True) class AstInterpolation(AstNode): """Ast interpolation node.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 7373bf95d..0a2153c5b 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -60,6 +60,7 @@ AstMacro, AstMacroCall, AstMacroMatchArgument, + AstProcMacro, AstSlice, AstTarget, AstTargetAttribute, @@ -84,6 +85,7 @@ class Accumulator: lines: List[str] = field(default_factory=list) counter: int = 0 header: Dict[str, str] = field(default_factory=dict) + root_scope: bool = True last_condition: str = "_bolt_error_last_condition" @@ -164,17 +166,19 @@ def make_macro(self, node: AstMacro) -> str: """Add macro to macro library.""" macro = self.get_macro(node.identifier) group = node.identifier.partition(":")[0] - self.macros.setdefault(group, {})[macro, node] = None + if self.root_scope: + self.macros.setdefault(group, {})[macro, node] = None return macro def import_macro(self, resource_location: str, node: AstImportedMacro) -> str: """Import macro into macro library.""" macro = self.get_macro(node.declaration.identifier) group = node.declaration.identifier.partition(":")[0] - self.macros.setdefault(group, {})[macro, node.declaration] = ( - resource_location, - node.name, - ) + if self.root_scope: + self.macros.setdefault(group, {})[macro, node.declaration] = ( + resource_location, + node.name, + ) return macro def get_macro(self, name: str) -> str: @@ -210,10 +214,10 @@ def function(self, name: str, *args: str): """Emit function.""" self.statement(f"def {name}({', '.join(args)}):") with self.block(): - previous_macros = self.macros - self.macros = {k: dict(v) for k, v in self.macros.items()} + previous_root = self.root_scope + self.root_scope = False yield - self.macros = previous_macros + self.root_scope = previous_root @contextmanager def if_statement(self, condition: str): @@ -588,6 +592,25 @@ def macro_call( return [f"*{result}"] + @rule(AstProcMacro) + def proc_macro( + self, + node: AstProcMacro, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + macro = acc.make_macro( + replace(node, arguments=AstChildren(node.arguments[:-1])) + ) + + with acc.function(macro, "stream"): + yield from visit_body(cast(AstRoot, node.arguments[-1]), acc) + + if acc.root_scope: + acc.header["_bolt_proc_macros"] = "{}" + acc.statement(f"_bolt_proc_macros[{node.identifier!r}] = {macro}") + + return [] + @rule(AstCommand, identifier="del:target") def del_statement( self, @@ -626,9 +649,12 @@ def while_statement( node: AstCommand, acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: - condition = yield from visit_single(node.arguments[0], required=True) - acc.statement(f"while {condition}:") + acc.statement(f"while True:") with acc.block(): + condition = yield from visit_single(node.arguments[0], required=True) + acc.statement(f"if not {condition}:") + with acc.block(): + acc.statement("break") yield from visit_body(cast(AstRoot, node.arguments[1]), acc) return [] diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 4548343a1..73a6b4a51 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -7,7 +7,7 @@ from functools import partial, wraps from importlib import import_module from types import TracebackType -from typing import Any, Callable, ContextManager, Dict, Generator, Optional, Type +from typing import Any, Callable, ContextManager, Dict, Optional, Type from uuid import UUID from mecha import ( @@ -32,7 +32,6 @@ AstPlayerName, AstRange, AstResourceLocation, - AstRoot, AstScoreboardSlot, AstSortOrder, AstString, @@ -46,6 +45,7 @@ ) from tokenstream import set_location +from .macro import invoke_macro from .utils import internal @@ -185,38 +185,7 @@ def python_import_module(name: str): @internal def macro_call(runtime: Any, function: Any, command: AstCommand): - with runtime.scope() as output: - result = function(*command.arguments) - - if isinstance(result, Generator): - try: - while True: - node: Any = next(result) # type: ignore - if isinstance(node, AstRoot): - runtime.commands.extend(node.commands) - elif isinstance(node, AstCommand): - runtime.commands.append(node) - elif node: - msg = f'Emit invalid command of type {type(node)!r} from macro "{command.identifier}".' - raise TypeError(msg) - except StopIteration as exc: - result = exc.value - - if not result: - result = [] - elif isinstance(result, AstNode): - result = [result] - - for node in result: - if isinstance(node, AstRoot): - output.extend(node.commands) - elif isinstance(node, AstCommand): - output.append(node) - elif node: - msg = f'Return invalid command of type {type(node)!r} from macro "{command.identifier}".' - raise TypeError(msg) - - return output + return invoke_macro(runtime, function, command.identifier, command.arguments) def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: diff --git a/packages/bolt/bolt/macro.py b/packages/bolt/bolt/macro.py new file mode 100644 index 000000000..96e664b9f --- /dev/null +++ b/packages/bolt/bolt/macro.py @@ -0,0 +1,52 @@ +__all__ = [ + "invoke_macro", +] + + +from typing import Any, Generator, Iterable + +from mecha import AstCommand, AstNode, AstRoot + +from .utils import internal + + +@internal +def invoke_macro( + runtime: Any, + function: Any, + identifier: str, + arguments: Iterable[Any], +): + """Invoke a user-defined macro and return the list of generated commands.""" + with runtime.scope() as output: + result = function(*arguments) + + if isinstance(result, Generator): + try: + while True: + node: Any = next(result) # type: ignore + if isinstance(node, AstRoot): + runtime.commands.extend(node.commands) + elif isinstance(node, AstCommand): + runtime.commands.append(node) + elif node: + msg = f'Emit invalid command of type {type(node)!r} from macro "{identifier}".' + raise TypeError(msg) + except StopIteration as exc: + result = exc.value + + if not result: + result = [] + elif isinstance(result, AstNode): + result = [result] + + for node in result: + if isinstance(node, AstRoot): + output.extend(node.commands) + elif isinstance(node, AstCommand): + output.append(node) + elif node: + msg = f'Return invalid command of type {type(node)!r} from macro "{identifier}".' + raise TypeError(msg) + + return output diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index 14d2ea934..d5dd014fe 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -31,17 +31,20 @@ cast, ) -from beet import TextFile, TextFileBase +from beet import BubbleException, Cache, TextFile, TextFileBase from beet.core.utils import JsonDict, extra_field, import_from_string, required_field from mecha import ( AstCacheBackend, AstRoot, CompilationDatabase, + CompilationError, CompilationUnit, + DiagnosticCollection, DiagnosticError, Dispatcher, MechaError, ) +from tokenstream import InvalidSyntax from .ast import AstMacro from .utils import internal, rewrite_traceback @@ -120,6 +123,7 @@ class ModuleManager(Mapping[TextFileBase[Any], CompiledModule]): database: CompilationDatabase = extra_field() codegen: Dispatcher[CodegenResult] = extra_field() parse_callback: ModuleParseCallback = extra_field() + cache: Optional[Cache] = extra_field(default=None) registry: Dict[TextFileBase[Any], CompiledModule] = extra_field( default_factory=dict @@ -272,14 +276,33 @@ def eval(self, module: CompiledModule) -> AstRoot: try: exec(module.code, module.namespace) - except Exception as exc: - raise rewrite_traceback(exc) from None finally: module.executing = False self.stack.pop() return module.namespace[module.output] + @contextmanager + @internal + def error_handler(self, message: str, resource_location: Optional[str] = None): + """Error handler for running module code.""" + try: + yield + except (BubbleException, InvalidSyntax): + raise + except UnusableCompilationUnit as exc: + print(exc) + if not exc.compilation_unit.diagnostics.error: + message = "Failed to instantiate module." + if resource_location: + message += f" ({resource_location})" + raise CompilationError(message) from rewrite_traceback(exc) + raise DiagnosticCollection() from None + except Exception as exc: + if resource_location: + message += f" ({resource_location})" + raise CompilationError(message) from rewrite_traceback(exc) + @contextmanager def parse_push(self, current: TextFileBase[Any]): """Push the current file onto the parse stack.""" diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 7af156a4e..47069e956 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -24,8 +24,11 @@ "FlushPendingIdentifiersParser", "parse_deferred_root", "parse_function_signature", + "parse_proc_macro_signature", "MacroMatchParser", "MacroHandler", + "ProcMacroParser", + "ProcMacroExpansion", "parse_del_target", "parse_identifier", "TrailingCommaParser", @@ -59,6 +62,7 @@ AlternativeParser, AstChildren, AstCommand, + AstJson, AstNode, AstResourceLocation, AstRoot, @@ -71,6 +75,7 @@ Parser, consume_line_continuation, delegate, + get_stream_properties, get_stream_scope, get_stream_spec, ) @@ -113,6 +118,9 @@ AstMacroMatchArgument, AstMacroMatchLiteral, AstModuleRoot, + AstProcMacro, + AstProcMacroMarker, + AstProcMacroResult, AstSlice, AstTarget, AstTargetAttribute, @@ -123,6 +131,7 @@ AstUnpack, AstValue, ) +from .macro import invoke_macro from .module import Module, ModuleManager, UnusableCompilationUnit from .pattern import ( FALSE_PATTERN, @@ -134,7 +143,7 @@ STRING_PATTERN, TRUE_PATTERN, ) -from .utils import suggest_typo +from .utils import internal, suggest_typo IMPORT_REGEX = re.compile(rf"^{MODULE_PATTERN}$") @@ -143,7 +152,14 @@ def get_bolt_parsers( parsers: Dict[str, Parser], modules: ModuleManager ) -> Dict[str, Parser]: """Return the bolt parsers.""" - macro_handler = MacroHandler(parsers["command"]) + macro_handler = MacroHandler( + parser=parsers["command"], + proc_macro_overloads=( + modules.cache.json.setdefault("proc_macro_overloads", {}) + if modules.cache + else {} + ), + ) return { ################################################################################ @@ -174,7 +190,9 @@ def get_bolt_parsers( "command:argument:bolt:deferred_root": delegate("bolt:deferred_root"), "command:argument:bolt:function_signature": delegate("bolt:function_signature"), "command:argument:bolt:macro_name": delegate("bolt:macro_name"), + "command:argument:bolt:macro_signature": delegate("bolt:macro_signature"), "command:argument:bolt:macro_match": delegate("bolt:macro_match"), + "command:argument:bolt:proc_macro": delegate("bolt:proc_macro"), "command:argument:bolt:del_target": delegate("bolt:del_target"), ################################################################################ # Bolt @@ -210,6 +228,7 @@ def get_bolt_parsers( "bolt_macro_argument": delegate("bolt:macro_argument"), "bolt:macro_argument": BasicLiteralParser(AstMacroArgument), "bolt:macro_name": delegate("bolt:macro_literal"), + "bolt:macro_signature": parse_proc_macro_signature, "bolt:macro_match": MacroMatchParser( literal_parser=delegate("bolt:macro_literal"), argument_parser=delegate("bolt:macro_argument"), @@ -220,6 +239,7 @@ def get_bolt_parsers( AdjacentConstraint(MultilineParser(delegate("json_object")), r"\{") ), ), + "bolt:proc_macro": ProcMacroParser(modules), "bolt:del_target": parse_del_target, "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), "bolt:identifier": parse_identifier, @@ -450,7 +470,10 @@ class ToplevelHandler: macro_handler: "MacroHandler" def __call__(self, stream: TokenStream) -> Any: - with self.modules.parse_push(self.modules.database.current), stream.provide( + current = self.modules.database.current + + with self.modules.parse_push(current), stream.provide( + resource_location=self.modules.database[current].resource_location, identifiers=set(self.modules.globals) | self.modules.builtins | {"__name__"}, @@ -459,9 +482,7 @@ def __call__(self, stream: TokenStream) -> Any: self.macro_handler.cache_local_spec(stream) - if isinstance(node, AstRoot) and isinstance( - self.modules.database.current, Module - ): + if isinstance(node, AstRoot) and isinstance(current, Module): node = set_location(AstModuleRoot(commands=node.commands), node) return node @@ -469,29 +490,31 @@ def __call__(self, stream: TokenStream) -> Any: def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): """Return parser for the root node for bolt.""" - return DecoratorResolver( - DeferredRootBacktracker( - parser=FlushPendingIdentifiersParser( - FunctionConstraint( - BreakContinueConstraint( - parser=IfElseLoweringParser(parser), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), + return ProcMacroExpansion( + DecoratorResolver( + DeferredRootBacktracker( + parser=FlushPendingIdentifiersParser( + FunctionConstraint( + BreakContinueConstraint( + parser=IfElseLoweringParser(parser), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ), + command_identifiers={ + "return", + "return:value", + "yield", + "yield:value", + "yield:from:value", + "global:subcommand", + "nonlocal:subcommand", }, - ), - command_identifiers={ - "return", - "return:value", - "yield", - "yield:value", - "yield:from:value", - "global:subcommand", - "nonlocal:subcommand", - }, - ) - ), - macro_handler=macro_handler, + ) + ), + macro_handler=macro_handler, + ) ) ) @@ -760,7 +783,7 @@ def __call__(self, stream: TokenStream) -> AstRoot: result.append(command) if stack: - exc = InvalidSyntax("Can not apply decorator to nothing.") + exc = InvalidSyntax("Can't apply decorator to nothing.") raise set_location(exc, stack[-1]) if changed: @@ -1005,6 +1028,19 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: return set_location(node, identifier, stream.current) +def parse_proc_macro_signature(stream: TokenStream): + """Parse proc macro signature.""" + with stream.syntax(brace=r"\(|\)", identifier=IDENTIFIER_PATTERN): + begin = stream.expect(("brace", "(")) + stream.expect(("identifier", "stream")) + end = stream.expect(("brace", ")")) + + get_stream_pending_identifiers(stream).add("stream") + get_stream_deferred_locals(stream).add("stream") + + return set_location(AstProcMacroMarker(), begin, end) + + @dataclass class MacroMatchParser: """Parser for macro matching.""" @@ -1055,6 +1091,8 @@ class MacroHandler: """Handle macros.""" parser: Parser + + proc_macro_overloads: Dict[str, Dict[str, int]] = extra_field(default_factory=dict) spec_cache: Dict[FrozenSet[AstMacro], CommandSpec] = extra_field( default_factory=dict ) @@ -1077,17 +1115,25 @@ def __call__(self, stream: TokenStream) -> Any: return node if node.identifier == "macro:name:subcommand": - node = self.create_macro(node) - get_stream_pending_macros(stream).append( - replace(node, arguments=AstChildren(node.arguments[:-1])) - ) - elif node.identifier in get_stream_macro_scope(stream): - call = AstMacroCall(identifier=node.identifier, arguments=node.arguments) - node = set_location(call, node) + node = self.create_macro(node, stream.data.get("resource_location")) + if not isinstance(node, AstProcMacro): + declaration = replace(node, arguments=AstChildren(node.arguments[:-1])) + get_stream_pending_macros(stream).append(declaration) + + elif macro := get_stream_macro_scope(stream).get(node.identifier): + if not isinstance(macro, AstProcMacro): + node = set_location( + AstMacroCall(identifier=node.identifier, arguments=node.arguments), + node, + ) return node - def create_macro(self, command: AstCommand) -> AstMacro: + def create_macro( + self, + command: AstCommand, + resource_location: Optional[str] = None, + ) -> AstMacro: identifier_parts: List[str] = [] arguments: List[AstNode] = [] @@ -1105,6 +1151,44 @@ def create_macro(self, command: AstCommand) -> AstMacro: arguments.append(node.arguments[0]) node = subcommand + if isinstance(marker := node.arguments[0], AstProcMacroMarker): + identifier = ":".join(identifier_parts) + + if not resource_location: + message = f'Can\'t define proc macro "{identifier_parts[0]}" without resource location information.' + raise set_location(InvalidSyntax(message), arguments[0], marker) + + for argument in arguments: + if isinstance(argument, AstMacroMatchArgument): + message = f'Proc macro "{identifier_parts[0]}" contains non-literal match.' + raise set_location(InvalidSyntax(message), argument) + + macro_overload = self.proc_macro_overloads.setdefault(resource_location, {}) + overload_id = macro_overload.setdefault(identifier, 0) + macro_overload[identifier] += 1 + + argument = f"proc_macro_overload{overload_id}" + identifier = f"{identifier}:{argument}" + + match_node = AstMacroMatchArgument( + match_identifier=AstMacroArgument(value=argument), + match_argument_parser=AstResourceLocation.from_value("bolt:proc_macro"), + match_argument_properties=AstJson.from_value( + { + "resource_location": resource_location, + "identifier": identifier, + } + ), + ) + arguments.append(match_node) + arguments.append(node.arguments[-1]) + + macro = AstProcMacro( + identifier=identifier, + arguments=AstChildren(arguments), + ) + return set_location(macro, command) + arguments.append(node.arguments[0]) macro = AstMacro( @@ -1127,8 +1211,11 @@ def cache_local_spec(self, stream: TokenStream): def inject_syntax(self, stream: TokenStream, *macros: AstMacro): macro_scope = get_stream_macro_scope(stream) - scope_key = frozenset(macros) | frozenset(macro_scope.values()) + + if len(macro_scope) == len(scope_key): + return + if spec := self.spec_cache.get(scope_key): stream.data["local_spec"] = False stream.data["spec"] = spec @@ -1153,6 +1240,76 @@ def inject_syntax(self, stream: TokenStream, *macros: AstMacro): spec.update() +@dataclass +class ProcMacroParser: + """Parser for invoking proc macros.""" + + modules: ModuleManager + + @internal + def __call__(self, stream: TokenStream) -> AstProcMacroResult: + properties = get_stream_properties(stream) + resource_location = properties["resource_location"] + identifier = properties["identifier"] + + module = self.modules[resource_location] + runtime = module.namespace["_bolt_runtime"] + macro = module.namespace["_bolt_proc_macros"][identifier] + + with self.modules.error_handler( + "Proc macro raised an exception.", resource_location + ): + result = invoke_macro(runtime, macro, identifier, [stream]) + + return AstProcMacroResult(commands=AstChildren(result)) + + +@dataclass +class ProcMacroExpansion: + """Expand proc macro results.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> AstRoot: + should_replace = False + commands: List[AstCommand] = [] + + node: AstRoot = self.parser(stream) + + for command in node.commands: + stack: List[AstCommand] = [command] + + while command.arguments and isinstance( + command := command.arguments[-1], AstCommand + ): + stack.append(command) + + command = stack.pop() + + if command.arguments and isinstance( + result := command.arguments[-1], AstProcMacroResult + ): + should_replace = True + + for expansion in result.commands: + for prefix in reversed(stack): + args = AstChildren([*prefix.arguments[:-1], expansion]) + expansion = replace(prefix, arguments=args) + commands.append(expansion) + + continue + + elif stack: + command = stack[0] + + commands.append(command) + + if should_replace: + return replace(node, commands=AstChildren(commands)) + + return node + + def parse_del_target(stream: TokenStream) -> AstTarget: node = delegate("bolt:expression", stream) @@ -1253,18 +1410,21 @@ def handle_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: return node + @internal def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: identifiers = get_stream_identifiers(stream) identifiers_storage = get_stream_identifiers_storage(stream) pending_macros = get_stream_pending_macros(stream) module = cast(AstResourceLocation, node.arguments[0]) + target_name = module.get_value() + target = self.modules.database.index.get(target_name) try: compiled_module = ( - isinstance(module := node.arguments[0], AstResourceLocation) - and bool(module.namespace) - and self.modules.get(module.get_value()) + target + and target not in self.modules.parse_stack + and self.modules.get(target) ) except UnusableCompilationUnit: compiled_module = None @@ -1279,13 +1439,27 @@ def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstComman imported_macro = AstImportedMacro(name=name, declaration=macro) arguments.append(set_location(imported_macro, item)) pending_macros.append(macro) + + if not compiled_module.executed and isinstance( + macro, AstProcMacro + ): + with self.modules.error_handler( + "Top-level statement raised an exception.", + target_name, + ), self.modules.parse_push( + target # type: ignore + ): + self.modules.eval(compiled_module) + elif item.identifier: arguments.append(item) identifiers.add(item.name) identifiers_storage.setdefault(item.name, "local") + else: exc = InvalidSyntax(f'Invalid identifier "{item.name}".') raise set_location(exc, item) + if subcommand.identifier == "from:module:import:name:subcommand": subcommand = cast(AstCommand, subcommand.arguments[1]) else: diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 6a473dbeb..9b3997433 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -61,6 +61,17 @@ "type": "argument", "parser": "bolt:macro_name", "children": { + "proc": { + "type": "argument", + "parser": "bolt:macro_signature", + "children": { + "body": { + "type": "argument", + "parser": "bolt:deferred_root", + "executable": true + } + } + }, "match": { "type": "argument", "parser": "bolt:macro_match", diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index ddac160bf..262890d11 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -11,15 +11,13 @@ from importlib.resources import read_text from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union -from beet import BubbleException, Context, generate_tree +from beet import Context, generate_tree from beet.core.utils import JsonDict, required_field from mecha import ( AstCommand, AstRoot, CommandTree, - CompilationError, Diagnostic, - DiagnosticCollection, Dispatcher, Mecha, Visitor, @@ -31,13 +29,7 @@ from .codegen import Codegen from .helpers import get_bolt_helpers from .loop_info import loop_info -from .module import ( - CompiledModule, - Module, - ModuleCacheBackend, - ModuleManager, - UnusableCompilationUnit, -) +from .module import CompiledModule, Module, ModuleCacheBackend, ModuleManager from .parse import get_bolt_parsers from .utils import internal @@ -106,6 +98,7 @@ def __init__(self, ctx: Union[Context, Mecha]): database=mc.database, codegen=Codegen(), parse_callback=mc.parse, + cache=mc.cache, globals=self.globals, builtins=self.builtins, ) @@ -147,11 +140,9 @@ def scope( @internal def import_module(self, resource_location: str) -> CompiledModule: """Import module.""" - try: - module = self.modules[resource_location] - except KeyError: - msg = f'Couldn\'t import "{resource_location}".' - raise ImportError(msg) from None + module = self.modules.get(resource_location) + if not module: + raise ImportError(f'Couldn\'t import "{resource_location}".') if not module.executing: self.modules.eval(module) return module @@ -163,8 +154,8 @@ def from_module_import(self, resource_location: str, *args: str) -> Any: try: values = [module.namespace[name] for name in args] except KeyError as exc: - msg = f'Couldn\'t import {exc} from "{resource_location}".' - raise ImportError(msg) from None + message = f'Couldn\'t import {exc} from "{resource_location}".' + raise ImportError(message) from None return values[0] if len(values) == 1 else values def finalize(self, ctx: Context): @@ -180,22 +171,13 @@ class Evaluator(Visitor): modules: ModuleManager = required_field() @rule(AstRoot) + @internal def root(self, node: AstRoot) -> AstRoot: module = self.modules.match_ast(node) - try: + with self.modules.error_handler( + "Top-level statement raised an exception.", module.resource_location + ): return self.modules.eval(module) - except BubbleException: - raise - except UnusableCompilationUnit as exc: - if not exc.compilation_unit.diagnostics.error: - raise - raise DiagnosticCollection() - except Exception as exc: - msg = "Top-level statement raised an exception." - if module.resource_location: - msg += f" ({module.resource_location})" - tb = exc.__traceback__.tb_next.tb_next # type: ignore - raise CompilationError(msg) from exc.with_traceback(tb) @rule(AstModuleRoot) diff --git a/packages/bolt/examples/bolt_proc_macro/beet.yml b/packages/bolt/examples/bolt_proc_macro/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_proc_macro/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..690f0a24e --- /dev/null +++ b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,19 @@ +from ./util import repeat + +value = 3 + +repeat 7: + value += 1 + +repeat 3: + say value + +as @a run repeat 3: + say value + +repeat until value < 5: + say value + value -= 1 + +repeat until @a[scores={counter=10}]: + scoreboard players add @r counter 1 diff --git a/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction new file mode 100644 index 000000000..d998e312b --- /dev/null +++ b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction @@ -0,0 +1,27 @@ +from mecha import delegate, AstCommand, AstChildren +from bolt import AstExpressionUnary + +macro repeat(stream): + with stream.syntax(count="[0-9]+"): + token = stream.expect("count") + body = delegate("nested_root", stream) + return int(token.value) * [body] + +macro repeat until(stream): + condition = delegate("bolt:expression", stream) + body = delegate("nested_root", stream) + return AstCommand( + identifier="while:condition:body", + arguments=AstChildren([ + AstExpressionUnary(operator="not", value=condition), + body, + ]) + ) + +macro repeat until(stream): + entity = delegate("selector", stream) + body = delegate("nested_root", stream) + path = generate_path() + execute function path: + yield body + unless entity entity function path diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 5cef25b8d..2ecf0c613 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -870,3 +870,17 @@ as @p foo ### macro macro: pass +### +macro foo(stream): + pass +### +macro foo bar(stream): + pass +### +macro foo(stream): + pass +macro foo(stream): + pass +### +macro foo message=minecraft:message(stream): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_122__0.txt b/packages/bolt/tests/snapshots/bolt__parse_122__0.txt index 48755d502..7b9446c61 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_122__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_122__0.txt @@ -1,4 +1,4 @@ -#>ERROR Can't resolve relative resource location './thing'. +#>ERROR Can't import "demo:thing" without alias. # line 1, column 8 # 1 | import ./thing # : ^^^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_138__1.txt b/packages/bolt/tests/snapshots/bolt__parse_138__1.txt index 91517470d..9d34b8939 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_138__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_138__1.txt @@ -4,8 +4,10 @@ _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var2: - _bolt_var0 = True - while _bolt_var0: + while True: + _bolt_var0 = True + if not _bolt_var0: + break _bolt_var1 = 'hello' with _bolt_helper_branch(_bolt_var1) as _bolt_condition: if _bolt_condition: diff --git a/packages/bolt/tests/snapshots/bolt__parse_233__0.txt b/packages/bolt/tests/snapshots/bolt__parse_233__0.txt new file mode 100644 index 000000000..2b0025b75 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_233__0.txt @@ -0,0 +1,72 @@ +macro foo(stream): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'foo:proc_macro_overload0' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + match_identifier: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'proc_macro_overload0' + match_argument_parser: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + is_tag: False + namespace: 'bolt' + path: 'proc_macro' + match_argument_properties: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + entries: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'resource_location' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'demo:test' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'identifier' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'foo:proc_macro_overload0' + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_233__1.txt b/packages/bolt/tests/snapshots/bolt__parse_233__1.txt new file mode 100644 index 000000000..ecb5a5500 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_233__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_proc_macros = {} +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def _bolt_macro0(stream): + pass + _bolt_proc_macros['foo:proc_macro_overload0'] = _bolt_macro0 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_234__0.txt b/packages/bolt/tests/snapshots/bolt__parse_234__0.txt new file mode 100644 index 000000000..0d2c6de77 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_234__0.txt @@ -0,0 +1,80 @@ +macro foo bar(stream): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'foo:bar:proc_macro_overload0' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + match: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'bar' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + match_identifier: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'proc_macro_overload0' + match_argument_parser: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + is_tag: False + namespace: 'bolt' + path: 'proc_macro' + match_argument_properties: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + entries: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'resource_location' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'demo:test' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'identifier' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'foo:bar:proc_macro_overload0' + + location: SourceLocation(pos=27, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=27, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_234__1.txt b/packages/bolt/tests/snapshots/bolt__parse_234__1.txt new file mode 100644 index 000000000..ce346da1b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_234__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_proc_macros = {} +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def _bolt_macro0(stream): + pass + _bolt_proc_macros['foo:bar:proc_macro_overload0'] = _bolt_macro0 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_235__0.txt b/packages/bolt/tests/snapshots/bolt__parse_235__0.txt new file mode 100644 index 000000000..570910987 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_235__0.txt @@ -0,0 +1,139 @@ +macro foo(stream): + pass +macro foo(stream): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=4, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'foo:proc_macro_overload1' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + match_identifier: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'proc_macro_overload1' + match_argument_parser: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + is_tag: False + namespace: 'bolt' + path: 'proc_macro' + match_argument_properties: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + entries: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'resource_location' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'demo:test' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'identifier' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'foo:proc_macro_overload1' + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=55, lineno=4, colno=9) + identifier: 'foo:proc_macro_overload2' + arguments: + + location: SourceLocation(pos=34, lineno=3, colno=7) + end_location: SourceLocation(pos=37, lineno=3, colno=10) + value: 'foo' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + match_identifier: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'proc_macro_overload2' + match_argument_parser: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + is_tag: False + namespace: 'bolt' + path: 'proc_macro' + match_argument_properties: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + entries: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'resource_location' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'demo:test' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'identifier' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'foo:proc_macro_overload2' + + location: SourceLocation(pos=51, lineno=4, colno=5) + end_location: SourceLocation(pos=55, lineno=4, colno=9) + commands: + + location: SourceLocation(pos=51, lineno=4, colno=5) + end_location: SourceLocation(pos=55, lineno=4, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_235__1.txt b/packages/bolt/tests/snapshots/bolt__parse_235__1.txt new file mode 100644 index 000000000..d6b44b080 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_235__1.txt @@ -0,0 +1,22 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_proc_macros = {} +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def _bolt_macro0(stream): + pass + _bolt_proc_macros['foo:proc_macro_overload1'] = _bolt_macro0 + def _bolt_macro1(stream): + pass + _bolt_proc_macros['foo:proc_macro_overload2'] = _bolt_macro1 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=4, colno=9) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_236__0.txt b/packages/bolt/tests/snapshots/bolt__parse_236__0.txt new file mode 100644 index 000000000..78510922e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_236__0.txt @@ -0,0 +1,7 @@ +#>ERROR Proc macro "foo" contains non-literal match. +# line 1, column 11 +# 1 | macro foo message=minecraft:message(stream): +# : ^^^^^^^^^^^^^^^^^^^^^^^^^ +# 2 | pass +macro foo message=minecraft:message(stream): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_41__1.txt b/packages/bolt/tests/snapshots/bolt__parse_41__1.txt index 39fad9f30..9d330d75c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_41__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_41__1.txt @@ -2,8 +2,10 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = True - while _bolt_var0: + while True: + _bolt_var0 = True + if not _bolt_var0: + break _bolt_runtime.commands.extend(_bolt_refs[0].commands) _bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- diff --git a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt index d4a949c9e..79d610c67 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt @@ -3,11 +3,15 @@ _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var3: with _bolt_runtime.scope() as _bolt_var2: - _bolt_var0 = True - while _bolt_var0: + while True: + _bolt_var0 = True + if not _bolt_var0: + break _bolt_runtime.commands.extend(_bolt_refs[0].commands) - _bolt_var1 = True - while _bolt_var1: + while True: + _bolt_var1 = True + if not _bolt_var1: + break _bolt_runtime.commands.extend(_bolt_refs[1].commands) _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_refs[5], _bolt_refs[6], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2))]))]))]))) _bolt_var4 = _bolt_helper_replace(_bolt_refs[9], commands=_bolt_helper_children(_bolt_var3)) diff --git a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt index e1d690806..8e56d720a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt @@ -3,8 +3,10 @@ _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var2: with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = True - while _bolt_var0: + while True: + _bolt_var0 = True + if not _bolt_var0: + break _bolt_runtime.commands.extend(_bolt_refs[0].commands) _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1))]))]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var2)) diff --git a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt index 1a2aacf31..627e99bb7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt @@ -1,4 +1,4 @@ -_bolt_lineno = [1, 8, 9, 14], [1, 2, 3, 5] +_bolt_lineno = [1, 8, 10, 16], [1, 2, 3, 5] _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] @@ -6,10 +6,12 @@ with _bolt_runtime.scope() as _bolt_var6: with _bolt_runtime.scope() as _bolt_var5: _bolt_var0 = 42 count = _bolt_var0 - _bolt_var1 = count - _bolt_var2 = 0 - _bolt_var1 = _bolt_var1 > _bolt_var2 - while _bolt_var1: + while True: + _bolt_var1 = count + _bolt_var2 = 0 + _bolt_var1 = _bolt_var1 > _bolt_var2 + if not _bolt_var1: + break _bolt_runtime.commands.append(_bolt_refs[0]) _bolt_var3 = count _bolt_var4 = 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_63__1.txt b/packages/bolt/tests/snapshots/bolt__parse_63__1.txt index 8837f4fc6..082f9c7c7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_63__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_63__1.txt @@ -2,8 +2,10 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = False - while _bolt_var0: + while True: + _bolt_var0 = False + if not _bolt_var0: + break break _bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md new file mode 100644 index 000000000..73b76564a --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md @@ -0,0 +1,49 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say 10 +say 10 +say 10 +execute as @a run say 10 +execute as @a run say 10 +execute as @a run say 10 +say 10 +say 9 +say 8 +say 7 +say 6 +say 5 +function bolt_proc_macro:generated_0 +``` + +`@function(strip_final_newline) demo:util` + +```mcfunction + +``` + +### bolt_proc_macro + +`@function bolt_proc_macro:generated_0` + +```mcfunction +scoreboard players add @r counter 1 +execute unless entity @a[scores={counter=10}] run function bolt_proc_macro:generated_0 +``` diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 7e115c467..cf331ebe2 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -1388,6 +1388,7 @@ "loot_table:name:content", "macro:name:body", "macro:name:match:subcommand", + "macro:name:proc:body", "macro:name:subcommand", "me:action", "merge:advancement:name:content", diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py index fced7b7ab..962928b50 100644 --- a/packages/bolt/tests/test_bolt.py +++ b/packages/bolt/tests/test_bolt.py @@ -28,10 +28,14 @@ def test_parse(snapshot: SnapshotFixture, ctx: Context, source: Function): ast = None diagnostics = None + mc.database[mc.database.current] = CompilationUnit(resource_location="demo:test") + try: ast = mc.parse(source) except DiagnosticError as exc: diagnostics = exc.diagnostics + finally: + del mc.database[mc.database.current] if ast: assert snapshot() == f"{source.text}---\n{ast.dump()}\n" From d90a3d36dad9737ee73d8b0c1fefc163d20cc747 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 17 Jul 2022 03:44:50 +0200 Subject: [PATCH 0945/1554] feat: add raise statement --- packages/bolt/bolt/codegen.py | 30 +++++++++++++++++++ packages/bolt/bolt/resources/commands.json | 23 ++++++++++++++ .../tests/resources/bolt_examples.mcfunction | 6 ++++ .../tests/snapshots/bolt__parse_237__0.txt | 12 ++++++++ .../tests/snapshots/bolt__parse_237__1.txt | 15 ++++++++++ .../tests/snapshots/bolt__parse_238__0.txt | 21 +++++++++++++ .../tests/snapshots/bolt__parse_238__1.txt | 17 +++++++++++ .../tests/snapshots/bolt__parse_239__0.txt | 25 ++++++++++++++++ .../tests/snapshots/bolt__parse_239__1.txt | 18 +++++++++++ .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/spec__prototypes__0.json | 3 ++ 11 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_237__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_237__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_238__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_238__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_239__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_239__1.txt diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 0a2153c5b..7b85aa8c4 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -1138,3 +1138,33 @@ def pass_statement( ) -> Optional[List[str]]: acc.statement("pass") return [] + + @rule(AstCommand, identifier="raise") + def raise_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement("raise") + return [] + + @rule(AstCommand, identifier="raise:exception") + def raise_exc_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.arguments[0], required=True) + acc.statement(f"raise {result}") + return [] + + @rule(AstCommand, identifier="raise:exception:from:cause") + def raise_exc_from_statement( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + result = yield from visit_single(node.arguments[0], required=True) + cause = yield from visit_single(node.arguments[1], required=True) + acc.statement(f"raise {result} from {cause}") + return [] diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 9b3997433..2f10a0201 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -293,6 +293,29 @@ "pass": { "type": "literal", "executable": true + }, + "raise": { + "type": "literal", + "executable": true, + "children": { + "exception": { + "type": "argument", + "parser": "bolt:expression", + "executable": true, + "children": { + "from": { + "type": "literal", + "children": { + "cause": { + "type": "argument", + "parser": "bolt:expression", + "executable": true + } + } + } + } + } + } } } } diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 2ecf0c613..a279abc8d 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -884,3 +884,9 @@ macro foo(stream): ### macro foo message=minecraft:message(stream): pass +### +raise +### +raise ValueError() +### +raise ValueError() from None diff --git a/packages/bolt/tests/snapshots/bolt__parse_237__0.txt b/packages/bolt/tests/snapshots/bolt__parse_237__0.txt new file mode 100644 index 000000000..5d8d0425b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_237__0.txt @@ -0,0 +1,12 @@ +raise +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'raise' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_237__1.txt b/packages/bolt/tests/snapshots/bolt__parse_237__1.txt new file mode 100644 index 000000000..45ed2f969 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_237__1.txt @@ -0,0 +1,15 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + raise +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_238__0.txt b/packages/bolt/tests/snapshots/bolt__parse_238__0.txt new file mode 100644 index 000000000..d8e905d3f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_238__0.txt @@ -0,0 +1,21 @@ +raise ValueError() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + identifier: 'raise:exception' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'ValueError' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_238__1.txt b/packages/bolt/tests/snapshots/bolt__parse_238__1.txt new file mode 100644 index 000000000..376ff21b1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_238__1.txt @@ -0,0 +1,17 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = ValueError + _bolt_var0 = _bolt_var0() + raise _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_239__0.txt b/packages/bolt/tests/snapshots/bolt__parse_239__0.txt new file mode 100644 index 000000000..f2bd8c281 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_239__0.txt @@ -0,0 +1,25 @@ +raise ValueError() from None +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + identifier: 'raise:exception:from:cause' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'ValueError' + arguments: + + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + value: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_239__1.txt b/packages/bolt/tests/snapshots/bolt__parse_239__1.txt new file mode 100644 index 000000000..20224a02a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_239__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = ValueError + _bolt_var0 = _bolt_var0() + _bolt_var1 = None + raise _bolt_var0 from _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index b326a4412..7f97a8665 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 148 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 149 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index cf331ebe2..8bb347ca4 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -1527,6 +1527,9 @@ "prepend:worldgen_structure_tag:name:content", "publish", "publish:port", + "raise", + "raise:exception", + "raise:exception:from:cause", "recipe:give:targets:*", "recipe:give:targets:recipe", "recipe:name:content", From afb509d544047fc3b7d91b60f8eed52dbbed09ad Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Jul 2022 01:45:33 +0000 Subject: [PATCH 0946/1554] 0.13.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 5 +++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index b03b9d759..757e335be 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.13.0 (2022-07-17) +### Feature +* Add raise statement ([`d5654a5`](https://github.com/mcbeet/bolt/commit/d5654a58c95ea326ff01da92b88bfd2e29e48b6c)) +* Add proc macro ([`97e1bea`](https://github.com/mcbeet/bolt/commit/97e1beadb033de13453ef9deee1c290bdd730f4e)) + ## v0.12.2 (2022-07-15) ### Fix * Update beet ([`a4f2f97`](https://github.com/mcbeet/bolt/commit/a4f2f97feef98d9c9f624ffc82a3d8e5ff282337)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 529c3b4cf..26bf1f607 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.12.2" +__version__ = "0.13.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 9108c6799..2e9c5275b 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.12.2" +version = "0.13.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From d01a4dc9f4d61bf17b4ad1acf6894cd65f728e34 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 17 Jul 2022 04:38:11 +0200 Subject: [PATCH 0947/1554] feat: ergonomic improvements for dicts without quotes --- packages/bolt/bolt/ast.py | 8 +- packages/bolt/bolt/parse.py | 23 +++++- .../tests/resources/bolt_examples.mcfunction | 9 +- .../tests/snapshots/bolt__parse_162__0.txt | 2 +- .../tests/snapshots/bolt__parse_168__0.txt | 4 +- .../tests/snapshots/bolt__parse_205__0.txt | 2 +- .../tests/snapshots/bolt__parse_206__0.txt | 2 +- .../tests/snapshots/bolt__parse_240__0.txt | 10 +++ .../tests/snapshots/bolt__parse_91__0.txt | 2 +- .../tests/snapshots/bolt__parse_96__0.txt | 82 +++++++++---------- .../tests/snapshots/bolt__parse_96__1.txt | 2 +- .../tests/snapshots/bolt__parse_97__0.txt | 32 ++++---- .../tests/snapshots/bolt__parse_97__1.txt | 2 +- 13 files changed, 110 insertions(+), 70 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_240__0.txt diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index de38971f2..b419583ad 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -8,8 +8,9 @@ "AstFormatString", "AstTuple", "AstList", - "AstDictItem", "AstDict", + "AstDictItem", + "AstDictUnquotedKey", "AstSlice", "AstUnpack", "AstKeyword", @@ -125,6 +126,11 @@ class AstList(AstExpression): items: AstChildren[AstExpression] = required_field() +@dataclass(frozen=True) +class AstDictUnquotedKey(AstValue): + """Ast dict unquoted key node.""" + + @dataclass(frozen=True) class AstDictItem(AstNode): """Ast dict item node.""" diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 47069e956..9224e50f0 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -96,6 +96,7 @@ AstDeferredRoot, AstDict, AstDictItem, + AstDictUnquotedKey, AstExpression, AstExpressionBinary, AstExpressionUnary, @@ -1931,7 +1932,7 @@ def parse_dict_item(stream: TokenStream) -> Any: if identifier.value in identifiers: key = AstIdentifier(value=identifier.value) else: - key = AstValue(value=identifier.value) + key = AstDictUnquotedKey(value=identifier.value) key = set_location(key, identifier) @@ -1982,15 +1983,33 @@ def __call__(self, stream: TokenStream) -> Any: if curly: items: List[Any] = [] + unquoted = False with stream.ignore("newline"): for _ in stream.peek_until(("curly", "}")): - items.append(delegate("bolt:dict_item", stream)) + items.append(item := delegate("bolt:dict_item", stream)) + unquoted = unquoted or ( + isinstance(item, AstDictItem) + and isinstance(item.key, AstDictUnquotedKey) + ) if not stream.get("comma"): stream.expect(("curly", "}")) break + if unquoted: + for i, item in enumerate(items): + if isinstance(item, AstDictItem): + if isinstance(item.key, AstIdentifier): + key = AstDictUnquotedKey(value=item.key.value) + key = set_location(key, item.key) + items[i] = replace(item, key=key) + elif not isinstance(item.key, AstDictUnquotedKey): + exc = InvalidSyntax( + "Forbidden dynamic key in dict without quotes." + ) + raise set_location(exc, item.key) + node = AstDict(items=AstChildren(items)) return set_location(node, curly, stream.current) diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index a279abc8d..4b7c4e601 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -344,7 +344,7 @@ my_predicate = { scores: { score1: { "min": { - "type": "minecraft:score", + type: "minecraft:score", target: "this", score: "score2", scale: 1 @@ -354,7 +354,7 @@ my_predicate = { } ### def f(): - return {f(): f(), other: [{}, {}, "wat"]} + return {f(): f(), "other": [{}, {}, "wat"]} ### at @s if "foo" == "bar": say yolo @@ -890,3 +890,8 @@ raise raise ValueError() ### raise ValueError() from None +### +foo = { + a: 1, + "b" + "c": 2 +} diff --git a/packages/bolt/tests/snapshots/bolt__parse_162__0.txt b/packages/bolt/tests/snapshots/bolt__parse_162__0.txt index 3a30cf646..e3ddb79ea 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_162__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_162__0.txt @@ -29,7 +29,7 @@ d.foo += 1 location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=11, lineno=1, colno=12) key: - + location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt index 68ad39402..c62ff6f0b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt @@ -29,7 +29,7 @@ item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=38, lineno=1, colno=39) key: - + location: SourceLocation(pos=13, lineno=1, colno=14) end_location: SourceLocation(pos=20, lineno=1, colno=21) value: 'offhand' @@ -42,7 +42,7 @@ item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand location: SourceLocation(pos=40, lineno=1, colno=41) end_location: SourceLocation(pos=67, lineno=1, colno=68) key: - + location: SourceLocation(pos=40, lineno=1, colno=41) end_location: SourceLocation(pos=48, lineno=1, colno=49) value: 'mainhand' diff --git a/packages/bolt/tests/snapshots/bolt__parse_205__0.txt b/packages/bolt/tests/snapshots/bolt__parse_205__0.txt index 62148d6de..5cfc3bd50 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_205__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_205__0.txt @@ -29,7 +29,7 @@ give @s bow{**bow_data} location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=30, lineno=1, colno=31) key: - + location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=27, lineno=1, colno=28) value: 'CustomModelData' diff --git a/packages/bolt/tests/snapshots/bolt__parse_206__0.txt b/packages/bolt/tests/snapshots/bolt__parse_206__0.txt index f2c33cb7a..34807cd7b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_206__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_206__0.txt @@ -30,7 +30,7 @@ give @s stone{CanPlaceOn: [*stone_can_place_on], **custom_model_data} location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=39, lineno=1, colno=40) key: - + location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=36, lineno=1, colno=37) value: 'CustomModelData' diff --git a/packages/bolt/tests/snapshots/bolt__parse_240__0.txt b/packages/bolt/tests/snapshots/bolt__parse_240__0.txt new file mode 100644 index 000000000..cc17129fa --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_240__0.txt @@ -0,0 +1,10 @@ +foo = { + a: 1, +#>ERROR Forbidden dynamic key in dict without quotes. +# line 3, column 5 +# 2 | a: 1, +# 3 | "b" + "c": 2 +# : ^^^^^^^^^ +# 4 | } + "b" + "c": 2 +} diff --git a/packages/bolt/tests/snapshots/bolt__parse_91__0.txt b/packages/bolt/tests/snapshots/bolt__parse_91__0.txt index 22c7a1309..13137ff9b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_91__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_91__0.txt @@ -19,7 +19,7 @@ location: SourceLocation(pos=6, lineno=2, colno=5) end_location: SourceLocation(pos=16, lineno=2, colno=15) key: - + location: SourceLocation(pos=6, lineno=2, colno=5) end_location: SourceLocation(pos=9, lineno=2, colno=8) value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt index 67de56a10..aafa4d470 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt @@ -4,7 +4,7 @@ my_predicate = { scores: { score1: { "min": { - "type": "minecraft:score", + type: "minecraft:score", target: "this", score: "score2", scale: 1 @@ -15,16 +15,16 @@ my_predicate = { --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=237, lineno=15, colno=1) + end_location: SourceLocation(pos=235, lineno=15, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=236, lineno=14, colno=2) + end_location: SourceLocation(pos=234, lineno=14, colno=2) identifier: 'statement' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=236, lineno=14, colno=2) + end_location: SourceLocation(pos=234, lineno=14, colno=2) operator: '=' target: @@ -35,13 +35,13 @@ my_predicate = { value: location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=236, lineno=14, colno=2) + end_location: SourceLocation(pos=234, lineno=14, colno=2) items: location: SourceLocation(pos=19, lineno=2, colno=3) end_location: SourceLocation(pos=55, lineno=2, colno=39) key: - + location: SourceLocation(pos=19, lineno=2, colno=3) end_location: SourceLocation(pos=28, lineno=2, colno=12) value: 'condition' @@ -54,7 +54,7 @@ my_predicate = { location: SourceLocation(pos=59, lineno=3, colno=3) end_location: SourceLocation(pos=73, lineno=3, colno=17) key: - + location: SourceLocation(pos=59, lineno=3, colno=3) end_location: SourceLocation(pos=65, lineno=3, colno=9) value: 'entity' @@ -65,33 +65,33 @@ my_predicate = { value: 'this' location: SourceLocation(pos=77, lineno=4, colno=3) - end_location: SourceLocation(pos=234, lineno=13, colno=4) + end_location: SourceLocation(pos=232, lineno=13, colno=4) key: - + location: SourceLocation(pos=77, lineno=4, colno=3) end_location: SourceLocation(pos=83, lineno=4, colno=9) value: 'scores' value: location: SourceLocation(pos=85, lineno=4, colno=11) - end_location: SourceLocation(pos=234, lineno=13, colno=4) + end_location: SourceLocation(pos=232, lineno=13, colno=4) items: location: SourceLocation(pos=91, lineno=5, colno=5) - end_location: SourceLocation(pos=230, lineno=12, colno=6) + end_location: SourceLocation(pos=228, lineno=12, colno=6) key: - + location: SourceLocation(pos=91, lineno=5, colno=5) end_location: SourceLocation(pos=97, lineno=5, colno=11) value: 'score1' value: location: SourceLocation(pos=99, lineno=5, colno=13) - end_location: SourceLocation(pos=230, lineno=12, colno=6) + end_location: SourceLocation(pos=228, lineno=12, colno=6) items: location: SourceLocation(pos=107, lineno=6, colno=7) - end_location: SourceLocation(pos=224, lineno=11, colno=8) + end_location: SourceLocation(pos=222, lineno=11, colno=8) key: location: SourceLocation(pos=107, lineno=6, colno=7) @@ -100,57 +100,57 @@ my_predicate = { value: location: SourceLocation(pos=114, lineno=6, colno=14) - end_location: SourceLocation(pos=224, lineno=11, colno=8) + end_location: SourceLocation(pos=222, lineno=11, colno=8) items: location: SourceLocation(pos=124, lineno=7, colno=9) - end_location: SourceLocation(pos=149, lineno=7, colno=34) + end_location: SourceLocation(pos=147, lineno=7, colno=32) key: - + location: SourceLocation(pos=124, lineno=7, colno=9) - end_location: SourceLocation(pos=130, lineno=7, colno=15) + end_location: SourceLocation(pos=128, lineno=7, colno=13) value: 'type' value: - location: SourceLocation(pos=132, lineno=7, colno=17) - end_location: SourceLocation(pos=149, lineno=7, colno=34) + location: SourceLocation(pos=130, lineno=7, colno=15) + end_location: SourceLocation(pos=147, lineno=7, colno=32) value: 'minecraft:score' - location: SourceLocation(pos=159, lineno=8, colno=9) - end_location: SourceLocation(pos=173, lineno=8, colno=23) + location: SourceLocation(pos=157, lineno=8, colno=9) + end_location: SourceLocation(pos=171, lineno=8, colno=23) key: - - location: SourceLocation(pos=159, lineno=8, colno=9) - end_location: SourceLocation(pos=165, lineno=8, colno=15) + + location: SourceLocation(pos=157, lineno=8, colno=9) + end_location: SourceLocation(pos=163, lineno=8, colno=15) value: 'target' value: - location: SourceLocation(pos=167, lineno=8, colno=17) - end_location: SourceLocation(pos=173, lineno=8, colno=23) + location: SourceLocation(pos=165, lineno=8, colno=17) + end_location: SourceLocation(pos=171, lineno=8, colno=23) value: 'this' - location: SourceLocation(pos=183, lineno=9, colno=9) - end_location: SourceLocation(pos=198, lineno=9, colno=24) + location: SourceLocation(pos=181, lineno=9, colno=9) + end_location: SourceLocation(pos=196, lineno=9, colno=24) key: - - location: SourceLocation(pos=183, lineno=9, colno=9) - end_location: SourceLocation(pos=188, lineno=9, colno=14) + + location: SourceLocation(pos=181, lineno=9, colno=9) + end_location: SourceLocation(pos=186, lineno=9, colno=14) value: 'score' value: - location: SourceLocation(pos=190, lineno=9, colno=16) - end_location: SourceLocation(pos=198, lineno=9, colno=24) + location: SourceLocation(pos=188, lineno=9, colno=16) + end_location: SourceLocation(pos=196, lineno=9, colno=24) value: 'score2' - location: SourceLocation(pos=208, lineno=10, colno=9) - end_location: SourceLocation(pos=216, lineno=10, colno=17) + location: SourceLocation(pos=206, lineno=10, colno=9) + end_location: SourceLocation(pos=214, lineno=10, colno=17) key: - - location: SourceLocation(pos=208, lineno=10, colno=9) - end_location: SourceLocation(pos=213, lineno=10, colno=14) + + location: SourceLocation(pos=206, lineno=10, colno=9) + end_location: SourceLocation(pos=211, lineno=10, colno=14) value: 'scale' value: - location: SourceLocation(pos=215, lineno=10, colno=16) - end_location: SourceLocation(pos=216, lineno=10, colno=17) + location: SourceLocation(pos=213, lineno=10, colno=16) + end_location: SourceLocation(pos=214, lineno=10, colno=17) value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt index c9a6cd2a8..fd6dc6746 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt @@ -29,6 +29,6 @@ output = _bolt_var20 _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=237, lineno=15, colno=1) + end_location: SourceLocation(pos=235, lineno=15, colno=1) commands: diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt index 56a0b7c86..b18cb9bf6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt @@ -1,13 +1,13 @@ def f(): - return {f(): f(), other: [{}, {}, "wat"]} + return {f(): f(), "other": [{}, {}, "wat"]} --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=46) + end_location: SourceLocation(pos=56, lineno=2, colno=48) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=46) + end_location: SourceLocation(pos=56, lineno=2, colno=48) identifier: 'def:function:body' arguments: @@ -20,16 +20,16 @@ def f(): location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=54, lineno=2, colno=46) + end_location: SourceLocation(pos=56, lineno=2, colno=48) commands: location: SourceLocation(pos=13, lineno=2, colno=5) - end_location: SourceLocation(pos=54, lineno=2, colno=46) + end_location: SourceLocation(pos=56, lineno=2, colno=48) identifier: 'return:value' arguments: location: SourceLocation(pos=20, lineno=2, colno=12) - end_location: SourceLocation(pos=54, lineno=2, colno=46) + end_location: SourceLocation(pos=56, lineno=2, colno=48) items: location: SourceLocation(pos=21, lineno=2, colno=13) @@ -58,28 +58,28 @@ def f(): location: SourceLocation(pos=31, lineno=2, colno=23) - end_location: SourceLocation(pos=53, lineno=2, colno=45) + end_location: SourceLocation(pos=55, lineno=2, colno=47) key: location: SourceLocation(pos=31, lineno=2, colno=23) - end_location: SourceLocation(pos=36, lineno=2, colno=28) + end_location: SourceLocation(pos=38, lineno=2, colno=30) value: 'other' value: - location: SourceLocation(pos=38, lineno=2, colno=30) - end_location: SourceLocation(pos=53, lineno=2, colno=45) + location: SourceLocation(pos=40, lineno=2, colno=32) + end_location: SourceLocation(pos=55, lineno=2, colno=47) items: - location: SourceLocation(pos=39, lineno=2, colno=31) - end_location: SourceLocation(pos=41, lineno=2, colno=33) + location: SourceLocation(pos=41, lineno=2, colno=33) + end_location: SourceLocation(pos=43, lineno=2, colno=35) items: - location: SourceLocation(pos=43, lineno=2, colno=35) - end_location: SourceLocation(pos=45, lineno=2, colno=37) + location: SourceLocation(pos=45, lineno=2, colno=37) + end_location: SourceLocation(pos=47, lineno=2, colno=39) items: - location: SourceLocation(pos=47, lineno=2, colno=39) - end_location: SourceLocation(pos=52, lineno=2, colno=44) + location: SourceLocation(pos=49, lineno=2, colno=41) + end_location: SourceLocation(pos=54, lineno=2, colno=46) value: 'wat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt index 778542a4c..d13897dab 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt @@ -21,6 +21,6 @@ output = _bolt_var9 _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=54, lineno=2, colno=46) + end_location: SourceLocation(pos=56, lineno=2, colno=48) commands: From 5b8327f8484c5f734af85eab775cbb47a7e65f4a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Jul 2022 02:58:23 +0000 Subject: [PATCH 0948/1554] 0.14.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 757e335be..c41031cf5 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.14.0 (2022-07-17) +### Feature +* Ergonomic improvements for dicts without quotes ([`18c747e`](https://github.com/mcbeet/bolt/commit/18c747e74aa2500fbb47414d0bc4ea24a3af04a1)) + ## v0.13.0 (2022-07-17) ### Feature * Add raise statement ([`d5654a5`](https://github.com/mcbeet/bolt/commit/d5654a58c95ea326ff01da92b88bfd2e29e48b6c)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 26bf1f607..21d1f9d14 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.13.0" +__version__ = "0.14.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 2e9c5275b..bcb6c25d1 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.13.0" +version = "0.14.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From a00c1065afe957453bc9f1073140e476f54fee87 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 17 Jul 2022 05:36:39 +0200 Subject: [PATCH 0949/1554] feat: add raw strings --- packages/bolt/bolt/parse.py | 12 +- packages/bolt/bolt/pattern.py | 2 +- .../src/data/demo/functions/foo.mcfunction | 13 +- .../src/data/demo/functions/util.mcfunction | 17 ++ .../tests/resources/bolt_examples.mcfunction | 13 ++ .../tests/snapshots/bolt__parse_241__0.txt | 26 +++ .../tests/snapshots/bolt__parse_241__1.txt | 16 ++ .../tests/snapshots/bolt__parse_242__0.txt | 5 + .../tests/snapshots/bolt__parse_243__0.txt | 26 +++ .../tests/snapshots/bolt__parse_243__1.txt | 16 ++ .../tests/snapshots/bolt__parse_244__0.txt | 26 +++ .../tests/snapshots/bolt__parse_244__1.txt | 16 ++ .../tests/snapshots/bolt__parse_245__0.txt | 160 ++++++++++++++++++ .../tests/snapshots/bolt__parse_245__1.txt | 32 ++++ ...examples__build_bolt_proc_macro__0.pack.md | 5 + 15 files changed, 381 insertions(+), 4 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_241__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_241__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_242__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_243__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_243__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_244__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_244__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_245__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_245__1.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 9224e50f0..f3b47c4ee 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1863,7 +1863,11 @@ def __call__(self, stream: TokenStream) -> Any: continue if string: - value = self.quote_helper.unquote_string(string) + value = ( + string.value[2:-1] + if string.value.startswith("r") + else self.quote_helper.unquote_string(string) + ) elif number: value = int(number.value) @@ -2034,7 +2038,11 @@ def __call__(self, stream: TokenStream) -> Any: elif null: value = None elif string: - value = self.quote_helper.unquote_string(string) + value = ( + string.value[2:-1] + if string.value.startswith("r") + else self.quote_helper.unquote_string(string) + ) elif resource: if resource.value.startswith(("./", "../")): value = ":".join( diff --git a/packages/bolt/bolt/pattern.py b/packages/bolt/bolt/pattern.py index d1266829e..3ff94d88a 100644 --- a/packages/bolt/bolt/pattern.py +++ b/packages/bolt/bolt/pattern.py @@ -20,6 +20,6 @@ NULL_PATTERN: str = r"\b(?:null|None)\b" IDENTIFIER_PATTERN: str = rf"(?!_bolt_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" MODULE_PATTERN: str = rf"{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*" -STRING_PATTERN: str = r'"(?:\\.|[^\\\n])*?"' "|" r"'(?:\\.|[^\\\n])*?'" +STRING_PATTERN: str = r'r?"(?:\\.|[^\\\n])*?"' "|" r"r?'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" diff --git a/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction index 690f0a24e..84c46d3a4 100644 --- a/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/foo.mcfunction @@ -1,4 +1,4 @@ -from ./util import repeat +from ./util import repeat, lisp value = 3 @@ -17,3 +17,14 @@ repeat until value < 5: repeat until @a[scores={counter=10}]: scoreboard players add @r counter 1 + +lisp foo +lisp 123 +lisp (foo 123) +lisp (foo 123 () (bar)) +lisp ( + (defun do_math (x y) + (add x y)) + (defun do_more_math (x y) + (mul (do_math x y) y)) +) diff --git a/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction index d998e312b..c298a524b 100644 --- a/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction +++ b/packages/bolt/examples/bolt_proc_macro/src/data/demo/functions/util.mcfunction @@ -25,3 +25,20 @@ macro repeat until(stream): execute function path: yield body unless entity entity function path + +def parse_sexp(stream): + with stream.syntax(brace=r"\(|\)", number=r"\d+", name=r"\w+"): + brace, number, name = stream.expect(("brace", "("), "number", "name") + if brace: + with stream.ignore("newline"): + result = [] + while not stream.get(("brace", ")")): + result.append(parse_sexp(stream)) + return result + elif number: + return int(number.value) + elif name: + return name.value + +macro lisp(stream): + say parse_sexp(stream) diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 4b7c4e601..c6f2e311a 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -895,3 +895,16 @@ foo = { a: 1, "b" + "c": 2 } +### +foo = r"" +### +foo = r"\" +### +foo = r"\\" +### +foo = r"\"" +### +macro foo(stream): + with stream.syntax(number=r"\d+", name=r"\w+"): + stream.expect("number") + stream.expect("name") diff --git a/packages/bolt/tests/snapshots/bolt__parse_241__0.txt b/packages/bolt/tests/snapshots/bolt__parse_241__0.txt new file mode 100644 index 000000000..dc23e8f99 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_241__0.txt @@ -0,0 +1,26 @@ +foo = r"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: '' diff --git a/packages/bolt/tests/snapshots/bolt__parse_241__1.txt b/packages/bolt/tests/snapshots/bolt__parse_241__1.txt new file mode 100644 index 000000000..21d51a942 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_241__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '' + foo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_242__0.txt b/packages/bolt/tests/snapshots/bolt__parse_242__0.txt new file mode 100644 index 000000000..4ead4f188 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_242__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier "r" is not defined. +# line 1, column 7 +# 1 | foo = r"\" +# : ^ +foo = r"\" diff --git a/packages/bolt/tests/snapshots/bolt__parse_243__0.txt b/packages/bolt/tests/snapshots/bolt__parse_243__0.txt new file mode 100644 index 000000000..314a55e9d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_243__0.txt @@ -0,0 +1,26 @@ +foo = r"\\" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: '\\\\' diff --git a/packages/bolt/tests/snapshots/bolt__parse_243__1.txt b/packages/bolt/tests/snapshots/bolt__parse_243__1.txt new file mode 100644 index 000000000..39ec0d275 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_243__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '\\\\' + foo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_244__0.txt b/packages/bolt/tests/snapshots/bolt__parse_244__0.txt new file mode 100644 index 000000000..1575fe171 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_244__0.txt @@ -0,0 +1,26 @@ +foo = r"\"" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: '\\"' diff --git a/packages/bolt/tests/snapshots/bolt__parse_244__1.txt b/packages/bolt/tests/snapshots/bolt__parse_244__1.txt new file mode 100644 index 000000000..132fabe75 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_244__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '\\"' + foo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_245__0.txt b/packages/bolt/tests/snapshots/bolt__parse_245__0.txt new file mode 100644 index 000000000..783f176e6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_245__0.txt @@ -0,0 +1,160 @@ +macro foo(stream): + with stream.syntax(number=r"\d+", name=r"\w+"): + stream.expect("number") + stream.expect("name") +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + identifier: 'foo:proc_macro_overload3' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'foo' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + match_identifier: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'proc_macro_overload3' + match_argument_parser: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + is_tag: False + namespace: 'bolt' + path: 'proc_macro' + match_argument_properties: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + entries: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'resource_location' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'demo:test' + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + key: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'identifier' + value: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=-1, lineno=0, colno=0) + value: 'foo:proc_macro_overload3' + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + identifier: 'with:subcommand' + arguments: + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + identifier: 'with:expression:body' + arguments: + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=69, lineno=2, colno=51) + value: + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=41, lineno=2, colno=23) + name: 'syntax' + value: + + location: SourceLocation(pos=28, lineno=2, colno=10) + end_location: SourceLocation(pos=34, lineno=2, colno=16) + value: 'stream' + arguments: + + location: SourceLocation(pos=42, lineno=2, colno=24) + end_location: SourceLocation(pos=55, lineno=2, colno=37) + name: 'number' + value: + + location: SourceLocation(pos=49, lineno=2, colno=31) + end_location: SourceLocation(pos=55, lineno=2, colno=37) + value: '\\d+' + + location: SourceLocation(pos=57, lineno=2, colno=39) + end_location: SourceLocation(pos=68, lineno=2, colno=50) + name: 'name' + value: + + location: SourceLocation(pos=62, lineno=2, colno=44) + end_location: SourceLocation(pos=68, lineno=2, colno=50) + value: '\\w+' + + location: SourceLocation(pos=79, lineno=3, colno=9) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + commands: + + location: SourceLocation(pos=79, lineno=3, colno=9) + end_location: SourceLocation(pos=102, lineno=3, colno=32) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=79, lineno=3, colno=9) + end_location: SourceLocation(pos=102, lineno=3, colno=32) + value: + + location: SourceLocation(pos=79, lineno=3, colno=9) + end_location: SourceLocation(pos=92, lineno=3, colno=22) + name: 'expect' + value: + + location: SourceLocation(pos=79, lineno=3, colno=9) + end_location: SourceLocation(pos=85, lineno=3, colno=15) + value: 'stream' + arguments: + + location: SourceLocation(pos=93, lineno=3, colno=23) + end_location: SourceLocation(pos=101, lineno=3, colno=31) + value: 'number' + + location: SourceLocation(pos=111, lineno=4, colno=9) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=111, lineno=4, colno=9) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + value: + + location: SourceLocation(pos=111, lineno=4, colno=9) + end_location: SourceLocation(pos=124, lineno=4, colno=22) + name: 'expect' + value: + + location: SourceLocation(pos=111, lineno=4, colno=9) + end_location: SourceLocation(pos=117, lineno=4, colno=15) + value: 'stream' + arguments: + + location: SourceLocation(pos=125, lineno=4, colno=23) + end_location: SourceLocation(pos=131, lineno=4, colno=29) + value: 'name' diff --git a/packages/bolt/tests/snapshots/bolt__parse_245__1.txt b/packages/bolt/tests/snapshots/bolt__parse_245__1.txt new file mode 100644 index 000000000..5cadd6f8b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_245__1.txt @@ -0,0 +1,32 @@ +_bolt_lineno = [1, 8, 14, 18], [1, 2, 3, 4] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_proc_macros = {} +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var7: + def _bolt_macro0(stream): + _bolt_var0 = stream + _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'syntax') + _bolt_var1 = '\\d+' + _bolt_var2 = '\\w+' + _bolt_var0 = _bolt_var0(number=_bolt_var1, name=_bolt_var2) + with _bolt_var0: + _bolt_var3 = stream + _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'expect') + _bolt_var4 = 'number' + _bolt_var3 = _bolt_var3(_bolt_var4) + _bolt_var5 = stream + _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'expect') + _bolt_var6 = 'name' + _bolt_var5 = _bolt_var5(_bolt_var6) + _bolt_proc_macros['foo:proc_macro_overload3'] = _bolt_macro0 +_bolt_var8 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var7)) +--- +output = _bolt_var8 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=132, lineno=4, colno=30) + commands: + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md index 73b76564a..0e24b7814 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md @@ -31,6 +31,11 @@ say 7 say 6 say 5 function bolt_proc_macro:generated_0 +say foo +say 123 +say ['foo', 123] +say ['foo', 123, [], ['bar']] +say [['defun', 'do_math', ['x', 'y'], ['add', 'x', 'y']], ['defun', 'do_more_math', ['x', 'y'], ['mul', ['do_math', 'x', 'y'], 'y']]] ``` `@function(strip_final_newline) demo:util` From c902e112dded86a01eece703de773d36c30f911b Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Jul 2022 03:38:04 +0000 Subject: [PATCH 0950/1554] 0.15.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index c41031cf5..d4e8c2393 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.15.0 (2022-07-17) +### Feature +* Add raw strings ([`e24d772`](https://github.com/mcbeet/bolt/commit/e24d7721ddd8e708735f7e3b16c50b81cbfb4a89)) + ## v0.14.0 (2022-07-17) ### Feature * Ergonomic improvements for dicts without quotes ([`18c747e`](https://github.com/mcbeet/bolt/commit/18c747e74aa2500fbb47414d0bc4ea24a3af04a1)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 21d1f9d14..ce2744223 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.14.0" +__version__ = "0.15.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index bcb6c25d1..acf48470d 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.14.0" +version = "0.15.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From a98bd73397e23c006766d5d89bb59ff2f83fa9b7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 17 Jul 2022 23:29:17 +0200 Subject: [PATCH 0951/1554] feat: make modules lazy by default --- packages/bolt/bolt/contrib/lazy.py | 94 ------------------- packages/bolt/bolt/module.py | 1 - packages/bolt/bolt/plugin.py | 17 +++- packages/bolt/bolt/runtime.py | 69 ++++++++++---- packages/bolt/examples/bolt_circular/beet.yml | 3 + packages/bolt/examples/bolt_flat/beet.yml | 3 + packages/bolt/examples/bolt_lazy/beet.yml | 7 +- 7 files changed, 76 insertions(+), 118 deletions(-) delete mode 100644 packages/bolt/bolt/contrib/lazy.py diff --git a/packages/bolt/bolt/contrib/lazy.py b/packages/bolt/bolt/contrib/lazy.py deleted file mode 100644 index cebe3d116..000000000 --- a/packages/bolt/bolt/contrib/lazy.py +++ /dev/null @@ -1,94 +0,0 @@ -"""Plugin for importing bolt modules lazily.""" - - -__all__ = [ - "LazyExecution", - "LazyFilter", - "BoltLazyOptions", - "bolt_lazy", -] - - -from dataclasses import InitVar, dataclass, field -from functools import partial -from typing import Any, List - -from beet import Context, ListOption, TextFileBase, configurable -from beet.core.utils import extra_field, required_field -from mecha import Mecha, Visitor, rule -from pathspec import PathSpec -from pydantic import BaseModel - -from bolt import AstModuleRoot, ModuleManager, Runtime - - -class BoltLazyOptions(BaseModel): - match: ListOption[str] = ListOption() - - -def beet_default(ctx: Context): - ctx.require(bolt_lazy) - - -@configurable(validator=BoltLazyOptions) -def bolt_lazy(ctx: Context, opts: BoltLazyOptions): - """Plugin for importing bolt modules lazily.""" - lazy = ctx.inject(LazyExecution) - lazy.register(*opts.match.entries()) - - -@dataclass -class LazyExecution: - """Service for managing lazy execution.""" - - ctx: InitVar[Context] - match: List[str] = field(default_factory=list) - path_spec: PathSpec = extra_field(init=False) - - def __post_init__(self, ctx: Context): - self.register() - - mc = ctx.inject(Mecha) - runtime = ctx.inject(Runtime) - - mc.steps.insert( - mc.steps.index(runtime.evaluate), - LazyFilter(modules=runtime.modules, lazy=self), - ) - - def register(self, *match: str): - """Make the modules matching the specified patterns lazy.""" - self.match.extend(match) - self.path_spec = PathSpec.from_lines("gitwildmatch", self.match) - - def check(self, resource_location: str) -> bool: - """Check if the specified module is lazy.""" - return self.path_spec.match_file(resource_location) - - -@dataclass -class LazyFilter(Visitor): - """Visitor that filters lazy modules from the compilation by matching resource location.""" - - modules: ModuleManager = required_field() - lazy: LazyExecution = required_field() - - @rule(AstModuleRoot) - def lazy_module(self, node: AstModuleRoot): - module = self.modules.match_ast(node) - if module.resource_location and self.lazy.check(module.resource_location): - module.execution_hooks.append( - partial( - self.restore_lazy, - self.modules.database.current, - node, - self.modules.database.step + 1, - ) - ) - return None - return node - - def restore_lazy(self, key: TextFileBase[Any], node: AstModuleRoot, step: int): - compilation_unit = self.modules.database[key] - compilation_unit.ast = node - self.modules.database.enqueue(key, step) diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index d5dd014fe..424f36d87 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -291,7 +291,6 @@ def error_handler(self, message: str, resource_location: Optional[str] = None): except (BubbleException, InvalidSyntax): raise except UnusableCompilationUnit as exc: - print(exc) if not exc.compilation_unit.diagnostics.error: message = "Failed to instantiate module." if resource_location: diff --git a/packages/bolt/bolt/plugin.py b/packages/bolt/bolt/plugin.py index d66a11ff4..570af5348 100644 --- a/packages/bolt/bolt/plugin.py +++ b/packages/bolt/bolt/plugin.py @@ -1,12 +1,25 @@ __all__ = [ + "bolt", "beet_default", ] -from beet import Context +from beet import Context, ListOption, configurable +from pydantic import BaseModel from .runtime import Runtime +class BoltOptions(BaseModel): + entrypoint: ListOption[str] = ListOption() + + def beet_default(ctx: Context): - ctx.inject(Runtime) + ctx.require(bolt) + + +@configurable(validator=BoltOptions) +def bolt(ctx: Context, opts: BoltOptions): + """Plugin for configuring bolt.""" + runtime = ctx.inject(Runtime) + runtime.evaluate.add_entrypoint(opts.entrypoint.entries()) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 262890d11..b8002fd26 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -7,22 +7,15 @@ import builtins from contextlib import contextmanager -from dataclasses import dataclass +from dataclasses import dataclass, field +from functools import partial from importlib.resources import read_text -from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Union - -from beet import Context, generate_tree -from beet.core.utils import JsonDict, required_field -from mecha import ( - AstCommand, - AstRoot, - CommandTree, - Diagnostic, - Dispatcher, - Mecha, - Visitor, - rule, -) +from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Union + +from beet import Context, TextFileBase, generate_tree +from beet.core.utils import JsonDict, extra_field, required_field +from mecha import AstCommand, AstRoot, CommandTree, Diagnostic, Mecha, Visitor, rule +from pathspec import PathSpec from tokenstream import set_location from .ast import AstModuleRoot @@ -43,7 +36,7 @@ class Runtime: builtins: Set[str] modules: ModuleManager - evaluate: Dispatcher[AstRoot] + evaluate: "Evaluator" def __init__(self, ctx: Union[Context, Mecha]): self.commands = [] @@ -144,7 +137,10 @@ def import_module(self, resource_location: str) -> CompiledModule: if not module: raise ImportError(f'Couldn\'t import "{resource_location}".') if not module.executing: - self.modules.eval(module) + with self.modules.error_handler( + "Top-level statement raised an exception.", module.resource_location + ): + self.modules.eval(module) return module @internal @@ -170,15 +166,52 @@ class Evaluator(Visitor): modules: ModuleManager = required_field() + entrypoint: List[str] = field(default_factory=list) + entrypoint_spec: PathSpec = extra_field(init=False) + + def __post_init__(self): + super().__post_init__() + self.add_entrypoint() + + def add_entrypoint(self, *args: Union[str, Iterable[str]]): + self.entrypoint.extend( + entry + for patterns in args + for entry in ([patterns] if isinstance(patterns, str) else patterns) + ) + self.entrypoint_spec = PathSpec.from_lines("gitwildmatch", self.entrypoint) + @rule(AstRoot) @internal - def root(self, node: AstRoot) -> AstRoot: + def root(self, node: AstRoot) -> Optional[AstRoot]: module = self.modules.match_ast(node) + + if ( + isinstance(node, AstModuleRoot) + and not module.executed + and module.resource_location + and not self.entrypoint_spec.match_file(module.resource_location) + ): + module.execution_hooks.append( + partial( + self.restore_module, + self.modules.database.current, + node, + self.modules.database.step, + ) + ) + return None + with self.modules.error_handler( "Top-level statement raised an exception.", module.resource_location ): return self.modules.eval(module) + def restore_module(self, key: TextFileBase[Any], node: AstModuleRoot, step: int): + compilation_unit = self.modules.database[key] + compilation_unit.ast = node + self.modules.database.enqueue(key, step) + @rule(AstModuleRoot) def check_toplevel_commands(node: AstModuleRoot, result: List[str]): diff --git a/packages/bolt/examples/bolt_circular/beet.yml b/packages/bolt/examples/bolt_circular/beet.yml index 6a565b7f7..487cbcf89 100644 --- a/packages/bolt/examples/bolt_circular/beet.yml +++ b/packages/bolt/examples/bolt_circular/beet.yml @@ -5,3 +5,6 @@ data_pack: data/demo/modules: src pipeline: - mecha +meta: + bolt: + entrypoint: "demo:main" diff --git a/packages/bolt/examples/bolt_flat/beet.yml b/packages/bolt/examples/bolt_flat/beet.yml index f0ae1df3e..a098ccb1c 100644 --- a/packages/bolt/examples/bolt_flat/beet.yml +++ b/packages/bolt/examples/bolt_flat/beet.yml @@ -5,3 +5,6 @@ data_pack: data/demo/modules: "@demo" pipeline: - mecha +meta: + bolt: + entrypoint: "demo:main" diff --git a/packages/bolt/examples/bolt_lazy/beet.yml b/packages/bolt/examples/bolt_lazy/beet.yml index 81be69ebb..9e4a3a870 100644 --- a/packages/bolt/examples/bolt_lazy/beet.yml +++ b/packages/bolt/examples/bolt_lazy/beet.yml @@ -1,10 +1,11 @@ require: - bolt - - bolt.contrib.lazy data_pack: load: "src" pipeline: - mecha meta: - bolt_lazy: - match: "*.lazy" + bolt: + entrypoint: + - "*" + - "!*.lazy" From 5936b2807e3af39b00153009dcdba6e4e79da093 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 17 Jul 2022 21:32:05 +0000 Subject: [PATCH 0952/1554] 0.16.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index d4e8c2393..d70ee76ee 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.16.0 (2022-07-17) +### Feature +* Make modules lazy by default ([`370a759`](https://github.com/mcbeet/bolt/commit/370a7596d0a5764dfe0c2ce5e553483f8728ab60)) + ## v0.15.0 (2022-07-17) ### Feature * Add raw strings ([`e24d772`](https://github.com/mcbeet/bolt/commit/e24d7721ddd8e708735f7e3b16c50b81cbfb4a89)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index ce2744223..e7abf1bf8 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.15.0" +__version__ = "0.16.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index acf48470d..d9a6d5363 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.15.0" +version = "0.16.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 78c4937a9bf3a45c05a7f2d474b374fb8feddc39 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Jul 2022 01:20:48 +0200 Subject: [PATCH 0953/1554] feat: add bolt classes --- packages/bolt/bolt/ast.py | 23 +++ packages/bolt/bolt/codegen.py | 47 +++++ packages/bolt/bolt/parse.py | 175 ++++++++++++++---- packages/bolt/bolt/resources/commands.json | 27 +++ packages/bolt/examples/bolt_class/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 75 ++++++++ .../tests/resources/bolt_examples.mcfunction | 82 ++++++++ .../tests/snapshots/bolt__parse_118__1.txt | 18 +- .../tests/snapshots/bolt__parse_160__1.txt | 6 +- .../tests/snapshots/bolt__parse_193__1.txt | 98 +++++----- .../tests/snapshots/bolt__parse_194__1.txt | 54 +++--- .../tests/snapshots/bolt__parse_196__1.txt | 6 +- .../tests/snapshots/bolt__parse_197__1.txt | 6 +- .../tests/snapshots/bolt__parse_218__1.txt | 10 +- .../tests/snapshots/bolt__parse_219__1.txt | 10 +- .../tests/snapshots/bolt__parse_220__1.txt | 10 +- .../tests/snapshots/bolt__parse_221__1.txt | 10 +- .../tests/snapshots/bolt__parse_226__1.txt | 10 +- .../tests/snapshots/bolt__parse_227__1.txt | 10 +- .../tests/snapshots/bolt__parse_228__1.txt | 10 +- .../tests/snapshots/bolt__parse_245__1.txt | 6 +- .../tests/snapshots/bolt__parse_246__0.txt | 28 +++ .../tests/snapshots/bolt__parse_246__1.txt | 16 ++ .../tests/snapshots/bolt__parse_247__0.txt | 36 ++++ .../tests/snapshots/bolt__parse_247__1.txt | 17 ++ .../tests/snapshots/bolt__parse_248__0.txt | 86 +++++++++ .../tests/snapshots/bolt__parse_248__1.txt | 24 +++ .../tests/snapshots/bolt__parse_249__0.txt | 50 +++++ .../tests/snapshots/bolt__parse_249__1.txt | 17 ++ .../tests/snapshots/bolt__parse_250__0.txt | 44 +++++ .../tests/snapshots/bolt__parse_250__1.txt | 19 ++ .../tests/snapshots/bolt__parse_251__0.txt | 66 +++++++ .../tests/snapshots/bolt__parse_251__1.txt | 24 +++ .../tests/snapshots/bolt__parse_252__0.txt | 9 + .../tests/snapshots/bolt__parse_253__0.txt | 10 + .../tests/snapshots/bolt__parse_254__0.txt | 36 ++++ .../tests/snapshots/bolt__parse_254__1.txt | 18 ++ .../tests/snapshots/bolt__parse_255__0.txt | 59 ++++++ .../tests/snapshots/bolt__parse_255__1.txt | 24 +++ .../tests/snapshots/bolt__parse_256__0.txt | 7 + .../tests/snapshots/bolt__parse_257__0.txt | 5 + .../tests/snapshots/bolt__parse_258__0.txt | 11 ++ .../tests/snapshots/bolt__parse_259__0.txt | 73 ++++++++ .../tests/snapshots/bolt__parse_259__1.txt | 19 ++ .../tests/snapshots/bolt__parse_260__0.txt | 7 + .../tests/snapshots/bolt__parse_261__0.txt | 8 + .../tests/snapshots/bolt__parse_262__0.txt | 52 ++++++ .../tests/snapshots/bolt__parse_262__1.txt | 21 +++ .../tests/snapshots/bolt__parse_263__0.txt | 35 ++++ .../tests/snapshots/bolt__parse_263__1.txt | 22 +++ .../tests/snapshots/bolt__parse_264__0.txt | 57 ++++++ .../tests/snapshots/bolt__parse_264__1.txt | 23 +++ .../tests/snapshots/bolt__parse_265__0.txt | 141 ++++++++++++++ .../tests/snapshots/bolt__parse_265__1.txt | 41 ++++ .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_71__1.txt | 10 +- .../tests/snapshots/bolt__parse_72__1.txt | 6 +- .../tests/snapshots/bolt__parse_77__1.txt | 6 +- .../tests/snapshots/bolt__parse_81__1.txt | 10 +- .../tests/snapshots/bolt__parse_82__1.txt | 18 +- .../tests/snapshots/bolt__parse_87__1.txt | 10 +- .../tests/snapshots/bolt__parse_89__1.txt | 12 +- .../tests/snapshots/bolt__parse_97__1.txt | 6 +- .../examples__build_bolt_class__0.pack.md | 33 ++++ .../tests/snapshots/spec__prototypes__0.json | 2 + 65 files changed, 1714 insertions(+), 205 deletions(-) create mode 100644 packages/bolt/examples/bolt_class/beet.yml create mode 100644 packages/bolt/examples/bolt_class/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_246__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_246__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_247__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_247__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_248__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_248__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_249__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_249__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_250__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_250__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_251__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_251__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_252__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_253__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_254__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_254__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_255__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_255__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_256__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_257__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_258__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_259__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_259__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_260__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_261__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_262__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_262__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_263__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_263__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_264__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_264__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_265__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_265__1.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index b419583ad..5c88eb38f 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -37,6 +37,9 @@ "AstProcMacro", "AstProcMacroMarker", "AstProcMacroResult", + "AstClassName", + "AstClassBases", + "AstClassRoot", "AstInterpolation", "AstFromImport", "AstImportedItem", @@ -364,6 +367,26 @@ class AstProcMacroResult(AstNode): commands: AstChildren[AstCommand] = required_field() +@dataclass(frozen=True) +class AstClassName(AstNode): + """Ast class name node.""" + + decorators: AstChildren[AstDecorator] = AstChildren() + value: str = required_field() + + +@dataclass(frozen=True) +class AstClassBases(AstNode): + """Ast class bases node.""" + + inherit: AstChildren[AstExpression] = AstChildren() + + +@dataclass(frozen=True) +class AstClassRoot(AstRoot): + """Ast class root node.""" + + @dataclass(frozen=True) class AstInterpolation(AstNode): """Ast interpolation node.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 7b85aa8c4..fda62334b 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -43,6 +43,8 @@ AstAssignment, AstAttribute, AstCall, + AstClassBases, + AstClassName, AstDict, AstDictItem, AstExpressionBinary, @@ -216,7 +218,9 @@ def function(self, name: str, *args: str): with self.block(): previous_root = self.root_scope self.root_scope = False + temp_counter = self.counter yield + self.counter = temp_counter self.root_scope = previous_root @contextmanager @@ -611,6 +615,49 @@ def proc_macro( return [] + @rule(AstCommand, identifier="class:name:bases:body") + @rule(AstCommand, identifier="class:name:body") + def class_definition( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + name = cast(AstClassName, node.arguments[0]) + body = cast(AstRoot, node.arguments[-1]) + + decorators: List[str] = [] + for decorator in name.decorators: + value = yield from visit_single(decorator.expression, required=True) + decorators.append(value) + + inherit: List[str] = [] + + if isinstance(bases := node.arguments[1], AstClassBases): + for base in bases.inherit: + result = yield from visit_single(base, required=True) + inherit.append(result) + + joined_bases = f"({', '.join(inherit)})" if inherit else "" + acc.statement(f"class {name.value}{joined_bases}:", lineno=node) + + with acc.block(): + temp_start = acc.counter + yield from visit_body(body, acc) + temp_stop = acc.counter + + for i in range(temp_start, temp_stop): + acc.statement(f"del _bolt_var{i}") + + acc.counter = temp_start + + for decorator, value in list(zip(name.decorators, decorators))[::-1]: + acc.statement( + f"{name.value} = {value}({name.value})", + lineno=decorator, + ) + + return [] + @rule(AstCommand, identifier="del:target") def del_statement( self, diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index f3b47c4ee..057295280 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -29,6 +29,10 @@ "MacroHandler", "ProcMacroParser", "ProcMacroExpansion", + "parse_class_name", + "parse_class_bases", + "parse_class_root", + "ClassBodyScoping", "parse_del_target", "parse_identifier", "TrailingCommaParser", @@ -92,6 +96,9 @@ AstAssignment, AstAttribute, AstCall, + AstClassBases, + AstClassName, + AstClassRoot, AstDecorator, AstDeferredRoot, AstDict, @@ -194,6 +201,9 @@ def get_bolt_parsers( "command:argument:bolt:macro_signature": delegate("bolt:macro_signature"), "command:argument:bolt:macro_match": delegate("bolt:macro_match"), "command:argument:bolt:proc_macro": delegate("bolt:proc_macro"), + "command:argument:bolt:class_name": delegate("bolt:class_name"), + "command:argument:bolt:class_bases": delegate("bolt:class_bases"), + "command:argument:bolt:class_root": delegate("bolt:class_root"), "command:argument:bolt:del_target": delegate("bolt:del_target"), ################################################################################ # Bolt @@ -241,6 +251,9 @@ def get_bolt_parsers( ), ), "bolt:proc_macro": ProcMacroParser(modules), + "bolt:class_name": parse_class_name, + "bolt:class_bases": parse_class_bases, + "bolt:class_root": parse_class_root, "bolt:del_target": parse_del_target, "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), "bolt:identifier": parse_identifier, @@ -461,6 +474,11 @@ def get_stream_pending_macros(stream: TokenStream) -> List[AstMacro]: return stream.data.setdefault("pending_macros", []) +def get_stream_class_scope(stream: TokenStream) -> Optional[Set[str]]: + """Return the set of outer identifiers available inside the class.""" + return stream.data.get("class_scope") + + @dataclass class ToplevelHandler: """Handle toplevel root node.""" @@ -494,24 +512,26 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): return ProcMacroExpansion( DecoratorResolver( DeferredRootBacktracker( - parser=FlushPendingIdentifiersParser( - FunctionConstraint( - BreakContinueConstraint( - parser=IfElseLoweringParser(parser), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), + parser=ClassBodyScoping( + FlushPendingIdentifiersParser( + FunctionConstraint( + BreakContinueConstraint( + parser=IfElseLoweringParser(parser), + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ), + command_identifiers={ + "return", + "return:value", + "yield", + "yield:value", + "yield:from:value", + "global:subcommand", + "nonlocal:subcommand", }, - ), - command_identifiers={ - "return", - "return:value", - "yield", - "yield:value", - "yield:from:value", - "global:subcommand", - "nonlocal:subcommand", - }, + ) ) ), macro_handler=macro_handler, @@ -765,12 +785,10 @@ def __call__(self, stream: TokenStream) -> AstRoot: ): changed = True stack.append(decorator) - elif ( - stack - and command.identifier == "def:function:body" - and isinstance(command.arguments[0], AstFunctionSignature) + elif stack and isinstance( + target := command.arguments[0], (AstFunctionSignature, AstClassName) ): - arg = replace(command.arguments[0], decorators=AstChildren(stack)) + arg = replace(target, decorators=AstChildren(stack)) result.append( replace( command, arguments=AstChildren([arg, *command.arguments[1:]]) @@ -778,8 +796,8 @@ def __call__(self, stream: TokenStream) -> AstRoot: ) stack.clear() elif stack: - exc = InvalidSyntax("Decorators can only be applied to functions.") - raise set_location(exc, stack[-1]) + message = "Decorators can only be applied to functions or classes." + raise set_location(InvalidSyntax(message), stack[-1]) else: result.append(command) @@ -953,6 +971,13 @@ def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: identifiers = get_stream_identifiers(stream) pending_identifiers = get_stream_pending_identifiers(stream) deferred_locals = get_stream_deferred_locals(stream) + class_scope = get_stream_class_scope(stream) + + identifiers.update(pending_identifiers) + pending_identifiers.clear() + + if class_scope is not None: + identifiers = class_scope stream_copy = stream.copy() @@ -963,14 +988,14 @@ def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: while consume_line_continuation(stream): stream.expect("statement") - stream_copy.data["identifiers"] = identifiers | pending_identifiers + stream_copy.data["identifiers"] = identifiers | deferred_locals stream_copy.data["pending_identifiers"] = set() stream_copy.data["identifiers_storage"] = {loc: "local" for loc in deferred_locals} stream_copy.data["pending_identifiers_storage"] = {} stream_copy.data["deferred_locals"] = set() stream_copy.data["branch_scope"] = set() + stream_copy.data["class_scope"] = None - pending_identifiers.clear() deferred_locals.clear() node = AstDeferredRoot(stream=stream_copy) @@ -982,6 +1007,10 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: identifiers = get_stream_identifiers(stream) pending_identifiers = get_stream_pending_identifiers(stream) deferred_locals = get_stream_deferred_locals(stream) + class_scope = get_stream_class_scope(stream) + + if class_scope is not None: + identifiers = class_scope scoped_identifiers = set(identifiers) @@ -1019,11 +1048,8 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: stream.expect(("brace", ")")) break - identifiers.add(identifier.value) - - args = {arg.name for arg in arguments} - pending_identifiers |= args - deferred_locals |= args + pending_identifiers.add(identifier.value) + deferred_locals |= {arg.name for arg in arguments} node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) return set_location(node, identifier, stream.current) @@ -1311,6 +1337,72 @@ def __call__(self, stream: TokenStream) -> AstRoot: return node +def parse_class_name(stream: TokenStream) -> AstClassName: + """Parse class name.""" + with stream.syntax(identifier=IDENTIFIER_PATTERN): + token = stream.expect("identifier") + + get_stream_pending_identifiers(stream).add(token.value) + return set_location(AstClassName(value=token.value), token) + + +def parse_class_bases(stream: TokenStream) -> AstClassBases: + """Parse class bases.""" + inherit: List[AstExpression] = [] + + with stream.syntax(brace=r"\(|\)", comma=","): + token = stream.expect(("brace", "(")) + + with stream.ignore("newline"): + for _ in stream.peek_until(("brace", ")")): + inherit.append(delegate("bolt:expression", stream)) + + if not stream.get("comma"): + stream.expect(("brace", ")")) + break + + node = AstClassBases(inherit=AstChildren(inherit)) + return set_location(node, token, stream.current) + + +def parse_class_root(stream: TokenStream) -> AstRoot: + """Parse class root.""" + with stream.provide(class_scope=get_stream_identifiers(stream)): + return delegate("nested_root", stream) + + +@dataclass +class ClassBodyScoping: + """Handle class body scoping.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + class_scope = get_stream_class_scope(stream) + if class_scope is None: + return self.parser(stream) + + identifiers = get_stream_identifiers(stream) + pending_identifiers = get_stream_pending_identifiers(stream) + identifiers_storage = get_stream_identifiers_storage(stream) + pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) + + with stream.provide( + function=False, + identifiers=identifiers.copy(), + pending_identifiers=set(), + identifiers_storage=identifiers_storage.copy(), + pending_identifiers_storage={}, + ): + node = self.parser(stream) + identifiers.update(pending_identifiers) + pending_identifiers.clear() + identifiers_storage.update(pending_identifiers_storage) + pending_identifiers_storage.clear() + + return set_location(AstClassRoot(commands=node.commands), node) + + def parse_del_target(stream: TokenStream) -> AstTarget: node = delegate("bolt:expression", stream) @@ -1533,12 +1625,29 @@ class DeferredRootBacktracker: macro_handler: MacroHandler def __call__(self, stream: TokenStream) -> AstRoot: + node: AstRoot = self.parser(stream) + + if isinstance(node, AstClassRoot): + return node + + return self.resolve_deferred(node, stream) + + def resolve_deferred(self, node: AstRoot, stream: TokenStream) -> AstRoot: should_replace = False commands: List[AstCommand] = [] - node: AstRoot = self.parser(stream) - for command in node.commands: + if command.arguments and isinstance( + body := command.arguments[-1], AstClassRoot + ): + resolved_body = self.resolve_deferred(body, stream) + if resolved_body is not body: + should_replace = True + command = replace( + command, + arguments=AstChildren([*command.arguments[:-1], resolved_body]), + ) + stack: List[AstCommand] = [command] while command.arguments and isinstance( diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 2f10a0201..fa24df552 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -86,6 +86,33 @@ } } }, + "class": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "parser": "bolt:class_name", + "children": { + "bases": { + "type": "argument", + "parser": "bolt:class_bases", + "children": { + "body": { + "type": "argument", + "parser": "bolt:class_root", + "executable": true + } + } + }, + "body": { + "type": "argument", + "parser": "bolt:class_root", + "executable": true + } + } + } + } + }, "del": { "type": "literal", "executable": true, diff --git a/packages/bolt/examples/bolt_class/beet.yml b/packages/bolt/examples/bolt_class/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_class/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_class/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_class/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..8f0e2a489 --- /dev/null +++ b/packages/bolt/examples/bolt_class/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,75 @@ +class Foo: + def __init__(self, name): + self.name = name + +say f"hello {Foo("steve").name}" + +class Bar(Foo): + def __init__(self): + super().__init__("alex") + +say f"hello {Bar().name}" + +class A: + pass +class B: + pass +class C(A, B): + pass + +say C.mro() + +things = [] + +@things.append +@str.upper +@str +@object.__new__ +class Thing1: + def __str__(self): + return "hello" + +@things.append +@str.upper +@str +@object.__new__ +class Thing2: + def __str__(self): + return "world" + +say things + +class Weird: + say hello + +class Ayy: + def bar(self): + say bar + +Ayy().bar() + +class GG: + def __init__(self): + Hmm().damn() + +class Hmm: + value = 42 + + def damn(self): + say value + say self.value + +GG() + +class A: + def b(self): + say b + return B() + +class B: + def a(self): + say a + return A() + +A().b().a() +B().a().b() diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index c6f2e311a..b68357698 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -908,3 +908,85 @@ macro foo(stream): with stream.syntax(number=r"\d+", name=r"\w+"): stream.expect("number") stream.expect("name") +### +class Foo: + pass +### +class Foo(object): + pass +### +class A: + pass +class B: + pass +class Foo(A, B): + pass +### +class Foo: + def bar(self): + pass +### +class Foo: + pass +Foo() +### +class Foo: + bar = 2 +print(Foo.bar) +### +class Foo: + Foo() +### +class Foo: + bar = 2 +print(bar) +### +@print +class Foo: + pass +### +@print +@str.upper +@str +class Foo: + pass +### +@print +foo = "bar" +### +@print +### +if True: + @print +class A: + pass +### +class Foo: + def __init__(self, name): + self.name = name +### +class Foo: + return +### +def f(): + class Foo: + return +### +class Foo: + bar = 1 + 2 +### +class Foo: + say bar +### +class Foo: + def bar(self): + say bar +### +class A: + def b(self): + say b + return B() +class B: + def a(self): + say a + return A() diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt index d7be8dd1d..9f1f94314 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_118__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_118__1.txt @@ -2,7 +2,7 @@ _bolt_lineno = [1, 13, 16], [1, 5, 6] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var5: +with _bolt_runtime.scope() as _bolt_var2: def f(): _bolt_var0 = 1 yield _bolt_var0 @@ -10,15 +10,15 @@ with _bolt_runtime.scope() as _bolt_var5: yield _bolt_var1 _bolt_var2 = 3 yield _bolt_var2 - _bolt_var3 = f - _bolt_var3 = _bolt_var3() - for i in _bolt_var3: - _bolt_var4 = i - _bolt_var4 = _bolt_helper_interpolate_message(_bolt_var4, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var4]))) -_bolt_var6 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var5)) + _bolt_var0 = f + _bolt_var0 = _bolt_var0() + for i in _bolt_var0: + _bolt_var1 = i + _bolt_var1 = _bolt_helper_interpolate_message(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) --- -output = _bolt_var6 +output = _bolt_var3 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_160__1.txt b/packages/bolt/tests/snapshots/bolt__parse_160__1.txt index a65777286..d275538c8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_160__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_160__1.txt @@ -1,14 +1,14 @@ _bolt_lineno = [1, 6], [1, 2] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var0: def f(): _bolt_var0 = {} _bolt_var1 = f _bolt_var1.data = _bolt_var0 -_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var3 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt index b3b05b026..aa79a3543 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__1.txt @@ -7,77 +7,77 @@ _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] _bolt_helper_interpolate_numeric = _bolt_runtime.helpers['interpolate_numeric'] _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] -with _bolt_runtime.scope() as _bolt_var26: +with _bolt_runtime.scope() as _bolt_var16: def init_global_score(self, name): _bolt_var0 = name _bolt_var1 = self _bolt_var1.name = _bolt_var0 def rebind_global_score(self, rhs): - _bolt_var2 = isinstance - _bolt_var3 = rhs - _bolt_var4 = GlobalScore - _bolt_var2 = _bolt_var2(_bolt_var3, _bolt_var4) - with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + _bolt_var0 = isinstance + _bolt_var1 = rhs + _bolt_var2 = GlobalScore + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var3 = self + _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'name') + _bolt_var3 = _bolt_helper_interpolate_entity(_bolt_var3, _bolt_refs[0]) + _bolt_var4 = rhs + _bolt_var4 = _bolt_helper_get_attribute(_bolt_var4, 'name') + _bolt_var4 = _bolt_helper_interpolate_entity(_bolt_var4, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var3, _bolt_refs[2], _bolt_refs[3], _bolt_var4, _bolt_refs[4]]))) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: if _bolt_condition: _bolt_var5 = self _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'name') - _bolt_var5 = _bolt_helper_interpolate_entity(_bolt_var5, _bolt_refs[0]) + _bolt_var5 = _bolt_helper_interpolate_entity(_bolt_var5, _bolt_refs[6]) _bolt_var6 = rhs - _bolt_var6 = _bolt_helper_get_attribute(_bolt_var6, 'name') - _bolt_var6 = _bolt_helper_interpolate_entity(_bolt_var6, _bolt_refs[1]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var5, _bolt_refs[2], _bolt_refs[3], _bolt_var6, _bolt_refs[4]]))) - _bolt_var2 = _bolt_helper_operator_not(_bolt_var2) - with _bolt_helper_branch(_bolt_var2) as _bolt_condition: - if _bolt_condition: - _bolt_var7 = self - _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'name') - _bolt_var7 = _bolt_helper_interpolate_entity(_bolt_var7, _bolt_refs[6]) - _bolt_var8 = rhs - _bolt_var8 = _bolt_helper_interpolate_numeric(_bolt_var8, _bolt_refs[7]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_var7, _bolt_refs[8], _bolt_var8]))) - _bolt_var9 = self - return _bolt_var9 - _bolt_var10 = type - _bolt_var11 = 'GlobalScore' - _bolt_var12 = () - _bolt_var13 = '__init__' - _bolt_var14 = init_global_score - _bolt_var15 = '__rebind__' - _bolt_var16 = rebind_global_score - _bolt_var17 = {_bolt_var13: _bolt_var14, _bolt_var15: _bolt_var16} - _bolt_var10 = _bolt_var10(_bolt_var11, _bolt_var12, _bolt_var17) - GlobalScore = _bolt_var10 - _bolt_var18 = GlobalScore - _bolt_var19 = 'a' - _bolt_var18 = _bolt_var18(_bolt_var19) - a = _bolt_var18 - _bolt_var20 = 123 + _bolt_var6 = _bolt_helper_interpolate_numeric(_bolt_var6, _bolt_refs[7]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_var5, _bolt_refs[8], _bolt_var6]))) + _bolt_var7 = self + return _bolt_var7 + _bolt_var0 = type + _bolt_var1 = 'GlobalScore' + _bolt_var2 = () + _bolt_var3 = '__init__' + _bolt_var4 = init_global_score + _bolt_var5 = '__rebind__' + _bolt_var6 = rebind_global_score + _bolt_var7 = {_bolt_var3: _bolt_var4, _bolt_var5: _bolt_var6} + _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2, _bolt_var7) + GlobalScore = _bolt_var0 + _bolt_var8 = GlobalScore + _bolt_var9 = 'a' + _bolt_var8 = _bolt_var8(_bolt_var9) + a = _bolt_var8 + _bolt_var10 = 123 _bolt_rebind = _bolt_helper_get_rebind(a) - a = _bolt_var20 + a = _bolt_var10 if _bolt_rebind is not None: a = _bolt_rebind(a) - _bolt_var21 = 456 + _bolt_var11 = 456 _bolt_rebind = _bolt_helper_get_rebind(a) - a = _bolt_var21 + a = _bolt_var11 if _bolt_rebind is not None: a = _bolt_rebind(a) - _bolt_var22 = GlobalScore - _bolt_var23 = 'b' - _bolt_var22 = _bolt_var22(_bolt_var23) - b = _bolt_var22 - _bolt_var24 = 789 + _bolt_var12 = GlobalScore + _bolt_var13 = 'b' + _bolt_var12 = _bolt_var12(_bolt_var13) + b = _bolt_var12 + _bolt_var14 = 789 _bolt_rebind = _bolt_helper_get_rebind(b) - b = _bolt_var24 + b = _bolt_var14 if _bolt_rebind is not None: b = _bolt_rebind(b) - _bolt_var25 = a + _bolt_var15 = a _bolt_rebind = _bolt_helper_get_rebind(b) - b = _bolt_var25 + b = _bolt_var15 if _bolt_rebind is not None: b = _bolt_rebind(b) -_bolt_var27 = _bolt_helper_replace(_bolt_refs[10], commands=_bolt_helper_children(_bolt_var26)) +_bolt_var17 = _bolt_helper_replace(_bolt_refs[10], commands=_bolt_helper_children(_bolt_var16)) --- -output = _bolt_var27 +output = _bolt_var17 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt index c099589bb..2ecd153bf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__1.txt @@ -5,7 +5,7 @@ _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] _bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var11: +with _bolt_runtime.scope() as _bolt_var5: def Counter(x=_bolt_helper_missing): if x is _bolt_helper_missing: _bolt_var0 = 0 @@ -19,33 +19,33 @@ with _bolt_runtime.scope() as _bolt_var11: x = _bolt_rebind(x) _bolt_var2 = x return _bolt_var2 - _bolt_var3 = 'incr' - _bolt_var4 = incr - _bolt_var5 = {_bolt_var3: _bolt_var4} - return _bolt_var5 - _bolt_var6 = Counter - _bolt_var6 = _bolt_var6() - counter = _bolt_var6 - _bolt_var7 = counter - _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'incr') - _bolt_var7 = _bolt_var7() - _bolt_var7 = _bolt_helper_interpolate_message(_bolt_var7, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var7]))) - _bolt_var8 = counter - _bolt_var8 = _bolt_helper_get_attribute(_bolt_var8, 'incr') - _bolt_var8 = _bolt_var8() - _bolt_var8 = _bolt_helper_interpolate_message(_bolt_var8, _bolt_refs[2]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_var8]))) - _bolt_var9 = Counter - _bolt_var10 = 9 - _bolt_var9 = _bolt_var9(_bolt_var10) - _bolt_var9 = _bolt_helper_get_attribute(_bolt_var9, 'incr') - _bolt_var9 = _bolt_var9() - _bolt_var9 = _bolt_helper_interpolate_message(_bolt_var9, _bolt_refs[4]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var9]))) -_bolt_var12 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var11)) + _bolt_var1 = 'incr' + _bolt_var2 = incr + _bolt_var3 = {_bolt_var1: _bolt_var2} + return _bolt_var3 + _bolt_var0 = Counter + _bolt_var0 = _bolt_var0() + counter = _bolt_var0 + _bolt_var1 = counter + _bolt_var1 = _bolt_helper_get_attribute(_bolt_var1, 'incr') + _bolt_var1 = _bolt_var1() + _bolt_var1 = _bolt_helper_interpolate_message(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) + _bolt_var2 = counter + _bolt_var2 = _bolt_helper_get_attribute(_bolt_var2, 'incr') + _bolt_var2 = _bolt_var2() + _bolt_var2 = _bolt_helper_interpolate_message(_bolt_var2, _bolt_refs[2]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_var2]))) + _bolt_var3 = Counter + _bolt_var4 = 9 + _bolt_var3 = _bolt_var3(_bolt_var4) + _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'incr') + _bolt_var3 = _bolt_var3() + _bolt_var3 = _bolt_helper_interpolate_message(_bolt_var3, _bolt_refs[4]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var3]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var5)) --- -output = _bolt_var12 +output = _bolt_var6 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__1.txt b/packages/bolt/tests/snapshots/bolt__parse_196__1.txt index 7f0930ffc..bf8ed69f7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_196__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_196__1.txt @@ -3,7 +3,7 @@ _bolt_helper_branch = _bolt_runtime.helpers['branch'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var4: +with _bolt_runtime.scope() as _bolt_var0: def foo(value): _bolt_var0 = value with _bolt_helper_branch(_bolt_var0) as _bolt_condition: @@ -17,9 +17,9 @@ with _bolt_runtime.scope() as _bolt_var4: result = _bolt_var2 _bolt_var3 = result return _bolt_var3 -_bolt_var5 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var4)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var5 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__1.txt b/packages/bolt/tests/snapshots/bolt__parse_197__1.txt index ee55f8b33..76ddff75b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_197__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_197__1.txt @@ -4,7 +4,7 @@ _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var5: +with _bolt_runtime.scope() as _bolt_var0: def foo(value): _bolt_var0 = 'init' result = _bolt_var0 @@ -26,9 +26,9 @@ with _bolt_runtime.scope() as _bolt_var5: result = _bolt_rebind(result) _bolt_var4 = result return _bolt_var4 -_bolt_var6 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var5)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var6 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_218__1.txt b/packages/bolt/tests/snapshots/bolt__parse_218__1.txt index e8faf2b7c..9f0c336b9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_218__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_218__1.txt @@ -2,15 +2,15 @@ _bolt_lineno = [1, 7, 9], [1, 2, 3] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(): _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) _bolt_runtime.commands.extend(_bolt_var0) - _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) - _bolt_runtime.commands.extend(_bolt_var1) -_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var1)) --- -output = _bolt_var3 +output = _bolt_var2 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_219__1.txt b/packages/bolt/tests/snapshots/bolt__parse_219__1.txt index 71ff24891..1b30c9fb3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_219__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_219__1.txt @@ -2,17 +2,17 @@ _bolt_lineno = [1, 7, 11], [1, 2, 3] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var4: +with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(number, text): _bolt_var0 = print _bolt_var1 = number _bolt_var2 = text _bolt_var0 = _bolt_var0(_bolt_var1, _bolt_var2) - _bolt_var3 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) - _bolt_runtime.commands.extend(_bolt_var3) -_bolt_var5 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var4)) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _bolt_var5 +output = _bolt_var2 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_220__1.txt b/packages/bolt/tests/snapshots/bolt__parse_220__1.txt index 01b9124c8..51099a9b8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_220__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_220__1.txt @@ -2,16 +2,16 @@ _bolt_lineno = [1, 7, 10], [1, 2, 4] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var0: def _bolt_macro0(): _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[0]) _bolt_runtime.commands.extend(_bolt_var0) def _bolt_macro1(): - _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) - _bolt_runtime.commands.extend(_bolt_var1) -_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var3 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_221__1.txt b/packages/bolt/tests/snapshots/bolt__parse_221__1.txt index 51ab5a792..e42c68a19 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_221__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_221__1.txt @@ -2,16 +2,16 @@ _bolt_lineno = [1, 8, 10], [1, 3, 4] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var0: def _bolt_macro0(): def _bolt_macro1(): _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) _bolt_runtime.commands.extend(_bolt_var0) - _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[1]) - _bolt_runtime.commands.extend(_bolt_var1) -_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var3 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_226__1.txt b/packages/bolt/tests/snapshots/bolt__parse_226__1.txt index e28770496..872e7ef9d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_226__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_226__1.txt @@ -3,16 +3,16 @@ _bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(message): _bolt_var0 = message _bolt_var0 = _bolt_helper_interpolate_message(_bolt_var0, _bolt_refs[0]) _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var0]))) - _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[2]) - _bolt_runtime.commands.extend(_bolt_var1) -_bolt_var3 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2)) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[2]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var1)) --- -output = _bolt_var3 +output = _bolt_var2 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_227__1.txt b/packages/bolt/tests/snapshots/bolt__parse_227__1.txt index bcfbd1136..2b4c2ffd5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_227__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_227__1.txt @@ -3,17 +3,17 @@ _bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_ _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(block): _bolt_var0 = block _bolt_var0 = _bolt_helper_interpolate_resource_location(_bolt_var0, _bolt_refs[0]) _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[2], _bolt_helper_replace(_bolt_refs[1], identifier=_bolt_var0)]))) - _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[4]) - _bolt_runtime.commands.extend(_bolt_var1) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[4]) + _bolt_runtime.commands.extend(_bolt_var0) _bolt_runtime.commands.append(_bolt_refs[5]) -_bolt_var3 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var2)) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var1)) --- -output = _bolt_var3 +output = _bolt_var2 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_228__1.txt b/packages/bolt/tests/snapshots/bolt__parse_228__1.txt index e48fd3e71..45b780864 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_228__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_228__1.txt @@ -2,17 +2,17 @@ _bolt_lineno = [1, 7, 9, 11], [1, 2, 3, 4] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var3: +with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(body): _bolt_var0 = body yield _bolt_var0 _bolt_var1 = body yield _bolt_var1 - _bolt_var2 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) - _bolt_runtime.commands.extend(_bolt_var2) -_bolt_var4 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var3)) + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) --- -output = _bolt_var4 +output = _bolt_var2 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_245__1.txt b/packages/bolt/tests/snapshots/bolt__parse_245__1.txt index 5cadd6f8b..2875680b8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_245__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_245__1.txt @@ -3,7 +3,7 @@ _bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_proc_macros = {} _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var7: +with _bolt_runtime.scope() as _bolt_var0: def _bolt_macro0(stream): _bolt_var0 = stream _bolt_var0 = _bolt_helper_get_attribute(_bolt_var0, 'syntax') @@ -20,9 +20,9 @@ with _bolt_runtime.scope() as _bolt_var7: _bolt_var6 = 'name' _bolt_var5 = _bolt_var5(_bolt_var6) _bolt_proc_macros['foo:proc_macro_overload3'] = _bolt_macro0 -_bolt_var8 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var7)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var8 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_246__0.txt b/packages/bolt/tests/snapshots/bolt__parse_246__0.txt new file mode 100644 index 000000000..56fe1f6c8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_246__0.txt @@ -0,0 +1,28 @@ +class Foo: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_246__1.txt b/packages/bolt/tests/snapshots/bolt__parse_246__1.txt new file mode 100644 index 000000000..a8792305b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_246__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class Foo: + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_247__0.txt b/packages/bolt/tests/snapshots/bolt__parse_247__0.txt new file mode 100644 index 000000000..3eaf33a50 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_247__0.txt @@ -0,0 +1,36 @@ +class Foo(object): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'class:name:bases:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + inherit: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 'object' + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=23, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_247__1.txt b/packages/bolt/tests/snapshots/bolt__parse_247__1.txt new file mode 100644 index 000000000..32bccc674 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_247__1.txt @@ -0,0 +1,17 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = object + class Foo(_bolt_var0): + pass +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_248__0.txt b/packages/bolt/tests/snapshots/bolt__parse_248__0.txt new file mode 100644 index 000000000..768b23f59 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_248__0.txt @@ -0,0 +1,86 @@ +class A: + pass +class B: + pass +class Foo(A, B): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=62, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + value: 'A' + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=35, lineno=4, colno=9) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=24, lineno=3, colno=7) + end_location: SourceLocation(pos=25, lineno=3, colno=8) + decorators: + + value: 'B' + + location: SourceLocation(pos=31, lineno=4, colno=5) + end_location: SourceLocation(pos=35, lineno=4, colno=9) + commands: + + location: SourceLocation(pos=31, lineno=4, colno=5) + end_location: SourceLocation(pos=35, lineno=4, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=36, lineno=5, colno=1) + end_location: SourceLocation(pos=61, lineno=6, colno=9) + identifier: 'class:name:bases:body' + arguments: + + location: SourceLocation(pos=42, lineno=5, colno=7) + end_location: SourceLocation(pos=45, lineno=5, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=45, lineno=5, colno=10) + end_location: SourceLocation(pos=51, lineno=5, colno=16) + inherit: + + location: SourceLocation(pos=46, lineno=5, colno=11) + end_location: SourceLocation(pos=47, lineno=5, colno=12) + value: 'A' + + location: SourceLocation(pos=49, lineno=5, colno=14) + end_location: SourceLocation(pos=50, lineno=5, colno=15) + value: 'B' + + location: SourceLocation(pos=57, lineno=6, colno=5) + end_location: SourceLocation(pos=61, lineno=6, colno=9) + commands: + + location: SourceLocation(pos=57, lineno=6, colno=5) + end_location: SourceLocation(pos=61, lineno=6, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_248__1.txt b/packages/bolt/tests/snapshots/bolt__parse_248__1.txt new file mode 100644 index 000000000..25b427440 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_248__1.txt @@ -0,0 +1,24 @@ +_bolt_lineno = [1, 7, 9], [1, 3, 5] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + class A: + pass + class B: + pass + _bolt_var0 = A + _bolt_var1 = B + class Foo(_bolt_var0, _bolt_var1): + pass +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=62, lineno=7, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_249__0.txt b/packages/bolt/tests/snapshots/bolt__parse_249__0.txt new file mode 100644 index 000000000..3edf2d2bb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_249__0.txt @@ -0,0 +1,50 @@ +class Foo: + def bar(self): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=28, lineno=2, colno=18) + decorators: + + name: 'bar' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=13) + end_location: SourceLocation(pos=27, lineno=2, colno=17) + name: 'self' + default: None + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_249__1.txt b/packages/bolt/tests/snapshots/bolt__parse_249__1.txt new file mode 100644 index 000000000..2b30571c4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_249__1.txt @@ -0,0 +1,17 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class Foo: + def bar(self): + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=3, colno=13) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_250__0.txt b/packages/bolt/tests/snapshots/bolt__parse_250__0.txt new file mode 100644 index 000000000..6ad07c586 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_250__0.txt @@ -0,0 +1,44 @@ +class Foo: + pass +Foo() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=19, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=25, lineno=3, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=25, lineno=3, colno=6) + value: + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=23, lineno=3, colno=4) + value: 'Foo' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_250__1.txt b/packages/bolt/tests/snapshots/bolt__parse_250__1.txt new file mode 100644 index 000000000..12de4c015 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_250__1.txt @@ -0,0 +1,19 @@ +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + class Foo: + pass + _bolt_var0 = Foo + _bolt_var0 = _bolt_var0() +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_251__0.txt b/packages/bolt/tests/snapshots/bolt__parse_251__0.txt new file mode 100644 index 000000000..f17127ccd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_251__0.txt @@ -0,0 +1,66 @@ +class Foo: + bar = 2 +print(Foo.bar) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + value: 'bar' + rebind: False + value: + + location: SourceLocation(pos=21, lineno=2, colno=11) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + value: 2 + + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=37, lineno=3, colno=15) + value: + + location: SourceLocation(pos=23, lineno=3, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=6) + value: 'print' + arguments: + + location: SourceLocation(pos=29, lineno=3, colno=7) + end_location: SourceLocation(pos=36, lineno=3, colno=14) + name: 'bar' + value: + + location: SourceLocation(pos=29, lineno=3, colno=7) + end_location: SourceLocation(pos=32, lineno=3, colno=10) + value: 'Foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_251__1.txt b/packages/bolt/tests/snapshots/bolt__parse_251__1.txt new file mode 100644 index 000000000..5ebbb9de2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_251__1.txt @@ -0,0 +1,24 @@ +_bolt_lineno = [1, 8, 10], [1, 2, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + class Foo: + _bolt_var0 = 2 + bar = _bolt_var0 + del _bolt_var0 + _bolt_var0 = print + _bolt_var1 = Foo + _bolt_var1 = _bolt_helper_get_attribute(_bolt_var1, 'bar') + _bolt_var0 = _bolt_var0(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=4, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_252__0.txt b/packages/bolt/tests/snapshots/bolt__parse_252__0.txt new file mode 100644 index 000000000..60deb8a68 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_252__0.txt @@ -0,0 +1,9 @@ +class Foo: +#>ERROR Identifier "Foo" is not defined. +# line 2, column 5 +# 1 | class Foo: +# 2 | Foo() +# : ^^^ +# Notes: +# - Expected assignment but got literal '()'. + Foo() diff --git a/packages/bolt/tests/snapshots/bolt__parse_253__0.txt b/packages/bolt/tests/snapshots/bolt__parse_253__0.txt new file mode 100644 index 000000000..38534d391 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_253__0.txt @@ -0,0 +1,10 @@ +class Foo: + bar = 2 +#>ERROR Identifier "bar" is not defined. +# line 3, column 7 +# 2 | bar = 2 +# 3 | print(bar) +# : ^^^ +# Notes: +# - Expected equal but got brace ')'. +print(bar) diff --git a/packages/bolt/tests/snapshots/bolt__parse_254__0.txt b/packages/bolt/tests/snapshots/bolt__parse_254__0.txt new file mode 100644 index 000000000..9aa081a6a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_254__0.txt @@ -0,0 +1,36 @@ +@print +class Foo: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=9) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=7) + end_location: SourceLocation(pos=16, lineno=2, colno=10) + decorators: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + expression: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'print' + value: 'Foo' + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=9) + commands: + + location: SourceLocation(pos=22, lineno=3, colno=5) + end_location: SourceLocation(pos=26, lineno=3, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_254__1.txt b/packages/bolt/tests/snapshots/bolt__parse_254__1.txt new file mode 100644 index 000000000..e356d4d1c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_254__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1, 6, 8], [1, 2, 1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = print + class Foo: + pass + Foo = _bolt_var0(Foo) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_255__0.txt b/packages/bolt/tests/snapshots/bolt__parse_255__0.txt new file mode 100644 index 000000000..560d44f6b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_255__0.txt @@ -0,0 +1,59 @@ +@print +@str.upper +@str +class Foo: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=23, lineno=4, colno=1) + end_location: SourceLocation(pos=42, lineno=5, colno=9) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=29, lineno=4, colno=7) + end_location: SourceLocation(pos=32, lineno=4, colno=10) + decorators: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + expression: + + location: SourceLocation(pos=1, lineno=1, colno=2) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + value: 'print' + + location: SourceLocation(pos=7, lineno=2, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + expression: + + location: SourceLocation(pos=8, lineno=2, colno=2) + end_location: SourceLocation(pos=17, lineno=2, colno=11) + name: 'upper' + value: + + location: SourceLocation(pos=8, lineno=2, colno=2) + end_location: SourceLocation(pos=11, lineno=2, colno=5) + value: 'str' + + location: SourceLocation(pos=18, lineno=3, colno=1) + end_location: SourceLocation(pos=22, lineno=3, colno=5) + expression: + + location: SourceLocation(pos=19, lineno=3, colno=2) + end_location: SourceLocation(pos=22, lineno=3, colno=5) + value: 'str' + value: 'Foo' + + location: SourceLocation(pos=38, lineno=5, colno=5) + end_location: SourceLocation(pos=42, lineno=5, colno=9) + commands: + + location: SourceLocation(pos=38, lineno=5, colno=5) + end_location: SourceLocation(pos=42, lineno=5, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_255__1.txt b/packages/bolt/tests/snapshots/bolt__parse_255__1.txt new file mode 100644 index 000000000..e6cbc4de5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_255__1.txt @@ -0,0 +1,24 @@ +_bolt_lineno = [1, 7, 9, 10, 12, 13, 14], [1, 2, 3, 4, 3, 2, 1] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = print + _bolt_var1 = str + _bolt_var1 = _bolt_helper_get_attribute(_bolt_var1, 'upper') + _bolt_var2 = str + class Foo: + pass + Foo = _bolt_var2(Foo) + Foo = _bolt_var1(Foo) + Foo = _bolt_var0(Foo) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=43, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_256__0.txt b/packages/bolt/tests/snapshots/bolt__parse_256__0.txt new file mode 100644 index 000000000..c0832442f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_256__0.txt @@ -0,0 +1,7 @@ +#>ERROR Decorators can only be applied to functions or classes. +# line 1, column 1 +# 1 | @print +# : ^^^^^^ +# 2 | foo = "bar" +@print +foo = "bar" diff --git a/packages/bolt/tests/snapshots/bolt__parse_257__0.txt b/packages/bolt/tests/snapshots/bolt__parse_257__0.txt new file mode 100644 index 000000000..68625e835 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_257__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can't apply decorator to nothing. +# line 1, column 1 +# 1 | @print +# : ^^^^^^ +@print diff --git a/packages/bolt/tests/snapshots/bolt__parse_258__0.txt b/packages/bolt/tests/snapshots/bolt__parse_258__0.txt new file mode 100644 index 000000000..168b82b8a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_258__0.txt @@ -0,0 +1,11 @@ +if True: +#>ERROR Can't apply decorator to nothing. +# line 2, column 5 +# 1 | if True: +# 2 | @print +# : ^^^^^^ +# 3 | class A: +# 4 | pass + @print +class A: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_259__0.txt b/packages/bolt/tests/snapshots/bolt__parse_259__0.txt new file mode 100644 index 000000000..eac8645e4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_259__0.txt @@ -0,0 +1,73 @@ +class Foo: + def __init__(self, name): + self.name = name +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=39, lineno=2, colno=29) + decorators: + + name: '__init__' + arguments: + + location: SourceLocation(pos=28, lineno=2, colno=18) + end_location: SourceLocation(pos=32, lineno=2, colno=22) + name: 'self' + default: None + + location: SourceLocation(pos=34, lineno=2, colno=24) + end_location: SourceLocation(pos=38, lineno=2, colno=28) + name: 'name' + default: None + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + commands: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + operator: '=' + target: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=18) + name: 'name' + value: + + location: SourceLocation(pos=49, lineno=3, colno=9) + end_location: SourceLocation(pos=53, lineno=3, colno=13) + value: 'self' + value: + + location: SourceLocation(pos=61, lineno=3, colno=21) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + value: 'name' diff --git a/packages/bolt/tests/snapshots/bolt__parse_259__1.txt b/packages/bolt/tests/snapshots/bolt__parse_259__1.txt new file mode 100644 index 000000000..12e96d2d1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_259__1.txt @@ -0,0 +1,19 @@ +_bolt_lineno = [1, 7], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class Foo: + def __init__(self, name): + _bolt_var0 = name + _bolt_var1 = self + _bolt_var1.name = _bolt_var0 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=3, colno=25) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_260__0.txt b/packages/bolt/tests/snapshots/bolt__parse_260__0.txt new file mode 100644 index 000000000..696fc8ae7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_260__0.txt @@ -0,0 +1,7 @@ +class Foo: +#>ERROR Can only use "return" in functions. +# line 2, column 5 +# 1 | class Foo: +# 2 | return +# : ^^^^^^ + return diff --git a/packages/bolt/tests/snapshots/bolt__parse_261__0.txt b/packages/bolt/tests/snapshots/bolt__parse_261__0.txt new file mode 100644 index 000000000..28a9be8da --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_261__0.txt @@ -0,0 +1,8 @@ +def f(): + class Foo: +#>ERROR Can only use "return" in functions. +# line 3, column 9 +# 2 | class Foo: +# 3 | return +# : ^^^^^^ + return diff --git a/packages/bolt/tests/snapshots/bolt__parse_262__0.txt b/packages/bolt/tests/snapshots/bolt__parse_262__0.txt new file mode 100644 index 000000000..0b2087109 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_262__0.txt @@ -0,0 +1,52 @@ +class Foo: + bar = 1 + 2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=16) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=16) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=16) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=16) + operator: '=' + target: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=8) + value: 'bar' + rebind: False + value: + + location: SourceLocation(pos=21, lineno=2, colno=11) + end_location: SourceLocation(pos=26, lineno=2, colno=16) + operator: '+' + left: + + location: SourceLocation(pos=21, lineno=2, colno=11) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + value: 1 + right: + + location: SourceLocation(pos=25, lineno=2, colno=15) + end_location: SourceLocation(pos=26, lineno=2, colno=16) + value: 2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_262__1.txt b/packages/bolt/tests/snapshots/bolt__parse_262__1.txt new file mode 100644 index 000000000..9e6b033f0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_262__1.txt @@ -0,0 +1,21 @@ +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class Foo: + _bolt_var0 = 1 + _bolt_var1 = 2 + _bolt_var0 = _bolt_var0 + _bolt_var1 + bar = _bolt_var0 + del _bolt_var0 + del _bolt_var1 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_263__0.txt b/packages/bolt/tests/snapshots/bolt__parse_263__0.txt new file mode 100644 index 000000000..0dce49fc8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_263__0.txt @@ -0,0 +1,35 @@ +class Foo: + say bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + fragments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + value: 'bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_263__1.txt b/packages/bolt/tests/snapshots/bolt__parse_263__1.txt new file mode 100644 index 000000000..1e15104e0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_263__1.txt @@ -0,0 +1,22 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class Foo: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + commands: + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=2, colno=12) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_264__0.txt b/packages/bolt/tests/snapshots/bolt__parse_264__0.txt new file mode 100644 index 000000000..e9463ecee --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_264__0.txt @@ -0,0 +1,57 @@ +class Foo: + def bar(self): + say bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + decorators: + + value: 'Foo' + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + commands: + + location: SourceLocation(pos=15, lineno=2, colno=5) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=9) + end_location: SourceLocation(pos=28, lineno=2, colno=18) + decorators: + + name: 'bar' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=13) + end_location: SourceLocation(pos=27, lineno=2, colno=17) + name: 'self' + default: None + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + commands: + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=42, lineno=3, colno=13) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + fragments: + + location: SourceLocation(pos=42, lineno=3, colno=13) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + value: 'bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_264__1.txt b/packages/bolt/tests/snapshots/bolt__parse_264__1.txt new file mode 100644 index 000000000..9ef8437b8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_264__1.txt @@ -0,0 +1,23 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class Foo: + def bar(self): + _bolt_runtime.commands.extend(_bolt_refs[0].commands) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=38, lineno=3, colno=9) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + commands: + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=3, colno=16) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_265__0.txt b/packages/bolt/tests/snapshots/bolt__parse_265__0.txt new file mode 100644 index 000000000..f8e0450eb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_265__0.txt @@ -0,0 +1,141 @@ +class A: + def b(self): + say b + return B() +class B: + def a(self): + say a + return A() +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=4, colno=19) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + value: 'A' + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=4, colno=19) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=58, lineno=4, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=16) + decorators: + + name: 'b' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=11) + end_location: SourceLocation(pos=23, lineno=2, colno=15) + name: 'self' + default: None + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=4, colno=19) + commands: + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=38, lineno=3, colno=13) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + fragments: + + location: SourceLocation(pos=38, lineno=3, colno=13) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + value: 'b' + + location: SourceLocation(pos=48, lineno=4, colno=9) + end_location: SourceLocation(pos=58, lineno=4, colno=19) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=55, lineno=4, colno=16) + end_location: SourceLocation(pos=58, lineno=4, colno=19) + value: + + location: SourceLocation(pos=55, lineno=4, colno=16) + end_location: SourceLocation(pos=56, lineno=4, colno=17) + value: 'B' + arguments: + + + location: SourceLocation(pos=59, lineno=5, colno=1) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=65, lineno=5, colno=7) + end_location: SourceLocation(pos=66, lineno=5, colno=8) + decorators: + + value: 'B' + + location: SourceLocation(pos=72, lineno=6, colno=5) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + commands: + + location: SourceLocation(pos=72, lineno=6, colno=5) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=76, lineno=6, colno=9) + end_location: SourceLocation(pos=83, lineno=6, colno=16) + decorators: + + name: 'a' + arguments: + + location: SourceLocation(pos=78, lineno=6, colno=11) + end_location: SourceLocation(pos=82, lineno=6, colno=15) + name: 'self' + default: None + + location: SourceLocation(pos=93, lineno=7, colno=9) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + commands: + + location: SourceLocation(pos=93, lineno=7, colno=9) + end_location: SourceLocation(pos=98, lineno=7, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=97, lineno=7, colno=13) + end_location: SourceLocation(pos=98, lineno=7, colno=14) + fragments: + + location: SourceLocation(pos=97, lineno=7, colno=13) + end_location: SourceLocation(pos=98, lineno=7, colno=14) + value: 'a' + + location: SourceLocation(pos=107, lineno=8, colno=9) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=114, lineno=8, colno=16) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + value: + + location: SourceLocation(pos=114, lineno=8, colno=16) + end_location: SourceLocation(pos=115, lineno=8, colno=17) + value: 'A' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_265__1.txt b/packages/bolt/tests/snapshots/bolt__parse_265__1.txt new file mode 100644 index 000000000..e70017248 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_265__1.txt @@ -0,0 +1,41 @@ +_bolt_lineno = [1, 8, 11, 14], [1, 4, 5, 8] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class A: + def b(self): + _bolt_runtime.commands.append(_bolt_refs[0]) + _bolt_var0 = B + _bolt_var0 = _bolt_var0() + return _bolt_var0 + class B: + def a(self): + _bolt_runtime.commands.append(_bolt_refs[1]) + _bolt_var0 = A + _bolt_var0 = _bolt_var0() + return _bolt_var0 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=34, lineno=3, colno=9) + end_location: SourceLocation(pos=39, lineno=3, colno=14) + identifier: 'say:message' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=93, lineno=7, colno=9) + end_location: SourceLocation(pos=98, lineno=7, colno=14) + identifier: 'say:message' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=117, lineno=8, colno=19) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index 7f97a8665..a83d277e7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 149 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 150 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_71__1.txt b/packages/bolt/tests/snapshots/bolt__parse_71__1.txt index 30c18452b..cd3e733b2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_71__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_71__1.txt @@ -1,16 +1,16 @@ _bolt_lineno = [1, 7, 9], [1, 3, 4] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var0: def foo(): def bar(): _bolt_var0 = foo _bolt_var0 = _bolt_var0() - _bolt_var1 = bar - _bolt_var1 = _bolt_var1() -_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) + _bolt_var0 = bar + _bolt_var0 = _bolt_var0() +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var3 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_72__1.txt b/packages/bolt/tests/snapshots/bolt__parse_72__1.txt index af38484e4..b3aaa56cd 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_72__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_72__1.txt @@ -2,7 +2,7 @@ _bolt_lineno = [1, 11, 14], [1, 3, 4] _bolt_helper_missing = _bolt_runtime.helpers['missing'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var4: +with _bolt_runtime.scope() as _bolt_var0: def foo(a=_bolt_helper_missing, b=_bolt_helper_missing, c=_bolt_helper_missing): if a is _bolt_helper_missing: _bolt_var0 = 1 @@ -16,9 +16,9 @@ with _bolt_runtime.scope() as _bolt_var4: _bolt_var2 = _bolt_var2 + _bolt_var3 c = _bolt_var2 _bolt_runtime.commands.extend(_bolt_refs[0].commands) -_bolt_var5 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var4)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var5 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_77__1.txt b/packages/bolt/tests/snapshots/bolt__parse_77__1.txt index 91cf41d4f..a28096eb2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_77__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_77__1.txt @@ -3,7 +3,7 @@ _bolt_helper_missing = _bolt_runtime.helpers['missing'] _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var0: def f(a, b=_bolt_helper_missing): if b is _bolt_helper_missing: _bolt_var0 = a @@ -14,9 +14,9 @@ with _bolt_runtime.scope() as _bolt_var2: if _bolt_rebind is not None: b = _bolt_rebind(b) _bolt_runtime.commands.append(_bolt_refs[0]) -_bolt_var3 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var2)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var3 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_81__1.txt b/packages/bolt/tests/snapshots/bolt__parse_81__1.txt index 1eeabd577..028b75722 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_81__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_81__1.txt @@ -2,7 +2,7 @@ _bolt_lineno = [1, 10, 11, 13, 21], [1, 9, 10, 11, 14] _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var5: +with _bolt_runtime.scope() as _bolt_var0: def foo(something): def wat(): _bolt_runtime.commands.append(_bolt_refs[0]) @@ -18,11 +18,11 @@ with _bolt_runtime.scope() as _bolt_var5: if _bolt_rebind is not None: x = _bolt_rebind(x) _bolt_runtime.commands.append(_bolt_refs[1]) - _bolt_var4 = wat - _bolt_var4 = _bolt_var4() -_bolt_var6 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var5)) + _bolt_var0 = wat + _bolt_var0 = _bolt_var0() +_bolt_var1 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var6 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_82__1.txt b/packages/bolt/tests/snapshots/bolt__parse_82__1.txt index 1fcaab65a..a9839c666 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_82__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_82__1.txt @@ -2,7 +2,7 @@ _bolt_lineno = [1, 7, 8, 15, 16, 22], [1, 2, 3, 5, 6, 7] _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var3: +with _bolt_runtime.scope() as _bolt_var1: def foo(): global thing _bolt_var0 = bar @@ -13,18 +13,18 @@ with _bolt_runtime.scope() as _bolt_var3: thing = _bolt_rebind(thing) def bar(): global thing - _bolt_var1 = foo - _bolt_var1 = _bolt_var1() + _bolt_var0 = foo + _bolt_var0 = _bolt_var0() _bolt_rebind = _bolt_helper_get_rebind(thing) - thing += _bolt_var1 + thing += _bolt_var0 if _bolt_rebind is not None: thing = _bolt_rebind(thing) - _bolt_var2 = bar - _bolt_var2 = _bolt_var2() - thing = _bolt_var2 -_bolt_var4 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var3)) + _bolt_var0 = bar + _bolt_var0 = _bolt_var0() + thing = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) --- -output = _bolt_var4 +output = _bolt_var2 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__1.txt b/packages/bolt/tests/snapshots/bolt__parse_87__1.txt index 591cf5e62..9d02d2f4b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_87__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_87__1.txt @@ -1,16 +1,16 @@ _bolt_lineno = [1, 7, 10], [1, 3, 4] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var2: +with _bolt_runtime.scope() as _bolt_var0: def f(): def g(): _bolt_var0 = foo return _bolt_var0 - _bolt_var1 = 0 - foo = _bolt_var1 -_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) + _bolt_var0 = 0 + foo = _bolt_var0 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var3 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt index 8e6f83c6b..45b395e18 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_89__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_89__1.txt @@ -2,17 +2,17 @@ _bolt_lineno = [1, 7, 10], [1, 2, 3] _bolt_helper_interpolate_json = _bolt_runtime.helpers['interpolate_json'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var3: +with _bolt_runtime.scope() as _bolt_var2: def f(x): _bolt_var0 = x _bolt_var0 = _bolt_helper_interpolate_json(_bolt_var0, _bolt_refs[0]) _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var0]))) - _bolt_var1 = f - _bolt_var2 = 'thing' - _bolt_var1 = _bolt_var1(_bolt_var2) -_bolt_var4 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var3)) + _bolt_var0 = f + _bolt_var1 = 'thing' + _bolt_var0 = _bolt_var0(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2)) --- -output = _bolt_var4 +output = _bolt_var3 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt index d13897dab..82a65d758 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__1.txt @@ -1,7 +1,7 @@ _bolt_lineno = [1, 6], [1, 2] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var8: +with _bolt_runtime.scope() as _bolt_var0: def f(): _bolt_var0 = f _bolt_var0 = _bolt_var0() @@ -14,9 +14,9 @@ with _bolt_runtime.scope() as _bolt_var8: _bolt_var6 = [_bolt_var3, _bolt_var4, _bolt_var5] _bolt_var7 = {_bolt_var0: _bolt_var1, _bolt_var2: _bolt_var6} return _bolt_var7 -_bolt_var9 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var8)) +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var9 +output = _bolt_var1 --- _bolt_refs[0] diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md new file mode 100644 index 000000000..8e86b8a55 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md @@ -0,0 +1,33 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello steve +say hello alex +say [, , , ] +say ['HELLO', 'WORLD'] +say hello +say bar +say value +say 42 +say b +say a +say a +say b +``` diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 8bb347ca4..db560d4f1 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -74,6 +74,8 @@ "bossbar:set:id:value:value", "bossbar:set:id:visible:visible", "break", + "class:name:bases:body", + "class:name:body", "clear", "clear:targets", "clear:targets:item", From 7f0f69eb27630b3bbe4b8c77be5829ef7b2ae308 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 20 Jul 2022 00:49:58 +0000 Subject: [PATCH 0954/1554] 0.17.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index d70ee76ee..fbd4c198b 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.0 (2022-07-20) +### Feature +* Add bolt classes ([`71c1162`](https://github.com/mcbeet/bolt/commit/71c1162c99c61eb747573a370646f80b787f95f5)) + ## v0.16.0 (2022-07-17) ### Feature * Make modules lazy by default ([`370a759`](https://github.com/mcbeet/bolt/commit/370a7596d0a5764dfe0c2ce5e553483f8728ab60)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e7abf1bf8..b4db77a9a 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.16.0" +__version__ = "0.17.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index d9a6d5363..39cb35bc1 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.16.0" +version = "0.17.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 3a151ba2399b33829257608b5de895f0de518a35 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 20 Jul 2022 21:25:31 +0200 Subject: [PATCH 0955/1554] fix: missing fstring --- packages/mecha/mecha/ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index d82d818ab..448c5d654 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -260,7 +260,7 @@ def from_value(cls, value: Any) -> "AstNumber": value = string_to_number(value) if isinstance(value, (int, float)): return AstNumber(value=value) - raise ValueError("Invalid number {value!r}.") + raise ValueError(f"Invalid number {value!r}.") @dataclass(frozen=True) From 9c2eead3fa40f4f2089851ddb3c207501ae4282a Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 20 Jul 2022 19:26:22 +0000 Subject: [PATCH 0956/1554] 0.54.6 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 93cbf4472..c5367c936 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.6 (2022-07-20) +### Fix +* Missing fstring ([`7ad01d0`](https://github.com/mcbeet/mecha/commit/7ad01d03b901b117a8edf0bcd9a6a87c1d4f7eb6)) + ## v0.54.5 (2022-07-07) ### Fix * Missing executable check ([`d646789`](https://github.com/mcbeet/mecha/commit/d6467890aa8ee42d413d3c411309a4f255eb8a89)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 6a4334fdf..7a21f268b 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.5" +__version__ = "0.54.6" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 6f108eee1..599405335 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.5" +version = "0.54.6" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From a0ca37d13c64ba2bc0ba9856799066281fb0cdc7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 21 Jul 2022 23:47:52 +0200 Subject: [PATCH 0957/1554] refactor: compose root parsers sequentially --- packages/bolt/bolt/parse.py | 53 +++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 057295280..c9e70035b 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -509,35 +509,32 @@ def __call__(self, stream: TokenStream) -> Any: def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): """Return parser for the root node for bolt.""" - return ProcMacroExpansion( - DecoratorResolver( - DeferredRootBacktracker( - parser=ClassBodyScoping( - FlushPendingIdentifiersParser( - FunctionConstraint( - BreakContinueConstraint( - parser=IfElseLoweringParser(parser), - allowed_scopes={ - ("while", "condition", "body"), - ("for", "target", "in", "iterable", "body"), - }, - ), - command_identifiers={ - "return", - "return:value", - "yield", - "yield:value", - "yield:from:value", - "global:subcommand", - "nonlocal:subcommand", - }, - ) - ) - ), - macro_handler=macro_handler, - ) - ) + parser = IfElseLoweringParser(parser) + parser = BreakContinueConstraint( + parser, + allowed_scopes={ + ("while", "condition", "body"), + ("for", "target", "in", "iterable", "body"), + }, + ) + parser = FunctionConstraint( + parser, + command_identifiers={ + "return", + "return:value", + "yield", + "yield:value", + "yield:from:value", + "global:subcommand", + "nonlocal:subcommand", + }, ) + parser = FlushPendingIdentifiersParser(parser) + parser = ClassBodyScoping(parser) + parser = DeferredRootBacktracker(parser, macro_handler=macro_handler) + parser = DecoratorResolver(parser) + parser = ProcMacroExpansion(parser) + return parser class UndefinedIdentifier(InvalidSyntax): From 01ba101a933164acfb8c73d7fb1b71d7bc00c3af Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 22 Jul 2022 00:44:36 +0200 Subject: [PATCH 0958/1554] fix: only allow imports and macros directly at scope level --- packages/bolt/bolt/parse.py | 27 +++++++++++++++++++ .../tests/resources/bolt_examples.mcfunction | 27 +++++++++++++++++++ .../tests/snapshots/bolt__parse_266__0.txt | 7 +++++ .../tests/snapshots/bolt__parse_267__0.txt | 8 ++++++ .../tests/snapshots/bolt__parse_268__0.txt | 8 ++++++ .../tests/snapshots/bolt__parse_269__0.txt | 9 +++++++ .../tests/snapshots/bolt__parse_270__0.txt | 10 +++++++ .../tests/snapshots/bolt__parse_271__0.txt | 9 +++++++ .../tests/snapshots/bolt__parse_272__0.txt | 7 +++++ 9 files changed, 112 insertions(+) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_266__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_267__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_268__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_269__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_270__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_271__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_272__0.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index c9e70035b..eb52c776d 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -44,6 +44,7 @@ "parse_name_list", "DeferredRootBacktracker", "FunctionConstraint", + "RootScopeHandler", "BinaryParser", "UnaryParser", "UnpackParser", @@ -534,6 +535,7 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): parser = DeferredRootBacktracker(parser, macro_handler=macro_handler) parser = DecoratorResolver(parser) parser = ProcMacroExpansion(parser) + parser = RootScopeHandler(parser) return parser @@ -992,6 +994,7 @@ def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: stream_copy.data["deferred_locals"] = set() stream_copy.data["branch_scope"] = set() stream_copy.data["class_scope"] = None + del stream_copy.data["root_scope"] deferred_locals.clear() @@ -1139,6 +1142,7 @@ def __call__(self, stream: TokenStream) -> Any: return node if node.identifier == "macro:name:subcommand": + self.check_root_scope(stream, node) node = self.create_macro(node, stream.data.get("resource_location")) if not isinstance(node, AstProcMacro): declaration = replace(node, arguments=AstChildren(node.arguments[:-1])) @@ -1153,6 +1157,11 @@ def __call__(self, stream: TokenStream) -> Any: return node + def check_root_scope(self, stream: TokenStream, node: AstCommand): + if not stream.data.get("root_scope"): + message = "Macro definition can only appear directly at scope level." + raise set_location(InvalidSyntax(message), node, node.arguments[0]) + def create_macro( self, command: AstCommand, @@ -1474,11 +1483,18 @@ class ImportStatementHandler: def __call__(self, stream: TokenStream) -> Any: if isinstance(node := self.parser(stream), AstCommand): if node.identifier in ["import:module", "import:module:as:alias"]: + self.check_root_scope(stream, node) return self.handle_import(stream, node) elif node.identifier == "from:module:import:subcommand": + self.check_root_scope(stream, node) return self.handle_from_import(stream, node) return node + def check_root_scope(self, stream: TokenStream, node: AstCommand): + if not stream.data.get("root_scope"): + message = "Import statement can only appear directly at scope level." + raise set_location(InvalidSyntax(message), node) + def handle_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: identifiers = get_stream_identifiers(stream) identifiers_storage = get_stream_identifiers_storage(stream) @@ -1717,6 +1733,17 @@ def __call__(self, stream: TokenStream) -> AstRoot: return node +@dataclass +class RootScopeHandler: + """Handle root scope.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide(root_scope="root_scope" not in stream.data): + return self.parser(stream) + + @dataclass class BinaryParser: """Parser for binary expressions.""" diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index b68357698..da5ace4a9 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -990,3 +990,30 @@ class B: def a(self): say a return A() +### +if 0: + import math +### +def f(): + if 0: + import this +### +for i in range(10): + if i % 2 == 0: + from math import sin +### +if "beans": + macro beans: + pass +### +for bean in "beans": + if bean: + macro jelly bean(stream): + pass +### +class A: + macro foo: + pass +### +class B: + import math diff --git a/packages/bolt/tests/snapshots/bolt__parse_266__0.txt b/packages/bolt/tests/snapshots/bolt__parse_266__0.txt new file mode 100644 index 000000000..c354dd301 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_266__0.txt @@ -0,0 +1,7 @@ +if 0: +#>ERROR Import statement can only appear directly at scope level. +# line 2, column 5 +# 1 | if 0: +# 2 | import math +# : ^^^^^^^^^^^ + import math diff --git a/packages/bolt/tests/snapshots/bolt__parse_267__0.txt b/packages/bolt/tests/snapshots/bolt__parse_267__0.txt new file mode 100644 index 000000000..f19848f23 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_267__0.txt @@ -0,0 +1,8 @@ +def f(): + if 0: +#>ERROR Import statement can only appear directly at scope level. +# line 3, column 9 +# 2 | if 0: +# 3 | import this +# : ^^^^^^^^^^^ + import this diff --git a/packages/bolt/tests/snapshots/bolt__parse_268__0.txt b/packages/bolt/tests/snapshots/bolt__parse_268__0.txt new file mode 100644 index 000000000..7852de040 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_268__0.txt @@ -0,0 +1,8 @@ +for i in range(10): + if i % 2 == 0: +#>ERROR Import statement can only appear directly at scope level. +# line 3, column 9 +# 2 | if i % 2 == 0: +# 3 | from math import sin +# : ^^^^^^^^^^^^^^^^^^^^ + from math import sin diff --git a/packages/bolt/tests/snapshots/bolt__parse_269__0.txt b/packages/bolt/tests/snapshots/bolt__parse_269__0.txt new file mode 100644 index 000000000..332546c55 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_269__0.txt @@ -0,0 +1,9 @@ +if "beans": +#>ERROR Macro definition can only appear directly at scope level. +# line 2, column 5 +# 1 | if "beans": +# 2 | macro beans: +# : ^^^^^^^^^^^ +# 3 | pass + macro beans: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_270__0.txt b/packages/bolt/tests/snapshots/bolt__parse_270__0.txt new file mode 100644 index 000000000..5e836570d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_270__0.txt @@ -0,0 +1,10 @@ +for bean in "beans": + if bean: +#>ERROR Macro definition can only appear directly at scope level. +# line 3, column 9 +# 2 | if bean: +# 3 | macro jelly bean(stream): +# : ^^^^^^^^^^^ +# 4 | pass + macro jelly bean(stream): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_271__0.txt b/packages/bolt/tests/snapshots/bolt__parse_271__0.txt new file mode 100644 index 000000000..c9afbebcf --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_271__0.txt @@ -0,0 +1,9 @@ +class A: +#>ERROR Macro definition can only appear directly at scope level. +# line 2, column 5 +# 1 | class A: +# 2 | macro foo: +# : ^^^^^^^^^ +# 3 | pass + macro foo: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_272__0.txt b/packages/bolt/tests/snapshots/bolt__parse_272__0.txt new file mode 100644 index 000000000..a46dbd8d4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_272__0.txt @@ -0,0 +1,7 @@ +class B: +#>ERROR Import statement can only appear directly at scope level. +# line 2, column 5 +# 1 | class B: +# 2 | import math +# : ^^^^^^^^^^^ + import math From d90f8a3cb0edcdb89a64ad99cb8329381e81cc05 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 21 Jul 2022 22:45:59 +0000 Subject: [PATCH 0959/1554] 0.17.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index fbd4c198b..e78b3f0b4 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.1 (2022-07-21) +### Fix +* Only allow imports and macros directly at scope level ([`2f069bd`](https://github.com/mcbeet/bolt/commit/2f069bd6ae7e689605303fb99fa272bdc4b17e36)) + ## v0.17.0 (2022-07-20) ### Feature * Add bolt classes ([`71c1162`](https://github.com/mcbeet/bolt/commit/71c1162c99c61eb747573a370646f80b787f95f5)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index b4db77a9a..07b7bac5f 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.0" +__version__ = "0.17.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 39cb35bc1..e955055e3 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.0" +version = "0.17.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From d3becb82c3c5668f6a799d481a11be1d44139f62 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 23 Jul 2022 00:19:58 +0200 Subject: [PATCH 0960/1554] fix: properly initialize result --- packages/mecha/mecha/dispatch.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index c9033fefe..5b317aed2 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -360,6 +360,7 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: if to_replace: node = replace(node, **to_replace) + result = node exhausted = False while not exhausted: From 0a1db02a6ca87a43d9be7721fc830b344fce0978 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 22 Jul 2022 22:20:57 +0000 Subject: [PATCH 0961/1554] 0.54.7 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index c5367c936..c12840227 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.7 (2022-07-22) +### Fix +* Properly initialize result ([`9c7ad4c`](https://github.com/mcbeet/mecha/commit/9c7ad4c9b2ae7f98a05fb19d8dfc0ad0f6982ebb)) + ## v0.54.6 (2022-07-20) ### Fix * Missing fstring ([`7ad01d0`](https://github.com/mcbeet/mecha/commit/7ad01d03b901b117a8edf0bcd9a6a87c1d4f7eb6)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 7a21f268b..1aef3247a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.6" +__version__ = "0.54.7" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 599405335..f8089e128 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.6" +version = "0.54.7" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 49f3f35c3d08bc700a2081cd7ce5c951980d17fe Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 24 Jul 2022 00:38:15 +0200 Subject: [PATCH 0962/1554] fix: add missing template_rotation and template_mirror parsers --- packages/mecha/mecha/ast.py | 18 ++ packages/mecha/mecha/parse.py | 6 + .../tests/resources/argument_examples.json | 10 + .../resources/command_examples.mcfunction | 5 + ...mples_minecraft_template_mirror_0_0__0.txt | 12 ++ ...mples_minecraft_template_mirror_0_1__0.txt | 12 ++ ...mples_minecraft_template_mirror_0_2__0.txt | 12 ++ ...les_minecraft_template_rotation_0_0__0.txt | 12 ++ ...les_minecraft_template_rotation_0_1__0.txt | 12 ++ ...les_minecraft_template_rotation_0_2__0.txt | 12 ++ ...les_minecraft_template_rotation_0_3__0.txt | 12 ++ .../snapshots/parse__command_examples__0.txt | 204 +++++++++++++++++- .../snapshots/parse__command_examples__1.txt | 5 + packages/mecha/tests/test_spec.py | 23 +- 14 files changed, 352 insertions(+), 3 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_3__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 448c5d654..33a1678d4 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -26,6 +26,8 @@ "AstSortOrder", "AstGamemode", "AstEntityAnchor", + "AstTemplateRotation", + "AstTemplateMirror", "AstVector2", "AstVector3", "AstJson", @@ -512,6 +514,22 @@ class AstEntityAnchor(AstOption): options = {"eyes", "feet"} +@dataclass(frozen=True) +class AstTemplateRotation(AstOption): + """Ast template rotation node.""" + + parser = "template_rotation" + options = {"180", "clockwise_90", "counterclockwise_90", "none"} + + +@dataclass(frozen=True) +class AstTemplateMirror(AstOption): + """Ast template mirror node.""" + + parser = "template_mirror" + options = {"front_back", "left_right", "none"} + + @dataclass(frozen=True) class AstJson(AstNode): """Base ast node for json.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 3ce861973..0c9bad718 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -151,6 +151,8 @@ AstString, AstSwizzle, AstTeam, + AstTemplateMirror, + AstTemplateRotation, AstTime, AstUUID, AstVector2, @@ -224,6 +226,8 @@ def get_default_parsers() -> Dict[str, Parser]: "sort_order": BasicLiteralParser(AstSortOrder), "gamemode": BasicLiteralParser(AstGamemode), "entity_anchor": BasicLiteralParser(AstEntityAnchor), + "template_rotation": BasicLiteralParser(AstTemplateRotation), + "template_mirror": BasicLiteralParser(AstTemplateMirror), "block_predicate": BlockParser( resource_location_parser=delegate("resource_location_or_tag"), block_states_parser=AdjacentConstraint( @@ -414,6 +418,8 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:entity": delegate("entity"), "command:argument:minecraft:entity_anchor": delegate("entity_anchor"), "command:argument:minecraft:entity_summon": delegate("resource_location"), + "command:argument:minecraft:template_rotation": delegate("template_rotation"), + "command:argument:minecraft:template_mirror": delegate("template_mirror"), "command:argument:minecraft:float_range": delegate("range"), "command:argument:minecraft:function": delegate("resource_location_or_tag"), "command:argument:minecraft:game_profile": EntityParser( diff --git a/packages/mecha/tests/resources/argument_examples.json b/packages/mecha/tests/resources/argument_examples.json index 2cfd7ada7..9bc9a12b9 100644 --- a/packages/mecha/tests/resources/argument_examples.json +++ b/packages/mecha/tests/resources/argument_examples.json @@ -228,6 +228,16 @@ "examples": ["#minecraft:pig", "#cow"] } ], + "minecraft:template_rotation": [ + { + "examples": ["180", "clockwise_90", "counterclockwise_90", "none"] + } + ], + "minecraft:template_mirror": [ + { + "examples": ["front_back", "left_right", "none"] + } + ], "minecraft:float_range": [ { "examples": ["0..5.2", "0", "-5.4", "-100.76..", "..100"] diff --git a/packages/mecha/tests/resources/command_examples.mcfunction b/packages/mecha/tests/resources/command_examples.mcfunction index 3893612bc..152fef44b 100644 --- a/packages/mecha/tests/resources/command_examples.mcfunction +++ b/packages/mecha/tests/resources/command_examples.mcfunction @@ -149,3 +149,8 @@ scoreboard players set ✔ foo 42 execute at @e[type=armor_stand,name="ctf",tag=!FlagBearer] run particle block_marker barrier ~ ~.8 ~ 0 0 0 0 1 force execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 execute if entity @s[distance=..0.00000001] run function demo:foo +place template minecraft:fossil/spine_1 ~ ~ ~ +place template minecraft:fossil/spine_1 ~ ~ ~ 180 +place template minecraft:fossil/spine_1 ~ ~ ~ clockwise_90 left_right +place template minecraft:fossil/spine_1 ~ ~ ~ none front_back 0.5 +place template minecraft:fossil/spine_1 ~ ~ ~ counterclockwise_90 none 0.6 42 diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_0__0.txt new file mode 100644 index 000000000..fad41afa4 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_0__0.txt @@ -0,0 +1,12 @@ +minecraft:template_mirror 0 0 +--- +{} +--- +front_back +--- +front_back +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'front_back' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_1__0.txt new file mode 100644 index 000000000..99257f3b7 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_1__0.txt @@ -0,0 +1,12 @@ +minecraft:template_mirror 0 1 +--- +{} +--- +left_right +--- +left_right +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'left_right' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_2__0.txt new file mode 100644 index 000000000..fcf8a13e6 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_mirror_0_2__0.txt @@ -0,0 +1,12 @@ +minecraft:template_mirror 0 2 +--- +{} +--- +none +--- +none +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'none' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_0__0.txt new file mode 100644 index 000000000..0a8a510de --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_0__0.txt @@ -0,0 +1,12 @@ +minecraft:template_rotation 0 0 +--- +{} +--- +180 +--- +180 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: '180' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_1__0.txt new file mode 100644 index 000000000..49d15ae5a --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_1__0.txt @@ -0,0 +1,12 @@ +minecraft:template_rotation 0 1 +--- +{} +--- +clockwise_90 +--- +clockwise_90 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'clockwise_90' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_2__0.txt new file mode 100644 index 000000000..f718afb41 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_2__0.txt @@ -0,0 +1,12 @@ +minecraft:template_rotation 0 2 +--- +{} +--- +counterclockwise_90 +--- +counterclockwise_90 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'counterclockwise_90' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_3__0.txt new file mode 100644 index 000000000..f2d392a80 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_template_rotation_0_3__0.txt @@ -0,0 +1,12 @@ +minecraft:template_rotation 0 3 +--- +{} +--- +none +--- +none +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + value: 'none' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index a3a20985a..a8d7feb79 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6359, lineno=152, colno=1) + end_location: SourceLocation(pos=6669, lineno=157, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -5598,4 +5598,204 @@ end_location: SourceLocation(pos=6358, lineno=151, colno=66) is_tag: False namespace: 'demo' - path: 'foo' \ No newline at end of file + path: 'foo' + + location: SourceLocation(pos=6359, lineno=152, colno=1) + end_location: SourceLocation(pos=6404, lineno=152, colno=46) + identifier: 'place:template:template:pos' + arguments: + + location: SourceLocation(pos=6374, lineno=152, colno=16) + end_location: SourceLocation(pos=6398, lineno=152, colno=40) + is_tag: False + namespace: 'minecraft' + path: 'fossil/spine_1' + + location: SourceLocation(pos=6399, lineno=152, colno=41) + end_location: SourceLocation(pos=6404, lineno=152, colno=46) + x: + + location: SourceLocation(pos=6399, lineno=152, colno=41) + end_location: SourceLocation(pos=6400, lineno=152, colno=42) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6401, lineno=152, colno=43) + end_location: SourceLocation(pos=6402, lineno=152, colno=44) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6403, lineno=152, colno=45) + end_location: SourceLocation(pos=6404, lineno=152, colno=46) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6405, lineno=153, colno=1) + end_location: SourceLocation(pos=6454, lineno=153, colno=50) + identifier: 'place:template:template:pos:rotation' + arguments: + + location: SourceLocation(pos=6420, lineno=153, colno=16) + end_location: SourceLocation(pos=6444, lineno=153, colno=40) + is_tag: False + namespace: 'minecraft' + path: 'fossil/spine_1' + + location: SourceLocation(pos=6445, lineno=153, colno=41) + end_location: SourceLocation(pos=6450, lineno=153, colno=46) + x: + + location: SourceLocation(pos=6445, lineno=153, colno=41) + end_location: SourceLocation(pos=6446, lineno=153, colno=42) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6447, lineno=153, colno=43) + end_location: SourceLocation(pos=6448, lineno=153, colno=44) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6449, lineno=153, colno=45) + end_location: SourceLocation(pos=6450, lineno=153, colno=46) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6451, lineno=153, colno=47) + end_location: SourceLocation(pos=6454, lineno=153, colno=50) + value: '180' + + location: SourceLocation(pos=6455, lineno=154, colno=1) + end_location: SourceLocation(pos=6524, lineno=154, colno=70) + identifier: 'place:template:template:pos:rotation:mirror' + arguments: + + location: SourceLocation(pos=6470, lineno=154, colno=16) + end_location: SourceLocation(pos=6494, lineno=154, colno=40) + is_tag: False + namespace: 'minecraft' + path: 'fossil/spine_1' + + location: SourceLocation(pos=6495, lineno=154, colno=41) + end_location: SourceLocation(pos=6500, lineno=154, colno=46) + x: + + location: SourceLocation(pos=6495, lineno=154, colno=41) + end_location: SourceLocation(pos=6496, lineno=154, colno=42) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6497, lineno=154, colno=43) + end_location: SourceLocation(pos=6498, lineno=154, colno=44) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6499, lineno=154, colno=45) + end_location: SourceLocation(pos=6500, lineno=154, colno=46) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6501, lineno=154, colno=47) + end_location: SourceLocation(pos=6513, lineno=154, colno=59) + value: 'clockwise_90' + + location: SourceLocation(pos=6514, lineno=154, colno=60) + end_location: SourceLocation(pos=6524, lineno=154, colno=70) + value: 'left_right' + + location: SourceLocation(pos=6525, lineno=155, colno=1) + end_location: SourceLocation(pos=6590, lineno=155, colno=66) + identifier: 'place:template:template:pos:rotation:mirror:integrity' + arguments: + + location: SourceLocation(pos=6540, lineno=155, colno=16) + end_location: SourceLocation(pos=6564, lineno=155, colno=40) + is_tag: False + namespace: 'minecraft' + path: 'fossil/spine_1' + + location: SourceLocation(pos=6565, lineno=155, colno=41) + end_location: SourceLocation(pos=6570, lineno=155, colno=46) + x: + + location: SourceLocation(pos=6565, lineno=155, colno=41) + end_location: SourceLocation(pos=6566, lineno=155, colno=42) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6567, lineno=155, colno=43) + end_location: SourceLocation(pos=6568, lineno=155, colno=44) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6569, lineno=155, colno=45) + end_location: SourceLocation(pos=6570, lineno=155, colno=46) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6571, lineno=155, colno=47) + end_location: SourceLocation(pos=6575, lineno=155, colno=51) + value: 'none' + + location: SourceLocation(pos=6576, lineno=155, colno=52) + end_location: SourceLocation(pos=6586, lineno=155, colno=62) + value: 'front_back' + + location: SourceLocation(pos=6587, lineno=155, colno=63) + end_location: SourceLocation(pos=6590, lineno=155, colno=66) + value: 0.5 + + location: SourceLocation(pos=6591, lineno=156, colno=1) + end_location: SourceLocation(pos=6668, lineno=156, colno=78) + identifier: 'place:template:template:pos:rotation:mirror:integrity:seed' + arguments: + + location: SourceLocation(pos=6606, lineno=156, colno=16) + end_location: SourceLocation(pos=6630, lineno=156, colno=40) + is_tag: False + namespace: 'minecraft' + path: 'fossil/spine_1' + + location: SourceLocation(pos=6631, lineno=156, colno=41) + end_location: SourceLocation(pos=6636, lineno=156, colno=46) + x: + + location: SourceLocation(pos=6631, lineno=156, colno=41) + end_location: SourceLocation(pos=6632, lineno=156, colno=42) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6633, lineno=156, colno=43) + end_location: SourceLocation(pos=6634, lineno=156, colno=44) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6635, lineno=156, colno=45) + end_location: SourceLocation(pos=6636, lineno=156, colno=46) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6637, lineno=156, colno=47) + end_location: SourceLocation(pos=6656, lineno=156, colno=66) + value: 'counterclockwise_90' + + location: SourceLocation(pos=6657, lineno=156, colno=67) + end_location: SourceLocation(pos=6661, lineno=156, colno=71) + value: 'none' + + location: SourceLocation(pos=6662, lineno=156, colno=72) + end_location: SourceLocation(pos=6665, lineno=156, colno=75) + value: 0.6 + + location: SourceLocation(pos=6666, lineno=156, colno=76) + end_location: SourceLocation(pos=6668, lineno=156, colno=78) + value: 42 \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index 25fb84518..f6ceed666 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -121,3 +121,8 @@ scoreboard players set ✔ foo 42 execute at @e[type=armor_stand, name=ctf, tag=!FlagBearer] run particle block_marker barrier ~ ~0.8 ~ 0 0 0 0 1 force execute store result score @s smithed.data run clear @s #smithed:crafter/all 0 execute if entity @s[distance=..0.00000001] run function demo:foo +place template minecraft:fossil/spine_1 ~ ~ ~ +place template minecraft:fossil/spine_1 ~ ~ ~ 180 +place template minecraft:fossil/spine_1 ~ ~ ~ clockwise_90 left_right +place template minecraft:fossil/spine_1 ~ ~ ~ none front_back 0.5 +place template minecraft:fossil/spine_1 ~ ~ ~ counterclockwise_90 none 0.6 42 diff --git a/packages/mecha/tests/test_spec.py b/packages/mecha/tests/test_spec.py index 6ce292060..fb4b3d048 100644 --- a/packages/mecha/tests/test_spec.py +++ b/packages/mecha/tests/test_spec.py @@ -1,7 +1,28 @@ from pytest_insta import SnapshotFixture -from mecha import Mecha +from mecha import CommandArgument, Mecha def test_prototypes(snapshot: SnapshotFixture, mc: Mecha): assert snapshot("json") == list(mc.spec.prototypes) + + +def test_parsers(snapshot: SnapshotFixture, mc: Mecha): + all_defined_parsers = { + parser[17:] + for parser in mc.spec.parsers + if parser.startswith("command:argument:") + } + + all_used_parser = { + tree.parser + for prototype in mc.spec.prototypes.values() + for argument in prototype.signature + if isinstance(argument, CommandArgument) + if (tree := mc.spec.tree.get(argument.scope)) + if tree.parser + } + + undefined_parsers = all_used_parser - all_defined_parsers + + assert not undefined_parsers From 5c25289893fa11c37d60bdf0cc29300e988ad3da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 24 Jul 2022 00:40:45 +0200 Subject: [PATCH 0963/1554] fix: resolve source paths provided for validation according to the context directory --- packages/mecha/mecha/cli.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/cli.py b/packages/mecha/mecha/cli.py index 32383c49b..199587c91 100644 --- a/packages/mecha/mecha/cli.py +++ b/packages/mecha/mecha/cli.py @@ -8,7 +8,6 @@ import logging import os import zipfile -from pathlib import Path from typing import Optional, Tuple import click @@ -23,14 +22,17 @@ def validate(ctx: Context): """Plugin for running mecha on the provided sources.""" mc = ctx.inject(Mecha) - source = ctx.meta["source"] - for path in map(Path, source): + for path in ctx.meta["source"]: + path = ctx.directory / path + if zipfile.is_zipfile(path) or (path / "data").is_dir(): mc.compile(DataPack(path=path), report=mc.diagnostics) + elif path.is_dir(): for filename in path.glob("**/*.mcfunction"): mc.compile(Function(source_path=filename), report=mc.diagnostics) + elif path.is_file(): mc.compile(Function(source_path=path), report=mc.diagnostics) From 150f552feb4450c64d5891f93382724b509d00a4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 23 Jul 2022 22:41:44 +0000 Subject: [PATCH 0964/1554] 0.54.8 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index c12840227..d8aa9f4ff 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.54.8 (2022-07-23) +### Fix +* Resolve source paths provided for validation according to the context directory ([`72e638f`](https://github.com/mcbeet/mecha/commit/72e638fe75392b70d06661c67c6405b1ac99281c)) +* Add missing template_rotation and template_mirror parsers ([`718c907`](https://github.com/mcbeet/mecha/commit/718c907e263e3b516fe1881fd3f4775485d3d1e9)) + ## v0.54.7 (2022-07-22) ### Fix * Properly initialize result ([`9c7ad4c`](https://github.com/mcbeet/mecha/commit/9c7ad4c9b2ae7f98a05fb19d8dfc0ad0f6982ebb)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 1aef3247a..43547f9ba 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.7" +__version__ = "0.54.8" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f8089e128..fa029e418 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.7" +version = "0.54.8" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From a26adf679f4f62ac189ad270b8cdf6f7f18ab4ed Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Jul 2022 20:09:24 +0200 Subject: [PATCH 0965/1554] fix: expose game_profile parser --- packages/mecha/mecha/parse.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 0c9bad718..2db63f98c 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -290,6 +290,9 @@ def get_default_parsers() -> Dict[str, Parser]: delegate("wildcard"), ] ), + "game_profile": EntityParser( + selector_parser=SelectorPlayerConstraint(delegate("selector")), + ), ################################################################################ # Particle ################################################################################ @@ -422,9 +425,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:template_mirror": delegate("template_mirror"), "command:argument:minecraft:float_range": delegate("range"), "command:argument:minecraft:function": delegate("resource_location_or_tag"), - "command:argument:minecraft:game_profile": EntityParser( - selector_parser=SelectorPlayerConstraint(delegate("selector")), - ), + "command:argument:minecraft:game_profile": delegate("game_profile"), "command:argument:minecraft:int_range": delegate("integer_range"), "command:argument:minecraft:item_enchantment": delegate("word"), "command:argument:minecraft:item_predicate": MultilineParser( From 654735aae0033fc74654002a7ea2c4fad4508d88 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 25 Jul 2022 18:11:08 +0000 Subject: [PATCH 0966/1554] 0.54.9 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index d8aa9f4ff..f8e34e5dd 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.9 (2022-07-25) +### Fix +* Expose game_profile parser ([`2d0d6d6`](https://github.com/mcbeet/mecha/commit/2d0d6d6825cf8a649d5f054de7a3d419548505c9)) + ## v0.54.8 (2022-07-23) ### Fix * Resolve source paths provided for validation according to the context directory ([`72e638f`](https://github.com/mcbeet/mecha/commit/72e638fe75392b70d06661c67c6405b1ac99281c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 43547f9ba..f567d9357 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.8" +__version__ = "0.54.9" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index fa029e418..ef760fb7e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.8" +version = "0.54.9" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 46f7ea2df392eb500fe20f835ebaf01f13af3260 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Jul 2022 20:17:05 +0200 Subject: [PATCH 0967/1554] chore: update mecha --- packages/bolt/poetry.lock | 503 +++++------------------------------ packages/bolt/pyproject.toml | 2 +- 2 files changed, 62 insertions(+), 443 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 60d4b1e80..4498bea0d 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -277,8 +277,8 @@ optional = false python-versions = ">=3.7" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +trio = ["async-generator", "trio"] +test = ["async-timeout", "trio", "testpath", "pytest-asyncio (>=0.17)", "pytest-trio", "pytest"] [[package]] name = "jinja2" @@ -337,14 +337,14 @@ python-versions = ">=3.7" mdurl = ">=0.1,<1.0" [package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -plugins = ["mdit-py-plugins"] +testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] +rtd = ["sphinx-book-theme", "sphinx-design", "sphinx-copybutton", "sphinx", "pyyaml", "myst-parser", "attrs"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +plugins = ["mdit-py-plugins"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +compare = ["panflute (>=2.1.3,<2.2.0)", "mistune (>=2.0.2,<2.1.0)", "mistletoe (>=0.8.1,<0.9.0)", "markdown (>=3.3.6,<3.4.0)", "commonmark (>=0.9.1,<0.10.0)"] +code_style = ["pre-commit (==2.6)"] +benchmarking = ["pytest-benchmark (>=3.2,<4.0)", "pytest", "psutil"] [[package]] name = "markupsafe" @@ -364,7 +364,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.54.5" +version = "0.54.9" description = "A powerful Minecraft command library" category = "main" optional = false @@ -452,8 +452,8 @@ optional = false python-versions = ">=3.6" [package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["pytest-benchmark", "pytest"] +dev = ["tox", "pre-commit"] [[package]] name = "py" @@ -825,456 +825,75 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "207701a862ad8a8416404f743fe1acdf9c94516498da161e1ef9b712136c0688" +content-hash = "bdc97b6dce2258692aad002202dc5b45dd8d71b3acc42a48693342964b2e0c18" [metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] +atomicwrites = [] +attrs = [] beet = [] -black = [ - {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, - {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, - {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, - {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, - {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, - {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, - {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, - {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, - {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, - {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, - {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, - {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, - {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, - {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, - {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, - {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, - {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, - {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, - {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, -] +black = [] bleach = [] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, -] +certifi = [] +cffi = [] charset-normalizer = [] click = [] -click-help-colors = [ - {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, - {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, -] +click-help-colors = [] click-log = [] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -cryptography = [ - {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:74b55f67f4cf026cb84da7a1b04fc2a1d260193d4ad0ea5e9897c8b74c1e76ac"}, - {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0db5cf21bd7d092baacb576482b0245102cea2d3cf09f09271ce9f69624ecb6f"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:faf0f5456c059c7b1c29441bdd5e988f0ba75bdc3eea776520d8dcb1e30e1b5c"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:06bfafa6e53ccbfb7a94be4687b211a025ce0625e3f3c60bb15cd048a18f3ed8"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf585476fcbcd37bed08072e8e2db3954ce1bfc68087a2dc9c19cfe0b90979ca"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4daf890e674d191757d8d7d60dc3a29c58c72c7a76a05f1c0a326013f47e8b"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:ae1cd29fbe6b716855454e44f4bf743465152e15d2d317303fe3b58ee9e5af7a"}, - {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:451aaff8b8adf2dd0597cbb1fdcfc8a7d580f33f843b7cce75307a7f20112dd8"}, - {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1858eff6246bb8bbc080eee78f3dd1528739e3f416cba5f9914e8631b8df9871"}, - {file = "cryptography-37.0.1-cp36-abi3-win32.whl", hash = "sha256:e69a0e36e62279120e648e787b76d79b41e0f9e86c1c636a4f38d415595c722e"}, - {file = "cryptography-37.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a18ff4bfa9d64914a84d7b06c46eb86e0cc03113470b3c111255aceb6dcaf81d"}, - {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce90609e01e1b192fae9e13665058ab46b2ea53a3c05a3ea74a3eb8c3af8857"}, - {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c4a58eeafbd7409054be41a377e726a7904a17c26f45abf18125d21b1215b08b"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:618391152147a1221c87b1b0b7f792cafcfd4b5a685c5c72eeea2ddd29aeceff"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ceae26f876aabe193b13a0c36d1bb8e3e7e608d17351861b437bd882f617e9f"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:930b829e8a2abaf43a19f38277ae3c5e1ffcf547b936a927d2587769ae52c296"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58021d6e9b1d88b1105269d0da5e60e778b37dfc0e824efc71343dd003726831"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b1ee5c82cf03b30f6ae4e32d2bcb1e167ef74d6071cbb77c2af30f101d0b360b"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f095988548ec5095e3750cdb30e6962273d239b1998ba1aac66c0d5bee7111c1"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:125702572be12bcd318e3a14e9e70acd4be69a43664a75f0397e8650fe3c6cc3"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:315af6268de72bcfa0bb3401350ce7d921f216e6b60de12a363dad128d9d459f"}, - {file = "cryptography-37.0.1.tar.gz", hash = "sha256:d610d0ee14dd9109006215c7c0de15eee91230b70a9bce2263461cf7c3720b83"}, -] +colorama = [] +cryptography = [] docutils = [] -dotty-dict = [ - {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] +dotty-dict = [] +gitdb = [] gitpython = [] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -invoke = [ - {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, - {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -keyring = [ - {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, - {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, -] -lectern = [ - {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, - {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mdurl = [ - {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, - {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, -] +idna = [] +importlib-metadata = [] +iniconfig = [] +invoke = [] +isort = [] +jeepney = [] +jinja2 = [] +keyring = [] +lectern = [] +markdown-it-py = [] +markupsafe = [] +mdurl = [] mecha = [] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nbtlib = [ - {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, - {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, -] -numpy = [ - {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, - {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, - {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, - {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, - {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, - {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, - {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, - {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, - {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, - {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, -] +mypy-extensions = [] +nbtlib = [] +numpy = [] packaging = [] pathspec = [] -pkginfo = [ - {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, - {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, -] +pkginfo = [] platformdirs = [] pluggy = [] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] +py = [] pycparser = [] pydantic = [] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] -pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, -] -pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, -] -pytest-insta = [ - {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, - {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, -] -python-gitlab = [ - {file = "python-gitlab-3.4.0.tar.gz", hash = "sha256:6180b81ee2f265ad8d8412956a1740b4d3ceca7b28ae2f707dfe62375fed0082"}, - {file = "python_gitlab-3.4.0-py3-none-any.whl", hash = "sha256:251b63f0589d51f854516948c84e9eb8df26e1e9dea595cf86b43f17c43007dd"}, -] -python-semantic-release = [ - {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, - {file = "python_semantic_release-7.28.1-py3-none-any.whl", hash = "sha256:319c3e811d6e10bc3f0e967419eae0e5e9ba1e6745aa2fd94dd24e3995541ca2"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] +pygments = [] +pyparsing = [] +pytest = [] +pytest-insta = [] +python-gitlab = [] +python-semantic-release = [] +pywin32-ctypes = [] +pyyaml = [] readme-renderer = [] requests = [] requests-toolbelt = [] -rfc3986 = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, - {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, -] -semver = [ - {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, - {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -tokenstream = [ - {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, - {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] +rfc3986 = [] +secretstorage = [] +semver = [] +setuptools-scm = [] +six = [] +smmap = [] +tokenstream = [] +toml = [] tomli = [] -tomlkit = [ - {file = "tomlkit-0.10.2-py3-none-any.whl", hash = "sha256:905cf92c2111ef80d355708f47ac24ad1b6fc2adc5107455940088c9bbecaedb"}, - {file = "tomlkit-0.10.2.tar.gz", hash = "sha256:30d54c0b914e595f3d10a87888599eab5321a2a69abc773bbefff51599b72db6"}, -] -tqdm = [ - {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, - {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, -] +tomlkit = [] +tqdm = [] twine = [] -typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, -] +typing-extensions = [] urllib3 = [] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] +webencodings = [] +wrapt = [] zipp = [] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index e955055e3..1d58f14a2 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.68.3" -mecha = ">=0.54.5" +mecha = ">=0.54.9" [tool.poetry.dev-dependencies] pytest = "^7.1.2" From b6ba7e4e1184b16ee14a460a23626f554ed5cbfb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Jul 2022 20:27:15 +0200 Subject: [PATCH 0968/1554] fix: enable interpolation for game_profile argument --- packages/bolt/bolt/parse.py | 3 +++ .../bolt_basic/src/data/demo/functions/foo.mcfunction | 10 ++++++++++ .../snapshots/examples__build_bolt_basic__0.pack.md | 2 ++ 3 files changed, 15 insertions(+) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index eb52c776d..553eac81a 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -432,6 +432,9 @@ def get_bolt_parsers( "score_holder": CommentDisambiguation( InterpolationParser("entity", parsers["score_holder"]) ), + "game_profile": CommentDisambiguation( + InterpolationParser("entity", parsers["game_profile"]) + ), } diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 6de38715d..54f61cd98 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -652,3 +652,13 @@ with runtime.scope() as commands: say repr(commands[0]) say commands[0] + +from uuid import UUID +execute as UUID(fields=(1, 2, 3, 4, 5, 6)) function test:test + +from random import Random + +rd = Random() +rd.seed(42) +random_id = UUID(int=rd.getrandbits(128)) +whitelist add random_id diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 8e7585c38..2357b90cc 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -268,6 +268,8 @@ say dummy say dummy say AstCommand(identifier='tellraw:targets:message', arguments=AstChildren((AstSelector(variable='p', arguments=AstChildren(())), AstJsonValue(value='hello')))) say tellraw @p "hello" +execute as 00000001-0002-0003-0405-000000000006 run function test:test +whitelist add bdd640fb-0667-1ad1-1c80-317fa3b1799d ``` `@function demo:import_a` From da2c302ada5643d68cfdfaba0366685bfe96066b Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 25 Jul 2022 18:28:51 +0000 Subject: [PATCH 0969/1554] 0.17.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index e78b3f0b4..7010dcb72 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.2 (2022-07-25) +### Fix +* Enable interpolation for game_profile argument ([`e844f49`](https://github.com/mcbeet/bolt/commit/e844f49906fa693edf9fe509427211b2b01ad39d)) + ## v0.17.1 (2022-07-21) ### Fix * Only allow imports and macros directly at scope level ([`2f069bd`](https://github.com/mcbeet/bolt/commit/2f069bd6ae7e689605303fb99fa272bdc4b17e36)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 07b7bac5f..5ed3d10ae 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.1" +__version__ = "0.17.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 1d58f14a2..f7120ba21 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.1" +version = "0.17.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From c441fce8897facda18e3ef24b70fd1a519fde592 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 25 Jul 2022 20:52:27 +0200 Subject: [PATCH 0970/1554] fix: enable interpolation for uuid --- packages/bolt/bolt/helpers.py | 1 + packages/bolt/bolt/parse.py | 1 + .../examples/bolt_basic/src/data/demo/functions/foo.mcfunction | 3 +++ .../bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md | 1 + 4 files changed, 6 insertions(+) diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 73a6b4a51..fb1b9a786 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -79,6 +79,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "interpolate_range": converter(AstRange.from_value), "interpolate_resource_location": converter(AstResourceLocation.from_value), "interpolate_item_slot": converter(AstItemSlot.from_value), + "interpolate_uuid": converter(AstUUID.from_value), "interpolate_objective": converter(AstObjective.from_value), "interpolate_objective_criteria": converter(AstObjectiveCriteria.from_value), "interpolate_scoreboard_slot": converter(AstScoreboardSlot.from_value), diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 553eac81a..4e3de7106 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -406,6 +406,7 @@ def get_bolt_parsers( "item_slot": InterpolationParser( "item_slot", parsers["item_slot"], fallback=True ), + "uuid": InterpolationParser("uuid", parsers["uuid"]), "objective": InterpolationParser("objective", parsers["objective"]), "objective_criteria": InterpolationParser( "objective_criteria", parsers["objective_criteria"] diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 54f61cd98..6bdf2f634 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -662,3 +662,6 @@ rd = Random() rd.seed(42) random_id = UUID(int=rd.getrandbits(128)) whitelist add random_id + +other_id = UUID(int=rd.getrandbits(128)) +attribute @s minecraft:generic.attack_speed modifier add other_id "double" 0.5 multiply diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index 2357b90cc..d08b67190 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -270,6 +270,7 @@ say AstCommand(identifier='tellraw:targets:message', arguments=AstChildren((AstS say tellraw @p "hello" execute as 00000001-0002-0003-0405-000000000006 run function test:test whitelist add bdd640fb-0667-1ad1-1c80-317fa3b1799d +attribute @s minecraft:generic.attack_speed modifier add 23b8c1e9-3924-56de-3eb1-3b9046685257 double 0.5 multiply ``` `@function demo:import_a` From 3289d9b24e1b4bda2ff5e19627746a4ef30f2cb2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 25 Jul 2022 18:53:15 +0000 Subject: [PATCH 0971/1554] 0.17.3 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 7010dcb72..62e650f63 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.3 (2022-07-25) +### Fix +* Enable interpolation for uuid ([`39cc462`](https://github.com/mcbeet/bolt/commit/39cc4624f555874808c629000c260c2feefbb5b4)) + ## v0.17.2 (2022-07-25) ### Fix * Enable interpolation for game_profile argument ([`e844f49`](https://github.com/mcbeet/bolt/commit/e844f49906fa693edf9fe509427211b2b01ad39d)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 5ed3d10ae..14531f8cb 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.2" +__version__ = "0.17.3" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f7120ba21..68ffd0c80 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.2" +version = "0.17.3" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 67d562d941a7a4553d0cc3aaa3773c226b01bd52 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 6 Aug 2022 03:23:30 +0200 Subject: [PATCH 0972/1554] fix: truncate primary expression for interpolation --- packages/bolt/bolt/parse.py | 10 +- .../tests/resources/bolt_examples.mcfunction | 2 + .../tests/snapshots/bolt__parse_273__0.txt | 135 ++++++++++++++++++ .../tests/snapshots/bolt__parse_273__1.txt | 111 ++++++++++++++ 4 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_273__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_273__1.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 4e3de7106..8111afdc6 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -256,7 +256,7 @@ def get_bolt_parsers( "bolt:class_bases": parse_class_bases, "bolt:class_root": parse_class_root, "bolt:del_target": parse_del_target, - "bolt:interpolation": PrimaryParser(delegate("bolt:identifier")), + "bolt:interpolation": PrimaryParser(delegate("bolt:identifier"), truncate=True), "bolt:identifier": parse_identifier, "bolt:with_expression": TrailingCommaParser(delegate("bolt:expression")), "bolt:with_target": TrailingCommaParser( @@ -1898,6 +1898,8 @@ class PrimaryParser: """Parser for primary expressions.""" parser: Parser + truncate: bool = False + quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) def __call__(self, stream: TokenStream) -> Any: @@ -1922,6 +1924,9 @@ def __call__(self, stream: TokenStream) -> Any: node = AstTuple(items=AstChildren(items)) node = set_location(node, token, stream.current) + if self.truncate: + return node + elif token and token.match("format_string"): quote = token.value[-1] @@ -1972,6 +1977,9 @@ def __call__(self, stream: TokenStream) -> Any: node = AstFormatString(fmt=fmt, values=AstChildren(values)) node = set_location(node, token, end_quote) + if self.truncate: + return node + else: node = self.parser(stream) diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index da5ace4a9..af872c1c7 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1017,3 +1017,5 @@ class A: ### class B: import math +### +particle minecraft:dust 0.00000 (117/255) (164/255) 0.5 ~ ~ ~ 0 0 0 0 1 force @s diff --git a/packages/bolt/tests/snapshots/bolt__parse_273__0.txt b/packages/bolt/tests/snapshots/bolt__parse_273__0.txt new file mode 100644 index 000000000..7d1aa2cd1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_273__0.txt @@ -0,0 +1,135 @@ +particle minecraft:dust 0.00000 (117/255) (164/255) 0.5 ~ ~ ~ 0 0 0 0 1 force @s +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=81, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + identifier: 'particle:name:pos:delta:speed:count:force:viewers' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + name: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + is_tag: False + namespace: 'minecraft' + path: 'dust' + parameters: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + red: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=31, lineno=1, colno=32) + value: 0.0 + green: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + prefix: None + unpack: None + converter: 'numeric' + value: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + operator: '/' + left: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 117 + right: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + value: 255 + blue: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + prefix: None + unpack: None + converter: 'numeric' + value: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + operator: '/' + left: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=46, lineno=1, colno=47) + value: 164 + right: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + value: 255 + size: + + location: SourceLocation(pos=52, lineno=1, colno=53) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + value: 0.5 + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + x: + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=57, lineno=1, colno=58) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=58, lineno=1, colno=59) + end_location: SourceLocation(pos=59, lineno=1, colno=60) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=60, lineno=1, colno=61) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + type: 'relative' + value: 0 + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + x: + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=63, lineno=1, colno=64) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=64, lineno=1, colno=65) + end_location: SourceLocation(pos=65, lineno=1, colno=66) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=66, lineno=1, colno=67) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=68, lineno=1, colno=69) + end_location: SourceLocation(pos=69, lineno=1, colno=70) + value: 0 + + location: SourceLocation(pos=70, lineno=1, colno=71) + end_location: SourceLocation(pos=71, lineno=1, colno=72) + value: 1 + + location: SourceLocation(pos=78, lineno=1, colno=79) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + variable: 's' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_273__1.txt b/packages/bolt/tests/snapshots/bolt__parse_273__1.txt new file mode 100644 index 000000000..c422d9ba5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_273__1.txt @@ -0,0 +1,111 @@ +_bolt_lineno = [1], [1] +_bolt_helper_interpolate_numeric = _bolt_runtime.helpers['interpolate_numeric'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 117 + _bolt_var1 = 255 + _bolt_var0 = _bolt_var0 / _bolt_var1 + _bolt_var0 = _bolt_helper_interpolate_numeric(_bolt_var0, _bolt_refs[0]) + _bolt_var2 = 164 + _bolt_var3 = 255 + _bolt_var2 = _bolt_var2 / _bolt_var3 + _bolt_var2 = _bolt_helper_interpolate_numeric(_bolt_var2, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], parameters=_bolt_helper_replace(_bolt_refs[2], green=_bolt_var0, blue=_bolt_var2)), _bolt_refs[4], _bolt_refs[5], _bolt_refs[6], _bolt_refs[7], _bolt_refs[8]]))) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[10], commands=_bolt_helper_children(_bolt_var4)) +--- +output = _bolt_var5 +--- +_bolt_refs[0] + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + prefix: None + unpack: None + converter: 'numeric' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + prefix: None + unpack: None + converter: 'numeric' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + red: + + green: + + blue: + + size: + +_bolt_refs[3] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + name: + + parameters: + +_bolt_refs[4] + + location: SourceLocation(pos=56, lineno=1, colno=57) + end_location: SourceLocation(pos=61, lineno=1, colno=62) + x: + + y: + + z: + +_bolt_refs[5] + + location: SourceLocation(pos=62, lineno=1, colno=63) + end_location: SourceLocation(pos=67, lineno=1, colno=68) + x: + + y: + + z: + +_bolt_refs[6] + + location: SourceLocation(pos=68, lineno=1, colno=69) + end_location: SourceLocation(pos=69, lineno=1, colno=70) + value: 0 +_bolt_refs[7] + + location: SourceLocation(pos=70, lineno=1, colno=71) + end_location: SourceLocation(pos=71, lineno=1, colno=72) + value: 1 +_bolt_refs[8] + + location: SourceLocation(pos=78, lineno=1, colno=79) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + variable: 's' + arguments: + +_bolt_refs[9] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + identifier: 'particle:name:pos:delta:speed:count:force:viewers' + arguments: + + + + + + +_bolt_refs[10] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=81, lineno=2, colno=1) + commands: + From 56ad7ab9cc78835580f58993aa25e75c15f4d1ce Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 6 Aug 2022 01:24:16 +0000 Subject: [PATCH 0973/1554] 0.17.4 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 62e650f63..668ba17a3 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.4 (2022-08-06) +### Fix +* Truncate primary expression for interpolation ([`014802f`](https://github.com/mcbeet/bolt/commit/014802fcf98314b270868503a8f4bca1a3429d31)) + ## v0.17.3 (2022-07-25) ### Fix * Enable interpolation for uuid ([`39cc462`](https://github.com/mcbeet/bolt/commit/39cc4624f555874808c629000c260c2feefbb5b4)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 14531f8cb..c493d9f35 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.3" +__version__ = "0.17.4" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 68ffd0c80..241204949 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.3" +version = "0.17.4" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From f4fd9aa7bd078cebad132dcea31efac9ecebab31 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 6 Aug 2022 04:08:29 +0200 Subject: [PATCH 0974/1554] fix: only allow call expressions on builtins for interpolation --- packages/bolt/bolt/parse.py | 39 ++++++++++- .../tests/resources/bolt_examples.mcfunction | 16 +++++ .../tests/snapshots/bolt__parse_274__0.txt | 34 ++++++++++ .../tests/snapshots/bolt__parse_274__1.txt | 4 ++ .../tests/snapshots/bolt__parse_275__0.txt | 67 +++++++++++++++++++ .../tests/snapshots/bolt__parse_275__1.txt | 61 +++++++++++++++++ .../tests/snapshots/bolt__parse_276__0.txt | 50 ++++++++++++++ .../tests/snapshots/bolt__parse_276__1.txt | 58 ++++++++++++++++ .../tests/snapshots/bolt__parse_277__0.txt | 5 ++ .../tests/snapshots/bolt__parse_278__0.txt | 48 +++++++++++++ .../tests/snapshots/bolt__parse_278__1.txt | 39 +++++++++++ .../tests/snapshots/bolt__parse_279__0.txt | 31 +++++++++ .../tests/snapshots/bolt__parse_279__1.txt | 36 ++++++++++ .../tests/snapshots/bolt__parse_280__0.txt | 34 ++++++++++ .../tests/snapshots/bolt__parse_280__1.txt | 4 ++ 15 files changed, 525 insertions(+), 1 deletion(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_274__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_274__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_275__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_275__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_276__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_276__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_277__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_278__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_278__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_279__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_279__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_280__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_280__1.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 8111afdc6..15377e7cc 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1,5 +1,6 @@ __all__ = [ "get_bolt_parsers", + "get_stream_builtins", "get_stream_identifiers", "get_stream_pending_identifiers", "get_stream_identifiers_storage", @@ -52,6 +53,7 @@ "KeywordParser", "LookupParser", "PrimaryParser", + "BuiltinCallRestriction", "parse_dict_item", "LiteralParser", ] @@ -256,7 +258,9 @@ def get_bolt_parsers( "bolt:class_bases": parse_class_bases, "bolt:class_root": parse_class_root, "bolt:del_target": parse_del_target, - "bolt:interpolation": PrimaryParser(delegate("bolt:identifier"), truncate=True), + "bolt:interpolation": BuiltinCallRestriction( + PrimaryParser(delegate("bolt:identifier"), truncate=True) + ), "bolt:identifier": parse_identifier, "bolt:with_expression": TrailingCommaParser(delegate("bolt:expression")), "bolt:with_target": TrailingCommaParser( @@ -439,6 +443,11 @@ def get_bolt_parsers( } +def get_stream_builtins(stream: TokenStream) -> Set[str]: + """Return the set of builtin identifiers currently associated with the token stream.""" + return stream.data.setdefault("builtins", set()) + + def get_stream_identifiers(stream: TokenStream) -> Set[str]: """Return the set of accessible identifiers currently associated with the token stream.""" return stream.data.setdefault("identifiers", set()) @@ -498,6 +507,7 @@ def __call__(self, stream: TokenStream) -> Any: with self.modules.parse_push(current), stream.provide( resource_location=self.modules.database[current].resource_location, + builtins=self.modules.builtins, identifiers=set(self.modules.globals) | self.modules.builtins | {"__name__"}, @@ -2068,6 +2078,33 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class BuiltinCallRestriction: + """Only allow call expressions on builtins.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + parent = None + node = self.parser(stream) + original = node + + while isinstance(node, (AstAttribute, AstLookup, AstCall)): + parent = node + node = node.value + + if ( + isinstance(node, AstIdentifier) + and not isinstance(parent, AstCall) + and node.value in get_stream_builtins(stream) + and node.value not in get_stream_identifiers_storage(stream) + ): + msg = f'Expected call expression on builtin "{node.value}".' + raise set_location(InvalidSyntax(msg), parent) + + return original + + def parse_dict_item(stream: TokenStream) -> Any: """Parse dict item node.""" identifiers = get_stream_identifiers(stream) diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index af872c1c7..4254ab683 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1019,3 +1019,19 @@ class B: import math ### particle minecraft:dust 0.00000 (117/255) (164/255) 0.5 ~ ~ ~ 0 0 0 0 1 force @s +### +say @s[tag=hex.summon] +### +hex = 42 +say @s[tag=hex.summon] +### +say @s[tag=hex(42)] +### +time set hex.time +### +hex = 123 +time set hex.time +### +time set hex(123) +### +say @s[tag=id] diff --git a/packages/bolt/tests/snapshots/bolt__parse_274__0.txt b/packages/bolt/tests/snapshots/bolt__parse_274__0.txt new file mode 100644 index 000000000..45ef3c7da --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_274__0.txt @@ -0,0 +1,34 @@ +say @s[tag=hex.summon] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=22, lineno=1, colno=23) + variable: 's' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + inverted: False + key: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'tag' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=21, lineno=1, colno=22) + value: 'hex.summon' diff --git a/packages/bolt/tests/snapshots/bolt__parse_274__1.txt b/packages/bolt/tests/snapshots/bolt__parse_274__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_274__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_275__0.txt b/packages/bolt/tests/snapshots/bolt__parse_275__0.txt new file mode 100644 index 000000000..8e38f80c1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_275__0.txt @@ -0,0 +1,67 @@ +hex = 42 +say @s[tag=hex.summon] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'hex' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 42 + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + fragments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + variable: 's' + arguments: + + location: SourceLocation(pos=16, lineno=2, colno=8) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + inverted: False + key: + + location: SourceLocation(pos=16, lineno=2, colno=8) + end_location: SourceLocation(pos=19, lineno=2, colno=11) + value: 'tag' + value: + + location: SourceLocation(pos=20, lineno=2, colno=12) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + prefix: None + unpack: None + converter: 'word' + value: + + location: SourceLocation(pos=20, lineno=2, colno=12) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + name: 'summon' + value: + + location: SourceLocation(pos=20, lineno=2, colno=12) + end_location: SourceLocation(pos=23, lineno=2, colno=15) + value: 'hex' diff --git a/packages/bolt/tests/snapshots/bolt__parse_275__1.txt b/packages/bolt/tests/snapshots/bolt__parse_275__1.txt new file mode 100644 index 000000000..5df2ff00b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_275__1.txt @@ -0,0 +1,61 @@ +_bolt_lineno = [1, 9], [1, 2] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_word = _bolt_runtime.helpers['interpolate_word'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 42 + hex = _bolt_var0 + _bolt_var1 = hex + _bolt_var1 = _bolt_helper_get_attribute(_bolt_var1, 'summon') + _bolt_var1 = _bolt_helper_interpolate_word(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], fragments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1)]))]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=20, lineno=2, colno=12) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + prefix: None + unpack: None + converter: 'word' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=16, lineno=2, colno=8) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + inverted: False + key: + + value: + +_bolt_refs[2] + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + variable: 's' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + fragments: + +_bolt_refs[4] + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + identifier: 'say:message' + arguments: + +_bolt_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=2, colno=23) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_276__0.txt b/packages/bolt/tests/snapshots/bolt__parse_276__0.txt new file mode 100644 index 000000000..1631d5015 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_276__0.txt @@ -0,0 +1,50 @@ +say @s[tag=hex(42)] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + variable: 's' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + inverted: False + key: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'tag' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + prefix: None + unpack: None + converter: 'word' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'hex' + arguments: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 42 diff --git a/packages/bolt/tests/snapshots/bolt__parse_276__1.txt b/packages/bolt/tests/snapshots/bolt__parse_276__1.txt new file mode 100644 index 000000000..22242c81f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_276__1.txt @@ -0,0 +1,58 @@ +_bolt_lineno = [1], [1] +_bolt_helper_interpolate_word = _bolt_runtime.helpers['interpolate_word'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = hex + _bolt_var1 = 42 + _bolt_var0 = _bolt_var0(_bolt_var1) + _bolt_var0 = _bolt_helper_interpolate_word(_bolt_var0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], fragments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var0)]))]))]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + prefix: None + unpack: None + converter: 'word' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + inverted: False + key: + + value: + +_bolt_refs[2] + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + variable: 's' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + fragments: + +_bolt_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + identifier: 'say:message' + arguments: + +_bolt_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_277__0.txt b/packages/bolt/tests/snapshots/bolt__parse_277__0.txt new file mode 100644 index 000000000..bb45f1a18 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_277__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected literal 'day', literal 'midnight', literal 'night', literal 'noon' or time but got literal 'hex.time'. +# line 1, column 10 +# 1 | time set hex.time +# : ^^^^^^^^ +time set hex.time diff --git a/packages/bolt/tests/snapshots/bolt__parse_278__0.txt b/packages/bolt/tests/snapshots/bolt__parse_278__0.txt new file mode 100644 index 000000000..dc0ee1879 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_278__0.txt @@ -0,0 +1,48 @@ +hex = 123 +time set hex.time +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'hex' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 123 + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=18) + identifier: 'time:set:time' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=10) + end_location: SourceLocation(pos=27, lineno=2, colno=18) + prefix: None + unpack: None + converter: 'time' + value: + + location: SourceLocation(pos=19, lineno=2, colno=10) + end_location: SourceLocation(pos=27, lineno=2, colno=18) + name: 'time' + value: + + location: SourceLocation(pos=19, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=13) + value: 'hex' diff --git a/packages/bolt/tests/snapshots/bolt__parse_278__1.txt b/packages/bolt/tests/snapshots/bolt__parse_278__1.txt new file mode 100644 index 000000000..24214312f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_278__1.txt @@ -0,0 +1,39 @@ +_bolt_lineno = [1, 9], [1, 2] +_bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] +_bolt_helper_interpolate_time = _bolt_runtime.helpers['interpolate_time'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 123 + hex = _bolt_var0 + _bolt_var1 = hex + _bolt_var1 = _bolt_helper_get_attribute(_bolt_var1, 'time') + _bolt_var1 = _bolt_helper_interpolate_time(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=19, lineno=2, colno=10) + end_location: SourceLocation(pos=27, lineno=2, colno=18) + prefix: None + unpack: None + converter: 'time' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=18) + identifier: 'time:set:time' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_279__0.txt b/packages/bolt/tests/snapshots/bolt__parse_279__0.txt new file mode 100644 index 000000000..029166b6c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_279__0.txt @@ -0,0 +1,31 @@ +time set hex(123) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + identifier: 'time:set:time' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + prefix: None + unpack: None + converter: 'time' + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'hex' + arguments: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + value: 123 diff --git a/packages/bolt/tests/snapshots/bolt__parse_279__1.txt b/packages/bolt/tests/snapshots/bolt__parse_279__1.txt new file mode 100644 index 000000000..805ec0685 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_279__1.txt @@ -0,0 +1,36 @@ +_bolt_lineno = [1], [1] +_bolt_helper_interpolate_time = _bolt_runtime.helpers['interpolate_time'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = hex + _bolt_var1 = 123 + _bolt_var0 = _bolt_var0(_bolt_var1) + _bolt_var0 = _bolt_helper_interpolate_time(_bolt_var0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var0]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + prefix: None + unpack: None + converter: 'time' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + identifier: 'time:set:time' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_280__0.txt b/packages/bolt/tests/snapshots/bolt__parse_280__0.txt new file mode 100644 index 000000000..a9e146283 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_280__0.txt @@ -0,0 +1,34 @@ +say @s[tag=id] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + fragments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + variable: 's' + arguments: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + inverted: False + key: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + value: 'tag' + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'id' diff --git a/packages/bolt/tests/snapshots/bolt__parse_280__1.txt b/packages/bolt/tests/snapshots/bolt__parse_280__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_280__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- From 0fac678e4a117cb85eddf92fda5ad05393cd196d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 6 Aug 2022 04:21:09 +0200 Subject: [PATCH 0975/1554] fix: builtins used as dict keys are now unquoted strings --- packages/bolt/bolt/parse.py | 7 +- .../tests/resources/bolt_examples.mcfunction | 7 +- .../tests/snapshots/bolt__parse_281__0.txt | 60 ++++++++++++++ .../tests/snapshots/bolt__parse_281__1.txt | 22 +++++ .../tests/snapshots/bolt__parse_282__0.txt | 81 +++++++++++++++++++ .../tests/snapshots/bolt__parse_282__1.txt | 25 ++++++ .../tests/snapshots/bolt__parse_96__0.txt | 76 ++++++++--------- .../tests/snapshots/bolt__parse_96__1.txt | 2 +- 8 files changed, 237 insertions(+), 43 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_281__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_281__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_282__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_282__1.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 15377e7cc..9f40eba7d 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -2107,15 +2107,16 @@ def __call__(self, stream: TokenStream) -> Any: def parse_dict_item(stream: TokenStream) -> Any: """Parse dict item node.""" - identifiers = get_stream_identifiers(stream) - with stream.syntax(colon=r":", identifier=IDENTIFIER_PATTERN): with stream.checkpoint() as commit: identifier = stream.expect("identifier") stream.expect("colon") commit() - if identifier.value in identifiers: + if identifier.value in get_stream_identifiers(stream) and ( + not identifier.value in get_stream_builtins(stream) + or identifier.value in get_stream_identifiers_storage(stream) + ): key = AstIdentifier(value=identifier.value) else: key = AstDictUnquotedKey(value=identifier.value) diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 4254ab683..b9e0070d3 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -343,7 +343,7 @@ my_predicate = { entity: "this", scores: { score1: { - "min": { + min: { type: "minecraft:score", target: "this", score: "score2", @@ -1035,3 +1035,8 @@ time set hex.time time set hex(123) ### say @s[tag=id] +### +ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] +### +id = 42 +ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] diff --git a/packages/bolt/tests/snapshots/bolt__parse_281__0.txt b/packages/bolt/tests/snapshots/bolt__parse_281__0.txt new file mode 100644 index 000000000..30d2ce6c4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_281__0.txt @@ -0,0 +1,60 @@ +ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=74, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'ingredients' + rebind: False + value: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=73, lineno=1, colno=74) + items: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=45, lineno=1, colno=46) + items: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + key: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 'id' + value: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: 'minecraft:blaze_powder' + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=72, lineno=1, colno=73) + items: + + location: SourceLocation(pos=48, lineno=1, colno=49) + end_location: SourceLocation(pos=71, lineno=1, colno=72) + key: + + location: SourceLocation(pos=48, lineno=1, colno=49) + end_location: SourceLocation(pos=50, lineno=1, colno=51) + value: 'id' + value: + + location: SourceLocation(pos=52, lineno=1, colno=53) + end_location: SourceLocation(pos=71, lineno=1, colno=72) + value: 'minecraft:furnace' diff --git a/packages/bolt/tests/snapshots/bolt__parse_281__1.txt b/packages/bolt/tests/snapshots/bolt__parse_281__1.txt new file mode 100644 index 000000000..5f31e837f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_281__1.txt @@ -0,0 +1,22 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var7: + _bolt_var0 = 'id' + _bolt_var1 = 'minecraft:blaze_powder' + _bolt_var2 = {_bolt_var0: _bolt_var1} + _bolt_var3 = 'id' + _bolt_var4 = 'minecraft:furnace' + _bolt_var5 = {_bolt_var3: _bolt_var4} + _bolt_var6 = [_bolt_var2, _bolt_var5] + ingredients = _bolt_var6 +_bolt_var8 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var7)) +--- +output = _bolt_var8 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=74, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_282__0.txt b/packages/bolt/tests/snapshots/bolt__parse_282__0.txt new file mode 100644 index 000000000..1232af55f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_282__0.txt @@ -0,0 +1,81 @@ +id = 42 +ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=82, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + value: 'id' + rebind: False + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: 42 + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=81, lineno=2, colno=74) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=81, lineno=2, colno=74) + operator: '=' + target: + + location: SourceLocation(pos=8, lineno=2, colno=1) + end_location: SourceLocation(pos=19, lineno=2, colno=12) + value: 'ingredients' + rebind: False + value: + + location: SourceLocation(pos=22, lineno=2, colno=15) + end_location: SourceLocation(pos=81, lineno=2, colno=74) + items: + + location: SourceLocation(pos=23, lineno=2, colno=16) + end_location: SourceLocation(pos=53, lineno=2, colno=46) + items: + + location: SourceLocation(pos=24, lineno=2, colno=17) + end_location: SourceLocation(pos=52, lineno=2, colno=45) + key: + + location: SourceLocation(pos=24, lineno=2, colno=17) + end_location: SourceLocation(pos=26, lineno=2, colno=19) + value: 'id' + value: + + location: SourceLocation(pos=28, lineno=2, colno=21) + end_location: SourceLocation(pos=52, lineno=2, colno=45) + value: 'minecraft:blaze_powder' + + location: SourceLocation(pos=55, lineno=2, colno=48) + end_location: SourceLocation(pos=80, lineno=2, colno=73) + items: + + location: SourceLocation(pos=56, lineno=2, colno=49) + end_location: SourceLocation(pos=79, lineno=2, colno=72) + key: + + location: SourceLocation(pos=56, lineno=2, colno=49) + end_location: SourceLocation(pos=58, lineno=2, colno=51) + value: 'id' + value: + + location: SourceLocation(pos=60, lineno=2, colno=53) + end_location: SourceLocation(pos=79, lineno=2, colno=72) + value: 'minecraft:furnace' diff --git a/packages/bolt/tests/snapshots/bolt__parse_282__1.txt b/packages/bolt/tests/snapshots/bolt__parse_282__1.txt new file mode 100644 index 000000000..2f2002b70 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_282__1.txt @@ -0,0 +1,25 @@ +_bolt_lineno = [1, 7], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var8: + _bolt_var0 = 42 + id = _bolt_var0 + _bolt_var1 = id + _bolt_var2 = 'minecraft:blaze_powder' + _bolt_var3 = {_bolt_var1: _bolt_var2} + _bolt_var4 = id + _bolt_var5 = 'minecraft:furnace' + _bolt_var6 = {_bolt_var4: _bolt_var5} + _bolt_var7 = [_bolt_var3, _bolt_var6] + ingredients = _bolt_var7 +_bolt_var9 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var8)) +--- +output = _bolt_var9 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=82, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt index aafa4d470..91bf2f0e6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt @@ -3,7 +3,7 @@ my_predicate = { entity: "this", scores: { score1: { - "min": { + min: { type: "minecraft:score", target: "this", score: "score2", @@ -15,16 +15,16 @@ my_predicate = { --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=235, lineno=15, colno=1) + end_location: SourceLocation(pos=233, lineno=15, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=234, lineno=14, colno=2) + end_location: SourceLocation(pos=232, lineno=14, colno=2) identifier: 'statement' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=234, lineno=14, colno=2) + end_location: SourceLocation(pos=232, lineno=14, colno=2) operator: '=' target: @@ -35,7 +35,7 @@ my_predicate = { value: location: SourceLocation(pos=15, lineno=1, colno=16) - end_location: SourceLocation(pos=234, lineno=14, colno=2) + end_location: SourceLocation(pos=232, lineno=14, colno=2) items: location: SourceLocation(pos=19, lineno=2, colno=3) @@ -65,7 +65,7 @@ my_predicate = { value: 'this' location: SourceLocation(pos=77, lineno=4, colno=3) - end_location: SourceLocation(pos=232, lineno=13, colno=4) + end_location: SourceLocation(pos=230, lineno=13, colno=4) key: location: SourceLocation(pos=77, lineno=4, colno=3) @@ -74,11 +74,11 @@ my_predicate = { value: location: SourceLocation(pos=85, lineno=4, colno=11) - end_location: SourceLocation(pos=232, lineno=13, colno=4) + end_location: SourceLocation(pos=230, lineno=13, colno=4) items: location: SourceLocation(pos=91, lineno=5, colno=5) - end_location: SourceLocation(pos=228, lineno=12, colno=6) + end_location: SourceLocation(pos=226, lineno=12, colno=6) key: location: SourceLocation(pos=91, lineno=5, colno=5) @@ -87,70 +87,70 @@ my_predicate = { value: location: SourceLocation(pos=99, lineno=5, colno=13) - end_location: SourceLocation(pos=228, lineno=12, colno=6) + end_location: SourceLocation(pos=226, lineno=12, colno=6) items: location: SourceLocation(pos=107, lineno=6, colno=7) - end_location: SourceLocation(pos=222, lineno=11, colno=8) + end_location: SourceLocation(pos=220, lineno=11, colno=8) key: - + location: SourceLocation(pos=107, lineno=6, colno=7) - end_location: SourceLocation(pos=112, lineno=6, colno=12) + end_location: SourceLocation(pos=110, lineno=6, colno=10) value: 'min' value: - location: SourceLocation(pos=114, lineno=6, colno=14) - end_location: SourceLocation(pos=222, lineno=11, colno=8) + location: SourceLocation(pos=112, lineno=6, colno=12) + end_location: SourceLocation(pos=220, lineno=11, colno=8) items: - location: SourceLocation(pos=124, lineno=7, colno=9) - end_location: SourceLocation(pos=147, lineno=7, colno=32) + location: SourceLocation(pos=122, lineno=7, colno=9) + end_location: SourceLocation(pos=145, lineno=7, colno=32) key: - location: SourceLocation(pos=124, lineno=7, colno=9) - end_location: SourceLocation(pos=128, lineno=7, colno=13) + location: SourceLocation(pos=122, lineno=7, colno=9) + end_location: SourceLocation(pos=126, lineno=7, colno=13) value: 'type' value: - location: SourceLocation(pos=130, lineno=7, colno=15) - end_location: SourceLocation(pos=147, lineno=7, colno=32) + location: SourceLocation(pos=128, lineno=7, colno=15) + end_location: SourceLocation(pos=145, lineno=7, colno=32) value: 'minecraft:score' - location: SourceLocation(pos=157, lineno=8, colno=9) - end_location: SourceLocation(pos=171, lineno=8, colno=23) + location: SourceLocation(pos=155, lineno=8, colno=9) + end_location: SourceLocation(pos=169, lineno=8, colno=23) key: - location: SourceLocation(pos=157, lineno=8, colno=9) - end_location: SourceLocation(pos=163, lineno=8, colno=15) + location: SourceLocation(pos=155, lineno=8, colno=9) + end_location: SourceLocation(pos=161, lineno=8, colno=15) value: 'target' value: - location: SourceLocation(pos=165, lineno=8, colno=17) - end_location: SourceLocation(pos=171, lineno=8, colno=23) + location: SourceLocation(pos=163, lineno=8, colno=17) + end_location: SourceLocation(pos=169, lineno=8, colno=23) value: 'this' - location: SourceLocation(pos=181, lineno=9, colno=9) - end_location: SourceLocation(pos=196, lineno=9, colno=24) + location: SourceLocation(pos=179, lineno=9, colno=9) + end_location: SourceLocation(pos=194, lineno=9, colno=24) key: - location: SourceLocation(pos=181, lineno=9, colno=9) - end_location: SourceLocation(pos=186, lineno=9, colno=14) + location: SourceLocation(pos=179, lineno=9, colno=9) + end_location: SourceLocation(pos=184, lineno=9, colno=14) value: 'score' value: - location: SourceLocation(pos=188, lineno=9, colno=16) - end_location: SourceLocation(pos=196, lineno=9, colno=24) + location: SourceLocation(pos=186, lineno=9, colno=16) + end_location: SourceLocation(pos=194, lineno=9, colno=24) value: 'score2' - location: SourceLocation(pos=206, lineno=10, colno=9) - end_location: SourceLocation(pos=214, lineno=10, colno=17) + location: SourceLocation(pos=204, lineno=10, colno=9) + end_location: SourceLocation(pos=212, lineno=10, colno=17) key: - location: SourceLocation(pos=206, lineno=10, colno=9) - end_location: SourceLocation(pos=211, lineno=10, colno=14) + location: SourceLocation(pos=204, lineno=10, colno=9) + end_location: SourceLocation(pos=209, lineno=10, colno=14) value: 'scale' value: - location: SourceLocation(pos=213, lineno=10, colno=16) - end_location: SourceLocation(pos=214, lineno=10, colno=17) + location: SourceLocation(pos=211, lineno=10, colno=16) + end_location: SourceLocation(pos=212, lineno=10, colno=17) value: 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt index fd6dc6746..a332a177a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_96__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_96__1.txt @@ -29,6 +29,6 @@ output = _bolt_var20 _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=235, lineno=15, colno=1) + end_location: SourceLocation(pos=233, lineno=15, colno=1) commands: From a4d39a2877f3d7e779d3d7c79223b29df7da2b62 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 6 Aug 2022 02:23:41 +0000 Subject: [PATCH 0976/1554] 0.17.5 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 5 +++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 668ba17a3..a6e638c09 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.17.5 (2022-08-06) +### Fix +* Builtins used as dict keys are now unquoted strings ([`015ff65`](https://github.com/mcbeet/bolt/commit/015ff657229b02d5930b0a5756e95d515e8df70e)) +* Only allow call expressions on builtins for interpolation ([`0526a85`](https://github.com/mcbeet/bolt/commit/0526a85af232e05255e24e07a43ee720a1bb87f4)) + ## v0.17.4 (2022-08-06) ### Fix * Truncate primary expression for interpolation ([`014802f`](https://github.com/mcbeet/bolt/commit/014802fcf98314b270868503a8f4bca1a3429d31)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index c493d9f35..e6d3922f0 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.4" +__version__ = "0.17.5" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 241204949..070e3866a 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.4" +version = "0.17.5" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 0a4610479b0e6baa5ef823f310735e06a45d0d30 Mon Sep 17 00:00:00 2001 From: TheWii <67249660+TheWii@users.noreply.github.com> Date: Fri, 12 Aug 2022 11:32:51 -0300 Subject: [PATCH 0977/1554] fix: import parser properly delegates to resource location parser (#37) --- packages/bolt/bolt/parse.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 9f40eba7d..fcecc0aca 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -268,7 +268,9 @@ def get_bolt_parsers( ), "bolt:import": AlternativeParser( [ - ImportLocationConstraint(parsers["resource_location_or_tag"]), + ImportLocationConstraint( + DisableInterpolationParser(delegate("resource_location_or_tag")) + ), parse_python_import, ] ), From 0e78b91e87c70562f76139759778e8a4e4fabc60 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 12 Aug 2022 14:33:36 +0000 Subject: [PATCH 0978/1554] 0.17.6 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index a6e638c09..5fc445df4 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.6 (2022-08-12) +### Fix +* Import parser properly delegates to resource location parser ([#37](https://github.com/mcbeet/bolt/issues/37)) ([`a971b07`](https://github.com/mcbeet/bolt/commit/a971b07e15d7382216f90c51233e3e7762a05b47)) + ## v0.17.5 (2022-08-06) ### Fix * Builtins used as dict keys are now unquoted strings ([`015ff65`](https://github.com/mcbeet/bolt/commit/015ff657229b02d5930b0a5756e95d515e8df70e)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e6d3922f0..20e6c9cb3 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.5" +__version__ = "0.17.6" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 070e3866a..a6b3a30c3 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.5" +version = "0.17.6" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From affd4df4512904650d7897a7ab4c47d604be99c7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 16 Aug 2022 03:01:13 +0200 Subject: [PATCH 0979/1554] fix: update beet --- packages/bolt/poetry.lock | 16 ++++++++-------- packages/bolt/pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 4498bea0d..8d25c5aa5 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -22,7 +22,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.68.3" +version = "0.71.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -234,9 +234,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["importlib-resources (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-black (>=0.3.7)", "pytest-perf (>=0.9.2)", "flufl.flake8", "pyfakefs", "packaging", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +docs = ["rst.linker (>=1.9)", "jaraco.packaging (>=9)", "sphinx"] [[package]] name = "iniconfig" @@ -309,8 +309,8 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest-mypy", "pytest-black (>=0.3.7)", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] +docs = ["jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "jaraco.packaging (>=8.2)", "sphinx"] [[package]] name = "lectern" @@ -483,8 +483,8 @@ python-versions = ">=3.6.1" typing-extensions = ">=3.7.4.3" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] +dotenv = ["python-dotenv (>=0.10.4)"] [[package]] name = "pygments" @@ -551,8 +551,8 @@ requests = ">=2.25.0" requests-toolbelt = ">=0.9.1" [package.extras] -autocompletion = ["argcomplete (>=1.10.0,<3)"] yaml = ["PyYaml (>=5.2)"] +autocompletion = ["argcomplete (>=1.10.0,<3)"] [[package]] name = "python-semantic-release" @@ -825,7 +825,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "bdc97b6dce2258692aad002202dc5b45dd8d71b3acc42a48693342964b2e0c18" +content-hash = "ec2b38e1e0d14fa5db7c21292f6b4654fcdd9b75c0b9c4e61344ec024bde0826" [metadata.files] atomicwrites = [] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index a6b3a30c3..5adf6eb84 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,7 +23,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.3" +beet = ">=0.71.0" mecha = ">=0.54.9" [tool.poetry.dev-dependencies] From deeaa3ade610daaf1f6528ef0715075429c3eb68 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Aug 2022 01:02:40 +0000 Subject: [PATCH 0980/1554] 0.17.7 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 5fc445df4..99a1f7dc0 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.17.7 (2022-08-16) +### Fix +* Update beet ([`c494033`](https://github.com/mcbeet/bolt/commit/c494033639d389fb6a3165ddefa04d8dc3c4a08e)) + ## v0.17.6 (2022-08-12) ### Fix * Import parser properly delegates to resource location parser ([#37](https://github.com/mcbeet/bolt/issues/37)) ([`a971b07`](https://github.com/mcbeet/bolt/commit/a971b07e15d7382216f90c51233e3e7762a05b47)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 20e6c9cb3..b59a5f723 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.6" +__version__ = "0.17.7" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 5adf6eb84..1c638f0f4 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.6" +version = "0.17.7" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From e0e34aae747f7422cdb19f8ca79c8ef045803657 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 16:36:11 +0200 Subject: [PATCH 0981/1554] chore: bump install-poetry action --- packages/mecha/.github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/.github/workflows/main.yml b/packages/mecha/.github/workflows/main.yml index 77d3c7f9e..e28550f70 100644 --- a/packages/mecha/.github/workflows/main.yml +++ b/packages/mecha/.github/workflows/main.yml @@ -20,7 +20,7 @@ jobs: with: python-version: 3.9 - name: Install Poetry - uses: snok/install-poetry@v1.1.1 + uses: snok/install-poetry@v1 with: virtualenvs-in-project: true - name: Install Pyright From 83b7178dd5a5819c5c2e4fb568b3351fdca20600 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 16:42:19 +0200 Subject: [PATCH 0982/1554] fix: bump deps --- packages/mecha/package-lock.json | 14 +- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 663 +++++-------------------------- packages/mecha/pyproject.toml | 10 +- 4 files changed, 104 insertions(+), 585 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 67573b55f..70fd8837d 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.257" + "pyright": "^1.1.270" } }, "node_modules/pyright": { - "version": "1.1.257", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", - "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", + "version": "1.1.270", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", + "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.257", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", - "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", + "version": "1.1.270", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", + "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index e9a65459f..7df6475c3 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.257" + "pyright": "^1.1.270" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 89de4d6cc..9b6ca1be8 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -1,11 +1,3 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" version = "21.4.0" @@ -22,7 +14,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.68.2" +version = "0.71.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -44,7 +36,7 @@ image = ["pillow"] [[package]] name = "black" -version = "22.6.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -234,9 +226,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["importlib-resources (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-black (>=0.3.7)", "pytest-perf (>=0.9.2)", "flufl.flake8", "pyfakefs", "packaging", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +docs = ["rst.linker (>=1.9)", "jaraco.packaging (>=9)", "sphinx"] [[package]] name = "iniconfig" @@ -277,8 +269,8 @@ optional = false python-versions = ">=3.7" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +trio = ["async-generator", "trio"] +test = ["async-timeout", "trio", "testpath", "pytest-asyncio (>=0.17)", "pytest-trio", "pytest"] [[package]] name = "jinja2" @@ -309,8 +301,8 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest-mypy", "pytest-black (>=0.3.7)", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] +docs = ["jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "jaraco.packaging (>=8.2)", "sphinx"] [[package]] name = "lectern" @@ -337,14 +329,14 @@ python-versions = ">=3.7" mdurl = ">=0.1,<1.0" [package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -plugins = ["mdit-py-plugins"] +testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] +rtd = ["sphinx-book-theme", "sphinx-design", "sphinx-copybutton", "sphinx", "pyyaml", "myst-parser", "attrs"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +plugins = ["mdit-py-plugins"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +compare = ["panflute (>=2.1.3,<2.2.0)", "mistune (>=2.0.2,<2.1.0)", "mistletoe (>=0.8.1,<0.9.0)", "markdown (>=3.3.6,<3.4.0)", "commonmark (>=0.9.1,<0.10.0)"] +code_style = ["pre-commit (==2.6)"] +benchmarking = ["pytest-benchmark (>=3.2,<4.0)", "pytest", "psutil"] [[package]] name = "markupsafe" @@ -440,8 +432,8 @@ optional = false python-versions = ">=3.6" [package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["pytest-benchmark", "pytest"] +dev = ["tox", "pre-commit"] [[package]] name = "py" @@ -471,8 +463,8 @@ python-versions = ">=3.6.1" typing-extensions = ">=3.7.4.3" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] +dotenv = ["python-dotenv (>=0.10.4)"] [[package]] name = "pygments" @@ -495,14 +487,13 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" @@ -544,7 +535,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.28.1" +version = "7.31.4" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -556,15 +547,16 @@ click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" invoke = ">=1.4.1,<2" +packaging = "*" python-gitlab = ">=2,<4" requests = ">=2.25,<3" semver = ">=2.10,<3" -tomlkit = ">=0.10.0,<0.11.0" +tomlkit = ">=0.10,<1.0" twine = ">=3,<4" [package.extras] dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)"] +docs = ["Sphinx (==1.3.6)", "Jinja2 (==3.0.3)"] mypy = ["mypy", "types-requests"] test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] @@ -813,546 +805,73 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "0980036e7f466ce6cea3ad2a2231bdae74bb94d6f52d4dd9f547d52370c38b4a" +content-hash = "407da125657bf7bf0f6e2b447cb172a599b89e4ae0e0b12709d1f0252a443b66" [metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -beet = [ - {file = "beet-0.68.2-py3-none-any.whl", hash = "sha256:dddd10e0dc2114d7ecfa7bd919a5550ac7ef8621ce788996f38fd285614dde22"}, - {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, -] -black = [ - {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, - {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, - {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, - {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, - {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, - {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, - {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, - {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, - {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, - {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, - {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, - {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, - {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, - {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, - {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, - {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, - {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, - {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, - {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, -] -bleach = [ - {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, - {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -click-help-colors = [ - {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, - {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, -] -click-log = [ - {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, - {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -cryptography = [ - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, - {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, - {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, - {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, -] -docutils = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, -] -dotty-dict = [ - {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -gitpython = [ - {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -invoke = [ - {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, - {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -keyring = [ - {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, - {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, -] -lectern = [ - {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, - {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mdurl = [ - {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, - {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nbtlib = [ - {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, - {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, -] -numpy = [ - {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, - {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, - {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, - {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, - {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, - {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, - {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, - {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, - {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, - {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -pkginfo = [ - {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, - {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, -] -platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, -] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] -pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, -] -pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, -] -pytest-insta = [ - {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, - {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, -] -python-gitlab = [ - {file = "python-gitlab-3.3.0.tar.gz", hash = "sha256:fef25d41a62f91da82ee20f72a728b9c69eef34cf0a3005cdbb9a0b471d5b498"}, - {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, -] -python-semantic-release = [ - {file = "python-semantic-release-7.28.1.tar.gz", hash = "sha256:d7f82b3d4c06b304d07689b8a1c7d0d448ff07c2ab81cd810c4f2f900f24c599"}, - {file = "python_semantic_release-7.28.1-py3-none-any.whl", hash = "sha256:319c3e811d6e10bc3f0e967419eae0e5e9ba1e6745aa2fd94dd24e3995541ca2"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -readme-renderer = [ - {file = "readme_renderer-34.0-py3-none-any.whl", hash = "sha256:262510fe6aae81ed4e94d8b169077f325614c0b1a45916a80442c6576264a9c2"}, - {file = "readme_renderer-34.0.tar.gz", hash = "sha256:dfb4d17f21706d145f7473e0b61ca245ba58e810cf9b2209a48239677f82e5b0"}, -] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -rfc3986 = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, -] -semver = [ - {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, - {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -tokenstream = [ - {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, - {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, - {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, -] -tqdm = [ - {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, - {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, -] -twine = [ - {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, - {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, -] -typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -wrapt = [ - {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, - {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, - {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, - {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, - {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, - {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, - {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, - {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, - {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, - {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, - {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, - {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, - {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, - {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, - {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, - {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, -] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] +attrs = [] +beet = [] +black = [] +bleach = [] +certifi = [] +cffi = [] +charset-normalizer = [] +click = [] +click-help-colors = [] +click-log = [] +colorama = [] +cryptography = [] +docutils = [] +dotty-dict = [] +gitdb = [] +gitpython = [] +idna = [] +importlib-metadata = [] +iniconfig = [] +invoke = [] +isort = [] +jeepney = [] +jinja2 = [] +keyring = [] +lectern = [] +markdown-it-py = [] +markupsafe = [] +mdurl = [] +mypy-extensions = [] +nbtlib = [] +numpy = [] +packaging = [] +pathspec = [] +pkginfo = [] +platformdirs = [] +pluggy = [] +py = [] +pycparser = [] +pydantic = [] +pygments = [] +pyparsing = [] +pytest = [] +pytest-insta = [] +python-gitlab = [] +python-semantic-release = [] +pywin32-ctypes = [] +pyyaml = [] +readme-renderer = [] +requests = [] +requests-toolbelt = [] +rfc3986 = [] +secretstorage = [] +semver = [] +setuptools-scm = [] +six = [] +smmap = [] +tokenstream = [] +toml = [] +tomli = [] +tomlkit = [] +tqdm = [] +twine = [] +typing-extensions = [] +urllib3 = [] +webencodings = [] +wrapt = [] +zipp = [] diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ef760fb7e..ab4543cfb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,14 +23,14 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.2" -tokenstream = "1.4.2" +beet = ">=0.71.0" +tokenstream = "^1.4.2" [tool.poetry.dev-dependencies] -black = "^22.6.0" -pytest = "^7.1.2" +black = "^22.8.0" +pytest = "^7.1.3" isort = "^5.10.1" -python-semantic-release = "^7.28.1" +python-semantic-release = "^7.31.4" pytest-insta = "^0.1.11" lectern = ">=0.24.0" From 47742c894b45504279ec40efdfb5d638eb7647d9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 Sep 2022 14:48:14 +0000 Subject: [PATCH 0983/1554] 0.54.10 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f8e34e5dd..18ddc424f 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.54.10 (2022-09-11) +### Fix +* Bump deps ([`ddfdf2e`](https://github.com/mcbeet/mecha/commit/ddfdf2ec4f8b77664e79ac436723dc1db910ffa6)) + ## v0.54.9 (2022-07-25) ### Fix * Expose game_profile parser ([`2d0d6d6`](https://github.com/mcbeet/mecha/commit/2d0d6d6825cf8a649d5f054de7a3d419548505c9)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index f567d9357..4a93fb3ae 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.9" +__version__ = "0.54.10" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ab4543cfb..98328c9d0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.9" +version = "0.54.10" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 8f5c1db8245e2e5d2a9b0aa1f8113a8c2e8c6f0c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 18:19:24 +0200 Subject: [PATCH 0984/1554] feat: positional-only, variadic, keyword-only, and variadic keyword arguments --- packages/bolt/bolt/ast.py | 38 +++++- packages/bolt/bolt/codegen.py | 19 ++- packages/bolt/bolt/parse.py | 110 +++++++++++++++--- .../examples/bolt_function_signature/beet.yml | 7 ++ .../bolt_function_signature/foo.mcfunction | 35 ++++++ .../tests/resources/bolt_examples.mcfunction | 63 ++++++++++ .../tests/snapshots/bolt__parse_283__0.txt | 30 +++++ .../tests/snapshots/bolt__parse_283__1.txt | 16 +++ .../tests/snapshots/bolt__parse_284__0.txt | 34 ++++++ .../tests/snapshots/bolt__parse_284__1.txt | 16 +++ .../tests/snapshots/bolt__parse_285__0.txt | 38 ++++++ .../tests/snapshots/bolt__parse_285__1.txt | 20 ++++ .../tests/snapshots/bolt__parse_286__0.txt | 38 ++++++ .../tests/snapshots/bolt__parse_286__1.txt | 20 ++++ .../tests/snapshots/bolt__parse_287__0.txt | 41 +++++++ .../tests/snapshots/bolt__parse_287__1.txt | 20 ++++ .../tests/snapshots/bolt__parse_288__0.txt | 46 ++++++++ .../tests/snapshots/bolt__parse_288__1.txt | 20 ++++ .../tests/snapshots/bolt__parse_289__0.txt | 50 ++++++++ .../tests/snapshots/bolt__parse_289__1.txt | 23 ++++ .../tests/snapshots/bolt__parse_290__0.txt | 54 +++++++++ .../tests/snapshots/bolt__parse_290__1.txt | 23 ++++ .../tests/snapshots/bolt__parse_291__0.txt | 58 +++++++++ .../tests/snapshots/bolt__parse_291__1.txt | 23 ++++ .../tests/snapshots/bolt__parse_292__0.txt | 62 ++++++++++ .../tests/snapshots/bolt__parse_292__1.txt | 26 +++++ .../tests/snapshots/bolt__parse_293__0.txt | 66 +++++++++++ .../tests/snapshots/bolt__parse_293__1.txt | 26 +++++ .../tests/snapshots/bolt__parse_294__0.txt | 67 +++++++++++ .../tests/snapshots/bolt__parse_294__1.txt | 26 +++++ .../tests/snapshots/bolt__parse_295__0.txt | 7 ++ .../tests/snapshots/bolt__parse_296__0.txt | 7 ++ .../tests/snapshots/bolt__parse_297__0.txt | 7 ++ .../tests/snapshots/bolt__parse_298__0.txt | 7 ++ .../tests/snapshots/bolt__parse_299__0.txt | 7 ++ .../tests/snapshots/bolt__parse_300__0.txt | 7 ++ .../tests/snapshots/bolt__parse_301__0.txt | 7 ++ .../tests/snapshots/bolt__parse_302__0.txt | 7 ++ .../tests/snapshots/bolt__parse_303__0.txt | 7 ++ ...__build_bolt_function_signature__0.pack.md | 3 + 40 files changed, 1162 insertions(+), 19 deletions(-) create mode 100644 packages/bolt/examples/bolt_function_signature/beet.yml create mode 100644 packages/bolt/examples/bolt_function_signature/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_283__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_283__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_284__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_284__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_285__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_285__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_286__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_286__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_287__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_287__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_288__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_288__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_289__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_289__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_290__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_290__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_291__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_291__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_292__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_292__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_293__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_293__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_294__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_294__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_295__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_296__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_297__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_298__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_299__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_300__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_301__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_302__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_303__0.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 5c88eb38f..beba9843b 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -25,7 +25,12 @@ "AstAssignment", "AstDecorator", "AstFunctionSignature", + "AstFunctionSignatureElement", "AstFunctionSignatureArgument", + "AstFunctionSignaturePositionalMarker", + "AstFunctionSignatureVariadicArgument", + "AstFunctionSignatureVariadicMarker", + "AstFunctionSignatureVariadicKeywordArgument", "AstDeferredRoot", "AstMacro", "AstMacroCall", @@ -253,20 +258,49 @@ class AstDecorator(AstNode): @dataclass(frozen=True) -class AstFunctionSignatureArgument(AstNode): +class AstFunctionSignatureElement(AstNode): + """Base node for function signature element.""" + + +@dataclass(frozen=True) +class AstFunctionSignatureArgument(AstFunctionSignatureElement): """Ast function signature argument node.""" name: str = required_field() default: Optional[AstExpression] = None +@dataclass(frozen=True) +class AstFunctionSignaturePositionalMarker(AstFunctionSignatureElement): + """Ast function signature positional marker node.""" + + +@dataclass(frozen=True) +class AstFunctionSignatureVariadicArgument(AstFunctionSignatureElement): + """Ast function signature variadic argument node.""" + + name: str = required_field() + + +@dataclass(frozen=True) +class AstFunctionSignatureVariadicMarker(AstFunctionSignatureElement): + """Ast function signature variadic marker node.""" + + +@dataclass(frozen=True) +class AstFunctionSignatureVariadicKeywordArgument(AstFunctionSignatureElement): + """Ast function signature variadic keyword argument node.""" + + name: str = required_field() + + @dataclass(frozen=True) class AstFunctionSignature(AstNode): """Ast function signature node.""" decorators: AstChildren[AstDecorator] = AstChildren() name: str = required_field() - arguments: AstChildren[AstFunctionSignatureArgument] = required_field() + arguments: AstChildren[AstFunctionSignatureElement] = required_field() @dataclass(frozen=True) diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index fda62334b..1c2b40a3f 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -52,6 +52,11 @@ AstFormatString, AstFromImport, AstFunctionSignature, + AstFunctionSignatureArgument, + AstFunctionSignaturePositionalMarker, + AstFunctionSignatureVariadicArgument, + AstFunctionSignatureVariadicKeywordArgument, + AstFunctionSignatureVariadicMarker, AstIdentifier, AstImportedItem, AstImportedMacro, @@ -508,13 +513,23 @@ def function( decorators.append(value) arguments: List[str] = [ - f"{arg.name}={acc.missing()}" if arg.default else arg.name + (f"{arg.name}={acc.missing()}" if arg.default else arg.name) + if isinstance(arg, AstFunctionSignatureArgument) + else "/" + if isinstance(arg, AstFunctionSignaturePositionalMarker) + else f"*{arg.name}" + if isinstance(arg, AstFunctionSignatureVariadicArgument) + else "*" + if isinstance(arg, AstFunctionSignatureVariadicMarker) + else f"**{arg.name}" + if isinstance(arg, AstFunctionSignatureVariadicKeywordArgument) + else "_" for arg in signature.arguments ] with acc.function(signature.name, *arguments): for arg in signature.arguments: - if arg.default: + if isinstance(arg, AstFunctionSignatureArgument) and arg.default: acc.statement(f"if {arg.name} is {acc.missing()}:") with acc.block(): value = yield from visit_single(arg.default, required=True) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index fcecc0aca..0077911f9 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -114,6 +114,11 @@ AstFromImport, AstFunctionSignature, AstFunctionSignatureArgument, + AstFunctionSignatureElement, + AstFunctionSignaturePositionalMarker, + AstFunctionSignatureVariadicArgument, + AstFunctionSignatureVariadicKeywordArgument, + AstFunctionSignatureVariadicMarker, AstIdentifier, AstImportedItem, AstImportedMacro, @@ -1030,12 +1035,21 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: scoped_identifiers = set(identifiers) - arguments: List[AstFunctionSignatureArgument] = [] + arguments: List[AstFunctionSignatureElement] = [] + new_locals: Set[str] = set() + + encountered_positional = False + encountered_variadic = False + encountered_variadic_keyword = False + expect_named_argument = False with stream.syntax( comma=r",", equal=r"=(?!=)", brace=r"\(|\)", + separator=r"/", + kwargs=r"\*\*", + args=r"\*", identifier=IDENTIFIER_PATTERN, ): identifier = stream.expect("identifier") @@ -1044,28 +1058,94 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: scoped_identifiers.add(identifier.value) with stream.ignore("newline"): - for _ in stream.peek_until(("brace", ")")): - name = stream.expect("identifier") - - default = None - if stream.get("equal"): - with stream.provide( - identifiers=scoped_identifiers | {arg.name for arg in arguments} - ): - default = delegate("bolt:expression", stream) + for token in stream.peek_until(("brace", ")")): + if encountered_variadic_keyword: + exc = InvalidSyntax( + "Variadic keyword arguments should not be followed by anything." + ) + raise set_location(exc, token) - argument = AstFunctionSignatureArgument( - name=name.value, - default=default, + name, separator, kwargs, args = stream.expect( + "identifier", + "separator", + "kwargs", + "args", ) - arguments.append(set_location(argument, name, stream.current)) + + if name: + expect_named_argument = False + + default = None + if stream.get("equal"): + with stream.provide( + identifiers=scoped_identifiers | new_locals + ): + default = delegate("bolt:expression", stream) + + argument = AstFunctionSignatureArgument( + name=name.value, + default=default, + ) + arguments.append(set_location(argument, name, stream.current)) + new_locals.add(argument.name) + + elif separator: + if encountered_positional: + exc = InvalidSyntax( + "Positional marker already present in function signature." + ) + raise set_location(exc, separator) + if encountered_variadic: + exc = InvalidSyntax( + "Positional marker can not appear after variadic arguments." + ) + raise set_location(exc, separator) + if not arguments: + exc = InvalidSyntax( + "Positional marker can not appear directly at the beginning of the argument list." + ) + raise set_location(exc, separator) + encountered_positional = True + argument = AstFunctionSignaturePositionalMarker() + arguments.append(set_location(argument, separator)) + + elif kwargs: + encountered_variadic_keyword = True + name = stream.expect("identifier") + argument = AstFunctionSignatureVariadicKeywordArgument( + name=name.value + ) + arguments.append(set_location(argument, kwargs, name)) + new_locals.add(argument.name) + + elif args: + if encountered_variadic: + exc = InvalidSyntax("Variadic arguments already specified.") + raise set_location(exc, args) + encountered_variadic = True + if name := stream.get("identifier"): + argument = AstFunctionSignatureVariadicArgument(name=name.value) + arguments.append(set_location(argument, args, name)) + new_locals.add(argument.name) + else: + expect_named_argument = True + argument = AstFunctionSignatureVariadicMarker() + arguments.append(set_location(argument, args)) if not stream.get("comma"): stream.expect(("brace", ")")) break + if expect_named_argument: + for argument in arguments: + if isinstance(argument, AstFunctionSignatureVariadicMarker): + exc = InvalidSyntax( + "Expected at least one named argument after bare variadic marker." + ) + raise set_location(exc, argument) + pending_identifiers.add(identifier.value) - deferred_locals |= {arg.name for arg in arguments} + deferred_locals |= new_locals node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) return set_location(node, identifier, stream.current) diff --git a/packages/bolt/examples/bolt_function_signature/beet.yml b/packages/bolt/examples/bolt_function_signature/beet.yml new file mode 100644 index 000000000..2bf157f4b --- /dev/null +++ b/packages/bolt/examples/bolt_function_signature/beet.yml @@ -0,0 +1,7 @@ +require: + - bolt +data_pack: + load: + data/demo/functions/foo: "foo.mcfunction" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_function_signature/foo.mcfunction b/packages/bolt/examples/bolt_function_signature/foo.mcfunction new file mode 100644 index 000000000..7381de99f --- /dev/null +++ b/packages/bolt/examples/bolt_function_signature/foo.mcfunction @@ -0,0 +1,35 @@ +def f(): + pass + +def f(a): + pass + +def f(a=1): + pass + +def f(a=1,): + pass + +def f(a=1, /): + pass + +def f(a=1, /, b): + pass + +def f(a=1, /, b=2): + pass + +def f(a=1, /, b=2, *args): + pass + +def f(a=1, /, b=2, *, c): + pass + +def f(a=1, /, b=2, *, c=3): + pass + +def f(a=1, /, b=2, *, c=3, **kwargs): + pass + +def f(a=1, /, b=2, *args, c=3, **kwargs): + pass diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index b9e0070d3..4b3238d3a 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1040,3 +1040,66 @@ ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] ### id = 42 ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] +### +def f(): + pass +### +def f(a): + pass +### +def f(a=1): + pass +### +def f(a=1,): + pass +### +def f(a=1, /): + pass +### +def f(a=1, /, b): + pass +### +def f(a=1, /, b=2): + pass +### +def f(a=1, /, b=2, *args): + pass +### +def f(a=1, /, b=2, *, c): + pass +### +def f(a=1, /, b=2, *, c=3): + pass +### +def f(a=1, /, b=2, *, c=3, **kwargs): + pass +### +def f(a=1, /, b=2, *args, c=3, **kwargs): + pass +### +def g(/): + pass +### +def g(*): + pass +### +def g(/, *): + pass +### +def g(*, /): + pass +### +def g(/, foo): + pass +### +def g(foo, *): + pass +### +def g(**kwargs, foo): + pass +### +def g(foo, /, bar, /): + pass +### +def g(foo, *args, bar, *args): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_283__0.txt b/packages/bolt/tests/snapshots/bolt__parse_283__0.txt new file mode 100644 index 000000000..6fcd535cf --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_283__0.txt @@ -0,0 +1,30 @@ +def f(): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_283__1.txt b/packages/bolt/tests/snapshots/bolt__parse_283__1.txt new file mode 100644 index 000000000..c5fde46e0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_283__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(): + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_284__0.txt b/packages/bolt/tests/snapshots/bolt__parse_284__0.txt new file mode 100644 index 000000000..9dceb3d68 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_284__0.txt @@ -0,0 +1,34 @@ +def f(a): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + name: 'a' + default: None + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=14, lineno=2, colno=5) + end_location: SourceLocation(pos=18, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_284__1.txt b/packages/bolt/tests/snapshots/bolt__parse_284__1.txt new file mode 100644 index 000000000..4b30ff360 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_284__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a): + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_285__0.txt b/packages/bolt/tests/snapshots/bolt__parse_285__0.txt new file mode 100644 index 000000000..c6ae0f665 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_285__0.txt @@ -0,0 +1,38 @@ +def f(a=1): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_285__1.txt b/packages/bolt/tests/snapshots/bolt__parse_285__1.txt new file mode 100644 index 000000000..d4f478c3d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_285__1.txt @@ -0,0 +1,20 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_286__0.txt b/packages/bolt/tests/snapshots/bolt__parse_286__0.txt new file mode 100644 index 000000000..7fb9cf42f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_286__0.txt @@ -0,0 +1,38 @@ +def f(a=1,): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_286__1.txt b/packages/bolt/tests/snapshots/bolt__parse_286__1.txt new file mode 100644 index 000000000..b32548a80 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_286__1.txt @@ -0,0 +1,20 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_287__0.txt b/packages/bolt/tests/snapshots/bolt__parse_287__0.txt new file mode 100644 index 000000000..d637d0b8c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_287__0.txt @@ -0,0 +1,41 @@ +def f(a=1, /): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=19, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_287__1.txt b/packages/bolt/tests/snapshots/bolt__parse_287__1.txt new file mode 100644 index 000000000..07194c7eb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_287__1.txt @@ -0,0 +1,20 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=23, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_288__0.txt b/packages/bolt/tests/snapshots/bolt__parse_288__0.txt new file mode 100644 index 000000000..a3a04a1ab --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_288__0.txt @@ -0,0 +1,46 @@ +def f(a=1, /, b): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=16, lineno=1, colno=17) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + name: 'b' + default: None + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=22, lineno=2, colno=5) + end_location: SourceLocation(pos=26, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_288__1.txt b/packages/bolt/tests/snapshots/bolt__parse_288__1.txt new file mode 100644 index 000000000..18208bc0c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_288__1.txt @@ -0,0 +1,20 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_289__0.txt b/packages/bolt/tests/snapshots/bolt__parse_289__0.txt new file mode 100644 index 000000000..64b7c54fc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_289__0.txt @@ -0,0 +1,50 @@ +def f(a=1, /, b=2): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'b' + default: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 2 + + location: SourceLocation(pos=24, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=24, lineno=2, colno=5) + end_location: SourceLocation(pos=28, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_289__1.txt b/packages/bolt/tests/snapshots/bolt__parse_289__1.txt new file mode 100644 index 000000000..23bfd81bd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_289__1.txt @@ -0,0 +1,23 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = 2 + b = _bolt_var1 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_290__0.txt b/packages/bolt/tests/snapshots/bolt__parse_290__0.txt new file mode 100644 index 000000000..29cf518c2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_290__0.txt @@ -0,0 +1,54 @@ +def f(a=1, /, b=2, *args): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'b' + default: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 2 + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + name: 'args' + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=35, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=35, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_290__1.txt b/packages/bolt/tests/snapshots/bolt__parse_290__1.txt new file mode 100644 index 000000000..5f1f9f4cc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_290__1.txt @@ -0,0 +1,23 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing, *args): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = 2 + b = _bolt_var1 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_291__0.txt b/packages/bolt/tests/snapshots/bolt__parse_291__0.txt new file mode 100644 index 000000000..4168f7137 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_291__0.txt @@ -0,0 +1,58 @@ +def f(a=1, /, b=2, *, c): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'b' + default: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 2 + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + name: 'c' + default: None + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_291__1.txt b/packages/bolt/tests/snapshots/bolt__parse_291__1.txt new file mode 100644 index 000000000..402342520 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_291__1.txt @@ -0,0 +1,23 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing, *, c): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = 2 + b = _bolt_var1 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_292__0.txt b/packages/bolt/tests/snapshots/bolt__parse_292__0.txt new file mode 100644 index 000000000..893e50fd5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_292__0.txt @@ -0,0 +1,62 @@ +def f(a=1, /, b=2, *, c=3): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=26, lineno=1, colno=27) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'b' + default: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 2 + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + name: 'c' + default: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 3 + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=32, lineno=2, colno=5) + end_location: SourceLocation(pos=36, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_292__1.txt b/packages/bolt/tests/snapshots/bolt__parse_292__1.txt new file mode 100644 index 000000000..28c41cf5e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_292__1.txt @@ -0,0 +1,26 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing, *, c=_bolt_helper_missing): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = 2 + b = _bolt_var1 + if c is _bolt_helper_missing: + _bolt_var2 = 3 + c = _bolt_var2 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_293__0.txt b/packages/bolt/tests/snapshots/bolt__parse_293__0.txt new file mode 100644 index 000000000..730b8dbf1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_293__0.txt @@ -0,0 +1,66 @@ +def f(a=1, /, b=2, *, c=3, **kwargs): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'b' + default: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 2 + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + + location: SourceLocation(pos=22, lineno=1, colno=23) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + name: 'c' + default: + + location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 3 + + location: SourceLocation(pos=27, lineno=1, colno=28) + end_location: SourceLocation(pos=35, lineno=1, colno=36) + name: 'kwargs' + + location: SourceLocation(pos=42, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=42, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_293__1.txt b/packages/bolt/tests/snapshots/bolt__parse_293__1.txt new file mode 100644 index 000000000..b9f47c19b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_293__1.txt @@ -0,0 +1,26 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing, *, c=_bolt_helper_missing, **kwargs): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = 2 + b = _bolt_var1 + if c is _bolt_helper_missing: + _bolt_var2 = 3 + c = _bolt_var2 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_294__0.txt b/packages/bolt/tests/snapshots/bolt__parse_294__0.txt new file mode 100644 index 000000000..7d90bf6e5 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_294__0.txt @@ -0,0 +1,67 @@ +def f(a=1, /, b=2, *args, c=3, **kwargs): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 1 + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'b' + default: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 2 + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + name: 'args' + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + name: 'c' + default: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + value: 3 + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=39, lineno=1, colno=40) + name: 'kwargs' + + location: SourceLocation(pos=46, lineno=2, colno=5) + end_location: SourceLocation(pos=50, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=46, lineno=2, colno=5) + end_location: SourceLocation(pos=50, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_294__1.txt b/packages/bolt/tests/snapshots/bolt__parse_294__1.txt new file mode 100644 index 000000000..0a27f1151 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_294__1.txt @@ -0,0 +1,26 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing, *args, c=_bolt_helper_missing, **kwargs): + if a is _bolt_helper_missing: + _bolt_var0 = 1 + a = _bolt_var0 + if b is _bolt_helper_missing: + _bolt_var1 = 2 + b = _bolt_var1 + if c is _bolt_helper_missing: + _bolt_var2 = 3 + c = _bolt_var2 + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_295__0.txt b/packages/bolt/tests/snapshots/bolt__parse_295__0.txt new file mode 100644 index 000000000..56b167672 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_295__0.txt @@ -0,0 +1,7 @@ +#>ERROR Positional marker can not appear directly at the beginning of the argument list. +# line 1, column 7 +# 1 | def g(/): +# : ^ +# 2 | pass +def g(/): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_296__0.txt b/packages/bolt/tests/snapshots/bolt__parse_296__0.txt new file mode 100644 index 000000000..358f0d7b6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_296__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected at least one named argument after bare variadic marker. +# line 1, column 7 +# 1 | def g(*): +# : ^ +# 2 | pass +def g(*): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_297__0.txt b/packages/bolt/tests/snapshots/bolt__parse_297__0.txt new file mode 100644 index 000000000..4b67aa619 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_297__0.txt @@ -0,0 +1,7 @@ +#>ERROR Positional marker can not appear directly at the beginning of the argument list. +# line 1, column 7 +# 1 | def g(/, *): +# : ^ +# 2 | pass +def g(/, *): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_298__0.txt b/packages/bolt/tests/snapshots/bolt__parse_298__0.txt new file mode 100644 index 000000000..46ab24f0f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_298__0.txt @@ -0,0 +1,7 @@ +#>ERROR Positional marker can not appear after variadic arguments. +# line 1, column 10 +# 1 | def g(*, /): +# : ^ +# 2 | pass +def g(*, /): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_299__0.txt b/packages/bolt/tests/snapshots/bolt__parse_299__0.txt new file mode 100644 index 000000000..c16fe5641 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_299__0.txt @@ -0,0 +1,7 @@ +#>ERROR Positional marker can not appear directly at the beginning of the argument list. +# line 1, column 7 +# 1 | def g(/, foo): +# : ^ +# 2 | pass +def g(/, foo): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_300__0.txt b/packages/bolt/tests/snapshots/bolt__parse_300__0.txt new file mode 100644 index 000000000..4d1e4cba0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_300__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected at least one named argument after bare variadic marker. +# line 1, column 12 +# 1 | def g(foo, *): +# : ^ +# 2 | pass +def g(foo, *): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_301__0.txt b/packages/bolt/tests/snapshots/bolt__parse_301__0.txt new file mode 100644 index 000000000..208555ca7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_301__0.txt @@ -0,0 +1,7 @@ +#>ERROR Variadic keyword arguments should not be followed by anything. +# line 1, column 17 +# 1 | def g(**kwargs, foo): +# : ^^^ +# 2 | pass +def g(**kwargs, foo): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_302__0.txt b/packages/bolt/tests/snapshots/bolt__parse_302__0.txt new file mode 100644 index 000000000..8197a3ea1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_302__0.txt @@ -0,0 +1,7 @@ +#>ERROR Positional marker already present in function signature. +# line 1, column 20 +# 1 | def g(foo, /, bar, /): +# : ^ +# 2 | pass +def g(foo, /, bar, /): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_303__0.txt b/packages/bolt/tests/snapshots/bolt__parse_303__0.txt new file mode 100644 index 000000000..355bc83b6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_303__0.txt @@ -0,0 +1,7 @@ +#>ERROR Variadic arguments already specified. +# line 1, column 24 +# 1 | def g(foo, *args, bar, *args): +# : ^ +# 2 | pass +def g(foo, *args, bar, *args): + pass diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md new file mode 100644 index 000000000..194a6c358 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md @@ -0,0 +1,3 @@ +# Lectern snapshot + +The data pack and resource pack are empty. From 632af62d3e81b8ab1e00fcc2a55daadaad0483b1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 Sep 2022 16:20:10 +0000 Subject: [PATCH 0985/1554] 0.18.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 99a1f7dc0..489fbe7e0 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.18.0 (2022-09-11) +### Feature +* Positional-only, variadic, keyword-only, and variadic keyword arguments ([`6413593`](https://github.com/mcbeet/bolt/commit/64135935c8f54dbde20807cba6481202dbf394e6)) + ## v0.17.7 (2022-08-16) ### Fix * Update beet ([`c494033`](https://github.com/mcbeet/bolt/commit/c494033639d389fb6a3165ddefa04d8dc3c4a08e)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index b59a5f723..c287ca095 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.17.7" +__version__ = "0.18.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 1c638f0f4..d973853db 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.17.7" +version = "0.18.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 728b5277816aa34eec1814488827bd47a3977c88 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 18:26:41 +0200 Subject: [PATCH 0986/1554] fix: update deps --- packages/bolt/bolt/codegen.py | 2 +- packages/bolt/package-lock.json | 14 ++++----- packages/bolt/package.json | 2 +- packages/bolt/poetry.lock | 53 ++++++++++++++------------------- packages/bolt/pyproject.toml | 10 +++---- 5 files changed, 36 insertions(+), 45 deletions(-) diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 1c2b40a3f..c2083fddf 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -347,7 +347,7 @@ def visit_multiple( ) -> Generator[AstNode, Optional[List[str]], Optional[str]]: """Yield all the nodes and return a single result pointing to the new children.""" current_count = 0 - collector = None + collector: Optional[ChildrenCollector] = None index = len(acc.lines) for i, child in enumerate(children): diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 8a87dc766..21f59452a 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.257" + "pyright": "^1.1.270" } }, "node_modules/pyright": { - "version": "1.1.257", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", - "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", + "version": "1.1.270", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", + "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.257", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.257.tgz", - "integrity": "sha512-r8dBY9Q/o6oM7n/xh0sruCNQ68PfKkXga6GXwghUIhLSo59ZPnQfeoNDHdAh1caGbb/NvQQXzF8C5KqruOYokg==", + "version": "1.1.270", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", + "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index e9a65459f..7df6475c3 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.257" + "pyright": "^1.1.270" } } diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 8d25c5aa5..2717dd709 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -1,11 +1,3 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" version = "21.4.0" @@ -22,20 +14,20 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "beet" -version = "0.71.0" +version = "0.71.2" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -click = ">=8.1.2,<9.0.0" +click = ">=8.1.3,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -Jinja2 = ">=3.1.1,<4.0.0" +Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.9.0,<0.10.0" -pydantic = ">=1.9.0,<2.0.0" +pathspec = ">=0.10.1,<0.11.0" +pydantic = ">=1.10.2,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" @@ -44,7 +36,7 @@ image = ["pillow"] [[package]] name = "black" -version = "22.6.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -364,15 +356,15 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.54.9" +version = "0.54.10" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.68.2" -tokenstream = "1.4.2" +beet = ">=0.71.0" +tokenstream = ">=1.4.2,<2.0.0" [[package]] name = "mypy-extensions" @@ -414,11 +406,11 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "pkginfo" @@ -473,18 +465,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" +version = "1.10.2" +description = "Data validation and settings management using python type hints" category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] -typing-extensions = ">=3.7.4.3" +typing-extensions = ">=4.1.0" [package.extras] -email = ["email-validator (>=1.0.3)"] dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" @@ -507,14 +499,13 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" @@ -556,7 +547,7 @@ autocompletion = ["argcomplete (>=1.10.0,<3)"] [[package]] name = "python-semantic-release" -version = "7.28.1" +version = "7.31.4" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -568,15 +559,16 @@ click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" invoke = ">=1.4.1,<2" +packaging = "*" python-gitlab = ">=2,<4" requests = ">=2.25,<3" semver = ">=2.10,<3" -tomlkit = ">=0.10.0,<0.11.0" +tomlkit = ">=0.10,<1.0" twine = ">=3,<4" [package.extras] dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)"] +docs = ["Sphinx (==1.3.6)", "Jinja2 (==3.0.3)"] mypy = ["mypy", "types-requests"] test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] @@ -825,10 +817,9 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "ec2b38e1e0d14fa5db7c21292f6b4654fcdd9b75c0b9c4e61344ec024bde0826" +content-hash = "9d88889d399c632dfe9fe7c7d1650e14e82ef08a34563051a15cfc8e8c1628a5" [metadata.files] -atomicwrites = [] attrs = [] beet = [] black = [] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index d973853db..e272332d2 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,14 +23,14 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.71.0" -mecha = ">=0.54.9" +beet = ">=0.71.2" +mecha = ">=0.54.10" [tool.poetry.dev-dependencies] -pytest = "^7.1.2" -black = "^22.6.0" +pytest = "^7.1.3" +black = "^22.8.0" isort = "^5.10.1" -python-semantic-release = "^7.28.1" +python-semantic-release = "^7.31.4" pytest-insta = "^0.1.11" lectern = ">=0.24.0" From 263d8d461ca0046c68d6e49cb3b6c7eca307b416 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 18:42:09 +0200 Subject: [PATCH 0987/1554] feat: make it possible to adjust the priority --- packages/mecha/mecha/database.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 6b3948102..2bf47e591 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -38,7 +38,7 @@ class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): index: Dict[str, TextFileBase[Any]] session: Set[TextFileBase[Any]] - queue: List[Tuple[int, str, int, TextFileBase[Any]]] + queue: List[Tuple[int, int, str, int, TextFileBase[Any]]] step: int current: TextFileBase[Any] count: int @@ -75,18 +75,24 @@ def setup_compilation(self): self.session.clear() self.queue.clear() - def enqueue(self, key: TextFileBase[Any], step: int = -1): + def enqueue(self, key: TextFileBase[Any], step: int = -1, adjust_priority: int = 0): """Enqueue a file and schedule it to be processed with the given step.""" self.session.add(key) self.count += 1 heappush( self.queue, - (step, self[key].resource_location or "", self.count, key), + ( + step, + adjust_priority, + self[key].resource_location or "", + self.count, + key, + ), ) def dequeue(self) -> Tuple[int, TextFileBase[Any]]: """Dequeue the next file that needs to be processed.""" - step, _, _, key = heappop(self.queue) + step, _, _, _, key = heappop(self.queue) return step, key def process_queue(self) -> Iterator[Tuple[int, TextFileBase[Any]]]: From 373c059f8201528edfea70291666e980cc96e416 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 Sep 2022 16:42:59 +0000 Subject: [PATCH 0988/1554] 0.55.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 18ddc424f..a15d87efb 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.55.0 (2022-09-11) +### Feature +* Make it possible to adjust the priority ([`4ef97c2`](https://github.com/mcbeet/mecha/commit/4ef97c2df858049fad23e07d97bf2791b6e3b33b)) + ## v0.54.10 (2022-09-11) ### Fix * Bump deps ([`ddfdf2e`](https://github.com/mcbeet/mecha/commit/ddfdf2ec4f8b77664e79ac436723dc1db910ffa6)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 4a93fb3ae..61a955e01 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.54.10" +__version__ = "0.55.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 98328c9d0..9d40be7c2 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.54.10" +version = "0.55.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From ceca1b997f21d07b6726cc35bc6fcd3e7577f6a5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 Sep 2022 16:44:42 +0000 Subject: [PATCH 0989/1554] 0.18.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 489fbe7e0..5bed5382f 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.18.1 (2022-09-11) +### Fix +* Update deps ([`89b37c1`](https://github.com/mcbeet/bolt/commit/89b37c1b1d5cac57b1fdc1f5bef0971c41dd3e1b)) + ## v0.18.0 (2022-09-11) ### Feature * Positional-only, variadic, keyword-only, and variadic keyword arguments ([`6413593`](https://github.com/mcbeet/bolt/commit/64135935c8f54dbde20807cba6481202dbf394e6)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index c287ca095..174f8b466 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.18.0" +__version__ = "0.18.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index e272332d2..edd26881d 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.18.0" +version = "0.18.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 8b8b7ee01feb7a09f4a16178c27df566eec6058a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 19:15:15 +0200 Subject: [PATCH 0990/1554] fix: store priority on compilation unit --- packages/mecha/mecha/api.py | 10 +++++++--- packages/mecha/mecha/database.py | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index c7a06e1af..47c6c0ee9 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -443,9 +443,13 @@ def compile( if not compilation_unit.ast: continue with self.steps[step].use_diagnostics(compilation_unit.diagnostics): - compilation_unit.ast = self.steps[step](compilation_unit.ast) - if compilation_unit.ast: - self.database.enqueue(function, step + 1) + if ast := self.steps[step](compilation_unit.ast): + compilation_unit.ast = ast + self.database.enqueue( + key=function, + step=step + 1, + priority=compilation_unit.priority, + ) elif not readonly: if not compilation_unit.ast: diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 2bf47e591..723234b63 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -23,6 +23,7 @@ class CompilationUnit: source: Optional[str] = None filename: Optional[str] = None resource_location: Optional[str] = None + priority: int = 0 diagnostics: DiagnosticCollection = extra_field(init=False) @@ -75,7 +76,7 @@ def setup_compilation(self): self.session.clear() self.queue.clear() - def enqueue(self, key: TextFileBase[Any], step: int = -1, adjust_priority: int = 0): + def enqueue(self, key: TextFileBase[Any], step: int = -1, priority: int = 0): """Enqueue a file and schedule it to be processed with the given step.""" self.session.add(key) self.count += 1 @@ -83,7 +84,7 @@ def enqueue(self, key: TextFileBase[Any], step: int = -1, adjust_priority: int = self.queue, ( step, - adjust_priority, + priority, self[key].resource_location or "", self.count, key, From a28114088a786ecf25115da182cbef5f60d69a12 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 Sep 2022 17:16:07 +0000 Subject: [PATCH 0991/1554] 0.55.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index a15d87efb..90824754a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.55.1 (2022-09-11) +### Fix +* Store priority on compilation unit ([`b78c5be`](https://github.com/mcbeet/mecha/commit/b78c5bea58daeb661974a69052b2494dcc4fa986)) + ## v0.55.0 (2022-09-11) ### Feature * Make it possible to adjust the priority ([`4ef97c2`](https://github.com/mcbeet/mecha/commit/4ef97c2df858049fad23e07d97bf2791b6e3b33b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 61a955e01..8c7321a70 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.55.0" +__version__ = "0.55.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9d40be7c2..0f8fe88b7 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.55.0" +version = "0.55.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 417657723c50cf3b1c38d1a7b408db222564d9dc Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 11 Sep 2022 21:12:38 +0200 Subject: [PATCH 0992/1554] feat: update compilation priority depending on execution order --- packages/bolt/bolt/module.py | 15 ++++++++---- packages/bolt/bolt/runtime.py | 8 ++++--- packages/bolt/examples/bolt_order/beet.yml | 9 ++++++++ .../src/data/hello/modules/entry_point.bolt | 3 +++ .../src/data/hello/modules/main.bolt | 8 +++++++ packages/bolt/poetry.lock | 4 ++-- packages/bolt/pyproject.toml | 2 +- .../examples__build_bolt_order__0.pack.md | 23 +++++++++++++++++++ 8 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 packages/bolt/examples/bolt_order/beet.yml create mode 100644 packages/bolt/examples/bolt_order/src/data/hello/modules/entry_point.bolt create mode 100644 packages/bolt/examples/bolt_order/src/data/hello/modules/main.bolt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index 424f36d87..bb4754ae2 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -92,6 +92,7 @@ class CompiledModule: executing: bool = False executed: bool = False execution_hooks: List[Callable[[], Any]] = field(default_factory=list) + execution_index: int = 0 @dataclass(frozen=True) @@ -115,7 +116,7 @@ def __call__( ... -@dataclass(frozen=True) +@dataclass class ModuleManager(Mapping[TextFileBase[Any], CompiledModule]): """Container for managing bolt modules.""" @@ -133,6 +134,8 @@ class ModuleManager(Mapping[TextFileBase[Any], CompiledModule]): globals: JsonDict = extra_field(default_factory=dict) builtins: Set[str] = extra_field(default_factory=set) + execution_count: int = 0 + @property def current(self) -> CompiledModule: """Return the currently executing module.""" @@ -153,8 +156,8 @@ def match_ast( self, node: AstRoot, current: Optional[Union[TextFileBase[Any], str]] = None, - ) -> CompiledModule: - """Return executable module for the current ast.""" + ) -> Tuple[CompilationUnit, CompiledModule]: + """Return the compilation unit and executable module for the current ast.""" if not current: current = self.database.current elif isinstance(current, str): @@ -163,7 +166,7 @@ def match_ast( compilation_unit = self.database[current] compilation_unit.ast = node - return self[current] + return compilation_unit, self[current] def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: if isinstance(current, str): @@ -279,6 +282,8 @@ def eval(self, module: CompiledModule) -> AstRoot: finally: module.executing = False self.stack.pop() + self.execution_count += 1 + module.execution_index = self.execution_count return module.namespace[module.output] @@ -369,7 +374,7 @@ def load(self, f: BufferedReader) -> AstRoot: return data["ast"] def dump(self, node: AstRoot, f: BufferedWriter): - module = self.modules.match_ast(node) + _, module = self.modules.match_ast(node) self.dump_data( { diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index b8002fd26..94dbca9aa 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -184,7 +184,7 @@ def add_entrypoint(self, *args: Union[str, Iterable[str]]): @rule(AstRoot) @internal def root(self, node: AstRoot) -> Optional[AstRoot]: - module = self.modules.match_ast(node) + compilation_unit, module = self.modules.match_ast(node) if ( isinstance(node, AstModuleRoot) @@ -205,12 +205,14 @@ def root(self, node: AstRoot) -> Optional[AstRoot]: with self.modules.error_handler( "Top-level statement raised an exception.", module.resource_location ): - return self.modules.eval(module) + node = self.modules.eval(module) + compilation_unit.priority = module.execution_index + return node def restore_module(self, key: TextFileBase[Any], node: AstModuleRoot, step: int): compilation_unit = self.modules.database[key] compilation_unit.ast = node - self.modules.database.enqueue(key, step) + self.modules.database.enqueue(key, step, compilation_unit.priority) @rule(AstModuleRoot) diff --git a/packages/bolt/examples/bolt_order/beet.yml b/packages/bolt/examples/bolt_order/beet.yml new file mode 100644 index 000000000..60c43158a --- /dev/null +++ b/packages/bolt/examples/bolt_order/beet.yml @@ -0,0 +1,9 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha +meta: + bolt: + entrypoint: hello:entry_point diff --git a/packages/bolt/examples/bolt_order/src/data/hello/modules/entry_point.bolt b/packages/bolt/examples/bolt_order/src/data/hello/modules/entry_point.bolt new file mode 100644 index 000000000..dfd085f5c --- /dev/null +++ b/packages/bolt/examples/bolt_order/src/data/hello/modules/entry_point.bolt @@ -0,0 +1,3 @@ +from hello:main import i_run_last + +i_run_last() diff --git a/packages/bolt/examples/bolt_order/src/data/hello/modules/main.bolt b/packages/bolt/examples/bolt_order/src/data/hello/modules/main.bolt new file mode 100644 index 000000000..eedb32a8e --- /dev/null +++ b/packages/bolt/examples/bolt_order/src/data/hello/modules/main.bolt @@ -0,0 +1,8 @@ +def i_run_last(): + print(2) + append function hello:world: + say second + +print(1) +append function hello:world: + say first diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 2717dd709..dacc922c4 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -356,7 +356,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.54.10" +version = "0.55.1" description = "A powerful Minecraft command library" category = "main" optional = false @@ -817,7 +817,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9d88889d399c632dfe9fe7c7d1650e14e82ef08a34563051a15cfc8e8c1628a5" +content-hash = "3e6fdc6222ef765be16fdd361efd33602f0ae0bd866a7aa2fec3fec1f5c55fbc" [metadata.files] attrs = [] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index edd26881d..6389e41aa 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" beet = ">=0.71.2" -mecha = ">=0.54.10" +mecha = ">=0.55.1" [tool.poetry.dev-dependencies] pytest = "^7.1.3" diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md new file mode 100644 index 000000000..1f809e4bf --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md @@ -0,0 +1,23 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### hello + +`@function hello:world` + +```mcfunction +say first +say second +``` From d5f371775261d5b8bad83cc44522de0ae658b324 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 Sep 2022 19:20:36 +0000 Subject: [PATCH 0993/1554] 0.19.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 5bed5382f..664fa5e6c 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.19.0 (2022-09-11) +### Feature +* Update compilation priority depending on execution order ([`d6aa9ec`](https://github.com/mcbeet/bolt/commit/d6aa9ecf55027e411889459986d79123239ec81b)) + ## v0.18.1 (2022-09-11) ### Fix * Update deps ([`89b37c1`](https://github.com/mcbeet/bolt/commit/89b37c1b1d5cac57b1fdc1f5bef0971c41dd3e1b)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 174f8b466..6af12c22b 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.18.1" +__version__ = "0.19.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 6389e41aa..f95cb27ae 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.18.1" +version = "0.19.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 14dae9de571afe64447775d938a2e71480fce0fd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 13 Sep 2022 01:06:28 +0200 Subject: [PATCH 0994/1554] fix: add error for non-default args following default args --- packages/bolt/bolt/parse.py | 7 +++ .../examples/bolt_function_signature/beet.yml | 2 +- .../bolt_function_signature/foo.mcfunction | 4 +- .../tests/resources/bolt_examples.mcfunction | 7 ++- .../tests/snapshots/bolt__parse_288__0.txt | 32 ++++++------- .../tests/snapshots/bolt__parse_288__1.txt | 8 +--- .../tests/snapshots/bolt__parse_291__0.txt | 46 ++++++++----------- .../tests/snapshots/bolt__parse_291__1.txt | 11 +---- .../tests/snapshots/bolt__parse_304__0.txt | 7 +++ ...__build_bolt_function_signature__0.pack.md | 21 ++++++++- 10 files changed, 79 insertions(+), 66 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_304__0.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 0077911f9..e256306d0 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1039,6 +1039,7 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: new_locals: Set[str] = set() encountered_positional = False + encountered_default = False encountered_variadic = False encountered_variadic_keyword = False expect_named_argument = False @@ -1077,10 +1078,16 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: default = None if stream.get("equal"): + encountered_default = True with stream.provide( identifiers=scoped_identifiers | new_locals ): default = delegate("bolt:expression", stream) + elif encountered_default: + exc = InvalidSyntax( + "Argument without default can not appear after arguments with default values." + ) + raise set_location(exc, token) argument = AstFunctionSignatureArgument( name=name.value, diff --git a/packages/bolt/examples/bolt_function_signature/beet.yml b/packages/bolt/examples/bolt_function_signature/beet.yml index 2bf157f4b..96d33d4a9 100644 --- a/packages/bolt/examples/bolt_function_signature/beet.yml +++ b/packages/bolt/examples/bolt_function_signature/beet.yml @@ -2,6 +2,6 @@ require: - bolt data_pack: load: - data/demo/functions/foo: "foo.mcfunction" + data/demo/functions/foo.mcfunction: "foo.mcfunction" pipeline: - mecha diff --git a/packages/bolt/examples/bolt_function_signature/foo.mcfunction b/packages/bolt/examples/bolt_function_signature/foo.mcfunction index 7381de99f..c5a866cd0 100644 --- a/packages/bolt/examples/bolt_function_signature/foo.mcfunction +++ b/packages/bolt/examples/bolt_function_signature/foo.mcfunction @@ -13,7 +13,7 @@ def f(a=1,): def f(a=1, /): pass -def f(a=1, /, b): +def f(a, /, b): pass def f(a=1, /, b=2): @@ -22,7 +22,7 @@ def f(a=1, /, b=2): def f(a=1, /, b=2, *args): pass -def f(a=1, /, b=2, *, c): +def f(a, /, b, *, c): pass def f(a=1, /, b=2, *, c=3): diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 4b3238d3a..e1baad8fe 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1056,7 +1056,7 @@ def f(a=1,): def f(a=1, /): pass ### -def f(a=1, /, b): +def f(a, /, b): pass ### def f(a=1, /, b=2): @@ -1065,7 +1065,7 @@ def f(a=1, /, b=2): def f(a=1, /, b=2, *args): pass ### -def f(a=1, /, b=2, *, c): +def f(a, /, b, *, c): pass ### def f(a=1, /, b=2, *, c=3): @@ -1103,3 +1103,6 @@ def g(foo, /, bar, /): ### def g(foo, *args, bar, *args): pass +### +def g(a=1, b): + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_288__0.txt b/packages/bolt/tests/snapshots/bolt__parse_288__0.txt index a3a04a1ab..fd14ed149 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_288__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_288__0.txt @@ -1,46 +1,42 @@ -def f(a=1, /, b): +def f(a, /, b): pass --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=9) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=9) identifier: 'def:function:body' arguments: location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=14, lineno=1, colno=15) decorators: name: 'f' arguments: location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'a' - default: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 1 + default: None - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) - location: SourceLocation(pos=14, lineno=1, colno=15) - end_location: SourceLocation(pos=15, lineno=1, colno=16) + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'b' default: None - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=9) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=9) commands: - location: SourceLocation(pos=22, lineno=2, colno=5) - end_location: SourceLocation(pos=26, lineno=2, colno=9) + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=9) identifier: 'pass' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_288__1.txt b/packages/bolt/tests/snapshots/bolt__parse_288__1.txt index 18208bc0c..470cd8057 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_288__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_288__1.txt @@ -1,12 +1,8 @@ _bolt_lineno = [1], [1] -_bolt_helper_missing = _bolt_runtime.helpers['missing'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var0: - def f(a=_bolt_helper_missing, /, b): - if a is _bolt_helper_missing: - _bolt_var0 = 1 - a = _bolt_var0 + def f(a, /, b): pass _bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- @@ -15,6 +11,6 @@ output = _bolt_var1 _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=26, lineno=2, colno=9) + end_location: SourceLocation(pos=24, lineno=2, colno=9) commands: diff --git a/packages/bolt/tests/snapshots/bolt__parse_291__0.txt b/packages/bolt/tests/snapshots/bolt__parse_291__0.txt index 4168f7137..e58294def 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_291__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_291__0.txt @@ -1,58 +1,50 @@ -def f(a=1, /, b=2, *, c): +def f(a, /, b, *, c): pass --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=30, lineno=2, colno=9) commands: location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=30, lineno=2, colno=9) identifier: 'def:function:body' arguments: location: SourceLocation(pos=4, lineno=1, colno=5) - end_location: SourceLocation(pos=24, lineno=1, colno=25) + end_location: SourceLocation(pos=20, lineno=1, colno=21) decorators: name: 'f' arguments: location: SourceLocation(pos=6, lineno=1, colno=7) - end_location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'a' - default: - - location: SourceLocation(pos=8, lineno=1, colno=9) - end_location: SourceLocation(pos=9, lineno=1, colno=10) - value: 1 + default: None - location: SourceLocation(pos=11, lineno=1, colno=12) - end_location: SourceLocation(pos=12, lineno=1, colno=13) + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) - location: SourceLocation(pos=14, lineno=1, colno=15) - end_location: SourceLocation(pos=17, lineno=1, colno=18) + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'b' - default: - - location: SourceLocation(pos=16, lineno=1, colno=17) - end_location: SourceLocation(pos=17, lineno=1, colno=18) - value: 2 + default: None - location: SourceLocation(pos=19, lineno=1, colno=20) - end_location: SourceLocation(pos=20, lineno=1, colno=21) + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=16, lineno=1, colno=17) - location: SourceLocation(pos=22, lineno=1, colno=23) - end_location: SourceLocation(pos=23, lineno=1, colno=24) + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=19, lineno=1, colno=20) name: 'c' default: None - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=34, lineno=2, colno=9) + location: SourceLocation(pos=26, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=9) commands: - location: SourceLocation(pos=30, lineno=2, colno=5) - end_location: SourceLocation(pos=34, lineno=2, colno=9) + location: SourceLocation(pos=26, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=9) identifier: 'pass' arguments: diff --git a/packages/bolt/tests/snapshots/bolt__parse_291__1.txt b/packages/bolt/tests/snapshots/bolt__parse_291__1.txt index 402342520..8c85fa298 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_291__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_291__1.txt @@ -1,15 +1,8 @@ _bolt_lineno = [1], [1] -_bolt_helper_missing = _bolt_runtime.helpers['missing'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var0: - def f(a=_bolt_helper_missing, /, b=_bolt_helper_missing, *, c): - if a is _bolt_helper_missing: - _bolt_var0 = 1 - a = _bolt_var0 - if b is _bolt_helper_missing: - _bolt_var1 = 2 - b = _bolt_var1 + def f(a, /, b, *, c): pass _bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- @@ -18,6 +11,6 @@ output = _bolt_var1 _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=30, lineno=2, colno=9) commands: diff --git a/packages/bolt/tests/snapshots/bolt__parse_304__0.txt b/packages/bolt/tests/snapshots/bolt__parse_304__0.txt new file mode 100644 index 000000000..4e49ab156 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_304__0.txt @@ -0,0 +1,7 @@ +#>ERROR Argument without default can not appear after arguments with default values. +# line 1, column 12 +# 1 | def g(a=1, b): +# : ^ +# 2 | pass +def g(a=1, b): + pass diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md index 194a6c358..631aa3105 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md @@ -1,3 +1,22 @@ # Lectern snapshot -The data pack and resource pack are empty. +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function(strip_final_newline) demo:foo` + +```mcfunction + +``` From aec6ead7e047aa1e150c83fc6bbe2bd9fcd94be0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 12 Sep 2022 23:07:09 +0000 Subject: [PATCH 0995/1554] 0.19.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 664fa5e6c..d0e52bd83 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.19.1 (2022-09-12) +### Fix +* Add error for non-default args following default args ([`2af9854`](https://github.com/mcbeet/bolt/commit/2af9854d91818804b642ffe2a7b625a6412665ec)) + ## v0.19.0 (2022-09-11) ### Feature * Update compilation priority depending on execution order ([`d6aa9ec`](https://github.com/mcbeet/bolt/commit/d6aa9ecf55027e411889459986d79123239ec81b)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 6af12c22b..3f51d1129 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.19.0" +__version__ = "0.19.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f95cb27ae..f1e938000 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.19.0" +version = "0.19.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From d6f2bd2b2074746470a18259634a35ac0ddb90da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 13 Sep 2022 01:42:48 +0200 Subject: [PATCH 0996/1554] feat: improve formatting options --- .../mecha/examples/basic_formatting/beet.yml | 41 +++++++++++ .../examples/basic_formatting/foo.mcfunction | 14 ++++ packages/mecha/mecha/api.py | 48 ++++++++++--- packages/mecha/mecha/serialize.py | 48 +++++++++---- ...xamples__build_basic_formatting__0.pack.md | 72 +++++++++++++++++++ 5 files changed, 199 insertions(+), 24 deletions(-) create mode 100644 packages/mecha/examples/basic_formatting/beet.yml create mode 100644 packages/mecha/examples/basic_formatting/foo.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md diff --git a/packages/mecha/examples/basic_formatting/beet.yml b/packages/mecha/examples/basic_formatting/beet.yml new file mode 100644 index 000000000..9f22f1da8 --- /dev/null +++ b/packages/mecha/examples/basic_formatting/beet.yml @@ -0,0 +1,41 @@ +pipeline: + - data_pack: + load: + data/demo/functions/minify.mcfunction: foo.mcfunction + pipeline: + - mecha + meta: + mecha: + multiline: true + formatting: minify + - data_pack: + load: + data/demo/functions/dense.mcfunction: foo.mcfunction + pipeline: + - mecha + meta: + mecha: + multiline: true + formatting: dense + - data_pack: + load: + data/demo/functions/preserve.mcfunction: foo.mcfunction + pipeline: + - mecha + meta: + mecha: + multiline: true + formatting: preserve + - data_pack: + load: + data/demo/functions/funky.mcfunction: foo.mcfunction + pipeline: + - mecha + meta: + mecha: + multiline: true + formatting: + layout: preserve + nbt_compact: true + json_ensure_ascii: false + json_sort_keys: true diff --git a/packages/mecha/examples/basic_formatting/foo.mcfunction b/packages/mecha/examples/basic_formatting/foo.mcfunction new file mode 100644 index 000000000..eacebe97b --- /dev/null +++ b/packages/mecha/examples/basic_formatting/foo.mcfunction @@ -0,0 +1,14 @@ +say this is a test + +# Random stuff +execute + as @a[nbt={SelectedItem: {id: "minecraft:diamond", Count: 64b}}] + at @s # This is important + run setblock ~ ~ ~ repeater[delay=3, facing=south] + +tellraw @a ["", + {"text": "hello", "color": "red"}, + "not ascii: ¶", +] + +say goodbye diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 47c6c0ee9..6af5f32b5 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -2,6 +2,7 @@ "Mecha", "MechaOptions", "AstCacheBackend", + "FORMATTING_PRESETS", ] @@ -42,7 +43,7 @@ extra_field, import_from_string, ) -from pydantic import BaseModel +from pydantic import BaseModel, validator from tokenstream import InvalidSyntax, TokenStream from tokenstream.location import set_location @@ -57,7 +58,7 @@ ) from .dispatch import Dispatcher, MutatingReducer, Reducer from .parse import delegate, get_parsers -from .serialize import Formatting, Serializer +from .serialize import FormattingOptions, Serializer from .spec import CommandSpec AstNodeType = TypeVar("AstNodeType", bound=AstNode) @@ -95,17 +96,40 @@ def dump(self, node: AstRoot, f: BufferedWriter): self.dump_data({"ast": node}, f) +FORMATTING_PRESETS: Dict[str, JsonDict] = { + "minify": { + "layout": "dense", + "cmd_compact": True, + "nbt_compact": True, + "json_compact": True, + }, + "dense": { + "layout": "dense", + }, + "preserve": { + "layout": "preserve", + }, +} + + class MechaOptions(BaseModel): """Mecha options.""" version: str = "" multiline: bool = False - formatting: Formatting = "dense" + formatting: FormattingOptions = FormattingOptions() readonly: Optional[bool] = None match: Optional[List[str]] = None rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} cache: bool = True + @validator("formatting", pre=True) + def formatting_preset(cls, value: Any): + if isinstance(value, str): + assert value in FORMATTING_PRESETS, "invalid formatting preset" + return FORMATTING_PRESETS[value] + return value + @dataclass class Mecha: @@ -114,7 +138,7 @@ class Mecha: ctx: InitVar[Optional[Context]] = None version: InitVar[VersionNumber] = LATEST_MINECRAFT_VERSION multiline: InitVar[bool] = False - formatting: InitVar[Formatting] = "dense" + formatting: InitVar[Optional[FormattingOptions]] = None readonly: bool = False match: Optional[List[str]] = None @@ -147,7 +171,7 @@ def __post_init__( ctx: Optional[Context], version: VersionNumber, multiline: bool, - formatting: Formatting, + formatting: Optional[FormattingOptions], ): if ctx: opts = ctx.validate("mecha", MechaOptions) @@ -195,7 +219,7 @@ def __post_init__( self.serialize = Serializer( spec=self.spec, database=self.database, - formatting=formatting, + formatting=formatting or FormattingOptions(), ) @contextmanager @@ -330,7 +354,7 @@ def compile( *, match: Optional[List[str]] = None, multiline: Optional[bool] = None, - formatting: Optional[Formatting] = None, + formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> DataPack: @@ -344,7 +368,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, - formatting: Optional[Formatting] = None, + formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> TextFileType: @@ -358,7 +382,7 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, - formatting: Optional[Formatting] = None, + formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Function: @@ -372,13 +396,15 @@ def compile( filename: Optional[FileSystemPath] = None, resource_location: Optional[str] = None, multiline: Optional[bool] = None, - formatting: Optional[Formatting] = None, + formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, report: Optional[DiagnosticCollection] = None, ) -> Union[DataPack, TextFileBase[Any]]: """Apply all compilation steps.""" self.database.setup_compilation() + if formatting is None: + formatting = {} if readonly is None: readonly = self.readonly @@ -455,7 +481,7 @@ def compile( if not compilation_unit.ast: continue with self.serialize.use_diagnostics(compilation_unit.diagnostics): - function.text = self.serialize(compilation_unit.ast, formatting) + function.text = self.serialize(compilation_unit.ast, **formatting) diagnostics = DiagnosticCollection( [ diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 5ff4582e6..7b3c810a1 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -1,15 +1,16 @@ __all__ = [ "Serializer", - "Formatting", + "FormattingOptions", ] import json import re from dataclasses import dataclass, field -from typing import Any, Iterable, Iterator, List, Literal, Optional +from typing import Any, Iterable, Iterator, List, Literal from beet.core.utils import required_field +from pydantic import BaseModel from .ast import ( AstBlock, @@ -54,7 +55,16 @@ REGEX_COMMENTS = re.compile(r"^(?:(\s*#.*)|.+)", re.MULTILINE) -Formatting = Literal["dense", "preserve"] +class FormattingOptions(BaseModel): + """Formatting options.""" + + layout: Literal["dense", "preserve"] = "dense" + cmd_compact: bool = False + nbt_compact: bool = False + json_compact: bool = False + json_ensure_ascii: bool = True + json_allow_nan: bool = True + json_sort_keys: bool = False @dataclass @@ -62,7 +72,7 @@ class Serializer(Visitor): spec: CommandSpec = required_field() database: CompilationDatabase = field(default_factory=CompilationDatabase) - formatting: Formatting = "dense" + formatting: FormattingOptions = field(default_factory=FormattingOptions) regex_comments: "re.Pattern[str]" = field(default=REGEX_COMMENTS) quote_helper: QuoteHelper = field( @@ -77,17 +87,20 @@ class Serializer(Visitor): ) ) - def __call__(self, node: AstNode, formatting: Optional[Formatting] = None) -> str: + def __call__(self, node: AstNode, **kwargs: Any) -> str: result: List[str] = [] - if formatting is not None: - self.formatting, formatting = formatting, self.formatting + previous_formatting = self.formatting if kwargs else None + if previous_formatting: + options = previous_formatting.dict() + options.update(kwargs) + self.formatting = FormattingOptions.parse_obj(options) try: self.invoke(node, result) finally: - if formatting is not None: - self.formatting = formatting + if previous_formatting: + self.formatting = previous_formatting return "".join(result) @@ -99,10 +112,11 @@ def collection( ) -> Iterator[AstNode]: """Helper for serializing collections.""" result.append(delimitters[0]) + comma = "," if self.formatting.cmd_compact else ", " sep = "" for node in nodes: result.append(sep) - sep = ", " + sep = comma yield node result.append(delimitters[-1]) @@ -131,7 +145,7 @@ def aggregate(self, node: AstNode, result: List[str]): def root(self, node: AstRoot, result: List[str]): pos = 0 source = ( - self.formatting == "preserve" + self.formatting.layout == "preserve" and self.database[self.database.current].source ) @@ -203,11 +217,19 @@ def coordinate(self, node: AstCoordinate, result: List[str]): @rule(AstJson) def json(self, node: AstJson, result: List[str]): - result.append(json.dumps(node.evaluate())) + result.append( + json.dumps( + node.evaluate(), + separators=(",", ":") if self.formatting.json_compact else None, + ensure_ascii=self.formatting.json_ensure_ascii, + allow_nan=self.formatting.json_allow_nan, + sort_keys=self.formatting.json_sort_keys, + ) + ) @rule(AstNbt) def nbt(self, node: AstNbt, result: List[str]): - result.append(node.evaluate().snbt()) + result.append(node.evaluate().snbt(compact=self.formatting.nbt_compact)) @rule(AstResourceLocation) def resource_location(self, node: AstResourceLocation, result: List[str]): diff --git a/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md new file mode 100644 index 000000000..631e2d7f0 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md @@ -0,0 +1,72 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:minify` + +```mcfunction +say this is a test +execute as @a[nbt={SelectedItem:{id:"minecraft:diamond",Count:64b}}] at @s run setblock ~ ~ ~ repeater[delay=3,facing=south] +tellraw @a ["",{"text":"hello","color":"red"},"not ascii: \u00b6"] +say goodbye +``` + +`@function demo:dense` + +```mcfunction +say this is a test +execute as @a[nbt={SelectedItem: {id: "minecraft:diamond", Count: 64b}}] at @s run setblock ~ ~ ~ repeater[delay=3, facing=south] +tellraw @a ["", {"text": "hello", "color": "red"}, "not ascii: \u00b6"] +say goodbye +``` + +`@function demo:preserve` + +```mcfunction +say this is a test + +# Random stuff +execute as @a[nbt={SelectedItem: {id: "minecraft:diamond", Count: 64b}}] at @s run setblock ~ ~ ~ repeater[delay=3, facing=south] + + + + +tellraw @a ["", {"text": "hello", "color": "red"}, "not ascii: \u00b6"] + + + + +say goodbye +``` + +`@function demo:funky` + +```mcfunction +say this is a test + +# Random stuff +execute as @a[nbt={SelectedItem:{id:"minecraft:diamond",Count:64b}}] at @s run setblock ~ ~ ~ repeater[delay=3, facing=south] + + + + +tellraw @a ["", {"color": "red", "text": "hello"}, "not ascii: ¶"] + + + + +say goodbye +``` From 72a2b909445449026f3ad8417c62beeb883a9038 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 12 Sep 2022 23:43:36 +0000 Subject: [PATCH 0997/1554] 0.56.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 90824754a..f825202b7 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.56.0 (2022-09-12) +### Feature +* Improve formatting options ([`150be65`](https://github.com/mcbeet/mecha/commit/150be6570ef7e178347d818958e31cb395de9c52)) + ## v0.55.1 (2022-09-11) ### Fix * Store priority on compilation unit ([`b78c5be`](https://github.com/mcbeet/mecha/commit/b78c5bea58daeb661974a69052b2494dcc4fa986)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 8c7321a70..3256b525c 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.55.1" +__version__ = "0.56.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0f8fe88b7..21498e1ba 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.55.1" +version = "0.56.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 0079b666324f9820b7833cc9ec4fc0ecbcb59ed4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 17 Sep 2022 05:30:21 +0200 Subject: [PATCH 0998/1554] fix: properly convert serialized content --- packages/lectern/lectern/fragment.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/lectern/lectern/fragment.py b/packages/lectern/lectern/fragment.py index a62c0311d..786d4a07d 100644 --- a/packages/lectern/lectern/fragment.py +++ b/packages/lectern/lectern/fragment.py @@ -81,10 +81,16 @@ def as_file(self, file_type: Type[FileType]) -> FileType: def as_file(self, file_type: Type[File[Any, Any]] = BinaryFile) -> File[Any, Any]: """Retrieve the content of the fragment as a file.""" + is_binary = issubclass(file_type, BinaryFileBase) + if self.file: - return file_type(self.file.ensure_serialized()) + content = self.file.ensure_serialized() + if is_binary and isinstance(content, str): + content = content.encode() + elif not is_binary and isinstance(content, bytes): + content = content.decode() + return file_type(content) - is_binary = issubclass(file_type, BinaryFileBase) content = self.content if content is not None and self.modifier == "base64": From c52dfac1510658045f389f03cb68f97097ed8357 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 17 Sep 2022 05:30:58 +0200 Subject: [PATCH 0999/1554] chore: update dependencies --- packages/lectern/package-lock.json | 14 +- packages/lectern/package.json | 2 +- packages/lectern/poetry.lock | 1082 +++++++++++++++------------- packages/lectern/pyproject.toml | 8 +- 4 files changed, 574 insertions(+), 532 deletions(-) diff --git a/packages/lectern/package-lock.json b/packages/lectern/package-lock.json index 997dd959d..7a4a85e08 100644 --- a/packages/lectern/package-lock.json +++ b/packages/lectern/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.254" + "pyright": "^1.1.271" } }, "node_modules/pyright": { - "version": "1.1.254", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", - "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", + "version": "1.1.271", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.271.tgz", + "integrity": "sha512-46QQLQLT5U+wmKqG9R193loBASqqcIZYwWrwTCWNTHIRYTxEbaHwGWDlmX19R3lmlIBDu9I9m5MyPmYs/2v5dg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.254", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.254.tgz", - "integrity": "sha512-YDbIqr55EkwRCFSVjWxj8KOwBTMVK1U3HLLdqp+W3n+88S31YbRERrCni9izmtt5i4wnuhf7oRI/9K8KwLxmgQ==", + "version": "1.1.271", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.271.tgz", + "integrity": "sha512-46QQLQLT5U+wmKqG9R193loBASqqcIZYwWrwTCWNTHIRYTxEbaHwGWDlmX19R3lmlIBDu9I9m5MyPmYs/2v5dg==", "dev": true } } diff --git a/packages/lectern/package.json b/packages/lectern/package.json index ce423b29d..d96a77818 100644 --- a/packages/lectern/package.json +++ b/packages/lectern/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.254" + "pyright": "^1.1.271" } } diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 4b7ad7164..d8d2ee958 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -1,50 +1,42 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" -version = "21.2.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "beet" -version = "0.68.2" +version = "0.72.1" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -click = ">=8.1.2,<9.0.0" +click = ">=8.1.3,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -Jinja2 = ">=3.1.1,<4.0.0" +Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.9.0,<0.10.0" -pydantic = ">=1.9.0,<2.0.0" +pathspec = ">=0.10.1,<0.11.0" +pydantic = ">=1.10.2,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" [package.extras] -image = ["pillow"] +image = ["Pillow"] [[package]] name = "black" -version = "22.3.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -55,7 +47,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -66,28 +58,31 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "4.1.0" +version = "5.0.1" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -packaging = "*" six = ">=1.9.0" webencodings = "*" +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] +dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] + [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.9.14" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.15.0" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -98,11 +93,11 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.7" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -134,7 +129,7 @@ dev = ["pytest"] [[package]] name = "click-log" -version = "0.3.2" +version = "0.4.0" description = "Logging integration for Click" category = "dev" optional = false @@ -145,7 +140,7 @@ click = "*" [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -153,7 +148,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "35.0.0" +version = "38.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -164,34 +159,31 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "docutils" -version = "0.17.1" +version = "0.19" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [[package]] name = "dotty-dict" -version = "1.3.0" +version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." category = "dev" optional = false -python-versions = "*" - -[package.dependencies] -setuptools_scm = "*" +python-versions = ">=3.5,<4.0" [[package]] name = "gitdb" -version = "4.0.8" +version = "4.0.9" description = "Git Object Database" category = "dev" optional = false @@ -201,8 +193,8 @@ python-versions = ">=3.6" smmap = ">=3.0.1,<6" [[package]] -name = "gitpython" -version = "3.1.24" +name = "GitPython" +version = "3.1.27" description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false @@ -210,11 +202,10 @@ python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -222,19 +213,19 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.8.1" +version = "4.12.0" description = "Read metadata from Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -246,7 +237,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.6.0" +version = "1.7.1" description = "Pythonic task execution" category = "dev" optional = false @@ -261,26 +252,41 @@ optional = false python-versions = ">=3.6.1,<4.0" [package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jaraco.classes" +version = "3.2.2" +description = "Utility functions for Python class constructs" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "jeepney" -version = "0.7.1" +version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] -name = "jinja2" -version = "3.1.1" +name = "Jinja2" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false @@ -294,21 +300,22 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.2.1" +version = "23.9.1" description = "Store and access your passwords safely." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -importlib-metadata = ">=3.6" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +"jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "markdown-it-py" @@ -328,24 +335,32 @@ compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistlet linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "markupsafe" -version = "2.0.1" +name = "MarkupSafe" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mdurl" -version = "0.1.0" +version = "0.1.2" description = "Markdown URL utilities" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[[package]] +name = "more-itertools" +version = "8.14.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.5" [[package]] name = "mypy-extensions" @@ -368,52 +383,52 @@ numpy = "*" [[package]] name = "numpy" -version = "1.21.1" +version = "1.23.3" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [[package]] name = "packaging" -version = "21.0" +version = "21.3" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "pkginfo" -version = "1.7.1" +version = "1.8.3" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] -testing = ["nose", "coverage"] +testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.4.0" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] @@ -430,15 +445,15 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycparser" -version = "2.20" +version = "2.21" description = "C parser in Python" category = "dev" optional = false @@ -446,45 +461,50 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" +version = "1.10.2" +description = "Data validation and settings management using python type hints" category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] -typing-extensions = ">=3.7.4.3" +typing-extensions = ">=4.1.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] [[package]] -name = "pygments" -version = "2.10.0" +name = "Pygments" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" @@ -510,23 +530,23 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "2.10.1" +version = "3.9.0" description = "Interact with GitLab API" category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" [package.dependencies] requests = ">=2.25.0" requests-toolbelt = ">=0.9.1" [package.extras] -autocompletion = ["argcomplete (>=1.10.0,<2)"] +autocompletion = ["argcomplete (>=1.10.0,<3)"] yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.27.1" +version = "7.31.4" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -538,17 +558,19 @@ click-log = ">=0.3,<1" dotty-dict = ">=1.3.0,<2" gitpython = ">=3.0.8,<4" invoke = ">=1.4.1,<2" +packaging = "*" python-gitlab = ">=2,<4" requests = ">=2.25,<3" semver = ">=2.10,<3" -tomlkit = ">=0.10.0,<0.11.0" +tomlkit = ">=0.10,<1.0" twine = ">=3,<4" +wheel = "*" [package.extras] -dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)"] +dev = ["black", "isort", "tox"] +docs = ["Jinja2 (==3.0.3)", "Sphinx (==1.3.6)"] mypy = ["mypy", "types-requests"] -test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] +test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=5,<6)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] [[package]] name = "pywin32-ctypes" @@ -559,7 +581,7 @@ optional = false python-versions = "*" [[package]] -name = "pyyaml" +name = "PyYAML" version = "6.0" description = "YAML parser and emitter for Python" category = "main" @@ -568,11 +590,11 @@ python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "30.0" +version = "37.1" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] bleach = ">=2.1.0" @@ -580,25 +602,25 @@ docutils = ">=0.13.1" Pygments = ">=2.5.1" [package.extras] -md = ["cmarkgfm (>=0.5.0,<0.7.0)"] +md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.26.0" +version = "2.28.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" @@ -613,18 +635,18 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rfc3986" -version = "1.5.0" +version = "2.0.0" description = "Validating URI References per RFC 3986" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.extras] idna2008 = ["idna"] [[package]] -name = "secretstorage" -version = "3.3.1" +name = "SecretStorage" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false @@ -642,21 +664,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "setuptools-scm" -version = "6.3.2" -description = "the blessed package to manage your versions by scm tags" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = ">=20.0" -tomli = ">=1.0.0" - -[package.extras] -toml = ["setuptools (>=42)", "tomli (>=1.0.0)"] - [[package]] name = "six" version = "1.16.0" @@ -683,15 +690,15 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.1" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.10.1" +version = "0.11.4" description = "Style preserving TOML library" category = "dev" optional = false @@ -699,7 +706,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "tqdm" -version = "4.62.3" +version = "4.64.1" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -711,11 +718,12 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "twine" -version = "3.4.2" +version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -725,32 +733,33 @@ python-versions = ">=3.6" colorama = ">=0.4.3" importlib-metadata = ">=3.6" keyring = ">=15.1" -pkginfo = ">=1.4.2" +pkginfo = ">=1.8.1" readme-renderer = ">=21.0" requests = ">=2.20" requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" rfc3986 = ">=1.4.0" tqdm = ">=4.14" +urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" +version = "4.3.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.7" +version = "1.26.12" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -761,9 +770,20 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "wheel" +version = "0.37.1" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.extras] +test = ["pytest (>=3.0.0)", "pytest-cov"] + [[package]] name = "wrapt" -version = "1.13.2" +version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false @@ -771,122 +791,132 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.6.0" +version = "3.8.1" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "4754fdfdcdd612034248098986d88b7d259703e0ebb06e8ffa66efcdf11d6c51" +content-hash = "7e1a3c1f06ef0d763fc5c575c350ab49d7a2c4f1d205ddefe0b1ecd58ed0167c" [metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.68.2-py3-none-any.whl", hash = "sha256:dddd10e0dc2114d7ecfa7bd919a5550ac7ef8621ce788996f38fd285614dde22"}, - {file = "beet-0.68.2.tar.gz", hash = "sha256:140a966b6016ac96910280c4629f2c169d13b3e2a1cffb52dca780ec3c1eda85"}, + {file = "beet-0.72.1-py3-none-any.whl", hash = "sha256:255c5b58b465dd0bc3542d356018a83fb04cfdf90c16f0637f61b1e957aa6f11"}, + {file = "beet-0.72.1.tar.gz", hash = "sha256:e5dd91ca664dac31d9a8fbe8250586481baaebf856d40080bd78bf64b99e0635"}, ] black = [ - {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, - {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, - {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, - {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, - {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, - {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, - {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, - {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, - {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, - {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, - {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, - {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, - {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, - {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, - {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, - {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, - {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, - {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, - {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, + {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, + {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, + {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, + {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, + {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, + {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, + {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, + {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, + {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, + {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, + {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, + {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, + {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, + {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, + {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, + {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, + {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, ] bleach = [ - {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, - {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.9.14-py3-none-any.whl", hash = "sha256:e232343de1ab72c2aa521b625c80f699e356830fd0e2c620b465b304b17b0516"}, + {file = "certifi-2022.9.14.tar.gz", hash = "sha256:36973885b9542e6bd01dea287b2b4b3b21236307c56324fcc3f1160f2d655ed5"}, ] cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, - {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, ] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, @@ -897,161 +927,146 @@ click-help-colors = [ {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, ] click-log = [ - {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, - {file = "click_log-0.3.2-py2.py3-none-any.whl", hash = "sha256:eee14dc37cdf3072158570f00406572f9e03e414accdccfccd4c538df9ae322c"}, + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] cryptography = [ - {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, - {file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"}, - {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"}, - {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"}, - {file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"}, - {file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"}, - {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"}, - {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"}, - {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"}, - {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, + {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, + {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, + {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, + {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, + {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, + {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, + {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, ] docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] dotty-dict = [ - {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, + {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, + {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] gitdb = [ - {file = "gitdb-4.0.8-py3-none-any.whl", hash = "sha256:6875cbaed01f1b750394f372607803768fc7dad7c58c7ceb5f5917e980d779b2"}, - {file = "gitdb-4.0.8.tar.gz", hash = "sha256:858966a9310649cb24a387c101429bb5a1110068a312517722b0281077e78bc6"}, + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -gitpython = [ - {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"}, - {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"}, +GitPython = [ + {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, + {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, ] idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, - {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, + {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"}, + {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.6.0-py2-none-any.whl", hash = "sha256:e6c9917a1e3e73e7ea91fdf82d5f151ccfe85bf30cc65cdb892444c02dbb5f74"}, - {file = "invoke-1.6.0-py3-none-any.whl", hash = "sha256:769e90caeb1bd07d484821732f931f1ad8916a38e3f3e618644687fc09cb6317"}, - {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"}, + {file = "invoke-1.7.1-py3-none-any.whl", hash = "sha256:2dc975b4f92be0c0a174ad2d063010c8a1fdb5e9389d69871001118b4fcac4fb"}, + {file = "invoke-1.7.1.tar.gz", hash = "sha256:7b6deaf585eee0a848205d0b8c0014b9bf6f287a8eb798818a642dff1df14b19"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] +"jaraco.classes" = [ + {file = "jaraco.classes-3.2.2-py3-none-any.whl", hash = "sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647"}, + {file = "jaraco.classes-3.2.2.tar.gz", hash = "sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594"}, +] jeepney = [ - {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, - {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, +Jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"}, - {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, + {file = "keyring-23.9.1-py3-none-any.whl", hash = "sha256:3565b9e4ea004c96e158d2d332a49f466733d565bb24157a60fd2e49f41a0fd1"}, + {file = "keyring-23.9.1.tar.gz", hash = "sha256:39e4f6572238d2615a82fcaa485e608b84b503cf080dc924c43bbbacb11c1c18"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +MarkupSafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] mdurl = [ - {file = "mdurl-0.1.0-py3-none-any.whl", hash = "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda"}, - {file = "mdurl-0.1.0.tar.gz", hash = "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"}, + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] +more-itertools = [ + {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, + {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1062,129 +1077,130 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, - {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, - {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, - {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, - {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, - {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, - {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, - {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, - {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, + {file = "numpy-1.23.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee"}, + {file = "numpy-1.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffcf105ecdd9396e05a8e58e81faaaf34d3f9875f137c7372450baa5d77c9a54"}, + {file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ea3f98a0ffce3f8f57675eb9119f3f4edb81888b6874bc1953f91e0b1d4f440"}, + {file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089"}, + {file = "numpy-1.23.3-cp310-cp310-win32.whl", hash = "sha256:98dcbc02e39b1658dc4b4508442a560fe3ca5ca0d989f0df062534e5ca3a5c1a"}, + {file = "numpy-1.23.3-cp310-cp310-win_amd64.whl", hash = "sha256:39a664e3d26ea854211867d20ebcc8023257c1800ae89773cbba9f9e97bae036"}, + {file = "numpy-1.23.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f27b5322ac4067e67c8f9378b41c746d8feac8bdd0e0ffede5324667b8a075c"}, + {file = "numpy-1.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ad3ec9a748a8943e6eb4358201f7e1c12ede35f510b1a2221b70af4bb64295c"}, + {file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdc9febce3e68b697d931941b263c59e0c74e8f18861f4064c1f712562903411"}, + {file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:301c00cf5e60e08e04d842fc47df641d4a181e651c7135c50dc2762ffe293dbd"}, + {file = "numpy-1.23.3-cp311-cp311-win32.whl", hash = "sha256:7cd1328e5bdf0dee621912f5833648e2daca72e3839ec1d6695e91089625f0b4"}, + {file = "numpy-1.23.3-cp311-cp311-win_amd64.whl", hash = "sha256:8355fc10fd33a5a70981a5b8a0de51d10af3688d7a9e4a34fcc8fa0d7467bb7f"}, + {file = "numpy-1.23.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc6e8da415f359b578b00bcfb1d08411c96e9a97f9e6c7adada554a0812a6cc6"}, + {file = "numpy-1.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:22d43376ee0acd547f3149b9ec12eec2f0ca4a6ab2f61753c5b29bb3e795ac4d"}, + {file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a64403f634e5ffdcd85e0b12c08f04b3080d3e840aef118721021f9b48fc1460"}, + {file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd9d3abe5774404becdb0748178b48a218f1d8c44e0375475732211ea47c67e"}, + {file = "numpy-1.23.3-cp38-cp38-win32.whl", hash = "sha256:f8c02ec3c4c4fcb718fdf89a6c6f709b14949408e8cf2a2be5bfa9c49548fd85"}, + {file = "numpy-1.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:e868b0389c5ccfc092031a861d4e158ea164d8b7fdbb10e3b5689b4fc6498df6"}, + {file = "numpy-1.23.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09f6b7bdffe57fc61d869a22f506049825d707b288039d30f26a0d0d8ea05164"}, + {file = "numpy-1.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c79d7cf86d049d0c5089231a5bcd31edb03555bd93d81a16870aa98c6cfb79d"}, + {file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5d5420053bbb3dd64c30e58f9363d7a9c27444c3648e61460c1237f9ec3fa14"}, + {file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5422d6a1ea9b15577a9432e26608c73a78faf0b9039437b075cf322c92e98e7"}, + {file = "numpy-1.23.3-cp39-cp39-win32.whl", hash = "sha256:c1ba66c48b19cc9c2975c0d354f24058888cdc674bebadceb3cdc9ec403fb5d1"}, + {file = "numpy-1.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:78a63d2df1d947bd9d1b11d35564c2f9e4b57898aae4626638056ec1a231c40c"}, + {file = "numpy-1.23.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:17c0e467ade9bda685d5ac7f5fa729d8d3e76b23195471adae2d6a6941bd2c18"}, + {file = "numpy-1.23.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91b8d6768a75247026e951dce3b2aac79dc7e78622fc148329135ba189813584"}, + {file = "numpy-1.23.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:94c15ca4e52671a59219146ff584488907b1f9b3fc232622b47e2cf832e94fb8"}, + {file = "numpy-1.23.3.tar.gz", hash = "sha256:51bf49c0cd1d52be0a240aa66f3458afc4b95d8993d2d04f0d91fa60c10af6cd"}, ] packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] pkginfo = [ - {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, - {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, ] platformdirs = [ - {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, - {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, -] -pygments = [ - {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, - {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] +Pygments = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, ] pytest-insta = [ {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-2.10.1.tar.gz", hash = "sha256:7afa7d7c062fa62c173190452265a30feefb844428efc58ea5244f3b9fc0d40f"}, - {file = "python_gitlab-2.10.1-py3-none-any.whl", hash = "sha256:581a219759515513ea9399e936ed7137437cfb681f52d2641626685c492c999d"}, + {file = "python-gitlab-3.9.0.tar.gz", hash = "sha256:5fc5e88f81f366e11851cb8b4b9a5b827491ce20ba7585446b74c9b097726ba3"}, + {file = "python_gitlab-3.9.0-py3-none-any.whl", hash = "sha256:ce941f99bf88b6918eea82500ca6206806117f4afe26d4705f4ded2284b35c69"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.27.1.tar.gz", hash = "sha256:a7a11a9250e392ee699408dca916b11789be07656143746084331b4b1d88bde5"}, - {file = "python_semantic_release-7.27.1-py3-none-any.whl", hash = "sha256:20c804784a3e64a5d072704e2d18e0c858092e95c4a98b385e93fcab30998439"}, + {file = "python-semantic-release-7.31.4.tar.gz", hash = "sha256:ee00c396b6d394b87b5ba3cf6be0f759f2f23783c2215e3ac4c22dc4bc676d60"}, + {file = "python_semantic_release-7.31.4-py3-none-any.whl", hash = "sha256:05d37cb3e3b6e84770128debede8421b24fceaecfbaa9eb62ffcfc1ea2c857f2"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] -pyyaml = [ +PyYAML = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1192,6 +1208,13 @@ pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -1220,33 +1243,29 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-30.0-py2.py3-none-any.whl", hash = "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc"}, - {file = "readme_renderer-30.0.tar.gz", hash = "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8"}, + {file = "readme_renderer-37.1-py3-none-any.whl", hash = "sha256:16c914ca7731fd062a316a2a8e5434a175ee34661a608af771a60c881f528a34"}, + {file = "readme_renderer-37.1.tar.gz", hash = "sha256:96768c069729f69176f514477e57f2f8cd543fbb2cd7bad372976249fa509a0c"}, ] requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] rfc3986 = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, ] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, +SecretStorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] semver = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] -setuptools-scm = [ - {file = "setuptools_scm-6.3.2-py3-none-any.whl", hash = "sha256:4c64444b1d49c4063ae60bfe1680f611c8b13833d556fd1d6050c0023162a119"}, - {file = "setuptools_scm-6.3.2.tar.gz", hash = "sha256:a49aa8081eeb3514eb9728fa5040f2eaa962d6c6f4ec9c32f6c1fba88f88a0f2"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1260,81 +1279,104 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, - {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, - {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, ] tqdm = [ - {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"}, - {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"}, + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, ] twine = [ - {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, - {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, + {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, + {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, ] urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +wheel = [ + {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, + {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, +] wrapt = [ - {file = "wrapt-1.13.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3de7b4d3066cc610054e7aa2c005645e308df2f92be730aae3a47d42e910566a"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:8164069f775c698d15582bf6320a4f308c50d048c1c10cf7d7a341feaccf5df7"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9adee1891253670575028279de8365c3a02d3489a74a66d774c321472939a0b1"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a70d876c9aba12d3bd7f8f1b05b419322c6789beb717044eea2c8690d35cb91b"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3f87042623530bcffea038f824b63084180513c21e2e977291a9a7e65a66f13b"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e634136f700a21e1fcead0c137f433dde928979538c14907640607d43537d468"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3e33c138d1e3620b1e0cc6fd21e46c266393ed5dae0d595b7ed5a6b73ed57aa0"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:283e402e5357e104ac1e3fba5791220648e9af6fb14ad7d9cc059091af2b31d2"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ccb34ce599cab7f36a4c90318697ead18312c67a9a76327b3f4f902af8f68ea1"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fbad5ba74c46517e6488149514b2e2348d40df88cd6b52a83855b7a8bf04723f"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:724ed2bc9c91a2b9026e5adce310fa60c6e7c8760b03391445730b9789b9d108"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:83f2793ec6f3ef513ad8d5b9586f5ee6081cad132e6eae2ecb7eac1cc3decae0"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0473d1558b93e314e84313cc611f6c86be779369f9d3734302bf185a4d2625b1"}, - {file = "wrapt-1.13.2-cp35-cp35m-win32.whl", hash = "sha256:15eee0e6fd07f48af2f66d0e6f2ff1916ffe9732d464d5e2390695296872cad9"}, - {file = "wrapt-1.13.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bc85d17d90201afd88e3d25421da805e4e135012b5d1f149e4de2981394b2a52"}, - {file = "wrapt-1.13.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6ee5f8734820c21b9b8bf705e99faba87f21566d20626568eeb0d62cbeaf23c"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:53c6706a1bcfb6436f1625511b95b812798a6d2ccc51359cd791e33722b5ea32"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fbe6aebc9559fed7ea27de51c2bf5c25ba2a4156cf0017556f72883f2496ee9a"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0582180566e7a13030f896c2f1ac6a56134ab5f3c3f4c5538086f758b1caf3f2"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bff0a59387a0a2951cb869251257b6553663329a1b5525b5226cab8c88dcbe7e"}, - {file = "wrapt-1.13.2-cp36-cp36m-win32.whl", hash = "sha256:df3eae297a5f1594d1feb790338120f717dac1fa7d6feed7b411f87e0f2401c7"}, - {file = "wrapt-1.13.2-cp36-cp36m-win_amd64.whl", hash = "sha256:1eb657ed84f4d3e6ad648483c8a80a0cf0a78922ef94caa87d327e2e1ad49b48"}, - {file = "wrapt-1.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0cdedf681db878416c05e1831ec69691b0e6577ac7dca9d4f815632e3549580"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:87ee3c73bdfb4367b26c57259995935501829f00c7b3eed373e2ad19ec21e4e4"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3e0d16eedc242d01a6f8cf0623e9cdc3b869329da3f97a15961d8864111d8cf0"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:8318088860968c07e741537030b1abdd8908ee2c71fbe4facdaade624a09e006"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d90520616fce71c05dedeac3a0fe9991605f0acacd276e5f821842e454485a70"}, - {file = "wrapt-1.13.2-cp37-cp37m-win32.whl", hash = "sha256:22142afab65daffc95863d78effcbd31c19a8003eca73de59f321ee77f73cadb"}, - {file = "wrapt-1.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d0d717e10f952df7ea41200c507cc7e24458f4c45b56c36ad418d2e79dacd1d4"}, - {file = "wrapt-1.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:593cb049ce1c391e0288523b30426c4430b26e74c7e6f6e2844bd99ac7ecc831"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8860c8011a6961a651b1b9f46fdbc589ab63b0a50d645f7d92659618a3655867"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ada5e29e59e2feb710589ca1c79fd989b1dd94d27079dc1d199ec954a6ecc724"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:fdede980273aeca591ad354608778365a3a310e0ecdd7a3587b38bc5be9b1808"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:af9480de8e63c5f959a092047aaf3d7077422ded84695b3398f5d49254af3e90"}, - {file = "wrapt-1.13.2-cp38-cp38-win32.whl", hash = "sha256:c65e623ea7556e39c4f0818200a046cbba7575a6b570ff36122c276fdd30ab0a"}, - {file = "wrapt-1.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:b20703356cae1799080d0ad15085dc3213c1ac3f45e95afb9f12769b98231528"}, - {file = "wrapt-1.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c5c4cf188b5643a97e87e2110bbd4f5bc491d54a5b90633837b34d5df6a03fe"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:82223f72eba6f63eafca87a0f614495ae5aa0126fe54947e2b8c023969e9f2d7"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81a4cf257263b299263472d669692785f9c647e7dca01c18286b8f116dbf6b38"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:728e2d9b7a99dd955d3426f237b940fc74017c4a39b125fec913f575619ddfe9"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7574de567dcd4858a2ffdf403088d6df8738b0e1eabea220553abf7c9048f59e"}, - {file = "wrapt-1.13.2-cp39-cp39-win32.whl", hash = "sha256:c7ac2c7a8e34bd06710605b21dd1f3576764443d68e069d2afba9b116014d072"}, - {file = "wrapt-1.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e6d1a8eeef415d7fb29fe017de0e48f45e45efd2d1bfda28fc50b7b330859ef"}, - {file = "wrapt-1.13.2.tar.gz", hash = "sha256:dca56cc5963a5fd7c2aa8607017753f534ee514e09103a6c55d2db70b50e7447"}, + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, - {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, ] diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index cafe87d35..2256afd29 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,15 +25,15 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.68.2" +beet = ">=0.72.1" markdown-it-py = "^2.1.0" click = "^8.1.3" [tool.poetry.dev-dependencies] -black = "^22.3.0" -pytest = "^7.1.2" +black = "^22.8.0" +pytest = "^7.1.3" isort = "^5.10.1" -python-semantic-release = "^7.27.1" +python-semantic-release = "^7.31.4" pytest-insta = "^0.1.11" [tool.poetry.scripts] From 61aa3c9174c570d02b11faf6dd5fef6349a0923e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 17 Sep 2022 05:34:00 +0200 Subject: [PATCH 1000/1554] fix: don't add namespace title when the namespace is empty --- packages/lectern/lectern/serialize.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index a232439d9..214b3bffe 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -298,6 +298,9 @@ def serialize_pack( ) for name, namespace in pack.items(): + if not namespace: + continue + yield f"\n### {name}" for path, file_instance in namespace.extra.items(): From 6b9a2dc2462a6c4ac1e4c1c4ca8328b366cf0289 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 17 Sep 2022 03:35:12 +0000 Subject: [PATCH 1001/1554] 0.24.1 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 5 +++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 64e676124..92ae92e96 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.24.1 (2022-09-17) +### Fix +* Don't add namespace title when the namespace is empty ([`adfa7e5`](https://github.com/mcbeet/lectern/commit/adfa7e5493d4fc05df2e771c59f8e455c4e239c2)) +* Properly convert serialized content ([`3301864`](https://github.com/mcbeet/lectern/commit/3301864338413427ac7ab14e6aa0b7fb0e56d55f)) + ## v0.24.0 (2022-06-18) ### Feature * Change serialization filter for pytest snapshots ([`aea38cf`](https://github.com/mcbeet/lectern/commit/aea38cfd2db89b8d4470fa0805b54b5e2752d231)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 4f28edb83..1a32c77d4 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.24.0" +__version__ = "0.24.1" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 2256afd29..ff193bd55 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.24.0" +version = "0.24.1" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 6f079a9a8e949374ab0d7eb87f44dfa93a3aefc9 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 00:54:02 +0200 Subject: [PATCH 1002/1554] test: add example for caching compile result --- .../examples/bolt_compile_cached/beet.yml | 7 ++++ .../cached/slow.mcfunction | 2 + .../bolt_compile_cached/compile_cached.py | 23 ++++++++++++ .../src/data/demo/functions/foo.mcfunction | 1 + ...ples__build_bolt_compile_cached__0.pack.md | 37 +++++++++++++++++++ 5 files changed, 70 insertions(+) create mode 100644 packages/bolt/examples/bolt_compile_cached/beet.yml create mode 100644 packages/bolt/examples/bolt_compile_cached/cached/slow.mcfunction create mode 100644 packages/bolt/examples/bolt_compile_cached/compile_cached.py create mode 100644 packages/bolt/examples/bolt_compile_cached/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md diff --git a/packages/bolt/examples/bolt_compile_cached/beet.yml b/packages/bolt/examples/bolt_compile_cached/beet.yml new file mode 100644 index 000000000..ba783af80 --- /dev/null +++ b/packages/bolt/examples/bolt_compile_cached/beet.yml @@ -0,0 +1,7 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha + - compile_cached diff --git a/packages/bolt/examples/bolt_compile_cached/cached/slow.mcfunction b/packages/bolt/examples/bolt_compile_cached/cached/slow.mcfunction new file mode 100644 index 000000000..587ef5b6a --- /dev/null +++ b/packages/bolt/examples/bolt_compile_cached/cached/slow.mcfunction @@ -0,0 +1,2 @@ +for i in range(10): + say f"something slow {i}" diff --git a/packages/bolt/examples/bolt_compile_cached/compile_cached.py b/packages/bolt/examples/bolt_compile_cached/compile_cached.py new file mode 100644 index 000000000..3cedb0c47 --- /dev/null +++ b/packages/bolt/examples/bolt_compile_cached/compile_cached.py @@ -0,0 +1,23 @@ +from beet import Context, sandbox, subproject + + +def beet_default(ctx: Context): + ctx.require(sandbox(compile_cached)) + + +def compile_cached(ctx: Context): + cached_data_pack = ctx.cache["compile_cached"].directory / "data_pack" + + if cached_data_pack.is_dir(): + ctx.data.load(cached_data_pack) + else: + ctx.require( + subproject( + { + "require": ["bolt"], + "data_pack": {"load": {"data/demo/functions/cached": "cached"}}, + "pipeline": ["mecha"], + } + ) + ) + ctx.data.save(path=cached_data_pack, overwrite=True) diff --git a/packages/bolt/examples/bolt_compile_cached/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_compile_cached/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..516a5d0c0 --- /dev/null +++ b/packages/bolt/examples/bolt_compile_cached/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say hello diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md new file mode 100644 index 000000000..ab59c5ced --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md @@ -0,0 +1,37 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hello +``` + +`@function demo:cached/slow` + +```mcfunction +say something slow 0 +say something slow 1 +say something slow 2 +say something slow 3 +say something slow 4 +say something slow 5 +say something slow 6 +say something slow 7 +say something slow 8 +say something slow 9 +``` From f299a9bec5b7ec914207d471de89305df74a0c7c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 18:42:49 +0200 Subject: [PATCH 1003/1554] chore: update beet --- packages/mecha/poetry.lock | 744 ++++++++++++++++++++++++++++------ packages/mecha/pyproject.toml | 4 +- 2 files changed, 629 insertions(+), 119 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 9b6ca1be8..5b7b8d2a9 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -7,32 +7,32 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "beet" -version = "0.71.0" +version = "0.73.3" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -click = ">=8.1.2,<9.0.0" +click = ">=8.1.3,<9.0.0" click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -Jinja2 = ">=3.1.1,<4.0.0" +Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.9.0,<0.10.0" -pydantic = ">=1.9.0,<2.0.0" +pathspec = ">=0.10.1,<0.11.0" +pydantic = ">=1.10.2,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" [package.extras] -image = ["pillow"] +image = ["Pillow"] [[package]] name = "black" @@ -69,8 +69,7 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0)"] -dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] +dev = ["black (==22.3.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.942)", "pip-tools (==6.5.1)", "pytest (==7.1.1)", "sphinx (==4.3.2)", "tox (==3.24.5)", "twine (==4.0.0)", "wheel (==0.37.1)"] [[package]] name = "certifi" @@ -158,12 +157,12 @@ python-versions = ">=3.6" cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx_rtd_theme"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "docutils" @@ -226,9 +225,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -testing = ["importlib-resources (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-black (>=0.3.7)", "pytest-perf (>=0.9.2)", "flufl.flake8", "pyfakefs", "packaging", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] -docs = ["rst.linker (>=1.9)", "jaraco.packaging (>=9)", "sphinx"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -255,10 +254,10 @@ optional = false python-versions = ">=3.6.1,<4.0" [package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] name = "jeepney" @@ -269,12 +268,12 @@ optional = false python-versions = ">=3.7" [package.extras] -trio = ["async-generator", "trio"] -test = ["async-timeout", "trio", "testpath", "pytest-asyncio (>=0.17)", "pytest-trio", "pytest"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] -name = "jinja2" -version = "3.1.1" +name = "Jinja2" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false @@ -301,8 +300,8 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -testing = ["pytest-mypy", "pytest-black (>=0.3.7)", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] -docs = ["jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "jaraco.packaging (>=8.2)", "sphinx"] +docs = ["jaraco.packaging (>=8.2)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] [[package]] name = "lectern" @@ -329,14 +328,14 @@ python-versions = ">=3.7" mdurl = ">=0.1,<1.0" [package.extras] -testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] -rtd = ["sphinx-book-theme", "sphinx-design", "sphinx-copybutton", "sphinx", "pyyaml", "myst-parser", "attrs"] -profiling = ["gprof2dot"] -plugins = ["mdit-py-plugins"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -compare = ["panflute (>=2.1.3,<2.2.0)", "mistune (>=2.0.2,<2.1.0)", "mistletoe (>=0.8.1,<0.9.0)", "markdown (>=3.3.6,<3.4.0)", "commonmark (>=0.9.1,<0.10.0)"] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -benchmarking = ["pytest-benchmark (>=3.2,<4.0)", "pytest", "psutil"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" @@ -394,11 +393,11 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "pkginfo" @@ -432,8 +431,8 @@ optional = false python-versions = ">=3.6" [package.extras] -testing = ["pytest-benchmark", "pytest"] -dev = ["tox", "pre-commit"] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -453,18 +452,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" +version = "1.10.2" +description = "Data validation and settings management using python type hints" category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] -typing-extensions = ">=3.7.4.3" +typing-extensions = ">=4.1.0" [package.extras] -email = ["email-validator (>=1.0.3)"] dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" @@ -483,7 +482,7 @@ optional = false python-versions = ">=3.6.8" [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" @@ -553,12 +552,13 @@ requests = ">=2.25,<3" semver = ">=2.10,<3" tomlkit = ">=0.10,<1.0" twine = ">=3,<4" +wheel = "*" [package.extras] -dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)", "Jinja2 (==3.0.3)"] +dev = ["black", "isort", "tox"] +docs = ["Jinja2 (==3.0.3)", "Sphinx (==1.3.6)"] mypy = ["mypy", "types-requests"] -test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] +test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=5,<6)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] [[package]] name = "pywin32-ctypes" @@ -652,6 +652,19 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "setuptools" +version = "65.3.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "setuptools-scm" version = "6.4.2" @@ -662,6 +675,7 @@ python-versions = ">=3.6" [package.dependencies] packaging = ">=20.0" +setuptools = "*" tomli = ">=1.0.0" [package.extras] @@ -770,8 +784,8 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -782,6 +796,17 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "wheel" +version = "0.37.1" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.extras] +test = ["pytest (>=3.0.0)", "pytest-cov"] + [[package]] name = "wrapt" version = "1.14.0" @@ -799,79 +824,564 @@ optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "407da125657bf7bf0f6e2b447cb172a599b89e4ae0e0b12709d1f0252a443b66" +content-hash = "d7843fc616f0ba700830f894d3ae4112c36793de794a1200c14b7c627441be8d" [metadata.files] -attrs = [] -beet = [] -black = [] -bleach = [] -certifi = [] -cffi = [] -charset-normalizer = [] -click = [] -click-help-colors = [] -click-log = [] -colorama = [] -cryptography = [] -docutils = [] -dotty-dict = [] -gitdb = [] -gitpython = [] -idna = [] -importlib-metadata = [] -iniconfig = [] -invoke = [] -isort = [] -jeepney = [] -jinja2 = [] -keyring = [] -lectern = [] -markdown-it-py = [] -markupsafe = [] -mdurl = [] -mypy-extensions = [] -nbtlib = [] -numpy = [] -packaging = [] -pathspec = [] -pkginfo = [] -platformdirs = [] -pluggy = [] -py = [] -pycparser = [] -pydantic = [] -pygments = [] -pyparsing = [] -pytest = [] -pytest-insta = [] -python-gitlab = [] -python-semantic-release = [] -pywin32-ctypes = [] -pyyaml = [] -readme-renderer = [] -requests = [] -requests-toolbelt = [] -rfc3986 = [] -secretstorage = [] -semver = [] -setuptools-scm = [] -six = [] -smmap = [] -tokenstream = [] -toml = [] -tomli = [] -tomlkit = [] -tqdm = [] -twine = [] -typing-extensions = [] -urllib3 = [] -webencodings = [] -wrapt = [] -zipp = [] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +beet = [ + {file = "beet-0.73.3-py3-none-any.whl", hash = "sha256:d052fcd6c95f6601b89997730e577032fb7715d4f372348bf4e134e209230706"}, + {file = "beet-0.73.3.tar.gz", hash = "sha256:413e88a32e73b90d08b7838654b7fbf584187a2c58d2e6477046b05da001359c"}, +] +black = [ + {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, + {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, + {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, + {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, + {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, + {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, + {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, + {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, + {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, + {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, + {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, + {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, + {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, + {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, + {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, + {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, + {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, + {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, +] +bleach = [ + {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, + {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +click-help-colors = [ + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, +] +click-log = [ + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cryptography = [ + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, + {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, + {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, + {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, +] +docutils = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] +dotty-dict = [ + {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, +] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +gitpython = [ + {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, + {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +invoke = [ + {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, + {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +Jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +keyring = [ + {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, + {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, +] +lectern = [ + {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, + {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, +] +markdown-it-py = [ + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +mdurl = [ + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbtlib = [ + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, +] +numpy = [ + {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, + {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, + {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, + {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, + {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, + {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, + {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, + {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, + {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, + {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, +] +pkginfo = [ + {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, + {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, +] +platformdirs = [ + {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, + {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pydantic = [ + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] +pygments = [ + {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, + {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, +] +pyparsing = [ + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, +] +pytest = [ + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, +] +pytest-insta = [ + {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, + {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, +] +python-gitlab = [ + {file = "python-gitlab-3.3.0.tar.gz", hash = "sha256:fef25d41a62f91da82ee20f72a728b9c69eef34cf0a3005cdbb9a0b471d5b498"}, + {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, +] +python-semantic-release = [ + {file = "python-semantic-release-7.31.4.tar.gz", hash = "sha256:ee00c396b6d394b87b5ba3cf6be0f759f2f23783c2215e3ac4c22dc4bc676d60"}, + {file = "python_semantic_release-7.31.4-py3-none-any.whl", hash = "sha256:05d37cb3e3b6e84770128debede8421b24fceaecfbaa9eb62ffcfc1ea2c857f2"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +readme-renderer = [ + {file = "readme_renderer-34.0-py3-none-any.whl", hash = "sha256:262510fe6aae81ed4e94d8b169077f325614c0b1a45916a80442c6576264a9c2"}, + {file = "readme_renderer-34.0.tar.gz", hash = "sha256:dfb4d17f21706d145f7473e0b61ca245ba58e810cf9b2209a48239677f82e5b0"}, +] +requests = [ + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +rfc3986 = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, + {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, +] +semver = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] +setuptools = [ + {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, + {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, +] +setuptools-scm = [ + {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, + {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] +tokenstream = [ + {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, + {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tomlkit = [ + {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, + {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, +] +tqdm = [ + {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, + {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, +] +twine = [ + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, +] +typing-extensions = [ + {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, + {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, +] +urllib3 = [ + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +wheel = [ + {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, + {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, +] +wrapt = [ + {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, + {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, + {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, + {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, + {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, + {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, + {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, + {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, + {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, + {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, + {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, + {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, + {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, + {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, + {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, + {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, + {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, + {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, + {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, + {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, + {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, + {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, + {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, + {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, + {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, + {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, + {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, + {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, + {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, + {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, + {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, + {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, + {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, + {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, + {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, +] +zipp = [ + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, +] diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 21498e1ba..f412e7f9e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.71.0" +beet = ">=0.73.3" tokenstream = "^1.4.2" [tool.poetry.dev-dependencies] @@ -76,4 +76,4 @@ build_command = "poetry build" [build-system] requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file +build-backend = "poetry.core.masonry.api" From 0670a432cd6683b509cf2434e2634eee54a7bb73 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 19:20:23 +0200 Subject: [PATCH 1004/1554] feat: support yield in dispatcher directly and allow using yield/return for diagnostics --- packages/mecha/mecha/dispatch.py | 146 ++++++++++++++++++------------- 1 file changed, 87 insertions(+), 59 deletions(-) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 5b317aed2..c50f64836 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -236,10 +236,81 @@ def dispatch( def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: """Invoke rules on the given ast node.""" for name, rule in self.dispatch(node): - with self.use_rule(node, name): - rule(node, *args, **kwargs) + self.process(node, name, rule, *args, **kwargs) return node + def process( + self, + node: AstNode, + name: Optional[str] = None, + rule: Optional[Callable[..., Any]] = None, + *args: Any, + **kwargs: Any, + ) -> Any: + """Process the given ast node.""" + result = None + + with self.use_rule(node, name): + result = rule(node, *args, **kwargs) if rule else (child for child in node) + + if isinstance(result, Generator): + try: + with self.use_rule(node, name): + child = next(result) + + except StopIteration as exc: + result = exc.value + + else: + while True: + child = self.handle_output(node, child, name) + + feedback = None + if isinstance(child, AstNode): + feedback = self.invoke(child, *args, **kwargs) + elif child is not None: + msg = f"Invalid node of type {type(child)}." + if name: + msg += f" ({name})" + raise CompilationError(msg) + + try: + child = result.send(feedback) + except StopIteration as exc: + result = exc.value + break + + return self.handle_output(node, result, name) + + def handle_output( + self, + node: AstNode, + output: Any, + name: Optional[str] = None, + ) -> Any: + """Handle rule output.""" + if isinstance(output, Diagnostic): + override_level = self.levels.get(name or "") + if override_level == "ignore": + override_level = None + if override_level: + output.level = override_level + self.diagnostics.add( + output.with_defaults( + rule=name, + location=node.location, + end_location=node.end_location, + ) + ) + return None + + if isinstance(output, DiagnosticCollection): + for diagnostic in output.exceptions: + self.handle_output(node, diagnostic, name) + return None + + return output + @contextmanager def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: """Temporarily gather diagnostics in the specified diagnostic collection.""" @@ -254,33 +325,10 @@ def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: @contextmanager def use_rule(self, node: AstNode, name: Optional[str] = None) -> Iterator[None]: """Handle rule diagnostics.""" - override_level = self.levels.get(name or "") - if override_level == "ignore": - override_level = None - try: yield - except Diagnostic as diagnostic: - if override_level: - diagnostic.level = override_level - self.diagnostics.add( - diagnostic.with_defaults( - rule=name, - location=node.location, - end_location=node.end_location, - ) - ) - except DiagnosticCollection as diagnostic: - for diagnostic in diagnostic.exceptions: - if override_level: - diagnostic.level = override_level - self.diagnostics.add( - diagnostic.with_defaults( - rule=name, - location=node.location, - end_location=node.end_location, - ) - ) + except (Diagnostic, DiagnosticCollection) as exc: + self.handle_output(node, exc, name) except StopIteration: raise except BubbleException: @@ -302,33 +350,8 @@ class Visitor(Dispatcher[Any]): """Ast visitor.""" def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: - rules = list(self.dispatch(node)) - - if rules: - name, rule = rules[0] - else: - name, rule = None, None - - result = None - - with self.use_rule(node, name): - result = rule(node, *args, **kwargs) if rule else (child for child in node) - - if isinstance(result, Generator): - try: - with self.use_rule(node, name): - child = next(result) - except StopIteration as exc: - return exc.value - - while True: - feedback = self.invoke(child, *args, **kwargs) - try: - child = result.send(feedback) - except StopIteration as exc: - return exc.value - - return result + name, rule = next(self.dispatch(node), (None, None)) + return self.process(node, name, rule, *args, **kwargs) class Reducer(Dispatcher[Any]): @@ -367,12 +390,17 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: exhausted = True for name, rule in self.dispatch(node): - with self.use_rule(node, name): - result = rule(node, *args, **kwargs) + result = self.process(node, name, rule, *args, **kwargs) if result is not node: - exhausted = False - node = result - break + if isinstance(result, AstNode): + exhausted = False + node = result + break + elif result is not None: + msg = f"Invalid node of type {type(result)}." + if name: + msg += f" ({name})" + raise CompilationError(msg) return node From 33b259a58dba186cfa5914006a55e2cae0d233b8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 19:20:50 +0200 Subject: [PATCH 1005/1554] fix: update lint_basic to yield diagnostic --- packages/mecha/mecha/contrib/lint_basic.py | 47 +++++++++------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/packages/mecha/mecha/contrib/lint_basic.py b/packages/mecha/mecha/contrib/lint_basic.py index dd35f613f..5c85e85a2 100644 --- a/packages/mecha/mecha/contrib/lint_basic.py +++ b/packages/mecha/mecha/contrib/lint_basic.py @@ -6,15 +6,7 @@ from beet import Context from tokenstream import set_location -from mecha import ( - AstCommand, - AstSelector, - Diagnostic, - DiagnosticCollection, - Mecha, - Reducer, - rule, -) +from mecha import AstCommand, AstSelector, Diagnostic, Mecha, Reducer, rule def beet_default(ctx: Context): @@ -66,28 +58,27 @@ def selector_argument_order(self, node: AstSelector): ] conflict = [-1] * len(order) - with DiagnosticCollection() as diagnostics: - for i, arg in enumerate(node.arguments): - name = "inverted " * arg.inverted + arg.key.value + for i, arg in enumerate(node.arguments): + name = "inverted " * arg.inverted + arg.key.value - try: - index = order.index(name) - except ValueError: - continue + try: + index = order.index(name) + except ValueError: + continue - j = conflict[index] + j = conflict[index] - if j >= 0: - bad_arg = node.arguments[j] - bad_arg_name = "inverted " * bad_arg.inverted + bad_arg.key.value + if j >= 0: + bad_arg = node.arguments[j] + bad_arg_name = "inverted " * bad_arg.inverted + bad_arg.key.value - d = Diagnostic( - level="warn", - message=f"{name.capitalize()} argument should go before {bad_arg_name}.", - ) + d = Diagnostic( + level="warn", + message=f"{name.capitalize()} argument should go before {bad_arg_name}.", + ) - diagnostics.add(set_location(d, arg)) + yield set_location(d, arg) - for conflict_index in range(index): - if conflict[conflict_index] < 0: - conflict[conflict_index] = i + for conflict_index in range(index): + if conflict[conflict_index] < 0: + conflict[conflict_index] = i From 0473450bc65d9420d6742a869ce837a33130a19a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 19:21:24 +0200 Subject: [PATCH 1006/1554] feat: use context generator to implement inline_function_tag --- packages/mecha/mecha/contrib/inline_function_tag.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mecha/mecha/contrib/inline_function_tag.py b/packages/mecha/mecha/contrib/inline_function_tag.py index a6b17bf10..31f669f1b 100644 --- a/packages/mecha/mecha/contrib/inline_function_tag.py +++ b/packages/mecha/mecha/contrib/inline_function_tag.py @@ -10,7 +10,7 @@ from importlib.resources import read_text from typing import List -from beet import Context, FunctionTag +from beet import Context, FunctionTag, Generator from beet.core.utils import required_field from tokenstream import set_location @@ -37,7 +37,7 @@ def beet_default(ctx: Context): mc.transform.extend(inline_execute_function_tag) mc.steps.insert( mc.steps.index(mc.transform) + 1, - InlineFunctionTagHandler(ctx=ctx, database=mc.database), + InlineFunctionTagHandler(generate=ctx.generate, database=mc.database), ) @@ -54,7 +54,7 @@ def inline_execute_function_tag(node: AstCommand) -> AstCommand: class InlineFunctionTagHandler(Visitor): """Handler for inline function tags.""" - ctx: Context = required_field() + generate: Generator = required_field() database: CompilationDatabase = required_field() @rule(AstRoot) @@ -68,8 +68,8 @@ def inline_function_tag(self, node: AstRoot) -> AstRoot: ): changed = True if path := self.database[self.database.current].resource_location: - self.ctx.data.function_tags.merge( - {tag.get_canonical_value(): FunctionTag({"values": [path]})} + self.generate( + tag.get_canonical_value(), merge=FunctionTag({"values": [path]}) ) else: d = Diagnostic("error", "No current path to add function tag.") From 0bb7fb0c5ef1adaea351070e044467787280fb16 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 19:28:45 +0200 Subject: [PATCH 1007/1554] feat: use context generator to implement nested_resources --- .../mecha/mecha/contrib/nested_resources.py | 69 +++++++++---------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/packages/mecha/mecha/contrib/nested_resources.py b/packages/mecha/mecha/contrib/nested_resources.py index ccaa73989..44b17ef1a 100644 --- a/packages/mecha/mecha/contrib/nested_resources.py +++ b/packages/mecha/mecha/contrib/nested_resources.py @@ -9,7 +9,7 @@ from dataclasses import dataclass, replace from typing import Dict, List, Type -from beet import Context, DataModelBase, NamespaceFile, TagFile +from beet import Context, DataModelBase, Generator, NamespaceFile, TagFile from beet.core.utils import required_field, snake_case from tokenstream import set_location @@ -21,7 +21,6 @@ AstRoot, CompilationDatabase, Diagnostic, - DiagnosticCollection, Mecha, MultilineParser, MutatingReducer, @@ -90,7 +89,7 @@ def beet_default(ctx: Context): mc.transform.extend( NestedResourcesTransformer( - ctx=ctx, + generate=ctx.generate, database=mc.database, json_identifiers={ f"{prefix}{name}:name:content": file_type @@ -106,60 +105,54 @@ def beet_default(ctx: Context): class NestedResourcesTransformer(MutatingReducer): """Transformer that handles nested resources.""" - ctx: Context = required_field() + generate: Generator = required_field() database: CompilationDatabase = required_field() json_identifiers: Dict[str, Type[NamespaceFile]] = required_field() @rule(AstRoot) def nested_resources(self, node: AstRoot): - assets, data = self.ctx.packs - changed = False commands: List[AstCommand] = [] - with DiagnosticCollection() as diagnostics: - for command in node.commands: - if file_type := self.json_identifiers.get(command.identifier): - name, content = command.arguments - - if isinstance(name, AstResourceLocation) and isinstance( - content, AstJson - ): - if file_type in assets.namespace_type.field_map: - proxy = assets[file_type] - else: - proxy = data[file_type] - - full_name = name.get_canonical_value() - file_instance = file_type( # type: ignore - content.evaluate(), - original=self.database.current.original, - ) - - if command.identifier.startswith("merge:"): - proxy.merge({full_name: file_instance}) # type: ignore - elif full_name not in proxy: - proxy[full_name] = file_instance - elif command.identifier.startswith("append:"): - proxy[full_name].merge(file_instance) # type: ignore + for command in node.commands: + if file_type := self.json_identifiers.get(command.identifier): + name, content = command.arguments + + if isinstance(name, AstResourceLocation) and isinstance( + content, AstJson + ): + full_name = name.get_canonical_value() + file_instance = file_type( + content.evaluate(), + original=self.database.current.original, + ) + + if command.identifier.startswith("merge:"): + self.generate(full_name, merge=file_instance) + changed = True + continue + + target = self.generate(full_name, default=file_instance) + if target is not file_instance: + if command.identifier.startswith("append:"): + target.append(file_instance) # type: ignore elif command.identifier.startswith("prepend:"): - proxy[full_name].prepend(file_instance) # type: ignore + target.prepend(file_instance) # type: ignore elif ( - proxy[full_name].ensure_deserialized() + target.ensure_deserialized() != file_instance.ensure_deserialized() ): d = Diagnostic( level="error", message=f'Redefinition of {snake_case(file_type.__name__)} "{full_name}" doesn\'t match existing file.', ) - diagnostics.add(set_location(d, name)) - continue + yield set_location(d, name) - changed = True - continue + changed = True + continue - commands.append(command) + commands.append(command) if changed: return replace(node, commands=AstChildren(commands)) From c65e83b3ca50c40ed3ad902cf6aba52e1b963335 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 19:36:55 +0200 Subject: [PATCH 1008/1554] feat: use context generator to implement nesting --- packages/mecha/mecha/contrib/nesting.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index a2c4d0489..049cd717a 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -11,7 +11,7 @@ from importlib.resources import read_text from typing import List, cast -from beet import Context, Function +from beet import Context, Function, Generator from beet.core.utils import required_field from tokenstream import InvalidSyntax, TokenStream, set_location @@ -42,7 +42,12 @@ def beet_default(ctx: Context): mc.spec.parsers["nested_root"] = parse_nested_root mc.spec.parsers["command:argument:mecha:nested_root"] = delegate("nested_root") - mc.transform.extend(NestedCommandsTransformer(ctx=ctx, database=mc.database)) + mc.transform.extend( + NestedCommandsTransformer( + generate=ctx.generate, + database=mc.database, + ) + ) def parse_nested_root(stream: TokenStream) -> AstRoot: @@ -82,13 +87,13 @@ def parse_nested_root(stream: TokenStream) -> AstRoot: class NestedCommandsTransformer(MutatingReducer): """Transformer that handles nested commands.""" - ctx: Context = required_field() + generate: Generator = required_field() database: CompilationDatabase = required_field() def emit_function(self, path: str, root: AstRoot): """Helper method for emitting nested commands into a separate function.""" function = Function() - self.ctx.data[path] = function + self.generate(path, function) self.database[function] = replace( self.database[self.database.current], ast=root, @@ -123,7 +128,6 @@ def nesting_execute_function(self, node: AstCommand): @rule(AstCommand, identifier="execute:commands") def nesting_execute_commands(self, node: AstCommand): - generate = self.ctx.generate["nested_execute"] root = cast(AstRoot, node.arguments[0]) if len(root.commands) == 1: @@ -134,9 +138,9 @@ def nesting_execute_commands(self, node: AstCommand): else: if path := self.database[self.database.current].resource_location: - path = generate.format(path + "/nested_execute_{incr}") + path = self.generate.format(path + "/nested_execute_{incr}") else: - path = generate.path() + path = self.generate.path() self.emit_function(path, root) From f30cc7f2b78f056d3fc900085eadddb30d626c76 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 18 Sep 2022 17:39:28 +0000 Subject: [PATCH 1009/1554] 0.57.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 10 ++++++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f825202b7..2d10e53be 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,16 @@ +## v0.57.0 (2022-09-18) +### Feature +* Use context generator to implement nesting ([`c15e258`](https://github.com/mcbeet/mecha/commit/c15e25864de0f29aba4711c49b0d819e815b565d)) +* Use context generator to implement nested_resources ([`4036ad5`](https://github.com/mcbeet/mecha/commit/4036ad5bd98695103f430253a2f3abffbe78a320)) +* Use context generator to implement inline_function_tag ([`48dcbd7`](https://github.com/mcbeet/mecha/commit/48dcbd70633cce9a77be713fee74b468e109465f)) +* Support yield in dispatcher directly and allow using yield/return for diagnostics ([`c746f5a`](https://github.com/mcbeet/mecha/commit/c746f5abe87f732e20079b2abead2fd2b821191f)) + +### Fix +* Update lint_basic to yield diagnostic ([`658aeda`](https://github.com/mcbeet/mecha/commit/658aeda383076431dbb72035b97ee3697e7ea5f8)) + ## v0.56.0 (2022-09-12) ### Feature * Improve formatting options ([`150be65`](https://github.com/mcbeet/mecha/commit/150be6570ef7e178347d818958e31cb395de9c52)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 3256b525c..31f5a5b65 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.56.0" +__version__ = "0.57.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index f412e7f9e..ebfc0fc11 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.56.0" +version = "0.57.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b896110cbc93b68bdfaab8f1410a9a21c03731f6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 20:40:48 +0200 Subject: [PATCH 1010/1554] fix: proper error for statements used as subcommands --- packages/bolt/bolt/parse.py | 39 ++++++++++++++----- .../tests/resources/bolt_examples.mcfunction | 3 ++ .../tests/snapshots/bolt__parse_305__0.txt | 7 ++++ 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_305__0.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index e256306d0..3792f74bf 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -41,8 +41,9 @@ "ImportStatementHandler", "parse_python_import", "parse_import_name", - "GlobalNonlocalHandler", "parse_name_list", + "GlobalNonlocalHandler", + "StatementSubcommandHandler", "DeferredRootBacktracker", "FunctionConstraint", "RootScopeHandler", @@ -187,8 +188,10 @@ def get_bolt_parsers( macro_handler=macro_handler, ), "nested_root": create_bolt_root_parser(parsers["nested_root"], macro_handler), - "command": UndefinedIdentifierErrorHandler( - ImportStatementHandler(GlobalNonlocalHandler(macro_handler), modules) + "command": StatementSubcommandHandler( + UndefinedIdentifierErrorHandler( + ImportStatementHandler(GlobalNonlocalHandler(macro_handler), modules) + ) ), "command:argument:bolt:if_block": delegate("bolt:if_block"), "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), @@ -1698,6 +1701,14 @@ def parse_import_name(stream: TokenStream) -> AstImportedItem: return set_location(node, token) +def parse_name_list(stream: TokenStream) -> AstIdentifier: + """Parse name list.""" + node = delegate("bolt:identifier", stream) + with stream.syntax(comma=r","): + stream.get("comma") + return node + + @dataclass class GlobalNonlocalHandler: """Handle global and nonlocal declarations.""" @@ -1725,12 +1736,22 @@ def __call__(self, stream: TokenStream) -> Any: return node -def parse_name_list(stream: TokenStream) -> AstIdentifier: - """Parse name list.""" - node = delegate("bolt:identifier", stream) - with stream.syntax(comma=r","): - stream.get("comma") - return node +@dataclass +class StatementSubcommandHandler: + """Prevent statements as subcommands.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if ( + isinstance(node := self.parser(stream), AstCommand) + and node.arguments + and isinstance(child := node.arguments[-1], AstCommand) + and child.identifier == "statement" + ): + exc = InvalidSyntax("Can't use statement as a subcommand.") + raise set_location(exc, child) + return node @dataclass diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index e1baad8fe..1f4a0f277 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1106,3 +1106,6 @@ def g(foo, *args, bar, *args): ### def g(a=1, b): pass +### +as @a run foo = "bar" +say foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_305__0.txt b/packages/bolt/tests/snapshots/bolt__parse_305__0.txt new file mode 100644 index 000000000..a19b98ee2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_305__0.txt @@ -0,0 +1,7 @@ +#>ERROR Can't use statement as a subcommand. +# line 1, column 11 +# 1 | as @a run foo = "bar" +# : ^^^^^^^^^^^ +# 2 | say foo +as @a run foo = "bar" +say foo From f36aed814e34d974fa87829f2cd4476af5bd9cbe Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 18 Sep 2022 20:42:03 +0200 Subject: [PATCH 1011/1554] chore: update dependencies --- packages/bolt/poetry.lock | 735 +++++++++++++++++++++++++++++------ packages/bolt/pyproject.toml | 4 +- 2 files changed, 627 insertions(+), 112 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index dacc922c4..868cbb52c 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -7,14 +7,14 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "beet" -version = "0.71.2" +version = "0.73.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -32,7 +32,7 @@ PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" [package.extras] -image = ["pillow"] +image = ["Pillow"] [[package]] name = "black" @@ -69,8 +69,7 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0)"] -dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] +dev = ["black (==22.3.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.942)", "pip-tools (==6.5.1)", "pytest (==7.1.1)", "sphinx (==4.3.2)", "tox (==3.24.5)", "twine (==4.0.0)", "wheel (==0.37.1)"] [[package]] name = "certifi" @@ -158,12 +157,12 @@ python-versions = ">=3.6" cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx_rtd_theme"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "docutils" @@ -226,9 +225,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -testing = ["importlib-resources (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-black (>=0.3.7)", "pytest-perf (>=0.9.2)", "flufl.flake8", "pyfakefs", "packaging", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] -docs = ["rst.linker (>=1.9)", "jaraco.packaging (>=9)", "sphinx"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -255,10 +254,10 @@ optional = false python-versions = ">=3.6.1,<4.0" [package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] name = "jeepney" @@ -269,8 +268,8 @@ optional = false python-versions = ">=3.7" [package.extras] -trio = ["async-generator", "trio"] -test = ["async-timeout", "trio", "testpath", "pytest-asyncio (>=0.17)", "pytest-trio", "pytest"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] name = "jinja2" @@ -301,8 +300,8 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -testing = ["pytest-mypy", "pytest-black (>=0.3.7)", "pytest-enabler (>=1.0.1)", "pytest-cov", "pytest-flake8", "pytest-checkdocs (>=2.4)", "pytest (>=6)"] -docs = ["jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "jaraco.packaging (>=8.2)", "sphinx"] +docs = ["jaraco.packaging (>=8.2)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] [[package]] name = "lectern" @@ -329,14 +328,14 @@ python-versions = ">=3.7" mdurl = ">=0.1,<1.0" [package.extras] -testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] -rtd = ["sphinx-book-theme", "sphinx-design", "sphinx-copybutton", "sphinx", "pyyaml", "myst-parser", "attrs"] -profiling = ["gprof2dot"] -plugins = ["mdit-py-plugins"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -compare = ["panflute (>=2.1.3,<2.2.0)", "mistune (>=2.0.2,<2.1.0)", "mistletoe (>=0.8.1,<0.9.0)", "markdown (>=3.3.6,<3.4.0)", "commonmark (>=0.9.1,<0.10.0)"] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -benchmarking = ["pytest-benchmark (>=3.2,<4.0)", "pytest", "psutil"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" @@ -356,14 +355,14 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.55.1" +version = "0.57.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.71.0" +beet = ">=0.73.3" tokenstream = ">=1.4.2,<2.0.0" [[package]] @@ -432,8 +431,8 @@ optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] -test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] name = "pluggy" @@ -444,8 +443,8 @@ optional = false python-versions = ">=3.6" [package.extras] -testing = ["pytest-benchmark", "pytest"] -dev = ["tox", "pre-commit"] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -495,7 +494,7 @@ optional = false python-versions = ">=3.6.8" [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" @@ -542,8 +541,8 @@ requests = ">=2.25.0" requests-toolbelt = ">=0.9.1" [package.extras] -yaml = ["PyYaml (>=5.2)"] autocompletion = ["argcomplete (>=1.10.0,<3)"] +yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" @@ -565,12 +564,13 @@ requests = ">=2.25,<3" semver = ">=2.10,<3" tomlkit = ">=0.10,<1.0" twine = ">=3,<4" +wheel = "*" [package.extras] -dev = ["tox", "isort", "black"] -docs = ["Sphinx (==1.3.6)", "Jinja2 (==3.0.3)"] +dev = ["black", "isort", "tox"] +docs = ["Jinja2 (==3.0.3)", "Sphinx (==1.3.6)"] mypy = ["mypy", "types-requests"] -test = ["coverage (>=5,<6)", "pytest (>=5,<6)", "pytest-xdist (>=1,<2)", "pytest-mock (>=2,<3)", "responses (==0.13.3)", "mock (==1.3.0)"] +test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=5,<6)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] [[package]] name = "pywin32-ctypes" @@ -664,6 +664,19 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "setuptools" +version = "65.3.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "setuptools-scm" version = "6.4.2" @@ -674,6 +687,7 @@ python-versions = ">=3.6" [package.dependencies] packaging = ">=20.0" +setuptools = "*" tomli = ">=1.0.0" [package.extras] @@ -782,8 +796,8 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -794,6 +808,17 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "wheel" +version = "0.37.1" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.extras] +test = ["pytest (>=3.0.0)", "pytest-cov"] + [[package]] name = "wrapt" version = "1.14.1" @@ -811,80 +836,570 @@ optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "3e6fdc6222ef765be16fdd361efd33602f0ae0bd866a7aa2fec3fec1f5c55fbc" +content-hash = "e78cd8b5408e4a8849a5618cb0edbd1ae80051b59be15e1de97628c8adfd3869" [metadata.files] -attrs = [] -beet = [] -black = [] -bleach = [] -certifi = [] -cffi = [] -charset-normalizer = [] -click = [] -click-help-colors = [] -click-log = [] -colorama = [] -cryptography = [] -docutils = [] -dotty-dict = [] -gitdb = [] -gitpython = [] -idna = [] -importlib-metadata = [] -iniconfig = [] -invoke = [] -isort = [] -jeepney = [] -jinja2 = [] -keyring = [] -lectern = [] -markdown-it-py = [] -markupsafe = [] -mdurl = [] -mecha = [] -mypy-extensions = [] -nbtlib = [] -numpy = [] -packaging = [] -pathspec = [] -pkginfo = [] -platformdirs = [] -pluggy = [] -py = [] -pycparser = [] -pydantic = [] -pygments = [] -pyparsing = [] -pytest = [] -pytest-insta = [] -python-gitlab = [] -python-semantic-release = [] -pywin32-ctypes = [] -pyyaml = [] -readme-renderer = [] -requests = [] -requests-toolbelt = [] -rfc3986 = [] -secretstorage = [] -semver = [] -setuptools-scm = [] -six = [] -smmap = [] -tokenstream = [] -toml = [] -tomli = [] -tomlkit = [] -tqdm = [] -twine = [] -typing-extensions = [] -urllib3 = [] -webencodings = [] -wrapt = [] -zipp = [] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +beet = [ + {file = "beet-0.73.3-py3-none-any.whl", hash = "sha256:d052fcd6c95f6601b89997730e577032fb7715d4f372348bf4e134e209230706"}, + {file = "beet-0.73.3.tar.gz", hash = "sha256:413e88a32e73b90d08b7838654b7fbf584187a2c58d2e6477046b05da001359c"}, +] +black = [ + {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, + {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, + {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, + {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, + {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, + {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, + {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, + {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, + {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, + {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, + {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, + {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, + {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, + {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, + {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, + {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, + {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, + {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, +] +bleach = [ + {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, + {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +click-help-colors = [ + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, +] +click-log = [ + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cryptography = [ + {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:74b55f67f4cf026cb84da7a1b04fc2a1d260193d4ad0ea5e9897c8b74c1e76ac"}, + {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0db5cf21bd7d092baacb576482b0245102cea2d3cf09f09271ce9f69624ecb6f"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:faf0f5456c059c7b1c29441bdd5e988f0ba75bdc3eea776520d8dcb1e30e1b5c"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:06bfafa6e53ccbfb7a94be4687b211a025ce0625e3f3c60bb15cd048a18f3ed8"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf585476fcbcd37bed08072e8e2db3954ce1bfc68087a2dc9c19cfe0b90979ca"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4daf890e674d191757d8d7d60dc3a29c58c72c7a76a05f1c0a326013f47e8b"}, + {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:ae1cd29fbe6b716855454e44f4bf743465152e15d2d317303fe3b58ee9e5af7a"}, + {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:451aaff8b8adf2dd0597cbb1fdcfc8a7d580f33f843b7cce75307a7f20112dd8"}, + {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1858eff6246bb8bbc080eee78f3dd1528739e3f416cba5f9914e8631b8df9871"}, + {file = "cryptography-37.0.1-cp36-abi3-win32.whl", hash = "sha256:e69a0e36e62279120e648e787b76d79b41e0f9e86c1c636a4f38d415595c722e"}, + {file = "cryptography-37.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a18ff4bfa9d64914a84d7b06c46eb86e0cc03113470b3c111255aceb6dcaf81d"}, + {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce90609e01e1b192fae9e13665058ab46b2ea53a3c05a3ea74a3eb8c3af8857"}, + {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c4a58eeafbd7409054be41a377e726a7904a17c26f45abf18125d21b1215b08b"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:618391152147a1221c87b1b0b7f792cafcfd4b5a685c5c72eeea2ddd29aeceff"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ceae26f876aabe193b13a0c36d1bb8e3e7e608d17351861b437bd882f617e9f"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:930b829e8a2abaf43a19f38277ae3c5e1ffcf547b936a927d2587769ae52c296"}, + {file = "cryptography-37.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58021d6e9b1d88b1105269d0da5e60e778b37dfc0e824efc71343dd003726831"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b1ee5c82cf03b30f6ae4e32d2bcb1e167ef74d6071cbb77c2af30f101d0b360b"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f095988548ec5095e3750cdb30e6962273d239b1998ba1aac66c0d5bee7111c1"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:125702572be12bcd318e3a14e9e70acd4be69a43664a75f0397e8650fe3c6cc3"}, + {file = "cryptography-37.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:315af6268de72bcfa0bb3401350ce7d921f216e6b60de12a363dad128d9d459f"}, + {file = "cryptography-37.0.1.tar.gz", hash = "sha256:d610d0ee14dd9109006215c7c0de15eee91230b70a9bce2263461cf7c3720b83"}, +] +docutils = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] +dotty-dict = [ + {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, +] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +gitpython = [ + {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, + {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +invoke = [ + {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, + {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +keyring = [ + {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, + {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, +] +lectern = [ + {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, + {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, +] +markdown-it-py = [ + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +mdurl = [ + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, +] +mecha = [ + {file = "mecha-0.57.0-py3-none-any.whl", hash = "sha256:a3b8d91733b097c7935b928001237fb47b09a55442222a03fc795edc10f7ffd4"}, + {file = "mecha-0.57.0.tar.gz", hash = "sha256:9063f76c273e7e05c793806ef758487e71ecc33b398de73c6ce6ba4e6cda380a"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbtlib = [ + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, +] +numpy = [ + {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, + {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, + {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, + {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, + {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, + {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, + {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, + {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, + {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, + {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, + {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, + {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, + {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, + {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, + {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, +] +pkginfo = [ + {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, + {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pydantic = [ + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pyparsing = [ + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, +] +pytest = [ + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, +] +pytest-insta = [ + {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, + {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, +] +python-gitlab = [ + {file = "python-gitlab-3.4.0.tar.gz", hash = "sha256:6180b81ee2f265ad8d8412956a1740b4d3ceca7b28ae2f707dfe62375fed0082"}, + {file = "python_gitlab-3.4.0-py3-none-any.whl", hash = "sha256:251b63f0589d51f854516948c84e9eb8df26e1e9dea595cf86b43f17c43007dd"}, +] +python-semantic-release = [ + {file = "python-semantic-release-7.31.4.tar.gz", hash = "sha256:ee00c396b6d394b87b5ba3cf6be0f759f2f23783c2215e3ac4c22dc4bc676d60"}, + {file = "python_semantic_release-7.31.4-py3-none-any.whl", hash = "sha256:05d37cb3e3b6e84770128debede8421b24fceaecfbaa9eb62ffcfc1ea2c857f2"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +readme-renderer = [ + {file = "readme_renderer-35.0-py3-none-any.whl", hash = "sha256:73b84905d091c31f36e50b4ae05ae2acead661f6a09a9abb4df7d2ddcdb6a698"}, + {file = "readme_renderer-35.0.tar.gz", hash = "sha256:a727999acfc222fc21d82a12ed48c957c4989785e5865807c65a487d21677497"}, +] +requests = [ + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +rfc3986 = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, + {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, +] +semver = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] +setuptools = [ + {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, + {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, +] +setuptools-scm = [ + {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, + {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] +tokenstream = [ + {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, + {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tomlkit = [ + {file = "tomlkit-0.10.2-py3-none-any.whl", hash = "sha256:905cf92c2111ef80d355708f47ac24ad1b6fc2adc5107455940088c9bbecaedb"}, + {file = "tomlkit-0.10.2.tar.gz", hash = "sha256:30d54c0b914e595f3d10a87888599eab5321a2a69abc773bbefff51599b72db6"}, +] +tqdm = [ + {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, + {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, +] +twine = [ + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, +] +typing-extensions = [ + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +] +urllib3 = [ + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +wheel = [ + {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, + {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, +] +wrapt = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] +zipp = [ + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, +] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f1e938000..c458b1707 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.71.2" -mecha = ">=0.55.1" +beet = ">=0.73.3" +mecha = ">=0.57.0" [tool.poetry.dev-dependencies] pytest = "^7.1.3" From 183ad48daceae161f14510721d598a48ae966963 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 20 Sep 2022 02:12:52 +0200 Subject: [PATCH 1012/1554] feat: make it possible to raise an error if there was nothing in the message --- packages/lectern/lectern/contrib/messaging.py | 13 ++++++++----- packages/lectern/lectern/document.py | 6 ++++-- packages/lectern/poetry.lock | 8 ++++---- packages/lectern/pyproject.toml | 2 +- .../tests/snapshots/messaging__build_0__0.pack.md | 2 +- .../tests/snapshots/messaging__build_5__0.pack.md | 2 +- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/lectern/lectern/contrib/messaging.py b/packages/lectern/lectern/contrib/messaging.py index 597dfd80d..960f68689 100644 --- a/packages/lectern/lectern/contrib/messaging.py +++ b/packages/lectern/lectern/contrib/messaging.py @@ -7,9 +7,9 @@ ] -from typing import Literal +from typing import Literal, Optional -from beet import Context, Function, ListOption, configurable +from beet import Context, ErrorMessage, Function, ListOption, configurable from pydantic import BaseModel from lectern import Document, LinkFragmentLoader @@ -18,6 +18,7 @@ class MessagingOptions(BaseModel): links: Literal["enable", "ignore", "disable"] = "enable" input: ListOption[str] = ListOption() + nothing_error: Optional[str] = None def beet_default(ctx: Context): @@ -38,9 +39,11 @@ def messaging(ctx: Context, opts: MessagingOptions): for message in opts.input.entries(): if not document.add(message): - code_blocks = [ + if code_blocks := [ token.content for token in document.markdown_extractor.parser.parse(message) # type: ignore if token.type in ["fence", "code_block"] - ] - ctx.generate("{short_hash}", Function("\n".join(code_blocks))) + ]: + ctx.generate("default", Function("\n".join(code_blocks))) + elif opts.nothing_error: + raise ErrorMessage(opts.nothing_error) diff --git a/packages/lectern/lectern/document.py b/packages/lectern/lectern/document.py index 8abb192ec..0ff4529c5 100644 --- a/packages/lectern/lectern/document.py +++ b/packages/lectern/lectern/document.py @@ -111,9 +111,10 @@ def add_text(self, source: str) -> bool: directives=self.directives.resolve(), loaders=self.loaders, ) + non_empty = bool(assets or data) self.assets.merge(assets) self.data.merge(data) - return bool(assets or data) + return non_empty def add_markdown( self, @@ -127,9 +128,10 @@ def add_markdown( loaders=self.loaders, external_files=external_files, ) + non_empty = bool(assets or data) self.assets.merge(assets) self.data.merge(data) - return bool(assets or data) + return non_empty def get_text(self) -> str: """Turn the data pack and the resource pack into text.""" diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index d8d2ee958..29544cded 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -14,7 +14,7 @@ tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.72.1" +version = "0.73.3" description = "The Minecraft pack development kit" category = "main" optional = false @@ -804,7 +804,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "7e1a3c1f06ef0d763fc5c575c350ab49d7a2c4f1d205ddefe0b1ecd58ed0167c" +content-hash = "9ab9c1886ecbe6683594114aaa408e9a09bfad7042f96d8ed5a021a074c887c3" [metadata.files] attrs = [ @@ -812,8 +812,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.72.1-py3-none-any.whl", hash = "sha256:255c5b58b465dd0bc3542d356018a83fb04cfdf90c16f0637f61b1e957aa6f11"}, - {file = "beet-0.72.1.tar.gz", hash = "sha256:e5dd91ca664dac31d9a8fbe8250586481baaebf856d40080bd78bf64b99e0635"}, + {file = "beet-0.73.3-py3-none-any.whl", hash = "sha256:d052fcd6c95f6601b89997730e577032fb7715d4f372348bf4e134e209230706"}, + {file = "beet-0.73.3.tar.gz", hash = "sha256:413e88a32e73b90d08b7838654b7fbf584187a2c58d2e6477046b05da001359c"}, ] black = [ {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index ff193bd55..9e0217eba 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,7 +25,7 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.72.1" +beet = ">=0.73.3" markdown-it-py = "^2.1.0" click = "^8.1.3" diff --git a/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md index ca80b400a..a1b09dc71 100644 --- a/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_0__0.pack.md @@ -15,7 +15,7 @@ ### msg -`@function msg:az4ih8` +`@function msg:default` ```mcfunction say hello1 diff --git a/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md b/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md index 7a33c6423..560586d48 100644 --- a/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md +++ b/packages/lectern/tests/snapshots/messaging__build_5__0.pack.md @@ -15,7 +15,7 @@ ### msg -`@function msg:cbnnd5` +`@function msg:default` ```mcfunction say foo From 4f3af53e1bce500eefd96a6cd1e61433e61bf05d Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 20 Sep 2022 00:14:05 +0000 Subject: [PATCH 1013/1554] 0.25.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index 92ae92e96..d88b48da0 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.25.0 (2022-09-20) +### Feature +* Make it possible to raise an error if there was nothing in the message ([`165330e`](https://github.com/mcbeet/lectern/commit/165330e29e490860107d2755f09a0aa3f9d9c03a)) + ## v0.24.1 (2022-09-17) ### Fix * Don't add namespace title when the namespace is empty ([`adfa7e5`](https://github.com/mcbeet/lectern/commit/adfa7e5493d4fc05df2e771c59f8e455c4e239c2)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index 1a32c77d4..bb32792db 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.24.1" +__version__ = "0.25.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 9e0217eba..07131fbc9 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.24.1" +version = "0.25.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From a8872a55a7b407281890e47ebdbd34d66f435116 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 1 Oct 2022 19:42:28 +0200 Subject: [PATCH 1014/1554] fix: improve typing for AlternativeParser --- packages/mecha/mecha/parse.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 2db63f98c..a0dfd6f9c 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -75,6 +75,7 @@ List, Literal, Optional, + Sequence, Tuple, Type, Union, @@ -1924,7 +1925,7 @@ def __call__(self, stream: TokenStream) -> Any: class AlternativeParser: """Parser that tries the given alternatives in order.""" - parsers: List[Parser] + parsers: Sequence[Parser] def __call__(self, stream: TokenStream) -> Any: for parser, alternative in stream.choose(*self.parsers): From 80a359290141f4d5c9357cfba0d13ae724ce787e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Sep 2022 12:27:49 +0000 Subject: [PATCH 1015/1554] chore(deps): bump beet from 0.73.3 to 0.75.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.73.3 to 0.75.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.73.3...v0.75.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 5b7b8d2a9..38fc3c9fb 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -14,7 +14,7 @@ tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy" [[package]] name = "beet" -version = "0.73.3" +version = "0.75.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -838,8 +838,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.73.3-py3-none-any.whl", hash = "sha256:d052fcd6c95f6601b89997730e577032fb7715d4f372348bf4e134e209230706"}, - {file = "beet-0.73.3.tar.gz", hash = "sha256:413e88a32e73b90d08b7838654b7fbf584187a2c58d2e6477046b05da001359c"}, + {file = "beet-0.75.0-py3-none-any.whl", hash = "sha256:dd32bcffc1365dba303a607d1cd0acf342ea865477e4848c794c70e142fca3fb"}, + {file = "beet-0.75.0.tar.gz", hash = "sha256:e2004077126fad2f47ceef26cfea73361ce4125b4e807d5aaf8fe3e4cc66978c"}, ] black = [ {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, From 082b5f64e86667c95febb4e6ef38be678cf6cfa5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 1 Oct 2022 17:54:08 +0000 Subject: [PATCH 1016/1554] 0.57.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 2d10e53be..f86e27b03 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.57.1 (2022-10-01) +### Fix +* Improve typing for AlternativeParser ([`08727c4`](https://github.com/mcbeet/mecha/commit/08727c4a8256ad8afa459eb76c02f7f7785555e4)) + ## v0.57.0 (2022-09-18) ### Feature * Use context generator to implement nesting ([`c15e258`](https://github.com/mcbeet/mecha/commit/c15e25864de0f29aba4711c49b0d819e815b565d)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 31f5a5b65..e5ec5a543 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.57.0" +__version__ = "0.57.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ebfc0fc11..8dc958f6b 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.57.0" +version = "0.57.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 08965701874555674a82925662b28523471f2656 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 4 Oct 2022 19:48:53 +0200 Subject: [PATCH 1017/1554] chore: update deps --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- packages/bolt/poetry.lock | 14 +++++++------- packages/bolt/pyproject.toml | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 21f59452a..1298f6adb 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.270" + "pyright": "^1.1.273" } }, "node_modules/pyright": { - "version": "1.1.270", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", - "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", + "version": "1.1.273", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.273.tgz", + "integrity": "sha512-uhBqKtRnC1Rvgz7uKp13VEwIR/UuqUvlscOu/y6hQhDzpFrZi0Gft7TrSLIMdy7fRAf85dS1nduQmAIWXgl4AA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.270", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", - "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", + "version": "1.1.273", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.273.tgz", + "integrity": "sha512-uhBqKtRnC1Rvgz7uKp13VEwIR/UuqUvlscOu/y6hQhDzpFrZi0Gft7TrSLIMdy7fRAf85dS1nduQmAIWXgl4AA==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 7df6475c3..f50b5c840 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.270" + "pyright": "^1.1.273" } } diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 868cbb52c..0fac0477b 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -14,7 +14,7 @@ tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy" [[package]] name = "beet" -version = "0.73.3" +version = "0.77.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -355,7 +355,7 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.57.0" +version = "0.57.1" description = "A powerful Minecraft command library" category = "main" optional = false @@ -842,7 +842,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e78cd8b5408e4a8849a5618cb0edbd1ae80051b59be15e1de97628c8adfd3869" +content-hash = "64ebb151f39e92105396061a4c7cebf32b3cd3e204c61669f81ca60506689807" [metadata.files] attrs = [ @@ -850,8 +850,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.73.3-py3-none-any.whl", hash = "sha256:d052fcd6c95f6601b89997730e577032fb7715d4f372348bf4e134e209230706"}, - {file = "beet-0.73.3.tar.gz", hash = "sha256:413e88a32e73b90d08b7838654b7fbf584187a2c58d2e6477046b05da001359c"}, + {file = "beet-0.77.0-py3-none-any.whl", hash = "sha256:1f6de533363153964c04ca8cd6e0cdb5d8f1793f36e8c47f59f6e328982e04fa"}, + {file = "beet-0.77.0.tar.gz", hash = "sha256:3bc4aadba76b6bbe6b9aa5d6e800031809e496eeec99a301d16411e0cf5f9360"}, ] black = [ {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, @@ -1084,8 +1084,8 @@ mdurl = [ {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mecha = [ - {file = "mecha-0.57.0-py3-none-any.whl", hash = "sha256:a3b8d91733b097c7935b928001237fb47b09a55442222a03fc795edc10f7ffd4"}, - {file = "mecha-0.57.0.tar.gz", hash = "sha256:9063f76c273e7e05c793806ef758487e71ecc33b398de73c6ce6ba4e6cda380a"}, + {file = "mecha-0.57.1-py3-none-any.whl", hash = "sha256:2adb178be7317140c790c49c248b6ae52b8f0a0888a4b1f3c220e6b15afe2fc1"}, + {file = "mecha-0.57.1.tar.gz", hash = "sha256:36d42d798e7627ef4d466b6c6b20153d0d96f99c9ba2154eb472b0dfffe29951"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index c458b1707..7b38d92cc 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.73.3" -mecha = ">=0.57.0" +beet = ">=0.77.0" +mecha = ">=0.57.1" [tool.poetry.dev-dependencies] pytest = "^7.1.3" From decb8b0ad04fe0c41063a09ca745eb88acf5dc2f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 4 Oct 2022 20:09:03 +0200 Subject: [PATCH 1018/1554] fix: reported 0 errors message --- packages/bolt/bolt/module.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index bb4754ae2..63c46397c 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -6,6 +6,7 @@ "MacroLibrary", "CodegenResult", "UnusableCompilationUnit", + "SilentCompilationInterrupt", ] @@ -67,6 +68,10 @@ def __str__(self) -> str: return self.message +class SilentCompilationInterrupt(DiagnosticCollection): + """Raised for interrupting the compilation when an unusable compilation unit already reported its own diagnostics.""" + + class Module(TextFile): """Class representing a bolt module.""" @@ -293,7 +298,7 @@ def error_handler(self, message: str, resource_location: Optional[str] = None): """Error handler for running module code.""" try: yield - except (BubbleException, InvalidSyntax): + except (BubbleException, InvalidSyntax, SilentCompilationInterrupt): raise except UnusableCompilationUnit as exc: if not exc.compilation_unit.diagnostics.error: @@ -301,7 +306,7 @@ def error_handler(self, message: str, resource_location: Optional[str] = None): if resource_location: message += f" ({resource_location})" raise CompilationError(message) from rewrite_traceback(exc) - raise DiagnosticCollection() from None + raise SilentCompilationInterrupt() from None except Exception as exc: if resource_location: message += f" ({resource_location})" From 41bcf39844424f42ece474973549663532cde677 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 4 Oct 2022 20:11:06 +0200 Subject: [PATCH 1019/1554] chore: broken action cache --- packages/bolt/.github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bolt/.github/workflows/main.yml b/packages/bolt/.github/workflows/main.yml index cbcd40aba..d646b52ea 100644 --- a/packages/bolt/.github/workflows/main.yml +++ b/packages/bolt/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.local - key: poetry0-${{ runner.os }} + key: poetry1-${{ runner.os }} - name: Install poetry if: steps.cached-poetry.outputs.cache-hit != 'true' uses: snok/install-poetry@v1 From 6a71e118739eed96c5b16aa514928af4fb35fc7f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 4 Oct 2022 18:12:28 +0000 Subject: [PATCH 1020/1554] 0.19.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 5 +++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index d0e52bd83..4f545bd49 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.19.2 (2022-10-04) +### Fix +* Reported 0 errors message ([`16e64b7`](https://github.com/mcbeet/bolt/commit/16e64b77d5516fa04687f156ace6a4ee050be95b)) +* Proper error for statements used as subcommands ([`647b1c6`](https://github.com/mcbeet/bolt/commit/647b1c6685f5653bf34fdc87fab7ce2a7edc6fba)) + ## v0.19.1 (2022-09-12) ### Fix * Add error for non-default args following default args ([`2af9854`](https://github.com/mcbeet/bolt/commit/2af9854d91818804b642ffe2a7b625a6412665ec)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 3f51d1129..2ae0f07da 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.19.1" +__version__ = "0.19.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 7b38d92cc..fcf94309c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.19.1" +version = "0.19.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 4a5f0f8759944068cb54662f03ef358be3bffd05 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 8 Oct 2022 23:43:42 +0200 Subject: [PATCH 1021/1554] fix: accurate error underline for tab freaks --- packages/mecha/mecha/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/mecha/mecha/utils.py b/packages/mecha/mecha/utils.py index d4b787e2c..b92af95ca 100644 --- a/packages/mecha/mecha/utils.py +++ b/packages/mecha/mecha/utils.py @@ -24,6 +24,8 @@ WHITESPACE_REGEX = re.compile(r"\s+") +NOTABS_REGEX = re.compile(r"[^\t]") + def normalize_whitespace(op: str) -> str: """Replace whitespace with underscores.""" @@ -171,7 +173,7 @@ def underline_code( stop = min(stop, len(code.rstrip()) + 1) if start < stop: - underline = " " * (start - 1) + "^" * (stop - start) + underline = NOTABS_REGEX.sub(" ", code[: start - 1]) + "^" * (stop - start) view.insert(index + 1, underline) gutter.insert(index + 1, ":") From 9c45e68e2ab3fd859fd92440512ce1c71333f239 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 8 Oct 2022 21:44:31 +0000 Subject: [PATCH 1022/1554] 0.57.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index f86e27b03..4806b9b59 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.57.2 (2022-10-08) +### Fix +* Accurate error underline for tab freaks ([`8f1064d`](https://github.com/mcbeet/mecha/commit/8f1064d5f4d2bd9fd8dd2b357d0626de933b596e)) + ## v0.57.1 (2022-10-01) ### Fix * Improve typing for AlternativeParser ([`08727c4`](https://github.com/mcbeet/mecha/commit/08727c4a8256ad8afa459eb76c02f7f7785555e4)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e5ec5a543..e37d461d4 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.57.1" +__version__ = "0.57.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8dc958f6b..b6e3c722e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.57.1" +version = "0.57.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 678a5b966c5f04dd914785ff86bc6fbb9a6ab70e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 12:37:51 +0000 Subject: [PATCH 1023/1554] chore(deps): bump beet from 0.75.0 to 0.77.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.75.0 to 0.77.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.75.0...v0.77.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 38fc3c9fb..a6af034cb 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -14,7 +14,7 @@ tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy" [[package]] name = "beet" -version = "0.75.0" +version = "0.77.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -838,8 +838,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] beet = [ - {file = "beet-0.75.0-py3-none-any.whl", hash = "sha256:dd32bcffc1365dba303a607d1cd0acf342ea865477e4848c794c70e142fca3fb"}, - {file = "beet-0.75.0.tar.gz", hash = "sha256:e2004077126fad2f47ceef26cfea73361ce4125b4e807d5aaf8fe3e4cc66978c"}, + {file = "beet-0.77.0-py3-none-any.whl", hash = "sha256:1f6de533363153964c04ca8cd6e0cdb5d8f1793f36e8c47f59f6e328982e04fa"}, + {file = "beet-0.77.0.tar.gz", hash = "sha256:3bc4aadba76b6bbe6b9aa5d6e800031809e496eeec99a301d16411e0cf5f9360"}, ] black = [ {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, From 69c6ea9ba609892174eff2dc0efb6229cd3ed50e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Sep 2022 12:26:44 +0000 Subject: [PATCH 1024/1554] chore(deps-dev): bump lectern from 0.24.0 to 0.25.0 Bumps [lectern](https://github.com/mcbeet/lectern) from 0.24.0 to 0.25.0. - [Release notes](https://github.com/mcbeet/lectern/releases) - [Changelog](https://github.com/mcbeet/lectern/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/lectern/compare/v0.24.0...v0.25.0) --- updated-dependencies: - dependency-name: lectern dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index a6af034cb..a07c82c17 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -305,14 +305,14 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", [[package]] name = "lectern" -version = "0.24.0" +version = "0.25.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.68.2" +beet = ">=0.73.3" click = ">=8.1.3,<9.0.0" markdown-it-py = ">=2.1.0,<3.0.0" @@ -1016,8 +1016,8 @@ keyring = [ {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, ] lectern = [ - {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, - {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, + {file = "lectern-0.25.0-py3-none-any.whl", hash = "sha256:28db47c112ed3a82f57876411146974e138dd844e596add6a5c02e0fbf19e914"}, + {file = "lectern-0.25.0.tar.gz", hash = "sha256:80f7e48440a8fbaeda029cddc0c0abed7ebd4a7500ce85aba2815d252131be46"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, From 4db8bee78993b27884859f5c4d28fc80d128ce62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 12:27:11 +0000 Subject: [PATCH 1025/1554] chore(deps-dev): bump pyright from 1.1.270 to 1.1.274 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.270 to 1.1.274. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.274/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 70fd8837d..702a06e4a 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.270" + "pyright": "^1.1.274" } }, "node_modules/pyright": { - "version": "1.1.270", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", - "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", + "version": "1.1.274", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.274.tgz", + "integrity": "sha512-+MEiHktoAxlehWbBAF2vwJkJxV5tObbLK6vnc7u+iDBH06vuHqTqY33AV+YGNwfDEU35chw5zu7H3EpGROXsGQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.270", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.270.tgz", - "integrity": "sha512-9SmZfgAhByPeMk0AAb41lAXENjoC1gGXKCP4qaexGAEu9pOYSUMQFgNTyRzKizafa6LtIBGGhgSaJrpWZyBn7w==", + "version": "1.1.274", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.274.tgz", + "integrity": "sha512-+MEiHktoAxlehWbBAF2vwJkJxV5tObbLK6vnc7u+iDBH06vuHqTqY33AV+YGNwfDEU35chw5zu7H3EpGROXsGQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 7df6475c3..419fd66f1 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.270" + "pyright": "^1.1.274" } } From 7629a5f1e86052b214b26ef3eeda0b216e3dbc3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 12:19:50 +0000 Subject: [PATCH 1026/1554] chore(deps-dev): bump black from 22.8.0 to 22.10.0 Bumps [black](https://github.com/psf/black) from 22.8.0 to 22.10.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.8.0...22.10.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 41 +++++++++++++---------------------- packages/mecha/pyproject.toml | 2 +- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index a07c82c17..f1b27bfa9 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -36,11 +36,11 @@ image = ["Pillow"] [[package]] name = "black" -version = "22.8.0" +version = "22.10.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" @@ -830,7 +830,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "d7843fc616f0ba700830f894d3ae4112c36793de794a1200c14b7c627441be8d" +content-hash = "ae9a066051ee9b4fdcb0a0c6f17d1700fbb9822425f03b1d7c88047ab19fd499" [metadata.files] attrs = [ @@ -842,29 +842,18 @@ beet = [ {file = "beet-0.77.0.tar.gz", hash = "sha256:3bc4aadba76b6bbe6b9aa5d6e800031809e496eeec99a301d16411e0cf5f9360"}, ] black = [ - {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, - {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, - {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, - {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, - {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, - {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, - {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, - {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, - {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, - {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, - {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, - {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, - {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, - {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, - {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, - {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, - {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, - {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, - {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] bleach = [ {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index b6e3c722e..59dc0f32f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -27,7 +27,7 @@ beet = ">=0.73.3" tokenstream = "^1.4.2" [tool.poetry.dev-dependencies] -black = "^22.8.0" +black = "^22.10.0" pytest = "^7.1.3" isort = "^5.10.1" python-semantic-release = "^7.31.4" From 13be96e5ecd003e3b1e02ac6a40262d49b3dd4d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Oct 2022 21:49:48 +0000 Subject: [PATCH 1027/1554] chore(deps-dev): bump python-semantic-release from 7.31.4 to 7.32.1 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.31.4 to 7.32.1. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/relekang/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.31.4...v7.32.1) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 17 +++++++++++++---- packages/mecha/pyproject.toml | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index f1b27bfa9..26a5db962 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -534,7 +534,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.31.4" +version = "7.32.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -830,7 +830,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "ae9a066051ee9b4fdcb0a0c6f17d1700fbb9822425f03b1d7c88047ab19fd499" +content-hash = "6d70771139ba62f89b107cd15f77f757a3a150ed4a497d9c533bd5bcb8bc9d98" [metadata.files] attrs = [ @@ -842,14 +842,23 @@ beet = [ {file = "beet-0.77.0.tar.gz", hash = "sha256:3bc4aadba76b6bbe6b9aa5d6e800031809e496eeec99a301d16411e0cf5f9360"}, ] black = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, @@ -1175,8 +1184,8 @@ python-gitlab = [ {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.31.4.tar.gz", hash = "sha256:ee00c396b6d394b87b5ba3cf6be0f759f2f23783c2215e3ac4c22dc4bc676d60"}, - {file = "python_semantic_release-7.31.4-py3-none-any.whl", hash = "sha256:05d37cb3e3b6e84770128debede8421b24fceaecfbaa9eb62ffcfc1ea2c857f2"}, + {file = "python-semantic-release-7.32.1.tar.gz", hash = "sha256:ba47100e4ffa74c006529d6a8c22ca98f85ff4c145e8584eb2b17e6830a5116e"}, + {file = "python_semantic_release-7.32.1-py3-none-any.whl", hash = "sha256:9a29a02b3fb33fc318b07bf77c001c62aed9060d148eca25af7f4aa3afb49f4e"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 59dc0f32f..dbbf42afb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -30,7 +30,7 @@ tokenstream = "^1.4.2" black = "^22.10.0" pytest = "^7.1.3" isort = "^5.10.1" -python-semantic-release = "^7.31.4" +python-semantic-release = "^7.32.1" pytest-insta = "^0.1.11" lectern = ">=0.24.0" From ef585dbb9ed4fa04247592236affd8c2e2c369bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Oct 2022 12:25:23 +0000 Subject: [PATCH 1028/1554] chore(deps-dev): bump pyright from 1.1.274 to 1.1.276 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.274 to 1.1.276. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.276/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 702a06e4a..86e0b45a2 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.274" + "pyright": "^1.1.276" } }, "node_modules/pyright": { - "version": "1.1.274", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.274.tgz", - "integrity": "sha512-+MEiHktoAxlehWbBAF2vwJkJxV5tObbLK6vnc7u+iDBH06vuHqTqY33AV+YGNwfDEU35chw5zu7H3EpGROXsGQ==", + "version": "1.1.276", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.276.tgz", + "integrity": "sha512-qG98S7X16hoymOlngwleX4bg6CzlE6sxclrqkif8Kqfm0bsaC/jiBxs2lWN+QJY9JL8hpK6j5MchFh4qSaZCEw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.274", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.274.tgz", - "integrity": "sha512-+MEiHktoAxlehWbBAF2vwJkJxV5tObbLK6vnc7u+iDBH06vuHqTqY33AV+YGNwfDEU35chw5zu7H3EpGROXsGQ==", + "version": "1.1.276", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.276.tgz", + "integrity": "sha512-qG98S7X16hoymOlngwleX4bg6CzlE6sxclrqkif8Kqfm0bsaC/jiBxs2lWN+QJY9JL8hpK6j5MchFh4qSaZCEw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 419fd66f1..6f64f30ea 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.274" + "pyright": "^1.1.276" } } From f7d8a57ce7628d4a0beb2b26fa786aa1b4567799 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 19 Oct 2022 20:50:55 +0200 Subject: [PATCH 1029/1554] fix: update deps --- packages/mecha/poetry.lock | 676 ++++++++++++++++-------------- packages/mecha/pyproject.toml | 31 +- packages/mecha/pyrightconfig.json | 3 - 3 files changed, 358 insertions(+), 352 deletions(-) delete mode 100644 packages/mecha/pyrightconfig.json diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 26a5db962..89712298f 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -1,20 +1,20 @@ [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "beet" -version = "0.77.0" +version = "0.79.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -58,7 +58,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "5.0.0" +version = "5.0.1" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false @@ -69,19 +69,20 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -dev = ["black (==22.3.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.942)", "pip-tools (==6.5.1)", "pytest (==7.1.1)", "sphinx (==4.3.2)", "tox (==3.24.5)", "twine (==4.0.0)", "wheel (==0.37.1)"] +css = ["tinycss2 (>=1.1.0,<1.2)"] +dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.15.0" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -92,11 +93,11 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -139,7 +140,7 @@ click = "*" [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -147,7 +148,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "36.0.2" +version = "38.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -157,31 +158,28 @@ python-versions = ">=3.6" cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx_rtd_theme"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "docutils" -version = "0.18.1" +version = "0.19" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [[package]] name = "dotty-dict" -version = "1.3.0" +version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." category = "dev" optional = false -python-versions = "*" - -[package.dependencies] -setuptools_scm = "*" +python-versions = ">=3.5,<4.0" [[package]] name = "gitdb" @@ -195,8 +193,8 @@ python-versions = ">=3.6" smmap = ">=3.0.1,<6" [[package]] -name = "gitpython" -version = "3.1.27" +name = "GitPython" +version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false @@ -207,7 +205,7 @@ gitdb = ">=4.0.1,<5" [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -215,7 +213,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "5.0.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -225,9 +223,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -239,7 +237,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.7.0" +version = "1.7.3" description = "Pythonic task execution" category = "dev" optional = false @@ -259,6 +257,21 @@ pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] requirements_deprecated_finder = ["pip-api", "pipreqs"] +[[package]] +name = "jaraco.classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "jeepney" version = "0.8.0" @@ -287,21 +300,22 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.5.0" +version = "23.9.3" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -importlib-metadata = ">=3.6" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +"jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["jaraco.packaging (>=8.2)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "lectern" @@ -338,7 +352,7 @@ rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx- testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "markupsafe" +name = "MarkupSafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" @@ -347,12 +361,20 @@ python-versions = ">=3.7" [[package]] name = "mdurl" -version = "0.1.1" +version = "0.1.2" description = "Markdown URL utilities" category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "more-itertools" +version = "9.0.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "mypy-extensions" version = "0.4.3" @@ -374,7 +396,7 @@ numpy = "*" [[package]] name = "numpy" -version = "1.22.3" +version = "1.23.4" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -401,25 +423,25 @@ python-versions = ">=3.7" [[package]] name = "pkginfo" -version = "1.8.2" +version = "1.8.3" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] @@ -466,16 +488,19 @@ dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] [[package]] -name = "pygments" -version = "2.11.2" +name = "Pygments" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pyparsing" -version = "3.0.8" +version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false @@ -518,7 +543,7 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.3.0" +version = "3.10.0" description = "Interact with GitLab API" category = "dev" optional = false @@ -569,7 +594,7 @@ optional = false python-versions = "*" [[package]] -name = "pyyaml" +name = "PyYAML" version = "6.0" description = "YAML parser and emitter for Python" category = "main" @@ -578,11 +603,11 @@ python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "34.0" +version = "37.2" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] bleach = ">=2.1.0" @@ -594,29 +619,29 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.9.1" +version = "0.10.0" description = "A utility belt for advanced users of python-requests" category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] requests = ">=2.0.1,<3.0.0" @@ -633,8 +658,8 @@ python-versions = ">=3.7" idna2008 = ["idna"] [[package]] -name = "secretstorage" -version = "3.3.1" +name = "SecretStorage" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false @@ -652,36 +677,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "setuptools" -version = "65.3.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "6.4.2" -description = "the blessed package to manage your versions by scm tags" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = ">=20.0" -setuptools = "*" -tomli = ">=1.0.0" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] - [[package]] name = "six" version = "1.16.0" @@ -724,7 +719,7 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.10.1" +version = "0.11.5" description = "Style preserving TOML library" category = "dev" optional = false @@ -732,7 +727,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "tqdm" -version = "4.64.0" +version = "4.64.1" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -769,23 +764,23 @@ urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.12" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -809,7 +804,7 @@ test = ["pytest (>=3.0.0)", "pytest-cov"] [[package]] name = "wrapt" -version = "1.14.0" +version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false @@ -817,29 +812,29 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.8.0" +version = "3.9.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "6d70771139ba62f89b107cd15f77f757a3a150ed4a497d9c533bd5bcb8bc9d98" +content-hash = "99f28beac712ff0ad1c9a7869405e35a06784887bc7c1bf3e0bf227544357ccd" [metadata.files] attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.77.0-py3-none-any.whl", hash = "sha256:1f6de533363153964c04ca8cd6e0cdb5d8f1793f36e8c47f59f6e328982e04fa"}, - {file = "beet-0.77.0.tar.gz", hash = "sha256:3bc4aadba76b6bbe6b9aa5d6e800031809e496eeec99a301d16411e0cf5f9360"}, + {file = "beet-0.79.0-py3-none-any.whl", hash = "sha256:bac4f80f635d910059fe15c080564cb2338dccdfd6178d267f8c93b6786de3ae"}, + {file = "beet-0.79.0.tar.gz", hash = "sha256:76fe3b0a5dadb97de51b1891f73f568b2a8fe74436834f41a8725d921ca18577"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, @@ -865,68 +860,82 @@ black = [ {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] bleach = [ - {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, - {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, ] cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, ] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, @@ -941,66 +950,77 @@ click-log = [ {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] cryptography = [ - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, - {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, - {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, - {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, + {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, + {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, + {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, + {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, + {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, + {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, + {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, ] docutils = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] dotty-dict = [ - {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, + {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, + {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -gitpython = [ - {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, +GitPython = [ + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, - {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] +"jaraco.classes" = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] jeepney = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, @@ -1010,8 +1030,8 @@ Jinja2 = [ {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, - {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, + {file = "keyring-23.9.3-py3-none-any.whl", hash = "sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0"}, + {file = "keyring-23.9.3.tar.gz", hash = "sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5"}, ] lectern = [ {file = "lectern-0.25.0-py3-none-any.whl", hash = "sha256:28db47c112ed3a82f57876411146974e138dd844e596add6a5c02e0fbf19e914"}, @@ -1021,7 +1041,7 @@ markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] -markupsafe = [ +MarkupSafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, @@ -1064,8 +1084,12 @@ markupsafe = [ {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] mdurl = [ - {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, - {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] +more-itertools = [ + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1076,26 +1100,34 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, - {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, - {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, - {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, - {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, - {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, - {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, - {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, - {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, - {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, + {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, + {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, + {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, + {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, + {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, + {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, + {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, + {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, + {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1106,12 +1138,12 @@ pathspec = [ {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] pkginfo = [ - {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, - {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, ] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, @@ -1163,13 +1195,13 @@ pydantic = [ {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, +Pygments = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, @@ -1180,8 +1212,8 @@ pytest-insta = [ {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-3.3.0.tar.gz", hash = "sha256:fef25d41a62f91da82ee20f72a728b9c69eef34cf0a3005cdbb9a0b471d5b498"}, - {file = "python_gitlab-3.3.0-py3-none-any.whl", hash = "sha256:ab1fd4c98a206f22f01f832bc58f24a09952089b7bbf67cdaee6308e7797503f"}, + {file = "python-gitlab-3.10.0.tar.gz", hash = "sha256:14930a16fdd7f36f67b9373e7d4d4720e8e374800028380289db3306e9f74614"}, + {file = "python_gitlab-3.10.0-py3-none-any.whl", hash = "sha256:6b5a24d0f479c43c1759cb174cf42116ed27cced31284bedc82d584d860fa238"}, ] python-semantic-release = [ {file = "python-semantic-release-7.32.1.tar.gz", hash = "sha256:ba47100e4ffa74c006529d6a8c22ca98f85ff4c145e8584eb2b17e6830a5116e"}, @@ -1191,7 +1223,7 @@ pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] -pyyaml = [ +PyYAML = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1234,37 +1266,29 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-34.0-py3-none-any.whl", hash = "sha256:262510fe6aae81ed4e94d8b169077f325614c0b1a45916a80442c6576264a9c2"}, - {file = "readme_renderer-34.0.tar.gz", hash = "sha256:dfb4d17f21706d145f7473e0b61ca245ba58e810cf9b2209a48239677f82e5b0"}, + {file = "readme_renderer-37.2-py3-none-any.whl", hash = "sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106"}, + {file = "readme_renderer-37.2.tar.gz", hash = "sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, + {file = "requests-toolbelt-0.10.0.tar.gz", hash = "sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30"}, + {file = "requests_toolbelt-0.10.0-py2.py3-none-any.whl", hash = "sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985"}, ] rfc3986 = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, ] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, +SecretStorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] semver = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] -setuptools = [ - {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, - {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1286,24 +1310,24 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, - {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, + {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, + {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, ] tqdm = [ - {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, - {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, ] twine = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, @@ -1314,72 +1338,72 @@ wheel = [ {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, ] wrapt = [ - {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, - {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, - {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, - {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, - {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, - {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, - {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, - {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, - {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, - {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, - {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, - {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, - {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, - {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, - {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, - {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, + {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, + {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, ] diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index dbbf42afb..435d34855 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,16 +23,16 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.73.3" +beet = ">=0.79.0" tokenstream = "^1.4.2" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] black = "^22.10.0" pytest = "^7.1.3" isort = "^5.10.1" python-semantic-release = "^7.32.1" pytest-insta = "^0.1.11" -lectern = ">=0.24.0" +lectern = ">=0.25.0" [tool.poetry.scripts] mecha = "mecha.cli:main" @@ -41,28 +41,13 @@ mecha = "mecha.cli:main" commands = "mecha.commands" [tool.pytest.ini_options] -minversion = "6.0" -addopts = "tests mecha --ignore mecha/__main__.py --doctest-modules" -doctest_optionflags = "NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL ELLIPSIS" +addopts = "tests --import-mode=importlib" + +[tool.pyright] +typeCheckingMode = "strict" [tool.black] target-version = ["py38"] -include = '\.pyi?$' -exclude = ''' -/( - \.eggs - | \.git - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | node_modules - | _build - | buck-out - | build - | dist -)/ -''' [tool.isort] profile = "black" @@ -75,5 +60,5 @@ major_on_zero = false build_command = "poetry build" [build-system] -requires = ["poetry-core>=1.0.0"] +requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/packages/mecha/pyrightconfig.json b/packages/mecha/pyrightconfig.json deleted file mode 100644 index 0102dcd92..000000000 --- a/packages/mecha/pyrightconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typeCheckingMode": "strict" -} From 4a38c001e2ac841503096792b0c269f6b99883ee Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 19 Oct 2022 18:54:18 +0000 Subject: [PATCH 1030/1554] 0.57.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 4806b9b59..56a82d33f 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.57.3 (2022-10-19) +### Fix +* Update deps ([`146c8bc`](https://github.com/mcbeet/mecha/commit/146c8bcfcf8a4bf5ed5053980c878ffb061ed12b)) + ## v0.57.2 (2022-10-08) ### Fix * Accurate error underline for tab freaks ([`8f1064d`](https://github.com/mcbeet/mecha/commit/8f1064d5f4d2bd9fd8dd2b357d0626de933b596e)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e37d461d4..58258e56e 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.57.2" +__version__ = "0.57.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 435d34855..54aa5b41c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.57.2" +version = "0.57.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 95e233d6a2a25c3b1e19db606ae49c6e5a00cf29 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 19 Oct 2022 22:27:14 +0200 Subject: [PATCH 1031/1554] fix: tweak nested yaml --- packages/mecha/mecha/contrib/nested_yaml.py | 47 ++++++++++----------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/mecha/mecha/contrib/nested_yaml.py b/packages/mecha/mecha/contrib/nested_yaml.py index 3bbd1a695..386a6a553 100644 --- a/packages/mecha/mecha/contrib/nested_yaml.py +++ b/packages/mecha/mecha/contrib/nested_yaml.py @@ -268,36 +268,35 @@ def parse_yaml(self, stream: TokenStream) -> Any: with self.array_collector.start(): while True: with stream.provide(line_indentation=dash.location.colno - 1): - self.array_collector.emit(self.parse_yaml(stream)) + with stream.checkpoint() as commit: + self.array_collector.emit(self.parse_yaml(stream)) + commit() + if commit.rollback: + self.array_collector.emit(self.parser(stream)) if consume_line_continuation(stream): dash = stream.expect("dash") else: return self.array_collector.result() - with stream.checkpoint() as commit: - key = stream.expect("key") - stream.expect("colon") - - commit() - - with self.object_collector.start(): - while True: - with stream.provide(line_indentation=key.location.colno - 1): - self.object_collector.emit( - key=key.value, - value=self.parser(stream), - location=key.location, - end_location=key.end_location, - ) - - if consume_line_continuation(stream): - key = stream.expect("key") - stream.expect("colon") - else: - return self.object_collector.result() - - return self.parser(stream) # type: ignore + key = stream.expect("key") + stream.expect("colon") + + with self.object_collector.start(): + while True: + with stream.provide(line_indentation=key.location.colno - 1): + self.object_collector.emit( + key=key.value, + value=self.parser(stream), + location=key.location, + end_location=key.end_location, + ) + + if consume_line_continuation(stream): + key = stream.expect("key") + stream.expect("colon") + else: + return self.object_collector.result() @dataclass From 948aa37b88dd8d5b4074de864543fa84e625959e Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 19 Oct 2022 20:28:18 +0000 Subject: [PATCH 1032/1554] 0.57.4 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 56a82d33f..11defef57 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.57.4 (2022-10-19) +### Fix +* Tweak nested yaml ([`9c69a1d`](https://github.com/mcbeet/mecha/commit/9c69a1d21f581e8e9bef7e44cb41e7c6f2f18025)) + ## v0.57.3 (2022-10-19) ### Fix * Update deps ([`146c8bc`](https://github.com/mcbeet/mecha/commit/146c8bcfcf8a4bf5ed5053980c878ffb061ed12b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 58258e56e..c0e5ebf7a 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.57.3" +__version__ = "0.57.4" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 54aa5b41c..ba2b9c717 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.57.3" +version = "0.57.4" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 49893895c65d02842e70ef4f4fc60af445d320f5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 19 Oct 2022 21:00:56 +0200 Subject: [PATCH 1033/1554] fix: update deps --- packages/bolt/poetry.lock | 604 ++++++++++++++++++----------------- packages/bolt/pyproject.toml | 17 +- 2 files changed, 320 insertions(+), 301 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 0fac0477b..0aad04d50 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -1,20 +1,20 @@ [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "beet" -version = "0.77.0" +version = "0.79.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -36,11 +36,11 @@ image = ["Pillow"] [[package]] name = "black" -version = "22.8.0" +version = "22.10.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" @@ -58,7 +58,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "5.0.0" +version = "5.0.1" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false @@ -69,19 +69,20 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -dev = ["black (==22.3.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.942)", "pip-tools (==6.5.1)", "pytest (==7.1.1)", "sphinx (==4.3.2)", "tox (==3.24.5)", "twine (==4.0.0)", "wheel (==0.37.1)"] +css = ["tinycss2 (>=1.1.0,<1.2)"] +dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.15.0" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -92,11 +93,11 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -139,7 +140,7 @@ click = "*" [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -147,7 +148,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "37.0.1" +version = "38.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -157,31 +158,28 @@ python-versions = ">=3.6" cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx_rtd_theme"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "docutils" -version = "0.18.1" +version = "0.19" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [[package]] name = "dotty-dict" -version = "1.3.0" +version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." category = "dev" optional = false -python-versions = "*" - -[package.dependencies] -setuptools_scm = "*" +python-versions = ">=3.5,<4.0" [[package]] name = "gitdb" @@ -195,8 +193,8 @@ python-versions = ">=3.6" smmap = ">=3.0.1,<6" [[package]] -name = "gitpython" -version = "3.1.27" +name = "GitPython" +version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false @@ -207,7 +205,7 @@ gitdb = ">=4.0.1,<5" [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -215,7 +213,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "5.0.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -225,9 +223,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -239,7 +237,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.7.0" +version = "1.7.3" description = "Pythonic task execution" category = "dev" optional = false @@ -259,6 +257,21 @@ pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] requirements_deprecated_finder = ["pip-api", "pipreqs"] +[[package]] +name = "jaraco.classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "jeepney" version = "0.8.0" @@ -272,7 +285,7 @@ test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "te trio = ["async_generator", "trio"] [[package]] -name = "jinja2" +name = "Jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "main" @@ -287,32 +300,33 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.5.0" +version = "23.9.3" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -importlib-metadata = ">=3.6" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +"jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["jaraco.packaging (>=8.2)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "lectern" -version = "0.24.0" +version = "0.25.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.68.2" +beet = ">=0.73.3" click = ">=8.1.3,<9.0.0" markdown-it-py = ">=2.1.0,<3.0.0" @@ -338,7 +352,7 @@ rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx- testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "markupsafe" +name = "MarkupSafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" @@ -347,7 +361,7 @@ python-versions = ">=3.7" [[package]] name = "mdurl" -version = "0.1.1" +version = "0.1.2" description = "Markdown URL utilities" category = "dev" optional = false @@ -355,16 +369,24 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.57.1" +version = "0.57.4" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.73.3" +beet = ">=0.79.0" tokenstream = ">=1.4.2,<2.0.0" +[[package]] +name = "more-itertools" +version = "9.0.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "mypy-extensions" version = "0.4.3" @@ -386,7 +408,7 @@ numpy = "*" [[package]] name = "numpy" -version = "1.22.3" +version = "1.23.4" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -413,11 +435,11 @@ python-versions = ">=3.7" [[package]] name = "pkginfo" -version = "1.8.2" +version = "1.8.3" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] testing = ["coverage", "nose"] @@ -478,16 +500,19 @@ dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] [[package]] -name = "pygments" -version = "2.12.0" +name = "Pygments" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pyparsing" -version = "3.0.8" +version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false @@ -530,7 +555,7 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.4.0" +version = "3.10.0" description = "Interact with GitLab API" category = "dev" optional = false @@ -546,7 +571,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.31.4" +version = "7.32.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -581,7 +606,7 @@ optional = false python-versions = "*" [[package]] -name = "pyyaml" +name = "PyYAML" version = "6.0" description = "YAML parser and emitter for Python" category = "main" @@ -590,7 +615,7 @@ python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "35.0" +version = "37.2" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -606,29 +631,29 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.9.1" +version = "0.10.0" description = "A utility belt for advanced users of python-requests" category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] requests = ">=2.0.1,<3.0.0" @@ -645,8 +670,8 @@ python-versions = ">=3.7" idna2008 = ["idna"] [[package]] -name = "secretstorage" -version = "3.3.2" +name = "SecretStorage" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false @@ -664,36 +689,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "setuptools" -version = "65.3.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "6.4.2" -description = "the blessed package to manage your versions by scm tags" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = ">=20.0" -setuptools = "*" -tomli = ">=1.0.0" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] - [[package]] name = "six" version = "1.16.0" @@ -736,7 +731,7 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.10.2" +version = "0.11.5" description = "Style preserving TOML library" category = "dev" optional = false @@ -744,7 +739,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "tqdm" -version = "4.64.0" +version = "4.64.1" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -781,7 +776,7 @@ urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "4.2.0" +version = "4.4.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -789,15 +784,15 @@ python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.12" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -829,118 +824,130 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.8.0" +version = "3.9.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "64ebb151f39e92105396061a4c7cebf32b3cd3e204c61669f81ca60506689807" +content-hash = "ada617af558e01b9a252bba0e1bff2fc128804dfaab6beb892b81b40bbf16edf" [metadata.files] attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.77.0-py3-none-any.whl", hash = "sha256:1f6de533363153964c04ca8cd6e0cdb5d8f1793f36e8c47f59f6e328982e04fa"}, - {file = "beet-0.77.0.tar.gz", hash = "sha256:3bc4aadba76b6bbe6b9aa5d6e800031809e496eeec99a301d16411e0cf5f9360"}, + {file = "beet-0.79.0-py3-none-any.whl", hash = "sha256:bac4f80f635d910059fe15c080564cb2338dccdfd6178d267f8c93b6786de3ae"}, + {file = "beet-0.79.0.tar.gz", hash = "sha256:76fe3b0a5dadb97de51b1891f73f568b2a8fe74436834f41a8725d921ca18577"}, ] black = [ - {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, - {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, - {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, - {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, - {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, - {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, - {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, - {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, - {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, - {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, - {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, - {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, - {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, - {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, - {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, - {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, - {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, - {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, - {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] bleach = [ - {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, - {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, ] cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, ] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, @@ -955,89 +962,98 @@ click-log = [ {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] cryptography = [ - {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:74b55f67f4cf026cb84da7a1b04fc2a1d260193d4ad0ea5e9897c8b74c1e76ac"}, - {file = "cryptography-37.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0db5cf21bd7d092baacb576482b0245102cea2d3cf09f09271ce9f69624ecb6f"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:faf0f5456c059c7b1c29441bdd5e988f0ba75bdc3eea776520d8dcb1e30e1b5c"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:06bfafa6e53ccbfb7a94be4687b211a025ce0625e3f3c60bb15cd048a18f3ed8"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf585476fcbcd37bed08072e8e2db3954ce1bfc68087a2dc9c19cfe0b90979ca"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4daf890e674d191757d8d7d60dc3a29c58c72c7a76a05f1c0a326013f47e8b"}, - {file = "cryptography-37.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:ae1cd29fbe6b716855454e44f4bf743465152e15d2d317303fe3b58ee9e5af7a"}, - {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:451aaff8b8adf2dd0597cbb1fdcfc8a7d580f33f843b7cce75307a7f20112dd8"}, - {file = "cryptography-37.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1858eff6246bb8bbc080eee78f3dd1528739e3f416cba5f9914e8631b8df9871"}, - {file = "cryptography-37.0.1-cp36-abi3-win32.whl", hash = "sha256:e69a0e36e62279120e648e787b76d79b41e0f9e86c1c636a4f38d415595c722e"}, - {file = "cryptography-37.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a18ff4bfa9d64914a84d7b06c46eb86e0cc03113470b3c111255aceb6dcaf81d"}, - {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce90609e01e1b192fae9e13665058ab46b2ea53a3c05a3ea74a3eb8c3af8857"}, - {file = "cryptography-37.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c4a58eeafbd7409054be41a377e726a7904a17c26f45abf18125d21b1215b08b"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:618391152147a1221c87b1b0b7f792cafcfd4b5a685c5c72eeea2ddd29aeceff"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ceae26f876aabe193b13a0c36d1bb8e3e7e608d17351861b437bd882f617e9f"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:930b829e8a2abaf43a19f38277ae3c5e1ffcf547b936a927d2587769ae52c296"}, - {file = "cryptography-37.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58021d6e9b1d88b1105269d0da5e60e778b37dfc0e824efc71343dd003726831"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b1ee5c82cf03b30f6ae4e32d2bcb1e167ef74d6071cbb77c2af30f101d0b360b"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f095988548ec5095e3750cdb30e6962273d239b1998ba1aac66c0d5bee7111c1"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:125702572be12bcd318e3a14e9e70acd4be69a43664a75f0397e8650fe3c6cc3"}, - {file = "cryptography-37.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:315af6268de72bcfa0bb3401350ce7d921f216e6b60de12a363dad128d9d459f"}, - {file = "cryptography-37.0.1.tar.gz", hash = "sha256:d610d0ee14dd9109006215c7c0de15eee91230b70a9bce2263461cf7c3720b83"}, + {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, + {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, + {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, + {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, + {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, + {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, + {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, + {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, + {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, + {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, + {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, ] docutils = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] dotty-dict = [ - {file = "dotty_dict-1.3.0.tar.gz", hash = "sha256:eb0035a3629ecd84397a68f1f42f1e94abd1c34577a19cd3eacad331ee7cbaf0"}, + {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, + {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -gitpython = [ - {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, +GitPython = [ + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.7.0-py3-none-any.whl", hash = "sha256:a5159fc63dba6ca2a87a1e33d282b99cea69711b03c64a35bb4e1c53c6c4afa0"}, - {file = "invoke-1.7.0.tar.gz", hash = "sha256:e332e49de40463f2016315f51df42313855772be86435686156bc18f45b5cc6c"}, + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] +"jaraco.classes" = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] jeepney = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] -jinja2 = [ +Jinja2 = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, - {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, + {file = "keyring-23.9.3-py3-none-any.whl", hash = "sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0"}, + {file = "keyring-23.9.3.tar.gz", hash = "sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5"}, ] lectern = [ - {file = "lectern-0.24.0-py3-none-any.whl", hash = "sha256:d20aebaf9062424d5d072c63c3708b1cc03360adc6eae157bd4ca54ab38d4e19"}, - {file = "lectern-0.24.0.tar.gz", hash = "sha256:b8f8bdaf2ff90184218df47fc8a8c30ac51ac581d4147139b6d5d83a75b1d251"}, + {file = "lectern-0.25.0-py3-none-any.whl", hash = "sha256:28db47c112ed3a82f57876411146974e138dd844e596add6a5c02e0fbf19e914"}, + {file = "lectern-0.25.0.tar.gz", hash = "sha256:80f7e48440a8fbaeda029cddc0c0abed7ebd4a7500ce85aba2815d252131be46"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] -markupsafe = [ +MarkupSafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, @@ -1080,12 +1096,16 @@ markupsafe = [ {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] mdurl = [ - {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, - {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] mecha = [ - {file = "mecha-0.57.1-py3-none-any.whl", hash = "sha256:2adb178be7317140c790c49c248b6ae52b8f0a0888a4b1f3c220e6b15afe2fc1"}, - {file = "mecha-0.57.1.tar.gz", hash = "sha256:36d42d798e7627ef4d466b6c6b20153d0d96f99c9ba2154eb472b0dfffe29951"}, + {file = "mecha-0.57.4-py3-none-any.whl", hash = "sha256:e2a2ee20ec0dfe7aa34e009f67b918b6b0a80ca6bc96616e17ce17771f07deaf"}, + {file = "mecha-0.57.4.tar.gz", hash = "sha256:cf91fb829addd652804d9cd3b9bc38c6d1f5127c4546aed3f799d9f8ad9b8415"}, +] +more-itertools = [ + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1096,26 +1116,34 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, - {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, - {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, - {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, - {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, - {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, - {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, - {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, - {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, - {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, + {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, + {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, + {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, + {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, + {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, + {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, + {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, + {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, + {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1126,8 +1154,8 @@ pathspec = [ {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] pkginfo = [ - {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, - {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, ] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, @@ -1183,13 +1211,13 @@ pydantic = [ {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, ] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +Pygments = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, @@ -1200,18 +1228,18 @@ pytest-insta = [ {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-3.4.0.tar.gz", hash = "sha256:6180b81ee2f265ad8d8412956a1740b4d3ceca7b28ae2f707dfe62375fed0082"}, - {file = "python_gitlab-3.4.0-py3-none-any.whl", hash = "sha256:251b63f0589d51f854516948c84e9eb8df26e1e9dea595cf86b43f17c43007dd"}, + {file = "python-gitlab-3.10.0.tar.gz", hash = "sha256:14930a16fdd7f36f67b9373e7d4d4720e8e374800028380289db3306e9f74614"}, + {file = "python_gitlab-3.10.0-py3-none-any.whl", hash = "sha256:6b5a24d0f479c43c1759cb174cf42116ed27cced31284bedc82d584d860fa238"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.31.4.tar.gz", hash = "sha256:ee00c396b6d394b87b5ba3cf6be0f759f2f23783c2215e3ac4c22dc4bc676d60"}, - {file = "python_semantic_release-7.31.4-py3-none-any.whl", hash = "sha256:05d37cb3e3b6e84770128debede8421b24fceaecfbaa9eb62ffcfc1ea2c857f2"}, + {file = "python-semantic-release-7.32.1.tar.gz", hash = "sha256:ba47100e4ffa74c006529d6a8c22ca98f85ff4c145e8584eb2b17e6830a5116e"}, + {file = "python_semantic_release-7.32.1-py3-none-any.whl", hash = "sha256:9a29a02b3fb33fc318b07bf77c001c62aed9060d148eca25af7f4aa3afb49f4e"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] -pyyaml = [ +PyYAML = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1254,37 +1282,29 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-35.0-py3-none-any.whl", hash = "sha256:73b84905d091c31f36e50b4ae05ae2acead661f6a09a9abb4df7d2ddcdb6a698"}, - {file = "readme_renderer-35.0.tar.gz", hash = "sha256:a727999acfc222fc21d82a12ed48c957c4989785e5865807c65a487d21677497"}, + {file = "readme_renderer-37.2-py3-none-any.whl", hash = "sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106"}, + {file = "readme_renderer-37.2.tar.gz", hash = "sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, + {file = "requests-toolbelt-0.10.0.tar.gz", hash = "sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30"}, + {file = "requests_toolbelt-0.10.0-py2.py3-none-any.whl", hash = "sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985"}, ] rfc3986 = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, ] -secretstorage = [ - {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, - {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, +SecretStorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] semver = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, ] -setuptools = [ - {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, - {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1306,24 +1326,24 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.10.2-py3-none-any.whl", hash = "sha256:905cf92c2111ef80d355708f47ac24ad1b6fc2adc5107455940088c9bbecaedb"}, - {file = "tomlkit-0.10.2.tar.gz", hash = "sha256:30d54c0b914e595f3d10a87888599eab5321a2a69abc773bbefff51599b72db6"}, + {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, + {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, ] tqdm = [ - {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, - {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, ] twine = [ {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, ] typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, @@ -1400,6 +1420,6 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, + {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, + {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, ] diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index fcf94309c..1b9ab2b2f 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,20 +23,19 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.77.0" -mecha = ">=0.57.1" +beet = ">=0.79.0" +mecha = ">=0.57.4" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^7.1.3" -black = "^22.8.0" +black = "^22.10.0" isort = "^5.10.1" -python-semantic-release = "^7.31.4" +python-semantic-release = "^7.32.1" pytest-insta = "^0.1.11" -lectern = ">=0.24.0" +lectern = ">=0.25.0" [tool.pytest.ini_options] -addopts = "tests bolt --doctest-modules" -doctest_optionflags = "NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL ELLIPSIS" +addopts = "tests --import-mode=importlib" [tool.pyright] typeCheckingMode = "strict" @@ -55,5 +54,5 @@ major_on_zero = false build_command = "poetry build" [build-system] -requires = ["poetry-core>=1.0.0"] +requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From 7bfbfd34093df86fe414500949fd9f8488a66e7a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 19 Oct 2022 23:13:34 +0200 Subject: [PATCH 1034/1554] fix: reset generator to prevent dropping tokens --- packages/bolt/bolt/parse.py | 4 ++ packages/bolt/examples/bolt_summon/beet.yml | 6 ++ .../src/data/demo/functions/foo.mcfunction | 52 ++++++++++++++++ .../tests/snapshots/bolt__parse_177__0.txt | 2 +- .../tests/snapshots/bolt__parse_184__0.txt | 2 +- .../tests/snapshots/bolt__parse_184__1.txt | 2 +- .../tests/snapshots/bolt__parse_198__0.txt | 2 +- .../tests/snapshots/bolt__parse_198__1.txt | 2 +- .../examples__build_bolt_summon__0.pack.md | 59 +++++++++++++++++++ 9 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 packages/bolt/examples/bolt_summon/beet.yml create mode 100644 packages/bolt/examples/bolt_summon/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 3792f74bf..1bd6625ad 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1865,6 +1865,10 @@ class RootScopeHandler: def __call__(self, stream: TokenStream) -> Any: with stream.provide(root_scope="root_scope" not in stream.data): + # Resetting the underlying token generator shouldn't be necessary but + # currently overloading between nested_root/nested_yaml drops tokens + # for some reason (see summon macro example). + stream.generator = stream.generate_tokens() return self.parser(stream) diff --git a/packages/bolt/examples/bolt_summon/beet.yml b/packages/bolt/examples/bolt_summon/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_summon/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_summon/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_summon/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..477d8551e --- /dev/null +++ b/packages/bolt/examples/bolt_summon/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,52 @@ +from nbtlib import List, String + +SUMMON_INIT_TAG = "custom_summon_init" + +macro + summon + entity=minecraft:entity_summon + pos=minecraft:vec3 + nbt=minecraft:nbt_compound_tag + body=mecha:nested_root: + nbt = nbt.evaluate() + nbt.setdefault("Tags", List[String]()).append(String(SUMMON_INIT_TAG)) + summon entity pos nbt + as @e[type=entity.get_canonical_value(), tag=SUMMON_INIT_TAG] at @s: + yield body + tag @s remove SUMMON_INIT_TAG + +# Overload to make nbt optional +macro + summon + entity=minecraft:entity_summon + pos=minecraft:vec3 + body=mecha:nested_root: + summon entity pos {}: + yield body + +# Overload to make pos optional +macro + summon + entity=minecraft:entity_summon + body=mecha:nested_root: + summon entity ~ ~ ~: + yield body + +summon zombie ~ ~ ~ {Tags: ["my_custom_mob"]}: + say Hello I just spawned! + effect give @e[distance=..3] poison + +summon zombie 1 2 3: + say no nbt + +summon zombie 1 2 3: + Tags: ["using_nested_yaml"] + +summon zombie: + say no position or nbt + +def wtf(): + say hello + +summon zombie ~1 ~2 ~3: + wtf() diff --git a/packages/bolt/tests/snapshots/bolt__parse_177__0.txt b/packages/bolt/tests/snapshots/bolt__parse_177__0.txt index 2ba9b9985..775239882 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_177__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_177__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon but reached end of file. +#>ERROR Expected colon but got newline '\n'. # line 1, column 25 # 1 | append function demo:foo append function demo:foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt index ae57620e2..ddfa64446 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt @@ -3,7 +3,7 @@ positioned ~ ~a ~ function demo:foo --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) + end_location: SourceLocation(pos=42, lineno=3, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt index 2e11d9dd0..6d183c65d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt @@ -56,7 +56,7 @@ _bolt_refs[4] _bolt_refs[5] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=41, lineno=2, colno=36) + end_location: SourceLocation(pos=42, lineno=3, colno=1) commands: diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt index 1cb3ad2b9..8929befb8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt @@ -3,7 +3,7 @@ function #tag_name --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=19) + end_location: SourceLocation(pos=38, lineno=3, colno=1) commands: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt index 9add209b3..c37b12800 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_198__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_198__1.txt @@ -31,7 +31,7 @@ _bolt_refs[1] _bolt_refs[2] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=37, lineno=2, colno=19) + end_location: SourceLocation(pos=38, lineno=3, colno=1) commands: diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md new file mode 100644 index 000000000..48c7c43b7 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md @@ -0,0 +1,59 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +summon zombie ~ ~ ~ {Tags: ["my_custom_mob", "custom_summon_init"]} +execute as @e[type=minecraft:zombie, tag=custom_summon_init] at @s run function demo:foo/nested_execute_0 +summon zombie 1 2 3 {Tags: ["custom_summon_init"]} +execute as @e[type=minecraft:zombie, tag=custom_summon_init] at @s run function demo:foo/nested_execute_1 +summon zombie 1 2 3 {Tags: ["using_nested_yaml"]} +summon zombie ~ ~ ~ {Tags: ["custom_summon_init"]} +execute as @e[type=minecraft:zombie, tag=custom_summon_init] at @s run function demo:foo/nested_execute_2 +summon zombie ~1 ~2 ~3 {Tags: ["custom_summon_init"]} +execute as @e[type=minecraft:zombie, tag=custom_summon_init] at @s run function demo:foo/nested_execute_3 +``` + +`@function demo:foo/nested_execute_0` + +```mcfunction +say Hello I just spawned! +effect give @e[distance=..3] poison +tag @s remove custom_summon_init +``` + +`@function demo:foo/nested_execute_1` + +```mcfunction +say no nbt +tag @s remove custom_summon_init +``` + +`@function demo:foo/nested_execute_2` + +```mcfunction +say no position or nbt +tag @s remove custom_summon_init +``` + +`@function demo:foo/nested_execute_3` + +```mcfunction +say hello +tag @s remove custom_summon_init +``` From 2b0161f2536e6b508b7b9135982a177825cd2d91 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 19 Oct 2022 21:15:22 +0000 Subject: [PATCH 1035/1554] 0.19.3 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 5 +++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 4f545bd49..7a5d7b991 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.19.3 (2022-10-19) +### Fix +* Reset generator to prevent dropping tokens ([`6551578`](https://github.com/mcbeet/bolt/commit/65515786d6a941a2f4e94c4e8932c0dc90faa14f)) +* Update deps ([`1a00f20`](https://github.com/mcbeet/bolt/commit/1a00f208fce10a37e2ef9003d478b8dddce30d73)) + ## v0.19.2 (2022-10-04) ### Fix * Reported 0 errors message ([`16e64b7`](https://github.com/mcbeet/bolt/commit/16e64b77d5516fa04687f156ace6a4ee050be95b)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 2ae0f07da..5397d5144 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.19.2" +__version__ = "0.19.3" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 1b9ab2b2f..67ac00ac1 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.19.2" +version = "0.19.3" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From ad6fe411d0929c8ce0fc57b1836765092367852e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 21 Oct 2022 00:48:53 +0200 Subject: [PATCH 1036/1554] fix: refactor interpolation --- packages/bolt/bolt/parse.py | 191 ++++++++++++++++++++++-------------- 1 file changed, 118 insertions(+), 73 deletions(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 1bd6625ad..faeb5762b 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -15,6 +15,7 @@ "UndefinedIdentifierErrorHandler", "BranchScopeManager", "check_final_expression", + "FinalExpressionParser", "InterpolationParser", "DisableInterpolationParser", "parse_statement", @@ -383,72 +384,101 @@ def get_bolt_parsers( ################################################################################ # Interpolation ################################################################################ - "bool": InterpolationParser("bool", parsers["bool"], fallback=True), - "numeric": InterpolationParser( - "numeric", parsers["numeric"], prefix="-", fallback=True + "bool": AlternativeParser([parsers["bool"], InterpolationParser("bool")]), + "numeric": AlternativeParser( + [parsers["numeric"], InterpolationParser("numeric", prefix="-")] ), - "coordinate": InterpolationParser( - "coordinate", parsers["coordinate"], prefix="[~^]-?|-", fallback=True + "coordinate": AlternativeParser( + [ + parsers["coordinate"], + InterpolationParser("coordinate", prefix="[~^]-?|-"), + ] + ), + "time": AlternativeParser([parsers["time"], InterpolationParser("time")]), + "word": AlternativeParser([InterpolationParser("word"), parsers["word"]]), + "phrase": AlternativeParser([InterpolationParser("phrase"), parsers["phrase"]]), + "greedy": AlternativeParser([InterpolationParser("greedy"), parsers["greedy"]]), + "json": AlternativeParser([InterpolationParser("json"), parsers["json"]]), + "json_object_entry": AlternativeParser( + [InterpolationParser("json", unpack=r"\*\*"), parsers["json_object_entry"]] + ), + "json_array_element": AlternativeParser( + [InterpolationParser("json", unpack=r"\*"), parsers["json_array_element"]] ), - "time": InterpolationParser("time", parsers["time"], fallback=True), - "word": InterpolationParser("word", parsers["word"]), - "phrase": InterpolationParser("phrase", parsers["phrase"]), - "greedy": InterpolationParser("greedy", parsers["greedy"]), - "json": InterpolationParser("json", parsers["json"]), - "json_object_entry": InterpolationParser( - "json", parsers["json_object_entry"], unpack=r"\*\*" + "json_object": AlternativeParser( + [InterpolationParser("json_object"), parsers["json_object"]] ), - "json_array_element": InterpolationParser( - "json", parsers["json_array_element"], unpack=r"\*" + "nbt": AlternativeParser([InterpolationParser("nbt"), parsers["nbt"]]), + "nbt_compound_entry": AlternativeParser( + [InterpolationParser("nbt", unpack=r"\*\*"), parsers["nbt_compound_entry"]] ), - "json_object": InterpolationParser("json_object", parsers["json_object"]), - "nbt": InterpolationParser("nbt", parsers["nbt"]), - "nbt_compound_entry": InterpolationParser( - "nbt", parsers["nbt_compound_entry"], unpack=r"\*\*" + "nbt_list_or_array_element": AlternativeParser( + [ + InterpolationParser("nbt", unpack=r"\*"), + parsers["nbt_list_or_array_element"], + ] ), - "nbt_list_or_array_element": InterpolationParser( - "nbt", parsers["nbt_list_or_array_element"], unpack=r"\*" + "nbt_compound": AlternativeParser( + [InterpolationParser("nbt_compound"), parsers["nbt_compound"]] ), - "nbt_compound": InterpolationParser("nbt_compound", parsers["nbt_compound"]), - "nbt_path": InterpolationParser("nbt_path", parsers["nbt_path"]), - "range": InterpolationParser("range", parsers["range"], fallback=True), + "nbt_path": AlternativeParser( + [InterpolationParser("nbt_path"), parsers["nbt_path"]] + ), + "range": AlternativeParser([parsers["range"], InterpolationParser("range")]), "resource_location_or_tag": CommentDisambiguation( - InterpolationParser( - "resource_location", parsers["resource_location_or_tag"], prefix=r"#" + AlternativeParser( + [ + InterpolationParser("resource_location", prefix=r"#"), + parsers["resource_location_or_tag"], + ] ) ), - "item_slot": InterpolationParser( - "item_slot", parsers["item_slot"], fallback=True + "item_slot": AlternativeParser( + [parsers["item_slot"], InterpolationParser("item_slot")] + ), + "uuid": AlternativeParser([InterpolationParser("uuid"), parsers["uuid"]]), + "objective": AlternativeParser( + [InterpolationParser("objective"), parsers["objective"]] ), - "uuid": InterpolationParser("uuid", parsers["uuid"]), - "objective": InterpolationParser("objective", parsers["objective"]), - "objective_criteria": InterpolationParser( - "objective_criteria", parsers["objective_criteria"] + "objective_criteria": AlternativeParser( + [InterpolationParser("objective_criteria"), parsers["objective_criteria"]] ), - "scoreboard_slot": InterpolationParser( - "scoreboard_slot", parsers["scoreboard_slot"], fallback=True + "scoreboard_slot": AlternativeParser( + [parsers["scoreboard_slot"], InterpolationParser("scoreboard_slot")] ), - "swizzle": InterpolationParser("swizzle", parsers["swizzle"], fallback=True), - "team": InterpolationParser("team", parsers["team"]), - "color": InterpolationParser("color", parsers["color"]), - "sort_order": InterpolationParser( - "sort_order", parsers["sort_order"], fallback=True + "swizzle": AlternativeParser( + [parsers["swizzle"], InterpolationParser("swizzle")] ), - "gamemode": InterpolationParser("gamemode", parsers["gamemode"], fallback=True), - "message": InterpolationParser("message", parsers["message"], final=True), - "block_pos": InterpolationParser("vec3", parsers["block_pos"], fallback=True), - "column_pos": InterpolationParser("vec2", parsers["column_pos"], fallback=True), - "rotation": InterpolationParser("vec2", parsers["rotation"], fallback=True), - "vec2": InterpolationParser("vec2", parsers["vec2"], fallback=True), - "vec3": InterpolationParser("vec3", parsers["vec3"], fallback=True), + "team": AlternativeParser([InterpolationParser("team"), parsers["team"]]), + "color": AlternativeParser([InterpolationParser("color"), parsers["color"]]), + "sort_order": AlternativeParser( + [parsers["sort_order"], InterpolationParser("sort_order")] + ), + "gamemode": AlternativeParser( + [parsers["gamemode"], InterpolationParser("gamemode")] + ), + "message": AlternativeParser( + [FinalExpressionParser(InterpolationParser("message")), parsers["message"]] + ), + "block_pos": AlternativeParser( + [parsers["block_pos"], InterpolationParser("vec3")] + ), + "column_pos": AlternativeParser( + [parsers["column_pos"], InterpolationParser("vec2")] + ), + "rotation": AlternativeParser( + [parsers["rotation"], InterpolationParser("vec2")] + ), + "vec2": AlternativeParser([parsers["vec2"], InterpolationParser("vec2")]), + "vec3": AlternativeParser([parsers["vec3"], InterpolationParser("vec3")]), "entity": CommentDisambiguation( - InterpolationParser("entity", parsers["entity"]) + AlternativeParser([InterpolationParser("entity"), parsers["entity"]]) ), "score_holder": CommentDisambiguation( - InterpolationParser("entity", parsers["score_holder"]) + AlternativeParser([InterpolationParser("entity"), parsers["score_holder"]]) ), "game_profile": CommentDisambiguation( - InterpolationParser("entity", parsers["game_profile"]) + AlternativeParser([InterpolationParser("entity"), parsers["game_profile"]]) ), } @@ -656,41 +686,56 @@ def check_final_expression(stream: TokenStream): stream.index = current_index +@dataclass +class FinalExpressionParser: + """Parser that verifies that the expression isn't followed by anything.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + + current_index = stream.index + + if consume_line_continuation(stream): + exc = InvalidSyntax("Invalid indent following final expression.") + raise set_location(exc, stream.get()) + + next_token = stream.get() + if next_token and not next_token.match("newline", "eof"): + exc = InvalidSyntax("Trailing input following final expression.") + raise set_location(exc, next_token) + + stream.index = current_index + + return node + + @dataclass class InterpolationParser: """Parser for interpolation.""" converter: str - parser: Parser prefix: Optional[str] = None unpack: Optional[str] = None - fallback: bool = False - final: bool = False def __call__(self, stream: TokenStream) -> Any: if stream.data.get("disable_interpolation"): - return self.parser(stream) - order = ["interpolation", "original"] - if self.fallback: - order.reverse() - for parser, alternative in stream.choose(*order): - with alternative: - if parser == "interpolation": - with stream.syntax(prefix=self.prefix, unpack=self.unpack): - prefix = stream.get("prefix") - unpack = self.unpack is not None and stream.expect("unpack") - node = delegate("bolt:interpolation", stream) - node = AstInterpolation( - prefix=prefix.value if prefix else None, - unpack=unpack.value if unpack else None, - converter=self.converter, - value=node, - ) - if self.final: - check_final_expression(stream) - return set_location(node, prefix or node.value, node.value) - elif parser == "original": - return self.parser(stream) + token = stream.expect() + raise set_location(InvalidSyntax("Interpolation disabled."), token) + + with stream.syntax(prefix=self.prefix, unpack=self.unpack): + prefix = stream.get("prefix") + unpack = self.unpack is not None and stream.expect("unpack") + + node = delegate("bolt:interpolation", stream) + node = AstInterpolation( + prefix=prefix.value if prefix else None, + unpack=unpack.value if unpack else None, + converter=self.converter, + value=node, + ) + return set_location(node, prefix or node.value, node.value) @dataclass From 8cd9d8baedbc7971223cd41818d8631486761958 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 24 Oct 2022 21:27:00 +0200 Subject: [PATCH 1037/1554] feat: interpolate advancement predicate --- packages/bolt/bolt/helpers.py | 4 ++++ packages/bolt/bolt/parse.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index fb1b9a786..34237971a 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -11,6 +11,7 @@ from uuid import UUID from mecha import ( + AstAdvancementPredicate, AstBool, AstChildren, AstColor, @@ -85,6 +86,9 @@ def get_bolt_helpers() -> Dict[str, Any]: "interpolate_scoreboard_slot": converter(AstScoreboardSlot.from_value), "interpolate_swizzle": converter(AstSwizzle.from_value), "interpolate_team": converter(AstTeam.from_value), + "interpolate_advancement_predicate": converter( + AstAdvancementPredicate.from_value + ), "interpolate_color": converter(AstColor.from_value), "interpolate_sort_order": converter(AstSortOrder.from_value), "interpolate_gamemode": converter(AstGamemode.from_value), diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index faeb5762b..efc81cb0e 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -450,6 +450,12 @@ def get_bolt_parsers( [parsers["swizzle"], InterpolationParser("swizzle")] ), "team": AlternativeParser([InterpolationParser("team"), parsers["team"]]), + "advancement_predicate": AlternativeParser( + [ + InterpolationParser("advancement_predicate"), + parsers["advancement_predicate"], + ] + ), "color": AlternativeParser([InterpolationParser("color"), parsers["color"]]), "sort_order": AlternativeParser( [parsers["sort_order"], InterpolationParser("sort_order")] From b8456425a96a392fb6599dc60194e2fff8e9af63 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 24 Oct 2022 21:30:55 +0200 Subject: [PATCH 1038/1554] chore: update lockfile --- packages/bolt/poetry.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 0aad04d50..4dc93f79f 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -571,7 +571,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.32.1" +version = "7.32.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -824,7 +824,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.9.0" +version = "3.10.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false @@ -1232,8 +1232,8 @@ python-gitlab = [ {file = "python_gitlab-3.10.0-py3-none-any.whl", hash = "sha256:6b5a24d0f479c43c1759cb174cf42116ed27cced31284bedc82d584d860fa238"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.32.1.tar.gz", hash = "sha256:ba47100e4ffa74c006529d6a8c22ca98f85ff4c145e8584eb2b17e6830a5116e"}, - {file = "python_semantic_release-7.32.1-py3-none-any.whl", hash = "sha256:9a29a02b3fb33fc318b07bf77c001c62aed9060d148eca25af7f4aa3afb49f4e"}, + {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, + {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1420,6 +1420,6 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, - {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, + {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, + {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] From 634f531448f0009b181a40cc2b283b16b733c9fd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 24 Oct 2022 21:40:50 +0200 Subject: [PATCH 1039/1554] chore: update workflow --- packages/bolt/.github/workflows/main.yml | 35 +++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/bolt/.github/workflows/main.yml b/packages/bolt/.github/workflows/main.yml index d646b52ea..a2fbc22b9 100644 --- a/packages/bolt/.github/workflows/main.yml +++ b/packages/bolt/.github/workflows/main.yml @@ -12,41 +12,44 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout code + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Set up Python 3.9 - uses: actions/setup-python@v2 + - name: Set up Python 3.10 + uses: actions/setup-python@v4 with: - python-version: 3.9 - - name: Setup poetry cache - id: cached-poetry - uses: actions/cache@v2 + python-version: "3.10" + - name: Cache poetry + id: cache-poetry + uses: actions/cache@v3 with: path: ~/.local - key: poetry1-${{ runner.os }} + key: poetry-${{ runner.os }} - name: Install poetry - if: steps.cached-poetry.outputs.cache-hit != 'true' + if: steps.cache-poetry.outputs.cache-hit != 'true' uses: snok/install-poetry@v1 with: virtualenvs-in-project: true - - name: Setup venv cache - id: cached-venv - uses: actions/cache@v2 + - name: Cache venv + id: cache-venv + uses: actions/cache@v3 with: path: .venv key: venv-${{ runner.os }}-${{ hashFiles('poetry.lock') }} + restore-keys: | + venv-${{ runner.os }}- - name: Install dependencies - if: steps.cached-venv.outputs.cache-hit != 'true' + if: steps.cache-venv.outputs.cache-hit != 'true' run: poetry install - name: Setup npm cache - id: cached-npm - uses: actions/cache@v2 + id: cache-npm + uses: actions/cache@v3 with: path: node_modules key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }} - name: Install Pyright - if: steps.cached-npm.outputs.cache-hit != 'true' + if: steps.cache-npm.outputs.cache-hit != 'true' run: npm install - name: Run tests run: poetry run pytest -v From 603b0fb75f2183b7fd6e5375fe17fcddb3a183f4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 24 Oct 2022 19:42:21 +0000 Subject: [PATCH 1040/1554] 0.20.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 7 +++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 7a5d7b991..c26067bb9 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.20.0 (2022-10-24) +### Feature +* Interpolate advancement predicate ([`e4338b0`](https://github.com/mcbeet/bolt/commit/e4338b0f4004601daf9c86b169a3771f876cff16)) + +### Fix +* Refactor interpolation ([`44c2d0e`](https://github.com/mcbeet/bolt/commit/44c2d0ed74c8100698fa75931df626c96329b820)) + ## v0.19.3 (2022-10-19) ### Fix * Reset generator to prevent dropping tokens ([`6551578`](https://github.com/mcbeet/bolt/commit/65515786d6a941a2f4e94c4e8932c0dc90faa14f)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 5397d5144..8c1480de4 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.19.3" +__version__ = "0.20.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 67ac00ac1..b0b474cf5 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.19.3" +version = "0.20.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 946fb7740fd166366a149750e424d66569dc6418 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Oct 2022 19:42:15 +0200 Subject: [PATCH 1041/1554] chore: update deps --- packages/lectern/poetry.lock | 259 ++++++++++++++-------------- packages/lectern/pyproject.toml | 34 ++-- packages/lectern/pyrightconfig.json | 4 - packages/lectern/pytest.ini | 2 - 4 files changed, 142 insertions(+), 157 deletions(-) delete mode 100644 packages/lectern/pyrightconfig.json delete mode 100644 packages/lectern/pytest.ini diff --git a/packages/lectern/poetry.lock b/packages/lectern/poetry.lock index 29544cded..31258957b 100644 --- a/packages/lectern/poetry.lock +++ b/packages/lectern/poetry.lock @@ -14,7 +14,7 @@ tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.73.3" +version = "0.79.0" description = "The Minecraft pack development kit" category = "main" optional = false @@ -36,11 +36,11 @@ image = ["Pillow"] [[package]] name = "black" -version = "22.8.0" +version = "22.10.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" @@ -74,7 +74,7 @@ dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0 [[package]] name = "certifi" -version = "2022.9.14" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -140,11 +140,11 @@ click = "*" [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" [[package]] name = "cryptography" @@ -181,6 +181,17 @@ category = "dev" optional = false python-versions = ">=3.5,<4.0" +[[package]] +name = "exceptiongroup" +version = "1.0.0rc9" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "gitdb" version = "4.0.9" @@ -194,7 +205,7 @@ smmap = ">=3.0.1,<6" [[package]] name = "GitPython" -version = "3.1.27" +version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false @@ -213,7 +224,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.12.0" +version = "5.0.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -223,9 +234,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -237,7 +248,7 @@ python-versions = "*" [[package]] name = "invoke" -version = "1.7.1" +version = "1.7.3" description = "Pythonic task execution" category = "dev" optional = false @@ -259,7 +270,7 @@ requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] name = "jaraco.classes" -version = "3.2.2" +version = "3.2.3" description = "Utility functions for Python class constructs" category = "dev" optional = false @@ -269,8 +280,8 @@ python-versions = ">=3.7" more-itertools = "*" [package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "jeepney" @@ -300,7 +311,7 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.9.1" +version = "23.9.3" description = "Store and access your passwords safely." category = "dev" optional = false @@ -356,11 +367,11 @@ python-versions = ">=3.7" [[package]] name = "more-itertools" -version = "8.14.0" +version = "9.0.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [[package]] name = "mypy-extensions" @@ -383,7 +394,7 @@ numpy = "*" [[package]] name = "numpy" -version = "1.23.3" +version = "1.23.4" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -443,14 +454,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "pycparser" version = "2.21" @@ -498,7 +501,7 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.3" +version = "7.2.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -507,11 +510,11 @@ python-versions = ">=3.7" [package.dependencies] attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] @@ -530,7 +533,7 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.9.0" +version = "3.10.0" description = "Interact with GitLab API" category = "dev" optional = false @@ -546,7 +549,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.31.4" +version = "7.32.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -590,7 +593,7 @@ python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "37.1" +version = "37.2" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -624,11 +627,11 @@ use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.9.1" +version = "0.10.1" description = "A utility belt for advanced users of python-requests" category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] requests = ">=2.0.1,<3.0.0" @@ -698,7 +701,7 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.11.4" +version = "0.11.5" description = "Style preserving TOML library" category = "dev" optional = false @@ -743,7 +746,7 @@ urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "4.3.0" +version = "4.4.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -791,20 +794,20 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.8.1" +version = "3.10.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "9ab9c1886ecbe6683594114aaa408e9a09bfad7042f96d8ed5a021a074c887c3" +content-hash = "9c31f1b5dd598ff6101c4e7be2f2c1bd2c0f30d5e268ac6590b3617ccc8c0708" [metadata.files] attrs = [ @@ -812,41 +815,39 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.73.3-py3-none-any.whl", hash = "sha256:d052fcd6c95f6601b89997730e577032fb7715d4f372348bf4e134e209230706"}, - {file = "beet-0.73.3.tar.gz", hash = "sha256:413e88a32e73b90d08b7838654b7fbf584187a2c58d2e6477046b05da001359c"}, + {file = "beet-0.79.0-py3-none-any.whl", hash = "sha256:bac4f80f635d910059fe15c080564cb2338dccdfd6178d267f8c93b6786de3ae"}, + {file = "beet-0.79.0.tar.gz", hash = "sha256:76fe3b0a5dadb97de51b1891f73f568b2a8fe74436834f41a8725d921ca18577"}, ] black = [ - {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, - {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, - {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, - {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, - {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, - {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, - {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, - {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, - {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, - {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, - {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, - {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, - {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, - {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, - {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, - {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, - {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, - {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, - {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] bleach = [ {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] certifi = [ - {file = "certifi-2022.9.14-py3-none-any.whl", hash = "sha256:e232343de1ab72c2aa521b625c80f699e356830fd0e2c620b465b304b17b0516"}, - {file = "certifi-2022.9.14.tar.gz", hash = "sha256:36973885b9542e6bd01dea287b2b4b3b21236307c56324fcc3f1160f2d655ed5"}, + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, ] cffi = [ {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, @@ -931,8 +932,8 @@ click-log = [ {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] cryptography = [ {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, @@ -970,37 +971,41 @@ dotty-dict = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] +exceptiongroup = [ + {file = "exceptiongroup-1.0.0rc9-py3-none-any.whl", hash = "sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337"}, + {file = "exceptiongroup-1.0.0rc9.tar.gz", hash = "sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96"}, +] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] GitPython = [ - {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] idna = [ {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"}, - {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"}, + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] invoke = [ - {file = "invoke-1.7.1-py3-none-any.whl", hash = "sha256:2dc975b4f92be0c0a174ad2d063010c8a1fdb5e9389d69871001118b4fcac4fb"}, - {file = "invoke-1.7.1.tar.gz", hash = "sha256:7b6deaf585eee0a848205d0b8c0014b9bf6f287a8eb798818a642dff1df14b19"}, + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] "jaraco.classes" = [ - {file = "jaraco.classes-3.2.2-py3-none-any.whl", hash = "sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647"}, - {file = "jaraco.classes-3.2.2.tar.gz", hash = "sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594"}, + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, ] jeepney = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, @@ -1011,8 +1016,8 @@ Jinja2 = [ {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-23.9.1-py3-none-any.whl", hash = "sha256:3565b9e4ea004c96e158d2d332a49f466733d565bb24157a60fd2e49f41a0fd1"}, - {file = "keyring-23.9.1.tar.gz", hash = "sha256:39e4f6572238d2615a82fcaa485e608b84b503cf080dc924c43bbbacb11c1c18"}, + {file = "keyring-23.9.3-py3-none-any.whl", hash = "sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0"}, + {file = "keyring-23.9.3.tar.gz", hash = "sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, @@ -1065,8 +1070,8 @@ mdurl = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] more-itertools = [ - {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, - {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1077,34 +1082,34 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.23.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee"}, - {file = "numpy-1.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffcf105ecdd9396e05a8e58e81faaaf34d3f9875f137c7372450baa5d77c9a54"}, - {file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ea3f98a0ffce3f8f57675eb9119f3f4edb81888b6874bc1953f91e0b1d4f440"}, - {file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089"}, - {file = "numpy-1.23.3-cp310-cp310-win32.whl", hash = "sha256:98dcbc02e39b1658dc4b4508442a560fe3ca5ca0d989f0df062534e5ca3a5c1a"}, - {file = "numpy-1.23.3-cp310-cp310-win_amd64.whl", hash = "sha256:39a664e3d26ea854211867d20ebcc8023257c1800ae89773cbba9f9e97bae036"}, - {file = "numpy-1.23.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f27b5322ac4067e67c8f9378b41c746d8feac8bdd0e0ffede5324667b8a075c"}, - {file = "numpy-1.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ad3ec9a748a8943e6eb4358201f7e1c12ede35f510b1a2221b70af4bb64295c"}, - {file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdc9febce3e68b697d931941b263c59e0c74e8f18861f4064c1f712562903411"}, - {file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:301c00cf5e60e08e04d842fc47df641d4a181e651c7135c50dc2762ffe293dbd"}, - {file = "numpy-1.23.3-cp311-cp311-win32.whl", hash = "sha256:7cd1328e5bdf0dee621912f5833648e2daca72e3839ec1d6695e91089625f0b4"}, - {file = "numpy-1.23.3-cp311-cp311-win_amd64.whl", hash = "sha256:8355fc10fd33a5a70981a5b8a0de51d10af3688d7a9e4a34fcc8fa0d7467bb7f"}, - {file = "numpy-1.23.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc6e8da415f359b578b00bcfb1d08411c96e9a97f9e6c7adada554a0812a6cc6"}, - {file = "numpy-1.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:22d43376ee0acd547f3149b9ec12eec2f0ca4a6ab2f61753c5b29bb3e795ac4d"}, - {file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a64403f634e5ffdcd85e0b12c08f04b3080d3e840aef118721021f9b48fc1460"}, - {file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd9d3abe5774404becdb0748178b48a218f1d8c44e0375475732211ea47c67e"}, - {file = "numpy-1.23.3-cp38-cp38-win32.whl", hash = "sha256:f8c02ec3c4c4fcb718fdf89a6c6f709b14949408e8cf2a2be5bfa9c49548fd85"}, - {file = "numpy-1.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:e868b0389c5ccfc092031a861d4e158ea164d8b7fdbb10e3b5689b4fc6498df6"}, - {file = "numpy-1.23.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09f6b7bdffe57fc61d869a22f506049825d707b288039d30f26a0d0d8ea05164"}, - {file = "numpy-1.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c79d7cf86d049d0c5089231a5bcd31edb03555bd93d81a16870aa98c6cfb79d"}, - {file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5d5420053bbb3dd64c30e58f9363d7a9c27444c3648e61460c1237f9ec3fa14"}, - {file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5422d6a1ea9b15577a9432e26608c73a78faf0b9039437b075cf322c92e98e7"}, - {file = "numpy-1.23.3-cp39-cp39-win32.whl", hash = "sha256:c1ba66c48b19cc9c2975c0d354f24058888cdc674bebadceb3cdc9ec403fb5d1"}, - {file = "numpy-1.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:78a63d2df1d947bd9d1b11d35564c2f9e4b57898aae4626638056ec1a231c40c"}, - {file = "numpy-1.23.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:17c0e467ade9bda685d5ac7f5fa729d8d3e76b23195471adae2d6a6941bd2c18"}, - {file = "numpy-1.23.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91b8d6768a75247026e951dce3b2aac79dc7e78622fc148329135ba189813584"}, - {file = "numpy-1.23.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:94c15ca4e52671a59219146ff584488907b1f9b3fc232622b47e2cf832e94fb8"}, - {file = "numpy-1.23.3.tar.gz", hash = "sha256:51bf49c0cd1d52be0a240aa66f3458afc4b95d8993d2d04f0d91fa60c10af6cd"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, + {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, + {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, + {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, + {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, + {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, + {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, + {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, + {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, + {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1126,10 +1131,6 @@ pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] pycparser = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, @@ -1181,20 +1182,20 @@ pyparsing = [ {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, ] pytest-insta = [ {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-3.9.0.tar.gz", hash = "sha256:5fc5e88f81f366e11851cb8b4b9a5b827491ce20ba7585446b74c9b097726ba3"}, - {file = "python_gitlab-3.9.0-py3-none-any.whl", hash = "sha256:ce941f99bf88b6918eea82500ca6206806117f4afe26d4705f4ded2284b35c69"}, + {file = "python-gitlab-3.10.0.tar.gz", hash = "sha256:14930a16fdd7f36f67b9373e7d4d4720e8e374800028380289db3306e9f74614"}, + {file = "python_gitlab-3.10.0-py3-none-any.whl", hash = "sha256:6b5a24d0f479c43c1759cb174cf42116ed27cced31284bedc82d584d860fa238"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.31.4.tar.gz", hash = "sha256:ee00c396b6d394b87b5ba3cf6be0f759f2f23783c2215e3ac4c22dc4bc676d60"}, - {file = "python_semantic_release-7.31.4-py3-none-any.whl", hash = "sha256:05d37cb3e3b6e84770128debede8421b24fceaecfbaa9eb62ffcfc1ea2c857f2"}, + {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, + {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1243,16 +1244,16 @@ PyYAML = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-37.1-py3-none-any.whl", hash = "sha256:16c914ca7731fd062a316a2a8e5434a175ee34661a608af771a60c881f528a34"}, - {file = "readme_renderer-37.1.tar.gz", hash = "sha256:96768c069729f69176f514477e57f2f8cd543fbb2cd7bad372976249fa509a0c"}, + {file = "readme_renderer-37.2-py3-none-any.whl", hash = "sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106"}, + {file = "readme_renderer-37.2.tar.gz", hash = "sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923"}, ] requests = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, + {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, + {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, ] rfc3986 = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, @@ -1283,8 +1284,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, - {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, + {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, + {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, ] tqdm = [ {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, @@ -1295,8 +1296,8 @@ twine = [ {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, ] typing-extensions = [ - {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, - {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] urllib3 = [ {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, @@ -1377,6 +1378,6 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, - {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, + {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, + {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index 07131fbc9..a9a7952a4 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -25,15 +25,15 @@ include = ["lectern/py.typed"] [tool.poetry.dependencies] python = "^3.8" -beet = ">=0.73.3" +beet = ">=0.79.0" markdown-it-py = "^2.1.0" click = "^8.1.3" -[tool.poetry.dev-dependencies] -black = "^22.8.0" -pytest = "^7.1.3" +[tool.poetry.group.dev.dependencies] +black = "^22.10.0" +pytest = "^7.2.0" isort = "^5.10.1" -python-semantic-release = "^7.31.4" +python-semantic-release = "^7.32.2" pytest-insta = "^0.1.11" [tool.poetry.scripts] @@ -42,24 +42,14 @@ lectern = "lectern.cli:main" [tool.poetry.plugins.pytest11] lectern = "lectern.pytest_plugin" +[tool.pytest.ini_options] +addopts = "tests --import-mode=importlib" + +[tool.pyright] +typeCheckingMode = "strict" + [tool.black] target-version = ["py38"] -include = '\.pyi?$' -exclude = ''' -/( - \.eggs - | \.git - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | node_modules - | _build - | buck-out - | build - | dist -)/ -''' [tool.isort] profile = "black" @@ -72,5 +62,5 @@ major_on_zero = false build_command = "poetry build" [build-system] -requires = ["poetry-core>=1.0.0"] +requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/packages/lectern/pyrightconfig.json b/packages/lectern/pyrightconfig.json deleted file mode 100644 index 6ee1ec7ed..000000000 --- a/packages/lectern/pyrightconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "typeCheckingMode": "strict", - "ignore": ["setup.py"] -} diff --git a/packages/lectern/pytest.ini b/packages/lectern/pytest.ini deleted file mode 100644 index c8cd4b380..000000000 --- a/packages/lectern/pytest.ini +++ /dev/null @@ -1,2 +0,0 @@ -[pytest] -addopts = tests From 02aa560da41fc563d7b7c0c57607e2dd30019036 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Oct 2022 19:49:25 +0200 Subject: [PATCH 1042/1554] feat: add merge_zip directive --- packages/lectern/README.md | 9 +++++++ .../examples/with_links/beet_data_pack.zip | Bin 0 -> 347 bytes .../lectern/examples/with_links/merge_zip.md | 3 +++ packages/lectern/lectern/directive.py | 19 +++++++++++++++ ...xamples_with_links_merge_zip_md__0.pack.md | 22 ++++++++++++++++++ .../README.md | 22 ++++++++++++++++++ ...amples_with_links_merge_zip_md__0.pack.txt | 10 ++++++++ 7 files changed, 85 insertions(+) create mode 100644 packages/lectern/examples/with_links/beet_data_pack.zip create mode 100644 packages/lectern/examples/with_links/merge_zip.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_examples_with_links_merge_zip_md__0.pack.md create mode 100644 packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_merge_zip_md__0.pack.md_external_files/README.md create mode 100644 packages/lectern/tests/snapshots/examples__text_examples_with_links_merge_zip_md__0.pack.txt diff --git a/packages/lectern/README.md b/packages/lectern/README.md index d360bfd08..a1c93b80c 100644 --- a/packages/lectern/README.md +++ b/packages/lectern/README.md @@ -166,6 +166,15 @@ There are also two built-in directives that can be used to include files using a This is useful for adding files that aren't part of any particular namespace. +In case you need to bundle existing resource packs or data packs, you can use the `@merge_zip` directive. + + + +``` +@merge_zip(download) +https://example.com/my_zipped_data_pack.zip +``` + Finally, the `@skip` directive is simply ignored and allows you to end a previous fragment in the plain text format. diff --git a/packages/lectern/examples/with_links/beet_data_pack.zip b/packages/lectern/examples/with_links/beet_data_pack.zip new file mode 100644 index 0000000000000000000000000000000000000000..48103b3d84e11c4131c8ee500a77d95fdd047334 GIT binary patch literal 347 zcmWIWW@Zs#fB;1Xw*~R59Dy7V<_6+|#N=$f+~nNUlEi8*1qCG#U&%@V#D?P_&k-mMZ|orgaau`Edbl0AV#CPDw0D)K5xH zEzwUa%}WO9E!Iy-O-n4zDFHeFE|yrSkdc~`lMghFkx7IZx66S>fl**dx7*05QhN(%m7Sw literal 0 HcmV?d00001 diff --git a/packages/lectern/examples/with_links/merge_zip.md b/packages/lectern/examples/with_links/merge_zip.md new file mode 100644 index 000000000..32fcf2353 --- /dev/null +++ b/packages/lectern/examples/with_links/merge_zip.md @@ -0,0 +1,3 @@ +# Merge zipped data pack + +[`@merge_zip`](beet_data_pack.zip) diff --git a/packages/lectern/lectern/directive.py b/packages/lectern/lectern/directive.py index cdeb52821..886fb696f 100644 --- a/packages/lectern/lectern/directive.py +++ b/packages/lectern/lectern/directive.py @@ -5,6 +5,7 @@ "DataPackDirective", "ResourcePackDirective", "BundleFragmentMixin", + "MergeZipDirective", "SkipDirective", ] @@ -46,6 +47,7 @@ def __init__( self["data_pack"] = DataPackDirective() self["resource_pack"] = ResourcePackDirective() + self["merge_zip"] = MergeZipDirective() self["skip"] = SkipDirective() @self.add_resolver @@ -131,6 +133,23 @@ def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): assets.load(self.bundle_pack_fragment(fragment)) +@dataclass +class MergeZipDirective: + """Directive that merges a zipped resource pack or data pack.""" + + def __call__(self, fragment: Fragment, assets: ResourcePack, data: DataPack): + fragment.expect() + file_instance = fragment.as_file() + with ZipFile(io.BytesIO(file_instance.blob)) as origin: + for path in origin.namelist(): + if path.startswith("assets/"): + assets.load(origin) + break + elif path.startswith("data/"): + data.load(origin) + break + + @dataclass class SkipDirective: """Directive that ignores the fragment and skips to the next one.""" diff --git a/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_merge_zip_md__0.pack.md b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_merge_zip_md__0.pack.md new file mode 100644 index 000000000..492b4d67e --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_examples_with_links_merge_zip_md__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### beet + +`@function beet:default` + +```mcfunction +say hello +``` diff --git a/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_merge_zip_md__0.pack.md_external_files/README.md b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_merge_zip_md__0.pack.md_external_files/README.md new file mode 100644 index 000000000..492b4d67e --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__markdown_external_files_examples_with_links_merge_zip_md__0.pack.md_external_files/README.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### beet + +`@function beet:default` + +```mcfunction +say hello +``` diff --git a/packages/lectern/tests/snapshots/examples__text_examples_with_links_merge_zip_md__0.pack.txt b/packages/lectern/tests/snapshots/examples__text_examples_with_links_merge_zip_md__0.pack.txt new file mode 100644 index 000000000..53084417a --- /dev/null +++ b/packages/lectern/tests/snapshots/examples__text_examples_with_links_merge_zip_md__0.pack.txt @@ -0,0 +1,10 @@ +@data_pack pack.mcmeta +{ + "pack": { + "pack_format": 10, + "description": "" + } +} + +@function beet:default +say hello From 570b57fe029a83ce8ed9c32f5647d27f787f08a3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Oct 2022 20:03:19 +0200 Subject: [PATCH 1043/1554] chore: update workflow --- packages/lectern/.github/workflows/main.yml | 43 ++++++++++++++------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/packages/lectern/.github/workflows/main.yml b/packages/lectern/.github/workflows/main.yml index 42cd4e34d..42ec5c1fb 100644 --- a/packages/lectern/.github/workflows/main.yml +++ b/packages/lectern/.github/workflows/main.yml @@ -12,28 +12,45 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout code + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Set up Python 3.9 - uses: actions/setup-python@v2 + - name: Set up Python 3.10 + uses: actions/setup-python@v4 with: - python-version: 3.9 - - name: Install Poetry - uses: snok/install-poetry@v1.1.1 + python-version: "3.10" + - name: Cache poetry + id: cache-poetry + uses: actions/cache@v3 + with: + path: ~/.local + key: poetry-${{ runner.os }} + - name: Install poetry + if: steps.cache-poetry.outputs.cache-hit != 'true' + uses: snok/install-poetry@v1 with: virtualenvs-in-project: true - - name: Install Pyright - run: npm install - - name: Setup cache - id: cached-poetry-dependencies - uses: actions/cache@v2 + - name: Cache venv + id: cache-venv + uses: actions/cache@v3 with: path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} + key: venv-${{ runner.os }}-${{ hashFiles('poetry.lock') }} + restore-keys: | + venv-${{ runner.os }}- - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + if: steps.cache-venv.outputs.cache-hit != 'true' run: poetry install + - name: Setup npm cache + id: cache-npm + uses: actions/cache@v3 + with: + path: node_modules + key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }} + - name: Install Pyright + if: steps.cache-npm.outputs.cache-hit != 'true' + run: npm install - name: Run tests run: poetry run pytest -v - name: Run type-checking From f18b71875d02e58453780fc02a76339ad2b32e7f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Oct 2022 18:04:59 +0000 Subject: [PATCH 1044/1554] 0.26.0 Automatically generated by python-semantic-release --- packages/lectern/CHANGELOG.md | 4 ++++ packages/lectern/lectern/__init__.py | 2 +- packages/lectern/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lectern/CHANGELOG.md b/packages/lectern/CHANGELOG.md index d88b48da0..7292ab7e8 100644 --- a/packages/lectern/CHANGELOG.md +++ b/packages/lectern/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.26.0 (2022-10-25) +### Feature +* Add merge_zip directive ([`add74f2`](https://github.com/mcbeet/lectern/commit/add74f2f8b223b29f2270de3aec5205ff217944d)) + ## v0.25.0 (2022-09-20) ### Feature * Make it possible to raise an error if there was nothing in the message ([`165330e`](https://github.com/mcbeet/lectern/commit/165330e29e490860107d2755f09a0aa3f9d9c03a)) diff --git a/packages/lectern/lectern/__init__.py b/packages/lectern/lectern/__init__.py index bb32792db..215f1cc18 100644 --- a/packages/lectern/lectern/__init__.py +++ b/packages/lectern/lectern/__init__.py @@ -7,4 +7,4 @@ from .prefetch import * from .serialize import * -__version__ = "0.25.0" +__version__ = "0.26.0" diff --git a/packages/lectern/pyproject.toml b/packages/lectern/pyproject.toml index a9a7952a4..652d78b3f 100644 --- a/packages/lectern/pyproject.toml +++ b/packages/lectern/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lectern" -version = "0.25.0" +version = "0.26.0" description = "Literate Minecraft data packs and resource packs." authors = ["Valentin Berlier "] license = "MIT" From 5e6fd5cd0cfb58cc2c135d99c953ef4d4c86b5c6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 26 Oct 2022 03:04:32 +0200 Subject: [PATCH 1045/1554] fix: reset token generator after discarding builtin identifier in interpolation --- packages/bolt/bolt/parse.py | 5 +++++ .../bolt_strip_final_newline/beet.yml | 6 +++++ .../src/data/demo/functions/foo.mcfunction | 1 + ..._build_bolt_strip_final_newline__0.pack.md | 22 +++++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 packages/bolt/examples/bolt_strip_final_newline/beet.yml create mode 100644 packages/bolt/examples/bolt_strip_final_newline/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index efc81cb0e..e0de3c74b 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -2264,6 +2264,11 @@ def __call__(self, stream: TokenStream) -> Any: and node.value in get_stream_builtins(stream) and node.value not in get_stream_identifiers_storage(stream) ): + # Reset the underlying token generator so that the identifier can + # be re-parsed as a different token. That shouldn't be necessary + # but otherwise this currently induces an error in files that aren't + # terminated by a newline. + stream.generator = stream.generate_tokens() msg = f'Expected call expression on builtin "{node.value}".' raise set_location(InvalidSyntax(msg), parent) diff --git a/packages/bolt/examples/bolt_strip_final_newline/beet.yml b/packages/bolt/examples/bolt_strip_final_newline/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_strip_final_newline/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_strip_final_newline/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_strip_final_newline/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..14fe6baec --- /dev/null +++ b/packages/bolt/examples/bolt_strip_final_newline/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +scoreboard players operation foo set = bar set \ No newline at end of file diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md new file mode 100644 index 000000000..e96926775 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md @@ -0,0 +1,22 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +scoreboard players operation foo set = bar set +``` From 904ff94df2839ec6d4456da61cf1717ff71a3820 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Oct 2022 01:05:20 +0000 Subject: [PATCH 1046/1554] 0.20.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index c26067bb9..4198e73e7 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.20.1 (2022-10-26) +### Fix +* Reset token generator after discarding builtin identifier in interpolation ([`37f74bc`](https://github.com/mcbeet/bolt/commit/37f74bc8f9fbf60b0493bf8e158be678ced5f272)) + ## v0.20.0 (2022-10-24) ### Feature * Interpolate advancement predicate ([`e4338b0`](https://github.com/mcbeet/bolt/commit/e4338b0f4004601daf9c86b169a3771f876cff16)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 8c1480de4..3fdcac0ba 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.20.0" +__version__ = "0.20.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index b0b474cf5..587c0e762 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.20.0" +version = "0.20.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 0a4e5cad7bba9b6b6aff84037ac44c9d652357ae Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 2 Nov 2022 13:51:47 +0100 Subject: [PATCH 1047/1554] fix: default argument parser properties --- packages/mecha/mecha/parse.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index a0dfd6f9c..b40b0be58 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -857,7 +857,7 @@ def __call__(self, stream: TokenStream) -> Any: def parse_string_argument(stream: TokenStream) -> Any: """Parse string argument.""" properties = get_stream_properties(stream) - string_type = properties["type"] + string_type = properties.get("type", "word") if string_type not in ["word", "phrase", "greedy"]: raise ValueError(f"Invalid string type {string_type!r}.") @@ -1681,7 +1681,7 @@ class SelectorTypeConstraint: def __call__(self, stream: TokenStream) -> Any: properties = get_stream_properties(stream) - selector_type = properties["type"] + selector_type = properties.get("type", "entities") if selector_type not in ["players", "entities"]: raise ValueError(f"Invalid selector type {selector_type}.") @@ -1726,7 +1726,7 @@ class SelectorAmountConstraint: def __call__(self, stream: TokenStream) -> Any: properties = get_stream_properties(stream) - amount = properties["amount"] + amount = properties.get("amount", "multiple") if amount not in ["single", "multiple"]: raise ValueError(f"Invalid selector amount {amount}.") From 81180b6e334ae41925eb97c4d9dc64103d8733da Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 2 Nov 2022 13:56:38 +0100 Subject: [PATCH 1048/1554] chore: update workflow --- packages/mecha/.github/workflows/main.yml | 41 ++++++++++++++++------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/mecha/.github/workflows/main.yml b/packages/mecha/.github/workflows/main.yml index e28550f70..5a2f8d9bb 100644 --- a/packages/mecha/.github/workflows/main.yml +++ b/packages/mecha/.github/workflows/main.yml @@ -12,28 +12,45 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout code + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Set up Python 3.9 - uses: actions/setup-python@v2 + - name: Set up Python 3.10 + uses: actions/setup-python@v4 with: - python-version: 3.9 - - name: Install Poetry + python-version: "3.10" + - name: Cache poetry + id: cache-poetry + uses: actions/cache@v3 + with: + path: ~/.local + key: poetry-${{ runner.os }} + - name: Install poetry + if: steps.cache-poetry.outputs.cache-hit != 'true' uses: snok/install-poetry@v1 with: virtualenvs-in-project: true - - name: Install Pyright - run: npm install - - name: Setup cache - id: cached-poetry-dependencies - uses: actions/cache@v2 + - name: Cache venv + id: cache-venv + uses: actions/cache@v3 with: path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} + key: venv-${{ runner.os }}-${{ hashFiles('poetry.lock') }} + restore-keys: | + venv-${{ runner.os }}- - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + if: steps.cache-venv.outputs.cache-hit != 'true' run: poetry install + - name: Setup npm cache + id: cache-npm + uses: actions/cache@v3 + with: + path: node_modules + key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }} + - name: Install Pyright + if: steps.cache-npm.outputs.cache-hit != 'true' + run: npm install - name: Run tests run: poetry run pytest -v - name: Run type-checking From 05fd1afaa7568a4ccc1ad7967b6d31cff771ee4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 12:32:08 +0000 Subject: [PATCH 1049/1554] chore(deps): bump beet from 0.79.0 to 0.79.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.79.0 to 0.79.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.79.0...v0.79.1) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 89712298f..b71e53e69 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -10,11 +10,11 @@ python-versions = ">=3.5" dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "beet" -version = "0.79.0" +version = "0.79.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -100,7 +100,7 @@ optional = false python-versions = ">=3.6.0" [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" @@ -253,9 +253,9 @@ python-versions = ">=3.6.1,<4.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jaraco.classes" @@ -343,7 +343,7 @@ mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code_style = ["pre-commit (==2.6)"] +code-style = ["pre-commit (==2.6)"] compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] @@ -633,7 +633,7 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" @@ -833,8 +833,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.79.0-py3-none-any.whl", hash = "sha256:bac4f80f635d910059fe15c080564cb2338dccdfd6178d267f8c93b6786de3ae"}, - {file = "beet-0.79.0.tar.gz", hash = "sha256:76fe3b0a5dadb97de51b1891f73f568b2a8fe74436834f41a8725d921ca18577"}, + {file = "beet-0.79.1-py3-none-any.whl", hash = "sha256:2b792eb8de092f3a25d73ce6fb16b9d7262918b8144045ca4a4ea2d735aee50f"}, + {file = "beet-0.79.1.tar.gz", hash = "sha256:3198c4603fa60b357ae68a2a2cb75abc2e8b839f7c940980f6deeea18c0a41b8"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, From 009d5d6e8598c22fdfc420cfeed65d4bb4520b29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Nov 2022 12:23:46 +0000 Subject: [PATCH 1050/1554] chore(deps-dev): bump pyright from 1.1.276 to 1.1.278 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.276 to 1.1.278. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.278/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 86e0b45a2..987158df1 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.276" + "pyright": "^1.1.278" } }, "node_modules/pyright": { - "version": "1.1.276", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.276.tgz", - "integrity": "sha512-qG98S7X16hoymOlngwleX4bg6CzlE6sxclrqkif8Kqfm0bsaC/jiBxs2lWN+QJY9JL8hpK6j5MchFh4qSaZCEw==", + "version": "1.1.278", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.278.tgz", + "integrity": "sha512-at3j7c1fFzB6Jl4+bpr9QPRC/+1gH2gAR/M6GIRS312CHE2JMt8FZRflTbuxEB8IfQAtR+l3YoRMoS1vqF28jw==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.276", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.276.tgz", - "integrity": "sha512-qG98S7X16hoymOlngwleX4bg6CzlE6sxclrqkif8Kqfm0bsaC/jiBxs2lWN+QJY9JL8hpK6j5MchFh4qSaZCEw==", + "version": "1.1.278", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.278.tgz", + "integrity": "sha512-at3j7c1fFzB6Jl4+bpr9QPRC/+1gH2gAR/M6GIRS312CHE2JMt8FZRflTbuxEB8IfQAtR+l3YoRMoS1vqF28jw==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 6f64f30ea..caf02a1cf 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.276" + "pyright": "^1.1.278" } } From 6cf5572bde642acaee200dd670fbd4778efca801 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 2 Nov 2022 13:00:26 +0000 Subject: [PATCH 1051/1554] 0.57.5 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 11defef57..3a09b0d15 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.57.5 (2022-11-02) +### Fix +* Default argument parser properties ([`7e63b14`](https://github.com/mcbeet/mecha/commit/7e63b147ad1f248a84c4e8f398f5cb28295dab36)) + ## v0.57.4 (2022-10-19) ### Fix * Tweak nested yaml ([`9c69a1d`](https://github.com/mcbeet/mecha/commit/9c69a1d21f581e8e9bef7e44cb41e7c6f2f18025)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index c0e5ebf7a..02acc9af2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.57.4" +__version__ = "0.57.5" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ba2b9c717..e075c4771 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.57.4" +version = "0.57.5" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From d066ff96606e3e4f1293fae9973025f6c9450634 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 13 Nov 2022 15:44:18 +0100 Subject: [PATCH 1052/1554] feat: add meta.nesting.generate_execute option --- .../custom_execute_destination/beet.yml | 15 +++++++ .../src/data/demo/functions/bar.mcfunction | 3 ++ .../src/data/demo/functions/foo.mcfunction | 3 ++ packages/mecha/mecha/contrib/nesting.py | 38 +++++++++++++---- ...uild_custom_execute_destination__0.pack.md | 42 +++++++++++++++++++ 5 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 packages/mecha/examples/custom_execute_destination/beet.yml create mode 100644 packages/mecha/examples/custom_execute_destination/src/data/demo/functions/bar.mcfunction create mode 100644 packages/mecha/examples/custom_execute_destination/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md diff --git a/packages/mecha/examples/custom_execute_destination/beet.yml b/packages/mecha/examples/custom_execute_destination/beet.yml new file mode 100644 index 000000000..f656db8cb --- /dev/null +++ b/packages/mecha/examples/custom_execute_destination/beet.yml @@ -0,0 +1,15 @@ +id: demo +require: + - mecha.contrib.nesting +data_pack: + load: "src" +pipeline: + - mecha +meta: + nesting: + generate_execute: >- + {% if original_location == "demo:foo" -%} + demo:special_execute_{incr} + {%- else -%} + {namespace}:zprivate/{path}nested_execute_{incr} + {%- endif %} diff --git a/packages/mecha/examples/custom_execute_destination/src/data/demo/functions/bar.mcfunction b/packages/mecha/examples/custom_execute_destination/src/data/demo/functions/bar.mcfunction new file mode 100644 index 000000000..c97ed01db --- /dev/null +++ b/packages/mecha/examples/custom_execute_destination/src/data/demo/functions/bar.mcfunction @@ -0,0 +1,3 @@ +execute as @a: + say test + say bar diff --git a/packages/mecha/examples/custom_execute_destination/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/custom_execute_destination/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..7d1267682 --- /dev/null +++ b/packages/mecha/examples/custom_execute_destination/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,3 @@ +execute as @a: + say test + say foo diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 049cd717a..2c5401c3f 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -3,6 +3,8 @@ __all__ = [ "NestedCommandsTransformer", + "NestingOptions", + "nesting", "parse_nested_root", ] @@ -11,8 +13,10 @@ from importlib.resources import read_text from typing import List, cast -from beet import Context, Function, Generator +from beet import Context, Function, Generator, configurable from beet.core.utils import required_field +from jinja2 import Template +from pydantic import BaseModel from tokenstream import InvalidSyntax, TokenStream, set_location from mecha import ( @@ -31,7 +35,23 @@ ) +class NestingOptions(BaseModel): + generate_execute: str = ( + "{% if original_location %}" + "{{ original_location }}/" + "{% else %}" + "{namespace}:{path}" + "{% endif %}" + "nested_execute_{incr}" + ) + + def beet_default(ctx: Context): + ctx.require(nesting) + + +@configurable(validator=NestingOptions) +def nesting(ctx: Context, opts: NestingOptions): mc = ctx.inject(Mecha) mc.spec.multiline = True @@ -46,6 +66,7 @@ def beet_default(ctx: Context): NestedCommandsTransformer( generate=ctx.generate, database=mc.database, + generate_execute_template=ctx.template.compile(opts.generate_execute), ) ) @@ -89,6 +110,7 @@ class NestedCommandsTransformer(MutatingReducer): generate: Generator = required_field() database: CompilationDatabase = required_field() + generate_execute_template: Template = required_field() def emit_function(self, path: str, root: AstRoot): """Helper method for emitting nested commands into a separate function.""" @@ -137,18 +159,18 @@ def nesting_execute_commands(self, node: AstCommand): return subcommand.arguments[0] else: - if path := self.database[self.database.current].resource_location: - path = self.generate.format(path + "/nested_execute_{incr}") - else: - path = self.generate.path() + original_location = self.database[self.database.current].resource_location + path = self.generate.format( + self.generate_execute_template.render( + original_location=original_location + ) + ) self.emit_function(path, root) - resource_location = AstResourceLocation.from_value(path) - subcommand = AstCommand( identifier="function:name", - arguments=AstChildren([resource_location]), + arguments=AstChildren([AstResourceLocation.from_value(path)]), ) return AstCommand( diff --git a/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md new file mode 100644 index 000000000..35bfe97cf --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md @@ -0,0 +1,42 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:bar` + +```mcfunction +execute as @a run function demo:zprivate/nested_execute_0 +``` + +`@function demo:foo` + +```mcfunction +execute as @a run function demo:special_execute_0 +``` + +`@function demo:zprivate/nested_execute_0` + +```mcfunction +say test +say bar +``` + +`@function demo:special_execute_0` + +```mcfunction +say test +say foo +``` From 892b61a48bf55eff527c1f66d6f06bffbbe46965 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 13 Nov 2022 14:45:03 +0000 Subject: [PATCH 1053/1554] 0.58.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 3a09b0d15..99fc59077 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.58.0 (2022-11-13) +### Feature +* Add meta.nesting.generate_execute option ([`9406954`](https://github.com/mcbeet/mecha/commit/94069545a28c3aec1dbc8a950191839b95e5b6e6)) + ## v0.57.5 (2022-11-02) ### Fix * Default argument parser properties ([`7e63b14`](https://github.com/mcbeet/mecha/commit/7e63b147ad1f248a84c4e8f398f5cb28295dab36)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 02acc9af2..2b6655634 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.57.5" +__version__ = "0.58.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e075c4771..342b3f243 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.57.5" +version = "0.58.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5c66cec44ca1565a92592be6d0f341293cc4ba4d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 13 Nov 2022 17:53:46 +0100 Subject: [PATCH 1054/1554] fix: prevent inifinite recursion in CommandTree.__repr__ --- packages/mecha/mecha/config.py | 16 ++++++++++++++++ packages/mecha/tests/test_spec.py | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index d26b75f2c..3287fa1d4 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -162,5 +162,21 @@ def resolve( return self + def __repr__(self) -> str: + args = ", ".join( + f"{name}=" + + ( + "{" + ", ".join(f"{k!r}: ..." for k in value) + "}" + if name == "children" + else repr(value) + ) + for name in self.__class__.__fields__ + if (value := getattr(self, name)) + ) + return f"{self.__class__.__name__}({args})" + + def __str__(self) -> str: + return self.__repr__() + CommandTree.update_forward_refs() diff --git a/packages/mecha/tests/test_spec.py b/packages/mecha/tests/test_spec.py index fb4b3d048..c1abf11eb 100644 --- a/packages/mecha/tests/test_spec.py +++ b/packages/mecha/tests/test_spec.py @@ -26,3 +26,15 @@ def test_parsers(snapshot: SnapshotFixture, mc: Mecha): undefined_parsers = all_used_parser - all_defined_parsers assert not undefined_parsers + + +def test_repr(snapshot: SnapshotFixture, mc: Mecha): + assert ( + str(mc.spec.tree.get("execute", "if", "score")) + == "CommandTree(type='literal', children={'target': ...})" + ) + + assert ( + str(mc.spec.tree.get("execute", "if", "score", "target")) + == "CommandTree(type='argument', parser='minecraft:score_holder', properties={'amount': 'single'}, children={'targetObjective': ...})" + ) From b59b1c07ee828279a173a2fe45e8227efcf303db Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 13 Nov 2022 16:54:30 +0000 Subject: [PATCH 1055/1554] 0.58.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 99fc59077..52b3a6353 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.58.1 (2022-11-13) +### Fix +* Prevent inifinite recursion in CommandTree.__repr__ ([`a5a776c`](https://github.com/mcbeet/mecha/commit/a5a776c9322a97aa0e55ba8b329800c5073977c4)) + ## v0.58.0 (2022-11-13) ### Feature * Add meta.nesting.generate_execute option ([`9406954`](https://github.com/mcbeet/mecha/commit/94069545a28c3aec1dbc8a950191839b95e5b6e6)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 2b6655634..42c318b1d 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.58.0" +__version__ = "0.58.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 342b3f243..9d1a86ef1 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.58.0" +version = "0.58.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 0df4d85ce26bed08e97b757f0e0cc94b4bf625e2 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 14 Nov 2022 01:38:33 +0100 Subject: [PATCH 1056/1554] chore: use python 3.10 --- packages/mecha/poetry.lock | 222 +++++++++++++++++----------------- packages/mecha/poetry.toml | 2 - packages/mecha/pyproject.toml | 4 +- 3 files changed, 114 insertions(+), 114 deletions(-) delete mode 100644 packages/mecha/poetry.toml diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index b71e53e69..7c416817d 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -14,7 +14,7 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.79.1" +version = "0.79.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -48,7 +48,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -140,15 +139,15 @@ click = "*" [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" [[package]] name = "cryptography" -version = "38.0.1" +version = "38.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -181,6 +180,17 @@ category = "dev" optional = false python-versions = ">=3.5,<4.0" +[[package]] +name = "exceptiongroup" +version = "1.0.2" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "gitdb" version = "4.0.9" @@ -193,7 +203,7 @@ python-versions = ">=3.6" smmap = ">=3.0.1,<6" [[package]] -name = "GitPython" +name = "gitpython" version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "dev" @@ -258,7 +268,7 @@ plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] -name = "jaraco.classes" +name = "jaraco-classes" version = "3.2.3" description = "Utility functions for Python class constructs" category = "dev" @@ -285,7 +295,7 @@ test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "te trio = ["async_generator", "trio"] [[package]] -name = "Jinja2" +name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "main" @@ -300,33 +310,33 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.9.3" +version = "23.11.0" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} "jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "lectern" -version = "0.25.0" +version = "0.26.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.73.3" +beet = ">=0.79.0" click = ">=8.1.3,<9.0.0" markdown-it-py = ">=2.1.0,<3.0.0" @@ -352,7 +362,7 @@ rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx- testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "MarkupSafe" +name = "markupsafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" @@ -415,7 +425,7 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.10.1" +version = "0.10.2" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false @@ -434,15 +444,15 @@ testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "2.5.4" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] +test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -456,14 +466,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "pycparser" version = "2.21" @@ -488,7 +490,7 @@ dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] [[package]] -name = "Pygments" +name = "pygments" version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" @@ -511,7 +513,7 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.3" +version = "7.2.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -520,11 +522,11 @@ python-versions = ">=3.7" [package.dependencies] attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] @@ -543,7 +545,7 @@ wrapt = ">=1.12.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.10.0" +version = "3.11.0" description = "Interact with GitLab API" category = "dev" optional = false @@ -559,7 +561,7 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.32.1" +version = "7.32.2" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false @@ -594,7 +596,7 @@ optional = false python-versions = "*" [[package]] -name = "PyYAML" +name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" category = "main" @@ -603,7 +605,7 @@ python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "37.2" +version = "37.3" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -637,7 +639,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.10.0" +version = "0.10.1" description = "A utility belt for advanced users of python-requests" category = "dev" optional = false @@ -658,7 +660,7 @@ python-versions = ">=3.7" idna2008 = ["idna"] [[package]] -name = "SecretStorage" +name = "secretstorage" version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" @@ -719,11 +721,11 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.11.5" +version = "0.11.6" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6" [[package]] name = "tqdm" @@ -793,14 +795,14 @@ python-versions = "*" [[package]] name = "wheel" -version = "0.37.1" +version = "0.38.4" description = "A built-package format for Python" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [package.extras] -test = ["pytest (>=3.0.0)", "pytest-cov"] +test = ["pytest (>=3.0.0)"] [[package]] name = "wrapt" @@ -812,7 +814,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.9.0" +version = "3.10.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false @@ -824,8 +826,8 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" -python-versions = "^3.8" -content-hash = "99f28beac712ff0ad1c9a7869405e35a06784887bc7c1bf3e0bf227544357ccd" +python-versions = "^3.10" +content-hash = "fd184e196ffaca2fcfdac78e8fe5344ebbb5e2b70112ac91f97d1fa90f03780d" [metadata.files] attrs = [ @@ -833,8 +835,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.79.1-py3-none-any.whl", hash = "sha256:2b792eb8de092f3a25d73ce6fb16b9d7262918b8144045ca4a4ea2d735aee50f"}, - {file = "beet-0.79.1.tar.gz", hash = "sha256:3198c4603fa60b357ae68a2a2cb75abc2e8b839f7c940980f6deeea18c0a41b8"}, + {file = "beet-0.79.2-py3-none-any.whl", hash = "sha256:f02e1d14cda88d5c25e84df483aba169a60687e63d1365ff5e0c65a9cfb656da"}, + {file = "beet-0.79.2.tar.gz", hash = "sha256:ed683d68411b27e639ffd762d5c6a06cd09a040f1e441d6f6f6337b94cec6442"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, @@ -950,36 +952,36 @@ click-log = [ {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] cryptography = [ - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, - {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, - {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, - {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, + {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, + {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, + {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, ] docutils = [ {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, @@ -989,11 +991,15 @@ dotty-dict = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] +exceptiongroup = [ + {file = "exceptiongroup-1.0.2-py3-none-any.whl", hash = "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27"}, + {file = "exceptiongroup-1.0.2.tar.gz", hash = "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695"}, +] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -GitPython = [ +gitpython = [ {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] @@ -1017,7 +1023,7 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -"jaraco.classes" = [ +jaraco-classes = [ {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, ] @@ -1025,23 +1031,23 @@ jeepney = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] -Jinja2 = [ +jinja2 = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-23.9.3-py3-none-any.whl", hash = "sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0"}, - {file = "keyring-23.9.3.tar.gz", hash = "sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5"}, + {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, + {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, ] lectern = [ - {file = "lectern-0.25.0-py3-none-any.whl", hash = "sha256:28db47c112ed3a82f57876411146974e138dd844e596add6a5c02e0fbf19e914"}, - {file = "lectern-0.25.0.tar.gz", hash = "sha256:80f7e48440a8fbaeda029cddc0c0abed7ebd4a7500ce85aba2815d252131be46"}, + {file = "lectern-0.26.0-py3-none-any.whl", hash = "sha256:e46eb1f1befd5892cad5bffc65fac1debe008e641ea6ea5c281e49b8a831cf0f"}, + {file = "lectern-0.26.0.tar.gz", hash = "sha256:0496bfaee29641e04e8c6ef0a6db0ce5b4b01e5064a0d6d1c8ce3a6e7a548066"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] -MarkupSafe = [ +markupsafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, @@ -1134,25 +1140,21 @@ packaging = [ {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, ] pkginfo = [ {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, ] platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] pycparser = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, @@ -1195,7 +1197,7 @@ pydantic = [ {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, ] -Pygments = [ +pygments = [ {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] @@ -1204,26 +1206,26 @@ pyparsing = [ {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, ] pytest-insta = [ {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, ] python-gitlab = [ - {file = "python-gitlab-3.10.0.tar.gz", hash = "sha256:14930a16fdd7f36f67b9373e7d4d4720e8e374800028380289db3306e9f74614"}, - {file = "python_gitlab-3.10.0-py3-none-any.whl", hash = "sha256:6b5a24d0f479c43c1759cb174cf42116ed27cced31284bedc82d584d860fa238"}, + {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, + {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, ] python-semantic-release = [ - {file = "python-semantic-release-7.32.1.tar.gz", hash = "sha256:ba47100e4ffa74c006529d6a8c22ca98f85ff4c145e8584eb2b17e6830a5116e"}, - {file = "python_semantic_release-7.32.1-py3-none-any.whl", hash = "sha256:9a29a02b3fb33fc318b07bf77c001c62aed9060d148eca25af7f4aa3afb49f4e"}, + {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, + {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] -PyYAML = [ +pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1266,22 +1268,22 @@ PyYAML = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-37.2-py3-none-any.whl", hash = "sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106"}, - {file = "readme_renderer-37.2.tar.gz", hash = "sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923"}, + {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, + {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, ] requests = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ - {file = "requests-toolbelt-0.10.0.tar.gz", hash = "sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30"}, - {file = "requests_toolbelt-0.10.0-py2.py3-none-any.whl", hash = "sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985"}, + {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, + {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, ] rfc3986 = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, ] -SecretStorage = [ +secretstorage = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] @@ -1310,8 +1312,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, - {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, ] tqdm = [ {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, @@ -1334,8 +1336,8 @@ webencodings = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] wheel = [ - {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, - {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, + {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, + {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, ] wrapt = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, @@ -1404,6 +1406,6 @@ wrapt = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, - {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, + {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, + {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] diff --git a/packages/mecha/poetry.toml b/packages/mecha/poetry.toml deleted file mode 100644 index ab1033bd3..000000000 --- a/packages/mecha/poetry.toml +++ /dev/null @@ -1,2 +0,0 @@ -[virtualenvs] -in-project = true diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 9d1a86ef1..ed903d453 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -22,7 +22,7 @@ keywords = [ include = ["mecha/py.typed"] [tool.poetry.dependencies] -python = "^3.8" +python = "^3.10" beet = ">=0.79.0" tokenstream = "^1.4.2" @@ -47,7 +47,7 @@ addopts = "tests --import-mode=importlib" typeCheckingMode = "strict" [tool.black] -target-version = ["py38"] +target-version = ["py310"] [tool.isort] profile = "black" From 2c60af699d6690ead07a0df6eac082bde1528a45 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 14 Nov 2022 01:41:23 +0100 Subject: [PATCH 1057/1554] feat: looser implicit execute normalization --- .../mecha/mecha/contrib/implicit_execute.py | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/packages/mecha/mecha/contrib/implicit_execute.py b/packages/mecha/mecha/contrib/implicit_execute.py index 3d7dfccbd..285852cbd 100644 --- a/packages/mecha/mecha/contrib/implicit_execute.py +++ b/packages/mecha/mecha/contrib/implicit_execute.py @@ -49,18 +49,8 @@ def beet_default(ctx: Context): ) mc.spec.parsers["command"] = ImplicitExecuteParser( - commands={ - name - for name in mc.spec.prototypes - if (s := name.split(":", 2)[:2]) - and s[0] == "execute" - and s[1] in commands - }, - shorthands={ - name - for name in mc.spec.prototypes - if name.partition(":")[0] in shorthands - }, + commands=commands, + shorthands=shorthands, parser=mc.spec.parsers["command"], ) @@ -75,20 +65,22 @@ class ImplicitExecuteParser: def __call__(self, stream: TokenStream) -> Any: if isinstance(node := self.parser(stream), AstCommand): - if node.identifier in self.commands: - subcommand = replace(node, identifier=node.identifier[8:]) - run = AstCommand( - identifier="execute:run:subcommand", - arguments=AstChildren([subcommand]), - ) - return set_location(run, node) - - elif node.identifier in self.shorthands: - subcommand = replace(node, identifier=f"execute:{node.identifier}") - execute = AstCommand( - identifier="execute:subcommand", - arguments=AstChildren([subcommand]), - ) - return set_location(execute, node) + match node.identifier.split(":"): + case ["execute", command, *_] if command in self.commands: + subcommand = replace(node, identifier=node.identifier[8:]) + run = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([subcommand]), + ) + return set_location(run, node) + case [shorthand, *_] if shorthand in self.shorthands: + subcommand = replace(node, identifier=f"execute:{node.identifier}") + execute = AstCommand( + identifier="execute:subcommand", + arguments=AstChildren([subcommand]), + ) + return set_location(execute, node) + case _: + pass return node From 8d7b7c98eabc6ccaf5c0054b3b27e9195b1f72bb Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 14 Nov 2022 00:42:13 +0000 Subject: [PATCH 1058/1554] 0.59.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 52b3a6353..520294ee3 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.59.0 (2022-11-14) +### Feature +* Looser implicit execute normalization ([`1d0fabe`](https://github.com/mcbeet/mecha/commit/1d0fabe26ba2f97dc1f89e71fbc0c312c45957f2)) + ## v0.58.1 (2022-11-13) ### Fix * Prevent inifinite recursion in CommandTree.__repr__ ([`a5a776c`](https://github.com/mcbeet/mecha/commit/a5a776c9322a97aa0e55ba8b329800c5073977c4)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 42c318b1d..7b2d04fe8 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.58.1" +__version__ = "0.59.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ed903d453..00fb4db88 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.58.1" +version = "0.59.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b39ec96785d5c8ae7fca0be47d22ef0c469cb0e4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 14 Nov 2022 01:46:38 +0100 Subject: [PATCH 1059/1554] chore: update toml recommendation --- packages/mecha/.vscode/extensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/.vscode/extensions.json b/packages/mecha/.vscode/extensions.json index 8affbb2bf..206307d3c 100644 --- a/packages/mecha/.vscode/extensions.json +++ b/packages/mecha/.vscode/extensions.json @@ -2,6 +2,6 @@ "recommendations": [ "ms-python.python", "ms-python.vscode-pylance", - "bungcip.better-toml" + "tamasfe.even-better-toml" ] } From bd6608026e5e4a7f17d4b4082b6f5488700b15bb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 15 Nov 2022 00:32:30 +0100 Subject: [PATCH 1060/1554] fix: log mecha diagnostics even when there's an error --- packages/mecha/mecha/api.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 6af5f32b5..dabe5d660 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -502,10 +502,8 @@ def compile( return result - def finalize(self, ctx: Context): - """Plugin that logs diagnostics and raises an exception if there are errors.""" - yield - + def log_reported_diagnostics(self): + """Log reported diagnostics.""" for diagnostic in self.diagnostics.exceptions: message = diagnostic.format_message() @@ -526,5 +524,14 @@ def finalize(self, ctx: Context): elif diagnostic.level == "info": logger.info("%s", message, extra=extra) - if errors := list(self.diagnostics.get_all_errors()): - raise DiagnosticErrorSummary(DiagnosticCollection(errors)) + def finalize(self, ctx: Context): + """Plugin that logs diagnostics and raises an exception if there are errors.""" + try: + yield + except: + raise + else: + if errors := list(self.diagnostics.get_all_errors()): + raise DiagnosticErrorSummary(DiagnosticCollection(errors)) + finally: + self.log_reported_diagnostics() From 3deb58d815ec7493bf0a485ef6657929b2f98e7e Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 14 Nov 2022 23:33:13 +0000 Subject: [PATCH 1061/1554] 0.59.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 520294ee3..5cb0cc5c5 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.59.1 (2022-11-14) +### Fix +* Log mecha diagnostics even when there's an error ([`6f30f0b`](https://github.com/mcbeet/mecha/commit/6f30f0b4eee25e69005b1b76fce8e672a71a92dd)) + ## v0.59.0 (2022-11-14) ### Feature * Looser implicit execute normalization ([`1d0fabe`](https://github.com/mcbeet/mecha/commit/1d0fabe26ba2f97dc1f89e71fbc0c312c45957f2)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 7b2d04fe8..3f349688e 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.59.0" +__version__ = "0.59.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 00fb4db88..e0a25bc4e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.59.0" +version = "0.59.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 4aadb82c17d2b23d5d1e6edfe9ed950c715d9cd1 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 15 Nov 2022 01:09:09 +0100 Subject: [PATCH 1062/1554] fix: revert looser implicit execute normalization This reverts commit 2c60af699d6690ead07a0df6eac082bde1528a45. --- .../mecha/mecha/contrib/implicit_execute.py | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/packages/mecha/mecha/contrib/implicit_execute.py b/packages/mecha/mecha/contrib/implicit_execute.py index 285852cbd..3d7dfccbd 100644 --- a/packages/mecha/mecha/contrib/implicit_execute.py +++ b/packages/mecha/mecha/contrib/implicit_execute.py @@ -49,8 +49,18 @@ def beet_default(ctx: Context): ) mc.spec.parsers["command"] = ImplicitExecuteParser( - commands=commands, - shorthands=shorthands, + commands={ + name + for name in mc.spec.prototypes + if (s := name.split(":", 2)[:2]) + and s[0] == "execute" + and s[1] in commands + }, + shorthands={ + name + for name in mc.spec.prototypes + if name.partition(":")[0] in shorthands + }, parser=mc.spec.parsers["command"], ) @@ -65,22 +75,20 @@ class ImplicitExecuteParser: def __call__(self, stream: TokenStream) -> Any: if isinstance(node := self.parser(stream), AstCommand): - match node.identifier.split(":"): - case ["execute", command, *_] if command in self.commands: - subcommand = replace(node, identifier=node.identifier[8:]) - run = AstCommand( - identifier="execute:run:subcommand", - arguments=AstChildren([subcommand]), - ) - return set_location(run, node) - case [shorthand, *_] if shorthand in self.shorthands: - subcommand = replace(node, identifier=f"execute:{node.identifier}") - execute = AstCommand( - identifier="execute:subcommand", - arguments=AstChildren([subcommand]), - ) - return set_location(execute, node) - case _: - pass + if node.identifier in self.commands: + subcommand = replace(node, identifier=node.identifier[8:]) + run = AstCommand( + identifier="execute:run:subcommand", + arguments=AstChildren([subcommand]), + ) + return set_location(run, node) + + elif node.identifier in self.shorthands: + subcommand = replace(node, identifier=f"execute:{node.identifier}") + execute = AstCommand( + identifier="execute:subcommand", + arguments=AstChildren([subcommand]), + ) + return set_location(execute, node) return node From 694ce4558a415acece09a80aef28dad9a0c6f24f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 15 Nov 2022 00:10:32 +0000 Subject: [PATCH 1063/1554] 0.59.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 5cb0cc5c5..a94f37d89 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.59.2 (2022-11-15) +### Fix +* Revert looser implicit execute normalization ([`014af4f`](https://github.com/mcbeet/mecha/commit/014af4f84a8b97e9d534fa85423338cfa028d4dc)) + ## v0.59.1 (2022-11-14) ### Fix * Log mecha diagnostics even when there's an error ([`6f30f0b`](https://github.com/mcbeet/mecha/commit/6f30f0b4eee25e69005b1b76fce8e672a71a92dd)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 3f349688e..53c520d9c 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.59.1" +__version__ = "0.59.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index e0a25bc4e..248d19af6 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.59.1" +version = "0.59.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 84740154ed60ea7731b3637ae60352ebe91581fe Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 22 Nov 2022 03:38:24 +0100 Subject: [PATCH 1064/1554] feat: add mecha.contrib.source_map --- .../mecha/examples/basic_source_map/beet.yml | 8 ++ .../mecha/examples/basic_source_map/demo.py | 5 ++ .../src/data/demo/functions/foo.mcfunction | 4 + packages/mecha/mecha/ast.py | 17 +++- packages/mecha/mecha/contrib/source_map.py | 85 +++++++++++++++++++ ...xamples__build_basic_source_map__0.pack.md | 46 ++++++++++ 6 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 packages/mecha/examples/basic_source_map/beet.yml create mode 100644 packages/mecha/examples/basic_source_map/demo.py create mode 100644 packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/source_map.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md diff --git a/packages/mecha/examples/basic_source_map/beet.yml b/packages/mecha/examples/basic_source_map/beet.yml new file mode 100644 index 000000000..4307cb591 --- /dev/null +++ b/packages/mecha/examples/basic_source_map/beet.yml @@ -0,0 +1,8 @@ +require: + - mecha.contrib.nesting + - mecha.contrib.source_map +data_pack: + load: "src" +pipeline: + - demo + - mecha diff --git a/packages/mecha/examples/basic_source_map/demo.py b/packages/mecha/examples/basic_source_map/demo.py new file mode 100644 index 000000000..9e4dc32f1 --- /dev/null +++ b/packages/mecha/examples/basic_source_map/demo.py @@ -0,0 +1,5 @@ +from beet import Context, Function + + +def beet_default(ctx: Context): + ctx.generate(Function("say 123\nfunction demo:thing:\n say 456\n")) diff --git a/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..352e53501 --- /dev/null +++ b/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,4 @@ +say abc + +function demo:bar: + say def diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 33a1678d4..8e05535b5 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -3,6 +3,7 @@ "AstChildren", "AstRoot", "AstCommand", + "AstPhantomCommand", "AstString", "AstBool", "AstNumber", @@ -77,7 +78,7 @@ import re -from dataclasses import dataclass, fields +from dataclasses import dataclass, field, fields from itertools import islice, permutations, zip_longest from typing import ( Any, @@ -202,7 +203,7 @@ def __repr__(self) -> str: @dataclass(frozen=True) class AstRoot(AstNode): - """Root ast node""" + """Ast root node.""" commands: AstChildren["AstCommand"] = required_field() @@ -211,7 +212,7 @@ class AstRoot(AstNode): @dataclass(frozen=True) class AstCommand(AstNode): - """Command ast node""" + """Ast command node.""" identifier: str = required_field() arguments: AstChildren[AstNode] = required_field() @@ -219,6 +220,16 @@ class AstCommand(AstNode): parser = "command" +@dataclass(frozen=True) +class AstPhantomCommand(AstCommand): + """Ast phantom command node.""" + + identifier: str = field(default="mecha:phantom") + arguments: AstChildren[AstNode] = field(default=AstChildren([])) + + parser = None + + @dataclass(frozen=True) class AstString(AstNode): """Ast string node.""" diff --git a/packages/mecha/mecha/contrib/source_map.py b/packages/mecha/mecha/contrib/source_map.py new file mode 100644 index 000000000..5dc8b8f9a --- /dev/null +++ b/packages/mecha/mecha/contrib/source_map.py @@ -0,0 +1,85 @@ +"""Plugin that emits source mapping information.""" + + +__all__ = [ + "AstSourceMap", + "SourceMapOptions", + "SourceMapTransformer", + "SourceMapSerializer", + "source_map", +] + + +from dataclasses import dataclass, replace +from typing import List + +from beet import Context, configurable +from beet.core.utils import required_field +from jinja2 import Template +from pydantic import BaseModel + +from mecha import ( + AstChildren, + AstPhantomCommand, + AstRoot, + CompilationDatabase, + Mecha, + Reducer, + Visitor, + rule, +) + + +class SourceMapOptions(BaseModel): + header: str = "# [source_map] {{ compilation_unit.filename or compilation_unit.resource_location }}" + + class Config: + extra = "forbid" + + +def beet_default(ctx: Context): + ctx.require(source_map) + + +@configurable(validator=SourceMapOptions) +def source_map(ctx: Context, opts: SourceMapOptions): + mc = ctx.inject(Mecha) + mc.transform.extend( + SourceMapTransformer( + database=mc.database, + header_template=ctx.template.compile(opts.header), + ) + ) + mc.serialize.extend(SourceMapSerializer()) + + +@dataclass(frozen=True) +class AstSourceMap(AstPhantomCommand): + """Ast source map node.""" + + header: str = required_field() + + +@dataclass +class SourceMapTransformer(Reducer): + database: CompilationDatabase = required_field() + header_template: Template = required_field() + + @rule(AstRoot) + def insert_source_map(self, node: AstRoot): + if not node.commands or not isinstance(node.commands[0], AstSourceMap): + file_instance = self.database.current + source_map = AstSourceMap( + header=self.header_template.render( + file_instance=file_instance, + compilation_unit=self.database[file_instance], + ) + ) + node = replace(node, commands=AstChildren([source_map, *node.commands])) + return node + + +class SourceMapSerializer(Visitor): + @rule(AstSourceMap) + def source_map(self, node: AstSourceMap, result: List[str]): + result.append(node.header) diff --git a/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md new file mode 100644 index 000000000..cebd8d334 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md @@ -0,0 +1,46 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +# [source_map] src/data/demo/functions/foo.mcfunction +say abc +``` + +`@function demo:thing` + +```mcfunction +# [source_map] basic_source_map:generated_0 +say 456 +``` + +`@function demo:bar` + +```mcfunction +# [source_map] src/data/demo/functions/foo.mcfunction +say def +``` + +### basic_source_map + +`@function basic_source_map:generated_0` + +```mcfunction +# [source_map] basic_source_map:generated_0 +say 123 +``` From bff7513a162119ef0dade9ce50e9225fe082e218 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 22 Nov 2022 02:39:10 +0000 Subject: [PATCH 1065/1554] 0.60.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index a94f37d89..217b7e9c3 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.60.0 (2022-11-22) +### Feature +* Add mecha.contrib.source_map ([`34cf945`](https://github.com/mcbeet/mecha/commit/34cf945a089079b40761e41ae2921a51e9b48b4c)) + ## v0.59.2 (2022-11-15) ### Fix * Revert looser implicit execute normalization ([`014af4f`](https://github.com/mcbeet/mecha/commit/014af4f84a8b97e9d534fa85423338cfa028d4dc)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 53c520d9c..8417665b1 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.59.2" +__version__ = "0.60.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 248d19af6..8311cc30e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.59.2" +version = "0.60.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From d8300c1e508d005aa767c45dde4c01a63f5e39f4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 22 Nov 2022 03:47:38 +0100 Subject: [PATCH 1066/1554] fix: default fields for phantom command --- packages/mecha/mecha/ast.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 8e05535b5..c6490ee81 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -78,7 +78,7 @@ import re -from dataclasses import dataclass, field, fields +from dataclasses import dataclass, fields from itertools import islice, permutations, zip_longest from typing import ( Any, @@ -224,8 +224,8 @@ class AstCommand(AstNode): class AstPhantomCommand(AstCommand): """Ast phantom command node.""" - identifier: str = field(default="mecha:phantom") - arguments: AstChildren[AstNode] = field(default=AstChildren([])) + identifier: str = "mecha:phantom" + arguments: AstChildren[AstNode] = AstChildren([]) parser = None From d74785ec63eea493a78a489812a77d57c9227288 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 22 Nov 2022 02:48:19 +0000 Subject: [PATCH 1067/1554] 0.60.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 217b7e9c3..4289e3bf8 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.60.1 (2022-11-22) +### Fix +* Default fields for phantom command ([`1d2344f`](https://github.com/mcbeet/mecha/commit/1d2344f26622f2cb5d732e3af7ad19403f2e9d43)) + ## v0.60.0 (2022-11-22) ### Feature * Add mecha.contrib.source_map ([`34cf945`](https://github.com/mcbeet/mecha/commit/34cf945a089079b40761e41ae2921a51e9b48b4c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 8417665b1..4ce307845 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.60.0" +__version__ = "0.60.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8311cc30e..edd57314c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.60.0" +version = "0.60.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 6d8ce7bb4ef968351b717ddcdb74ceaad26a6c00 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 22 Nov 2022 05:17:35 +0100 Subject: [PATCH 1068/1554] fix: rename AstPhantomCommand to AstCommandSentinel --- packages/mecha/mecha/ast.py | 8 ++++---- packages/mecha/mecha/contrib/source_map.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index c6490ee81..88a80126b 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -3,7 +3,7 @@ "AstChildren", "AstRoot", "AstCommand", - "AstPhantomCommand", + "AstCommandSentinel", "AstString", "AstBool", "AstNumber", @@ -221,10 +221,10 @@ class AstCommand(AstNode): @dataclass(frozen=True) -class AstPhantomCommand(AstCommand): - """Ast phantom command node.""" +class AstCommandSentinel(AstCommand): + """Ast command sentinel node.""" - identifier: str = "mecha:phantom" + identifier: str = "mecha:sentinel" arguments: AstChildren[AstNode] = AstChildren([]) parser = None diff --git a/packages/mecha/mecha/contrib/source_map.py b/packages/mecha/mecha/contrib/source_map.py index 5dc8b8f9a..3be4e98d5 100644 --- a/packages/mecha/mecha/contrib/source_map.py +++ b/packages/mecha/mecha/contrib/source_map.py @@ -20,7 +20,7 @@ from mecha import ( AstChildren, - AstPhantomCommand, + AstCommandSentinel, AstRoot, CompilationDatabase, Mecha, @@ -54,7 +54,7 @@ def source_map(ctx: Context, opts: SourceMapOptions): @dataclass(frozen=True) -class AstSourceMap(AstPhantomCommand): +class AstSourceMap(AstCommandSentinel): """Ast source map node.""" header: str = required_field() From 5fb09bbb170cf7cd1c62015400e5f21d23141b71 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 22 Nov 2022 04:18:30 +0000 Subject: [PATCH 1069/1554] 0.60.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 4289e3bf8..59d634b7a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.60.2 (2022-11-22) +### Fix +* Rename AstPhantomCommand to AstCommandSentinel ([`28cb612`](https://github.com/mcbeet/mecha/commit/28cb612fd592142dccf3ef359fe0e0c9047675d4)) + ## v0.60.1 (2022-11-22) ### Fix * Default fields for phantom command ([`1d2344f`](https://github.com/mcbeet/mecha/commit/1d2344f26622f2cb5d732e3af7ad19403f2e9d43)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 4ce307845..1a04b05d2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.60.1" +__version__ = "0.60.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index edd57314c..20b983c2c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.60.1" +version = "0.60.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From fd94c94a07bcf23ebba32cdffd04da9badf66b7a Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 22 Nov 2022 05:21:23 +0100 Subject: [PATCH 1070/1554] fix: make SourceMapTransformer a MutatingReducer --- packages/mecha/mecha/contrib/source_map.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/contrib/source_map.py b/packages/mecha/mecha/contrib/source_map.py index 3be4e98d5..5b6c3a8aa 100644 --- a/packages/mecha/mecha/contrib/source_map.py +++ b/packages/mecha/mecha/contrib/source_map.py @@ -24,7 +24,7 @@ AstRoot, CompilationDatabase, Mecha, - Reducer, + MutatingReducer, Visitor, rule, ) @@ -61,7 +61,7 @@ class AstSourceMap(AstCommandSentinel): @dataclass -class SourceMapTransformer(Reducer): +class SourceMapTransformer(MutatingReducer): database: CompilationDatabase = required_field() header_template: Template = required_field() From e7ca840f66b6fc85a456a176408d3ce8826fc17c Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 22 Nov 2022 04:22:10 +0000 Subject: [PATCH 1071/1554] 0.60.3 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 59d634b7a..c7d8cca6f 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.60.3 (2022-11-22) +### Fix +* Make SourceMapTransformer a MutatingReducer ([`c0f7109`](https://github.com/mcbeet/mecha/commit/c0f7109b2ef0bf74e21929b114146941e6d0b77c)) + ## v0.60.2 (2022-11-22) ### Fix * Rename AstPhantomCommand to AstCommandSentinel ([`28cb612`](https://github.com/mcbeet/mecha/commit/28cb612fd592142dccf3ef359fe0e0c9047675d4)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 1a04b05d2..e777d7003 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.60.2" +__version__ = "0.60.3" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 20b983c2c..a99d56a42 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.60.2" +version = "0.60.3" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 872514755ebf22ebde75aa92c0fbb406e3b1fac3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 00:07:40 +0100 Subject: [PATCH 1072/1554] chore: update toml recommendation --- packages/bolt/.vscode/extensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bolt/.vscode/extensions.json b/packages/bolt/.vscode/extensions.json index 8affbb2bf..206307d3c 100644 --- a/packages/bolt/.vscode/extensions.json +++ b/packages/bolt/.vscode/extensions.json @@ -2,6 +2,6 @@ "recommendations": [ "ms-python.python", "ms-python.vscode-pylance", - "bungcip.better-toml" + "tamasfe.even-better-toml" ] } From b636744bddc0bf4dd67678a2c319c63d286d5c7f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 00:12:09 +0100 Subject: [PATCH 1073/1554] chore: use python 3.10 --- packages/bolt/poetry.lock | 298 ++++++++++++++++++----------------- packages/bolt/poetry.toml | 2 - packages/bolt/pyproject.toml | 16 +- 3 files changed, 158 insertions(+), 158 deletions(-) delete mode 100644 packages/bolt/poetry.toml diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 4dc93f79f..ceb70fa1b 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -10,11 +10,11 @@ python-versions = ">=3.5" dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "beet" -version = "0.79.0" +version = "0.80.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -48,7 +48,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -100,7 +99,7 @@ optional = false python-versions = ">=3.6.0" [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" @@ -140,15 +139,15 @@ click = "*" [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" [[package]] name = "cryptography" -version = "38.0.1" +version = "38.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -181,6 +180,17 @@ category = "dev" optional = false python-versions = ">=3.5,<4.0" +[[package]] +name = "exceptiongroup" +version = "1.0.4" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "gitdb" version = "4.0.9" @@ -193,7 +203,7 @@ python-versions = ">=3.6" smmap = ">=3.0.1,<6" [[package]] -name = "GitPython" +name = "gitpython" version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "dev" @@ -253,12 +263,12 @@ python-versions = ">=3.6.1,<4.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] -name = "jaraco.classes" +name = "jaraco-classes" version = "3.2.3" description = "Utility functions for Python class constructs" category = "dev" @@ -285,7 +295,7 @@ test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "te trio = ["async_generator", "trio"] [[package]] -name = "Jinja2" +name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "main" @@ -300,33 +310,33 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.9.3" +version = "23.11.0" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} "jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "lectern" -version = "0.25.0" +version = "0.26.0" description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -beet = ">=0.73.3" +beet = ">=0.79.0" click = ">=8.1.3,<9.0.0" markdown-it-py = ">=2.1.0,<3.0.0" @@ -343,7 +353,7 @@ mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code_style = ["pre-commit (==2.6)"] +code-style = ["pre-commit (==2.6)"] compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] @@ -352,7 +362,7 @@ rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx- testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "MarkupSafe" +name = "markupsafe" version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" @@ -369,11 +379,11 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.57.4" +version = "0.60.3" description = "A powerful Minecraft command library" category = "main" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.10,<4.0" [package.dependencies] beet = ">=0.79.0" @@ -408,7 +418,7 @@ numpy = "*" [[package]] name = "numpy" -version = "1.23.4" +version = "1.23.5" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -427,7 +437,7 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.10.1" +version = "0.10.2" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false @@ -446,15 +456,15 @@ testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "2.5.4" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] +test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -468,14 +478,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "pycparser" version = "2.21" @@ -500,7 +502,7 @@ dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] [[package]] -name = "Pygments" +name = "pygments" version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" @@ -523,7 +525,7 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.3" +version = "7.2.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -532,30 +534,30 @@ python-versions = ">=3.7" [package.dependencies] attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-insta" -version = "0.1.11" +version = "0.2.0" description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -pytest = ">=6.0.2" -wrapt = ">=1.12.1,<2.0.0" +pytest = ">=7.2.0,<8.0.0" +wrapt = ">=1.14.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.10.0" +version = "3.11.0" description = "Interact with GitLab API" category = "dev" optional = false @@ -606,7 +608,7 @@ optional = false python-versions = "*" [[package]] -name = "PyYAML" +name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" category = "main" @@ -615,7 +617,7 @@ python-versions = ">=3.6" [[package]] name = "readme-renderer" -version = "37.2" +version = "37.3" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -645,11 +647,11 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.10.0" +version = "0.10.1" description = "A utility belt for advanced users of python-requests" category = "dev" optional = false @@ -670,7 +672,7 @@ python-versions = ">=3.7" idna2008 = ["idna"] [[package]] -name = "SecretStorage" +name = "secretstorage" version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" @@ -731,11 +733,11 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.11.5" +version = "0.11.6" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6" [[package]] name = "tqdm" @@ -805,14 +807,14 @@ python-versions = "*" [[package]] name = "wheel" -version = "0.37.1" +version = "0.38.4" description = "A built-package format for Python" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [package.extras] -test = ["pytest (>=3.0.0)", "pytest-cov"] +test = ["pytest (>=3.0.0)"] [[package]] name = "wrapt" @@ -836,8 +838,8 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" -python-versions = "^3.8" -content-hash = "ada617af558e01b9a252bba0e1bff2fc128804dfaab6beb892b81b40bbf16edf" +python-versions = "^3.10" +content-hash = "8d7aae6b7881974103ebccc51787ddcf6a582fcbec4503295b45c1b11fa40d5b" [metadata.files] attrs = [ @@ -845,8 +847,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.79.0-py3-none-any.whl", hash = "sha256:bac4f80f635d910059fe15c080564cb2338dccdfd6178d267f8c93b6786de3ae"}, - {file = "beet-0.79.0.tar.gz", hash = "sha256:76fe3b0a5dadb97de51b1891f73f568b2a8fe74436834f41a8725d921ca18577"}, + {file = "beet-0.80.1-py3-none-any.whl", hash = "sha256:499ffc70888afd0a81a41ba432dcbd5a7c08c016b9476b0e587624476fd0e17f"}, + {file = "beet-0.80.1.tar.gz", hash = "sha256:4ccda72bef9ccfffc34dbefe8ec479852f1ed6e3da459feadaf71d0ddfefb530"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, @@ -962,36 +964,36 @@ click-log = [ {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, ] colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] cryptography = [ - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, - {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, - {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, - {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, + {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, + {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, + {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, ] docutils = [ {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, @@ -1001,11 +1003,15 @@ dotty-dict = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] +exceptiongroup = [ + {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, + {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, +] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, ] -GitPython = [ +gitpython = [ {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, ] @@ -1029,7 +1035,7 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -"jaraco.classes" = [ +jaraco-classes = [ {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, ] @@ -1037,23 +1043,23 @@ jeepney = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] -Jinja2 = [ +jinja2 = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-23.9.3-py3-none-any.whl", hash = "sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0"}, - {file = "keyring-23.9.3.tar.gz", hash = "sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5"}, + {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, + {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, ] lectern = [ - {file = "lectern-0.25.0-py3-none-any.whl", hash = "sha256:28db47c112ed3a82f57876411146974e138dd844e596add6a5c02e0fbf19e914"}, - {file = "lectern-0.25.0.tar.gz", hash = "sha256:80f7e48440a8fbaeda029cddc0c0abed7ebd4a7500ce85aba2815d252131be46"}, + {file = "lectern-0.26.0-py3-none-any.whl", hash = "sha256:e46eb1f1befd5892cad5bffc65fac1debe008e641ea6ea5c281e49b8a831cf0f"}, + {file = "lectern-0.26.0.tar.gz", hash = "sha256:0496bfaee29641e04e8c6ef0a6db0ce5b4b01e5064a0d6d1c8ce3a6e7a548066"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] -MarkupSafe = [ +markupsafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, @@ -1100,8 +1106,8 @@ mdurl = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] mecha = [ - {file = "mecha-0.57.4-py3-none-any.whl", hash = "sha256:e2a2ee20ec0dfe7aa34e009f67b918b6b0a80ca6bc96616e17ce17771f07deaf"}, - {file = "mecha-0.57.4.tar.gz", hash = "sha256:cf91fb829addd652804d9cd3b9bc38c6d1f5127c4546aed3f799d9f8ad9b8415"}, + {file = "mecha-0.60.3-py3-none-any.whl", hash = "sha256:ebd153ccb9f87591bdea6f14c3b23c7a49027e4b9b6632ed05b6b3b17b400766"}, + {file = "mecha-0.60.3.tar.gz", hash = "sha256:95c00787203219efd9349e4dc77153f10c6d8b058c0b452445334b0762a86bdd"}, ] more-itertools = [ {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, @@ -1116,59 +1122,55 @@ nbtlib = [ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, ] numpy = [ - {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, - {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, - {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, - {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, - {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, - {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, - {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, - {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, - {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, - {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, - {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, + {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, + {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, + {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, + {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, + {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, + {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, + {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, + {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, + {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, ] pkginfo = [ {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, ] platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] pycparser = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, @@ -1211,7 +1213,7 @@ pydantic = [ {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, ] -Pygments = [ +pygments = [ {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] @@ -1220,16 +1222,16 @@ pyparsing = [ {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, ] pytest-insta = [ - {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, - {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, + {file = "pytest_insta-0.2.0-py3-none-any.whl", hash = "sha256:e8d8a19f44917fa70102b132ddd4d6afcebe2a31987422dc79458ff849fe1a9e"}, + {file = "pytest_insta-0.2.0.tar.gz", hash = "sha256:c4e549f3c5aea8acf1ae6da12cffaaf4e4b3b03d9059c5115deab59f37b23867"}, ] python-gitlab = [ - {file = "python-gitlab-3.10.0.tar.gz", hash = "sha256:14930a16fdd7f36f67b9373e7d4d4720e8e374800028380289db3306e9f74614"}, - {file = "python_gitlab-3.10.0-py3-none-any.whl", hash = "sha256:6b5a24d0f479c43c1759cb174cf42116ed27cced31284bedc82d584d860fa238"}, + {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, + {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, ] python-semantic-release = [ {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, @@ -1239,7 +1241,7 @@ pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] -PyYAML = [ +pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1282,22 +1284,22 @@ PyYAML = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] readme-renderer = [ - {file = "readme_renderer-37.2-py3-none-any.whl", hash = "sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106"}, - {file = "readme_renderer-37.2.tar.gz", hash = "sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923"}, + {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, + {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, ] requests = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ - {file = "requests-toolbelt-0.10.0.tar.gz", hash = "sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30"}, - {file = "requests_toolbelt-0.10.0-py2.py3-none-any.whl", hash = "sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985"}, + {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, + {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, ] rfc3986 = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, ] -SecretStorage = [ +secretstorage = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] @@ -1326,8 +1328,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, - {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, ] tqdm = [ {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, @@ -1350,8 +1352,8 @@ webencodings = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] wheel = [ - {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, - {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, + {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, + {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, ] wrapt = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, diff --git a/packages/bolt/poetry.toml b/packages/bolt/poetry.toml deleted file mode 100644 index ab1033bd3..000000000 --- a/packages/bolt/poetry.toml +++ /dev/null @@ -1,2 +0,0 @@ -[virtualenvs] -in-project = true diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 587c0e762..8c77a7b69 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -22,17 +22,17 @@ keywords = [ include = ["bolt/py.typed"] [tool.poetry.dependencies] -python = "^3.8" -beet = ">=0.79.0" -mecha = ">=0.57.4" +python = "^3.10" +beet = ">=0.80.1" +mecha = ">=0.60.3" [tool.poetry.group.dev.dependencies] -pytest = "^7.1.3" +pytest = "^7.2.0" black = "^22.10.0" isort = "^5.10.1" -python-semantic-release = "^7.32.1" -pytest-insta = "^0.1.11" -lectern = ">=0.25.0" +python-semantic-release = "^7.32.2" +pytest-insta = "^0.2.0" +lectern = ">=0.26.0" [tool.pytest.ini_options] addopts = "tests --import-mode=importlib" @@ -41,7 +41,7 @@ addopts = "tests --import-mode=importlib" typeCheckingMode = "strict" [tool.black] -target-version = ["py38"] +target-version = ["py310"] [tool.isort] profile = "black" From 4531a34679d4cf1e37010fc7ff1c4f466a067828 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 00:12:56 +0100 Subject: [PATCH 1074/1554] chore: update pyright --- packages/bolt/bolt/module.py | 5 +++-- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index 63c46397c..9c47f5118 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -20,6 +20,7 @@ from typing import ( Any, Callable, + ClassVar, Dict, Iterator, List, @@ -75,8 +76,8 @@ class SilentCompilationInterrupt(DiagnosticCollection): class Module(TextFile): """Class representing a bolt module.""" - scope = ("modules",) - extension = ".bolt" + scope: ClassVar[Tuple[str, ...]] = ("modules",) + extension: ClassVar[str] = ".bolt" MacroLibrary = Dict[str, Dict[Tuple[str, AstMacro], Optional[Tuple[str, str]]]] diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 1298f6adb..646ee46aa 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.273" + "pyright": "^1.1.280" } }, "node_modules/pyright": { - "version": "1.1.273", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.273.tgz", - "integrity": "sha512-uhBqKtRnC1Rvgz7uKp13VEwIR/UuqUvlscOu/y6hQhDzpFrZi0Gft7TrSLIMdy7fRAf85dS1nduQmAIWXgl4AA==", + "version": "1.1.280", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", + "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.273", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.273.tgz", - "integrity": "sha512-uhBqKtRnC1Rvgz7uKp13VEwIR/UuqUvlscOu/y6hQhDzpFrZi0Gft7TrSLIMdy7fRAf85dS1nduQmAIWXgl4AA==", + "version": "1.1.280", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", + "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index f50b5c840..916138913 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.273" + "pyright": "^1.1.280" } } From 6fae6205b61fdb77c6be62be9d2b9fd616f51e35 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 00:30:28 +0100 Subject: [PATCH 1075/1554] chore: update deps --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 18 +++++++++--------- packages/mecha/pyproject.toml | 10 +++++----- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 987158df1..c2d30814b 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.278" + "pyright": "^1.1.280" } }, "node_modules/pyright": { - "version": "1.1.278", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.278.tgz", - "integrity": "sha512-at3j7c1fFzB6Jl4+bpr9QPRC/+1gH2gAR/M6GIRS312CHE2JMt8FZRflTbuxEB8IfQAtR+l3YoRMoS1vqF28jw==", + "version": "1.1.280", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", + "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.278", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.278.tgz", - "integrity": "sha512-at3j7c1fFzB6Jl4+bpr9QPRC/+1gH2gAR/M6GIRS312CHE2JMt8FZRflTbuxEB8IfQAtR+l3YoRMoS1vqF28jw==", + "version": "1.1.280", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", + "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index caf02a1cf..916138913 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.278" + "pyright": "^1.1.280" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 7c416817d..8c9d0de7f 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -14,7 +14,7 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.79.2" +version = "0.80.1" description = "The Minecraft pack development kit" category = "main" optional = false @@ -533,15 +533,15 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "pytest-insta" -version = "0.1.11" +version = "0.2.0" description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false python-versions = ">=3.8,<4.0" [package.dependencies] -pytest = ">=6.0.2" -wrapt = ">=1.12.1,<2.0.0" +pytest = ">=7.2.0,<8.0.0" +wrapt = ">=1.14.1,<2.0.0" [[package]] name = "python-gitlab" @@ -827,7 +827,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "fd184e196ffaca2fcfdac78e8fe5344ebbb5e2b70112ac91f97d1fa90f03780d" +content-hash = "172cf22c05b4d737d62fac033e210b406c39e63b75ebaeddd87d097433b0f515" [metadata.files] attrs = [ @@ -835,8 +835,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.79.2-py3-none-any.whl", hash = "sha256:f02e1d14cda88d5c25e84df483aba169a60687e63d1365ff5e0c65a9cfb656da"}, - {file = "beet-0.79.2.tar.gz", hash = "sha256:ed683d68411b27e639ffd762d5c6a06cd09a040f1e441d6f6f6337b94cec6442"}, + {file = "beet-0.80.1-py3-none-any.whl", hash = "sha256:499ffc70888afd0a81a41ba432dcbd5a7c08c016b9476b0e587624476fd0e17f"}, + {file = "beet-0.80.1.tar.gz", hash = "sha256:4ccda72bef9ccfffc34dbefe8ec479852f1ed6e3da459feadaf71d0ddfefb530"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, @@ -1210,8 +1210,8 @@ pytest = [ {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, ] pytest-insta = [ - {file = "pytest-insta-0.1.11.tar.gz", hash = "sha256:cc0f338a8ac215dbf3b690198dc24a1c5987e2bef269f85170d415039cce06e5"}, - {file = "pytest_insta-0.1.11-py3-none-any.whl", hash = "sha256:c31af45255a8da234a73eff7649e297a053ffa22ba21806457f0fae66fc85f8a"}, + {file = "pytest_insta-0.2.0-py3-none-any.whl", hash = "sha256:e8d8a19f44917fa70102b132ddd4d6afcebe2a31987422dc79458ff849fe1a9e"}, + {file = "pytest_insta-0.2.0.tar.gz", hash = "sha256:c4e549f3c5aea8acf1ae6da12cffaaf4e4b3b03d9059c5115deab59f37b23867"}, ] python-gitlab = [ {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index a99d56a42..ff8720dda 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,16 +23,16 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.79.0" +beet = ">=0.80.1" tokenstream = "^1.4.2" [tool.poetry.group.dev.dependencies] black = "^22.10.0" -pytest = "^7.1.3" +pytest = "^7.2.0" isort = "^5.10.1" -python-semantic-release = "^7.32.1" -pytest-insta = "^0.1.11" -lectern = ">=0.25.0" +python-semantic-release = "^7.32.2" +pytest-insta = "^0.2.0" +lectern = ">=0.26.0" [tool.poetry.scripts] mecha = "mecha.cli:main" From b5115a638032aed3ceac4c6e113133fbd847a81e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 01:55:45 +0100 Subject: [PATCH 1076/1554] feat: deprecate mecha.contrib.inline_function_tag --- packages/mecha/mecha/contrib/inline_function_tag.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/mecha/mecha/contrib/inline_function_tag.py b/packages/mecha/mecha/contrib/inline_function_tag.py index 31f669f1b..9e84f6b0d 100644 --- a/packages/mecha/mecha/contrib/inline_function_tag.py +++ b/packages/mecha/mecha/contrib/inline_function_tag.py @@ -6,6 +6,7 @@ ] +import logging from dataclasses import dataclass, replace from importlib.resources import read_text from typing import List @@ -27,8 +28,12 @@ rule, ) +logger = logging.getLogger(__name__) + def beet_default(ctx: Context): + logger.warning('Deprecated in favor of "mecha.contrib.nested_resources".') + mc = ctx.inject(Mecha) commands_json = read_text("mecha.resources", "inline_function_tag.json") From 1608a37dc6836024bf7d61c674002693ba8d789f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 02:16:19 +0100 Subject: [PATCH 1077/1554] feat: splice children --- packages/mecha/mecha/ast.py | 13 +++++++++++++ packages/mecha/mecha/dispatch.py | 7 ++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 88a80126b..fab50ad58 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -83,6 +83,7 @@ from typing import ( Any, ClassVar, + Iterable, Iterator, List, Literal, @@ -197,6 +198,18 @@ def emit_error(self, exc: T) -> T: class AstChildren(Tuple[AstNodeType, ...]): """Specialized tuple subclass for holding multiple child ast nodes.""" + def __new__( + cls, + children: Iterable[None | AstNodeType | "AstChildren[AstNodeType]"] = (), + ): + children = [ + c + for child in children + if child is not None + for c in (child if isinstance(child, AstChildren) else [child]) + ] + return super().__new__(cls, children) + def __repr__(self) -> str: return f"AstChildren({super().__repr__()})" diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index c50f64836..2b515112c 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -373,7 +373,7 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: attribute = getattr(node, f.name) if isinstance(attribute, AstChildren): result = AstChildren(self.invoke(child, *args, **kwargs) for child in attribute) # type: ignore - if any(child is not original for child, original in zip(result, attribute)): # type: ignore + if len(result) != len(attribute) or any(child is not original for child, original in zip(result, attribute)): # type: ignore to_replace[f.name] = result elif isinstance(attribute, AstNode): result = self.invoke(attribute, *args, **kwargs) @@ -383,7 +383,6 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: if to_replace: node = replace(node, **to_replace) - result = node exhausted = False while not exhausted: @@ -397,7 +396,9 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: exhausted = False node = result break - elif result is not None: + elif result is None or isinstance(result, AstChildren): + return result # type: ignore + else: msg = f"Invalid node of type {type(result)}." if name: msg += f" ({name})" From 19650f2dc5d6eeaa523d63791e85854adcd1264d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 23 Nov 2022 01:17:15 +0000 Subject: [PATCH 1078/1554] 0.61.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index c7d8cca6f..428de8b04 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.61.0 (2022-11-23) +### Feature +* Splice children ([`2e4c6a9`](https://github.com/mcbeet/mecha/commit/2e4c6a9d04112ed64dc566db03af09784ca90bac)) +* Deprecate mecha.contrib.inline_function_tag ([`c748479`](https://github.com/mcbeet/mecha/commit/c748479187958bb0b4f7b1307195d3d3f9ced82d)) + ## v0.60.3 (2022-11-22) ### Fix * Make SourceMapTransformer a MutatingReducer ([`c0f7109`](https://github.com/mcbeet/mecha/commit/c0f7109b2ef0bf74e21929b114146941e6d0b77c)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index e777d7003..aac110c4e 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.60.3" +__version__ = "0.61.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ff8720dda..0a8ff266d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.60.3" +version = "0.61.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 4337c85a1acef79b7c8300acf22483beec53cd32 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 03:23:06 +0100 Subject: [PATCH 1079/1554] chore: update mecha --- packages/bolt/poetry.lock | 10 +++++----- packages/bolt/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index ceb70fa1b..cbd29a7a6 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -379,14 +379,14 @@ python-versions = ">=3.7" [[package]] name = "mecha" -version = "0.60.3" +version = "0.61.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" [package.dependencies] -beet = ">=0.79.0" +beet = ">=0.80.1" tokenstream = ">=1.4.2,<2.0.0" [[package]] @@ -839,7 +839,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "8d7aae6b7881974103ebccc51787ddcf6a582fcbec4503295b45c1b11fa40d5b" +content-hash = "71a3bbddcf2ba075cb7c7f19c40e9a9b8ef9bd391785efdd32946ca8d1fbd306" [metadata.files] attrs = [ @@ -1106,8 +1106,8 @@ mdurl = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] mecha = [ - {file = "mecha-0.60.3-py3-none-any.whl", hash = "sha256:ebd153ccb9f87591bdea6f14c3b23c7a49027e4b9b6632ed05b6b3b17b400766"}, - {file = "mecha-0.60.3.tar.gz", hash = "sha256:95c00787203219efd9349e4dc77153f10c6d8b058c0b452445334b0762a86bdd"}, + {file = "mecha-0.61.0-py3-none-any.whl", hash = "sha256:305c00d16f2caf582d3779da8be1515ebf546ace3aa3b5f3707e7bc5834b0061"}, + {file = "mecha-0.61.0.tar.gz", hash = "sha256:479cfcfabecf98c6866db8054702cbb62b3655024e33398c20322a536e087cf1"}, ] more-itertools = [ {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 8c77a7b69..df469a6ef 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" beet = ">=0.80.1" -mecha = ">=0.60.3" +mecha = ">=0.61.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.0" From 0bb57663a04c595cef2fd614dcdf1b6ca5c61553 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 03:23:50 +0100 Subject: [PATCH 1080/1554] feat: disable mecha.contrib.inline_function_tag by default --- packages/bolt/bolt/runtime.py | 1 - packages/bolt/tests/snapshots/spec__prototypes__0.json | 2 -- 2 files changed, 3 deletions(-) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 94dbca9aa..43bccff62 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -47,7 +47,6 @@ def __init__(self, ctx: Union[Context, Mecha]): if isinstance(ctx, Context): ctx.require( "mecha.contrib.relative_location", - "mecha.contrib.inline_function_tag", "mecha.contrib.nesting", "mecha.contrib.nested_resources", "mecha.contrib.nested_yaml", diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index db560d4f1..aceab6839 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -525,7 +525,6 @@ "execute:forceload:remove:from:to", "execute:function:name", "execute:function:name:commands", - "execute:function:tag:name", "execute:function_tag:name:content", "execute:game_event_tag:name:content", "execute:gamemode:adventure", @@ -1167,7 +1166,6 @@ "from:module:import:subcommand", "function:name", "function:name:commands", - "function:tag:name", "function_tag:name:content", "game_event_tag:name:content", "gamemode:adventure", From 0caca93f060a267a67d5eb99bc0aba7439ab6c56 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 04:04:08 +0100 Subject: [PATCH 1081/1554] feat: add CommandCollector --- packages/bolt/bolt/__init__.py | 2 +- packages/bolt/bolt/collect.py | 80 ++++++++++++++++++++++++++++++++++ packages/bolt/bolt/helpers.py | 6 ++- packages/bolt/bolt/macro.py | 52 ---------------------- packages/bolt/bolt/parse.py | 12 ++--- packages/bolt/bolt/runtime.py | 28 +++--------- 6 files changed, 96 insertions(+), 84 deletions(-) create mode 100644 packages/bolt/bolt/collect.py delete mode 100644 packages/bolt/bolt/macro.py diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 3fdcac0ba..6d9803233 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -3,9 +3,9 @@ from .ast import * from .codegen import * +from .collect import * from .helpers import * from .loop_info import * -from .macro import * from .module import * from .parse import * from .plugin import * diff --git a/packages/bolt/bolt/collect.py b/packages/bolt/bolt/collect.py new file mode 100644 index 000000000..3d131b2e5 --- /dev/null +++ b/packages/bolt/bolt/collect.py @@ -0,0 +1,80 @@ +__all__ = [ + "CommandCollector", +] + + +from contextlib import contextmanager +from typing import Any, Callable, Generator, Iterator, List, Optional, ParamSpec + +from mecha import AstCommand, AstNode, AstRoot + +from .utils import internal + +P = ParamSpec("P") + + +class CommandCollector: + """Command collector.""" + + commands: List[AstCommand] + + def __init__(self): + self.commands = [] + + @contextmanager + def scope( + self, + commands: Optional[List[AstCommand]] = None, + ) -> Iterator[List[AstCommand]]: + """Create a new scope to gather commands.""" + if commands is None: + commands = [] + + previous_commands = self.commands + self.commands = commands + + try: + yield commands + finally: + self.commands = previous_commands + + @internal + def capture_output( + self, + f: Callable[P, Any], + *args: P.args, + **kwargs: P.kwargs, + ) -> List[AstCommand]: + """Invoke a user-defined function and return the list of generated commands.""" + with self.scope() as output: + result = f(*args, **kwargs) + + if isinstance(result, Generator): + try: + while True: + node: Any = next(result) # type: ignore + if isinstance(node, AstRoot): + self.commands.extend(node.commands) + elif isinstance(node, AstCommand): + self.commands.append(node) + elif node: + msg = f"Invalid command of type {type(node)!r}." + raise TypeError(msg) + except StopIteration as exc: + result = exc.value + + if not result: + result = [] + elif isinstance(result, AstNode): + result = [result] + + for node in result: + if isinstance(node, AstRoot): + output.extend(node.commands) + elif isinstance(node, AstCommand): + output.append(node) + elif node: + msg = f"Invalid command of type {type(node)!r}." + raise TypeError(msg) + + return output diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 34237971a..4f55cee35 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -46,7 +46,6 @@ ) from tokenstream import set_location -from .macro import invoke_macro from .utils import internal @@ -190,7 +189,10 @@ def python_import_module(name: str): @internal def macro_call(runtime: Any, function: Any, command: AstCommand): - return invoke_macro(runtime, function, command.identifier, command.arguments) + with runtime.modules.error_handler( + f'Macro "{command.identifier}" raised an exception.' + ): + return runtime.capture_output(function, *command.arguments) def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: diff --git a/packages/bolt/bolt/macro.py b/packages/bolt/bolt/macro.py deleted file mode 100644 index 96e664b9f..000000000 --- a/packages/bolt/bolt/macro.py +++ /dev/null @@ -1,52 +0,0 @@ -__all__ = [ - "invoke_macro", -] - - -from typing import Any, Generator, Iterable - -from mecha import AstCommand, AstNode, AstRoot - -from .utils import internal - - -@internal -def invoke_macro( - runtime: Any, - function: Any, - identifier: str, - arguments: Iterable[Any], -): - """Invoke a user-defined macro and return the list of generated commands.""" - with runtime.scope() as output: - result = function(*arguments) - - if isinstance(result, Generator): - try: - while True: - node: Any = next(result) # type: ignore - if isinstance(node, AstRoot): - runtime.commands.extend(node.commands) - elif isinstance(node, AstCommand): - runtime.commands.append(node) - elif node: - msg = f'Emit invalid command of type {type(node)!r} from macro "{identifier}".' - raise TypeError(msg) - except StopIteration as exc: - result = exc.value - - if not result: - result = [] - elif isinstance(result, AstNode): - result = [result] - - for node in result: - if isinstance(node, AstRoot): - output.extend(node.commands) - elif isinstance(node, AstCommand): - output.append(node) - elif node: - msg = f'Return invalid command of type {type(node)!r} from macro "{identifier}".' - raise TypeError(msg) - - return output diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index e0de3c74b..aa0afac66 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -149,7 +149,7 @@ AstUnpack, AstValue, ) -from .macro import invoke_macro +from .collect import CommandCollector from .module import Module, ModuleManager, UnusableCompilationUnit from .pattern import ( FALSE_PATTERN, @@ -1439,17 +1439,17 @@ class ProcMacroParser: @internal def __call__(self, stream: TokenStream) -> AstProcMacroResult: properties = get_stream_properties(stream) - resource_location = properties["resource_location"] - identifier = properties["identifier"] + resource_location: str = properties["resource_location"] + identifier: str = properties["identifier"] module = self.modules[resource_location] - runtime = module.namespace["_bolt_runtime"] + runtime: CommandCollector = module.namespace["_bolt_runtime"] macro = module.namespace["_bolt_proc_macros"][identifier] with self.modules.error_handler( - "Proc macro raised an exception.", resource_location + f'Proc macro "{identifier}" raised an exception.', resource_location ): - result = invoke_macro(runtime, macro, identifier, [stream]) + result = runtime.capture_output(macro, stream) return AstProcMacroResult(commands=AstChildren(result)) diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 43bccff62..5b7e322cf 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -6,20 +6,20 @@ import builtins -from contextlib import contextmanager from dataclasses import dataclass, field from functools import partial from importlib.resources import read_text -from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Union +from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Union from beet import Context, TextFileBase, generate_tree from beet.core.utils import JsonDict, extra_field, required_field -from mecha import AstCommand, AstRoot, CommandTree, Diagnostic, Mecha, Visitor, rule +from mecha import AstRoot, CommandTree, Diagnostic, Mecha, Visitor, rule from pathspec import PathSpec from tokenstream import set_location from .ast import AstModuleRoot from .codegen import Codegen +from .collect import CommandCollector from .helpers import get_bolt_helpers from .loop_info import loop_info from .module import CompiledModule, Module, ModuleCacheBackend, ModuleManager @@ -27,10 +27,9 @@ from .utils import internal -class Runtime: +class Runtime(CommandCollector): """The bolt runtime.""" - commands: List[AstCommand] helpers: Dict[str, Any] globals: JsonDict builtins: Set[str] @@ -39,7 +38,7 @@ class Runtime: evaluate: "Evaluator" def __init__(self, ctx: Union[Context, Mecha]): - self.commands = [] + super().__init__() self.helpers = get_bolt_helpers() self.globals = {"_bolt_runtime": self, "ctx": None, "loop_info": loop_info} self.builtins = {name for name in dir(builtins) if not name.startswith("_")} @@ -112,23 +111,6 @@ def expose(self, name: str, function: Callable[..., Any]): """Expose a utility function.""" self.globals[name] = lambda *args, **kwargs: function(*args, **kwargs) # type: ignore - @contextmanager - def scope( - self, - commands: Optional[List[AstCommand]] = None, - ) -> Iterator[List[AstCommand]]: - """Create a new scope to gather commands.""" - if commands is None: - commands = [] - - previous_commands = self.commands - self.commands = commands - - try: - yield commands - finally: - self.commands = previous_commands - @internal def import_module(self, resource_location: str) -> CompiledModule: """Import module.""" From 20fddaf5c5e7248a55b7b10ba04014686692bbb6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 23 Nov 2022 04:43:32 +0100 Subject: [PATCH 1082/1554] feat: add bolt.contrib.defer --- packages/bolt/bolt/contrib/defer.py | 102 ++++++++++++++++++ packages/bolt/examples/bolt_defer/beet.yml | 6 ++ .../src/data/demo/functions/foo.mcfunction | 31 ++++++ .../examples__build_bolt_defer__0.pack.md | 34 ++++++ 4 files changed, 173 insertions(+) create mode 100644 packages/bolt/bolt/contrib/defer.py create mode 100644 packages/bolt/examples/bolt_defer/beet.yml create mode 100644 packages/bolt/examples/bolt_defer/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md diff --git a/packages/bolt/bolt/contrib/defer.py b/packages/bolt/bolt/contrib/defer.py new file mode 100644 index 000000000..e14f553e3 --- /dev/null +++ b/packages/bolt/bolt/contrib/defer.py @@ -0,0 +1,102 @@ +"""Run deferred callbacks.""" + + +__all__ = [ + "Defer", + "DeferHandler", + "AstDefer", + "AstDeferCommand", + "defer", +] + + +from dataclasses import dataclass +from typing import Any, Callable, Generator, List, TypeVar + +from beet import Context +from beet.core.utils import required_field +from mecha import ( + AstChildren, + AstCommandSentinel, + AstNode, + AstRoot, + Dispatcher, + Mecha, + MutatingReducer, + rule, +) + +from bolt import Runtime + +CallbackType = TypeVar("CallbackType", bound=Callable[[], Any]) + + +def beet_default(ctx: Context): + ctx.require(defer) + + +def defer(ctx: Context): + """Plugin that makes the defer utility available globally.""" + runtime = ctx.inject(Runtime) + defer = ctx.inject(Defer) + runtime.expose("defer", defer) + + +@dataclass(frozen=True) +class AstDefer(AstNode): + """Ast defer node.""" + + callback: Callable[[], Any] = required_field() + + +@dataclass(frozen=True) +class AstDeferCommand(AstCommandSentinel): + """Ast defer command node. + + Same as AstDefer but allows the node to pass as a regular AstCommand. + """ + + callback: Callable[[], Any] = required_field() + + +@dataclass +class DeferHandler(MutatingReducer): + runtime: Runtime = required_field() + + @rule(AstDefer) + @rule(AstDeferCommand) + def defer(self, node: AstDefer | AstDeferCommand) -> Generator[AstNode, Any, Any]: + with self.runtime.modules.error_handler( + "Deferred callback raised an exception." + ): + result = node.callback() + + if isinstance(result, AstNode): + result = yield result + elif isinstance(result, AstChildren): + children: List[Any] = [] + for child in result: # type: ignore + deferred_child = yield child + children.append(deferred_child) + result = AstChildren(children) + + return result + + +class Defer: + runtime: Runtime + handler: Dispatcher[AstRoot] + + def __init__(self, ctx: Context): + self.runtime = ctx.inject(Runtime) + self.handler = DeferHandler(runtime=self.runtime) + mc = ctx.inject(Mecha) + mc.steps.insert(mc.steps.index(self.runtime.evaluate) + 1, self.handler) + + def __call__(self, callback: CallbackType) -> CallbackType: + self.runtime.commands.append( + AstDeferCommand( + callback=lambda: AstChildren(self.runtime.capture_output(callback)) + ) + ) + return callback diff --git a/packages/bolt/examples/bolt_defer/beet.yml b/packages/bolt/examples/bolt_defer/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_defer/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_defer/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_defer/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..a4c374f1b --- /dev/null +++ b/packages/bolt/examples/bolt_defer/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,31 @@ +from mecha import AstString +from bolt.contrib.defer import Defer, AstDefer + +defer = ctx.inject(Defer) + +counter = 0 +def foo(): + global counter + say counter + counter += 1 + +say start +foo() +foo() +defer(foo) +defer(foo) +say end + +counter = 7 + +@defer +def bar(): + function ./bar: + defer(foo) + global counter + counter *= 2 + +def format_deferred_tag(): + return AstString(value=f"thing{counter}") + +tag @p add AstDefer(callback=format_deferred_tag) diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md new file mode 100644 index 000000000..9f8447ac5 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md @@ -0,0 +1,34 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say start +say 0 +say 1 +say 7 +say 8 +say end +tag @p add thing19 +``` + +`@function demo:bar` + +```mcfunction +say 18 +``` From 24bfea484c95a24f28103906954dc183c02a3d5d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 23 Nov 2022 03:44:32 +0000 Subject: [PATCH 1083/1554] 0.21.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 6 ++++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 4198e73e7..3c2a7b16a 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,12 @@ +## v0.21.0 (2022-11-23) +### Feature +* Add bolt.contrib.defer ([`6a0527f`](https://github.com/mcbeet/bolt/commit/6a0527f4696081a168a5adbfbb6a5f74d4853c4b)) +* Add CommandCollector ([`a07cedd`](https://github.com/mcbeet/bolt/commit/a07cedd2e4636b50494ff7cdd914050d194fe922)) +* Disable mecha.contrib.inline_function_tag by default ([`a9bf8bf`](https://github.com/mcbeet/bolt/commit/a9bf8bfe3d7bb39d767c204e4f06a80cc4133d78)) + ## v0.20.1 (2022-10-26) ### Fix * Reset token generator after discarding builtin identifier in interpolation ([`37f74bc`](https://github.com/mcbeet/bolt/commit/37f74bc8f9fbf60b0493bf8e158be678ced5f272)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 6d9803233..74faa798e 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.20.1" +__version__ = "0.21.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index df469a6ef..dca69f340 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.20.1" +version = "0.21.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 70d481ced1bc5ec1a7852cfe558efca9433b9c61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:05:37 +0000 Subject: [PATCH 1084/1554] chore(deps): bump beet from 0.80.1 to 0.81.1 Bumps [beet](https://github.com/mcbeet/beet) from 0.80.1 to 0.81.1. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.80.1...v0.81.1) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/mecha/poetry.lock | 42 ++++++-------------------------------- 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 8c9d0de7f..bbd7a1235 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -14,11 +14,11 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.80.1" +version = "0.81.1" description = "The Minecraft pack development kit" category = "main" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.10,<4.0" [package.dependencies] click = ">=8.1.3,<9.0.0" @@ -26,7 +26,7 @@ click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.10.1,<0.11.0" +pathspec = ">=0.10.2,<0.11.0" pydantic = ">=1.10.2,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" @@ -47,7 +47,6 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -180,17 +179,6 @@ category = "dev" optional = false python-versions = ">=3.5,<4.0" -[[package]] -name = "exceptiongroup" -version = "1.0.2" -description = "Backport of PEP 654 (exception groups)" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "gitdb" version = "4.0.9" @@ -522,11 +510,9 @@ python-versions = ">=3.7" [package.dependencies] attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] @@ -711,14 +697,6 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "tomlkit" version = "0.11.6" @@ -826,7 +804,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" -python-versions = "^3.10" +python-versions = "~3.11" content-hash = "172cf22c05b4d737d62fac033e210b406c39e63b75ebaeddd87d097433b0f515" [metadata.files] @@ -835,8 +813,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.80.1-py3-none-any.whl", hash = "sha256:499ffc70888afd0a81a41ba432dcbd5a7c08c016b9476b0e587624476fd0e17f"}, - {file = "beet-0.80.1.tar.gz", hash = "sha256:4ccda72bef9ccfffc34dbefe8ec479852f1ed6e3da459feadaf71d0ddfefb530"}, + {file = "beet-0.81.1-py3-none-any.whl", hash = "sha256:fcf8e49576f2b480dc581e87b692c455f9760cedd5643b49aed09ba5afd750a3"}, + {file = "beet-0.81.1.tar.gz", hash = "sha256:069045348eee86c7190abecbc7ff3b7570408dc8c0338f82cb6fd5e06f8dd262"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, @@ -991,10 +969,6 @@ dotty-dict = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] -exceptiongroup = [ - {file = "exceptiongroup-1.0.2-py3-none-any.whl", hash = "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27"}, - {file = "exceptiongroup-1.0.2.tar.gz", hash = "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695"}, -] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, @@ -1307,10 +1281,6 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] tomlkit = [ {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, From 22c8772182e2659ee91ec21c60a32a5dddda0b2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:03:12 +0000 Subject: [PATCH 1085/1554] chore(deps-dev): bump pyright from 1.1.280 to 1.1.282 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.280 to 1.1.282. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.282/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/mecha/package-lock.json | 14 +++++++------- packages/mecha/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index c2d30814b..63c6ff58c 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.280" + "pyright": "^1.1.282" } }, "node_modules/pyright": { - "version": "1.1.280", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", - "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", + "version": "1.1.282", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.282.tgz", + "integrity": "sha512-qwlGhY/4wkZJJlxiwGzKL7Do6rVSOcXp72zplxJ76BbVIWuiKpGUeYIhLdONEAD22UwLTp8XvmARQzDnJ3EMSQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.280", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", - "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", + "version": "1.1.282", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.282.tgz", + "integrity": "sha512-qwlGhY/4wkZJJlxiwGzKL7Do6rVSOcXp72zplxJ76BbVIWuiKpGUeYIhLdONEAD22UwLTp8XvmARQzDnJ3EMSQ==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 916138913..255bd87e1 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.280" + "pyright": "^1.1.282" } } From 432a5776d1a3f1582aee5500ffc090cf7a332c76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 04:07:23 +0000 Subject: [PATCH 1086/1554] build(deps-dev): bump pyright from 1.1.280 to 1.1.281 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.280 to 1.1.281. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.281/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 646ee46aa..371428816 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.280" + "pyright": "^1.1.281" } }, "node_modules/pyright": { - "version": "1.1.280", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", - "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", + "version": "1.1.281", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.281.tgz", + "integrity": "sha512-mSqu+LpQzk36fx8x68XrCnosrU4EJ/MAHR6yG08NDBOSROnepvkv8ffbBKL02JTgQkTI3oDia7KTSCeX1MfRBQ==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.280", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.280.tgz", - "integrity": "sha512-WbwhA8nqYkaNlRiCzfVvuhiAJZ0GkONGGz/FA8mhLKixivqI11HZKZA/sIHdK5Ez1qWg3zQ2V8L9jvUTHUtc8Q==", + "version": "1.1.281", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.281.tgz", + "integrity": "sha512-mSqu+LpQzk36fx8x68XrCnosrU4EJ/MAHR6yG08NDBOSROnepvkv8ffbBKL02JTgQkTI3oDia7KTSCeX1MfRBQ==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 916138913..988e87d56 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.280" + "pyright": "^1.1.281" } } From dd095bb568f3cd796b9341a5ff778fde88fcd251 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 1 Dec 2022 01:09:52 +0100 Subject: [PATCH 1087/1554] feat: add ast node compile_hints and make it so that AstSourceMap can't end up inlined into execute --- .../src/data/demo/functions/foo.mcfunction | 7 +++++++ packages/mecha/mecha/ast.py | 3 ++- packages/mecha/mecha/contrib/nesting.py | 14 ++++++++++++-- packages/mecha/mecha/contrib/source_map.py | 2 ++ .../examples__build_basic_source_map__0.pack.md | 10 ++++++++++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction index 352e53501..d7e08ff6c 100644 --- a/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_source_map/src/data/demo/functions/foo.mcfunction @@ -2,3 +2,10 @@ say abc function demo:bar: say def + +execute as @p: + say something + +execute as @p: + say foo + say bar diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index fab50ad58..19db39c7b 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -99,7 +99,7 @@ ) from uuid import UUID -from beet.core.utils import extra_field, required_field +from beet.core.utils import JsonDict, extra_field, required_field from nbtlib import Byte, ByteArray, Compound, CompoundMatch, Double, Int, IntArray from nbtlib import List as ListTag from nbtlib import ListIndex, LongArray, NamedKey, Numeric, Path, String @@ -140,6 +140,7 @@ class AstNode: end_location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) parser: ClassVar[Optional[str]] = None + compile_hints: ClassVar[JsonDict] = {} def __iter__(self) -> Iterator["AstNode"]: for f in fields(self): diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 2c5401c3f..b777815f5 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -152,8 +152,18 @@ def nesting_execute_function(self, node: AstCommand): def nesting_execute_commands(self, node: AstCommand): root = cast(AstRoot, node.arguments[0]) - if len(root.commands) == 1: - subcommand = root.commands[0] + single_command = None + for command in root.commands: + if command.compile_hints.get("skip_execute_inline_single_command"): + continue + if single_command is None: + single_command = command + else: + single_command = None + break + + if single_command: + subcommand = single_command if subcommand.identifier == "execute:subcommand": return subcommand.arguments[0] diff --git a/packages/mecha/mecha/contrib/source_map.py b/packages/mecha/mecha/contrib/source_map.py index 5b6c3a8aa..5a6a3892c 100644 --- a/packages/mecha/mecha/contrib/source_map.py +++ b/packages/mecha/mecha/contrib/source_map.py @@ -59,6 +59,8 @@ class AstSourceMap(AstCommandSentinel): header: str = required_field() + compile_hints = {"skip_execute_inline_single_command": True} + @dataclass class SourceMapTransformer(MutatingReducer): diff --git a/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md index cebd8d334..e8d7b55ff 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md @@ -20,6 +20,8 @@ ```mcfunction # [source_map] src/data/demo/functions/foo.mcfunction say abc +execute as @p run say something +execute as @p run function demo:foo/nested_execute_0 ``` `@function demo:thing` @@ -29,6 +31,14 @@ say abc say 456 ``` +`@function demo:foo/nested_execute_0` + +```mcfunction +# [source_map] src/data/demo/functions/foo.mcfunction +say foo +say bar +``` + `@function demo:bar` ```mcfunction From 5eada19f202e7870d38539d0e817d0e05162aed5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 1 Dec 2022 01:19:31 +0100 Subject: [PATCH 1088/1554] fix: propagate original for nested function --- packages/mecha/mecha/contrib/nesting.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index b777815f5..54145f18c 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -114,7 +114,7 @@ class NestedCommandsTransformer(MutatingReducer): def emit_function(self, path: str, root: AstRoot): """Helper method for emitting nested commands into a separate function.""" - function = Function() + function = Function(original=self.database.current.original) self.generate(path, function) self.database[function] = replace( self.database[self.database.current], From 1668441519cae2f48866e0801849e0830a2f918a Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 Dec 2022 00:20:24 +0000 Subject: [PATCH 1089/1554] 0.62.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 7 +++++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 428de8b04..aecb39467 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,13 @@ +## v0.62.0 (2022-12-01) +### Feature +* Add ast node compile_hints and make it so that AstSourceMap can't end up inlined into execute ([`a6537ff`](https://github.com/mcbeet/mecha/commit/a6537ffb50df3ef7550095a8b9366d7fc47e5d52)) + +### Fix +* Propagate original for nested function ([`235efbd`](https://github.com/mcbeet/mecha/commit/235efbd5ebeb7a45d217ba9b46685a3086600058)) + ## v0.61.0 (2022-11-23) ### Feature * Splice children ([`2e4c6a9`](https://github.com/mcbeet/mecha/commit/2e4c6a9d04112ed64dc566db03af09784ca90bac)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index aac110c4e..dc1c06a69 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.61.0" +__version__ = "0.62.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 0a8ff266d..86e13754f 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.61.0" +version = "0.62.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 3fd482aadece957665be6cecec46f40ba7b63f38 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 3 Dec 2022 16:57:49 +0100 Subject: [PATCH 1090/1554] fix: default empty arguments for AstFunctionSignature --- packages/bolt/bolt/ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index beba9843b..6aac7dea6 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -300,7 +300,7 @@ class AstFunctionSignature(AstNode): decorators: AstChildren[AstDecorator] = AstChildren() name: str = required_field() - arguments: AstChildren[AstFunctionSignatureElement] = required_field() + arguments: AstChildren[AstFunctionSignatureElement] = AstChildren() @dataclass(frozen=True) From 1a2626db4d37a9fb3c4d3cf51e43da50a030b362 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 3 Dec 2022 17:01:18 +0100 Subject: [PATCH 1091/1554] chore: ignore shadowed imports --- packages/bolt/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index dca69f340..2507c73ad 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -39,6 +39,7 @@ addopts = "tests --import-mode=importlib" [tool.pyright] typeCheckingMode = "strict" +reportShadowedImports = false [tool.black] target-version = ["py310"] From 0de8ea420a3aa718b34a4602e057f0fff2b91926 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 3 Dec 2022 19:17:19 +0000 Subject: [PATCH 1092/1554] 0.21.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 3c2a7b16a..c40099677 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.21.1 (2022-12-03) +### Fix +* Default empty arguments for AstFunctionSignature ([`6c79443`](https://github.com/mcbeet/bolt/commit/6c794431fe5b4c826dea8cae54a63d8c54838ad9)) + ## v0.21.0 (2022-11-23) ### Feature * Add bolt.contrib.defer ([`6a0527f`](https://github.com/mcbeet/bolt/commit/6a0527f4696081a168a5adbfbb6a5f74d4853c4b)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 74faa798e..74ce94799 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.21.0" +__version__ = "0.21.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 2507c73ad..c86c00011 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.21.0" +version = "0.21.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 1e8fd65821064dbc6a66249114d80f6c0bdf1d35 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 4 Dec 2022 02:30:31 +0100 Subject: [PATCH 1093/1554] feat: refactor identifier tracing with proper lexical scope abstraction --- packages/bolt/bolt/__init__.py | 1 + packages/bolt/bolt/parse.py | 631 +++++++----------- packages/bolt/bolt/semantics.py | 366 ++++++++++ packages/bolt/bolt/utils.py | 4 +- .../tests/snapshots/bolt__parse_125__0.txt | 2 +- .../tests/snapshots/bolt__parse_188__0.txt | 2 +- .../tests/snapshots/bolt__parse_190__0.txt | 2 +- .../tests/snapshots/bolt__parse_191__0.txt | 2 +- .../tests/snapshots/bolt__parse_195__0.txt | 2 +- .../tests/snapshots/bolt__parse_200__0.txt | 2 +- .../tests/snapshots/bolt__parse_58__0.txt | 2 +- packages/bolt/tests/test_semantics.py | 133 ++++ 12 files changed, 768 insertions(+), 381 deletions(-) create mode 100644 packages/bolt/bolt/semantics.py create mode 100644 packages/bolt/tests/test_semantics.py diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 74ce94799..046a18ca2 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -10,3 +10,4 @@ from .parse import * from .plugin import * from .runtime import * +from .semantics import * diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index aa0afac66..f014d1101 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1,29 +1,23 @@ __all__ = [ "get_bolt_parsers", - "get_stream_builtins", - "get_stream_identifiers", - "get_stream_pending_identifiers", - "get_stream_identifiers_storage", - "get_stream_pending_identifiers_storage", - "get_stream_deferred_locals", - "get_stream_branch_scope", + "get_stream_lexical_scope", "get_stream_macro_scope", "get_stream_pending_macros", "ToplevelHandler", "create_bolt_root_parser", + "create_bolt_command_parser", "UndefinedIdentifier", "UndefinedIdentifierErrorHandler", "BranchScopeManager", - "check_final_expression", "FinalExpressionParser", "InterpolationParser", "DisableInterpolationParser", - "parse_statement", + "ForkLexicalScopeParser", + "AssignmentStatementParser", "parse_decorator", "AssignmentTargetParser", "IfElseLoweringParser", "BreakContinueConstraint", - "FlushPendingIdentifiersParser", "parse_deferred_root", "parse_function_signature", "parse_proc_macro_signature", @@ -34,7 +28,6 @@ "parse_class_name", "parse_class_bases", "parse_class_root", - "ClassBodyScoping", "parse_del_target", "parse_identifier", "TrailingCommaParser", @@ -46,7 +39,7 @@ "GlobalNonlocalHandler", "StatementSubcommandHandler", "DeferredRootBacktracker", - "FunctionConstraint", + "LexicalScopeConstraint", "RootScopeHandler", "BinaryParser", "UnaryParser", @@ -63,7 +56,7 @@ import re from dataclasses import dataclass, field, replace -from typing import Any, Dict, FrozenSet, Iterable, List, Optional, Set, Tuple, cast +from typing import Any, Dict, FrozenSet, List, Literal, Optional, Set, Tuple, Type, cast from beet.core.utils import extra_field from mecha import ( @@ -161,7 +154,17 @@ STRING_PATTERN, TRUE_PATTERN, ) -from .utils import internal, suggest_typo +from .semantics import ( + ClassScope, + FunctionScope, + GlobalScope, + LexicalScope, + MacroScope, + ProcMacroScope, + UnboundLocalIdentifier, + UndefinedIdentifier, +) +from .utils import internal IMPORT_REGEX = re.compile(rf"^{MODULE_PATTERN}$") @@ -189,11 +192,7 @@ def get_bolt_parsers( macro_handler=macro_handler, ), "nested_root": create_bolt_root_parser(parsers["nested_root"], macro_handler), - "command": StatementSubcommandHandler( - UndefinedIdentifierErrorHandler( - ImportStatementHandler(GlobalNonlocalHandler(macro_handler), modules) - ) - ), + "command": create_bolt_command_parser(macro_handler, modules), "command:argument:bolt:if_block": delegate("bolt:if_block"), "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), "command:argument:bolt:elif_block": delegate("bolt:elif_block"), @@ -222,28 +221,52 @@ def get_bolt_parsers( ################################################################################ "bolt:if_block": BranchScopeManager( parser=delegate("nested_root"), - update_before=True, - ), - "bolt:elif_condition": BranchScopeManager( - parser=delegate("bolt:expression"), - mask=True, - update_after=True, + init=True, + fork=True, ), + "bolt:elif_condition": BranchScopeManager(delegate("bolt:expression")), "bolt:elif_block": BranchScopeManager( parser=delegate("nested_root"), - mask=True, + fork=True, ), "bolt:else_block": BranchScopeManager( parser=delegate("nested_root"), - mask=True, + fork=True, + ), + "bolt:statement": AlternativeParser( + [ + ForkLexicalScopeParser( + FlushPendingBindingsParser( + FinalExpressionParser( + AssignmentStatementParser( + delegate("bolt:augmented_assignment_target") + ) + ), + after=True, + ) + ), + ForkLexicalScopeParser( + FlushPendingBindingsParser( + FinalExpressionParser( + AssignmentStatementParser( + delegate("bolt:assignment_target"), + binding_only=True, + ) + ), + after=True, + ) + ), + FinalExpressionParser( + AssignmentStatementParser(delegate("bolt:expression")) + ), + FinalExpressionParser(delegate("bolt:decorator")), + ] ), - "bolt:statement": parse_statement, "bolt:decorator": parse_decorator, - "bolt:assignment_target": AssignmentTargetParser( - allow_undefined_identifiers=True, - allow_multiple=True, + "bolt:assignment_target": AssignmentTargetParser(), + "bolt:augmented_assignment_target": AssignmentTargetParser( + require_local_binding=True, require_single=True ), - "bolt:augmented_assignment_target": AssignmentTargetParser(), "bolt:deferred_root": parse_deferred_root, "bolt:function_signature": parse_function_signature, "bolt_macro_literal": delegate("bolt:macro_literal"), @@ -265,15 +288,16 @@ def get_bolt_parsers( "bolt:proc_macro": ProcMacroParser(modules), "bolt:class_name": parse_class_name, "bolt:class_bases": parse_class_bases, - "bolt:class_root": parse_class_root, + "bolt:class_root": FlushPendingBindingsParser(parse_class_root, after=True), "bolt:del_target": parse_del_target, "bolt:interpolation": BuiltinCallRestriction( - PrimaryParser(delegate("bolt:identifier"), truncate=True) + PrimaryParser(delegate("bolt:identifier"), truncate=True), + builtins=modules.builtins, ), "bolt:identifier": parse_identifier, "bolt:with_expression": TrailingCommaParser(delegate("bolt:expression")), "bolt:with_target": TrailingCommaParser( - AssignmentTargetParser(allow_undefined_identifiers=True) + AssignmentTargetParser(require_single=True) ), "bolt:import": AlternativeParser( [ @@ -489,39 +513,9 @@ def get_bolt_parsers( } -def get_stream_builtins(stream: TokenStream) -> Set[str]: - """Return the set of builtin identifiers currently associated with the token stream.""" - return stream.data.setdefault("builtins", set()) - - -def get_stream_identifiers(stream: TokenStream) -> Set[str]: - """Return the set of accessible identifiers currently associated with the token stream.""" - return stream.data.setdefault("identifiers", set()) - - -def get_stream_pending_identifiers(stream: TokenStream) -> Set[str]: - """Return the set of pending identifiers currently associated with the token stream.""" - return stream.data.setdefault("pending_identifiers", set()) - - -def get_stream_identifiers_storage(stream: TokenStream) -> Dict[str, str]: - """Return a dict that associates storage type to identifiers.""" - return stream.data.setdefault("identifiers_storage", {}) - - -def get_stream_pending_identifiers_storage(stream: TokenStream) -> Dict[str, str]: - """Return a dict that associates pending storage type to identifiers.""" - return stream.data.setdefault("pending_identifiers_storage", {}) - - -def get_stream_deferred_locals(stream: TokenStream) -> Set[str]: - """Return a set of identifiers that will be available in the next deferred root.""" - return stream.data.setdefault("deferred_locals", set()) - - -def get_stream_branch_scope(stream: TokenStream) -> Set[str]: - """Return the identifiers available inside the branch.""" - return stream.data.setdefault("branch_scope", set()) +def get_stream_lexical_scope(stream: TokenStream) -> LexicalScope: + """Return the lexical scope currently associated with the token stream.""" + return stream.data.setdefault("lexical_scope", LexicalScope()) def get_stream_macro_scope(stream: TokenStream) -> Dict[str, AstMacro]: @@ -534,11 +528,6 @@ def get_stream_pending_macros(stream: TokenStream) -> List[AstMacro]: return stream.data.setdefault("pending_macros", []) -def get_stream_class_scope(stream: TokenStream) -> Optional[Set[str]]: - """Return the set of outer identifiers available inside the class.""" - return stream.data.get("class_scope") - - @dataclass class ToplevelHandler: """Handle toplevel root node.""" @@ -550,13 +539,17 @@ class ToplevelHandler: def __call__(self, stream: TokenStream) -> Any: current = self.modules.database.current + resource_location = self.modules.database[current].resource_location - with self.modules.parse_push(current), stream.provide( - resource_location=self.modules.database[current].resource_location, - builtins=self.modules.builtins, + global_scope = GlobalScope( identifiers=set(self.modules.globals) | self.modules.builtins | {"__name__"}, + ) + + with self.modules.parse_push(current), stream.provide( + resource_location=resource_location, + lexical_scope=global_scope.push(LexicalScope), ): node = self.parser(stream) @@ -569,7 +562,8 @@ def __call__(self, stream: TokenStream) -> Any: def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): - """Return parser for the root node for bolt.""" + """Compose root parsers.""" + parser = FlushPendingBindingsParser(parser, before=True) parser = IfElseLoweringParser(parser) parser = BreakContinueConstraint( parser, @@ -578,8 +572,9 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): ("for", "target", "in", "iterable", "body"), }, ) - parser = FunctionConstraint( + parser = LexicalScopeConstraint( parser, + type=FunctionScope, command_identifiers={ "return", "return:value", @@ -590,8 +585,6 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): "nonlocal:subcommand", }, ) - parser = FlushPendingIdentifiersParser(parser) - parser = ClassBodyScoping(parser) parser = DeferredRootBacktracker(parser, macro_handler=macro_handler) parser = DecoratorResolver(parser) parser = ProcMacroExpansion(parser) @@ -599,22 +592,13 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): return parser -class UndefinedIdentifier(InvalidSyntax): - """Raised when an identifier is not defined.""" - - identifier: str - possible_identifiers: Iterable[str] - - def __init__(self, identifier: str, identifiers: Iterable[str]): - super().__init__(identifier, identifiers) - self.identifier = identifier - self.identifiers = identifiers - - def __str__(self) -> str: - msg = f'Identifier "{self.identifier}" is not defined.' - if suggestion := suggest_typo(self.identifier, self.identifiers): - msg += f" Did you mean {suggestion}?" - return msg +def create_bolt_command_parser(parser: Parser, modules: ModuleManager): + """Compose command parsers.""" + parser = GlobalNonlocalHandler(parser) + parser = ImportStatementHandler(parser, modules) + parser = UndefinedIdentifierErrorHandler(parser) + parser = StatementSubcommandHandler(parser) + return parser @dataclass @@ -629,7 +613,9 @@ def __call__(self, stream: TokenStream) -> Any: except UndefinedIdentifier: raise except InvalidSyntax as exc: - for alt in exc.alternatives.get(UndefinedIdentifier, []): + alts = list(exc.alternatives.get(UnboundLocalIdentifier, [])) + alts += exc.alternatives.get(UndefinedIdentifier, []) + for alt in alts: if alt.end_location.pos + 1 >= exc.location.pos: # kind of a cheat alt.notes.append(str(exc)) raise alt from None @@ -641,55 +627,26 @@ class BranchScopeManager: """Parser that manages accessible identifiers for conditional branches.""" parser: Parser - mask: bool = False - update_before: bool = False - update_after: bool = False + init: bool = False + fork: bool = False def __call__(self, stream: TokenStream) -> Any: - identifiers = get_stream_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - branch_scope = get_stream_branch_scope(stream) - - mask = branch_scope and identifiers - branch_scope - mask_storage = { - identifier: identifiers_storage[identifier] - for identifier in set(identifiers_storage) & mask - } - - if self.mask: - identifiers -= mask - for identifier in mask_storage: - del identifiers_storage[identifier] - - if self.update_before: - branch_scope = identifiers.copy() - - try: - return self.parser(stream) - finally: - if self.update_after: - branch_scope = identifiers.copy() - - if self.mask: - identifiers.update(mask) - identifiers_storage.update(mask_storage) + lexical_scope = get_stream_lexical_scope(stream) - stream.data["branch_scope"] = branch_scope + if self.init or not lexical_scope.next_branch: + lexical_scope.next_branch = lexical_scope.fork() + branch_scope = lexical_scope.next_branch + if self.fork: + branch_scope = branch_scope.fork() -def check_final_expression(stream: TokenStream): - current_index = stream.index - - if consume_line_continuation(stream): - exc = InvalidSyntax("Invalid indent following final expression.") - raise set_location(exc, stream.get()) + with stream.provide(lexical_scope=branch_scope): + node = self.parser(stream) - next_token = stream.get() - if next_token and not next_token.match("newline", "eof"): - exc = InvalidSyntax("Trailing input following final expression.") - raise set_location(exc, next_token) + if self.fork: + lexical_scope.reconcile(branch_scope) - stream.index = current_index + return node @dataclass @@ -755,80 +712,63 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) -def parse_statement(stream: TokenStream) -> Any: - """Parse statement.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) +@dataclass +class ForkLexicalScopeParser: + """Parser forking lexical scope.""" - for parser, alternative in stream.choose( - "bolt:augmented_assignment_target", - "bolt:assignment_target", - "bolt:expression", - "bolt:decorator", - ): - with alternative: - pending_identifiers.clear() - pending_identifiers_storage.clear() - node = delegate(parser, stream) + parser: Parser - pattern = r"=(?!=)|\+=|-=|\*=|//=|/=|%=|&=|\|=|\^=|<<=|>>=|\*\*=" + def __call__(self, stream: TokenStream) -> Any: + lexical_scope = get_stream_lexical_scope(stream) + temporary_scope = lexical_scope.fork() + with stream.provide(lexical_scope=temporary_scope): + node = self.parser(stream) + lexical_scope.reconcile(temporary_scope) + return node - if isinstance(node, AstTarget): - if parser == "bolt:assignment_target": - pattern = r"=(?!=)" - with stream.syntax(assignment=pattern): - op = stream.expect("assignment") - expression = delegate("bolt:expression", stream) +@dataclass +class AssignmentStatementParser: + """Parser for assignment statements.""" - identifiers |= pending_identifiers - pending_identifiers.clear() - identifiers_storage.update(pending_identifiers_storage) - pending_identifiers_storage.clear() + parser: Parser + binding_only: bool = False - node = AstAssignment(operator=op.value, target=node, value=expression) - node = set_location(node, node.target, node.value) + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) - elif isinstance(node, AstAttribute): - with stream.syntax(assignment=pattern): - op = stream.get("assignment") + assignment_pattern = r"=(?!=)|\+=|-=|\*=|//=|/=|%=|&=|\|=|\^=|<<=|>>=|\*\*=" - if op: - expression = delegate("bolt:expression", stream) - target = AstTargetAttribute( - name=node.name, - value=node.value, - ) - node = AstAssignment( - operator=op.value, - target=set_location(target, node), - value=expression, - ) - node = set_location(node, node.target, node.value) + if isinstance(node, AstTarget): + if self.binding_only: + assignment_pattern = r"=(?!=)" + with stream.syntax(assignment=assignment_pattern): + op = stream.expect("assignment") - elif isinstance(node, AstLookup): - with stream.syntax(assignment=pattern): - op = stream.get("assignment") + expression = delegate("bolt:expression", stream) - if op: - expression = delegate("bolt:expression", stream) - target = AstTargetItem( - value=node.value, - arguments=node.arguments, - ) - node = AstAssignment( - operator=op.value, - target=set_location(target, node), - value=expression, - ) - node = set_location(node, node.target, node.value) + node = AstAssignment(operator=op.value, target=node, value=expression) + node = set_location(node, node.target, node.value) - # Make sure that the statement is not followed by anything. - check_final_expression(stream) + elif isinstance(node, (AstAttribute, AstLookup)): + with stream.syntax(assignment=assignment_pattern): + op = stream.get("assignment") - return node + if op: + expression = delegate("bolt:expression", stream) + target = ( + AstTargetAttribute(name=node.name, value=node.value) + if isinstance(node, AstAttribute) + else AstTargetItem(value=node.value, arguments=node.arguments) + ) + node = AstAssignment( + operator=op.value, + target=set_location(target, node), + value=expression, + ) + node = set_location(node, node.target, node.value) + + return node def parse_decorator(stream: TokenStream) -> Any: @@ -889,40 +829,30 @@ def __call__(self, stream: TokenStream) -> AstRoot: class AssignmentTargetParser: """Parser for assignment targets.""" - allow_undefined_identifiers: bool = False - allow_multiple: bool = False + require_local_binding: bool = False + require_single: bool = False def __call__(self, stream: TokenStream) -> AstTarget: - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) + lexical_scope = get_stream_lexical_scope(stream) nodes: List[AstTarget] = [] with stream.syntax(identifier=IDENTIFIER_PATTERN, comma=r","): while True: token = stream.expect("identifier") - is_defined = token.value in identifiers - with_storage = token.value in identifiers_storage - rebind = is_defined and with_storage - - if self.allow_undefined_identifiers: - pending_identifiers.add(token.value) - if not with_storage: - pending_identifiers_storage[token.value] = "local" - elif not rebind: - exc = UndefinedIdentifier(token.value, list(identifiers_storage)) - if is_defined and not with_storage: - exc.notes.append( - f"Use 'global {token.value}' or 'nonlocal {token.value}' to mutate the variable defined in outer scope." - ) - raise set_location(exc, token) + rebind = lexical_scope.has_binding(token.value) target = AstTargetIdentifier(value=token.value, rebind=rebind) - nodes.append(set_location(target, token)) + target = set_location(target, token) - if not self.allow_multiple or not stream.get("comma"): + if self.require_local_binding: + lexical_scope.reference_binding(token.value, target) + + lexical_scope.create_pending_binding(token.value, target) + + nodes.append(target) + + if self.require_single or not stream.get("comma"): break if len(nodes) == 1: @@ -1020,39 +950,8 @@ def __call__(self, stream: TokenStream) -> AstRoot: return node -@dataclass -class FlushPendingIdentifiersParser: - """Parser that flushes pending identifiers.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) - - identifiers |= pending_identifiers - pending_identifiers.clear() - identifiers_storage.update(pending_identifiers_storage) - pending_identifiers_storage.clear() - - return self.parser(stream) - - def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: """Parse deferred root.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - deferred_locals = get_stream_deferred_locals(stream) - class_scope = get_stream_class_scope(stream) - - identifiers.update(pending_identifiers) - pending_identifiers.clear() - - if class_scope is not None: - identifiers = class_scope - stream_copy = stream.copy() with stream.syntax(colon=r":"): @@ -1062,16 +961,12 @@ def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: while consume_line_continuation(stream): stream.expect("statement") - stream_copy.data["identifiers"] = identifiers | deferred_locals - stream_copy.data["pending_identifiers"] = set() - stream_copy.data["identifiers_storage"] = {loc: "local" for loc in deferred_locals} - stream_copy.data["pending_identifiers_storage"] = {} - stream_copy.data["deferred_locals"] = set() - stream_copy.data["branch_scope"] = set() - stream_copy.data["class_scope"] = None - del stream_copy.data["root_scope"] + lexical_scope = get_stream_lexical_scope(stream) - deferred_locals.clear() + deferred_scope = lexical_scope.deferred(LexicalScope) + stream_copy.data["lexical_scope"] = deferred_scope + del stream_copy.data["root_scope"] + lexical_scope.deferred_complete() node = AstDeferredRoot(stream=stream_copy) return set_location(node, token, stream.current) @@ -1079,18 +974,9 @@ def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: """Parse function signature.""" - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - deferred_locals = get_stream_deferred_locals(stream) - class_scope = get_stream_class_scope(stream) - - if class_scope is not None: - identifiers = class_scope - - scoped_identifiers = set(identifiers) + lexical_scope = get_stream_lexical_scope(stream) arguments: List[AstFunctionSignatureElement] = [] - new_locals: Set[str] = set() encountered_positional = False encountered_default = False @@ -1110,9 +996,12 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: identifier = stream.expect("identifier") stream.expect(("brace", "(")) - scoped_identifiers.add(identifier.value) + node = set_location(AstFunctionSignature(name=identifier.value), identifier) + lexical_scope.bind_variable(identifier.value, node) - with stream.ignore("newline"): + deferred_scope = lexical_scope.deferred(FunctionScope) + + with stream.ignore("newline"), stream.provide(lexical_scope=deferred_scope): for token in stream.peek_until(("brace", ")")): if encountered_variadic_keyword: exc = InvalidSyntax( @@ -1133,10 +1022,7 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: default = None if stream.get("equal"): encountered_default = True - with stream.provide( - identifiers=scoped_identifiers | new_locals - ): - default = delegate("bolt:expression", stream) + default = delegate("bolt:expression", stream) elif encountered_default: exc = InvalidSyntax( "Argument without default can not appear after arguments with default values." @@ -1147,8 +1033,9 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: name=name.value, default=default, ) - arguments.append(set_location(argument, name, stream.current)) - new_locals.add(argument.name) + argument = set_location(argument, name, stream.current) + deferred_scope.bind_variable(argument.name, argument) + arguments.append(argument) elif separator: if encountered_positional: @@ -1176,8 +1063,9 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: argument = AstFunctionSignatureVariadicKeywordArgument( name=name.value ) - arguments.append(set_location(argument, kwargs, name)) - new_locals.add(argument.name) + argument = set_location(argument, kwargs, name) + deferred_scope.bind_variable(argument.name, argument) + arguments.append(argument) elif args: if encountered_variadic: @@ -1186,8 +1074,9 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: encountered_variadic = True if name := stream.get("identifier"): argument = AstFunctionSignatureVariadicArgument(name=name.value) - arguments.append(set_location(argument, args, name)) - new_locals.add(argument.name) + argument = set_location(argument, args, name) + deferred_scope.bind_variable(argument.name, argument) + arguments.append(argument) else: expect_named_argument = True argument = AstFunctionSignatureVariadicMarker() @@ -1205,24 +1094,25 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: ) raise set_location(exc, argument) - pending_identifiers.add(identifier.value) - deferred_locals |= new_locals - - node = AstFunctionSignature(name=identifier.value, arguments=AstChildren(arguments)) - return set_location(node, identifier, stream.current) + node = replace(node, arguments=AstChildren(arguments)) + return set_location(node, node, stream.current) def parse_proc_macro_signature(stream: TokenStream): """Parse proc macro signature.""" + with stream.syntax(brace=r"\(|\)", identifier=IDENTIFIER_PATTERN): begin = stream.expect(("brace", "(")) stream.expect(("identifier", "stream")) end = stream.expect(("brace", ")")) - get_stream_pending_identifiers(stream).add("stream") - get_stream_deferred_locals(stream).add("stream") + node = set_location(AstProcMacroMarker(), begin, end) - return set_location(AstProcMacroMarker(), begin, end) + lexical_scope = get_stream_lexical_scope(stream) + deferred_scope = lexical_scope.deferred(ProcMacroScope) + deferred_scope.bind_variable("stream", node) + + return node @dataclass @@ -1236,17 +1126,12 @@ class MacroMatchParser: def __call__(self, stream: TokenStream) -> AstMacroMatch: spec = get_stream_spec(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - deferred_locals = get_stream_deferred_locals(stream) with stream.syntax(equal=r"(? AstMacroMatch: exc = InvalidSyntax(f'Unrecognized argument parser "{parser_name}".') raise set_location(exc, node.match_argument_parser) + lexical_scope = get_stream_lexical_scope(stream) + deferred_scope = lexical_scope.deferred(MacroScope) + deferred_scope.bind_variable(node.match_identifier.value, node) + if commit.rollback: literal = self.literal_parser(stream) node = set_location(AstMacroMatchLiteral(match=literal), literal) @@ -1504,9 +1393,12 @@ def parse_class_name(stream: TokenStream) -> AstClassName: """Parse class name.""" with stream.syntax(identifier=IDENTIFIER_PATTERN): token = stream.expect("identifier") + node = set_location(AstClassName(value=token.value), token) - get_stream_pending_identifiers(stream).add(token.value) - return set_location(AstClassName(value=token.value), token) + lexical_scope = get_stream_lexical_scope(stream) + lexical_scope.create_pending_binding(node.value, node) + + return node def parse_class_bases(stream: TokenStream) -> AstClassBases: @@ -1528,45 +1420,19 @@ def parse_class_bases(stream: TokenStream) -> AstClassBases: return set_location(node, token, stream.current) -def parse_class_root(stream: TokenStream) -> AstRoot: +def parse_class_root(stream: TokenStream) -> AstClassRoot: """Parse class root.""" - with stream.provide(class_scope=get_stream_identifiers(stream)): - return delegate("nested_root", stream) - - -@dataclass -class ClassBodyScoping: - """Handle class body scoping.""" - - parser: Parser - - def __call__(self, stream: TokenStream) -> Any: - class_scope = get_stream_class_scope(stream) - if class_scope is None: - return self.parser(stream) + lexical_scope = get_stream_lexical_scope(stream) - identifiers = get_stream_identifiers(stream) - pending_identifiers = get_stream_pending_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) - pending_identifiers_storage = get_stream_pending_identifiers_storage(stream) - - with stream.provide( - function=False, - identifiers=identifiers.copy(), - pending_identifiers=set(), - identifiers_storage=identifiers_storage.copy(), - pending_identifiers_storage={}, - ): - node = self.parser(stream) - identifiers.update(pending_identifiers) - pending_identifiers.clear() - identifiers_storage.update(pending_identifiers_storage) - pending_identifiers_storage.clear() + with stream.provide(lexical_scope=lexical_scope.push(ClassScope)): + if isinstance(node := delegate("nested_root", stream), AstRoot): + node = set_location(AstClassRoot(commands=node.commands), node) - return set_location(AstClassRoot(commands=node.commands), node) + return node def parse_del_target(stream: TokenStream) -> AstTarget: + """Parse del target.""" node = delegate("bolt:expression", stream) if isinstance(node, AstIdentifier): @@ -1584,7 +1450,7 @@ def parse_del_target(stream: TokenStream) -> AstTarget: def parse_identifier(stream: TokenStream) -> AstIdentifier: """Parse identifier.""" - identifiers = get_stream_identifiers(stream) + lexical_scope = get_stream_lexical_scope(stream) with stream.syntax( true=TRUE_PATTERN, @@ -1593,12 +1459,11 @@ def parse_identifier(stream: TokenStream) -> AstIdentifier: identifier=IDENTIFIER_PATTERN, ): token = stream.expect("identifier") + node = set_location(AstIdentifier(value=token.value), token) - if token.value not in identifiers: - exc = UndefinedIdentifier(token.value, list(identifiers)) - raise set_location(exc, token) + lexical_scope.reference_variable(node.value, node) - return set_location(AstIdentifier(value=token.value), token) + return node @dataclass @@ -1653,30 +1518,27 @@ def check_root_scope(self, stream: TokenStream, node: AstCommand): raise set_location(InvalidSyntax(message), node) def handle_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: - identifiers = get_stream_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) + lexical_scope = get_stream_lexical_scope(stream) if node.identifier == "import:module": if isinstance(module := node.arguments[0], AstResourceLocation): if module.namespace: message = f'Can\'t import "{module.get_value()}" without alias.' raise set_location(InvalidSyntax(message), module) - identifiers.add(module.path.partition(".")[0]) + lexical_scope.bind_variable(module.path.partition(".")[0], module) elif node.identifier == "import:module:as:alias": if isinstance(alias := node.arguments[1], AstImportedItem): if not alias.identifier: exc = InvalidSyntax(f'Invalid identifier "{alias.name}".') raise set_location(exc, alias) - identifiers.add(alias.name) - identifiers_storage.setdefault(alias.name, "local") + lexical_scope.bind_variable(alias.name, alias) return node @internal def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstCommand: - identifiers = get_stream_identifiers(stream) - identifiers_storage = get_stream_identifiers_storage(stream) + lexical_scope = get_stream_lexical_scope(stream) pending_macros = get_stream_pending_macros(stream) module = cast(AstResourceLocation, node.arguments[0]) @@ -1716,8 +1578,7 @@ def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstComman elif item.identifier: arguments.append(item) - identifiers.add(item.name) - identifiers_storage.setdefault(item.name, "local") + lexical_scope.bind_variable(item.name, item) else: exc = InvalidSyntax(f'Invalid identifier "{item.name}".') @@ -1766,19 +1627,22 @@ class GlobalNonlocalHandler: parser: Parser - def __call__(self, stream: TokenStream) -> Any: - identifiers_storage = get_stream_identifiers_storage(stream) + storage_qualifiers: Dict[str, Literal["global", "nonlocal"]] = field( + default_factory=lambda: { + "global:subcommand": "global", + "nonlocal:subcommand": "nonlocal", + } + ) + def __call__(self, stream: TokenStream) -> Any: if isinstance(node := self.parser(stream), AstCommand): - if node.identifier in ["global:subcommand", "nonlocal:subcommand"]: - storage, _, _ = node.identifier.partition(":") + if storage := self.storage_qualifiers.get(node.identifier): subcommand = cast(AstCommand, node.arguments[0]) + + lexical_scope = get_stream_lexical_scope(stream) while True: if isinstance(name := subcommand.arguments[0], AstIdentifier): - s = identifiers_storage.setdefault(name.value, storage) - if s != storage: - exc = InvalidSyntax(f"Can't make {s} identifier {storage}.") - raise set_location(exc, name) + lexical_scope.bind_storage(name.value, storage, name) if subcommand.identifier == f"{storage}:name:subcommand": subcommand = cast(AstCommand, subcommand.arguments[1]) else: @@ -1787,6 +1651,25 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class FlushPendingBindingsParser: + """Parser that flushes pending bindings.""" + + parser: Parser + before: bool = False + after: bool = False + + def __call__(self, stream: TokenStream) -> Any: + if self.before: + lexical_scope = get_stream_lexical_scope(stream) + lexical_scope.flush_pending_bindings() + node = self.parser(stream) + if self.after: + lexical_scope = get_stream_lexical_scope(stream) + lexical_scope.flush_pending_bindings() + return node + + @dataclass class StatementSubcommandHandler: """Prevent statements as subcommands.""" @@ -1815,7 +1698,8 @@ class DeferredRootBacktracker: def __call__(self, stream: TokenStream) -> AstRoot: node: AstRoot = self.parser(stream) - if isinstance(node, AstClassRoot): + lexical_scope = get_stream_lexical_scope(stream) + if isinstance(lexical_scope, ClassScope): return node return self.resolve_deferred(node, stream) @@ -1855,10 +1739,9 @@ def resolve_deferred(self, node: AstRoot, stream: TokenStream) -> AstRoot: deferred_stream = deferred_root.stream deferred_stream.data["local_spec"] = False deferred_stream.data["spec"] = get_stream_spec(stream) - deferred_stream.data["identifiers"] |= get_stream_identifiers(stream) - deferred_stream.data["function"] = True deferred_stream.data["macro_scope"] = get_stream_macro_scope(stream) deferred_stream.data["pending_macros"] = [] + nested_root = delegate("nested_root", deferred_stream) self.macro_handler.cache_local_spec(deferred_stream) @@ -1886,16 +1769,18 @@ def resolve_deferred(self, node: AstRoot, stream: TokenStream) -> AstRoot: @dataclass -class FunctionConstraint: - """Constraint that makes sure that the given statements only occur in functions.""" +class LexicalScopeConstraint: + """Constraint that restricts specific statements to the given scope type.""" parser: Parser + type: Type[LexicalScope] command_identifiers: Set[str] def __call__(self, stream: TokenStream) -> AstRoot: node = self.parser(stream) - if stream.data.get("function"): + lexical_scope = get_stream_lexical_scope(stream) + if isinstance(lexical_scope, self.type): return node if isinstance(node, AstRoot): @@ -2248,6 +2133,7 @@ class BuiltinCallRestriction: """Only allow call expressions on builtins.""" parser: Parser + builtins: Set[str] def __call__(self, stream: TokenStream) -> Any: parent = None @@ -2258,11 +2144,12 @@ def __call__(self, stream: TokenStream) -> Any: parent = node node = node.value + lexical_scope = get_stream_lexical_scope(stream) if ( isinstance(node, AstIdentifier) and not isinstance(parent, AstCall) - and node.value in get_stream_builtins(stream) - and node.value not in get_stream_identifiers_storage(stream) + and node.value in self.builtins + and not lexical_scope.has_binding(node.value, search_parents=True) ): # Reset the underlying token generator so that the identifier can # be re-parsed as a different token. That shouldn't be necessary @@ -2277,21 +2164,19 @@ def __call__(self, stream: TokenStream) -> Any: def parse_dict_item(stream: TokenStream) -> Any: """Parse dict item node.""" + with stream.syntax(colon=r":", identifier=IDENTIFIER_PATTERN): with stream.checkpoint() as commit: - identifier = stream.expect("identifier") + token = stream.expect("identifier") stream.expect("colon") commit() - if identifier.value in get_stream_identifiers(stream) and ( - not identifier.value in get_stream_builtins(stream) - or identifier.value in get_stream_identifiers_storage(stream) - ): - key = AstIdentifier(value=identifier.value) + lexical_scope = get_stream_lexical_scope(stream) + if lexical_scope.has_binding(token.value, search_parents=True): + key = set_location(AstIdentifier(value=token.value), token) + lexical_scope.reference_variable(key.value, key) else: - key = AstDictUnquotedKey(value=identifier.value) - - key = set_location(key, identifier) + key = set_location(AstDictUnquotedKey(value=token.value), token) if commit.rollback: key = delegate("bolt:expression", stream) diff --git a/packages/bolt/bolt/semantics.py b/packages/bolt/bolt/semantics.py new file mode 100644 index 000000000..527c0412c --- /dev/null +++ b/packages/bolt/bolt/semantics.py @@ -0,0 +1,366 @@ +__all__ = [ + "LexicalScope", + "GlobalScope", + "FunctionScope", + "MacroScope", + "ProcMacroScope", + "ClassScope", + "Variable", + "Binding", + "UndefinedIdentifier", + "UnboundLocalIdentifier", + "InconsistentIdentifierStorage", +] + + +from dataclasses import dataclass, field, replace +from typing import Dict, List, Literal, Optional, Set, Tuple, Type, TypeVar + +from beet.core.utils import extra_field +from mecha import AstNode +from tokenstream import InvalidSyntax, set_location + +from .utils import suggest_typo + +LexicalScopeType = TypeVar("LexicalScopeType", bound="LexicalScope") + + +class UndefinedIdentifier(InvalidSyntax): + """Raised when an identifier is not defined. + + Attributes + ---------- + identifier + The identifier that couldn't be found. + lexical_scope + The current scope. + """ + + identifier: str + lexical_scope: "LexicalScope" + + def __init__(self, identifier: str, lexical_scope: "LexicalScope"): + super().__init__(identifier, lexical_scope) + self.identifier = identifier + self.lexical_scope = lexical_scope + + def __str__(self) -> str: + msg = f'Identifier "{self.identifier}" is not defined.' + + variable_names = self.lexical_scope.list_variables() - {self.identifier} + if suggestion := suggest_typo(self.identifier, variable_names): + msg += f" Did you mean {suggestion}?" + + return msg + + +class UnboundLocalIdentifier(UndefinedIdentifier): + """Raised when mutating a variable before assignment. + + This is a specialized error for code that tries to access and mutate a variable + with no local binding in the current scope. + """ + + def __init__(self, identifier: str, lexical_scope: "LexicalScope"): + super().__init__(identifier, lexical_scope) + if lexical_scope.parent and lexical_scope.parent.has_variable(identifier): + self.notes.append( + f'Use "global {identifier}" or "nonlocal {identifier}" to mutate the variable defined in outer scope.' + ) + + +class InconsistentIdentifierStorage(InvalidSyntax): + """Raised when trying to change the storage of an already existing variable. + + Attributes + ---------- + identifier + The identifier with a prior conflicting definition in the current scope. + storage + The target storage of the inconsistent binding. + lexical_scope + The current scope. + """ + + identifier: str + storage: Literal["local", "nonlocal", "global"] + lexical_scope: "LexicalScope" + + def __init__( + self, + identifier: str, + storage: Literal["local", "nonlocal", "global"], + lexical_scope: "LexicalScope", + ): + super().__init__(identifier, storage, lexical_scope) + self.identifier = identifier + self.storage = storage + self.lexical_scope = lexical_scope + + def __str__(self) -> str: + return f'Can\'t make {self.lexical_scope.variables[self.identifier].storage} identifier "{self.identifier}" {self.storage}.' + + +@dataclass +class Binding: + """Variable binding. + + Attributes + ---------- + origin + The code fragment performing the variable binding. + references + Other parts of the code that use the value set by the binding. + cutoff + The number of references in common after forking. + """ + + origin: AstNode + references: List[AstNode] = field(default_factory=list) + + cutoff: int = extra_field(default=0) + + def fork(self) -> "Binding": + return replace( + self, + references=self.references.copy(), + cutoff=len(self.references), + ) + + def reconcile(self, binding: "Binding"): + self.references += binding.references[binding.cutoff :] + + +@dataclass +class Variable: + """Variable definition. + + Attributes + ---------- + storage + The type of storage for the variable. + bindings + Associated bindings updating the value or the storage of the variable. + cutoff + The number of bindings in common after forking. + """ + + storage: Literal["local", "nonlocal", "global"] = "local" + bindings: List[Binding] = field(default_factory=list) + + cutoff: int = extra_field(default=0) + + def fork(self): + return replace( + self, + bindings=[binding.fork() for binding in self.bindings], + cutoff=len(self.bindings), + ) + + def reconcile(self, variable: "Variable"): + for i, binding in enumerate(variable.bindings[: variable.cutoff]): + self.bindings[i].reconcile(binding) + + for new_binding in variable.bindings[variable.cutoff :]: + self.bindings.append(new_binding) + + +@dataclass +class LexicalScope: + """Class for managing variable scopes during parsing. + + Attributes + ---------- + parent + Parent scope if the current scope has one. + variables + Dictionary holding variable definitions. + dirty + Flag to skip reconciliation after forking in case no additional + variables or bindings were introduced. + """ + + variables: Dict[str, Variable] = field(default_factory=dict) + + anchor: Optional[AstNode] = extra_field(default=None) + parent: Optional["LexicalScope"] = extra_field(default=None) + children: List["LexicalScope"] = extra_field(default_factory=list) + + dirty: bool = extra_field(default=False) + + next_branch: Optional["LexicalScope"] = extra_field(default=None) + next_deferred: Optional["LexicalScope"] = extra_field(default=None) + pending_bindings: List[Tuple[str, AstNode]] = extra_field(default_factory=list) + + def has_binding(self, identifier: str, search_parents: bool = False) -> bool: + return identifier in self.variables or bool( + search_parents + and self.parent + and self.parent.has_binding(identifier, search_parents=True) + ) + + def reference_binding(self, identifier: str, node: AstNode): + if not self.has_binding(identifier): + raise set_location(UnboundLocalIdentifier(identifier, self), node) + self.reference_variable(identifier, node) + + def has_variable(self, identifier: str) -> bool: + return identifier in self.variables or bool( + self.parent and self.parent.has_variable(identifier) + ) + + def list_variables(self) -> Set[str]: + all_variables = set(self.variables) + if self.parent: + all_variables |= self.parent.list_variables() + return all_variables + + def reference_variable( + self, + identifier: str, + node: AstNode, + scope: Optional["LexicalScope"] = None, + ): + if not scope: + scope = self + + if variable := self.variables.get(identifier): + binding = variable.bindings[-1] + + if not binding.references or binding.references[-1] is not node: + self.dirty = True + binding.references.append(node) + + if variable.storage != "local" and self.parent: + self.parent.reference_variable(identifier, node, scope) + + return + + if not self.parent: + raise set_location(UndefinedIdentifier(identifier, scope), node) + + self.parent.reference_variable(identifier, node, scope) + + def bind_variable(self, identifier: str, node: AstNode): + self.dirty = True + + if self.has_binding(identifier): + self.reference_variable(identifier, node) + + variable = self.variables.get(identifier) + if not variable: + variable = Variable() + self.variables[identifier] = variable + + variable.bindings.append(Binding(origin=node)) + + if variable.storage != "local" and self.parent: + self.parent.bind_variable(identifier, node) + + def bind_storage( + self, + identifier: str, + storage: Literal["nonlocal", "global"], + node: AstNode, + ): + self.dirty = True + + self.reference_variable(identifier, node) + + variable = self.variables.get(identifier) + if not variable: + variable = Variable(storage=storage) + self.variables[identifier] = variable + elif variable.storage != storage: + exc = InconsistentIdentifierStorage(identifier, storage, self) + raise set_location(exc, node) + + variable.bindings.append(Binding(origin=node)) + + def push(self, scope_type: Type["LexicalScopeType"]) -> "LexicalScopeType": + child = scope_type(parent=self) + self.children.append(child) + return child + + def deferred(self, scope_type: Type["LexicalScopeType"]) -> "LexicalScopeType": + if not isinstance(self.next_deferred, scope_type): + self.next_deferred = self.push(scope_type) + return self.next_deferred # type: ignore + + def deferred_complete(self): + self.next_deferred = None + + def fork(self) -> "LexicalScope": + return replace( + self, + parent=self.parent and self.parent.fork(), + dirty=False, + variables={ + identifier: variable.fork() + for identifier, variable in self.variables.items() + }, + ) + + def reconcile(self, lexical_scope: "LexicalScope"): + if lexical_scope.dirty: + self.dirty = True + for identifier, variable in lexical_scope.variables.items(): + if current_variable := self.variables.get(identifier): + current_variable.reconcile(variable) + else: + self.variables[identifier] = variable + if self.parent and lexical_scope.parent: + self.parent.reconcile(lexical_scope.parent) + + def create_pending_binding(self, identifier: str, node: AstNode): + self.pending_bindings.append((identifier, node)) + + def flush_pending_bindings(self): + for identifier, node in self.pending_bindings: + self.bind_variable(identifier, node) + self.pending_bindings.clear() + + +@dataclass +class GlobalScope(LexicalScope): + """Specialized global scope to fork more efficiently.""" + + identifiers: Set[str] = field(default_factory=set) + + def has_variable(self, identifier: str) -> bool: + return identifier in self.identifiers or super().has_variable(identifier) + + def list_variables(self) -> Set[str]: + return self.identifiers | super().list_variables() + + def reference_variable( + self, + identifier: str, + node: AstNode, + scope: Optional["LexicalScope"] = None, + ): + if identifier not in self.identifiers or identifier in self.variables: + super().reference_variable(identifier, node, scope) + + +class FunctionScope(LexicalScope): + """Dedicated type for function scope.""" + + +class MacroScope(FunctionScope): + """Dedicated type for macro scope.""" + + +class ProcMacroScope(FunctionScope): + """Dedicated type for proc macro scope.""" + + +class ClassScope(LexicalScope): + """Dedicated type for class scope.""" + + def push(self, scope_type: Type["LexicalScopeType"]) -> "LexicalScopeType": + if issubclass(scope_type, FunctionScope): + if not self.parent: + raise ValueError("Class scope has no parent.") + return self.parent.push(scope_type) + return super().push(scope_type) diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py index 1c90f3cda..e430d8540 100644 --- a/packages/bolt/bolt/utils.py +++ b/packages/bolt/bolt/utils.py @@ -74,7 +74,9 @@ def fake_traceback(exc: Exception, tb: TracebackType, lineno: int) -> TracebackT def suggest_typo(wrong: str, possibilities: Iterable[str]) -> Optional[str]: - if matches := get_close_matches(wrong, possibilities): + cutoff = 0.6 if len(wrong) < 3 else 0.7 + + if matches := get_close_matches(wrong, possibilities, cutoff=cutoff): matches = [f'"{m}"' for m in matches] if len(matches) == 1: diff --git a/packages/bolt/tests/snapshots/bolt__parse_125__0.txt b/packages/bolt/tests/snapshots/bolt__parse_125__0.txt index 69d92bb61..03ca160e6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_125__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_125__0.txt @@ -1,5 +1,5 @@ import math -#>ERROR Identifier "mah" is not defined. +#>ERROR Identifier "mah" is not defined. Did you mean "math"? # line 2, column 1 # 1 | import math # 2 | mah.sin(1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_188__0.txt b/packages/bolt/tests/snapshots/bolt__parse_188__0.txt index e5b5e93ff..46e3496f5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_188__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_188__0.txt @@ -1,5 +1,5 @@ x = 1 -#>ERROR Can't make local identifier global. +#>ERROR Can't make local identifier "x" global. # line 2, column 8 # 1 | x = 1 # 2 | global x diff --git a/packages/bolt/tests/snapshots/bolt__parse_190__0.txt b/packages/bolt/tests/snapshots/bolt__parse_190__0.txt index 3ce10b1b6..ad0409bcd 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_190__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_190__0.txt @@ -1,5 +1,5 @@ def f(x): -#>ERROR Can't make local identifier global. +#>ERROR Can't make local identifier "x" global. # line 2, column 12 # 1 | def f(x): # 2 | global x diff --git a/packages/bolt/tests/snapshots/bolt__parse_191__0.txt b/packages/bolt/tests/snapshots/bolt__parse_191__0.txt index 742aaf027..bfeda5e4d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_191__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_191__0.txt @@ -1,7 +1,7 @@ x = 1 def f(): global x -#>ERROR Can't make global identifier nonlocal. +#>ERROR Can't make global identifier "x" nonlocal. # line 4, column 14 # 3 | global x # 4 | nonlocal x diff --git a/packages/bolt/tests/snapshots/bolt__parse_195__0.txt b/packages/bolt/tests/snapshots/bolt__parse_195__0.txt index e60aee050..3aaff46bc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_195__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_195__0.txt @@ -1,5 +1,5 @@ for i in range(3): -#>ERROR Identifier "parent" is not defined. +#>ERROR Identifier "parent" is not defined. Did you mean "print"? # line 2, column 5 # 1 | for i in range(3): # 2 | parent[i] = f"param{i}" diff --git a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt index 1d605bf29..d1da8b033 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_200__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_200__0.txt @@ -6,6 +6,6 @@ def f(): # 3 | a += 1 # : ^ # Notes: -# - Use 'global a' or 'nonlocal a' to mutate the variable defined in outer scope. +# - Use "global a" or "nonlocal a" to mutate the variable defined in outer scope. # - Expected assignment but got literal '+='. a += 1 diff --git a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt index 4fec1ba47..506903a66 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_58__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_58__0.txt @@ -1,4 +1,4 @@ -#>ERROR Identifier "the" is not defined. Did you mean "hex"? +#>ERROR Identifier "the" is not defined. # line 1, column 7 # 1 | wat = the = "f" # : ^^^ diff --git a/packages/bolt/tests/test_semantics.py b/packages/bolt/tests/test_semantics.py new file mode 100644 index 000000000..de3ab5a89 --- /dev/null +++ b/packages/bolt/tests/test_semantics.py @@ -0,0 +1,133 @@ +import pytest + +from bolt import ( + AstIdentifier, + Binding, + FunctionScope, + GlobalScope, + InconsistentIdentifierStorage, + LexicalScope, + UnboundLocalIdentifier, + UndefinedIdentifier, + Variable, +) + + +def test_variable(): + lexical_scope = LexicalScope() + assert not lexical_scope.has_variable("foo") + + lexical_scope.bind_variable("foo", AstIdentifier(value="foo")) + assert lexical_scope.has_variable("foo") + assert lexical_scope.list_variables() == {"foo"} + + lexical_scope.reference_variable("foo", AstIdentifier(value="foo")) + assert lexical_scope.variables == { + "foo": Variable( + bindings=[ + Binding( + origin=AstIdentifier(value="foo"), + references=[AstIdentifier(value="foo")], + ) + ] + ) + } + + +def test_global(): + global_scope = GlobalScope(identifiers={"THING"}) + + assert global_scope.has_variable("THING") + assert global_scope.list_variables() == {"THING"} + + assert not global_scope.has_binding("THING") + + lexical_scope = global_scope.push(LexicalScope) + assert lexical_scope.has_variable("THING") + assert lexical_scope.list_variables() == {"THING"} + + lexical_scope.reference_variable("THING", AstIdentifier(value="THING")) + assert lexical_scope.variables == {} + assert global_scope.variables == {} + + +def test_children(): + lexical_scope = LexicalScope() + + with pytest.raises(UndefinedIdentifier, match='"foo" is not defined'): + lexical_scope.reference_variable("foo", AstIdentifier(value="foo")) + with pytest.raises(UnboundLocalIdentifier, match='"foo" is not defined'): + lexical_scope.reference_binding("foo", AstIdentifier(value="foo")) + + lexical_scope.bind_variable("foo", AstIdentifier(value="foo")) + + child_scope = lexical_scope.push(FunctionScope) + + with pytest.raises(UnboundLocalIdentifier) as exc_info: + child_scope.reference_binding("foo", AstIdentifier(value="foo")) + assert exc_info.value.notes == [ + 'Use "global foo" or "nonlocal foo" to mutate the variable defined in outer scope.' + ] + + alternative_scope = child_scope.fork() + + child_scope.bind_variable("foo", AstIdentifier(value="foo")) + + with pytest.raises(InconsistentIdentifierStorage): + child_scope.bind_storage("foo", "nonlocal", AstIdentifier(value="foo")) + + alternative_scope.bind_storage("foo", "nonlocal", AstIdentifier(value="foostorage")) + alternative_scope.reference_variable("foo", AstIdentifier(value="fooparent")) + alternative_scope.bind_variable("foo", AstIdentifier(value="foovalue")) + alternative_scope.reference_variable("foo", AstIdentifier(value="fooref")) + + assert alternative_scope.variables == { + "foo": Variable( + storage="nonlocal", + bindings=[ + Binding( + origin=AstIdentifier(value="foostorage"), + references=[ + AstIdentifier(value="fooparent"), + AstIdentifier(value="foovalue"), + ], + ), + Binding( + origin=AstIdentifier(value="foovalue"), + references=[AstIdentifier(value="fooref")], + ), + ], + ) + } + + assert lexical_scope.variables == { + "foo": Variable( + bindings=[ + Binding( + origin=AstIdentifier(value="foo"), + references=[], + ) + ] + ) + } + + child_scope.reconcile(alternative_scope) + + assert lexical_scope.variables == { + "foo": Variable( + bindings=[ + Binding( + origin=AstIdentifier(value="foo"), + references=[ + AstIdentifier(value="foostorage"), + AstIdentifier(value="fooparent"), + AstIdentifier(value="foovalue"), + ], + ), + Binding( + origin=AstIdentifier(value="foovalue"), + references=[AstIdentifier(value="fooref")], + ), + ] + ) + } From 77aef00894385fad4e81d67833a84fe732f7dc74 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 4 Dec 2022 01:31:31 +0000 Subject: [PATCH 1094/1554] 0.22.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index c40099677..3b0c909c7 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.22.0 (2022-12-04) +### Feature +* Refactor identifier tracing with proper lexical scope abstraction ([`2f60bd4`](https://github.com/mcbeet/bolt/commit/2f60bd43c8affc2747c56e2d4dd4045e45561677)) + ## v0.21.1 (2022-12-03) ### Fix * Default empty arguments for AstFunctionSignature ([`6c79443`](https://github.com/mcbeet/bolt/commit/6c794431fe5b4c826dea8cae54a63d8c54838ad9)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 046a18ca2..0a50cbdb7 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.21.1" +__version__ = "0.22.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index c86c00011..f9a1722f0 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.21.1" +version = "0.22.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From f9475ea0e15e1e01c8d7f3d4a9eb07e137aeed8f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Jan 2023 23:27:12 +0100 Subject: [PATCH 1095/1554] fix: make it possible to start compiling from a custom initial step --- packages/mecha/mecha/api.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index dabe5d660..7cbb56c4b 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -356,6 +356,7 @@ def compile( multiline: Optional[bool] = None, formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, + initial_step: int = 0, report: Optional[DiagnosticCollection] = None, ) -> DataPack: ... @@ -370,6 +371,7 @@ def compile( multiline: Optional[bool] = None, formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, + initial_step: int = 0, report: Optional[DiagnosticCollection] = None, ) -> TextFileType: ... @@ -384,6 +386,7 @@ def compile( multiline: Optional[bool] = None, formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, + initial_step: int = 0, report: Optional[DiagnosticCollection] = None, ) -> Function: ... @@ -398,6 +401,7 @@ def compile( multiline: Optional[bool] = None, formatting: Optional[JsonDict] = None, readonly: Optional[bool] = None, + initial_step: int = 0, report: Optional[DiagnosticCollection] = None, ) -> Union[DataPack, TextFileBase[Any]]: """Apply all compilation steps.""" @@ -451,7 +455,7 @@ def compile( if step < 0: if compilation_unit.ast: - self.database.enqueue(function, 0) + self.database.enqueue(function, initial_step) continue try: compilation_unit.source = function.text @@ -461,7 +465,7 @@ def compile( resource_location=compilation_unit.resource_location, multiline=multiline, ) - self.database.enqueue(function, 0) + self.database.enqueue(function, initial_step) except DiagnosticError as exc: compilation_unit.diagnostics.extend(exc.diagnostics) From 26edee52be21bd11efbef2595768b715481a1bf6 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Jan 2023 23:27:32 +0100 Subject: [PATCH 1096/1554] chore: update beet --- packages/mecha/poetry.lock | 40 ++++++++++++++++++++++++++++++----- packages/mecha/pyproject.toml | 2 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index bbd7a1235..ef52b8a5b 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -14,7 +14,7 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.81.1" +version = "0.82.2" description = "The Minecraft pack development kit" category = "main" optional = false @@ -47,6 +47,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -179,6 +180,17 @@ category = "dev" optional = false python-versions = ">=3.5,<4.0" +[[package]] +name = "exceptiongroup" +version = "1.1.0" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "gitdb" version = "4.0.9" @@ -510,9 +522,11 @@ python-versions = ">=3.7" [package.dependencies] attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] @@ -697,6 +711,14 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "tomlkit" version = "0.11.6" @@ -804,8 +826,8 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" -python-versions = "~3.11" -content-hash = "172cf22c05b4d737d62fac033e210b406c39e63b75ebaeddd87d097433b0f515" +python-versions = "^3.10" +content-hash = "67a8c50a8a1f45f06f4bbf182c1079cb3ced8d8b7a1457ec28d1795401f5dc12" [metadata.files] attrs = [ @@ -813,8 +835,8 @@ attrs = [ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] beet = [ - {file = "beet-0.81.1-py3-none-any.whl", hash = "sha256:fcf8e49576f2b480dc581e87b692c455f9760cedd5643b49aed09ba5afd750a3"}, - {file = "beet-0.81.1.tar.gz", hash = "sha256:069045348eee86c7190abecbc7ff3b7570408dc8c0338f82cb6fd5e06f8dd262"}, + {file = "beet-0.82.2-py3-none-any.whl", hash = "sha256:d53c19d1fbbc5dd826c9c7810438c6da67c5b3542c075b3e34c23ee8cbcc477f"}, + {file = "beet-0.82.2.tar.gz", hash = "sha256:967cfefb80f9e6a9cb137a6552cc82bc763af487c6757a5fb8824528412ffe0b"}, ] black = [ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, @@ -969,6 +991,10 @@ dotty-dict = [ {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, ] +exceptiongroup = [ + {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, + {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, +] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, @@ -1281,6 +1307,10 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] tomlkit = [ {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 86e13754f..c60c2be41 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.80.1" +beet = ">=0.82.2" tokenstream = "^1.4.2" [tool.poetry.group.dev.dependencies] From 2df802dca3b9c22606aa6b5c0278dd9da35a688b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Jan 2023 23:43:32 +0100 Subject: [PATCH 1097/1554] chore: update workflow --- packages/mecha/.github/workflows/main.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/mecha/.github/workflows/main.yml b/packages/mecha/.github/workflows/main.yml index 5a2f8d9bb..18f37cfee 100644 --- a/packages/mecha/.github/workflows/main.yml +++ b/packages/mecha/.github/workflows/main.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [main] +env: + PYTHON_VERSION: "3.10" + POETRY_VERSION: "1.3.2" + jobs: main: name: Test and release @@ -16,29 +20,30 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Set up Python 3.10 + - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: ${{ env.PYTHON_VERSION }} - name: Cache poetry id: cache-poetry uses: actions/cache@v3 with: path: ~/.local - key: poetry-${{ runner.os }} + key: poetry-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ env.POETRY_VERSION }} - name: Install poetry if: steps.cache-poetry.outputs.cache-hit != 'true' uses: snok/install-poetry@v1 with: + version: ${{ env.POETRY_VERSION }} virtualenvs-in-project: true - name: Cache venv id: cache-venv uses: actions/cache@v3 with: path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('poetry.lock') }} + key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ env.POETRY_VERSION }}-${{ hashFiles('poetry.lock') }} restore-keys: | - venv-${{ runner.os }}- + venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ env.POETRY_VERSION }}- - name: Install dependencies if: steps.cache-venv.outputs.cache-hit != 'true' run: poetry install From 6dcd91154af6ad5440bc0c8b0d38f6af6f67c55d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Jan 2023 22:45:32 +0000 Subject: [PATCH 1098/1554] 0.62.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index aecb39467..67fe3eeb4 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.62.1 (2023-01-29) +### Fix +* Make it possible to start compiling from a custom initial step ([`f2037ad`](https://github.com/mcbeet/mecha/commit/f2037ad8a8422cca386833db0da24bc3e6250031)) + ## v0.62.0 (2022-12-01) ### Feature * Add ast node compile_hints and make it so that AstSourceMap can't end up inlined into execute ([`a6537ff`](https://github.com/mcbeet/mecha/commit/a6537ffb50df3ef7550095a8b9366d7fc47e5d52)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index dc1c06a69..eb1ce0453 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.62.0" +__version__ = "0.62.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c60c2be41..cfa1d8b52 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.62.0" +version = "0.62.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From db359a9842d8612031db23bf13a27618d97d219b Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 29 Jan 2023 23:59:38 +0100 Subject: [PATCH 1099/1554] fix: stop using importlib.resources.read_text --- packages/mecha/mecha/config.py | 12 +++++++++--- packages/mecha/mecha/contrib/inline_function_tag.py | 6 ++++-- packages/mecha/mecha/contrib/nesting.py | 4 ++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/mecha/mecha/config.py b/packages/mecha/mecha/config.py index 3287fa1d4..4ee67b088 100644 --- a/packages/mecha/mecha/config.py +++ b/packages/mecha/mecha/config.py @@ -4,7 +4,7 @@ import json -from importlib.resources import read_text +from importlib.resources import files from pathlib import Path from typing import Dict, Iterator, List, Literal, Optional, Set, Tuple, Union @@ -42,7 +42,11 @@ def load_from( if version: version_name = "_".join(map(str, version)) try: - sources.append(read_text("mecha.resources", f"{version_name}.json")) + sources.append( + files("mecha.resources") + .joinpath(f"{version_name}.json") + .read_text() + ) except FileNotFoundError as exc: raise ErrorMessage(f"Invalid minecraft version {version!r}.") from exc @@ -52,7 +56,9 @@ def load_from( tree.extend(cls.parse_raw(source)) if version and not unpatched: - for patch in json.loads(read_text("mecha.resources", "patches.json")): + for patch in json.loads( + files("mecha.resources").joinpath("patches.json").read_text() + ): if any(split_version(v) == version for v in patch["versions"]): tree.extend(cls(**patch["config"])) diff --git a/packages/mecha/mecha/contrib/inline_function_tag.py b/packages/mecha/mecha/contrib/inline_function_tag.py index 9e84f6b0d..9ef0c4fd2 100644 --- a/packages/mecha/mecha/contrib/inline_function_tag.py +++ b/packages/mecha/mecha/contrib/inline_function_tag.py @@ -8,7 +8,7 @@ import logging from dataclasses import dataclass, replace -from importlib.resources import read_text +from importlib.resources import files from typing import List from beet import Context, FunctionTag, Generator @@ -36,7 +36,9 @@ def beet_default(ctx: Context): mc = ctx.inject(Mecha) - commands_json = read_text("mecha.resources", "inline_function_tag.json") + commands_json = ( + files("mecha.resources").joinpath("inline_function_tag.json").read_text() + ) mc.spec.add_commands(CommandTree.parse_raw(commands_json)) mc.transform.extend(inline_execute_function_tag) diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 54145f18c..565e7c642 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -10,7 +10,7 @@ from dataclasses import dataclass, replace -from importlib.resources import read_text +from importlib.resources import files from typing import List, cast from beet import Context, Function, Generator, configurable @@ -56,7 +56,7 @@ def nesting(ctx: Context, opts: NestingOptions): mc.spec.multiline = True - commands_json = read_text("mecha.resources", "nesting.json") + commands_json = files("mecha.resources").joinpath("nesting.json").read_text() mc.spec.add_commands(CommandTree.parse_raw(commands_json)) mc.spec.parsers["nested_root"] = parse_nested_root From 8a26a3b110b82ca99daf447ec237cda69206772d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 30 Jan 2023 00:08:36 +0100 Subject: [PATCH 1100/1554] fix: use slots for ast nodes --- packages/mecha/mecha/ast.py | 148 ++++++++++----------- packages/mecha/mecha/contrib/messages.py | 4 +- packages/mecha/mecha/contrib/source_map.py | 2 +- 3 files changed, 77 insertions(+), 77 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 19db39c7b..64f9c434f 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -132,7 +132,7 @@ ) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNode: """Base class for all ast nodes.""" @@ -215,7 +215,7 @@ def __repr__(self) -> str: return f"AstChildren({super().__repr__()})" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstRoot(AstNode): """Ast root node.""" @@ -224,7 +224,7 @@ class AstRoot(AstNode): parser = "root" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstCommand(AstNode): """Ast command node.""" @@ -234,7 +234,7 @@ class AstCommand(AstNode): parser = "command" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstCommandSentinel(AstCommand): """Ast command sentinel node.""" @@ -244,7 +244,7 @@ class AstCommandSentinel(AstCommand): parser = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstString(AstNode): """Ast string node.""" @@ -258,7 +258,7 @@ def from_value(cls, value: Any) -> "AstString": return AstString(value=str(value)) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstBool(AstNode): """Ast bool node.""" @@ -272,7 +272,7 @@ def from_value(cls, value: Any) -> "AstBool": return AstBool(value=bool(value)) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNumber(AstNode): """Ast number node.""" @@ -290,7 +290,7 @@ def from_value(cls, value: Any) -> "AstNumber": raise ValueError(f"Invalid number {value!r}.") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstUUID(AstNode): """Ast uuid node.""" @@ -309,7 +309,7 @@ def from_value(cls, value: Any) -> "AstUUID": raise ValueError(f"Invalid UUID {value!r}.") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstCoordinate(AstNode): """Coordinate ast node.""" @@ -335,7 +335,7 @@ def from_value(cls, value: Any) -> "AstCoordinate": raise ValueError(f"Invalid coordinate {value!r}.") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstVector2(AstNode): """Vector 2 ast node.""" @@ -351,7 +351,7 @@ def from_value(cls, value: Any) -> "AstVector2": return AstVector2(x=x, y=y) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstVector3(AstNode): """Vector 3 ast node.""" @@ -368,7 +368,7 @@ def from_value(cls, value: Any) -> "AstVector3": return AstVector3(x=x, y=y, z=z) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstLiteral(AstNode): """Base ast node for literals.""" @@ -386,7 +386,7 @@ def from_value(cls: Type[AstLiteralType], value: Any) -> AstLiteralType: raise ValueError(f"Invalid {cls.parser or 'literal'} {value!r}.") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstWord(AstLiteral): """Ast word node.""" @@ -394,7 +394,7 @@ class AstWord(AstLiteral): regex = re.compile(r"[0-9A-Za-z_\.\+\-]+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstOption(AstLiteral): """Base node for options.""" @@ -409,7 +409,7 @@ def __init_subclass__(cls): cls.regex = re.compile("|".join(patterns)) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstGreedy(AstLiteral): """Ast greedy node.""" @@ -417,7 +417,7 @@ class AstGreedy(AstLiteral): regex = re.compile(r".+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstObjective(AstLiteral): """Ast objective node.""" @@ -425,7 +425,7 @@ class AstObjective(AstLiteral): regex = re.compile(r"[a-zA-Z0-9_.+-]+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstObjectiveCriteria(AstLiteral): """Ast objective criteria node.""" @@ -433,7 +433,7 @@ class AstObjectiveCriteria(AstLiteral): regex = re.compile(r"[a-zA-Z0-9_.+-]+(?::[a-zA-Z0-9_.+-]+)?") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstScoreboardOperation(AstOption): """Ast scoreboard operation node.""" @@ -441,7 +441,7 @@ class AstScoreboardOperation(AstOption): options = {"+=", "-=", "*=", "/=", "%=", "=", "><", "<", ">"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTeam(AstLiteral): """Ast team node.""" @@ -449,7 +449,7 @@ class AstTeam(AstLiteral): regex = re.compile(r"[a-zA-Z0-9_.+-]+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstPlayerName(AstLiteral): """Ast player name node.""" @@ -457,7 +457,7 @@ class AstPlayerName(AstLiteral): regex = re.compile(r"(?!@)[^*\s]+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstScoreboardSlot(AstOption): """Ast scoreboard slot node.""" @@ -469,7 +469,7 @@ class AstScoreboardSlot(AstOption): } -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSwizzle(AstOption): """Ast swizzle node.""" @@ -481,7 +481,7 @@ class AstSwizzle(AstOption): ) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstAdvancementPredicate(AstLiteral): """Ast advancement predicate node.""" @@ -489,7 +489,7 @@ class AstAdvancementPredicate(AstLiteral): regex = re.compile(r"[0-9A-Za-z_\.\+\-]+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstWildcard(AstLiteral): """Ast wildcard node.""" @@ -499,7 +499,7 @@ class AstWildcard(AstLiteral): regex = re.compile(r"\*") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstColor(AstOption): """Ast color node.""" @@ -507,7 +507,7 @@ class AstColor(AstOption): options = set(COLORS) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstColorReset(AstOption): """Ast color reset node.""" @@ -515,7 +515,7 @@ class AstColorReset(AstOption): options = {"reset"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSortOrder(AstOption): """Ast sort order node.""" @@ -523,7 +523,7 @@ class AstSortOrder(AstOption): options = {"nearest", "furthest", "random", "arbitrary"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstGamemode(AstOption): """Ast gamemode node.""" @@ -531,7 +531,7 @@ class AstGamemode(AstOption): options = {"adventure", "creative", "spectator", "survival"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstEntityAnchor(AstOption): """Ast entity anchor node.""" @@ -539,7 +539,7 @@ class AstEntityAnchor(AstOption): options = {"eyes", "feet"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTemplateRotation(AstOption): """Ast template rotation node.""" @@ -547,7 +547,7 @@ class AstTemplateRotation(AstOption): options = {"180", "clockwise_90", "counterclockwise_90", "none"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTemplateMirror(AstOption): """Ast template mirror node.""" @@ -555,7 +555,7 @@ class AstTemplateMirror(AstOption): options = {"front_back", "left_right", "none"} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstJson(AstNode): """Base ast node for json.""" @@ -588,7 +588,7 @@ def from_value(cls, value: Any) -> "AstJson": raise ValueError(f"Invalid json value of type {type(value)!r}.") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstJsonValue(AstJson): """Ast json value node.""" @@ -600,7 +600,7 @@ def evaluate(self) -> Any: return self.value -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstJsonArray(AstJson): """Ast json array node.""" @@ -612,14 +612,14 @@ def evaluate(self) -> Any: return [element.evaluate() for element in self.elements] -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstJsonObjectKey(AstNode): """Ast json object key node.""" value: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstJsonObjectEntry(AstNode): """Ast json object entry node.""" @@ -627,7 +627,7 @@ class AstJsonObjectEntry(AstNode): value: AstJson = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstJsonObject(AstJson): """Ast json object node.""" @@ -639,7 +639,7 @@ def evaluate(self) -> Any: return {entry.key.value: entry.value.evaluate() for entry in self.entries} -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbt(AstNode): """Base ast node for nbt.""" @@ -712,7 +712,7 @@ def from_value(cls, value: Any) -> "AstNbt": raise ValueError(f"Invalid nbt value of type {type(value)!r}.") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtValue(AstNbt): """Ast nbt value node.""" @@ -724,7 +724,7 @@ def evaluate(self) -> Any: return self.value -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtList(AstNbt): """Ast nbt list node.""" @@ -736,14 +736,14 @@ def evaluate(self) -> Any: return ListTag([element.evaluate() for element in self.elements]) # type: ignore -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtCompoundKey(AstNode): """Ast nbt compound key node.""" value: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtCompoundEntry(AstNode): """Ast nbt compound entry node.""" @@ -751,7 +751,7 @@ class AstNbtCompoundEntry(AstNode): value: AstNbt = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtCompound(AstNbt): """Ast nbt compound node.""" @@ -765,7 +765,7 @@ def evaluate(self) -> Any: ) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtByteArray(AstNbt): """Ast nbt byte array node.""" @@ -777,7 +777,7 @@ def evaluate(self) -> Any: return ByteArray([element.evaluate() for element in self.elements]) # type: ignore -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtIntArray(AstNbt): """Ast nbt int array node.""" @@ -789,7 +789,7 @@ def evaluate(self) -> Any: return IntArray([element.evaluate() for element in self.elements]) # type: ignore -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtLongArray(AstNbt): """Ast nbt long array node.""" @@ -801,7 +801,7 @@ def evaluate(self) -> Any: return LongArray([element.evaluate() for element in self.elements]) # type: ignore -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstResourceLocation(AstNode): """Ast resource location node.""" @@ -833,7 +833,7 @@ def get_canonical_value(self) -> str: return prefix + namespace + self.path -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstBlockState(AstNode): """Ast block state node.""" @@ -841,7 +841,7 @@ class AstBlockState(AstNode): value: AstString = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstBlock(AstNode): """Ast block node.""" @@ -850,7 +850,7 @@ class AstBlock(AstNode): data_tags: Optional[AstNbt] = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstItem(AstNode): """Ast item node.""" @@ -858,7 +858,7 @@ class AstItem(AstNode): data_tags: Optional[AstNbt] = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstItemSlot(AstOption): """Ast item slot node.""" @@ -883,7 +883,7 @@ class AstItemSlot(AstOption): ) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstRange(AstNode): """Ast range node.""" @@ -934,7 +934,7 @@ def from_value( ) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTime(AstNode): """Ast time node.""" @@ -962,7 +962,7 @@ def from_value(cls, value: Union[str, int, float]) -> "AstTime": return cls(value=value, unit=unit) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelectorScoreMatch(AstNode): """Ast selector score match node.""" @@ -970,14 +970,14 @@ class AstSelectorScoreMatch(AstNode): value: AstRange = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelectorScores(AstNode): """Ast selector scores node.""" scores: AstChildren[AstSelectorScoreMatch] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelectorAdvancementPredicateMatch(AstNode): """Ast selector advancement predicate match node.""" @@ -985,7 +985,7 @@ class AstSelectorAdvancementPredicateMatch(AstNode): value: AstBool = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelectorAdvancementMatch(AstNode): """Ast selector advancement match node.""" @@ -995,14 +995,14 @@ class AstSelectorAdvancementMatch(AstNode): ] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelectorAdvancements(AstNode): """Ast selector advancements node.""" advancements: AstChildren[AstSelectorAdvancementMatch] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelectorArgument(AstNode): """Ast selector argument node.""" @@ -1011,7 +1011,7 @@ class AstSelectorArgument(AstNode): value: Optional[AstNode] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSelector(AstNode): """Ast selector node.""" @@ -1021,7 +1021,7 @@ class AstSelector(AstNode): parser = "selector" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMessageText(AstLiteral): """Ast message text node.""" @@ -1029,7 +1029,7 @@ class AstMessageText(AstLiteral): regex = re.compile(r".+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMessage(AstNode): """Ast message node.""" @@ -1041,21 +1041,21 @@ def from_value(cls, obj: Any) -> "AstMessage": return AstMessage(fragments=AstChildren([AstMessageText.from_value(obj)])) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtPathKey(AstNode): """Ast nbt path key node.""" value: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtPathSubscript(AstNode): """Ast nbt path subscript node.""" index: Union[None, AstNumber, AstNbtCompound] = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstNbtPath(AstNode): """Ast nbt path node.""" @@ -1104,12 +1104,12 @@ def from_value(cls, value: Any) -> "AstNbtPath": return AstNbtPath(components=AstChildren(components)) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstParticleParameters(AstNode): """Base ast node for particle parameters.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDustParticleParameters(AstParticleParameters): """Ast dust particle parameters node.""" @@ -1119,7 +1119,7 @@ class AstDustParticleParameters(AstParticleParameters): size: AstNumber = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDustColorTransitionParticleParameters(AstParticleParameters): """Ast dust color transition particle parameters node.""" @@ -1132,28 +1132,28 @@ class AstDustColorTransitionParticleParameters(AstParticleParameters): end_blue: AstNumber = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstBlockParticleParameters(AstParticleParameters): """Ast block particle parameters node.""" block: AstBlock = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFallingDustParticleParameters(AstParticleParameters): """Ast falling dust particle parameters node.""" block: AstBlock = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstItemParticleParameters(AstParticleParameters): """Ast item particle parameters node.""" item: AstItem = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstVibrationParticleParameters(AstParticleParameters): """Ast vibration particle parameters node.""" @@ -1166,14 +1166,14 @@ class AstVibrationParticleParameters(AstParticleParameters): duration: AstNumber = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstBlockMarkerParticleParameters(AstParticleParameters): """Ast block marker particle parameters node.""" block: AstBlock = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstParticle(AstNode): """Ast particle node.""" diff --git a/packages/mecha/mecha/contrib/messages.py b/packages/mecha/mecha/contrib/messages.py index d23d55548..7c69ca0aa 100644 --- a/packages/mecha/mecha/contrib/messages.py +++ b/packages/mecha/mecha/contrib/messages.py @@ -30,14 +30,14 @@ ) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMessageReferencePath(AstNode): """Ast message reference path node.""" value: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMessageReference(AstNode): """Ast message reference node.""" diff --git a/packages/mecha/mecha/contrib/source_map.py b/packages/mecha/mecha/contrib/source_map.py index 5a6a3892c..4766b079a 100644 --- a/packages/mecha/mecha/contrib/source_map.py +++ b/packages/mecha/mecha/contrib/source_map.py @@ -53,7 +53,7 @@ def source_map(ctx: Context, opts: SourceMapOptions): mc.serialize.extend(SourceMapSerializer()) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSourceMap(AstCommandSentinel): """Ast source map node.""" From f1dbc3a2347ab4de20c60a28bd0d6481e923ca38 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Jan 2023 23:09:20 +0000 Subject: [PATCH 1101/1554] 0.62.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 67fe3eeb4..d8cc6d90d 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.62.2 (2023-01-29) +### Fix +* Use slots for ast nodes ([`940854e`](https://github.com/mcbeet/mecha/commit/940854e4756a5001f62bc53770edd2a55f1daf90)) +* Stop using importlib.resources.read_text ([`6c6b965`](https://github.com/mcbeet/mecha/commit/6c6b965a15594669641f1a595c8d16c9b1564a06)) + ## v0.62.1 (2023-01-29) ### Fix * Make it possible to start compiling from a custom initial step ([`f2037ad`](https://github.com/mcbeet/mecha/commit/f2037ad8a8422cca386833db0da24bc3e6250031)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index eb1ce0453..844dbdec0 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.62.1" +__version__ = "0.62.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index cfa1d8b52..5e4767f3c 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.62.1" +version = "0.62.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From d504fdaf408a595388a1a4428ab09e8c77a204ec Mon Sep 17 00:00:00 2001 From: CarbonSmasher <110303487+CarbonSmasher@users.noreply.github.com> Date: Sun, 29 Jan 2023 18:17:44 -0500 Subject: [PATCH 1102/1554] feat: highest protocol version for pickle.dump to improve performance (#232) --- packages/mecha/mecha/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index 7cbb56c4b..a2fe2a6ee 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -85,7 +85,7 @@ def dump_data(self, data: JsonDict, f: BufferedWriter): """Dump the pickled data.""" data["mecha"] = self.version data["python"] = sys.version - pickle.dump(data, f) + pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL) def load(self, f: BufferedReader) -> AstRoot: """Load the ast.""" From 458695ce103b5ff7dcbe226927a1529f6ddd7653 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 29 Jan 2023 23:18:25 +0000 Subject: [PATCH 1103/1554] 0.63.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index d8cc6d90d..63ae7879a 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.63.0 (2023-01-29) +### Feature +* Highest protocol version for pickle.dump to improve performance ([#232](https://github.com/mcbeet/mecha/issues/232)) ([`2045360`](https://github.com/mcbeet/mecha/commit/204536038ea5ae3d3d26f00dc5b5447f1cb5e563)) + ## v0.62.2 (2023-01-29) ### Fix * Use slots for ast nodes ([`940854e`](https://github.com/mcbeet/mecha/commit/940854e4756a5001f62bc53770edd2a55f1daf90)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 844dbdec0..68d5f68e2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.62.2" +__version__ = "0.63.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 5e4767f3c..8ad6fce8e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.62.2" +version = "0.63.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 4b0361fe39ecea5b725962c59cd8a07dd072006f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 30 Jan 2023 01:52:06 +0100 Subject: [PATCH 1104/1554] feat: allow customizing inplace nesting --- packages/mecha/mecha/contrib/nesting.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/mecha/mecha/contrib/nesting.py b/packages/mecha/mecha/contrib/nesting.py index 565e7c642..f49b593d9 100644 --- a/packages/mecha/mecha/contrib/nesting.py +++ b/packages/mecha/mecha/contrib/nesting.py @@ -3,6 +3,7 @@ __all__ = [ "NestedCommandsTransformer", + "InplaceNestingPredicate", "NestingOptions", "nesting", "parse_nested_root", @@ -11,9 +12,9 @@ from dataclasses import dataclass, replace from importlib.resources import files -from typing import List, cast +from typing import Any, Callable, List, cast -from beet import Context, Function, Generator, configurable +from beet import Context, Function, Generator, TextFileBase, configurable from beet.core.utils import required_field from jinja2 import Template from pydantic import BaseModel @@ -67,6 +68,7 @@ def nesting(ctx: Context, opts: NestingOptions): generate=ctx.generate, database=mc.database, generate_execute_template=ctx.template.compile(opts.generate_execute), + inplace_nesting_predicate=ctx.inject(InplaceNestingPredicate), ) ) @@ -104,6 +106,16 @@ def parse_nested_root(stream: TokenStream) -> AstRoot: return set_location(node, commands[0], commands[-1]) +class InplaceNestingPredicate: + """Overridable predicate for enabling inplace nesting.""" + + callback: Callable[[TextFileBase[Any]], bool] + + def __init__(self, ctx: Context): + mc = ctx.inject(Mecha) + self.callback = lambda target: target is mc.database.current + + @dataclass class NestedCommandsTransformer(MutatingReducer): """Transformer that handles nested commands.""" @@ -111,6 +123,7 @@ class NestedCommandsTransformer(MutatingReducer): generate: Generator = required_field() database: CompilationDatabase = required_field() generate_execute_template: Template = required_field() + inplace_nesting_predicate: InplaceNestingPredicate = required_field() def emit_function(self, path: str, root: AstRoot): """Helper method for emitting nested commands into a separate function.""" @@ -289,7 +302,7 @@ def handle_function( ) raise set_location(d, name) - elif target is self.database.current: + elif self.inplace_nesting_predicate.callback(target): if node.identifier == "prepend:function:name:commands": d = Diagnostic( "error", From 60fcb31acdb3340110ba84f7032ffc6bcb3e7153 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 30 Jan 2023 02:18:36 +0100 Subject: [PATCH 1105/1554] feat: add mecha.contrib.raw --- packages/mecha/examples/basic_raw/beet.yml | 6 +++ .../src/data/demo/functions/foo.mcfunction | 2 + packages/mecha/mecha/contrib/raw.py | 45 +++++++++++++++++++ .../examples__build_basic_raw__0.pack.md | 23 ++++++++++ 4 files changed, 76 insertions(+) create mode 100644 packages/mecha/examples/basic_raw/beet.yml create mode 100644 packages/mecha/examples/basic_raw/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/contrib/raw.py create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md diff --git a/packages/mecha/examples/basic_raw/beet.yml b/packages/mecha/examples/basic_raw/beet.yml new file mode 100644 index 000000000..7d52e64bd --- /dev/null +++ b/packages/mecha/examples/basic_raw/beet.yml @@ -0,0 +1,6 @@ +require: + - mecha.contrib.raw +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/mecha/examples/basic_raw/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_raw/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..9e5b1e5b5 --- /dev/null +++ b/packages/mecha/examples/basic_raw/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,2 @@ +raw say something +execute as @a run raw say @s diff --git a/packages/mecha/mecha/contrib/raw.py b/packages/mecha/mecha/contrib/raw.py new file mode 100644 index 000000000..c7efcb80f --- /dev/null +++ b/packages/mecha/mecha/contrib/raw.py @@ -0,0 +1,45 @@ +"""Plugin for inserting raw commands.""" + + +__all__ = [ + "RawCommandSerializer", +] + + +from typing import List + +from beet import Context + +from mecha import AstCommand, AstGreedy, Mecha, Visitor, rule + +RAW_COMMAND_TREE = { + "type": "root", + "children": { + "raw": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": True, + "parser": "brigadier:string", + "properties": { + "type": "greedy", + }, + } + }, + }, + }, +} + + +def beet_default(ctx: Context): + mc = ctx.inject(Mecha) + mc.spec.add_commands(RAW_COMMAND_TREE) + mc.serialize.extend(RawCommandSerializer()) + + +class RawCommandSerializer(Visitor): + @rule(AstCommand, identifier="raw:value") + def raw_command(self, node: AstCommand, result: List[str]): + if isinstance(command := node.arguments[0], AstGreedy): + result.append(command.value) diff --git a/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md new file mode 100644 index 000000000..448387094 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md @@ -0,0 +1,23 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say something +execute as @a run say @s +``` From 4fd7cbbb384103cff84fa60ae5cf214f0be8b0ad Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 30 Jan 2023 01:19:43 +0000 Subject: [PATCH 1106/1554] 0.64.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 5 +++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 63ae7879a..ffc65b288 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,11 @@ +## v0.64.0 (2023-01-30) +### Feature +* Add mecha.contrib.raw ([`ec018dc`](https://github.com/mcbeet/mecha/commit/ec018dc67edf725c7c0b943260da11f9fda57986)) +* Allow customizing inplace nesting ([`1ef7539`](https://github.com/mcbeet/mecha/commit/1ef75398b7447cfb2161393786382cfe734f02cb)) + ## v0.63.0 (2023-01-29) ### Feature * Highest protocol version for pickle.dump to improve performance ([#232](https://github.com/mcbeet/mecha/issues/232)) ([`2045360`](https://github.com/mcbeet/mecha/commit/204536038ea5ae3d3d26f00dc5b5447f1cb5e563)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 68d5f68e2..3ae314103 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.63.0" +__version__ = "0.64.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 8ad6fce8e..43aafa440 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.63.0" +version = "0.64.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 838c851c5ff88ab21ff9bf10f8cceb6b3f38f133 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Jan 2023 02:04:50 +0100 Subject: [PATCH 1107/1554] feat: add memo and a bunch of tweaks --- packages/bolt/bolt/__init__.py | 3 +- packages/bolt/bolt/ast.py | 122 +- packages/bolt/bolt/codegen.py | 50 + packages/bolt/bolt/commands.py | 165 ++ packages/bolt/bolt/contrib/defer.py | 4 +- packages/bolt/bolt/{collect.py => emit.py} | 6 +- packages/bolt/bolt/memo.py | 394 ++++ packages/bolt/bolt/parse.py | 76 +- packages/bolt/bolt/resources/commands.json | 15 + packages/bolt/bolt/runtime.py | 25 +- packages/bolt/bolt/utils.py | 8 +- packages/bolt/examples/bolt_memo/beet.yml | 27 + .../src/data/demo/functions/bar.mcfunction | 40 + .../src/data/demo/functions/foo.mcfunction | 18 + packages/bolt/poetry.lock | 1102 +++++------ packages/bolt/pyproject.toml | 7 +- .../tests/resources/bolt_examples.mcfunction | 51 + .../tests/snapshots/bolt__parse_230__0.txt | 2 +- .../tests/snapshots/bolt__parse_306__0.txt | 4 + .../tests/snapshots/bolt__parse_307__0.txt | 5 + .../tests/snapshots/bolt__parse_308__0.txt | 7 + .../tests/snapshots/bolt__parse_309__0.txt | 9 + .../tests/snapshots/bolt__parse_310__0.txt | 7 + .../tests/snapshots/bolt__parse_311__0.txt | 7 + .../tests/snapshots/bolt__parse_312__0.txt | 9 + .../tests/snapshots/bolt__parse_313__0.txt | 52 + .../tests/snapshots/bolt__parse_313__1.txt | 38 + .../tests/snapshots/bolt__parse_314__0.txt | 47 + .../tests/snapshots/bolt__parse_314__1.txt | 38 + .../tests/snapshots/bolt__parse_315__0.txt | 80 + .../tests/snapshots/bolt__parse_315__1.txt | 75 + .../tests/snapshots/bolt__parse_316__0.txt | 41 + .../tests/snapshots/bolt__parse_316__1.txt | 49 + .../tests/snapshots/bolt__parse_317__0.txt | 140 ++ .../tests/snapshots/bolt__parse_317__1.txt | 89 + .../tests/snapshots/bolt__parse_318__0.txt | 41 + .../tests/snapshots/bolt__parse_318__1.txt | 33 + .../tests/snapshots/bolt__parse_319__0.txt | 117 ++ .../tests/snapshots/bolt__parse_319__1.txt | 70 + .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_99__0.txt | 2 +- .../examples__build_bolt_memo__0.pack.md | 1610 +++++++++++++++++ .../tests/snapshots/spec__prototypes__0.json | 5 + packages/bolt/tests/test_bolt.py | 9 +- packages/bolt/tests/test_examples.py | 10 +- 45 files changed, 4084 insertions(+), 627 deletions(-) create mode 100644 packages/bolt/bolt/commands.py rename packages/bolt/bolt/{collect.py => emit.py} (96%) create mode 100644 packages/bolt/bolt/memo.py create mode 100644 packages/bolt/examples/bolt_memo/beet.yml create mode 100644 packages/bolt/examples/bolt_memo/src/data/demo/functions/bar.mcfunction create mode 100644 packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_306__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_307__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_308__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_309__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_310__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_311__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_312__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_313__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_313__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_314__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_314__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_315__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_315__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_316__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_316__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_317__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_317__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_318__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_318__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_319__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_319__1.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 0a50cbdb7..bbfeacce5 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -3,9 +3,10 @@ from .ast import * from .codegen import * -from .collect import * +from .emit import * from .helpers import * from .loop_info import * +from .memo import * from .module import * from .parse import * from .plugin import * diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 6aac7dea6..dee82c77a 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -45,6 +45,8 @@ "AstClassName", "AstClassBases", "AstClassRoot", + "AstMemo", + "AstMemoResult", "AstInterpolation", "AstFromImport", "AstImportedItem", @@ -55,11 +57,13 @@ import re from dataclasses import dataclass from typing import Any, Optional, Union +from uuid import UUID, uuid4 -from beet.core.utils import JsonDict, required_field +from beet.core.utils import JsonDict, extra_field, required_field from mecha import ( AstChildren, AstCommand, + AstCommandSentinel, AstJson, AstLiteral, AstNode, @@ -71,17 +75,17 @@ from .pattern import IDENTIFIER_PATTERN -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstModuleRoot(AstRoot): """Module root ast node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstExpression(AstNode): """Base ast node for expressions.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstExpressionBinary(AstExpression): """Ast expression binary node.""" @@ -90,7 +94,7 @@ class AstExpressionBinary(AstExpression): right: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstExpressionUnary(AstExpression): """Ast expression unary node.""" @@ -98,21 +102,21 @@ class AstExpressionUnary(AstExpression): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstValue(AstExpression): """Ast value node.""" value: Any = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstIdentifier(AstExpression): """Ast identifier node.""" value: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFormatString(AstExpression): """Ast format string node.""" @@ -120,26 +124,26 @@ class AstFormatString(AstExpression): values: AstChildren[AstExpression] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTuple(AstExpression): """Ast tuple node.""" items: AstChildren[AstExpression] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstList(AstExpression): """Ast list node.""" items: AstChildren[AstExpression] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDictUnquotedKey(AstValue): """Ast dict unquoted key node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDictItem(AstNode): """Ast dict item node.""" @@ -147,14 +151,14 @@ class AstDictItem(AstNode): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDict(AstExpression): """Ast dict node.""" items: AstChildren[AstDictItem] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstSlice(AstNode): """Ast slice node.""" @@ -163,7 +167,7 @@ class AstSlice(AstNode): step: Optional[AstExpression] = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstUnpack(AstNode): """Ast unpack node.""" @@ -171,7 +175,7 @@ class AstUnpack(AstNode): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstKeyword(AstNode): """Ast keyword node.""" @@ -179,7 +183,7 @@ class AstKeyword(AstNode): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstAttribute(AstExpression): """Ast attribute node.""" @@ -187,7 +191,7 @@ class AstAttribute(AstExpression): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstLookup(AstExpression): """Ast lookup node.""" @@ -195,7 +199,7 @@ class AstLookup(AstExpression): arguments: AstChildren[Union[AstExpression, AstSlice]] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstCall(AstExpression): """Ast call node.""" @@ -205,12 +209,12 @@ class AstCall(AstExpression): ] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTarget(AstNode): """Base node for targets.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTargetIdentifier(AstTarget): """Ast target identifier node.""" @@ -218,14 +222,14 @@ class AstTargetIdentifier(AstTarget): rebind: bool = False -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTargetUnpack(AstTarget): """Ast target unpack node.""" targets: AstChildren[AstTarget] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTargetAttribute(AstTarget): """Ast target attribute node.""" @@ -233,7 +237,7 @@ class AstTargetAttribute(AstTarget): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstTargetItem(AstTarget): """Ast target item node.""" @@ -241,7 +245,7 @@ class AstTargetItem(AstTarget): arguments: AstChildren[Union[AstExpression, AstSlice]] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstAssignment(AstNode): """Ast assignment node.""" @@ -250,19 +254,19 @@ class AstAssignment(AstNode): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDecorator(AstNode): """Ast decorator node.""" expression: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignatureElement(AstNode): """Base node for function signature element.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignatureArgument(AstFunctionSignatureElement): """Ast function signature argument node.""" @@ -270,31 +274,31 @@ class AstFunctionSignatureArgument(AstFunctionSignatureElement): default: Optional[AstExpression] = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignaturePositionalMarker(AstFunctionSignatureElement): """Ast function signature positional marker node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignatureVariadicArgument(AstFunctionSignatureElement): """Ast function signature variadic argument node.""" name: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignatureVariadicMarker(AstFunctionSignatureElement): """Ast function signature variadic marker node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignatureVariadicKeywordArgument(AstFunctionSignatureElement): """Ast function signature variadic keyword argument node.""" name: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFunctionSignature(AstNode): """Ast function signature node.""" @@ -303,14 +307,14 @@ class AstFunctionSignature(AstNode): arguments: AstChildren[AstFunctionSignatureElement] = AstChildren() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDeferredRoot(AstNode): """Ast deferred root node.""" stream: TokenStream = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacro(AstCommand): """Ast macro node.""" @@ -340,12 +344,12 @@ def get_command_tree(self) -> JsonDict: return tree_root -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacroCall(AstCommand): """Ast macro call node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacroLiteral(AstLiteral): """Ast macro literal node.""" @@ -354,7 +358,7 @@ class AstMacroLiteral(AstLiteral): regex = re.compile(r"[^#:\s()]+") -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacroArgument(AstLiteral): """Ast macro argument node.""" @@ -363,19 +367,19 @@ class AstMacroArgument(AstLiteral): regex = re.compile(IDENTIFIER_PATTERN) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacroMatch(AstNode): """Base node for macro match.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacroMatchLiteral(AstMacroMatch): """Ast macro match literal node.""" match: AstMacroLiteral = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstMacroMatchArgument(AstMacroMatch): """Ast macro match argument node.""" @@ -384,24 +388,24 @@ class AstMacroMatchArgument(AstMacroMatch): match_argument_properties: Optional[AstJson] = None -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstProcMacro(AstMacro): """Ast proc macro node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstProcMacroMarker(AstNode): """Ast proc macro marker node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstProcMacroResult(AstNode): """Ast proc macro result node.""" commands: AstChildren[AstCommand] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstClassName(AstNode): """Ast class name node.""" @@ -409,19 +413,35 @@ class AstClassName(AstNode): value: str = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstClassBases(AstNode): """Ast class bases node.""" inherit: AstChildren[AstExpression] = AstChildren() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstClassRoot(AstRoot): """Ast class root node.""" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) +class AstMemo(AstCommand): + """Ast memo node.""" + + persistent_id: UUID = extra_field(default_factory=uuid4) + + +@dataclass(frozen=True, slots=True) +class AstMemoResult(AstCommandSentinel): + """Ast memo result node.""" + + serialized: str = "" + + compile_hints = {"skip_execute_inline_single_command": True} + + +@dataclass(frozen=True, slots=True) class AstInterpolation(AstNode): """Ast interpolation node.""" @@ -431,14 +451,14 @@ class AstInterpolation(AstNode): value: AstExpression = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstFromImport(AstCommand): """Ast from import node.""" identifier: str = "" -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstImportedItem(AstNode): """Ast imported item node.""" @@ -446,7 +466,7 @@ class AstImportedItem(AstNode): identifier: bool = True -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstImportedMacro(AstNode): """Ast imported macro node.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index c2083fddf..39c8d4450 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -67,6 +67,7 @@ AstMacro, AstMacroCall, AstMacroMatchArgument, + AstMemo, AstProcMacro, AstSlice, AstTarget, @@ -89,6 +90,7 @@ class Accumulator: refs: List[Any] = field(default_factory=list) macros: MacroLibrary = field(default_factory=dict) macro_ids: Dict[str, int] = field(default_factory=dict) + memo_index: Dict[AstMemo, int] = field(default_factory=dict) lines: List[str] = field(default_factory=list) counter: int = 0 header: Dict[str, str] = field(default_factory=dict) @@ -499,6 +501,54 @@ def statement( yield node.arguments[0] return [] + @rule(AstMemo) + def memo( + self, + node: AstMemo, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + file_index = acc.memo_index.setdefault(node, 0) + acc.memo_index[node] = file_index + 1 + + keys: List[str] = [] + + *arguments, body = node.arguments + for arg in arguments: + if isinstance(arg, AstAssignment): + target = cast(AstTargetIdentifier, arg.target) + yield arg + keys.append(f"{target.value},") + else: + value = yield from visit_single(arg, required=True) + keys.append(f"{value},") + + storage = f"_bolt_memo_storage_{node.persistent_id.hex}" + acc.header[storage] = "None" + if not acc.root_scope: + acc.statement(f"global {storage}", lineno=node) + acc.statement(f"if {storage} is None:") + with acc.block(): + acc.statement( + f"{storage} = _bolt_runtime.memo.registry[__file__][{acc.make_ref(node)}, {file_index}]" + ) + + invocation = f"_bolt_memo_invocation_{node.persistent_id.hex}" + acc.statement(f"{invocation} = {storage}[({' '.join(keys)})]") + + acc.statement(f"if {invocation}.cached:") + with acc.block(): + acc.statement(f"_bolt_runtime.memo.restore(_bolt_runtime, {invocation})") + + acc.statement("else:") + with acc.block(): + acc.statement( + f"with _bolt_runtime.memo.record(_bolt_runtime, {invocation}, __name__):" + ) + with acc.block(): + yield from visit_body(cast(AstRoot, body), acc) + + return [] + @rule(AstCommand, identifier="def:function:body") def function( self, diff --git a/packages/bolt/bolt/commands.py b/packages/bolt/bolt/commands.py new file mode 100644 index 000000000..ca9a4fbd3 --- /dev/null +++ b/packages/bolt/bolt/commands.py @@ -0,0 +1,165 @@ +import os +from pathlib import Path +from pprint import pformat +from typing import Iterable, Optional, Tuple + +import click +from beet import Project +from beet.core.utils import format_directory +from beet.toolchain.cli import beet, message_fence + +from bolt import AstMemo, MemoRegistry, MemoStorage + +pass_project = click.make_pass_decorator(Project) # type: ignore + + +@beet.command() +@pass_project +@click.option( + "-c", + "--clear", + is_flag=True, + help="Clear cached memo.", +) +@click.option( + "--gc", + is_flag=True, + help="Garbage-collect unused invocations.", +) +@click.option( + "--gc-interval", + type=int, + help="Set garbage collection interval.", +) +@click.option( + "--gc-max-age", + type=int, + help="Set garbage collection max age.", +) +@click.argument( + "filenames", + nargs=-1, +) +def memo( + project: Project, + clear: bool, + gc: bool, + gc_interval: Optional[int], + gc_max_age: Optional[int], + filenames: Tuple[str, ...], +): + """Inspect and manage bolt memo storage.""" + memo_registry = MemoRegistry(project.cache) + + if gc_interval is not None or gc_max_age is not None: + if clear or gc or filenames: + raise click.UsageError( + "GC settings must be provided without any other argument.", + ) + with message_fence("Updating GC settings..."): + if gc_interval is not None: + memo_registry.gc_interval = gc_interval + click.echo( + f"Set garbage collection interval to {gc_interval} epoch{(gc_interval > 1) * 's'}.\n" + ) + if gc_max_age is not None: + memo_registry.gc_max_age = gc_max_age + click.echo( + f"Set garbage collection max age to {gc_max_age} epoch{(gc_max_age > 1) * 's'}.\n" + ) + project.cache.flush() + return + + keys = [ + str(path) if (path := Path(filename).resolve()).is_file() else filename + for filename in filenames + ] or list(memo_registry.keys()) + + with message_fence( + "Clearing memo..." + if clear + else "Running garbage collection..." + if gc + else "Inspecting memo..." + ): + if not keys: + click.echo("The memo registry is empty.\n") + return + + if clear: + for key in keys: + click.echo( + f'Clear memo for "{os.path.relpath(key, project.directory)}".\n' + ) + del memo_registry[key] + memo_registry.flush() + project.cache.flush() + return + + if gc: + for memo_id, state_id in memo_registry.garbage_collect(*keys): + click.echo(f'GC "{memo_id.hex}/{hex(state_id)}".\n') + memo_registry.flush() + project.cache.flush() + return + + n = len(keys) + click.echo(f"Looking up {n} file{(n > 1) * 's'} in the registry.\n") + + for key in keys: + memo_file_index = memo_registry[key] + if not memo_file_index: + click.echo( + f'No entries associated with "{os.path.relpath(key, project.directory)}".\n' + ) + continue + + click.echo( + os.path.relpath(key, project.directory) if os.path.isabs(key) else key + ) + + for key, storage in memo_file_index.items(): + if isinstance(key, tuple): + click.echo(" |") + for line in generate_summary(project.directory, key[0], storage): + click.echo(f" | {line}".rstrip()) + + click.echo() + + +def generate_summary( + project_directory: Path, + memo: AstMemo, + storage: MemoStorage, +) -> Iterable[str]: + yield f"line {storage.memo_lineno}:" + yield f" id = {storage.memo_id.hex}" + + yield "" + yield from memo.dump( + prefix=" ", + shallow=True, + exclude={"location", "end_location", "persistent_id"}, + ).splitlines() + + yield "" + yield " invocations =" + + if not storage: + yield " None" + return + + for variable, invocation in storage.items(): + for line in pformat(variable).splitlines(): + yield f" {line}" + yield f" cached = {invocation.cached}" + yield f" epoch = {invocation.epoch}" + + directory = invocation.locate_directory() + + if directory and directory.is_dir(): + yield f" directory = {os.path.relpath(directory, project_directory)}" + for line in format_directory(directory): # type: ignore + yield f" {line}" + else: + yield f" directory = None" diff --git a/packages/bolt/bolt/contrib/defer.py b/packages/bolt/bolt/contrib/defer.py index e14f553e3..c90ba414d 100644 --- a/packages/bolt/bolt/contrib/defer.py +++ b/packages/bolt/bolt/contrib/defer.py @@ -42,14 +42,14 @@ def defer(ctx: Context): runtime.expose("defer", defer) -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDefer(AstNode): """Ast defer node.""" callback: Callable[[], Any] = required_field() -@dataclass(frozen=True) +@dataclass(frozen=True, slots=True) class AstDeferCommand(AstCommandSentinel): """Ast defer command node. diff --git a/packages/bolt/bolt/collect.py b/packages/bolt/bolt/emit.py similarity index 96% rename from packages/bolt/bolt/collect.py rename to packages/bolt/bolt/emit.py index 3d131b2e5..569d4183c 100644 --- a/packages/bolt/bolt/collect.py +++ b/packages/bolt/bolt/emit.py @@ -1,5 +1,5 @@ __all__ = [ - "CommandCollector", + "CommandEmitter", ] @@ -13,8 +13,8 @@ P = ParamSpec("P") -class CommandCollector: - """Command collector.""" +class CommandEmitter: + """Command emitter.""" commands: List[AstCommand] diff --git a/packages/bolt/bolt/memo.py b/packages/bolt/bolt/memo.py new file mode 100644 index 000000000..bd73328c7 --- /dev/null +++ b/packages/bolt/bolt/memo.py @@ -0,0 +1,394 @@ +__all__ = [ + "MemoHandler", + "MemoRegistry", + "MemoFileIndex", + "MemoStorage", + "MemoInvocation", + "MemoState", +] + + +import logging +import pickle +from contextlib import contextmanager +from dataclasses import dataclass +from pathlib import Path +from typing import ( + Any, + Callable, + ClassVar, + Generic, + Iterator, + List, + Optional, + Set, + Tuple, + Type, + TypeVar, + Union, +) +from uuid import UUID + +from beet import ( + Cache, + CachePin, + Container, + Context, + DataPack, + Generator, + MultiCache, + ResourcePack, +) +from beet.core.utils import log_time, remove_path +from mecha import AstChildren, AstRoot, DiagnosticCollection, Mecha, rule +from mecha.contrib.nesting import InplaceNestingPredicate + +from .ast import AstMemo, AstMemoResult +from .emit import CommandEmitter + +logger = logging.getLogger("memo") + + +T = TypeVar("T") + + +@dataclass +class MemoState(Generic[T]): + load: Callable[[Path], T] + dump: Callable[[Path, T], Any] + default: Callable[[], T] + + cached_field_name: str = "cached_{}" + + def __set_name__(self, owner: Type["MemoInvocation"], name: str): + self.cached_field_name = self.cached_field_name.format(name) + + def __get__(self, obj: "MemoInvocation", objtype: Type["MemoInvocation"]) -> T: + value = getattr(obj, self.cached_field_name, None) + if value is None: + if ( + obj.cached + and (directory := obj.locate_directory()) + and (path := directory / self.cached_field_name).exists() + ): + logger.debug( + 'Load "%s" for invocation "%s/%s".', + self.cached_field_name, + obj.parent.memo_id.hex, + hex(obj.state_id), + ) + value = self.load(path) + else: + value = self.default() + setattr(obj, self.cached_field_name, value) + return value + + def __set__(self, obj: "MemoInvocation", value: T): + if obj.cached and (directory := obj.locate_directory()): + logger.debug( + 'Persist "%s" for invocation "%s/%s".', + self.cached_field_name, + obj.parent.memo_id.hex, + hex(obj.state_id), + ) + directory.mkdir(parents=True, exist_ok=True) + self.dump(directory / self.cached_field_name, value) + setattr(obj, self.cached_field_name, value) + + +class MemoInvocation: + parent: "MemoStorage" + state_id: int + cached: bool + epoch: int + + def __init__(self, parent: "MemoStorage", state_id: int): + self.parent = parent + self.state_id = state_id + self.cached = False + self.epoch = 0 + + output: ClassVar[MemoState[str]] = MemoState( + load=Path.read_text, + dump=Path.write_text, + default=str, + ) + + resource_pack: ClassVar[MemoState[ResourcePack]] = MemoState( + load=lambda p: ResourcePack(path=p), + dump=lambda p, pack: pack.save(path=p), + default=ResourcePack, + ) + + data_pack: ClassVar[MemoState[DataPack]] = MemoState( + load=lambda p: DataPack(path=p), + dump=lambda p, pack: pack.save(path=p), + default=DataPack, + ) + + def __getstate__(self) -> Tuple["MemoStorage", int, bool, int]: + return self.parent, self.state_id, self.cached, self.epoch + + def __setstate__(self, state: Tuple["MemoStorage", int, bool, int]): + self.parent, self.state_id, self.cached, self.epoch = state + + def locate_directory(self) -> Optional[Path]: + if path := self.parent.locate_directory(): + return path / hex(self.state_id) + return None + + +class MemoStorage(Container[Tuple[Any, ...], MemoInvocation]): + parent: "MemoFileIndex" + memo_id: UUID + memo_lineno: int + invocation_counter: int + + def __init__(self, parent: "MemoFileIndex", memo_id: UUID, lineno: int = -1): + super().__init__() + self.parent = parent + self.memo_id = memo_id + self.memo_lineno = lineno + self.invocation_counter = 0 + + def __delitem__(self, key: Tuple[Any, ...]): + if directory := self[key].locate_directory(): + remove_path(directory) + super().__delitem__(key) + + def missing(self, key: Tuple[Any, ...]) -> MemoInvocation: + self.invocation_counter += 1 + return MemoInvocation(parent=self, state_id=self.invocation_counter) + + def locate_directory(self) -> Optional[Path]: + if path := self.parent.path: + return path.with_name(self.memo_id.hex) + return None + + +class MemoFileIndex(Container[Union[Tuple[AstMemo, int], UUID], MemoStorage]): + filename: str + path: Optional[Path] + + def __init__(self, filename: str, path: Optional[Path] = None): + super().__init__() + self.filename = filename + self.path = path + + def __getitem__(self, key: Union[Tuple[AstMemo, int], UUID]) -> MemoStorage: + if isinstance(key, UUID): + return super().__getitem__(key) + + memo = key[0] + + storage = self.get(memo.persistent_id) + if storage is None: + storage = super().__getitem__(key) + storage.memo_lineno = memo.location.lineno + self[memo.persistent_id] = storage + + return storage + + def __delitem__(self, key: Union[Tuple[AstMemo, int], UUID]): + if isinstance(key, UUID): + super().__delitem__(key) + return + if directory := self[key].locate_directory(): + remove_path(directory) + del self[key[0].persistent_id] + super().__delitem__(key) + + def missing(self, key: Union[Tuple[AstMemo, int], UUID]) -> MemoStorage: + if isinstance(key, UUID): + return super().missing(key) + return MemoStorage(self, key[0].persistent_id) + + def clear(self): + super().clear() + if self.path: + remove_path(self.path) + + def garbage_collect(self, gc_cutoff: int) -> Iterator[Tuple[UUID, int]]: + keep_alive: Set[UUID] = set() + + for storage_key, storage in self.items(): + if isinstance(storage_key, UUID): + for variables, invocation in list(storage.items()): + if not invocation.cached or invocation.epoch < gc_cutoff: + yield storage.memo_id, invocation.state_id + del storage[variables] + if storage: + keep_alive.add(storage_key) + + for storage_key in list(self): + if ( + isinstance(storage_key, tuple) + and storage_key[0].persistent_id not in keep_alive + ): + del self[storage_key] + + for storage_key in list(self): + if isinstance(storage_key, UUID) and storage_key not in keep_alive: + del self[storage_key] + + +class MemoRegistry(Container[str, MemoFileIndex]): + cache: Optional[Cache] + + epoch_counter: ClassVar[CachePin[int]] = CachePin("epoch_counter", 0) + gc_epoch: ClassVar[CachePin[int]] = CachePin("gc_epoch", 0) + gc_interval: ClassVar[CachePin[int]] = CachePin("gc_interval", 50) + gc_max_age: ClassVar[CachePin[int]] = CachePin("gc_max_age", 30) + + def __init__(self, arg: Union[Context, MultiCache[Any], Optional[Cache]] = None): + super().__init__() + arg = arg.cache if isinstance(arg, Context) else arg + self.cache = arg["memo"] if isinstance(arg, MultiCache) else arg + + def __setitem__(self, key: str, value: MemoFileIndex): + super().__setitem__(key, value) + if self.cache: + self.cache.json.setdefault("files", {})[key] = str(value.path) + + def __delitem__(self, key: str): + self[key].clear() + if self.cache: + del self.cache.json.setdefault("files", {})[key] + super().__delitem__(key) + + def __iter__(self) -> Iterator[str]: + if self.cache: + for key in self.cache.json.setdefault("files", {}): + yield key + + def missing(self, key: str) -> MemoFileIndex: + if not self.cache: + return MemoFileIndex(key) + + index_path = self.cache.get_path(f"{key}-memo") + if index_path.is_file(): + with index_path.open("rb") as f: + if isinstance(memo_file_index := pickle.load(f), MemoFileIndex): + memo_file_index.path = index_path + return memo_file_index + + return MemoFileIndex(key, index_path) + + def flush(self): + for memo_file_index in self.values(): + if memo_file_index.path: + with memo_file_index.path.open("wb") as f: + pickle.dump(memo_file_index, f, protocol=pickle.HIGHEST_PROTOCOL) + + @property + def gc_cutoff(self) -> int: + return self.epoch_counter - self.gc_max_age + + def garbage_collect(self, *keys: str) -> Iterator[Tuple[UUID, int]]: + for key in keys: + file_index = self[key] + yield from file_index.garbage_collect(self.gc_cutoff) + if not file_index: + del self[key] + self.gc_epoch = self.epoch_counter + + +@dataclass +class MemoHandler: + mc: Mecha + registry: MemoRegistry + generate: Optional[Generator] = None + inplace_nesting_predicate: Optional[InplaceNestingPredicate] = None + + def __post_init__(self): + self.mc.serialize.extend(serialize_memo_result) + + def restore(self, emit: CommandEmitter, invocation: MemoInvocation): + if not self.generate or not self.inplace_nesting_predicate: + return + + invocation.epoch = self.registry.epoch_counter + + if output := invocation.output: + emit.commands.append(AstMemoResult(serialized=output)) + + self.generate.assets.merge(invocation.resource_pack) + self.generate.data.merge(invocation.data_pack) + + @contextmanager + def record( + self, + emit: CommandEmitter, + invocation: MemoInvocation, + name: Optional[str] = None, + ): + if not self.generate or not self.inplace_nesting_predicate or not name: + yield + return + + database = self.mc.database + source = database.index[name] + compilation_unit = database[source] + + with self.generate.draft() as draft, draft.push(): + with emit.scope() as commands: + yield + + root = AstRoot(commands=AstChildren(commands)) + + diagnostics = DiagnosticCollection() + + previous_session = database.session + previous_queue = database.queue + previous_step = database.step + previous_current = database.current + previous_callback = self.inplace_nesting_predicate.callback + try: + database.session = set() + database.queue = [] + self.inplace_nesting_predicate.callback = ( + lambda target: previous_callback(target) + or target is previous_current + ) + function = self.mc.compile( + root, + report=diagnostics, + initial_step=database.step + 1, + ) + finally: + previous_session.update(database.session) + database.session = previous_session + database.queue = previous_queue + database.step = previous_step + database.current = previous_current + self.inplace_nesting_predicate.callback = previous_callback + + if output := function.text.rstrip(): + emit.commands.append(AstMemoResult(serialized=output)) + + database[function].source = compilation_unit.source + + if not diagnostics.exceptions: + invocation.epoch = self.registry.epoch_counter + invocation.cached = True + + if output: + invocation.output = output + if draft.assets: + invocation.resource_pack = draft.assets + if draft.data: + invocation.data_pack = draft.data + + def finalize(self): + self.registry.epoch_counter += 1 + next_gc = self.registry.gc_epoch + self.registry.gc_interval + if self.registry.epoch_counter >= next_gc: + with log_time("GC bolt memo."): + for memo_id, state_id in self.registry.garbage_collect(*self.registry): + logger.debug('GC "%s/%s".', memo_id.hex, hex(state_id)) + self.registry.flush() + + +@rule(AstMemoResult) +def serialize_memo_result(node: AstMemoResult, result: List[str]): + result.append(node.serialized) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index f014d1101..c3bfe7992 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -37,6 +37,7 @@ "parse_import_name", "parse_name_list", "GlobalNonlocalHandler", + "FlushPendingBindingsParser", "StatementSubcommandHandler", "DeferredRootBacktracker", "LexicalScopeConstraint", @@ -57,6 +58,7 @@ import re from dataclasses import dataclass, field, replace from typing import Any, Dict, FrozenSet, List, Literal, Optional, Set, Tuple, Type, cast +from uuid import UUID, uuid4 from beet.core.utils import extra_field from mecha import ( @@ -128,6 +130,7 @@ AstMacroMatch, AstMacroMatchArgument, AstMacroMatchLiteral, + AstMemo, AstModuleRoot, AstProcMacro, AstProcMacroMarker, @@ -142,7 +145,7 @@ AstUnpack, AstValue, ) -from .collect import CommandCollector +from .emit import CommandEmitter from .module import Module, ModuleManager, UnusableCompilationUnit from .pattern import ( FALSE_PATTERN, @@ -215,6 +218,7 @@ def get_bolt_parsers( "command:argument:bolt:class_name": delegate("bolt:class_name"), "command:argument:bolt:class_bases": delegate("bolt:class_bases"), "command:argument:bolt:class_root": delegate("bolt:class_root"), + "command:argument:bolt:memo_variable": delegate("bolt:memo_variable"), "command:argument:bolt:del_target": delegate("bolt:del_target"), ################################################################################ # Bolt @@ -289,6 +293,22 @@ def get_bolt_parsers( "bolt:class_name": parse_class_name, "bolt:class_bases": parse_class_bases, "bolt:class_root": FlushPendingBindingsParser(parse_class_root, after=True), + "bolt:memo_variable": TrailingCommaParser( + AlternativeParser( + [ + ForkLexicalScopeParser( + FlushPendingBindingsParser( + AssignmentStatementParser( + AssignmentTargetParser(require_single=True), + binding_only=True, + ), + after=True, + ) + ), + delegate("bolt:interpolation"), + ] + ) + ), "bolt:del_target": parse_del_target, "bolt:interpolation": BuiltinCallRestriction( PrimaryParser(delegate("bolt:identifier"), truncate=True), @@ -594,6 +614,7 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): def create_bolt_command_parser(parser: Parser, modules: ModuleManager): """Compose command parsers.""" + parser = MemoHandler(parser) parser = GlobalNonlocalHandler(parser) parser = ImportStatementHandler(parser, modules) parser = UndefinedIdentifierErrorHandler(parser) @@ -771,6 +792,50 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class MemoHandler: + """Handle memo.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node = self.parser(stream) + + if not isinstance(node, AstCommand): + return node + if node.identifier == "memo:subcommand": + node = self.create_memo(node, stream.data.get("uuid_factory", uuid4)()) + + return node + + def create_memo(self, command: AstCommand, persistent_id: UUID) -> AstMemo: + identifier_parts: List[str] = ["memo"] + arguments: List[AstNode] = [] + + node = command + while isinstance(subcommand := node.arguments[-1], AstCommand): + if isinstance(assignment := node.arguments[0], AstAssignment): + if not isinstance(assignment.target, AstTargetIdentifier): + exc = InvalidSyntax("Assignment target must be an identifier.") + raise set_location(exc, assignment.target) + identifier_parts.append(assignment.target.value) + arguments.append(assignment) + elif isinstance(expression := node.arguments[0], AstExpression): + identifier_parts.append(str(len(arguments))) + arguments.append(expression) + node = subcommand + + arguments.append(node.arguments[0]) + + memo = AstMemo( + identifier=":".join(identifier_parts), + arguments=AstChildren(arguments), + persistent_id=persistent_id, + ) + + return set_location(memo, command) + + def parse_decorator(stream: TokenStream) -> Any: """Parse decorator.""" with stream.syntax(decorator="@"): @@ -1332,7 +1397,7 @@ def __call__(self, stream: TokenStream) -> AstProcMacroResult: identifier: str = properties["identifier"] module = self.modules[resource_location] - runtime: CommandCollector = module.namespace["_bolt_runtime"] + runtime: CommandEmitter = module.namespace["_bolt_runtime"] macro = module.namespace["_bolt_proc_macros"][identifier] with self.modules.error_handler( @@ -1663,7 +1728,12 @@ def __call__(self, stream: TokenStream) -> Any: if self.before: lexical_scope = get_stream_lexical_scope(stream) lexical_scope.flush_pending_bindings() - node = self.parser(stream) + try: + node = self.parser(stream) + except Exception: + lexical_scope = get_stream_lexical_scope(stream) + lexical_scope.pending_bindings.clear() + raise if self.after: lexical_scope = get_stream_lexical_scope(stream) lexical_scope.flush_pending_bindings() diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index fa24df552..5dca548b8 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -113,6 +113,21 @@ } } }, + "memo": { + "type": "literal", + "children": { + "body": { + "type": "argument", + "parser": "mecha:nested_root", + "executable": true + }, + "variable": { + "type": "argument", + "parser": "bolt:memo_variable", + "redirect": ["memo"] + } + } + }, "del": { "type": "literal", "executable": true, diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 5b7e322cf..9ece5a54a 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -14,26 +14,30 @@ from beet import Context, TextFileBase, generate_tree from beet.core.utils import JsonDict, extra_field, required_field from mecha import AstRoot, CommandTree, Diagnostic, Mecha, Visitor, rule +from mecha.contrib.nesting import InplaceNestingPredicate from pathspec import PathSpec from tokenstream import set_location from .ast import AstModuleRoot from .codegen import Codegen -from .collect import CommandCollector +from .emit import CommandEmitter from .helpers import get_bolt_helpers from .loop_info import loop_info +from .memo import MemoHandler, MemoRegistry from .module import CompiledModule, Module, ModuleCacheBackend, ModuleManager from .parse import get_bolt_parsers from .utils import internal -class Runtime(CommandCollector): +class Runtime(CommandEmitter): """The bolt runtime.""" helpers: Dict[str, Any] globals: JsonDict builtins: Set[str] + memo: MemoHandler + modules: ModuleManager evaluate: "Evaluator" @@ -45,6 +49,7 @@ def __init__(self, ctx: Union[Context, Mecha]): if isinstance(ctx, Context): ctx.require( + "mecha.contrib.raw", "mecha.contrib.relative_location", "mecha.contrib.nesting", "mecha.contrib.nested_resources", @@ -80,9 +85,16 @@ def __init__(self, ctx: Union[Context, Mecha]): ) mc = ctx.inject(Mecha) + self.memo = MemoHandler( + mc, + registry=ctx.inject(MemoRegistry), + generate=ctx.generate, + inplace_nesting_predicate=ctx.inject(InplaceNestingPredicate), + ) else: mc = ctx + self.memo = MemoHandler(mc, MemoRegistry()) self.modules = ModuleManager( directory=mc.directory, @@ -136,9 +148,12 @@ def from_module_import(self, resource_location: str, *args: str) -> Any: return values[0] if len(values) == 1 else values def finalize(self, ctx: Context): - """Plugin that removes modules at the end of the build.""" - yield - ctx.data[Module].clear() + """Plugin that runs at the end of the build.""" + try: + yield + finally: + ctx.data[Module].clear() + self.memo.finalize() @dataclass diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py index e430d8540..7a58f171e 100644 --- a/packages/bolt/bolt/utils.py +++ b/packages/bolt/bolt/utils.py @@ -10,14 +10,18 @@ from bisect import bisect from difflib import get_close_matches from types import CodeType, TracebackType -from typing import Iterable, List, Optional, Set, TypeVar +from typing import Any, Iterable, List, Optional, Set, TypeVar +from beet import Container from mecha.utils import string_to_number T = TypeVar("T") -INTERNAL_CODE: Set[CodeType] = {string_to_number.__code__} +INTERNAL_CODE: Set[CodeType] = { + string_to_number.__code__, + Container[Any, Any].__getitem__.__code__, +} def internal(f: T) -> T: diff --git a/packages/bolt/examples/bolt_memo/beet.yml b/packages/bolt/examples/bolt_memo/beet.yml new file mode 100644 index 000000000..12028f24c --- /dev/null +++ b/packages/bolt/examples/bolt_memo/beet.yml @@ -0,0 +1,27 @@ +pipeline: + - require: + - bolt + data_pack: + load: "src" + pipeline: + - mecha + - beet.contrib.rename_files + - beet.contrib.find_replace + meta: + rename_files: + data_pack: + match: "demo:*" + find: "demo:([a-z_/]+)" + replace: 'demo:ref/\1' + find_replace: + data_pack: + match: "demo:*" + substitute: + find: "demo:([a-z_/]+)" + replace: 'demo:ref/\1' + - require: + - bolt + data_pack: + load: "src" + pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_memo/src/data/demo/functions/bar.mcfunction b/packages/bolt/examples/bolt_memo/src/data/demo/functions/bar.mcfunction new file mode 100644 index 000000000..e393409df --- /dev/null +++ b/packages/bolt/examples/bolt_memo/src/data/demo/functions/bar.mcfunction @@ -0,0 +1,40 @@ +from beet import Function + +as @a: + memo: + say hello + +memo dope=1: + dope + +x = 42 +memo x: + for i in range(x): + as @e[type=pig, scores={foo=1.., bar=i}, tag=okok] at @s[] + anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone expand: + say i + setblock ~ ~ ~i air + +def make_tree(n=0): + memo count=42, n: + total = count + n + for node in generate_tree(range(total), name=f"tree_{total}"): + append function node.parent: + if node.partition(): + if score @s thingy matches node.range function node.children + else: + if score @s thingy matches node.range say node.value + +make_tree() + +say ok +say bye + +make_tree() +make_tree(15) + +memo: + ctx.generate("{hash}", Function(["say uwu"])) + function_tag demo:nothing { + "values": [__name__] + } diff --git a/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..7cc3eb367 --- /dev/null +++ b/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,18 @@ +memo: + pass + +bop = 123 +memo bop, foo=bop, foo: + thing = foo + function ./ayy: + say thing + say foo + +a = (1, 2) +a = (a, a) +a = (a, a) + +memo a, a: + say a + +say wat diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index cbd29a7a6..7bc5482c7 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "attrs" version = "22.1.0" @@ -5,6 +7,10 @@ description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] [package.extras] dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] @@ -14,11 +20,15 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.80.1" +version = "0.82.4" description = "The Minecraft pack development kit" category = "main" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.10,<4.0" +files = [ + {file = "beet-0.82.4-py3-none-any.whl", hash = "sha256:1c20f3ef4b4fd313f15692d6addf7695718d85f05e51b0845f81d68d63f36bca"}, + {file = "beet-0.82.4.tar.gz", hash = "sha256:6ced204ddb18215dbae0bbc09706c4996af87ff1f77f9cc99616d048a847cb46"}, +] [package.dependencies] click = ">=8.1.3,<9.0.0" @@ -26,7 +36,7 @@ click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.10.1,<0.11.0" +pathspec = ">=0.10.2,<0.11.0" pydantic = ">=1.10.2,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" @@ -41,6 +51,29 @@ description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] [package.dependencies] click = ">=8.0.0" @@ -62,6 +95,10 @@ description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, +] [package.dependencies] six = ">=1.9.0" @@ -78,6 +115,10 @@ description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, +] [[package]] name = "cffi" @@ -86,6 +127,72 @@ description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" @@ -97,6 +204,10 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "dev" optional = false python-versions = ">=3.6.0" +files = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] [package.extras] unicode-backport = ["unicodedata2"] @@ -108,6 +219,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -119,6 +234,10 @@ description = "Colorization of help messages in Click" category = "main" optional = false python-versions = "*" +files = [ + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, +] [package.dependencies] click = ">=7.0,<9" @@ -133,6 +252,10 @@ description = "Logging integration for Click" category = "dev" optional = false python-versions = "*" +files = [ + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, +] [package.dependencies] click = "*" @@ -144,6 +267,10 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "cryptography" @@ -152,6 +279,34 @@ description = "cryptography is a package which provides cryptographic recipes an category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, + {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, + {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, + {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, +] [package.dependencies] cffi = ">=1.12" @@ -171,6 +326,10 @@ description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] [[package]] name = "dotty-dict" @@ -179,6 +338,10 @@ description = "Dictionary wrapper for quick access to deeply nested keys." category = "dev" optional = false python-versions = ">=3.5,<4.0" +files = [ + {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, + {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, +] [[package]] name = "exceptiongroup" @@ -187,6 +350,10 @@ description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, + {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, +] [package.extras] test = ["pytest (>=6)"] @@ -198,6 +365,10 @@ description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] [package.dependencies] smmap = ">=3.0.1,<6" @@ -209,6 +380,10 @@ description = "GitPython is a python library used to interact with Git repositor category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" @@ -220,6 +395,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" @@ -228,6 +407,10 @@ description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, +] [package.dependencies] zipp = ">=0.5" @@ -244,6 +427,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "invoke" @@ -252,6 +439,10 @@ description = "Pythonic task execution" category = "dev" optional = false python-versions = "*" +files = [ + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, +] [[package]] name = "isort" @@ -260,6 +451,10 @@ description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.6.1,<4.0" +files = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -274,6 +469,10 @@ description = "Utility functions for Python class constructs" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] [package.dependencies] more-itertools = "*" @@ -289,6 +488,10 @@ description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] [package.extras] test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] @@ -301,6 +504,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -315,6 +522,10 @@ description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, + {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, +] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} @@ -334,6 +545,10 @@ description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "lectern-0.26.0-py3-none-any.whl", hash = "sha256:e46eb1f1befd5892cad5bffc65fac1debe008e641ea6ea5c281e49b8a831cf0f"}, + {file = "lectern-0.26.0.tar.gz", hash = "sha256:0496bfaee29641e04e8c6ef0a6db0ce5b4b01e5064a0d6d1c8ce3a6e7a548066"}, +] [package.dependencies] beet = ">=0.79.0" @@ -347,6 +562,10 @@ description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, +] [package.dependencies] mdurl = ">=0.1,<1.0" @@ -368,6 +587,48 @@ description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] [[package]] name = "mdurl" @@ -376,17 +637,25 @@ description = "Markdown URL utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "mecha" -version = "0.61.0" +version = "0.64.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" +files = [ + {file = "mecha-0.64.0-py3-none-any.whl", hash = "sha256:170fc1d5f78cb000aa3614781fcfdea1a35fb1b998ecf22b41e9f79590e305de"}, + {file = "mecha-0.64.0.tar.gz", hash = "sha256:803457bfd09d584d096494ec7e2511228d232150a1e8494aabd11a23773b9dd1"}, +] [package.dependencies] -beet = ">=0.80.1" +beet = ">=0.82.2" tokenstream = ">=1.4.2,<2.0.0" [[package]] @@ -396,6 +665,10 @@ description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, +] [[package]] name = "mypy-extensions" @@ -404,6 +677,10 @@ description = "Experimental type system extensions for programs checked with the category = "dev" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "nbtlib" @@ -412,6 +689,10 @@ description = "A python package to read and edit nbt data" category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, +] [package.dependencies] numpy = "*" @@ -423,18 +704,52 @@ description = "NumPy is the fundamental package for array computing with Python. category = "main" optional = false python-versions = ">=3.8" - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - +files = [ + {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, + {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, + {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, + {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, + {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, + {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, + {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, + {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, + {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, + {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, +] + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + [[package]] name = "pathspec" version = "0.10.2" @@ -442,6 +757,10 @@ description = "Utility library for gitignore style pattern matching of file path category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, +] [[package]] name = "pkginfo" @@ -450,6 +769,10 @@ description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, +] [package.extras] testing = ["coverage", "nose"] @@ -461,6 +784,10 @@ description = "A small Python package for determining appropriate platform-speci category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, +] [package.extras] docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] @@ -473,6 +800,10 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -485,6 +816,10 @@ description = "C parser in Python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydantic" @@ -493,6 +828,44 @@ description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] [package.dependencies] typing-extensions = ">=4.1.0" @@ -508,6 +881,10 @@ description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] [package.extras] plugins = ["importlib-metadata"] @@ -519,6 +896,10 @@ description = "pyparsing module - Classes and methods to define and execute pars category = "dev" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -530,6 +911,10 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -550,6 +935,10 @@ description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "pytest_insta-0.2.0-py3-none-any.whl", hash = "sha256:e8d8a19f44917fa70102b132ddd4d6afcebe2a31987422dc79458ff849fe1a9e"}, + {file = "pytest_insta-0.2.0.tar.gz", hash = "sha256:c4e549f3c5aea8acf1ae6da12cffaaf4e4b3b03d9059c5115deab59f37b23867"}, +] [package.dependencies] pytest = ">=7.2.0,<8.0.0" @@ -562,6 +951,10 @@ description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, + {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, +] [package.dependencies] requests = ">=2.25.0" @@ -578,6 +971,10 @@ description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" +files = [ + {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, + {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, +] [package.dependencies] click = ">=7,<9" @@ -606,6 +1003,10 @@ description = "" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] [[package]] name = "pyyaml" @@ -614,6 +1015,48 @@ description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "readme-renderer" @@ -622,6 +1065,10 @@ description = "readme_renderer is a library for rendering \"readme\" description category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, + {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, +] [package.dependencies] bleach = ">=2.1.0" @@ -638,6 +1085,10 @@ description = "Python HTTP for Humans." category = "dev" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -656,6 +1107,10 @@ description = "A utility belt for advanced users of python-requests" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, + {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, +] [package.dependencies] requests = ">=2.0.1,<3.0.0" @@ -667,6 +1122,10 @@ description = "Validating URI References per RFC 3986" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] [package.extras] idna2008 = ["idna"] @@ -678,6 +1137,10 @@ description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] [package.dependencies] cryptography = ">=2.0" @@ -690,6 +1153,10 @@ description = "Python helper for Semantic Versioning (http://semver.org/)" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] [[package]] name = "six" @@ -698,6 +1165,10 @@ description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" @@ -706,6 +1177,10 @@ description = "A pure Python implementation of a sliding window memory map manag category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "tokenstream" @@ -714,6 +1189,10 @@ description = "A versatile token stream for handwritten parsers" category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, + {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, +] [[package]] name = "toml" @@ -722,6 +1201,10 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" @@ -730,6 +1213,10 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" @@ -738,6 +1225,10 @@ description = "Style preserving TOML library" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] [[package]] name = "tqdm" @@ -746,6 +1237,10 @@ description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -763,6 +1258,10 @@ description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, +] [package.dependencies] colorama = ">=0.4.3" @@ -783,6 +1282,10 @@ description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] [[package]] name = "urllib3" @@ -791,6 +1294,10 @@ description = "HTTP library with thread-safe connection pooling, file post, and category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +files = [ + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] @@ -804,6 +1311,10 @@ description = "Character encoding aliases for legacy web content" category = "dev" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "wheel" @@ -812,6 +1323,10 @@ description = "A built-package format for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, + {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, +] [package.extras] test = ["pytest (>=3.0.0)"] @@ -823,539 +1338,7 @@ description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "zipp" -version = "3.10.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.10" -content-hash = "71a3bbddcf2ba075cb7c7f19c40e9a9b8ef9bd391785efdd32946ca8d1fbd306" - -[metadata.files] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -beet = [ - {file = "beet-0.80.1-py3-none-any.whl", hash = "sha256:499ffc70888afd0a81a41ba432dcbd5a7c08c016b9476b0e587624476fd0e17f"}, - {file = "beet-0.80.1.tar.gz", hash = "sha256:4ccda72bef9ccfffc34dbefe8ec479852f1ed6e3da459feadaf71d0ddfefb530"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -bleach = [ - {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, - {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -click-help-colors = [ - {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, - {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, -] -click-log = [ - {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, - {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -cryptography = [ - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, - {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, - {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, - {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] -dotty-dict = [ - {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, - {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, - {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -gitpython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -invoke = [ - {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, - {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -jaraco-classes = [ - {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, - {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -keyring = [ - {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, - {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, -] -lectern = [ - {file = "lectern-0.26.0-py3-none-any.whl", hash = "sha256:e46eb1f1befd5892cad5bffc65fac1debe008e641ea6ea5c281e49b8a831cf0f"}, - {file = "lectern-0.26.0.tar.gz", hash = "sha256:0496bfaee29641e04e8c6ef0a6db0ce5b4b01e5064a0d6d1c8ce3a6e7a548066"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mdurl = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] -mecha = [ - {file = "mecha-0.61.0-py3-none-any.whl", hash = "sha256:305c00d16f2caf582d3779da8be1515ebf546ace3aa3b5f3707e7bc5834b0061"}, - {file = "mecha-0.61.0.tar.gz", hash = "sha256:479cfcfabecf98c6866db8054702cbb62b3655024e33398c20322a536e087cf1"}, -] -more-itertools = [ - {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, - {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nbtlib = [ - {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, - {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, -] -numpy = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, -] -pkginfo = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, -] -platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -pytest-insta = [ - {file = "pytest_insta-0.2.0-py3-none-any.whl", hash = "sha256:e8d8a19f44917fa70102b132ddd4d6afcebe2a31987422dc79458ff849fe1a9e"}, - {file = "pytest_insta-0.2.0.tar.gz", hash = "sha256:c4e549f3c5aea8acf1ae6da12cffaaf4e4b3b03d9059c5115deab59f37b23867"}, -] -python-gitlab = [ - {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, - {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, -] -python-semantic-release = [ - {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, - {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -readme-renderer = [ - {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, - {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, - {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, -] -rfc3986 = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] -semver = [ - {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, - {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -tokenstream = [ - {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, - {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, -] -tqdm = [ - {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, - {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, -] -twine = [ - {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, - {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -wheel = [ - {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, - {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, -] -wrapt = [ +files = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, @@ -1421,7 +1404,24 @@ wrapt = [ {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] -zipp = [ + +[[package]] +name = "zipp" +version = "3.10.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "990bfa7318071ea1c3538aa04167c3e048a0b05258838883702ce8b9a9d5083f" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f9a1722f0..cda5ce43f 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.80.1" -mecha = ">=0.61.0" +beet = ">=0.82.4" +mecha = ">=0.64.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.0" @@ -34,6 +34,9 @@ python-semantic-release = "^7.32.2" pytest-insta = "^0.2.0" lectern = ">=0.26.0" +[tool.poetry.plugins.beet] +commands = "bolt.commands" + [tool.pytest.ini_options] addopts = "tests --import-mode=importlib" diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 1f4a0f277..0a948bb16 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1109,3 +1109,54 @@ def g(a=1, b): ### as @a run foo = "bar" say foo +### +memo +### +memo: +### +memo 123: + pass +### +memo foo: + pass +### +memo foo=foo: + pass +### +memo {}: + pass +### +memo something=123: + print(somethig) +### +memo list() (1 + 2): + pass +### +memo list(), (1 + 2): + pass +### +memo foo=123, bar="hello": + say foo + say bar +### +memo: + pass +memo: + pass +### +memo foo=42: + print(foo) +memo foo=42: + print(foo) +memo foo=42: + print(foo) +### +def f(): + memo: + pass +### +bop = 123 +memo bop foo=bop foo: + foo += 8 + say foo +print(foo) diff --git a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt index 84b9202e2..e042b0cd5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt @@ -1,6 +1,6 @@ macro foo: pass -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 122 other tokens but got literal 'foo'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'foo'. # line 3, column 7 # 2 | pass # 3 | as @p foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_306__0.txt b/packages/bolt/tests/snapshots/bolt__parse_306__0.txt new file mode 100644 index 000000000..e2e245dcb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_306__0.txt @@ -0,0 +1,4 @@ +#>ERROR Expected colon or identifier but got newline '\n'. +# line 1, column 5 +# 1 | memo +memo diff --git a/packages/bolt/tests/snapshots/bolt__parse_307__0.txt b/packages/bolt/tests/snapshots/bolt__parse_307__0.txt new file mode 100644 index 000000000..74614e74f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_307__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected non-empty block. +# line 1, column 5 +# 1 | memo: +# : ^ +memo: diff --git a/packages/bolt/tests/snapshots/bolt__parse_308__0.txt b/packages/bolt/tests/snapshots/bolt__parse_308__0.txt new file mode 100644 index 000000000..dbef4ce21 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_308__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected colon or identifier but got literal '123'. +# line 1, column 6 +# 1 | memo 123: +# : ^^^ +# 2 | pass +memo 123: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_309__0.txt b/packages/bolt/tests/snapshots/bolt__parse_309__0.txt new file mode 100644 index 000000000..09e7183d7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_309__0.txt @@ -0,0 +1,9 @@ +#>ERROR Identifier "foo" is not defined. +# line 1, column 6 +# 1 | memo foo: +# : ^^^ +# 2 | pass +# Notes: +# - Expected assignment but got invalid ':'. +memo foo: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_310__0.txt b/packages/bolt/tests/snapshots/bolt__parse_310__0.txt new file mode 100644 index 000000000..5db70bffb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_310__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier "foo" is not defined. +# line 1, column 10 +# 1 | memo foo=foo: +# : ^^^ +# 2 | pass +memo foo=foo: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_311__0.txt b/packages/bolt/tests/snapshots/bolt__parse_311__0.txt new file mode 100644 index 000000000..c27543a3d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_311__0.txt @@ -0,0 +1,7 @@ +#>ERROR Expected colon or identifier but got literal '{}'. +# line 1, column 6 +# 1 | memo {}: +# : ^^ +# 2 | pass +memo {}: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_312__0.txt b/packages/bolt/tests/snapshots/bolt__parse_312__0.txt new file mode 100644 index 000000000..13598aae2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_312__0.txt @@ -0,0 +1,9 @@ +memo something=123: +#>ERROR Identifier "somethig" is not defined. Did you mean "something"? +# line 2, column 11 +# 1 | memo something=123: +# 2 | print(somethig) +# : ^^^^^^^^ +# Notes: +# - Expected equal but got brace ')'. + print(somethig) diff --git a/packages/bolt/tests/snapshots/bolt__parse_313__0.txt b/packages/bolt/tests/snapshots/bolt__parse_313__0.txt new file mode 100644 index 000000000..621646757 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_313__0.txt @@ -0,0 +1,52 @@ +memo list() (1 + 2): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=2, colno=9) + identifier: 'memo:0' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'list' + arguments: + + arguments: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + operator: '+' + left: + + location: SourceLocation(pos=13, lineno=1, colno=14) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 1 + right: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 2 + + location: SourceLocation(pos=25, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=25, lineno=2, colno=5) + end_location: SourceLocation(pos=29, lineno=2, colno=9) + identifier: 'pass' + arguments: + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') diff --git a/packages/bolt/tests/snapshots/bolt__parse_313__1.txt b/packages/bolt/tests/snapshots/bolt__parse_313__1.txt new file mode 100644 index 000000000..1d0d7b674 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_313__1.txt @@ -0,0 +1,38 @@ +_bolt_lineno = [1], [1] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = list + _bolt_var0 = _bolt_var0() + _bolt_var1 = 1 + _bolt_var2 = 2 + _bolt_var1 = _bolt_var1 + _bolt_var2 + _bolt_var0 = _bolt_var0(_bolt_var1) + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var0,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + pass +_bolt_var4 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=29, lineno=2, colno=9) + identifier: 'memo:0' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_314__0.txt b/packages/bolt/tests/snapshots/bolt__parse_314__0.txt new file mode 100644 index 000000000..02bb346b0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_314__0.txt @@ -0,0 +1,47 @@ +memo list(), (1 + 2): + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=9) + identifier: 'memo:0:1' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 'list' + arguments: + + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + operator: '+' + left: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 1 + right: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 2 + + location: SourceLocation(pos=26, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=26, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=9) + identifier: 'pass' + arguments: + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') diff --git a/packages/bolt/tests/snapshots/bolt__parse_314__1.txt b/packages/bolt/tests/snapshots/bolt__parse_314__1.txt new file mode 100644 index 000000000..903591ca6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_314__1.txt @@ -0,0 +1,38 @@ +_bolt_lineno = [1], [1] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = list + _bolt_var0 = _bolt_var0() + _bolt_var1 = 1 + _bolt_var2 = 2 + _bolt_var1 = _bolt_var1 + _bolt_var2 + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var0, _bolt_var1,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + pass +_bolt_var4 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=2, colno=9) + identifier: 'memo:0:1' + arguments: + + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_315__0.txt b/packages/bolt/tests/snapshots/bolt__parse_315__0.txt new file mode 100644 index 000000000..c513e99a2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_315__0.txt @@ -0,0 +1,80 @@ +memo foo=123, bar="hello": + say foo + say bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + identifier: 'memo:foo:bar' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + operator: '=' + target: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 123 + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + operator: '=' + target: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'bar' + rebind: False + value: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'hello' + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + commands: + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=35, lineno=2, colno=9) + end_location: SourceLocation(pos=38, lineno=2, colno=12) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=35, lineno=2, colno=9) + end_location: SourceLocation(pos=38, lineno=2, colno=12) + value: 'foo' + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=47, lineno=3, colno=9) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=47, lineno=3, colno=9) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + value: 'bar' + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') diff --git a/packages/bolt/tests/snapshots/bolt__parse_315__1.txt b/packages/bolt/tests/snapshots/bolt__parse_315__1.txt new file mode 100644 index 000000000..9668b0f04 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_315__1.txt @@ -0,0 +1,75 @@ +_bolt_lineno = [1, 18, 21], [1, 2, 3] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 123 + foo = _bolt_var0 + _bolt_var1 = 'hello' + bar = _bolt_var1 + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(foo, bar,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var2 = foo + _bolt_var2 = _bolt_helper_interpolate_message(_bolt_var2, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var2]))) + _bolt_var3 = bar + _bolt_var3 = _bolt_helper_interpolate_message(_bolt_var3, _bolt_refs[3]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_var3]))) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var4)) +--- +output = _bolt_var5 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + identifier: 'memo:foo:bar' + arguments: + + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=35, lineno=2, colno=9) + end_location: SourceLocation(pos=38, lineno=2, colno=12) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=31, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=12) + identifier: 'say:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=47, lineno=3, colno=9) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[4] + + location: SourceLocation(pos=43, lineno=3, colno=5) + end_location: SourceLocation(pos=50, lineno=3, colno=12) + identifier: 'say:message' + arguments: + +_bolt_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=51, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_316__0.txt b/packages/bolt/tests/snapshots/bolt__parse_316__0.txt new file mode 100644 index 000000000..62448a2c0 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_316__0.txt @@ -0,0 +1,41 @@ +memo: + pass +memo: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=9) + identifier: 'memo' + arguments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=14, lineno=2, colno=9) + identifier: 'pass' + arguments: + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=29, lineno=4, colno=9) + identifier: 'memo' + arguments: + + location: SourceLocation(pos=25, lineno=4, colno=5) + end_location: SourceLocation(pos=29, lineno=4, colno=9) + commands: + + location: SourceLocation(pos=25, lineno=4, colno=5) + end_location: SourceLocation(pos=29, lineno=4, colno=9) + identifier: 'pass' + arguments: + + persistent_id: UUID('23b8c1e9-3924-56de-3eb1-3b9046685257') diff --git a/packages/bolt/tests/snapshots/bolt__parse_316__1.txt b/packages/bolt/tests/snapshots/bolt__parse_316__1.txt new file mode 100644 index 000000000..037b9c217 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_316__1.txt @@ -0,0 +1,49 @@ +_bolt_lineno = [1], [1] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 = None +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[()] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + pass + if _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 is None: + _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 = _bolt_runtime.memo.registry[__file__][_bolt_refs[1], 1] + _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257 = _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257[()] + if _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257, __name__): + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=2, colno=9) + identifier: 'memo' + arguments: + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=29, lineno=4, colno=9) + identifier: 'memo' + arguments: + + persistent_id: UUID('23b8c1e9-3924-56de-3eb1-3b9046685257') +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=30, lineno=5, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_317__0.txt b/packages/bolt/tests/snapshots/bolt__parse_317__0.txt new file mode 100644 index 000000000..d17ffe69f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_317__0.txt @@ -0,0 +1,140 @@ +memo foo=42: + print(foo) +memo foo=42: + print(foo) +memo foo=42: + print(foo) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=84, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=15) + identifier: 'memo:foo' + arguments: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 42 + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=15) + commands: + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=15) + value: + + location: SourceLocation(pos=17, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=10) + value: 'print' + arguments: + + location: SourceLocation(pos=23, lineno=2, colno=11) + end_location: SourceLocation(pos=26, lineno=2, colno=14) + value: 'foo' + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=55, lineno=4, colno=15) + identifier: 'memo:foo' + arguments: + + location: SourceLocation(pos=33, lineno=3, colno=6) + end_location: SourceLocation(pos=39, lineno=3, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=33, lineno=3, colno=6) + end_location: SourceLocation(pos=36, lineno=3, colno=9) + value: 'foo' + rebind: True + value: + + location: SourceLocation(pos=37, lineno=3, colno=10) + end_location: SourceLocation(pos=39, lineno=3, colno=12) + value: 42 + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=55, lineno=4, colno=15) + commands: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=55, lineno=4, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=55, lineno=4, colno=15) + value: + + location: SourceLocation(pos=45, lineno=4, colno=5) + end_location: SourceLocation(pos=50, lineno=4, colno=10) + value: 'print' + arguments: + + location: SourceLocation(pos=51, lineno=4, colno=11) + end_location: SourceLocation(pos=54, lineno=4, colno=14) + value: 'foo' + persistent_id: UUID('23b8c1e9-3924-56de-3eb1-3b9046685257') + + location: SourceLocation(pos=56, lineno=5, colno=1) + end_location: SourceLocation(pos=83, lineno=6, colno=15) + identifier: 'memo:foo' + arguments: + + location: SourceLocation(pos=61, lineno=5, colno=6) + end_location: SourceLocation(pos=67, lineno=5, colno=12) + operator: '=' + target: + + location: SourceLocation(pos=61, lineno=5, colno=6) + end_location: SourceLocation(pos=64, lineno=5, colno=9) + value: 'foo' + rebind: True + value: + + location: SourceLocation(pos=65, lineno=5, colno=10) + end_location: SourceLocation(pos=67, lineno=5, colno=12) + value: 42 + + location: SourceLocation(pos=73, lineno=6, colno=5) + end_location: SourceLocation(pos=83, lineno=6, colno=15) + commands: + + location: SourceLocation(pos=73, lineno=6, colno=5) + end_location: SourceLocation(pos=83, lineno=6, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=73, lineno=6, colno=5) + end_location: SourceLocation(pos=83, lineno=6, colno=15) + value: + + location: SourceLocation(pos=73, lineno=6, colno=5) + end_location: SourceLocation(pos=78, lineno=6, colno=10) + value: 'print' + arguments: + + location: SourceLocation(pos=79, lineno=6, colno=11) + end_location: SourceLocation(pos=82, lineno=6, colno=14) + value: 'foo' + persistent_id: UUID('bd9c66b3-ad3c-2d6d-1a3d-1fa7bc8960a9') diff --git a/packages/bolt/tests/snapshots/bolt__parse_317__1.txt b/packages/bolt/tests/snapshots/bolt__parse_317__1.txt new file mode 100644 index 000000000..544980ef4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_317__1.txt @@ -0,0 +1,89 @@ +_bolt_lineno = [1, 18, 22, 33, 37, 48], [1, 2, 3, 4, 5, 6] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 = None +_bolt_memo_storage_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9 = None +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var9: + _bolt_var0 = 42 + foo = _bolt_var0 + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(foo,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var1 = print + _bolt_var2 = foo + _bolt_var1 = _bolt_var1(_bolt_var2) + _bolt_var3 = 42 + _bolt_rebind = _bolt_helper_get_rebind(foo) + foo = _bolt_var3 + if _bolt_rebind is not None: + foo = _bolt_rebind(foo) + if _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 is None: + _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 = _bolt_runtime.memo.registry[__file__][_bolt_refs[1], 0] + _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257 = _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257[(foo,)] + if _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257, __name__): + _bolt_var4 = print + _bolt_var5 = foo + _bolt_var4 = _bolt_var4(_bolt_var5) + _bolt_var6 = 42 + _bolt_rebind = _bolt_helper_get_rebind(foo) + foo = _bolt_var6 + if _bolt_rebind is not None: + foo = _bolt_rebind(foo) + if _bolt_memo_storage_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9 is None: + _bolt_memo_storage_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9 = _bolt_runtime.memo.registry[__file__][_bolt_refs[2], 1] + _bolt_memo_invocation_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9 = _bolt_memo_storage_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9[(foo,)] + if _bolt_memo_invocation_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bd9c66b3ad3c2d6d1a3d1fa7bc8960a9, __name__): + _bolt_var7 = print + _bolt_var8 = foo + _bolt_var7 = _bolt_var7(_bolt_var8) +_bolt_var10 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var9)) +--- +output = _bolt_var10 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=27, lineno=2, colno=15) + identifier: 'memo:foo' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=28, lineno=3, colno=1) + end_location: SourceLocation(pos=55, lineno=4, colno=15) + identifier: 'memo:foo' + arguments: + + + persistent_id: UUID('23b8c1e9-3924-56de-3eb1-3b9046685257') +_bolt_refs[2] + + location: SourceLocation(pos=56, lineno=5, colno=1) + end_location: SourceLocation(pos=83, lineno=6, colno=15) + identifier: 'memo:foo' + arguments: + + + persistent_id: UUID('bd9c66b3-ad3c-2d6d-1a3d-1fa7bc8960a9') +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=84, lineno=7, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_318__0.txt b/packages/bolt/tests/snapshots/bolt__parse_318__0.txt new file mode 100644 index 000000000..65571c6fb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_318__0.txt @@ -0,0 +1,41 @@ +def f(): + memo: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + identifier: 'memo' + arguments: + + location: SourceLocation(pos=27, lineno=3, colno=9) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=27, lineno=3, colno=9) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + identifier: 'pass' + arguments: + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') diff --git a/packages/bolt/tests/snapshots/bolt__parse_318__1.txt b/packages/bolt/tests/snapshots/bolt__parse_318__1.txt new file mode 100644 index 000000000..51c5387de --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_318__1.txt @@ -0,0 +1,33 @@ +_bolt_lineno = [1, 7], [1, 2] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(): + global _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[()] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + pass +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + identifier: 'memo' + arguments: + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=13) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_319__0.txt b/packages/bolt/tests/snapshots/bolt__parse_319__0.txt new file mode 100644 index 000000000..0dca889cc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_319__0.txt @@ -0,0 +1,117 @@ +bop = 123 +memo bop foo=bop foo: + foo += 8 + say foo +print(foo) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'bop' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 123 + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + identifier: 'memo:0:foo:2' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=6) + end_location: SourceLocation(pos=18, lineno=2, colno=9) + value: 'bop' + + location: SourceLocation(pos=19, lineno=2, colno=10) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + operator: '=' + target: + + location: SourceLocation(pos=19, lineno=2, colno=10) + end_location: SourceLocation(pos=22, lineno=2, colno=13) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=23, lineno=2, colno=14) + end_location: SourceLocation(pos=26, lineno=2, colno=17) + value: 'bop' + + location: SourceLocation(pos=27, lineno=2, colno=18) + end_location: SourceLocation(pos=30, lineno=2, colno=21) + value: 'foo' + + location: SourceLocation(pos=36, lineno=3, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + commands: + + location: SourceLocation(pos=36, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=36, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=13) + operator: '+=' + target: + + location: SourceLocation(pos=36, lineno=3, colno=5) + end_location: SourceLocation(pos=39, lineno=3, colno=8) + value: 'foo' + rebind: True + value: + + location: SourceLocation(pos=43, lineno=3, colno=12) + end_location: SourceLocation(pos=44, lineno=3, colno=13) + value: 8 + + location: SourceLocation(pos=49, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=53, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=53, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + value: 'foo' + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=57, lineno=5, colno=1) + end_location: SourceLocation(pos=67, lineno=5, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=57, lineno=5, colno=1) + end_location: SourceLocation(pos=67, lineno=5, colno=11) + value: + + location: SourceLocation(pos=57, lineno=5, colno=1) + end_location: SourceLocation(pos=62, lineno=5, colno=6) + value: 'print' + arguments: + + location: SourceLocation(pos=63, lineno=5, colno=7) + end_location: SourceLocation(pos=66, lineno=5, colno=10) + value: 'foo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_319__1.txt b/packages/bolt/tests/snapshots/bolt__parse_319__1.txt new file mode 100644 index 000000000..c105327b1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_319__1.txt @@ -0,0 +1,70 @@ +_bolt_lineno = [1, 10, 22, 26, 29], [1, 2, 3, 4, 5] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var8: + _bolt_var0 = 123 + bop = _bolt_var0 + _bolt_var1 = bop + _bolt_var2 = bop + foo = _bolt_var2 + _bolt_var3 = foo + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var1, foo, _bolt_var3,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var4 = 8 + _bolt_rebind = _bolt_helper_get_rebind(foo) + foo += _bolt_var4 + if _bolt_rebind is not None: + foo = _bolt_rebind(foo) + _bolt_var5 = foo + _bolt_var5 = _bolt_helper_interpolate_message(_bolt_var5, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var5]))) + _bolt_var6 = print + _bolt_var7 = foo + _bolt_var6 = _bolt_var6(_bolt_var7) +_bolt_var9 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var8)) +--- +output = _bolt_var9 +--- +_bolt_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + identifier: 'memo:0:foo:2' + arguments: + + + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=53, lineno=4, colno=9) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=49, lineno=4, colno=5) + end_location: SourceLocation(pos=56, lineno=4, colno=12) + identifier: 'say:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=6, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index a83d277e7..8001545ab 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 150 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 152 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt index 7a5b94b89..fc6c39b78 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 122 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md new file mode 100644 index 000000000..c9e4dae64 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md @@ -0,0 +1,1610 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:ref/bar` + +```mcfunction +execute as @a run function demo:ref/bar/nested_execute_0 +execute as @e[type=pig, scores={foo=1.., bar=0}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 0 +execute as @e[type=pig, scores={foo=1.., bar=0}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~ air +execute as @e[type=pig, scores={foo=1.., bar=1}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 1 +execute as @e[type=pig, scores={foo=1.., bar=1}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~1 air +execute as @e[type=pig, scores={foo=1.., bar=2}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 2 +execute as @e[type=pig, scores={foo=1.., bar=2}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~2 air +execute as @e[type=pig, scores={foo=1.., bar=3}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 3 +execute as @e[type=pig, scores={foo=1.., bar=3}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~3 air +execute as @e[type=pig, scores={foo=1.., bar=4}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 4 +execute as @e[type=pig, scores={foo=1.., bar=4}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~4 air +execute as @e[type=pig, scores={foo=1.., bar=5}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 5 +execute as @e[type=pig, scores={foo=1.., bar=5}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~5 air +execute as @e[type=pig, scores={foo=1.., bar=6}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 6 +execute as @e[type=pig, scores={foo=1.., bar=6}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~6 air +execute as @e[type=pig, scores={foo=1.., bar=7}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 7 +execute as @e[type=pig, scores={foo=1.., bar=7}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~7 air +execute as @e[type=pig, scores={foo=1.., bar=8}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 8 +execute as @e[type=pig, scores={foo=1.., bar=8}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~8 air +execute as @e[type=pig, scores={foo=1.., bar=9}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 9 +execute as @e[type=pig, scores={foo=1.., bar=9}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~9 air +execute as @e[type=pig, scores={foo=1.., bar=10}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 10 +execute as @e[type=pig, scores={foo=1.., bar=10}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~10 air +execute as @e[type=pig, scores={foo=1.., bar=11}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 11 +execute as @e[type=pig, scores={foo=1.., bar=11}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~11 air +execute as @e[type=pig, scores={foo=1.., bar=12}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 12 +execute as @e[type=pig, scores={foo=1.., bar=12}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~12 air +execute as @e[type=pig, scores={foo=1.., bar=13}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 13 +execute as @e[type=pig, scores={foo=1.., bar=13}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~13 air +execute as @e[type=pig, scores={foo=1.., bar=14}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 14 +execute as @e[type=pig, scores={foo=1.., bar=14}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~14 air +execute as @e[type=pig, scores={foo=1.., bar=15}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 15 +execute as @e[type=pig, scores={foo=1.., bar=15}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~15 air +execute as @e[type=pig, scores={foo=1.., bar=16}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 16 +execute as @e[type=pig, scores={foo=1.., bar=16}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~16 air +execute as @e[type=pig, scores={foo=1.., bar=17}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 17 +execute as @e[type=pig, scores={foo=1.., bar=17}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~17 air +execute as @e[type=pig, scores={foo=1.., bar=18}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 18 +execute as @e[type=pig, scores={foo=1.., bar=18}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~18 air +execute as @e[type=pig, scores={foo=1.., bar=19}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 19 +execute as @e[type=pig, scores={foo=1.., bar=19}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~19 air +execute as @e[type=pig, scores={foo=1.., bar=20}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 20 +execute as @e[type=pig, scores={foo=1.., bar=20}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~20 air +execute as @e[type=pig, scores={foo=1.., bar=21}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 21 +execute as @e[type=pig, scores={foo=1.., bar=21}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~21 air +execute as @e[type=pig, scores={foo=1.., bar=22}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 22 +execute as @e[type=pig, scores={foo=1.., bar=22}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~22 air +execute as @e[type=pig, scores={foo=1.., bar=23}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 23 +execute as @e[type=pig, scores={foo=1.., bar=23}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~23 air +execute as @e[type=pig, scores={foo=1.., bar=24}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 24 +execute as @e[type=pig, scores={foo=1.., bar=24}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~24 air +execute as @e[type=pig, scores={foo=1.., bar=25}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 25 +execute as @e[type=pig, scores={foo=1.., bar=25}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~25 air +execute as @e[type=pig, scores={foo=1.., bar=26}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 26 +execute as @e[type=pig, scores={foo=1.., bar=26}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~26 air +execute as @e[type=pig, scores={foo=1.., bar=27}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 27 +execute as @e[type=pig, scores={foo=1.., bar=27}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~27 air +execute as @e[type=pig, scores={foo=1.., bar=28}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 28 +execute as @e[type=pig, scores={foo=1.., bar=28}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~28 air +execute as @e[type=pig, scores={foo=1.., bar=29}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 29 +execute as @e[type=pig, scores={foo=1.., bar=29}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~29 air +execute as @e[type=pig, scores={foo=1.., bar=30}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 30 +execute as @e[type=pig, scores={foo=1.., bar=30}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~30 air +execute as @e[type=pig, scores={foo=1.., bar=31}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 31 +execute as @e[type=pig, scores={foo=1.., bar=31}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~31 air +execute as @e[type=pig, scores={foo=1.., bar=32}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 32 +execute as @e[type=pig, scores={foo=1.., bar=32}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~32 air +execute as @e[type=pig, scores={foo=1.., bar=33}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 33 +execute as @e[type=pig, scores={foo=1.., bar=33}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~33 air +execute as @e[type=pig, scores={foo=1.., bar=34}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 34 +execute as @e[type=pig, scores={foo=1.., bar=34}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~34 air +execute as @e[type=pig, scores={foo=1.., bar=35}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 35 +execute as @e[type=pig, scores={foo=1.., bar=35}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~35 air +execute as @e[type=pig, scores={foo=1.., bar=36}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 36 +execute as @e[type=pig, scores={foo=1.., bar=36}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~36 air +execute as @e[type=pig, scores={foo=1.., bar=37}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 37 +execute as @e[type=pig, scores={foo=1.., bar=37}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~37 air +execute as @e[type=pig, scores={foo=1.., bar=38}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 38 +execute as @e[type=pig, scores={foo=1.., bar=38}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~38 air +execute as @e[type=pig, scores={foo=1.., bar=39}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 39 +execute as @e[type=pig, scores={foo=1.., bar=39}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~39 air +execute as @e[type=pig, scores={foo=1.., bar=40}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 40 +execute as @e[type=pig, scores={foo=1.., bar=40}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~40 air +execute as @e[type=pig, scores={foo=1.., bar=41}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 41 +execute as @e[type=pig, scores={foo=1.., bar=41}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~41 air +execute if score @s thingy matches 0..20 run function demo:ref/bar/tree_42/0_20 +execute if score @s thingy matches 21..41 run function demo:ref/bar/tree_42/21_41 +say ok +say bye +execute if score @s thingy matches 0..20 run function demo:ref/bar/tree_42/0_20 +execute if score @s thingy matches 21..41 run function demo:ref/bar/tree_42/21_41 +execute if score @s thingy matches 0..28 run function demo:ref/bar/tree_57/0_28 +execute if score @s thingy matches 29..56 run function demo:ref/bar/tree_57/29_56 +``` + +`@function demo:ref/foo` + +```mcfunction +say 123 +say (((1, 2), (1, 2)), ((1, 2), (1, 2))) +say wat +``` + +`@function demo:ref/bar/tree_42/0_20` + +```mcfunction +execute if score @s thingy matches ..10 run function demo:ref/bar/tree_42/0_10 +execute if score @s thingy matches 11.. run function demo:ref/bar/tree_42/11_20 +``` + +`@function demo:ref/bar/tree_42/0_10` + +```mcfunction +execute if score @s thingy matches ..5 run function demo:ref/bar/tree_42/0_5 +execute if score @s thingy matches 6.. run function demo:ref/bar/tree_42/6_10 +``` + +`@function demo:ref/bar/tree_42/0_5` + +```mcfunction +execute if score @s thingy matches ..2 run function demo:ref/bar/tree_42/0_2 +execute if score @s thingy matches 3.. run function demo:ref/bar/tree_42/3_5 +``` + +`@function demo:ref/bar/tree_42/0_2` + +```mcfunction +execute if score @s thingy matches ..1 run function demo:ref/bar/tree_42/0_1 +execute if score @s thingy matches 2 run say 2 +``` + +`@function demo:ref/bar/tree_42/0_1` + +```mcfunction +execute if score @s thingy matches 0 run say 0 +execute if score @s thingy matches 1 run say 1 +``` + +`@function demo:ref/bar/tree_42/3_5` + +```mcfunction +execute if score @s thingy matches ..4 run function demo:ref/bar/tree_42/3_4 +execute if score @s thingy matches 5 run say 5 +``` + +`@function demo:ref/bar/tree_42/3_4` + +```mcfunction +execute if score @s thingy matches 3 run say 3 +execute if score @s thingy matches 4 run say 4 +``` + +`@function demo:ref/bar/tree_42/6_10` + +```mcfunction +execute if score @s thingy matches ..8 run function demo:ref/bar/tree_42/6_8 +execute if score @s thingy matches 9.. run function demo:ref/bar/tree_42/9_10 +``` + +`@function demo:ref/bar/tree_42/6_8` + +```mcfunction +execute if score @s thingy matches ..7 run function demo:ref/bar/tree_42/6_7 +execute if score @s thingy matches 8 run say 8 +``` + +`@function demo:ref/bar/tree_42/6_7` + +```mcfunction +execute if score @s thingy matches 6 run say 6 +execute if score @s thingy matches 7 run say 7 +``` + +`@function demo:ref/bar/tree_42/9_10` + +```mcfunction +execute if score @s thingy matches 9 run say 9 +execute if score @s thingy matches 10 run say 10 +``` + +`@function demo:ref/bar/tree_42/11_20` + +```mcfunction +execute if score @s thingy matches ..15 run function demo:ref/bar/tree_42/11_15 +execute if score @s thingy matches 16.. run function demo:ref/bar/tree_42/16_20 +``` + +`@function demo:ref/bar/tree_42/11_15` + +```mcfunction +execute if score @s thingy matches ..13 run function demo:ref/bar/tree_42/11_13 +execute if score @s thingy matches 14.. run function demo:ref/bar/tree_42/14_15 +``` + +`@function demo:ref/bar/tree_42/11_13` + +```mcfunction +execute if score @s thingy matches ..12 run function demo:ref/bar/tree_42/11_12 +execute if score @s thingy matches 13 run say 13 +``` + +`@function demo:ref/bar/tree_42/11_12` + +```mcfunction +execute if score @s thingy matches 11 run say 11 +execute if score @s thingy matches 12 run say 12 +``` + +`@function demo:ref/bar/tree_42/14_15` + +```mcfunction +execute if score @s thingy matches 14 run say 14 +execute if score @s thingy matches 15 run say 15 +``` + +`@function demo:ref/bar/tree_42/16_20` + +```mcfunction +execute if score @s thingy matches ..18 run function demo:ref/bar/tree_42/16_18 +execute if score @s thingy matches 19.. run function demo:ref/bar/tree_42/19_20 +``` + +`@function demo:ref/bar/tree_42/16_18` + +```mcfunction +execute if score @s thingy matches ..17 run function demo:ref/bar/tree_42/16_17 +execute if score @s thingy matches 18 run say 18 +``` + +`@function demo:ref/bar/tree_42/16_17` + +```mcfunction +execute if score @s thingy matches 16 run say 16 +execute if score @s thingy matches 17 run say 17 +``` + +`@function demo:ref/bar/tree_42/19_20` + +```mcfunction +execute if score @s thingy matches 19 run say 19 +execute if score @s thingy matches 20 run say 20 +``` + +`@function demo:ref/bar/tree_42/21_41` + +```mcfunction +execute if score @s thingy matches ..31 run function demo:ref/bar/tree_42/21_31 +execute if score @s thingy matches 32.. run function demo:ref/bar/tree_42/32_41 +``` + +`@function demo:ref/bar/tree_42/21_31` + +```mcfunction +execute if score @s thingy matches ..26 run function demo:ref/bar/tree_42/21_26 +execute if score @s thingy matches 27.. run function demo:ref/bar/tree_42/27_31 +``` + +`@function demo:ref/bar/tree_42/21_26` + +```mcfunction +execute if score @s thingy matches ..23 run function demo:ref/bar/tree_42/21_23 +execute if score @s thingy matches 24.. run function demo:ref/bar/tree_42/24_26 +``` + +`@function demo:ref/bar/tree_42/21_23` + +```mcfunction +execute if score @s thingy matches ..22 run function demo:ref/bar/tree_42/21_22 +execute if score @s thingy matches 23 run say 23 +``` + +`@function demo:ref/bar/tree_42/21_22` + +```mcfunction +execute if score @s thingy matches 21 run say 21 +execute if score @s thingy matches 22 run say 22 +``` + +`@function demo:ref/bar/tree_42/24_26` + +```mcfunction +execute if score @s thingy matches ..25 run function demo:ref/bar/tree_42/24_25 +execute if score @s thingy matches 26 run say 26 +``` + +`@function demo:ref/bar/tree_42/24_25` + +```mcfunction +execute if score @s thingy matches 24 run say 24 +execute if score @s thingy matches 25 run say 25 +``` + +`@function demo:ref/bar/tree_42/27_31` + +```mcfunction +execute if score @s thingy matches ..29 run function demo:ref/bar/tree_42/27_29 +execute if score @s thingy matches 30.. run function demo:ref/bar/tree_42/30_31 +``` + +`@function demo:ref/bar/tree_42/27_29` + +```mcfunction +execute if score @s thingy matches ..28 run function demo:ref/bar/tree_42/27_28 +execute if score @s thingy matches 29 run say 29 +``` + +`@function demo:ref/bar/tree_42/27_28` + +```mcfunction +execute if score @s thingy matches 27 run say 27 +execute if score @s thingy matches 28 run say 28 +``` + +`@function demo:ref/bar/tree_42/30_31` + +```mcfunction +execute if score @s thingy matches 30 run say 30 +execute if score @s thingy matches 31 run say 31 +``` + +`@function demo:ref/bar/tree_42/32_41` + +```mcfunction +execute if score @s thingy matches ..36 run function demo:ref/bar/tree_42/32_36 +execute if score @s thingy matches 37.. run function demo:ref/bar/tree_42/37_41 +``` + +`@function demo:ref/bar/tree_42/32_36` + +```mcfunction +execute if score @s thingy matches ..34 run function demo:ref/bar/tree_42/32_34 +execute if score @s thingy matches 35.. run function demo:ref/bar/tree_42/35_36 +``` + +`@function demo:ref/bar/tree_42/32_34` + +```mcfunction +execute if score @s thingy matches ..33 run function demo:ref/bar/tree_42/32_33 +execute if score @s thingy matches 34 run say 34 +``` + +`@function demo:ref/bar/tree_42/32_33` + +```mcfunction +execute if score @s thingy matches 32 run say 32 +execute if score @s thingy matches 33 run say 33 +``` + +`@function demo:ref/bar/tree_42/35_36` + +```mcfunction +execute if score @s thingy matches 35 run say 35 +execute if score @s thingy matches 36 run say 36 +``` + +`@function demo:ref/bar/tree_42/37_41` + +```mcfunction +execute if score @s thingy matches ..39 run function demo:ref/bar/tree_42/37_39 +execute if score @s thingy matches 40.. run function demo:ref/bar/tree_42/40_41 +``` + +`@function demo:ref/bar/tree_42/37_39` + +```mcfunction +execute if score @s thingy matches ..38 run function demo:ref/bar/tree_42/37_38 +execute if score @s thingy matches 39 run say 39 +``` + +`@function demo:ref/bar/tree_42/37_38` + +```mcfunction +execute if score @s thingy matches 37 run say 37 +execute if score @s thingy matches 38 run say 38 +``` + +`@function demo:ref/bar/tree_42/40_41` + +```mcfunction +execute if score @s thingy matches 40 run say 40 +execute if score @s thingy matches 41 run say 41 +``` + +`@function demo:ref/bar/tree_57/0_28` + +```mcfunction +execute if score @s thingy matches ..14 run function demo:ref/bar/tree_57/0_14 +execute if score @s thingy matches 15.. run function demo:ref/bar/tree_57/15_28 +``` + +`@function demo:ref/bar/tree_57/0_14` + +```mcfunction +execute if score @s thingy matches ..7 run function demo:ref/bar/tree_57/0_7 +execute if score @s thingy matches 8.. run function demo:ref/bar/tree_57/8_14 +``` + +`@function demo:ref/bar/tree_57/0_7` + +```mcfunction +execute if score @s thingy matches ..3 run function demo:ref/bar/tree_57/0_3 +execute if score @s thingy matches 4.. run function demo:ref/bar/tree_57/4_7 +``` + +`@function demo:ref/bar/tree_57/0_3` + +```mcfunction +execute if score @s thingy matches ..1 run function demo:ref/bar/tree_57/0_1 +execute if score @s thingy matches 2.. run function demo:ref/bar/tree_57/2_3 +``` + +`@function demo:ref/bar/tree_57/0_1` + +```mcfunction +execute if score @s thingy matches 0 run say 0 +execute if score @s thingy matches 1 run say 1 +``` + +`@function demo:ref/bar/tree_57/2_3` + +```mcfunction +execute if score @s thingy matches 2 run say 2 +execute if score @s thingy matches 3 run say 3 +``` + +`@function demo:ref/bar/tree_57/4_7` + +```mcfunction +execute if score @s thingy matches ..5 run function demo:ref/bar/tree_57/4_5 +execute if score @s thingy matches 6.. run function demo:ref/bar/tree_57/6_7 +``` + +`@function demo:ref/bar/tree_57/4_5` + +```mcfunction +execute if score @s thingy matches 4 run say 4 +execute if score @s thingy matches 5 run say 5 +``` + +`@function demo:ref/bar/tree_57/6_7` + +```mcfunction +execute if score @s thingy matches 6 run say 6 +execute if score @s thingy matches 7 run say 7 +``` + +`@function demo:ref/bar/tree_57/8_14` + +```mcfunction +execute if score @s thingy matches ..11 run function demo:ref/bar/tree_57/8_11 +execute if score @s thingy matches 12.. run function demo:ref/bar/tree_57/12_14 +``` + +`@function demo:ref/bar/tree_57/8_11` + +```mcfunction +execute if score @s thingy matches ..9 run function demo:ref/bar/tree_57/8_9 +execute if score @s thingy matches 10.. run function demo:ref/bar/tree_57/10_11 +``` + +`@function demo:ref/bar/tree_57/8_9` + +```mcfunction +execute if score @s thingy matches 8 run say 8 +execute if score @s thingy matches 9 run say 9 +``` + +`@function demo:ref/bar/tree_57/10_11` + +```mcfunction +execute if score @s thingy matches 10 run say 10 +execute if score @s thingy matches 11 run say 11 +``` + +`@function demo:ref/bar/tree_57/12_14` + +```mcfunction +execute if score @s thingy matches ..13 run function demo:ref/bar/tree_57/12_13 +execute if score @s thingy matches 14 run say 14 +``` + +`@function demo:ref/bar/tree_57/12_13` + +```mcfunction +execute if score @s thingy matches 12 run say 12 +execute if score @s thingy matches 13 run say 13 +``` + +`@function demo:ref/bar/tree_57/15_28` + +```mcfunction +execute if score @s thingy matches ..21 run function demo:ref/bar/tree_57/15_21 +execute if score @s thingy matches 22.. run function demo:ref/bar/tree_57/22_28 +``` + +`@function demo:ref/bar/tree_57/15_21` + +```mcfunction +execute if score @s thingy matches ..18 run function demo:ref/bar/tree_57/15_18 +execute if score @s thingy matches 19.. run function demo:ref/bar/tree_57/19_21 +``` + +`@function demo:ref/bar/tree_57/15_18` + +```mcfunction +execute if score @s thingy matches ..16 run function demo:ref/bar/tree_57/15_16 +execute if score @s thingy matches 17.. run function demo:ref/bar/tree_57/17_18 +``` + +`@function demo:ref/bar/tree_57/15_16` + +```mcfunction +execute if score @s thingy matches 15 run say 15 +execute if score @s thingy matches 16 run say 16 +``` + +`@function demo:ref/bar/tree_57/17_18` + +```mcfunction +execute if score @s thingy matches 17 run say 17 +execute if score @s thingy matches 18 run say 18 +``` + +`@function demo:ref/bar/tree_57/19_21` + +```mcfunction +execute if score @s thingy matches ..20 run function demo:ref/bar/tree_57/19_20 +execute if score @s thingy matches 21 run say 21 +``` + +`@function demo:ref/bar/tree_57/19_20` + +```mcfunction +execute if score @s thingy matches 19 run say 19 +execute if score @s thingy matches 20 run say 20 +``` + +`@function demo:ref/bar/tree_57/22_28` + +```mcfunction +execute if score @s thingy matches ..25 run function demo:ref/bar/tree_57/22_25 +execute if score @s thingy matches 26.. run function demo:ref/bar/tree_57/26_28 +``` + +`@function demo:ref/bar/tree_57/22_25` + +```mcfunction +execute if score @s thingy matches ..23 run function demo:ref/bar/tree_57/22_23 +execute if score @s thingy matches 24.. run function demo:ref/bar/tree_57/24_25 +``` + +`@function demo:ref/bar/tree_57/22_23` + +```mcfunction +execute if score @s thingy matches 22 run say 22 +execute if score @s thingy matches 23 run say 23 +``` + +`@function demo:ref/bar/tree_57/24_25` + +```mcfunction +execute if score @s thingy matches 24 run say 24 +execute if score @s thingy matches 25 run say 25 +``` + +`@function demo:ref/bar/tree_57/26_28` + +```mcfunction +execute if score @s thingy matches ..27 run function demo:ref/bar/tree_57/26_27 +execute if score @s thingy matches 28 run say 28 +``` + +`@function demo:ref/bar/tree_57/26_27` + +```mcfunction +execute if score @s thingy matches 26 run say 26 +execute if score @s thingy matches 27 run say 27 +``` + +`@function demo:ref/bar/tree_57/29_56` + +```mcfunction +execute if score @s thingy matches ..42 run function demo:ref/bar/tree_57/29_42 +execute if score @s thingy matches 43.. run function demo:ref/bar/tree_57/43_56 +``` + +`@function demo:ref/bar/tree_57/29_42` + +```mcfunction +execute if score @s thingy matches ..35 run function demo:ref/bar/tree_57/29_35 +execute if score @s thingy matches 36.. run function demo:ref/bar/tree_57/36_42 +``` + +`@function demo:ref/bar/tree_57/29_35` + +```mcfunction +execute if score @s thingy matches ..32 run function demo:ref/bar/tree_57/29_32 +execute if score @s thingy matches 33.. run function demo:ref/bar/tree_57/33_35 +``` + +`@function demo:ref/bar/tree_57/29_32` + +```mcfunction +execute if score @s thingy matches ..30 run function demo:ref/bar/tree_57/29_30 +execute if score @s thingy matches 31.. run function demo:ref/bar/tree_57/31_32 +``` + +`@function demo:ref/bar/tree_57/29_30` + +```mcfunction +execute if score @s thingy matches 29 run say 29 +execute if score @s thingy matches 30 run say 30 +``` + +`@function demo:ref/bar/tree_57/31_32` + +```mcfunction +execute if score @s thingy matches 31 run say 31 +execute if score @s thingy matches 32 run say 32 +``` + +`@function demo:ref/bar/tree_57/33_35` + +```mcfunction +execute if score @s thingy matches ..34 run function demo:ref/bar/tree_57/33_34 +execute if score @s thingy matches 35 run say 35 +``` + +`@function demo:ref/bar/tree_57/33_34` + +```mcfunction +execute if score @s thingy matches 33 run say 33 +execute if score @s thingy matches 34 run say 34 +``` + +`@function demo:ref/bar/tree_57/36_42` + +```mcfunction +execute if score @s thingy matches ..39 run function demo:ref/bar/tree_57/36_39 +execute if score @s thingy matches 40.. run function demo:ref/bar/tree_57/40_42 +``` + +`@function demo:ref/bar/tree_57/36_39` + +```mcfunction +execute if score @s thingy matches ..37 run function demo:ref/bar/tree_57/36_37 +execute if score @s thingy matches 38.. run function demo:ref/bar/tree_57/38_39 +``` + +`@function demo:ref/bar/tree_57/36_37` + +```mcfunction +execute if score @s thingy matches 36 run say 36 +execute if score @s thingy matches 37 run say 37 +``` + +`@function demo:ref/bar/tree_57/38_39` + +```mcfunction +execute if score @s thingy matches 38 run say 38 +execute if score @s thingy matches 39 run say 39 +``` + +`@function demo:ref/bar/tree_57/40_42` + +```mcfunction +execute if score @s thingy matches ..41 run function demo:ref/bar/tree_57/40_41 +execute if score @s thingy matches 42 run say 42 +``` + +`@function demo:ref/bar/tree_57/40_41` + +```mcfunction +execute if score @s thingy matches 40 run say 40 +execute if score @s thingy matches 41 run say 41 +``` + +`@function demo:ref/bar/tree_57/43_56` + +```mcfunction +execute if score @s thingy matches ..49 run function demo:ref/bar/tree_57/43_49 +execute if score @s thingy matches 50.. run function demo:ref/bar/tree_57/50_56 +``` + +`@function demo:ref/bar/tree_57/43_49` + +```mcfunction +execute if score @s thingy matches ..46 run function demo:ref/bar/tree_57/43_46 +execute if score @s thingy matches 47.. run function demo:ref/bar/tree_57/47_49 +``` + +`@function demo:ref/bar/tree_57/43_46` + +```mcfunction +execute if score @s thingy matches ..44 run function demo:ref/bar/tree_57/43_44 +execute if score @s thingy matches 45.. run function demo:ref/bar/tree_57/45_46 +``` + +`@function demo:ref/bar/tree_57/43_44` + +```mcfunction +execute if score @s thingy matches 43 run say 43 +execute if score @s thingy matches 44 run say 44 +``` + +`@function demo:ref/bar/tree_57/45_46` + +```mcfunction +execute if score @s thingy matches 45 run say 45 +execute if score @s thingy matches 46 run say 46 +``` + +`@function demo:ref/bar/tree_57/47_49` + +```mcfunction +execute if score @s thingy matches ..48 run function demo:ref/bar/tree_57/47_48 +execute if score @s thingy matches 49 run say 49 +``` + +`@function demo:ref/bar/tree_57/47_48` + +```mcfunction +execute if score @s thingy matches 47 run say 47 +execute if score @s thingy matches 48 run say 48 +``` + +`@function demo:ref/bar/tree_57/50_56` + +```mcfunction +execute if score @s thingy matches ..53 run function demo:ref/bar/tree_57/50_53 +execute if score @s thingy matches 54.. run function demo:ref/bar/tree_57/54_56 +``` + +`@function demo:ref/bar/tree_57/50_53` + +```mcfunction +execute if score @s thingy matches ..51 run function demo:ref/bar/tree_57/50_51 +execute if score @s thingy matches 52.. run function demo:ref/bar/tree_57/52_53 +``` + +`@function demo:ref/bar/tree_57/50_51` + +```mcfunction +execute if score @s thingy matches 50 run say 50 +execute if score @s thingy matches 51 run say 51 +``` + +`@function demo:ref/bar/tree_57/52_53` + +```mcfunction +execute if score @s thingy matches 52 run say 52 +execute if score @s thingy matches 53 run say 53 +``` + +`@function demo:ref/bar/tree_57/54_56` + +```mcfunction +execute if score @s thingy matches ..55 run function demo:ref/bar/tree_57/54_55 +execute if score @s thingy matches 56 run say 56 +``` + +`@function demo:ref/bar/tree_57/54_55` + +```mcfunction +execute if score @s thingy matches 54 run say 54 +execute if score @s thingy matches 55 run say 55 +``` + +`@function demo:ref/ayy` + +```mcfunction +say 123 +``` + +`@function demo:ref/bar/nested_execute_0` + +```mcfunction +say hello +``` + +`@function demo:bar` + +```mcfunction +execute as @a run function demo:bar/nested_execute_0 +execute as @e[type=pig, scores={foo=1.., bar=0}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 0 +execute as @e[type=pig, scores={foo=1.., bar=0}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~ air +execute as @e[type=pig, scores={foo=1.., bar=1}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 1 +execute as @e[type=pig, scores={foo=1.., bar=1}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~1 air +execute as @e[type=pig, scores={foo=1.., bar=2}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 2 +execute as @e[type=pig, scores={foo=1.., bar=2}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~2 air +execute as @e[type=pig, scores={foo=1.., bar=3}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 3 +execute as @e[type=pig, scores={foo=1.., bar=3}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~3 air +execute as @e[type=pig, scores={foo=1.., bar=4}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 4 +execute as @e[type=pig, scores={foo=1.., bar=4}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~4 air +execute as @e[type=pig, scores={foo=1.., bar=5}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 5 +execute as @e[type=pig, scores={foo=1.., bar=5}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~5 air +execute as @e[type=pig, scores={foo=1.., bar=6}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 6 +execute as @e[type=pig, scores={foo=1.., bar=6}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~6 air +execute as @e[type=pig, scores={foo=1.., bar=7}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 7 +execute as @e[type=pig, scores={foo=1.., bar=7}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~7 air +execute as @e[type=pig, scores={foo=1.., bar=8}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 8 +execute as @e[type=pig, scores={foo=1.., bar=8}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~8 air +execute as @e[type=pig, scores={foo=1.., bar=9}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 9 +execute as @e[type=pig, scores={foo=1.., bar=9}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~9 air +execute as @e[type=pig, scores={foo=1.., bar=10}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 10 +execute as @e[type=pig, scores={foo=1.., bar=10}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~10 air +execute as @e[type=pig, scores={foo=1.., bar=11}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 11 +execute as @e[type=pig, scores={foo=1.., bar=11}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~11 air +execute as @e[type=pig, scores={foo=1.., bar=12}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 12 +execute as @e[type=pig, scores={foo=1.., bar=12}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~12 air +execute as @e[type=pig, scores={foo=1.., bar=13}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 13 +execute as @e[type=pig, scores={foo=1.., bar=13}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~13 air +execute as @e[type=pig, scores={foo=1.., bar=14}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 14 +execute as @e[type=pig, scores={foo=1.., bar=14}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~14 air +execute as @e[type=pig, scores={foo=1.., bar=15}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 15 +execute as @e[type=pig, scores={foo=1.., bar=15}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~15 air +execute as @e[type=pig, scores={foo=1.., bar=16}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 16 +execute as @e[type=pig, scores={foo=1.., bar=16}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~16 air +execute as @e[type=pig, scores={foo=1.., bar=17}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 17 +execute as @e[type=pig, scores={foo=1.., bar=17}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~17 air +execute as @e[type=pig, scores={foo=1.., bar=18}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 18 +execute as @e[type=pig, scores={foo=1.., bar=18}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~18 air +execute as @e[type=pig, scores={foo=1.., bar=19}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 19 +execute as @e[type=pig, scores={foo=1.., bar=19}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~19 air +execute as @e[type=pig, scores={foo=1.., bar=20}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 20 +execute as @e[type=pig, scores={foo=1.., bar=20}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~20 air +execute as @e[type=pig, scores={foo=1.., bar=21}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 21 +execute as @e[type=pig, scores={foo=1.., bar=21}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~21 air +execute as @e[type=pig, scores={foo=1.., bar=22}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 22 +execute as @e[type=pig, scores={foo=1.., bar=22}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~22 air +execute as @e[type=pig, scores={foo=1.., bar=23}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 23 +execute as @e[type=pig, scores={foo=1.., bar=23}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~23 air +execute as @e[type=pig, scores={foo=1.., bar=24}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 24 +execute as @e[type=pig, scores={foo=1.., bar=24}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~24 air +execute as @e[type=pig, scores={foo=1.., bar=25}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 25 +execute as @e[type=pig, scores={foo=1.., bar=25}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~25 air +execute as @e[type=pig, scores={foo=1.., bar=26}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 26 +execute as @e[type=pig, scores={foo=1.., bar=26}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~26 air +execute as @e[type=pig, scores={foo=1.., bar=27}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 27 +execute as @e[type=pig, scores={foo=1.., bar=27}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~27 air +execute as @e[type=pig, scores={foo=1.., bar=28}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 28 +execute as @e[type=pig, scores={foo=1.., bar=28}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~28 air +execute as @e[type=pig, scores={foo=1.., bar=29}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 29 +execute as @e[type=pig, scores={foo=1.., bar=29}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~29 air +execute as @e[type=pig, scores={foo=1.., bar=30}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 30 +execute as @e[type=pig, scores={foo=1.., bar=30}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~30 air +execute as @e[type=pig, scores={foo=1.., bar=31}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 31 +execute as @e[type=pig, scores={foo=1.., bar=31}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~31 air +execute as @e[type=pig, scores={foo=1.., bar=32}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 32 +execute as @e[type=pig, scores={foo=1.., bar=32}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~32 air +execute as @e[type=pig, scores={foo=1.., bar=33}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 33 +execute as @e[type=pig, scores={foo=1.., bar=33}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~33 air +execute as @e[type=pig, scores={foo=1.., bar=34}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 34 +execute as @e[type=pig, scores={foo=1.., bar=34}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~34 air +execute as @e[type=pig, scores={foo=1.., bar=35}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 35 +execute as @e[type=pig, scores={foo=1.., bar=35}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~35 air +execute as @e[type=pig, scores={foo=1.., bar=36}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 36 +execute as @e[type=pig, scores={foo=1.., bar=36}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~36 air +execute as @e[type=pig, scores={foo=1.., bar=37}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 37 +execute as @e[type=pig, scores={foo=1.., bar=37}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~37 air +execute as @e[type=pig, scores={foo=1.., bar=38}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 38 +execute as @e[type=pig, scores={foo=1.., bar=38}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~38 air +execute as @e[type=pig, scores={foo=1.., bar=39}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 39 +execute as @e[type=pig, scores={foo=1.., bar=39}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~39 air +execute as @e[type=pig, scores={foo=1.., bar=40}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 40 +execute as @e[type=pig, scores={foo=1.., bar=40}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~40 air +execute as @e[type=pig, scores={foo=1.., bar=41}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run say 41 +execute as @e[type=pig, scores={foo=1.., bar=41}, tag=okok] at @s anchored eyes align xyz positioned ~ ~1 ~ if block ^ ^ ^1 stone run setblock ~ ~ ~41 air +execute if score @s thingy matches 0..20 run function demo:bar/tree_42/0_20 +execute if score @s thingy matches 21..41 run function demo:bar/tree_42/21_41 +say ok +say bye +execute if score @s thingy matches 0..20 run function demo:bar/tree_42/0_20 +execute if score @s thingy matches 21..41 run function demo:bar/tree_42/21_41 +execute if score @s thingy matches 0..28 run function demo:bar/tree_57/0_28 +execute if score @s thingy matches 29..56 run function demo:bar/tree_57/29_56 +``` + +`@function demo:foo` + +```mcfunction +say 123 +say (((1, 2), (1, 2)), ((1, 2), (1, 2))) +say wat +``` + +`@function demo:bar/tree_42/0_1` + +```mcfunction +execute if score @s thingy matches 0 run say 0 +execute if score @s thingy matches 1 run say 1 +``` + +`@function demo:bar/tree_42/0_10` + +```mcfunction +execute if score @s thingy matches ..5 run function demo:bar/tree_42/0_5 +execute if score @s thingy matches 6.. run function demo:bar/tree_42/6_10 +``` + +`@function demo:bar/tree_42/0_2` + +```mcfunction +execute if score @s thingy matches ..1 run function demo:bar/tree_42/0_1 +execute if score @s thingy matches 2 run say 2 +``` + +`@function demo:bar/tree_42/0_20` + +```mcfunction +execute if score @s thingy matches ..10 run function demo:bar/tree_42/0_10 +execute if score @s thingy matches 11.. run function demo:bar/tree_42/11_20 +``` + +`@function demo:bar/tree_42/0_5` + +```mcfunction +execute if score @s thingy matches ..2 run function demo:bar/tree_42/0_2 +execute if score @s thingy matches 3.. run function demo:bar/tree_42/3_5 +``` + +`@function demo:bar/tree_42/11_12` + +```mcfunction +execute if score @s thingy matches 11 run say 11 +execute if score @s thingy matches 12 run say 12 +``` + +`@function demo:bar/tree_42/11_13` + +```mcfunction +execute if score @s thingy matches ..12 run function demo:bar/tree_42/11_12 +execute if score @s thingy matches 13 run say 13 +``` + +`@function demo:bar/tree_42/11_15` + +```mcfunction +execute if score @s thingy matches ..13 run function demo:bar/tree_42/11_13 +execute if score @s thingy matches 14.. run function demo:bar/tree_42/14_15 +``` + +`@function demo:bar/tree_42/11_20` + +```mcfunction +execute if score @s thingy matches ..15 run function demo:bar/tree_42/11_15 +execute if score @s thingy matches 16.. run function demo:bar/tree_42/16_20 +``` + +`@function demo:bar/tree_42/14_15` + +```mcfunction +execute if score @s thingy matches 14 run say 14 +execute if score @s thingy matches 15 run say 15 +``` + +`@function demo:bar/tree_42/16_17` + +```mcfunction +execute if score @s thingy matches 16 run say 16 +execute if score @s thingy matches 17 run say 17 +``` + +`@function demo:bar/tree_42/16_18` + +```mcfunction +execute if score @s thingy matches ..17 run function demo:bar/tree_42/16_17 +execute if score @s thingy matches 18 run say 18 +``` + +`@function demo:bar/tree_42/16_20` + +```mcfunction +execute if score @s thingy matches ..18 run function demo:bar/tree_42/16_18 +execute if score @s thingy matches 19.. run function demo:bar/tree_42/19_20 +``` + +`@function demo:bar/tree_42/19_20` + +```mcfunction +execute if score @s thingy matches 19 run say 19 +execute if score @s thingy matches 20 run say 20 +``` + +`@function demo:bar/tree_42/21_22` + +```mcfunction +execute if score @s thingy matches 21 run say 21 +execute if score @s thingy matches 22 run say 22 +``` + +`@function demo:bar/tree_42/21_23` + +```mcfunction +execute if score @s thingy matches ..22 run function demo:bar/tree_42/21_22 +execute if score @s thingy matches 23 run say 23 +``` + +`@function demo:bar/tree_42/21_26` + +```mcfunction +execute if score @s thingy matches ..23 run function demo:bar/tree_42/21_23 +execute if score @s thingy matches 24.. run function demo:bar/tree_42/24_26 +``` + +`@function demo:bar/tree_42/21_31` + +```mcfunction +execute if score @s thingy matches ..26 run function demo:bar/tree_42/21_26 +execute if score @s thingy matches 27.. run function demo:bar/tree_42/27_31 +``` + +`@function demo:bar/tree_42/21_41` + +```mcfunction +execute if score @s thingy matches ..31 run function demo:bar/tree_42/21_31 +execute if score @s thingy matches 32.. run function demo:bar/tree_42/32_41 +``` + +`@function demo:bar/tree_42/24_25` + +```mcfunction +execute if score @s thingy matches 24 run say 24 +execute if score @s thingy matches 25 run say 25 +``` + +`@function demo:bar/tree_42/24_26` + +```mcfunction +execute if score @s thingy matches ..25 run function demo:bar/tree_42/24_25 +execute if score @s thingy matches 26 run say 26 +``` + +`@function demo:bar/tree_42/27_28` + +```mcfunction +execute if score @s thingy matches 27 run say 27 +execute if score @s thingy matches 28 run say 28 +``` + +`@function demo:bar/tree_42/27_29` + +```mcfunction +execute if score @s thingy matches ..28 run function demo:bar/tree_42/27_28 +execute if score @s thingy matches 29 run say 29 +``` + +`@function demo:bar/tree_42/27_31` + +```mcfunction +execute if score @s thingy matches ..29 run function demo:bar/tree_42/27_29 +execute if score @s thingy matches 30.. run function demo:bar/tree_42/30_31 +``` + +`@function demo:bar/tree_42/30_31` + +```mcfunction +execute if score @s thingy matches 30 run say 30 +execute if score @s thingy matches 31 run say 31 +``` + +`@function demo:bar/tree_42/32_33` + +```mcfunction +execute if score @s thingy matches 32 run say 32 +execute if score @s thingy matches 33 run say 33 +``` + +`@function demo:bar/tree_42/32_34` + +```mcfunction +execute if score @s thingy matches ..33 run function demo:bar/tree_42/32_33 +execute if score @s thingy matches 34 run say 34 +``` + +`@function demo:bar/tree_42/32_36` + +```mcfunction +execute if score @s thingy matches ..34 run function demo:bar/tree_42/32_34 +execute if score @s thingy matches 35.. run function demo:bar/tree_42/35_36 +``` + +`@function demo:bar/tree_42/32_41` + +```mcfunction +execute if score @s thingy matches ..36 run function demo:bar/tree_42/32_36 +execute if score @s thingy matches 37.. run function demo:bar/tree_42/37_41 +``` + +`@function demo:bar/tree_42/35_36` + +```mcfunction +execute if score @s thingy matches 35 run say 35 +execute if score @s thingy matches 36 run say 36 +``` + +`@function demo:bar/tree_42/37_38` + +```mcfunction +execute if score @s thingy matches 37 run say 37 +execute if score @s thingy matches 38 run say 38 +``` + +`@function demo:bar/tree_42/37_39` + +```mcfunction +execute if score @s thingy matches ..38 run function demo:bar/tree_42/37_38 +execute if score @s thingy matches 39 run say 39 +``` + +`@function demo:bar/tree_42/37_41` + +```mcfunction +execute if score @s thingy matches ..39 run function demo:bar/tree_42/37_39 +execute if score @s thingy matches 40.. run function demo:bar/tree_42/40_41 +``` + +`@function demo:bar/tree_42/3_4` + +```mcfunction +execute if score @s thingy matches 3 run say 3 +execute if score @s thingy matches 4 run say 4 +``` + +`@function demo:bar/tree_42/3_5` + +```mcfunction +execute if score @s thingy matches ..4 run function demo:bar/tree_42/3_4 +execute if score @s thingy matches 5 run say 5 +``` + +`@function demo:bar/tree_42/40_41` + +```mcfunction +execute if score @s thingy matches 40 run say 40 +execute if score @s thingy matches 41 run say 41 +``` + +`@function demo:bar/tree_42/6_10` + +```mcfunction +execute if score @s thingy matches ..8 run function demo:bar/tree_42/6_8 +execute if score @s thingy matches 9.. run function demo:bar/tree_42/9_10 +``` + +`@function demo:bar/tree_42/6_7` + +```mcfunction +execute if score @s thingy matches 6 run say 6 +execute if score @s thingy matches 7 run say 7 +``` + +`@function demo:bar/tree_42/6_8` + +```mcfunction +execute if score @s thingy matches ..7 run function demo:bar/tree_42/6_7 +execute if score @s thingy matches 8 run say 8 +``` + +`@function demo:bar/tree_42/9_10` + +```mcfunction +execute if score @s thingy matches 9 run say 9 +execute if score @s thingy matches 10 run say 10 +``` + +`@function demo:bar/tree_57/0_1` + +```mcfunction +execute if score @s thingy matches 0 run say 0 +execute if score @s thingy matches 1 run say 1 +``` + +`@function demo:bar/tree_57/0_14` + +```mcfunction +execute if score @s thingy matches ..7 run function demo:bar/tree_57/0_7 +execute if score @s thingy matches 8.. run function demo:bar/tree_57/8_14 +``` + +`@function demo:bar/tree_57/0_28` + +```mcfunction +execute if score @s thingy matches ..14 run function demo:bar/tree_57/0_14 +execute if score @s thingy matches 15.. run function demo:bar/tree_57/15_28 +``` + +`@function demo:bar/tree_57/0_3` + +```mcfunction +execute if score @s thingy matches ..1 run function demo:bar/tree_57/0_1 +execute if score @s thingy matches 2.. run function demo:bar/tree_57/2_3 +``` + +`@function demo:bar/tree_57/0_7` + +```mcfunction +execute if score @s thingy matches ..3 run function demo:bar/tree_57/0_3 +execute if score @s thingy matches 4.. run function demo:bar/tree_57/4_7 +``` + +`@function demo:bar/tree_57/10_11` + +```mcfunction +execute if score @s thingy matches 10 run say 10 +execute if score @s thingy matches 11 run say 11 +``` + +`@function demo:bar/tree_57/12_13` + +```mcfunction +execute if score @s thingy matches 12 run say 12 +execute if score @s thingy matches 13 run say 13 +``` + +`@function demo:bar/tree_57/12_14` + +```mcfunction +execute if score @s thingy matches ..13 run function demo:bar/tree_57/12_13 +execute if score @s thingy matches 14 run say 14 +``` + +`@function demo:bar/tree_57/15_16` + +```mcfunction +execute if score @s thingy matches 15 run say 15 +execute if score @s thingy matches 16 run say 16 +``` + +`@function demo:bar/tree_57/15_18` + +```mcfunction +execute if score @s thingy matches ..16 run function demo:bar/tree_57/15_16 +execute if score @s thingy matches 17.. run function demo:bar/tree_57/17_18 +``` + +`@function demo:bar/tree_57/15_21` + +```mcfunction +execute if score @s thingy matches ..18 run function demo:bar/tree_57/15_18 +execute if score @s thingy matches 19.. run function demo:bar/tree_57/19_21 +``` + +`@function demo:bar/tree_57/15_28` + +```mcfunction +execute if score @s thingy matches ..21 run function demo:bar/tree_57/15_21 +execute if score @s thingy matches 22.. run function demo:bar/tree_57/22_28 +``` + +`@function demo:bar/tree_57/17_18` + +```mcfunction +execute if score @s thingy matches 17 run say 17 +execute if score @s thingy matches 18 run say 18 +``` + +`@function demo:bar/tree_57/19_20` + +```mcfunction +execute if score @s thingy matches 19 run say 19 +execute if score @s thingy matches 20 run say 20 +``` + +`@function demo:bar/tree_57/19_21` + +```mcfunction +execute if score @s thingy matches ..20 run function demo:bar/tree_57/19_20 +execute if score @s thingy matches 21 run say 21 +``` + +`@function demo:bar/tree_57/22_23` + +```mcfunction +execute if score @s thingy matches 22 run say 22 +execute if score @s thingy matches 23 run say 23 +``` + +`@function demo:bar/tree_57/22_25` + +```mcfunction +execute if score @s thingy matches ..23 run function demo:bar/tree_57/22_23 +execute if score @s thingy matches 24.. run function demo:bar/tree_57/24_25 +``` + +`@function demo:bar/tree_57/22_28` + +```mcfunction +execute if score @s thingy matches ..25 run function demo:bar/tree_57/22_25 +execute if score @s thingy matches 26.. run function demo:bar/tree_57/26_28 +``` + +`@function demo:bar/tree_57/24_25` + +```mcfunction +execute if score @s thingy matches 24 run say 24 +execute if score @s thingy matches 25 run say 25 +``` + +`@function demo:bar/tree_57/26_27` + +```mcfunction +execute if score @s thingy matches 26 run say 26 +execute if score @s thingy matches 27 run say 27 +``` + +`@function demo:bar/tree_57/26_28` + +```mcfunction +execute if score @s thingy matches ..27 run function demo:bar/tree_57/26_27 +execute if score @s thingy matches 28 run say 28 +``` + +`@function demo:bar/tree_57/29_30` + +```mcfunction +execute if score @s thingy matches 29 run say 29 +execute if score @s thingy matches 30 run say 30 +``` + +`@function demo:bar/tree_57/29_32` + +```mcfunction +execute if score @s thingy matches ..30 run function demo:bar/tree_57/29_30 +execute if score @s thingy matches 31.. run function demo:bar/tree_57/31_32 +``` + +`@function demo:bar/tree_57/29_35` + +```mcfunction +execute if score @s thingy matches ..32 run function demo:bar/tree_57/29_32 +execute if score @s thingy matches 33.. run function demo:bar/tree_57/33_35 +``` + +`@function demo:bar/tree_57/29_42` + +```mcfunction +execute if score @s thingy matches ..35 run function demo:bar/tree_57/29_35 +execute if score @s thingy matches 36.. run function demo:bar/tree_57/36_42 +``` + +`@function demo:bar/tree_57/29_56` + +```mcfunction +execute if score @s thingy matches ..42 run function demo:bar/tree_57/29_42 +execute if score @s thingy matches 43.. run function demo:bar/tree_57/43_56 +``` + +`@function demo:bar/tree_57/2_3` + +```mcfunction +execute if score @s thingy matches 2 run say 2 +execute if score @s thingy matches 3 run say 3 +``` + +`@function demo:bar/tree_57/31_32` + +```mcfunction +execute if score @s thingy matches 31 run say 31 +execute if score @s thingy matches 32 run say 32 +``` + +`@function demo:bar/tree_57/33_34` + +```mcfunction +execute if score @s thingy matches 33 run say 33 +execute if score @s thingy matches 34 run say 34 +``` + +`@function demo:bar/tree_57/33_35` + +```mcfunction +execute if score @s thingy matches ..34 run function demo:bar/tree_57/33_34 +execute if score @s thingy matches 35 run say 35 +``` + +`@function demo:bar/tree_57/36_37` + +```mcfunction +execute if score @s thingy matches 36 run say 36 +execute if score @s thingy matches 37 run say 37 +``` + +`@function demo:bar/tree_57/36_39` + +```mcfunction +execute if score @s thingy matches ..37 run function demo:bar/tree_57/36_37 +execute if score @s thingy matches 38.. run function demo:bar/tree_57/38_39 +``` + +`@function demo:bar/tree_57/36_42` + +```mcfunction +execute if score @s thingy matches ..39 run function demo:bar/tree_57/36_39 +execute if score @s thingy matches 40.. run function demo:bar/tree_57/40_42 +``` + +`@function demo:bar/tree_57/38_39` + +```mcfunction +execute if score @s thingy matches 38 run say 38 +execute if score @s thingy matches 39 run say 39 +``` + +`@function demo:bar/tree_57/40_41` + +```mcfunction +execute if score @s thingy matches 40 run say 40 +execute if score @s thingy matches 41 run say 41 +``` + +`@function demo:bar/tree_57/40_42` + +```mcfunction +execute if score @s thingy matches ..41 run function demo:bar/tree_57/40_41 +execute if score @s thingy matches 42 run say 42 +``` + +`@function demo:bar/tree_57/43_44` + +```mcfunction +execute if score @s thingy matches 43 run say 43 +execute if score @s thingy matches 44 run say 44 +``` + +`@function demo:bar/tree_57/43_46` + +```mcfunction +execute if score @s thingy matches ..44 run function demo:bar/tree_57/43_44 +execute if score @s thingy matches 45.. run function demo:bar/tree_57/45_46 +``` + +`@function demo:bar/tree_57/43_49` + +```mcfunction +execute if score @s thingy matches ..46 run function demo:bar/tree_57/43_46 +execute if score @s thingy matches 47.. run function demo:bar/tree_57/47_49 +``` + +`@function demo:bar/tree_57/43_56` + +```mcfunction +execute if score @s thingy matches ..49 run function demo:bar/tree_57/43_49 +execute if score @s thingy matches 50.. run function demo:bar/tree_57/50_56 +``` + +`@function demo:bar/tree_57/45_46` + +```mcfunction +execute if score @s thingy matches 45 run say 45 +execute if score @s thingy matches 46 run say 46 +``` + +`@function demo:bar/tree_57/47_48` + +```mcfunction +execute if score @s thingy matches 47 run say 47 +execute if score @s thingy matches 48 run say 48 +``` + +`@function demo:bar/tree_57/47_49` + +```mcfunction +execute if score @s thingy matches ..48 run function demo:bar/tree_57/47_48 +execute if score @s thingy matches 49 run say 49 +``` + +`@function demo:bar/tree_57/4_5` + +```mcfunction +execute if score @s thingy matches 4 run say 4 +execute if score @s thingy matches 5 run say 5 +``` + +`@function demo:bar/tree_57/4_7` + +```mcfunction +execute if score @s thingy matches ..5 run function demo:bar/tree_57/4_5 +execute if score @s thingy matches 6.. run function demo:bar/tree_57/6_7 +``` + +`@function demo:bar/tree_57/50_51` + +```mcfunction +execute if score @s thingy matches 50 run say 50 +execute if score @s thingy matches 51 run say 51 +``` + +`@function demo:bar/tree_57/50_53` + +```mcfunction +execute if score @s thingy matches ..51 run function demo:bar/tree_57/50_51 +execute if score @s thingy matches 52.. run function demo:bar/tree_57/52_53 +``` + +`@function demo:bar/tree_57/50_56` + +```mcfunction +execute if score @s thingy matches ..53 run function demo:bar/tree_57/50_53 +execute if score @s thingy matches 54.. run function demo:bar/tree_57/54_56 +``` + +`@function demo:bar/tree_57/52_53` + +```mcfunction +execute if score @s thingy matches 52 run say 52 +execute if score @s thingy matches 53 run say 53 +``` + +`@function demo:bar/tree_57/54_55` + +```mcfunction +execute if score @s thingy matches 54 run say 54 +execute if score @s thingy matches 55 run say 55 +``` + +`@function demo:bar/tree_57/54_56` + +```mcfunction +execute if score @s thingy matches ..55 run function demo:bar/tree_57/54_55 +execute if score @s thingy matches 56 run say 56 +``` + +`@function demo:bar/tree_57/6_7` + +```mcfunction +execute if score @s thingy matches 6 run say 6 +execute if score @s thingy matches 7 run say 7 +``` + +`@function demo:bar/tree_57/8_11` + +```mcfunction +execute if score @s thingy matches ..9 run function demo:bar/tree_57/8_9 +execute if score @s thingy matches 10.. run function demo:bar/tree_57/10_11 +``` + +`@function demo:bar/tree_57/8_14` + +```mcfunction +execute if score @s thingy matches ..11 run function demo:bar/tree_57/8_11 +execute if score @s thingy matches 12.. run function demo:bar/tree_57/12_14 +``` + +`@function demo:bar/tree_57/8_9` + +```mcfunction +execute if score @s thingy matches 8 run say 8 +execute if score @s thingy matches 9 run say 9 +``` + +`@function demo:ayy` + +```mcfunction +say 123 +``` + +`@function demo:bar/nested_execute_0` + +```mcfunction +say hello +``` + +`@function_tag demo:ref/nothing` + +```json +{ + "values": [ + "demo:ref/bar" + ] +} +``` + +`@function_tag demo:nothing` + +```json +{ + "values": [ + "demo:bar" + ] +} +``` + +### bolt_memo + +`@function bolt_memo:8qn9wmdkocxmt` + +```mcfunction +say uwu +``` diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index aceab6839..5b0faf4df 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -868,6 +868,7 @@ "execute:prepend:worldgen_structure_set_tag:name:content", "execute:prepend:worldgen_structure_tag:name:content", "execute:publish:port", + "execute:raw:value", "execute:recipe:give:targets:*", "execute:recipe:give:targets:recipe", "execute:recipe:name:content", @@ -1391,6 +1392,9 @@ "macro:name:proc:body", "macro:name:subcommand", "me:action", + "memo:body", + "memo:subcommand", + "memo:variable:subcommand", "merge:advancement:name:content", "merge:block_tag:name:content", "merge:blockstate:name:content", @@ -1530,6 +1534,7 @@ "raise", "raise:exception", "raise:exception:from:cause", + "raw:value", "recipe:give:targets:*", "recipe:give:targets:recipe", "recipe:name:content", diff --git a/packages/bolt/tests/test_bolt.py b/packages/bolt/tests/test_bolt.py index 962928b50..e437bf447 100644 --- a/packages/bolt/tests/test_bolt.py +++ b/packages/bolt/tests/test_bolt.py @@ -1,4 +1,6 @@ from pathlib import Path +from random import Random +from uuid import UUID import pytest from beet import Context, Function @@ -30,8 +32,13 @@ def test_parse(snapshot: SnapshotFixture, ctx: Context, source: Function): mc.database[mc.database.current] = CompilationUnit(resource_location="demo:test") + rand = Random() + rand.seed(42) + try: - ast = mc.parse(source) + ast = mc.parse( + source, provide={"uuid_factory": lambda: UUID(int=rand.getrandbits(128))} + ) except DiagnosticError as exc: diagnostics = exc.diagnostics finally: diff --git a/packages/bolt/tests/test_examples.py b/packages/bolt/tests/test_examples.py index ceffab1dd..c87cf1780 100644 --- a/packages/bolt/tests/test_examples.py +++ b/packages/bolt/tests/test_examples.py @@ -1,12 +1,16 @@ import os +from pathlib import Path import pytest -from beet import run_beet +from beet import ProjectCache, run_beet from lectern import Document from pytest_insta import SnapshotFixture @pytest.mark.parametrize("directory", os.listdir("examples")) -def test_build(snapshot: SnapshotFixture, directory: str): - with run_beet(directory=f"examples/{directory}") as ctx: +def test_build(snapshot: SnapshotFixture, directory: str, tmp_path: Path): + with run_beet( + directory=f"examples/{directory}", + cache=ProjectCache(tmp_path / ".beet_cache", tmp_path / "generated"), + ) as ctx: assert snapshot("pack.md") == ctx.inject(Document) From 8bcce85e7b7aacfb8e406b8c88194c0066d6d71d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Jan 2023 22:55:17 +0100 Subject: [PATCH 1108/1554] chore: update deps --- packages/bolt/poetry.lock | 51 +++++++++++++++--------------------- packages/bolt/pyproject.toml | 6 ++--- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 7bc5482c7..147222347 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -46,33 +46,24 @@ image = ["Pillow"] [[package]] name = "black" -version = "22.10.0" +version = "22.12.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, ] [package.dependencies] @@ -906,14 +897,14 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, + {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, + {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, ] [package.dependencies] @@ -966,14 +957,14 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.32.2" +version = "7.33.0" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" files = [ - {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, - {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, + {file = "python-semantic-release-7.33.0.tar.gz", hash = "sha256:c559161c091e24f555c021fee63a9a704cc7ae59e774913ba5018fa3c9ce2e89"}, + {file = "python_semantic_release-7.33.0-py3-none-any.whl", hash = "sha256:b1fcc2d3be64e1b8d98228b2e2377f1c664e12eca038754eb8d0453c2ff4b438"}, ] [package.dependencies] @@ -994,7 +985,7 @@ wheel = "*" dev = ["black", "isort", "tox"] docs = ["Jinja2 (==3.0.3)", "Sphinx (==1.3.6)"] mypy = ["mypy", "types-requests"] -test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=5,<6)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] +test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=7,<8)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] [[package]] name = "pywin32-ctypes" @@ -1424,4 +1415,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "990bfa7318071ea1c3538aa04167c3e048a0b05258838883702ce8b9a9d5083f" +content-hash = "1868e385477c193b6aff11627b6b2ee1d711c0ee8354c7cc4cb8d9f6f3b0dc46" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index cda5ce43f..5d3bc8a4c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -27,10 +27,10 @@ beet = ">=0.82.4" mecha = ">=0.64.0" [tool.poetry.group.dev.dependencies] -pytest = "^7.2.0" -black = "^22.10.0" +pytest = "^7.2.1" +black = "^22.12.0" isort = "^5.10.1" -python-semantic-release = "^7.32.2" +python-semantic-release = "^7.33.0" pytest-insta = "^0.2.0" lectern = ">=0.26.0" From f4536d2433515d5f02d182185a7ed333e229a903 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 31 Jan 2023 23:04:39 +0100 Subject: [PATCH 1109/1554] chore: update workflow --- packages/bolt/.github/workflows/main.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/bolt/.github/workflows/main.yml b/packages/bolt/.github/workflows/main.yml index a2fbc22b9..a6abe09c9 100644 --- a/packages/bolt/.github/workflows/main.yml +++ b/packages/bolt/.github/workflows/main.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [main] +env: + PYTHON_VERSION: "3.10" + POETRY_VERSION: "1.3.2" + jobs: main: name: Test and release @@ -16,29 +20,30 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Set up Python 3.10 + - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: ${{ env.PYTHON_VERSION }} - name: Cache poetry id: cache-poetry uses: actions/cache@v3 with: path: ~/.local - key: poetry-${{ runner.os }} + key: poetry-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ env.POETRY_VERSION }} - name: Install poetry if: steps.cache-poetry.outputs.cache-hit != 'true' uses: snok/install-poetry@v1 with: + version: ${{ env.POETRY_VERSION }} virtualenvs-in-project: true - name: Cache venv id: cache-venv uses: actions/cache@v3 with: path: .venv - key: venv-${{ runner.os }}-${{ hashFiles('poetry.lock') }} + key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ env.POETRY_VERSION }}-${{ hashFiles('poetry.lock') }} restore-keys: | - venv-${{ runner.os }}- + venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ env.POETRY_VERSION }}- - name: Install dependencies if: steps.cache-venv.outputs.cache-hit != 'true' run: poetry install From 2ce1e0b6d4aa3b4bd0caab9c35db70ca3f12882e Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 31 Jan 2023 22:06:09 +0000 Subject: [PATCH 1110/1554] 0.23.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 3b0c909c7..3c7fbcac7 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.23.0 (2023-01-31) +### Feature +* Add memo and a bunch of tweaks ([`77326b7`](https://github.com/mcbeet/bolt/commit/77326b7056a038743a1f20511ae565cacbc15f10)) + ## v0.22.0 (2022-12-04) ### Feature * Refactor identifier tracing with proper lexical scope abstraction ([`2f60bd4`](https://github.com/mcbeet/bolt/commit/2f60bd43c8affc2747c56e2d4dd4045e45561677)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index bbfeacce5..1052d1386 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.22.0" +__version__ = "0.23.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 5d3bc8a4c..c5e0c47ca 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.22.0" +version = "0.23.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 660362dfc43e88818df13b05bc407851799a818c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Feb 2023 05:03:54 +0100 Subject: [PATCH 1111/1554] feat: add output_perf --- packages/mecha/mecha/api.py | 70 ++++++++++++++++++++++++++++++-- packages/mecha/mecha/database.py | 2 + 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/packages/mecha/mecha/api.py b/packages/mecha/mecha/api.py index a2fe2a6ee..5e8115812 100644 --- a/packages/mecha/mecha/api.py +++ b/packages/mecha/mecha/api.py @@ -6,6 +6,7 @@ ] +import csv import logging import os import pickle @@ -14,6 +15,7 @@ from dataclasses import InitVar, dataclass from io import BufferedReader, BufferedWriter from pathlib import Path +from time import perf_counter_ns from typing import ( Any, Dict, @@ -21,6 +23,7 @@ List, Literal, Optional, + Tuple, Type, TypeVar, Union, @@ -122,6 +125,7 @@ class MechaOptions(BaseModel): match: Optional[List[str]] = None rules: Dict[str, Literal["ignore", "info", "warn", "error"]] = {} cache: bool = True + output_perf: Optional[FileSystemPath] = None @validator("formatting", pre=True) def formatting_preset(cls, value: Any): @@ -145,6 +149,10 @@ class Mecha: directory: Path = extra_field(init=False) cache: Optional[Cache] = extra_field(default=None) cache_backend: AstCacheBackend = extra_field(default_factory=AstCacheBackend) + output_perf: Optional[FileSystemPath] = extra_field(default=None) + perf_report: Optional[List[Tuple[str, str, int, List[float]]]] = extra_field( + default=None + ) spec: CommandSpec = extra_field(default=None) @@ -194,6 +202,9 @@ def __post_init__( if not self.cache and opts.cache: self.cache = ctx.cache["mecha"] + if opts.output_perf: + self.output_perf = ctx.directory / opts.output_perf + ctx.require(self.finalize) else: @@ -209,6 +220,9 @@ def __post_init__( self.steps.append(self.optimize) self.steps.append(self.check) + if self.perf_report is None and self.output_perf: + self.perf_report = [] + if not self.spec: self.spec = CommandSpec( multiline=multiline, @@ -452,6 +466,7 @@ def compile( for step, function in self.database.process_queue(): compilation_unit = self.database[function] + start_time = perf_counter_ns() if step < 0: if compilation_unit.ast: @@ -487,13 +502,32 @@ def compile( with self.serialize.use_diagnostics(compilation_unit.diagnostics): function.text = self.serialize(compilation_unit.ast, **formatting) + compilation_unit.perf[step] = (perf_counter_ns() - start_time) * 1e-06 + + sorted_functions = sorted( + self.database.session, + key=lambda f: self.database[f].resource_location or "", + ) + + if self.perf_report is not None: + for function in sorted_functions: + compilation_unit = self.database[function] + self.perf_report.append( + ( + compilation_unit.filename or "", + compilation_unit.resource_location or "", + len(list(compilation_unit.diagnostics.get_all_errors())), + [ + compilation_unit.perf.get(i, float("nan")) + for i in range(-1, len(self.steps) + 1) + ], + ) + ) + diagnostics = DiagnosticCollection( [ exc - for function in sorted( - self.database.session, - key=lambda f: self.database[f].resource_location or "", - ) + for function in sorted_functions for exc in self.database[function].diagnostics.exceptions ] ) @@ -528,6 +562,30 @@ def log_reported_diagnostics(self): elif diagnostic.level == "info": logger.info("%s", message, extra=extra) + def format_perf(self) -> List[List[str]]: + """Format perf report.""" + step_headers = [ + "Lint" + if step is self.lint + else "Transform" + if step is self.transform + else "Optimize" + if step is self.optimize + else "Check" + if step is self.check + else repr(step) + for step in self.steps + ] + + return [ + ["Filename", "Resource location", "Errors", "Parse"] + + step_headers + + ["Serialize"] + ] + [ + [filename, resource_location, str(errors)] + [f"{t:.3f}" for t in steps] + for filename, resource_location, errors, steps in self.perf_report or [] + ] + def finalize(self, ctx: Context): """Plugin that logs diagnostics and raises an exception if there are errors.""" try: @@ -538,4 +596,8 @@ def finalize(self, ctx: Context): if errors := list(self.diagnostics.get_all_errors()): raise DiagnosticErrorSummary(DiagnosticCollection(errors)) finally: + if path := self.output_perf: + logger.info('Output perf "%s".', os.path.relpath(path, self.directory)) + with open(path, "w") as f: + csv.writer(f).writerows(self.format_perf()) self.log_reported_diagnostics() diff --git a/packages/mecha/mecha/database.py b/packages/mecha/mecha/database.py index 723234b63..ba8101901 100644 --- a/packages/mecha/mecha/database.py +++ b/packages/mecha/mecha/database.py @@ -26,12 +26,14 @@ class CompilationUnit: priority: int = 0 diagnostics: DiagnosticCollection = extra_field(init=False) + perf: Dict[int, float] = extra_field(init=False) def __post_init__(self): self.diagnostics = DiagnosticCollection( filename=self.filename, hint=self.resource_location, ) + self.perf = {} class CompilationDatabase(Container[TextFileBase[Any], CompilationUnit]): From 70ac3b75f141c69be93c87f56f7ea2bb3f82b53f Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Feb 2023 04:05:00 +0000 Subject: [PATCH 1112/1554] 0.65.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index ffc65b288..9ecff30fb 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.65.0 (2023-02-01) +### Feature +* Add output_perf ([`d2cb290`](https://github.com/mcbeet/mecha/commit/d2cb290ba819ee0c55311e248478cca6e022e0cf)) + ## v0.64.0 (2023-01-30) ### Feature * Add mecha.contrib.raw ([`ec018dc`](https://github.com/mcbeet/mecha/commit/ec018dc67edf725c7c0b943260da11f9fda57986)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 3ae314103..bcbc7bfd2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.64.0" +__version__ = "0.65.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 43aafa440..70066b9c0 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.64.0" +version = "0.65.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 86ce4c7f027e6a328428f46c299b29c5ccc82ac5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Feb 2023 05:14:19 +0100 Subject: [PATCH 1113/1554] chore: update deps --- packages/bolt/poetry.lock | 14 +++++++------- packages/bolt/pyproject.toml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 147222347..06b84ef63 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -20,14 +20,14 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.82.4" +version = "0.83.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "beet-0.82.4-py3-none-any.whl", hash = "sha256:1c20f3ef4b4fd313f15692d6addf7695718d85f05e51b0845f81d68d63f36bca"}, - {file = "beet-0.82.4.tar.gz", hash = "sha256:6ced204ddb18215dbae0bbc09706c4996af87ff1f77f9cc99616d048a847cb46"}, + {file = "beet-0.83.0-py3-none-any.whl", hash = "sha256:9ffc32a6158dde5cff67ea98f4e3d25b44b40d1b549b204f2d5ca85d87418c0a"}, + {file = "beet-0.83.0.tar.gz", hash = "sha256:d21cb6a0d84b62db22813e1dc8fdf0f86b26401b3905b69bd0275e044c650083"}, ] [package.dependencies] @@ -635,14 +635,14 @@ files = [ [[package]] name = "mecha" -version = "0.64.0" +version = "0.65.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "mecha-0.64.0-py3-none-any.whl", hash = "sha256:170fc1d5f78cb000aa3614781fcfdea1a35fb1b998ecf22b41e9f79590e305de"}, - {file = "mecha-0.64.0.tar.gz", hash = "sha256:803457bfd09d584d096494ec7e2511228d232150a1e8494aabd11a23773b9dd1"}, + {file = "mecha-0.65.0-py3-none-any.whl", hash = "sha256:b58b9f34f2cd9d127f7d0c457b7fc44544d4382a4f64f283952606c4afff537c"}, + {file = "mecha-0.65.0.tar.gz", hash = "sha256:ef12548fdfdf538f717cddeb1879d8b75f009678404670e9b9e2a7fe3b0688a4"}, ] [package.dependencies] @@ -1415,4 +1415,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "1868e385477c193b6aff11627b6b2ee1d711c0ee8354c7cc4cb8d9f6f3b0dc46" +content-hash = "14b88126ac1f91d484cabae43ae5439c0e8c779152947468708d8e3144a49da0" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index c5e0c47ca..bb89df034 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.82.4" -mecha = ">=0.64.0" +beet = ">=0.83.0" +mecha = ">=0.65.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.1" From eb3aec7b6d606ded99a7b748c73a3a2412fabafd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Feb 2023 05:35:10 +0100 Subject: [PATCH 1114/1554] feat: atlas --- packages/bolt/tests/snapshots/bolt__parse_230__0.txt | 2 +- packages/bolt/tests/snapshots/bolt__parse_48__0.txt | 2 +- packages/bolt/tests/snapshots/bolt__parse_99__0.txt | 2 +- packages/bolt/tests/snapshots/spec__prototypes__0.json | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt index e042b0cd5..6f03d2c6c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt @@ -1,6 +1,6 @@ macro foo: pass -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'foo'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 124 other tokens but got literal 'foo'. # line 3, column 7 # 2 | pass # 3 | as @p foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index 8001545ab..c0c116c43 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 152 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 153 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt index fc6c39b78..bb65fe420 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 123 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 124 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 5b0faf4df..7406f62a2 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -28,6 +28,7 @@ "append:worldgen_structure_tag:name:content", "as:targets:subcommand", "at:targets:subcommand", + "atlas:name:content", "attribute:target:attribute:base:get", "attribute:target:attribute:base:get:scale", "attribute:target:attribute:base:set:value", @@ -282,6 +283,7 @@ "execute:append:worldgen_structure_tag:name:content", "execute:as:targets:subcommand", "execute:at:targets:subcommand", + "execute:atlas:name:content", "execute:attribute:target:attribute:base:get", "execute:attribute:target:attribute:base:get:scale", "execute:attribute:target:attribute:base:set:value", @@ -738,6 +740,7 @@ "execute:loot_table:name:content", "execute:me:action", "execute:merge:advancement:name:content", + "execute:merge:atlas:name:content", "execute:merge:block_tag:name:content", "execute:merge:blockstate:name:content", "execute:merge:dimension:name:content", @@ -1396,6 +1399,7 @@ "memo:subcommand", "memo:variable:subcommand", "merge:advancement:name:content", + "merge:atlas:name:content", "merge:block_tag:name:content", "merge:blockstate:name:content", "merge:dimension:name:content", From 56fb1a884a1c8ede3d905c6292bb351cf1e2b2bd Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Feb 2023 04:36:13 +0000 Subject: [PATCH 1115/1554] 0.24.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 3c7fbcac7..846a1fa6f 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.24.0 (2023-02-01) +### Feature +* Atlas ([`8703186`](https://github.com/mcbeet/bolt/commit/87031867ab7ce7014f88ef30e129cf1b115f5945)) + ## v0.23.0 (2023-01-31) ### Feature * Add memo and a bunch of tweaks ([`77326b7`](https://github.com/mcbeet/bolt/commit/77326b7056a038743a1f20511ae565cacbc15f10)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 1052d1386..3475acc0d 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.23.0" +__version__ = "0.24.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index bb89df034..ae05697e7 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.23.0" +version = "0.24.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From f756bfdeeb7ccc491dfcaebfda1aaa373c486f57 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Feb 2023 20:01:40 +0100 Subject: [PATCH 1116/1554] fix: update some typings --- packages/mecha/mecha/ast.py | 10 +- packages/mecha/package-lock.json | 14 +- packages/mecha/package.json | 2 +- packages/mecha/poetry.lock | 1092 +++++++++++++++--------------- packages/mecha/pyproject.toml | 2 +- 5 files changed, 560 insertions(+), 560 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 64f9c434f..d33a25817 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -684,15 +684,15 @@ def from_value(cls, value: Any) -> "AstNbt": return AstNbtValue(value=String(value)) elif isinstance(value, ByteArray): return AstNbtByteArray( - elements=AstChildren(cls.from_value(e) for e in value) + elements=AstChildren(cls.from_value(e) for e in value) # type: ignore ) elif isinstance(value, IntArray): return AstNbtIntArray( - elements=AstChildren(cls.from_value(e) for e in value) + elements=AstChildren(cls.from_value(e) for e in value) # type: ignore ) elif isinstance(value, LongArray): return AstNbtLongArray( - elements=AstChildren(cls.from_value(e) for e in value) + elements=AstChildren(cls.from_value(e) for e in value) # type: ignore ) elif isinstance(value, Mapping): compound: Mapping[Any, Any] = value @@ -700,14 +700,14 @@ def from_value(cls, value: Any) -> "AstNbt": entries=AstChildren( AstNbtCompoundEntry( key=AstNbtCompoundKey(value=str(k)), - value=cls.from_value(v), + value=cls.from_value(v), # type: ignore ) for k, v in compound.items() ) ) elif isinstance(value, Sequence): lst: Sequence[Any] = value - return AstNbtList(elements=AstChildren(cls.from_value(e) for e in lst)) + return AstNbtList(elements=AstChildren(cls.from_value(e) for e in lst)) # type: ignore else: raise ValueError(f"Invalid nbt value of type {type(value)!r}.") diff --git a/packages/mecha/package-lock.json b/packages/mecha/package-lock.json index 63c6ff58c..5077c8c40 100644 --- a/packages/mecha/package-lock.json +++ b/packages/mecha/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.282" + "pyright": "^1.1.292" } }, "node_modules/pyright": { - "version": "1.1.282", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.282.tgz", - "integrity": "sha512-qwlGhY/4wkZJJlxiwGzKL7Do6rVSOcXp72zplxJ76BbVIWuiKpGUeYIhLdONEAD22UwLTp8XvmARQzDnJ3EMSQ==", + "version": "1.1.292", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.292.tgz", + "integrity": "sha512-qwNT2mBKiZXSzVckHkyuCoyrKa8CXh6o4xH7PL/+jeIdiv+a5ljfkxPvIEm6Stln8YEU/tnQb8xODUtgKsu5YA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.282", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.282.tgz", - "integrity": "sha512-qwlGhY/4wkZJJlxiwGzKL7Do6rVSOcXp72zplxJ76BbVIWuiKpGUeYIhLdONEAD22UwLTp8XvmARQzDnJ3EMSQ==", + "version": "1.1.292", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.292.tgz", + "integrity": "sha512-qwNT2mBKiZXSzVckHkyuCoyrKa8CXh6o4xH7PL/+jeIdiv+a5ljfkxPvIEm6Stln8YEU/tnQb8xODUtgKsu5YA==", "dev": true } } diff --git a/packages/mecha/package.json b/packages/mecha/package.json index 255bd87e1..9c4fa9e71 100644 --- a/packages/mecha/package.json +++ b/packages/mecha/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.282" + "pyright": "^1.1.292" } } diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index ef52b8a5b..10664b937 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "attrs" version = "22.1.0" @@ -5,6 +7,10 @@ description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] [package.extras] dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] @@ -14,11 +20,15 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.82.2" +version = "0.83.1" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.10,<4.0" +files = [ + {file = "beet-0.83.1-py3-none-any.whl", hash = "sha256:f2f8b261314063d47ebf205c7a4b7902dce139d9d8c1d8019277860d6558d72b"}, + {file = "beet-0.83.1.tar.gz", hash = "sha256:775677c22ee99f8cadafa7fd8147a38a74628772624be20747031ea07d99d9df"}, +] [package.dependencies] click = ">=8.1.3,<9.0.0" @@ -41,6 +51,29 @@ description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] [package.dependencies] click = ">=8.0.0" @@ -62,6 +95,10 @@ description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, +] [package.dependencies] six = ">=1.9.0" @@ -78,6 +115,10 @@ description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, +] [[package]] name = "cffi" @@ -86,6 +127,72 @@ description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" @@ -97,6 +204,10 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "dev" optional = false python-versions = ">=3.6.0" +files = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] [package.extras] unicode-backport = ["unicodedata2"] @@ -108,6 +219,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -119,6 +234,10 @@ description = "Colorization of help messages in Click" category = "main" optional = false python-versions = "*" +files = [ + {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, + {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, +] [package.dependencies] click = ">=7.0,<9" @@ -133,6 +252,10 @@ description = "Logging integration for Click" category = "dev" optional = false python-versions = "*" +files = [ + {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, + {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, +] [package.dependencies] click = "*" @@ -144,6 +267,10 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "cryptography" @@ -152,6 +279,34 @@ description = "cryptography is a package which provides cryptographic recipes an category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, + {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, + {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, + {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, + {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, + {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, + {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, + {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, + {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, + {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, +] [package.dependencies] cffi = ">=1.12" @@ -171,6 +326,10 @@ description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] [[package]] name = "dotty-dict" @@ -179,6 +338,10 @@ description = "Dictionary wrapper for quick access to deeply nested keys." category = "dev" optional = false python-versions = ">=3.5,<4.0" +files = [ + {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, + {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, +] [[package]] name = "exceptiongroup" @@ -187,6 +350,10 @@ description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, + {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, +] [package.extras] test = ["pytest (>=6)"] @@ -198,6 +365,10 @@ description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] [package.dependencies] smmap = ">=3.0.1,<6" @@ -209,6 +380,10 @@ description = "GitPython is a python library used to interact with Git repositor category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" @@ -220,6 +395,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" @@ -228,6 +407,10 @@ description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, +] [package.dependencies] zipp = ">=0.5" @@ -244,6 +427,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "invoke" @@ -252,6 +439,10 @@ description = "Pythonic task execution" category = "dev" optional = false python-versions = "*" +files = [ + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, +] [[package]] name = "isort" @@ -260,6 +451,10 @@ description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.6.1,<4.0" +files = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -274,6 +469,10 @@ description = "Utility functions for Python class constructs" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] [package.dependencies] more-itertools = "*" @@ -289,6 +488,10 @@ description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] [package.extras] test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] @@ -301,6 +504,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -315,6 +522,10 @@ description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, + {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, +] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} @@ -334,6 +545,10 @@ description = "Literate Minecraft data packs and resource packs." category = "dev" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "lectern-0.26.0-py3-none-any.whl", hash = "sha256:e46eb1f1befd5892cad5bffc65fac1debe008e641ea6ea5c281e49b8a831cf0f"}, + {file = "lectern-0.26.0.tar.gz", hash = "sha256:0496bfaee29641e04e8c6ef0a6db0ce5b4b01e5064a0d6d1c8ce3a6e7a548066"}, +] [package.dependencies] beet = ">=0.79.0" @@ -347,6 +562,10 @@ description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, +] [package.dependencies] mdurl = ">=0.1,<1.0" @@ -368,6 +587,48 @@ description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] [[package]] name = "mdurl" @@ -376,6 +637,10 @@ description = "Markdown URL utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "more-itertools" @@ -384,6 +649,10 @@ description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, +] [[package]] name = "mypy-extensions" @@ -392,6 +661,10 @@ description = "Experimental type system extensions for programs checked with the category = "dev" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "nbtlib" @@ -400,6 +673,10 @@ description = "A python package to read and edit nbt data" category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, + {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, +] [package.dependencies] numpy = "*" @@ -411,25 +688,63 @@ description = "NumPy is the fundamental package for array computing with Python. category = "main" optional = false python-versions = ">=3.8" - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pathspec" -version = "0.10.2" +files = [ + {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, + {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, + {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, + {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, + {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, + {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, + {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, + {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, + {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, + {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, +] + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.10.2" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, +] [[package]] name = "pkginfo" @@ -438,6 +753,10 @@ description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, +] [package.extras] testing = ["coverage", "nose"] @@ -449,6 +768,10 @@ description = "A small Python package for determining appropriate platform-speci category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, +] [package.extras] docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] @@ -461,6 +784,10 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -473,6 +800,10 @@ description = "C parser in Python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydantic" @@ -481,6 +812,44 @@ description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, + {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, + {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, + {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, + {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, + {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, + {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, + {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, + {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, + {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, + {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, + {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, + {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, + {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, + {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, + {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, + {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, + {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, + {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, + {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, + {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, + {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, + {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, +] [package.dependencies] typing-extensions = ">=4.1.0" @@ -496,6 +865,10 @@ description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] [package.extras] plugins = ["importlib-metadata"] @@ -507,6 +880,10 @@ description = "pyparsing module - Classes and methods to define and execute pars category = "dev" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -518,6 +895,10 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -538,6 +919,10 @@ description = "A practical snapshot testing plugin for pytest" category = "dev" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "pytest_insta-0.2.0-py3-none-any.whl", hash = "sha256:e8d8a19f44917fa70102b132ddd4d6afcebe2a31987422dc79458ff849fe1a9e"}, + {file = "pytest_insta-0.2.0.tar.gz", hash = "sha256:c4e549f3c5aea8acf1ae6da12cffaaf4e4b3b03d9059c5115deab59f37b23867"}, +] [package.dependencies] pytest = ">=7.2.0,<8.0.0" @@ -550,6 +935,10 @@ description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, + {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, +] [package.dependencies] requests = ">=2.25.0" @@ -566,6 +955,10 @@ description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" +files = [ + {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, + {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, +] [package.dependencies] click = ">=7,<9" @@ -594,6 +987,10 @@ description = "" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] [[package]] name = "pyyaml" @@ -602,6 +999,48 @@ description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "readme-renderer" @@ -610,6 +1049,10 @@ description = "readme_renderer is a library for rendering \"readme\" description category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, + {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, +] [package.dependencies] bleach = ">=2.1.0" @@ -626,6 +1069,10 @@ description = "Python HTTP for Humans." category = "dev" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -644,6 +1091,10 @@ description = "A utility belt for advanced users of python-requests" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, + {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, +] [package.dependencies] requests = ">=2.0.1,<3.0.0" @@ -655,6 +1106,10 @@ description = "Validating URI References per RFC 3986" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] [package.extras] idna2008 = ["idna"] @@ -666,6 +1121,10 @@ description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] [package.dependencies] cryptography = ">=2.0" @@ -678,6 +1137,10 @@ description = "Python helper for Semantic Versioning (http://semver.org/)" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, + {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, +] [[package]] name = "six" @@ -686,6 +1149,10 @@ description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" @@ -694,6 +1161,10 @@ description = "A pure Python implementation of a sliding window memory map manag category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "tokenstream" @@ -702,6 +1173,10 @@ description = "A versatile token stream for handwritten parsers" category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, + {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, +] [[package]] name = "toml" @@ -710,6 +1185,10 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" @@ -718,6 +1197,10 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" @@ -726,6 +1209,10 @@ description = "Style preserving TOML library" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] [[package]] name = "tqdm" @@ -734,6 +1221,10 @@ description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -751,6 +1242,10 @@ description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, + {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, +] [package.dependencies] colorama = ">=0.4.3" @@ -771,6 +1266,10 @@ description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] [[package]] name = "urllib3" @@ -779,6 +1278,10 @@ description = "HTTP library with thread-safe connection pooling, file post, and category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +files = [ + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] @@ -792,6 +1295,10 @@ description = "Character encoding aliases for legacy web content" category = "dev" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "wheel" @@ -800,6 +1307,10 @@ description = "A built-package format for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, + {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, +] [package.extras] test = ["pytest (>=3.0.0)"] @@ -811,535 +1322,7 @@ description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "zipp" -version = "3.10.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.10" -content-hash = "67a8c50a8a1f45f06f4bbf182c1079cb3ced8d8b7a1457ec28d1795401f5dc12" - -[metadata.files] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -beet = [ - {file = "beet-0.82.2-py3-none-any.whl", hash = "sha256:d53c19d1fbbc5dd826c9c7810438c6da67c5b3542c075b3e34c23ee8cbcc477f"}, - {file = "beet-0.82.2.tar.gz", hash = "sha256:967cfefb80f9e6a9cb137a6552cc82bc763af487c6757a5fb8824528412ffe0b"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -bleach = [ - {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, - {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -click-help-colors = [ - {file = "click-help-colors-0.9.1.tar.gz", hash = "sha256:78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d"}, - {file = "click_help_colors-0.9.1-py3-none-any.whl", hash = "sha256:25a6bd22d8abbc72c18a416a1cf21ab65b6120bee48e9637829666cbad22d51d"}, -] -click-log = [ - {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, - {file = "click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -cryptography = [ - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, - {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, - {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, - {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] -dotty-dict = [ - {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, - {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -gitpython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -invoke = [ - {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, - {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -jaraco-classes = [ - {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, - {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -keyring = [ - {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, - {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, -] -lectern = [ - {file = "lectern-0.26.0-py3-none-any.whl", hash = "sha256:e46eb1f1befd5892cad5bffc65fac1debe008e641ea6ea5c281e49b8a831cf0f"}, - {file = "lectern-0.26.0.tar.gz", hash = "sha256:0496bfaee29641e04e8c6ef0a6db0ce5b4b01e5064a0d6d1c8ce3a6e7a548066"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mdurl = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] -more-itertools = [ - {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, - {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nbtlib = [ - {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"}, - {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"}, -] -numpy = [ - {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, - {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, - {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, - {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, - {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, - {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, - {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, - {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, - {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, - {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, - {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, -] -pkginfo = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, -] -platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -pytest-insta = [ - {file = "pytest_insta-0.2.0-py3-none-any.whl", hash = "sha256:e8d8a19f44917fa70102b132ddd4d6afcebe2a31987422dc79458ff849fe1a9e"}, - {file = "pytest_insta-0.2.0.tar.gz", hash = "sha256:c4e549f3c5aea8acf1ae6da12cffaaf4e4b3b03d9059c5115deab59f37b23867"}, -] -python-gitlab = [ - {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, - {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, -] -python-semantic-release = [ - {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, - {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -readme-renderer = [ - {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, - {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, - {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, -] -rfc3986 = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] -semver = [ - {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, - {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -tokenstream = [ - {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, - {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, -] -tqdm = [ - {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, - {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, -] -twine = [ - {file = "twine-3.8.0-py3-none-any.whl", hash = "sha256:d0550fca9dc19f3d5e8eadfce0c227294df0a2a951251a4385797c8a6198b7c8"}, - {file = "twine-3.8.0.tar.gz", hash = "sha256:8efa52658e0ae770686a13b675569328f1fba9837e5de1867bfe5f46a9aefe19"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -wheel = [ - {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, - {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, -] -wrapt = [ +files = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, @@ -1405,7 +1388,24 @@ wrapt = [ {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] -zipp = [ + +[[package]] +name = "zipp" +version = "3.10.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "9d77661e472bb34c0c3847cb17ad3f268c29509286ccbdd1779c1da8eb9e1eaf" diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 70066b9c0..ccf145c44 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,7 +23,7 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.82.2" +beet = ">=0.83.1" tokenstream = "^1.4.2" [tool.poetry.group.dev.dependencies] From 8dd65b613049bc6d50077b37aa8119114a9b3130 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Feb 2023 19:02:38 +0000 Subject: [PATCH 1117/1554] 0.65.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 9ecff30fb..841b68570 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.65.1 (2023-02-01) +### Fix +* Update some typings ([`d08b712`](https://github.com/mcbeet/mecha/commit/d08b712ce3f8d60f52c44af6e37b154e37ee4ed7)) + ## v0.65.0 (2023-02-01) ### Feature * Add output_perf ([`d2cb290`](https://github.com/mcbeet/mecha/commit/d2cb290ba819ee0c55311e248478cca6e022e0cf)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index bcbc7bfd2..b9937fc34 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.65.0" +__version__ = "0.65.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index ccf145c44..642952b76 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.65.0" +version = "0.65.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 5c853e2e6fdac07139273b739e7b1b4f88212696 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Feb 2023 20:07:45 +0100 Subject: [PATCH 1118/1554] fix: update pyright --- packages/bolt/bolt/parse.py | 2 +- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- packages/bolt/poetry.lock | 16 ++++++++-------- packages/bolt/pyproject.toml | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index c3bfe7992..97bebe6f3 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -2218,7 +2218,7 @@ def __call__(self, stream: TokenStream) -> Any: if ( isinstance(node, AstIdentifier) and not isinstance(parent, AstCall) - and node.value in self.builtins + and node.value in self.builtins # type: ignore and not lexical_scope.has_binding(node.value, search_parents=True) ): # Reset the underlying token generator so that the identifier can diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 371428816..6e9167f35 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.281" + "pyright": "^1.1.292" } }, "node_modules/pyright": { - "version": "1.1.281", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.281.tgz", - "integrity": "sha512-mSqu+LpQzk36fx8x68XrCnosrU4EJ/MAHR6yG08NDBOSROnepvkv8ffbBKL02JTgQkTI3oDia7KTSCeX1MfRBQ==", + "version": "1.1.292", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.292.tgz", + "integrity": "sha512-qwNT2mBKiZXSzVckHkyuCoyrKa8CXh6o4xH7PL/+jeIdiv+a5ljfkxPvIEm6Stln8YEU/tnQb8xODUtgKsu5YA==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.281", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.281.tgz", - "integrity": "sha512-mSqu+LpQzk36fx8x68XrCnosrU4EJ/MAHR6yG08NDBOSROnepvkv8ffbBKL02JTgQkTI3oDia7KTSCeX1MfRBQ==", + "version": "1.1.292", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.292.tgz", + "integrity": "sha512-qwNT2mBKiZXSzVckHkyuCoyrKa8CXh6o4xH7PL/+jeIdiv+a5ljfkxPvIEm6Stln8YEU/tnQb8xODUtgKsu5YA==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 988e87d56..9c4fa9e71 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.281" + "pyright": "^1.1.292" } } diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 06b84ef63..f60a4bc02 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -20,14 +20,14 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.83.0" +version = "0.83.1" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "beet-0.83.0-py3-none-any.whl", hash = "sha256:9ffc32a6158dde5cff67ea98f4e3d25b44b40d1b549b204f2d5ca85d87418c0a"}, - {file = "beet-0.83.0.tar.gz", hash = "sha256:d21cb6a0d84b62db22813e1dc8fdf0f86b26401b3905b69bd0275e044c650083"}, + {file = "beet-0.83.1-py3-none-any.whl", hash = "sha256:f2f8b261314063d47ebf205c7a4b7902dce139d9d8c1d8019277860d6558d72b"}, + {file = "beet-0.83.1.tar.gz", hash = "sha256:775677c22ee99f8cadafa7fd8147a38a74628772624be20747031ea07d99d9df"}, ] [package.dependencies] @@ -635,18 +635,18 @@ files = [ [[package]] name = "mecha" -version = "0.65.0" +version = "0.65.1" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "mecha-0.65.0-py3-none-any.whl", hash = "sha256:b58b9f34f2cd9d127f7d0c457b7fc44544d4382a4f64f283952606c4afff537c"}, - {file = "mecha-0.65.0.tar.gz", hash = "sha256:ef12548fdfdf538f717cddeb1879d8b75f009678404670e9b9e2a7fe3b0688a4"}, + {file = "mecha-0.65.1-py3-none-any.whl", hash = "sha256:65fc9a3d205b293cd13028bf660771a04c48da85ab22fbdb0f72d44cb1e261fa"}, + {file = "mecha-0.65.1.tar.gz", hash = "sha256:309edd558254a60132898de95e66f6b2ae6c06b6ea91f309ab0c277026296860"}, ] [package.dependencies] -beet = ">=0.82.2" +beet = ">=0.83.1" tokenstream = ">=1.4.2,<2.0.0" [[package]] @@ -1415,4 +1415,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "14b88126ac1f91d484cabae43ae5439c0e8c779152947468708d8e3144a49da0" +content-hash = "5ed04c30958a2d8f94bb0b58614ac7bec0f13085263f03d4dff724e4f54fd8f3" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index ae05697e7..97fc93677 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,8 +23,8 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.83.0" -mecha = ">=0.65.0" +beet = ">=0.83.1" +mecha = ">=0.65.1" [tool.poetry.group.dev.dependencies] pytest = "^7.2.1" From 4b6e0a3b6ac227e5d3d69d7d2bb1ab2b6ec17f07 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Feb 2023 19:08:56 +0000 Subject: [PATCH 1119/1554] 0.24.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 846a1fa6f..5fdaa50d7 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.24.1 (2023-02-01) +### Fix +* Update pyright ([`24120a9`](https://github.com/mcbeet/bolt/commit/24120a963b476676391a51fa25350a6a06225469)) + ## v0.24.0 (2023-02-01) ### Feature * Atlas ([`8703186`](https://github.com/mcbeet/bolt/commit/87031867ab7ce7014f88ef30e129cf1b115f5945)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 3475acc0d..3e32cf36d 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.24.0" +__version__ = "0.24.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 97fc93677..b3c05f974 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.24.0" +version = "0.24.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 0e062e865a0b1027ae17a8e7ebc4f14cec7fffc5 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 1 Feb 2023 22:23:06 +0100 Subject: [PATCH 1120/1554] feat: add docstrings --- packages/bolt/bolt/ast.py | 6 +++ packages/bolt/bolt/codegen.py | 17 +++++- packages/bolt/bolt/parse.py | 44 +++++++++++++++- packages/bolt/bolt/pattern.py | 2 + .../bolt/examples/bolt_docstring/beet.yml | 6 +++ .../src/data/demo/functions/foo.mcfunction | 34 ++++++++++++ .../tests/resources/bolt_examples.mcfunction | 52 +++++++++++++++++++ .../tests/snapshots/bolt__parse_181__0.txt | 4 +- .../tests/snapshots/bolt__parse_181__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_19__0.txt | 2 +- .../tests/snapshots/bolt__parse_212__0.txt | 2 +- .../tests/snapshots/bolt__parse_21__0.txt | 4 +- .../tests/snapshots/bolt__parse_21__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_22__0.txt | 4 +- .../tests/snapshots/bolt__parse_22__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_23__0.txt | 4 +- .../tests/snapshots/bolt__parse_23__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_24__0.txt | 4 +- .../tests/snapshots/bolt__parse_24__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_25__0.txt | 4 +- .../tests/snapshots/bolt__parse_25__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_26__0.txt | 4 +- .../tests/snapshots/bolt__parse_26__1.txt | 10 ++-- .../tests/snapshots/bolt__parse_320__0.txt | 15 ++++++ .../tests/snapshots/bolt__parse_320__1.txt | 15 ++++++ .../tests/snapshots/bolt__parse_321__0.txt | 16 ++++++ .../tests/snapshots/bolt__parse_321__1.txt | 15 ++++++ .../tests/snapshots/bolt__parse_322__0.txt | 19 +++++++ .../tests/snapshots/bolt__parse_322__1.txt | 15 ++++++ .../tests/snapshots/bolt__parse_323__0.txt | 30 +++++++++++ .../tests/snapshots/bolt__parse_323__1.txt | 17 ++++++ .../tests/snapshots/bolt__parse_324__0.txt | 30 +++++++++++ .../tests/snapshots/bolt__parse_324__1.txt | 16 ++++++ .../tests/snapshots/bolt__parse_325__0.txt | 5 ++ .../tests/snapshots/bolt__parse_326__0.txt | 7 +++ .../tests/snapshots/bolt__parse_327__0.txt | 43 +++++++++++++++ .../tests/snapshots/bolt__parse_327__1.txt | 18 +++++++ .../tests/snapshots/bolt__parse_328__0.txt | 51 ++++++++++++++++++ .../tests/snapshots/bolt__parse_328__1.txt | 22 ++++++++ .../tests/snapshots/bolt__parse_329__0.txt | 34 ++++++++++++ .../tests/snapshots/bolt__parse_329__1.txt | 16 ++++++ .../tests/snapshots/bolt__parse_330__0.txt | 17 ++++++ .../tests/snapshots/bolt__parse_330__1.txt | 15 ++++++ .../tests/snapshots/bolt__parse_331__0.txt | 17 ++++++ .../tests/snapshots/bolt__parse_331__1.txt | 15 ++++++ .../tests/snapshots/bolt__parse_38__0.txt | 2 +- .../tests/snapshots/bolt__parse_39__0.txt | 2 +- .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../examples__build_bolt_docstring__0.pack.md | 28 ++++++++++ 49 files changed, 689 insertions(+), 56 deletions(-) create mode 100644 packages/bolt/examples/bolt_docstring/beet.yml create mode 100644 packages/bolt/examples/bolt_docstring/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_320__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_320__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_321__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_321__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_322__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_322__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_323__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_323__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_324__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_324__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_325__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_326__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_327__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_327__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_328__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_328__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_329__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_329__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_330__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_330__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_331__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_331__1.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index dee82c77a..7ef27b252 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -24,6 +24,7 @@ "AstTargetItem", "AstAssignment", "AstDecorator", + "AstDocstring", "AstFunctionSignature", "AstFunctionSignatureElement", "AstFunctionSignatureArgument", @@ -261,6 +262,11 @@ class AstDecorator(AstNode): expression: AstExpression = required_field() +@dataclass(frozen=True, slots=True) +class AstDocstring(AstCommandSentinel): + """Ast docstring node.""" + + @dataclass(frozen=True, slots=True) class AstFunctionSignatureElement(AstNode): """Base node for function signature element.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 39c8d4450..3ebc095b7 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -47,6 +47,7 @@ AstClassName, AstDict, AstDictItem, + AstDocstring, AstExpressionBinary, AstExpressionUnary, AstFormatString, @@ -556,6 +557,7 @@ def function( acc: Accumulator, ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: signature = cast(AstFunctionSignature, node.arguments[0]) + body = cast(AstRoot, node.arguments[1]) decorators: List[str] = [] for decorator in signature.decorators: @@ -578,6 +580,10 @@ def function( ] with acc.function(signature.name, *arguments): + if body.commands and isinstance(body.commands[0], AstDocstring): + yield body.commands[0] + body = replace(body, commands=AstChildren(body.commands[1:])) + for arg in signature.arguments: if isinstance(arg, AstFunctionSignatureArgument) and arg.default: acc.statement(f"if {arg.name} is {acc.missing()}:") @@ -585,7 +591,7 @@ def function( value = yield from visit_single(arg.default, required=True) acc.statement(f"{arg.name} = {value}") - yield from visit_body(cast(AstRoot, node.arguments[1]), acc) + yield from visit_body(body, acc) for decorator, value in list(zip(signature.decorators, decorators))[::-1]: acc.statement( @@ -723,6 +729,15 @@ def class_definition( return [] + @rule(AstDocstring) + def docstring( + self, + node: AstDocstring, + acc: Accumulator, + ) -> Optional[List[str]]: + acc.statement(repr(cast(AstValue, node.arguments[0]).value)) + return [] + @rule(AstCommand, identifier="del:target") def del_statement( self, diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 97bebe6f3..e186fc6d5 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -37,6 +37,7 @@ "parse_import_name", "parse_name_list", "GlobalNonlocalHandler", + "DocstringHandler", "FlushPendingBindingsParser", "StatementSubcommandHandler", "DeferredRootBacktracker", @@ -104,6 +105,7 @@ AstDict, AstDictItem, AstDictUnquotedKey, + AstDocstring, AstExpression, AstExpressionBinary, AstExpressionUnary, @@ -148,6 +150,7 @@ from .emit import CommandEmitter from .module import Module, ModuleManager, UnusableCompilationUnit from .pattern import ( + DOCSTRING_PATTERN, FALSE_PATTERN, IDENTIFIER_PATTERN, MODULE_PATTERN, @@ -617,6 +620,7 @@ def create_bolt_command_parser(parser: Parser, modules: ModuleManager): parser = MemoHandler(parser) parser = GlobalNonlocalHandler(parser) parser = ImportStatementHandler(parser, modules) + parser = DocstringHandler(parser) parser = UndefinedIdentifierErrorHandler(parser) parser = StatementSubcommandHandler(parser) return parser @@ -1716,6 +1720,24 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class DocstringHandler: + """Emit docstring as special node.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if ( + isinstance(node := self.parser(stream), AstCommand) + and node.identifier == "statement" + and node.arguments + and isinstance(literal := node.arguments[0], AstValue) + and isinstance(literal.value, str) + ): + return set_location(AstDocstring(arguments=AstChildren([literal])), node) + return node + + @dataclass class FlushPendingBindingsParser: """Parser that flushes pending bindings.""" @@ -2273,6 +2295,7 @@ def __call__(self, stream: TokenStream) -> Any: true=TRUE_PATTERN, false=FALSE_PATTERN, null=NULL_PATTERN, + docstring=DOCSTRING_PATTERN, string=STRING_PATTERN, resource=( None @@ -2282,12 +2305,23 @@ def __call__(self, stream: TokenStream) -> Any: ), number=NUMBER_PATTERN, ): - curly, bracket, true, false, null, string, resource, number = stream.expect( + ( + curly, + bracket, + true, + false, + null, + docstring, + string, + resource, + number, + ) = stream.expect( ("curly", "{"), ("bracket", "["), "true", "false", "null", + "docstring", "string", "resource", "number", @@ -2345,6 +2379,14 @@ def __call__(self, stream: TokenStream) -> Any: value = False elif null: value = None + elif docstring: + value = ( + docstring.value[4:-3] + if docstring.value.startswith("r") + else self.quote_helper.unquote_string( + docstring._replace(value=docstring.value[2:-2]) + ) + ) elif string: value = ( string.value[2:-1] diff --git a/packages/bolt/bolt/pattern.py b/packages/bolt/bolt/pattern.py index 3ff94d88a..3023a9146 100644 --- a/packages/bolt/bolt/pattern.py +++ b/packages/bolt/bolt/pattern.py @@ -4,6 +4,7 @@ "FALSE_PATTERN", "NULL_PATTERN", "IDENTIFIER_PATTERN", + "DOCSTRING_PATTERN", "MODULE_PATTERN", "STRING_PATTERN", "NUMBER_PATTERN", @@ -20,6 +21,7 @@ NULL_PATTERN: str = r"\b(?:null|None)\b" IDENTIFIER_PATTERN: str = rf"(?!_bolt_|{KEYWORD_PATTERN})[a-zA-Z_][a-zA-Z0-9_]*\b" MODULE_PATTERN: str = rf"{IDENTIFIER_PATTERN}(?:\.{IDENTIFIER_PATTERN})*" +DOCSTRING_PATTERN: str = r'r?"""(?:\\.|[^\\])*?"""' "|" r"r?'''(?:\\.|[^\\])*?'''" STRING_PATTERN: str = r'r?"(?:\\.|[^\\\n])*?"' "|" r"r?'(?:\\.|[^\\\n])*?'" NUMBER_PATTERN: str = r"(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\b" RESOURCE_LOCATION_PATTERN: str = r"(?:\.\./|\./|[0-9a-z_\-\.]+:)[0-9a-z_./-]+" diff --git a/packages/bolt/examples/bolt_docstring/beet.yml b/packages/bolt/examples/bolt_docstring/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_docstring/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_docstring/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_docstring/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..3fb45c14e --- /dev/null +++ b/packages/bolt/examples/bolt_docstring/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,34 @@ +value = """ + hello + world +""" + +say repr(value) + +def f(): + """My function""" + return 42 + +say f() +say f.__doc__ + +def g(a=123): + """My other function""" + return a + +say g() +say g.__doc__ + +class A: + """This is a class. + + It doesn't do anything. + """ + +say repr(A.__doc__) + +value = r""" + foo\n\nbar +""" + +say repr(value) diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 0a948bb16..e6bad61a9 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1160,3 +1160,55 @@ memo bop foo=bop foo: foo += 8 say foo print(foo) +### +"""hello""" +### +"""hello +world""" +### +""" +This is a docstring. + +Hello world +""" +### +print( + """ + This is a docstring. + + Hello world + """ +) +### +foo = """ + This is a docstring. + + Hello world +""" +### +""" +### +foo = """ + This is a docstring. +### +def f(): + """My function""" + return 42 +### +def g(a=123): + """My other function""" + return a +### +class A: + """This is a class. + + It doesn't do anything. + """ +### +""" +foo\n\nbar +""" +### +r""" +foo\n\nbar +""" diff --git a/packages/bolt/tests/snapshots/bolt__parse_181__0.txt b/packages/bolt/tests/snapshots/bolt__parse_181__0.txt index ca2878c60..45d65a587 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_181__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_181__0.txt @@ -4,10 +4,10 @@ demo:foo location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=8, lineno=1, colno=9) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_181__1.txt b/packages/bolt/tests/snapshots/bolt__parse_181__1.txt index ca7f42aa4..2b6e821f3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_181__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_181__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = 'demo:foo' -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + 'demo:foo' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=9, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_19__0.txt b/packages/bolt/tests/snapshots/bolt__parse_19__0.txt index d580f0754..0fece4cd1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_19__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got literal '%3'. +#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, null or 4 other tokens but got literal '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_212__0.txt b/packages/bolt/tests/snapshots/bolt__parse_212__0.txt index e193b4448..7aede4ffe 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_212__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_212__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got invalid ':'. +#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, null or 4 other tokens but got invalid ':'. # line 1, column 5 # 1 | with: # : ^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_21__0.txt b/packages/bolt/tests/snapshots/bolt__parse_21__0.txt index a267df1d1..38a36da9d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_21__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_21__0.txt @@ -4,10 +4,10 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_21__1.txt b/packages/bolt/tests/snapshots/bolt__parse_21__1.txt index 640822503..37e3b7901 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_21__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_21__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = 'this' -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + 'this' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_22__0.txt b/packages/bolt/tests/snapshots/bolt__parse_22__0.txt index 52c19be2e..7d013b8b1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_22__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_22__0.txt @@ -4,10 +4,10 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=12, lineno=1, colno=13) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_22__1.txt b/packages/bolt/tests/snapshots/bolt__parse_22__1.txt index dc7d278bf..b964cb047 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_22__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_22__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = 'this\nthat' -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + 'this\nthat' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=13, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_23__0.txt b/packages/bolt/tests/snapshots/bolt__parse_23__0.txt index 06d7c0978..5daffc4a1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_23__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_23__0.txt @@ -4,10 +4,10 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=20, lineno=1, colno=21) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_23__1.txt b/packages/bolt/tests/snapshots/bolt__parse_23__1.txt index cad997b6e..a2c939bcf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_23__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_23__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = '"█this\nthat' -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + '"█this\nthat' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_24__0.txt b/packages/bolt/tests/snapshots/bolt__parse_24__0.txt index 033806fa7..584453ed2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_24__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_24__0.txt @@ -4,10 +4,10 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=2, lineno=1, colno=3) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_24__1.txt b/packages/bolt/tests/snapshots/bolt__parse_24__1.txt index d67a1fe41..6773d5db4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_24__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_24__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = '' -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + '' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=3, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_25__0.txt b/packages/bolt/tests/snapshots/bolt__parse_25__0.txt index 7eae7fea4..54d65951b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_25__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_25__0.txt @@ -4,10 +4,10 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=6, lineno=1, colno=7) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_25__1.txt b/packages/bolt/tests/snapshots/bolt__parse_25__1.txt index b176911ac..2aa16ccdb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_25__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_25__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = '"\'"' -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + '"\'"' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=7, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_26__0.txt b/packages/bolt/tests/snapshots/bolt__parse_26__0.txt index 7f9fa4204..fe4720327 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_26__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_26__0.txt @@ -4,10 +4,10 @@ location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=27, lineno=2, colno=1) commands: - + location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=26, lineno=1, colno=27) - identifier: 'statement' + identifier: 'mecha:sentinel' arguments: location: SourceLocation(pos=0, lineno=1, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_26__1.txt b/packages/bolt/tests/snapshots/bolt__parse_26__1.txt index aef28c8eb..421793774 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_26__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_26__1.txt @@ -1,15 +1,15 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] -with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = "something \t\x0c\n\\'here" -_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +with _bolt_runtime.scope() as _bolt_var0: + "something \t\x0c\n\\'here" +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) --- -output = _bolt_var2 +output = _bolt_var1 --- _bolt_refs[0] location: SourceLocation(pos=0, lineno=1, colno=1) end_location: SourceLocation(pos=27, lineno=2, colno=1) commands: - + diff --git a/packages/bolt/tests/snapshots/bolt__parse_320__0.txt b/packages/bolt/tests/snapshots/bolt__parse_320__0.txt new file mode 100644 index 000000000..29452a012 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_320__0.txt @@ -0,0 +1,15 @@ +"""hello""" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'hello' diff --git a/packages/bolt/tests/snapshots/bolt__parse_320__1.txt b/packages/bolt/tests/snapshots/bolt__parse_320__1.txt new file mode 100644 index 000000000..b8f7df378 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_320__1.txt @@ -0,0 +1,15 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + 'hello' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_321__0.txt b/packages/bolt/tests/snapshots/bolt__parse_321__0.txt new file mode 100644 index 000000000..5d14c4b8b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_321__0.txt @@ -0,0 +1,16 @@ +"""hello +world""" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=17, lineno=2, colno=9) + value: 'hello\nworld' diff --git a/packages/bolt/tests/snapshots/bolt__parse_321__1.txt b/packages/bolt/tests/snapshots/bolt__parse_321__1.txt new file mode 100644 index 000000000..34b6891b7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_321__1.txt @@ -0,0 +1,15 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + 'hello\nworld' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_322__0.txt b/packages/bolt/tests/snapshots/bolt__parse_322__0.txt new file mode 100644 index 000000000..9e1234a6e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_322__0.txt @@ -0,0 +1,19 @@ +""" +This is a docstring. + +Hello world +""" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=5, colno=4) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=41, lineno=5, colno=4) + value: '\nThis is a docstring.\n\nHello world\n' diff --git a/packages/bolt/tests/snapshots/bolt__parse_322__1.txt b/packages/bolt/tests/snapshots/bolt__parse_322__1.txt new file mode 100644 index 000000000..0d9454a5a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_322__1.txt @@ -0,0 +1,15 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + '\nThis is a docstring.\n\nHello world\n' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_323__0.txt b/packages/bolt/tests/snapshots/bolt__parse_323__0.txt new file mode 100644 index 000000000..731971d53 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_323__0.txt @@ -0,0 +1,30 @@ +print( + """ + This is a docstring. + + Hello world + """ +) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=8, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=7, colno=2) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=66, lineno=7, colno=2) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'print' + arguments: + + location: SourceLocation(pos=11, lineno=2, colno=5) + end_location: SourceLocation(pos=64, lineno=6, colno=8) + value: '\n This is a docstring.\n\n Hello world\n ' diff --git a/packages/bolt/tests/snapshots/bolt__parse_323__1.txt b/packages/bolt/tests/snapshots/bolt__parse_323__1.txt new file mode 100644 index 000000000..0101eae1e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_323__1.txt @@ -0,0 +1,17 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = print + _bolt_var1 = '\n This is a docstring.\n\n Hello world\n ' + _bolt_var0 = _bolt_var0(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=67, lineno=8, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_324__0.txt b/packages/bolt/tests/snapshots/bolt__parse_324__0.txt new file mode 100644 index 000000000..50e7ba514 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_324__0.txt @@ -0,0 +1,30 @@ +foo = """ + This is a docstring. + + Hello world +""" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=5, colno=4) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=55, lineno=5, colno=4) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=55, lineno=5, colno=4) + value: '\n This is a docstring.\n\n Hello world\n' diff --git a/packages/bolt/tests/snapshots/bolt__parse_324__1.txt b/packages/bolt/tests/snapshots/bolt__parse_324__1.txt new file mode 100644 index 000000000..db12cf00a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_324__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = '\n This is a docstring.\n\n Hello world\n' + foo = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_325__0.txt b/packages/bolt/tests/snapshots/bolt__parse_325__0.txt new file mode 100644 index 000000000..6f798e834 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_325__0.txt @@ -0,0 +1,5 @@ +#>ERROR Trailing input following final expression. +# line 1, column 3 +# 1 | """ +# : ^ +""" diff --git a/packages/bolt/tests/snapshots/bolt__parse_326__0.txt b/packages/bolt/tests/snapshots/bolt__parse_326__0.txt new file mode 100644 index 000000000..cbffe993b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_326__0.txt @@ -0,0 +1,7 @@ +#>ERROR Trailing input following final expression. +# line 1, column 9 +# 1 | foo = """ +# : ^ +# 2 | This is a docstring. +foo = """ + This is a docstring. diff --git a/packages/bolt/tests/snapshots/bolt__parse_327__0.txt b/packages/bolt/tests/snapshots/bolt__parse_327__0.txt new file mode 100644 index 000000000..b7d85952b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_327__0.txt @@ -0,0 +1,43 @@ +def f(): + """My function""" + return 42 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + name: 'f' + arguments: + + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=30, lineno=2, colno=22) + value: 'My function' + + location: SourceLocation(pos=35, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=42, lineno=3, colno=12) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + value: 42 diff --git a/packages/bolt/tests/snapshots/bolt__parse_327__1.txt b/packages/bolt/tests/snapshots/bolt__parse_327__1.txt new file mode 100644 index 000000000..33f5cd779 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_327__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def f(): + 'My function' + _bolt_var0 = 42 + return _bolt_var0 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=14) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_328__0.txt b/packages/bolt/tests/snapshots/bolt__parse_328__0.txt new file mode 100644 index 000000000..b3edf34c1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_328__0.txt @@ -0,0 +1,51 @@ +def g(a=123): + """My other function""" + return a +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=13) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + decorators: + + name: 'g' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + name: 'a' + default: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 123 + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=54, lineno=3, colno=13) + commands: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=28) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=41, lineno=2, colno=28) + value: 'My other function' + + location: SourceLocation(pos=46, lineno=3, colno=5) + end_location: SourceLocation(pos=54, lineno=3, colno=13) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=53, lineno=3, colno=12) + end_location: SourceLocation(pos=54, lineno=3, colno=13) + value: 'a' diff --git a/packages/bolt/tests/snapshots/bolt__parse_328__1.txt b/packages/bolt/tests/snapshots/bolt__parse_328__1.txt new file mode 100644 index 000000000..e439edadc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_328__1.txt @@ -0,0 +1,22 @@ +_bolt_lineno = [1, 11], [1, 3] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def g(a=_bolt_helper_missing): + 'My other function' + if a is _bolt_helper_missing: + _bolt_var0 = 123 + a = _bolt_var0 + _bolt_var1 = a + return _bolt_var1 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=13) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_329__0.txt b/packages/bolt/tests/snapshots/bolt__parse_329__0.txt new file mode 100644 index 000000000..d9f3e5490 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_329__0.txt @@ -0,0 +1,34 @@ +class A: + """This is a class. + + It doesn't do anything. + """ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=70, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=69, lineno=5, colno=8) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + value: 'A' + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=5, colno=8) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=5, colno=8) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=69, lineno=5, colno=8) + value: "This is a class.\n\n It doesn't do anything.\n " diff --git a/packages/bolt/tests/snapshots/bolt__parse_329__1.txt b/packages/bolt/tests/snapshots/bolt__parse_329__1.txt new file mode 100644 index 000000000..da21c6019 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_329__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class A: + "This is a class.\n\n It doesn't do anything.\n " +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=70, lineno=6, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_330__0.txt b/packages/bolt/tests/snapshots/bolt__parse_330__0.txt new file mode 100644 index 000000000..d30acc0c7 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_330__0.txt @@ -0,0 +1,17 @@ +""" +foo\n\nbar +""" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=4) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=3, colno=4) + value: '\nfoo\n\nbar\n' diff --git a/packages/bolt/tests/snapshots/bolt__parse_330__1.txt b/packages/bolt/tests/snapshots/bolt__parse_330__1.txt new file mode 100644 index 000000000..34645da9d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_330__1.txt @@ -0,0 +1,15 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + '\nfoo\n\nbar\n' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_331__0.txt b/packages/bolt/tests/snapshots/bolt__parse_331__0.txt new file mode 100644 index 000000000..0e27012b6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_331__0.txt @@ -0,0 +1,17 @@ +r""" +foo\n\nbar +""" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=4) + identifier: 'mecha:sentinel' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=4) + value: '\nfoo\\n\\nbar\n' diff --git a/packages/bolt/tests/snapshots/bolt__parse_331__1.txt b/packages/bolt/tests/snapshots/bolt__parse_331__1.txt new file mode 100644 index 000000000..1a342357c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_331__1.txt @@ -0,0 +1,15 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + '\nfoo\\n\\nbar\n' +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=20, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt index de0aadffe..aaf18dae8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, literal 'block', literal 'blocks' or 9 other tokens but reached end of file. +#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, literal 'block' or 10 other tokens but reached end of file. # line 1, column 3 # 1 | if if diff --git a/packages/bolt/tests/snapshots/bolt__parse_39__0.txt b/packages/bolt/tests/snapshots/bolt__parse_39__0.txt index d8c36d818..8d1bffea1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_39__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_39__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', false, identifier, null, number or 3 other tokens but got newline '\n'. +#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, null or 4 other tokens but got newline '\n'. # line 1, column 12 # 1 | if True and if True and diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index c0c116c43..620a52298 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, false, identifier, literal 'advancement' or 153 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, docstring, false, identifier or 154 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md new file mode 100644 index 000000000..93ce479e0 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md @@ -0,0 +1,28 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say '\n hello\n world\n' +say 42 +say My function +say 123 +say My other function +say "This is a class.\n\n It doesn't do anything.\n " +say '\n foo\\n\\nbar\n' +``` From b819f8317ec2c4272ae4ccdd3d7e24f9af25b71b Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 1 Feb 2023 21:24:09 +0000 Subject: [PATCH 1121/1554] 0.25.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 5fdaa50d7..48ca4523b 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.25.0 (2023-02-01) +### Feature +* Add docstrings ([`c1c1488`](https://github.com/mcbeet/bolt/commit/c1c1488d60d58abc2a66d8cd02b671831bbf4473)) + ## v0.24.1 (2023-02-01) ### Fix * Update pyright ([`24120a9`](https://github.com/mcbeet/bolt/commit/24120a963b476676391a51fa25350a6a06225469)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 3e32cf36d..f7d5ba3a4 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.24.1" +__version__ = "0.25.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index b3c05f974..b381c2dc6 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.24.1" +version = "0.25.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 9df148f21301f9a37f4c18606ef864b91e3ed0ac Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 2 Feb 2023 03:10:06 +0100 Subject: [PATCH 1122/1554] feat: add type annotations --- packages/bolt/bolt/ast.py | 18 +++ packages/bolt/bolt/codegen.py | 71 +++++++--- packages/bolt/bolt/parse.py | 103 ++++++++++++--- .../examples/bolt_type_annotations/beet.yml | 6 + .../src/data/demo/functions/foo.mcfunction | 37 ++++++ .../tests/resources/bolt_examples.mcfunction | 24 ++++ .../tests/snapshots/bolt__parse_101__0.txt | 1 + .../tests/snapshots/bolt__parse_102__0.txt | 1 + .../tests/snapshots/bolt__parse_103__0.txt | 1 + .../tests/snapshots/bolt__parse_104__0.txt | 1 + .../tests/snapshots/bolt__parse_106__0.txt | 1 + .../tests/snapshots/bolt__parse_107__0.txt | 1 + .../tests/snapshots/bolt__parse_111__0.txt | 1 + .../tests/snapshots/bolt__parse_112__0.txt | 1 + .../tests/snapshots/bolt__parse_113__0.txt | 1 + .../tests/snapshots/bolt__parse_114__0.txt | 1 + .../tests/snapshots/bolt__parse_117__0.txt | 1 + .../tests/snapshots/bolt__parse_118__0.txt | 1 + .../tests/snapshots/bolt__parse_120__0.txt | 1 + .../tests/snapshots/bolt__parse_129__0.txt | 1 + .../tests/snapshots/bolt__parse_141__0.txt | 1 + .../tests/snapshots/bolt__parse_142__0.txt | 1 + .../tests/snapshots/bolt__parse_143__0.txt | 1 + .../tests/snapshots/bolt__parse_145__0.txt | 1 + .../tests/snapshots/bolt__parse_150__0.txt | 1 + .../tests/snapshots/bolt__parse_151__0.txt | 1 + .../tests/snapshots/bolt__parse_152__0.txt | 1 + .../tests/snapshots/bolt__parse_153__0.txt | 1 + .../tests/snapshots/bolt__parse_160__0.txt | 2 + .../tests/snapshots/bolt__parse_161__0.txt | 3 + .../tests/snapshots/bolt__parse_162__0.txt | 2 + .../tests/snapshots/bolt__parse_164__0.txt | 1 + .../tests/snapshots/bolt__parse_165__0.txt | 1 + .../tests/snapshots/bolt__parse_167__0.txt | 1 + .../tests/snapshots/bolt__parse_168__0.txt | 1 + .../tests/snapshots/bolt__parse_169__0.txt | 1 + .../tests/snapshots/bolt__parse_170__0.txt | 2 + .../tests/snapshots/bolt__parse_171__0.txt | 1 + .../tests/snapshots/bolt__parse_174__0.txt | 1 + .../tests/snapshots/bolt__parse_175__0.txt | 1 + .../tests/snapshots/bolt__parse_176__0.txt | 1 + .../tests/snapshots/bolt__parse_182__0.txt | 1 + .../tests/snapshots/bolt__parse_184__0.txt | 1 + .../tests/snapshots/bolt__parse_185__0.txt | 1 + .../tests/snapshots/bolt__parse_192__0.txt | 2 + .../tests/snapshots/bolt__parse_193__0.txt | 14 ++ .../tests/snapshots/bolt__parse_194__0.txt | 5 + .../tests/snapshots/bolt__parse_196__0.txt | 4 + .../tests/snapshots/bolt__parse_197__0.txt | 5 + .../tests/snapshots/bolt__parse_198__0.txt | 1 + .../tests/snapshots/bolt__parse_19__0.txt | 2 +- .../tests/snapshots/bolt__parse_201__0.txt | 1 + .../tests/snapshots/bolt__parse_202__0.txt | 1 + .../tests/snapshots/bolt__parse_203__0.txt | 1 + .../tests/snapshots/bolt__parse_205__0.txt | 1 + .../tests/snapshots/bolt__parse_206__0.txt | 2 + .../tests/snapshots/bolt__parse_207__0.txt | 1 + .../tests/snapshots/bolt__parse_210__0.txt | 2 + .../tests/snapshots/bolt__parse_212__0.txt | 2 +- .../tests/snapshots/bolt__parse_241__0.txt | 1 + .../tests/snapshots/bolt__parse_243__0.txt | 1 + .../tests/snapshots/bolt__parse_244__0.txt | 1 + .../tests/snapshots/bolt__parse_249__0.txt | 2 + .../tests/snapshots/bolt__parse_251__0.txt | 1 + .../tests/snapshots/bolt__parse_259__0.txt | 4 + .../tests/snapshots/bolt__parse_262__0.txt | 1 + .../tests/snapshots/bolt__parse_264__0.txt | 2 + .../tests/snapshots/bolt__parse_265__0.txt | 4 + .../tests/snapshots/bolt__parse_275__0.txt | 1 + .../tests/snapshots/bolt__parse_278__0.txt | 1 + .../tests/snapshots/bolt__parse_281__0.txt | 1 + .../tests/snapshots/bolt__parse_282__0.txt | 2 + .../tests/snapshots/bolt__parse_283__0.txt | 1 + .../tests/snapshots/bolt__parse_284__0.txt | 2 + .../tests/snapshots/bolt__parse_285__0.txt | 2 + .../tests/snapshots/bolt__parse_286__0.txt | 2 + .../tests/snapshots/bolt__parse_287__0.txt | 2 + .../tests/snapshots/bolt__parse_288__0.txt | 3 + .../tests/snapshots/bolt__parse_289__0.txt | 3 + .../tests/snapshots/bolt__parse_290__0.txt | 4 + .../tests/snapshots/bolt__parse_291__0.txt | 4 + .../tests/snapshots/bolt__parse_292__0.txt | 4 + .../tests/snapshots/bolt__parse_293__0.txt | 5 + .../tests/snapshots/bolt__parse_294__0.txt | 6 + .../tests/snapshots/bolt__parse_309__0.txt | 2 +- .../tests/snapshots/bolt__parse_315__0.txt | 2 + .../tests/snapshots/bolt__parse_317__0.txt | 3 + .../tests/snapshots/bolt__parse_318__0.txt | 1 + .../tests/snapshots/bolt__parse_319__0.txt | 3 + .../tests/snapshots/bolt__parse_324__0.txt | 1 + .../tests/snapshots/bolt__parse_327__0.txt | 1 + .../tests/snapshots/bolt__parse_328__0.txt | 2 + .../tests/snapshots/bolt__parse_32__0.txt | 1 + .../tests/snapshots/bolt__parse_332__0.txt | 27 ++++ .../tests/snapshots/bolt__parse_332__1.txt | 16 +++ .../tests/snapshots/bolt__parse_333__0.txt | 35 +++++ .../tests/snapshots/bolt__parse_333__1.txt | 17 +++ .../tests/snapshots/bolt__parse_334__0.txt | 124 ++++++++++++++++++ .../tests/snapshots/bolt__parse_334__1.txt | 33 +++++ .../tests/snapshots/bolt__parse_335__0.txt | 7 + .../tests/snapshots/bolt__parse_336__0.txt | 25 ++++ .../tests/snapshots/bolt__parse_336__1.txt | 16 +++ .../tests/snapshots/bolt__parse_337__0.txt | 31 +++++ .../tests/snapshots/bolt__parse_337__1.txt | 18 +++ .../tests/snapshots/bolt__parse_338__0.txt | 47 +++++++ .../tests/snapshots/bolt__parse_338__1.txt | 19 +++ .../tests/snapshots/bolt__parse_339__0.txt | 5 + .../tests/snapshots/bolt__parse_33__0.txt | 1 + .../tests/snapshots/bolt__parse_340__0.txt | 67 ++++++++++ .../tests/snapshots/bolt__parse_340__1.txt | 24 ++++ .../tests/snapshots/bolt__parse_34__0.txt | 2 + .../tests/snapshots/bolt__parse_38__0.txt | 2 +- .../tests/snapshots/bolt__parse_39__0.txt | 2 +- .../tests/snapshots/bolt__parse_46__0.txt | 2 + .../tests/snapshots/bolt__parse_47__0.txt | 1 + .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_50__0.txt | 1 + .../tests/snapshots/bolt__parse_53__0.txt | 2 + .../tests/snapshots/bolt__parse_55__0.txt | 1 + .../tests/snapshots/bolt__parse_57__0.txt | 2 + .../tests/snapshots/bolt__parse_70__0.txt | 1 + .../tests/snapshots/bolt__parse_71__0.txt | 2 + .../tests/snapshots/bolt__parse_72__0.txt | 4 + .../tests/snapshots/bolt__parse_77__0.txt | 4 + .../tests/snapshots/bolt__parse_81__0.txt | 5 + .../tests/snapshots/bolt__parse_82__0.txt | 5 + .../tests/snapshots/bolt__parse_84__0.txt | 1 + .../tests/snapshots/bolt__parse_87__0.txt | 3 + .../tests/snapshots/bolt__parse_89__0.txt | 2 + .../tests/snapshots/bolt__parse_92__0.txt | 1 + .../tests/snapshots/bolt__parse_93__0.txt | 1 + .../tests/snapshots/bolt__parse_94__0.txt | 1 + .../tests/snapshots/bolt__parse_95__0.txt | 1 + .../tests/snapshots/bolt__parse_96__0.txt | 1 + .../tests/snapshots/bolt__parse_97__0.txt | 1 + ...es__build_bolt_type_annotations__0.pack.md | 31 +++++ 136 files changed, 976 insertions(+), 39 deletions(-) create mode 100644 packages/bolt/examples/bolt_type_annotations/beet.yml create mode 100644 packages/bolt/examples/bolt_type_annotations/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_332__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_332__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_333__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_333__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_334__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_334__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_335__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_336__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_336__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_337__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_337__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_338__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_338__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_339__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_340__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_340__1.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index 7ef27b252..b91dcc71c 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -23,6 +23,7 @@ "AstTargetAttribute", "AstTargetItem", "AstAssignment", + "AstTypeDeclaration", "AstDecorator", "AstDocstring", "AstFunctionSignature", @@ -109,6 +110,10 @@ class AstValue(AstExpression): value: Any = required_field() + @property + def literal(self) -> str: + return "..." if self.value is ... else repr(self.value) + @dataclass(frozen=True, slots=True) class AstIdentifier(AstExpression): @@ -253,6 +258,15 @@ class AstAssignment(AstNode): operator: str = required_field() target: AstTarget = required_field() value: AstExpression = required_field() + type_annotation: Optional[AstExpression] = None + + +@dataclass(frozen=True, slots=True) +class AstTypeDeclaration(AstNode): + """Ast type declaration node.""" + + identifier: AstTargetIdentifier = required_field() + type_annotation: AstExpression = required_field() @dataclass(frozen=True, slots=True) @@ -277,6 +291,7 @@ class AstFunctionSignatureArgument(AstFunctionSignatureElement): """Ast function signature argument node.""" name: str = required_field() + type_annotation: Optional[AstExpression] = None default: Optional[AstExpression] = None @@ -290,6 +305,7 @@ class AstFunctionSignatureVariadicArgument(AstFunctionSignatureElement): """Ast function signature variadic argument node.""" name: str = required_field() + type_annotation: Optional[AstExpression] = None @dataclass(frozen=True, slots=True) @@ -302,6 +318,7 @@ class AstFunctionSignatureVariadicKeywordArgument(AstFunctionSignatureElement): """Ast function signature variadic keyword argument node.""" name: str = required_field() + type_annotation: Optional[AstExpression] = None @dataclass(frozen=True, slots=True) @@ -311,6 +328,7 @@ class AstFunctionSignature(AstNode): decorators: AstChildren[AstDecorator] = AstChildren() name: str = required_field() arguments: AstChildren[AstFunctionSignatureElement] = AstChildren() + return_type_annotation: Optional[AstExpression] = None @dataclass(frozen=True, slots=True) diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 3ebc095b7..c9d72bf78 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -77,6 +77,7 @@ AstTargetItem, AstTargetUnpack, AstTuple, + AstTypeDeclaration, AstUnpack, AstValue, ) @@ -220,9 +221,10 @@ def statement(self, code: str, *, lineno: Any = None): self.lines.append(f"{self.indentation}{code}\n") @contextmanager - def function(self, name: str, *args: str): + def function(self, name: str, *args: str, return_type: str = ""): """Emit function.""" - self.statement(f"def {name}({', '.join(args)}):") + return_type_annotation = return_type and f" -> {return_type}" + self.statement(f"def {name}({', '.join(args)}){return_type_annotation}:") with self.block(): previous_root = self.root_scope self.root_scope = False @@ -564,22 +566,42 @@ def function( value = yield from visit_single(decorator.expression, required=True) decorators.append(value) - arguments: List[str] = [ - (f"{arg.name}={acc.missing()}" if arg.default else arg.name) - if isinstance(arg, AstFunctionSignatureArgument) - else "/" - if isinstance(arg, AstFunctionSignaturePositionalMarker) - else f"*{arg.name}" - if isinstance(arg, AstFunctionSignatureVariadicArgument) - else "*" - if isinstance(arg, AstFunctionSignatureVariadicMarker) - else f"**{arg.name}" - if isinstance(arg, AstFunctionSignatureVariadicKeywordArgument) - else "_" - for arg in signature.arguments - ] + arguments: List[str] = [] + for arg in signature.arguments: + if isinstance(arg, AstFunctionSignatureArgument): + a = arg.name + if arg.type_annotation: + value = yield from visit_single(arg.type_annotation, required=True) + a = f"{a}: {value}" + if arg.default: + padding = " " * bool(arg.type_annotation) + a = f"{a}{padding}={padding}{acc.missing()}" + arguments.append(a) + f"{arg.name}={acc.missing()}" if arg.default else arg.name + elif isinstance(arg, AstFunctionSignaturePositionalMarker): + arguments.append("/") + elif isinstance(arg, AstFunctionSignatureVariadicArgument): + a = f"*{arg.name}" + if arg.type_annotation: + value = yield from visit_single(arg.type_annotation, required=True) + a = f"{a}: {value}" + arguments.append(a) + elif isinstance(arg, AstFunctionSignatureVariadicMarker): + arguments.append("*") + elif isinstance(arg, AstFunctionSignatureVariadicKeywordArgument): + a = f"**{arg.name}" + if arg.type_annotation: + value = yield from visit_single(arg.type_annotation, required=True) + a = f"{a}: {value}" + arguments.append(a) + + return_type = "" + if signature.return_type_annotation: + return_type = yield from visit_single( + signature.return_type_annotation, required=True + ) - with acc.function(signature.name, *arguments): + with acc.function(signature.name, *arguments, return_type=return_type): if body.commands and isinstance(body.commands[0], AstDocstring): yield body.commands[0] body = replace(body, commands=AstChildren(body.commands[1:])) @@ -1033,7 +1055,7 @@ def unary( @rule(AstValue) def value(self, node: AstValue, acc: Accumulator) -> Optional[List[str]]: result = acc.make_variable() - acc.statement(f"{result} = {node.value!r}") + acc.statement(f"{result} = {node.literal}") return [result] @rule(AstIdentifier) @@ -1211,6 +1233,19 @@ def assignment( ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: value = yield from visit_single(node.value, required=True) yield from visit_binding(node.target, node.operator, value, acc) + if node.type_annotation and isinstance(node.target, AstTargetIdentifier): + value = yield from visit_single(node.type_annotation, required=True) + acc.statement(f"{node.target.value}: {value}") + return [] + + @rule(AstTypeDeclaration) + def type_declaration( + self, + node: AstTypeDeclaration, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + value = yield from visit_single(node.type_annotation, required=True) + acc.statement(f"{node.identifier.value}: {value}") return [] @rule(AstTargetIdentifier) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index e186fc6d5..6f358fd11 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -144,6 +144,7 @@ AstTargetItem, AstTargetUnpack, AstTuple, + AstTypeDeclaration, AstUnpack, AstValue, ) @@ -333,6 +334,7 @@ def get_bolt_parsers( "bolt:import_name": TrailingCommaParser(parse_import_name), "bolt:global_name": parse_name_list, "bolt:nonlocal_name": parse_name_list, + "bolt:type_annotation": delegate("bolt:expression"), "bolt:expression": delegate("bolt:disjunction"), "bolt:disjunction": BinaryParser( operators=[r"\bor\b"], @@ -765,14 +767,44 @@ def __call__(self, stream: TokenStream) -> Any: assignment_pattern = r"=(?!=)|\+=|-=|\*=|//=|/=|%=|&=|\|=|\^=|<<=|>>=|\*\*=" if isinstance(node, AstTarget): + type_annotation = None + identifier = None + if isinstance(node, AstTargetIdentifier): + with stream.syntax(colon=r":"): + if stream.get("colon"): + type_annotation = delegate("bolt:type_annotation", stream) + identifier = node + assignment_pattern = r"=(?!=)" + if self.binding_only: assignment_pattern = r"=(?!=)" with stream.syntax(assignment=assignment_pattern): - op = stream.expect("assignment") + if identifier and type_annotation: + op = stream.get("assignment") + if not op: + lexical_scope = get_stream_lexical_scope(stream) + for i, (_, node) in reversed( + list(enumerate(lexical_scope.pending_bindings)) + ): + if node is identifier: + del lexical_scope.pending_bindings[i] + break + node = AstTypeDeclaration( + identifier=identifier, + type_annotation=type_annotation, + ) + return set_location(node, identifier, type_annotation) + else: + op = stream.expect("assignment") expression = delegate("bolt:expression", stream) - node = AstAssignment(operator=op.value, target=node, value=expression) + node = AstAssignment( + operator=op.value, + target=node, + value=expression, + type_annotation=type_annotation, + ) node = set_location(node, node.target, node.value) elif isinstance(node, (AstAttribute, AstLookup)): @@ -1044,6 +1076,7 @@ def parse_deferred_root(stream: TokenStream) -> AstDeferredRoot: def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: """Parse function signature.""" lexical_scope = get_stream_lexical_scope(stream) + type_annotation_scope = lexical_scope.fork() arguments: List[AstFunctionSignatureElement] = [] @@ -1060,6 +1093,8 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: separator=r"/", kwargs=r"\*\*", args=r"\*", + colon=r":", + arrow=r"->", identifier=IDENTIFIER_PATTERN, ): identifier = stream.expect("identifier") @@ -1070,7 +1105,7 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: deferred_scope = lexical_scope.deferred(FunctionScope) - with stream.ignore("newline"), stream.provide(lexical_scope=deferred_scope): + with stream.ignore("newline"): for token in stream.peek_until(("brace", ")")): if encountered_variadic_keyword: exc = InvalidSyntax( @@ -1088,10 +1123,16 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: if name: expect_named_argument = False + type_annotation = None + if stream.get("colon"): + with stream.provide(lexical_scope=type_annotation_scope): + type_annotation = delegate("bolt:type_annotation", stream) + default = None if stream.get("equal"): encountered_default = True - default = delegate("bolt:expression", stream) + with stream.provide(lexical_scope=deferred_scope): + default = delegate("bolt:expression", stream) elif encountered_default: exc = InvalidSyntax( "Argument without default can not appear after arguments with default values." @@ -1101,6 +1142,7 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: argument = AstFunctionSignatureArgument( name=name.value, default=default, + type_annotation=type_annotation, ) argument = set_location(argument, name, stream.current) deferred_scope.bind_variable(argument.name, argument) @@ -1129,8 +1171,15 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: elif kwargs: encountered_variadic_keyword = True name = stream.expect("identifier") + + type_annotation = None + if stream.get("colon"): + with stream.provide(lexical_scope=type_annotation_scope): + type_annotation = delegate("bolt:type_annotation", stream) + argument = AstFunctionSignatureVariadicKeywordArgument( - name=name.value + name=name.value, + type_annotation=type_annotation, ) argument = set_location(argument, kwargs, name) deferred_scope.bind_variable(argument.name, argument) @@ -1142,7 +1191,17 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: raise set_location(exc, args) encountered_variadic = True if name := stream.get("identifier"): - argument = AstFunctionSignatureVariadicArgument(name=name.value) + type_annotation = None + if stream.get("colon"): + with stream.provide(lexical_scope=type_annotation_scope): + type_annotation = delegate( + "bolt:type_annotation", stream + ) + + argument = AstFunctionSignatureVariadicArgument( + name=name.value, + type_annotation=type_annotation, + ) argument = set_location(argument, args, name) deferred_scope.bind_variable(argument.name, argument) arguments.append(argument) @@ -1155,15 +1214,24 @@ def parse_function_signature(stream: TokenStream) -> AstFunctionSignature: stream.expect(("brace", ")")) break - if expect_named_argument: - for argument in arguments: - if isinstance(argument, AstFunctionSignatureVariadicMarker): - exc = InvalidSyntax( - "Expected at least one named argument after bare variadic marker." - ) - raise set_location(exc, argument) + if expect_named_argument: + for argument in arguments: + if isinstance(argument, AstFunctionSignatureVariadicMarker): + exc = InvalidSyntax( + "Expected at least one named argument after bare variadic marker." + ) + raise set_location(exc, argument) - node = replace(node, arguments=AstChildren(arguments)) + return_type_annotation = None + if stream.get("arrow"): + with stream.provide(lexical_scope=type_annotation_scope): + return_type_annotation = delegate("bolt:type_annotation", stream) + + node = replace( + node, + arguments=AstChildren(arguments), + return_type_annotation=return_type_annotation, + ) return set_location(node, node, stream.current) @@ -2292,6 +2360,7 @@ def __call__(self, stream: TokenStream) -> Any: curly=r"\{|\}", bracket=r"\[|\]", comma=r",", + ellipsis=r"\.\.\.", true=TRUE_PATTERN, false=FALSE_PATTERN, null=NULL_PATTERN, @@ -2308,6 +2377,7 @@ def __call__(self, stream: TokenStream) -> Any: ( curly, bracket, + ellipsis, true, false, null, @@ -2318,6 +2388,7 @@ def __call__(self, stream: TokenStream) -> Any: ) = stream.expect( ("curly", "{"), ("bracket", "["), + "ellipsis", "true", "false", "null", @@ -2373,7 +2444,9 @@ def __call__(self, stream: TokenStream) -> Any: node = AstList(items=AstChildren(elements)) return set_location(node, bracket, stream.current) - if true: + if ellipsis: + value = ... + elif true: value = True elif false: value = False diff --git a/packages/bolt/examples/bolt_type_annotations/beet.yml b/packages/bolt/examples/bolt_type_annotations/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_type_annotations/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_type_annotations/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_type_annotations/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..5687ebcb9 --- /dev/null +++ b/packages/bolt/examples/bolt_type_annotations/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,37 @@ +from beet import ListOption +from dataclasses import dataclass +from pydantic import BaseModel + +thing: str +thing = "hey" +say thing + +num: int = 123 +say num + +def f(a: str, /, b: int, c: list[int] | None = None, *d: float, **kwargs: object) -> tuple[int, ...]: + ... + +say f.__annotations__ + +class A: + foo: int + bar: str = "hello" + +say hasattr(A, "foo") +say A.bar +say A.__annotations__ + +@dataclass +class B: + foo: list[int] + bar: str | None = None + +say B.__init__.__annotations__ +say B([1, 2], "three") + +class C(BaseModel): + foo: ListOption[str] = [] + +for c in [C.parse_obj({"foo": "hello"}), C.parse_obj({"foo": ["hello", "world"]})]: + say c.foo.entries() diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index e6bad61a9..1eda848d2 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1212,3 +1212,27 @@ foo\n\nbar r""" foo\n\nbar """ +### +a = ... +### +def f() -> int: + pass +### +def f(a: str, /, b: int, c: list[int] | None = None, *d: float, **kwargs: object) -> tuple[int, ...]: + ... +### +def f(a: int, b: int = f(a - 1), *c: f) -> int: + return a + b +### +foo: int +### +foo: int = 123 +### +foo: int +foo = 123 +### +foo: doesnotexist = 123 +### +class A: + foo: int + bar: str = "hello" diff --git a/packages/bolt/tests/snapshots/bolt__parse_101__0.txt b/packages/bolt/tests/snapshots/bolt__parse_101__0.txt index 4322f2432..0821e6591 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_101__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_101__0.txt @@ -18,6 +18,7 @@ def wat(): name: 'wat' arguments: + return_type_annotation: None location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=24, lineno=2, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_102__0.txt b/packages/bolt/tests/snapshots/bolt__parse_102__0.txt index 058c88275..8e027a9bb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_102__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_102__0.txt @@ -25,6 +25,7 @@ tellraw @p a location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=6, lineno=1, colno=7) value: '' + type_annotation: None location: SourceLocation(pos=7, lineno=2, colno=1) end_location: SourceLocation(pos=19, lineno=2, colno=13) diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__0.txt b/packages/bolt/tests/snapshots/bolt__parse_103__0.txt index 7630ad440..e4f7ea858 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_103__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_103__0.txt @@ -32,6 +32,7 @@ as @a at @s if block ~ ~-1 ~ #wool give @s stone{ location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=41, lineno=1, colno=42) value: '[{"text": "Hello", "bold": true}]' + type_annotation: None location: SourceLocation(pos=42, lineno=2, colno=1) end_location: SourceLocation(pos=210, lineno=9, colno=2) diff --git a/packages/bolt/tests/snapshots/bolt__parse_104__0.txt b/packages/bolt/tests/snapshots/bolt__parse_104__0.txt index 720b1ff52..bdd2343f3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_104__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_104__0.txt @@ -57,3 +57,4 @@ thing = (1, 'hey') + () + ("wow",) location: SourceLocation(pos=27, lineno=1, colno=28) end_location: SourceLocation(pos=32, lineno=1, colno=33) value: 'wow' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_106__0.txt b/packages/bolt/tests/snapshots/bolt__parse_106__0.txt index d188f229b..7266ef7f6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_106__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_106__0.txt @@ -25,6 +25,7 @@ f"hello {foo}" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'world' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=15) diff --git a/packages/bolt/tests/snapshots/bolt__parse_107__0.txt b/packages/bolt/tests/snapshots/bolt__parse_107__0.txt index 9952531f1..37e4c1c3f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_107__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_107__0.txt @@ -25,6 +25,7 @@ f"hello {foo!r}" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'world' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=30, lineno=2, colno=17) diff --git a/packages/bolt/tests/snapshots/bolt__parse_111__0.txt b/packages/bolt/tests/snapshots/bolt__parse_111__0.txt index 1eab6aebd..73864d5b6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_111__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_111__0.txt @@ -39,3 +39,4 @@ yo = f"{{{f"{{{f"{{{7:08}}}"}}}"}}}" location: SourceLocation(pos=20, lineno=1, colno=21) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 7 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_112__0.txt b/packages/bolt/tests/snapshots/bolt__parse_112__0.txt index aaa3e3ed7..b64f786ea 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_112__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_112__0.txt @@ -26,3 +26,4 @@ yo = f"" fmt: '' values: + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_113__0.txt b/packages/bolt/tests/snapshots/bolt__parse_113__0.txt index 7acc4b6a6..d3df18034 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_113__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_113__0.txt @@ -26,3 +26,4 @@ yo = f"\"" fmt: '"' values: + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_114__0.txt b/packages/bolt/tests/snapshots/bolt__parse_114__0.txt index 97b54395f..680c96213 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_114__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_114__0.txt @@ -26,3 +26,4 @@ yo = f"\\" fmt: '\\' values: + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__0.txt b/packages/bolt/tests/snapshots/bolt__parse_117__0.txt index 737d0b2b6..8867063b6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_117__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_117__0.txt @@ -25,6 +25,7 @@ if score @s tmp matches (x, None) say wat location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 8 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=47, lineno=2, colno=42) diff --git a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt index a89de9f3b..18ae85b5d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_118__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_118__0.txt @@ -22,6 +22,7 @@ for i in f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=44, lineno=4, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_120__0.txt b/packages/bolt/tests/snapshots/bolt__parse_120__0.txt index 38ea67ed6..406bbb177 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_120__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_120__0.txt @@ -18,6 +18,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=18, lineno=2, colno=10) diff --git a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt index 0bdedc151..afa0686a3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_129__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_129__0.txt @@ -19,6 +19,7 @@ say a name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=39, lineno=2, colno=31) diff --git a/packages/bolt/tests/snapshots/bolt__parse_141__0.txt b/packages/bolt/tests/snapshots/bolt__parse_141__0.txt index 88b5c7e59..eaf8af9f5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_141__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_141__0.txt @@ -25,6 +25,7 @@ setblock a 2 3 stone location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 1 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=26, lineno=2, colno=21) diff --git a/packages/bolt/tests/snapshots/bolt__parse_142__0.txt b/packages/bolt/tests/snapshots/bolt__parse_142__0.txt index 845acc040..6ecba80a7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_142__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_142__0.txt @@ -25,6 +25,7 @@ setblock a stone location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: '1 2 3' + type_annotation: None location: SourceLocation(pos=12, lineno=2, colno=1) end_location: SourceLocation(pos=28, lineno=2, colno=17) diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__0.txt b/packages/bolt/tests/snapshots/bolt__parse_143__0.txt index 8187a20a2..c984fa42c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_143__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_143__0.txt @@ -25,6 +25,7 @@ if block ^ f"^{a}" ^ #planks say 42 location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 1 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) diff --git a/packages/bolt/tests/snapshots/bolt__parse_145__0.txt b/packages/bolt/tests/snapshots/bolt__parse_145__0.txt index 5701a92ad..f55fc3f9b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_145__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_145__0.txt @@ -36,3 +36,4 @@ a = [][] start: None stop: None step: None + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_150__0.txt b/packages/bolt/tests/snapshots/bolt__parse_150__0.txt index 03db2ea74..076c50a53 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_150__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_150__0.txt @@ -19,6 +19,7 @@ f(1, 2, thing=3) name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_151__0.txt b/packages/bolt/tests/snapshots/bolt__parse_151__0.txt index b94610fcf..994353707 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_151__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_151__0.txt @@ -19,6 +19,7 @@ f(1, 2, **{"thing": 3}) name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_152__0.txt b/packages/bolt/tests/snapshots/bolt__parse_152__0.txt index af2ee0b5c..803d97e31 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_152__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_152__0.txt @@ -19,6 +19,7 @@ f(1, *[4], 2, thing=3) name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_153__0.txt b/packages/bolt/tests/snapshots/bolt__parse_153__0.txt index ec4bc3c65..64b1404ec 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_153__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_153__0.txt @@ -19,6 +19,7 @@ f(1, *[4], 2, **{"thing": 3}) name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_160__0.txt b/packages/bolt/tests/snapshots/bolt__parse_160__0.txt index a9313f032..ce59d9524 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_160__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_160__0.txt @@ -18,6 +18,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=24, lineno=2, colno=16) @@ -47,3 +48,4 @@ def f(): end_location: SourceLocation(pos=24, lineno=2, colno=16) items: + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_161__0.txt b/packages/bolt/tests/snapshots/bolt__parse_161__0.txt index 923e28da7..3a858661c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_161__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_161__0.txt @@ -27,6 +27,7 @@ d[1][2] = "foo" end_location: SourceLocation(pos=6, lineno=1, colno=7) items: + type_annotation: None location: SourceLocation(pos=7, lineno=2, colno=1) end_location: SourceLocation(pos=16, lineno=2, colno=10) @@ -56,6 +57,7 @@ d[1][2] = "foo" end_location: SourceLocation(pos=16, lineno=2, colno=10) items: + type_annotation: None location: SourceLocation(pos=17, lineno=3, colno=1) end_location: SourceLocation(pos=32, lineno=3, colno=16) @@ -93,3 +95,4 @@ d[1][2] = "foo" location: SourceLocation(pos=27, lineno=3, colno=11) end_location: SourceLocation(pos=32, lineno=3, colno=16) value: 'foo' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_162__0.txt b/packages/bolt/tests/snapshots/bolt__parse_162__0.txt index e3ddb79ea..53158eff6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_162__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_162__0.txt @@ -38,6 +38,7 @@ d.foo += 1 location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 1 + type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=1) end_location: SourceLocation(pos=23, lineno=2, colno=11) @@ -62,3 +63,4 @@ d.foo += 1 location: SourceLocation(pos=22, lineno=2, colno=10) end_location: SourceLocation(pos=23, lineno=2, colno=11) value: 1 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_164__0.txt b/packages/bolt/tests/snapshots/bolt__parse_164__0.txt index 4a0572bc3..4000077ab 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_164__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_164__0.txt @@ -25,6 +25,7 @@ scoreboard objectives setdisplay f"sidebar.team.{color}" some_score_name location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'red' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=86, lineno=2, colno=73) diff --git a/packages/bolt/tests/snapshots/bolt__parse_165__0.txt b/packages/bolt/tests/snapshots/bolt__parse_165__0.txt index eae772144..24064f22a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_165__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_165__0.txt @@ -25,6 +25,7 @@ scoreboard objectives setdisplay my_team some_score_name location: SourceLocation(pos=10, lineno=1, colno=11) end_location: SourceLocation(pos=28, lineno=1, colno=29) value: 'sidebar.team.red' + type_annotation: None location: SourceLocation(pos=29, lineno=2, colno=1) end_location: SourceLocation(pos=85, lineno=2, colno=57) diff --git a/packages/bolt/tests/snapshots/bolt__parse_167__0.txt b/packages/bolt/tests/snapshots/bolt__parse_167__0.txt index 3a47e4345..9a7cd7310 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_167__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_167__0.txt @@ -25,6 +25,7 @@ item replace entity @s weapon.offhand from entity @s weapon.mainhand location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'thing' + type_annotation: None location: SourceLocation(pos=17, lineno=2, colno=1) end_location: SourceLocation(pos=85, lineno=2, colno=69) diff --git a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt index c62ff6f0b..fedc8377d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_168__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_168__0.txt @@ -51,6 +51,7 @@ item replace entity @s my_weapon.offhand from entity @s my_weapon.mainhand location: SourceLocation(pos=50, lineno=1, colno=51) end_location: SourceLocation(pos=67, lineno=1, colno=68) value: 'weapon.mainhand' + type_annotation: None location: SourceLocation(pos=69, lineno=2, colno=1) end_location: SourceLocation(pos=143, lineno=2, colno=75) diff --git a/packages/bolt/tests/snapshots/bolt__parse_169__0.txt b/packages/bolt/tests/snapshots/bolt__parse_169__0.txt index 0685d7eec..3c137f62c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_169__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_169__0.txt @@ -43,6 +43,7 @@ say numbers[3:] location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 12 + type_annotation: None location: SourceLocation(pos=26, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_170__0.txt b/packages/bolt/tests/snapshots/bolt__parse_170__0.txt index 92b7f196f..39a43da27 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_170__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_170__0.txt @@ -43,6 +43,7 @@ numbers[3:] = [] location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 12 + type_annotation: None location: SourceLocation(pos=26, lineno=2, colno=1) end_location: SourceLocation(pos=42, lineno=2, colno=17) @@ -78,3 +79,4 @@ numbers[3:] = [] end_location: SourceLocation(pos=42, lineno=2, colno=17) items: + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_171__0.txt b/packages/bolt/tests/snapshots/bolt__parse_171__0.txt index 54513473e..325ac5b60 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_171__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_171__0.txt @@ -43,6 +43,7 @@ del numbers[3:] location: SourceLocation(pos=21, lineno=1, colno=22) end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 12 + type_annotation: None location: SourceLocation(pos=26, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__0.txt b/packages/bolt/tests/snapshots/bolt__parse_174__0.txt index 1328f6c26..8c9bf1502 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_174__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_174__0.txt @@ -25,6 +25,7 @@ if data storage some:path/to/storage f'some.{mykey}.path{{my: "compound"}}' run location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'aaa' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=100, lineno=2, colno=87) diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__0.txt b/packages/bolt/tests/snapshots/bolt__parse_175__0.txt index ffb61bbcc..19b2362f3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_175__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_175__0.txt @@ -25,6 +25,7 @@ if data storage some:path/to/storage (mypath) run say hi location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=75, lineno=1, colno=76) value: 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' + type_annotation: None location: SourceLocation(pos=76, lineno=2, colno=1) end_location: SourceLocation(pos=132, lineno=2, colno=57) diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt index b963bac9f..8cf80daf1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt @@ -25,6 +25,7 @@ at @e[type=entity_type] summon lightning_bolt location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=23, lineno=1, colno=24) value: 'creeper' + type_annotation: None location: SourceLocation(pos=24, lineno=2, colno=1) end_location: SourceLocation(pos=69, lineno=2, colno=46) diff --git a/packages/bolt/tests/snapshots/bolt__parse_182__0.txt b/packages/bolt/tests/snapshots/bolt__parse_182__0.txt index 378eb7fe9..b64f7a9fb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_182__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_182__0.txt @@ -24,3 +24,4 @@ a = demo:foo/bar location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=16, lineno=1, colno=17) value: 'demo:foo/bar' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt index ddfa64446..ab7531c32 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__0.txt @@ -25,6 +25,7 @@ positioned ~ ~a ~ function demo:foo location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 1 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=41, lineno=2, colno=36) diff --git a/packages/bolt/tests/snapshots/bolt__parse_185__0.txt b/packages/bolt/tests/snapshots/bolt__parse_185__0.txt index 01e540294..c870764ef 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_185__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_185__0.txt @@ -33,3 +33,4 @@ a, b = "ab" location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 'ab' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt index 664630f06..d57f3a629 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_192__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_192__0.txt @@ -30,6 +30,7 @@ say math.ceil(0.1) location: SourceLocation(pos=7, lineno=1, colno=8) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 0 + type_annotation: None location: SourceLocation(pos=9, lineno=2, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=9) @@ -59,6 +60,7 @@ say math.ceil(0.1) name: 'wat' arguments: + return_type_annotation: None location: SourceLocation(pos=33, lineno=4, colno=5) end_location: SourceLocation(pos=60, lineno=5, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt index 12fd7b181..852bcef66 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt @@ -38,12 +38,15 @@ b = a location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=26, lineno=1, colno=27) name: 'self' + type_annotation: None default: None location: SourceLocation(pos=28, lineno=1, colno=29) end_location: SourceLocation(pos=32, lineno=1, colno=33) name: 'name' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=39, lineno=2, colno=5) end_location: SourceLocation(pos=55, lineno=2, colno=21) @@ -72,6 +75,7 @@ b = a location: SourceLocation(pos=51, lineno=2, colno=17) end_location: SourceLocation(pos=55, lineno=2, colno=21) value: 'name' + type_annotation: None location: SourceLocation(pos=57, lineno=4, colno=1) end_location: SourceLocation(pos=279, lineno=9, colno=16) @@ -88,12 +92,15 @@ b = a location: SourceLocation(pos=81, lineno=4, colno=25) end_location: SourceLocation(pos=85, lineno=4, colno=29) name: 'self' + type_annotation: None default: None location: SourceLocation(pos=87, lineno=4, colno=31) end_location: SourceLocation(pos=90, lineno=4, colno=34) name: 'rhs' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=97, lineno=5, colno=5) end_location: SourceLocation(pos=279, lineno=9, colno=16) @@ -291,6 +298,7 @@ b = a location: SourceLocation(pos=365, lineno=11, colno=85) end_location: SourceLocation(pos=384, lineno=11, colno=104) value: 'rebind_global_score' + type_annotation: None location: SourceLocation(pos=388, lineno=13, colno=1) end_location: SourceLocation(pos=408, lineno=13, colno=21) @@ -320,6 +328,7 @@ b = a location: SourceLocation(pos=404, lineno=13, colno=17) end_location: SourceLocation(pos=407, lineno=13, colno=20) value: 'a' + type_annotation: None location: SourceLocation(pos=409, lineno=14, colno=1) end_location: SourceLocation(pos=416, lineno=14, colno=8) @@ -340,6 +349,7 @@ b = a location: SourceLocation(pos=413, lineno=14, colno=5) end_location: SourceLocation(pos=416, lineno=14, colno=8) value: 123 + type_annotation: None location: SourceLocation(pos=417, lineno=15, colno=1) end_location: SourceLocation(pos=424, lineno=15, colno=8) @@ -360,6 +370,7 @@ b = a location: SourceLocation(pos=421, lineno=15, colno=5) end_location: SourceLocation(pos=424, lineno=15, colno=8) value: 456 + type_annotation: None location: SourceLocation(pos=426, lineno=17, colno=1) end_location: SourceLocation(pos=446, lineno=17, colno=21) @@ -389,6 +400,7 @@ b = a location: SourceLocation(pos=442, lineno=17, colno=17) end_location: SourceLocation(pos=445, lineno=17, colno=20) value: 'b' + type_annotation: None location: SourceLocation(pos=447, lineno=18, colno=1) end_location: SourceLocation(pos=454, lineno=18, colno=8) @@ -409,6 +421,7 @@ b = a location: SourceLocation(pos=451, lineno=18, colno=5) end_location: SourceLocation(pos=454, lineno=18, colno=8) value: 789 + type_annotation: None location: SourceLocation(pos=455, lineno=19, colno=1) end_location: SourceLocation(pos=460, lineno=19, colno=6) @@ -429,3 +442,4 @@ b = a location: SourceLocation(pos=459, lineno=19, colno=5) end_location: SourceLocation(pos=460, lineno=19, colno=6) value: 'a' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt index ed4635d25..9ca5766b6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt @@ -30,11 +30,13 @@ say Counter(9).incr() location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=15, lineno=1, colno=16) name: 'x' + type_annotation: None default: location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=15, lineno=1, colno=16) value: 0 + return_type_annotation: None location: SourceLocation(pos=22, lineno=2, colno=5) end_location: SourceLocation(pos=110, lineno=6, colno=26) @@ -52,6 +54,7 @@ say Counter(9).incr() name: 'incr' arguments: + return_type_annotation: None location: SourceLocation(pos=42, lineno=3, colno=9) end_location: SourceLocation(pos=84, lineno=5, colno=17) @@ -90,6 +93,7 @@ say Counter(9).incr() location: SourceLocation(pos=66, lineno=4, colno=14) end_location: SourceLocation(pos=67, lineno=4, colno=15) value: 1 + type_annotation: None location: SourceLocation(pos=76, lineno=5, colno=9) end_location: SourceLocation(pos=84, lineno=5, colno=17) @@ -147,6 +151,7 @@ say Counter(9).incr() value: 'Counter' arguments: + type_annotation: None location: SourceLocation(pos=132, lineno=9, colno=1) end_location: SourceLocation(pos=150, lineno=9, colno=19) diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt index 70ec66332..8b2ae4ce8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt @@ -25,7 +25,9 @@ def foo(value): location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'value' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=20, lineno=2, colno=5) end_location: SourceLocation(pos=95, lineno=6, colno=18) @@ -63,6 +65,7 @@ def foo(value): location: SourceLocation(pos=47, lineno=3, colno=18) end_location: SourceLocation(pos=48, lineno=3, colno=19) value: 1 + type_annotation: None location: SourceLocation(pos=53, lineno=4, colno=5) end_location: SourceLocation(pos=77, lineno=5, colno=19) @@ -92,6 +95,7 @@ def foo(value): location: SourceLocation(pos=76, lineno=5, colno=18) end_location: SourceLocation(pos=77, lineno=5, colno=19) value: 0 + type_annotation: None location: SourceLocation(pos=82, lineno=6, colno=5) end_location: SourceLocation(pos=95, lineno=6, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt index 6891cf4a2..fba04e3a7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt @@ -26,7 +26,9 @@ def foo(value): location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'value' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=20, lineno=2, colno=5) end_location: SourceLocation(pos=115, lineno=7, colno=18) @@ -51,6 +53,7 @@ def foo(value): location: SourceLocation(pos=29, lineno=2, colno=14) end_location: SourceLocation(pos=35, lineno=2, colno=20) value: 'init' + type_annotation: None location: SourceLocation(pos=40, lineno=3, colno=5) end_location: SourceLocation(pos=68, lineno=4, colno=19) @@ -84,6 +87,7 @@ def foo(value): location: SourceLocation(pos=67, lineno=4, colno=18) end_location: SourceLocation(pos=68, lineno=4, colno=19) value: 1 + type_annotation: None location: SourceLocation(pos=73, lineno=5, colno=5) end_location: SourceLocation(pos=97, lineno=6, colno=19) @@ -113,6 +117,7 @@ def foo(value): location: SourceLocation(pos=96, lineno=6, colno=18) end_location: SourceLocation(pos=97, lineno=6, colno=19) value: 0 + type_annotation: None location: SourceLocation(pos=102, lineno=7, colno=5) end_location: SourceLocation(pos=115, lineno=7, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt index 8929befb8..d52a05cc5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_198__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_198__0.txt @@ -25,6 +25,7 @@ function #tag_name location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=18, lineno=1, colno=19) value: 'foo:bar' + type_annotation: None location: SourceLocation(pos=19, lineno=2, colno=1) end_location: SourceLocation(pos=37, lineno=2, colno=19) diff --git a/packages/bolt/tests/snapshots/bolt__parse_19__0.txt b/packages/bolt/tests/snapshots/bolt__parse_19__0.txt index 0fece4cd1..2a321c1aa 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_19__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_19__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, null or 4 other tokens but got literal '%3'. +#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 5 other tokens but got literal '%3'. # line 1, column 6 # 1 | 17 % %3 # : ^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_201__0.txt b/packages/bolt/tests/snapshots/bolt__parse_201__0.txt index 472d5da63..5925920ec 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_201__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_201__0.txt @@ -25,6 +25,7 @@ say a location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 2 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=6) diff --git a/packages/bolt/tests/snapshots/bolt__parse_202__0.txt b/packages/bolt/tests/snapshots/bolt__parse_202__0.txt index ba1bf0a32..2066e8b48 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_202__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_202__0.txt @@ -25,6 +25,7 @@ say a normal message location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 2 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=26, lineno=2, colno=21) diff --git a/packages/bolt/tests/snapshots/bolt__parse_203__0.txt b/packages/bolt/tests/snapshots/bolt__parse_203__0.txt index 0d20046e4..7eaa8dc5f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_203__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_203__0.txt @@ -27,6 +27,7 @@ say a location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 2 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=34, lineno=4, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_205__0.txt b/packages/bolt/tests/snapshots/bolt__parse_205__0.txt index 5cfc3bd50..b988c8a42 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_205__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_205__0.txt @@ -38,6 +38,7 @@ give @s bow{**bow_data} location: SourceLocation(pos=29, lineno=1, colno=30) end_location: SourceLocation(pos=30, lineno=1, colno=31) value: 7 + type_annotation: None location: SourceLocation(pos=32, lineno=2, colno=1) end_location: SourceLocation(pos=55, lineno=2, colno=24) diff --git a/packages/bolt/tests/snapshots/bolt__parse_206__0.txt b/packages/bolt/tests/snapshots/bolt__parse_206__0.txt index 34807cd7b..d0c4d9b3d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_206__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_206__0.txt @@ -39,6 +39,7 @@ give @s stone{CanPlaceOn: [*stone_can_place_on], **custom_model_data} location: SourceLocation(pos=38, lineno=1, colno=39) end_location: SourceLocation(pos=39, lineno=1, colno=40) value: 7 + type_annotation: None location: SourceLocation(pos=41, lineno=2, colno=1) end_location: SourceLocation(pos=80, lineno=2, colno=40) @@ -63,6 +64,7 @@ give @s stone{CanPlaceOn: [*stone_can_place_on], **custom_model_data} location: SourceLocation(pos=63, lineno=2, colno=23) end_location: SourceLocation(pos=79, lineno=2, colno=39) value: 'minecraft:dirt' + type_annotation: None location: SourceLocation(pos=81, lineno=3, colno=1) end_location: SourceLocation(pos=150, lineno=3, colno=70) diff --git a/packages/bolt/tests/snapshots/bolt__parse_207__0.txt b/packages/bolt/tests/snapshots/bolt__parse_207__0.txt index 0053b00e0..59a330297 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_207__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_207__0.txt @@ -38,6 +38,7 @@ tellraw @p ["", {"text": "hey", **red}, *red.color] location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=21, lineno=1, colno=22) value: 'red' + type_annotation: None location: SourceLocation(pos=23, lineno=2, colno=1) end_location: SourceLocation(pos=74, lineno=2, colno=52) diff --git a/packages/bolt/tests/snapshots/bolt__parse_210__0.txt b/packages/bolt/tests/snapshots/bolt__parse_210__0.txt index f9768f6fa..6bbb14468 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_210__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_210__0.txt @@ -23,6 +23,7 @@ def f(): name: 'testing_decorator' arguments: + return_type_annotation: None location: SourceLocation(pos=29, lineno=2, colno=5) end_location: SourceLocation(pos=33, lineno=2, colno=9) @@ -70,6 +71,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=89, lineno=7, colno=5) end_location: SourceLocation(pos=93, lineno=7, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_212__0.txt b/packages/bolt/tests/snapshots/bolt__parse_212__0.txt index 7aede4ffe..00bacb92a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_212__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_212__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, null or 4 other tokens but got invalid ':'. +#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 5 other tokens but got invalid ':'. # line 1, column 5 # 1 | with: # : ^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_241__0.txt b/packages/bolt/tests/snapshots/bolt__parse_241__0.txt index dc23e8f99..83afa68eb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_241__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_241__0.txt @@ -24,3 +24,4 @@ foo = r"" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: '' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_243__0.txt b/packages/bolt/tests/snapshots/bolt__parse_243__0.txt index 314a55e9d..29f9a410d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_243__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_243__0.txt @@ -24,3 +24,4 @@ foo = r"\\" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: '\\\\' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_244__0.txt b/packages/bolt/tests/snapshots/bolt__parse_244__0.txt index 1575fe171..4c0447582 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_244__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_244__0.txt @@ -24,3 +24,4 @@ foo = r"\"" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: '\\"' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_249__0.txt b/packages/bolt/tests/snapshots/bolt__parse_249__0.txt index 3edf2d2bb..010a9e7b2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_249__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_249__0.txt @@ -37,7 +37,9 @@ class Foo: location: SourceLocation(pos=23, lineno=2, colno=13) end_location: SourceLocation(pos=27, lineno=2, colno=17) name: 'self' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=38, lineno=3, colno=9) end_location: SourceLocation(pos=42, lineno=3, colno=13) diff --git a/packages/bolt/tests/snapshots/bolt__parse_251__0.txt b/packages/bolt/tests/snapshots/bolt__parse_251__0.txt index f17127ccd..842ad0b8d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_251__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_251__0.txt @@ -41,6 +41,7 @@ print(Foo.bar) location: SourceLocation(pos=21, lineno=2, colno=11) end_location: SourceLocation(pos=22, lineno=2, colno=12) value: 2 + type_annotation: None location: SourceLocation(pos=23, lineno=3, colno=1) end_location: SourceLocation(pos=37, lineno=3, colno=15) diff --git a/packages/bolt/tests/snapshots/bolt__parse_259__0.txt b/packages/bolt/tests/snapshots/bolt__parse_259__0.txt index eac8645e4..7544a5759 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_259__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_259__0.txt @@ -37,12 +37,15 @@ class Foo: location: SourceLocation(pos=28, lineno=2, colno=18) end_location: SourceLocation(pos=32, lineno=2, colno=22) name: 'self' + type_annotation: None default: None location: SourceLocation(pos=34, lineno=2, colno=24) end_location: SourceLocation(pos=38, lineno=2, colno=28) name: 'name' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=49, lineno=3, colno=9) end_location: SourceLocation(pos=65, lineno=3, colno=25) @@ -71,3 +74,4 @@ class Foo: location: SourceLocation(pos=61, lineno=3, colno=21) end_location: SourceLocation(pos=65, lineno=3, colno=25) value: 'name' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_262__0.txt b/packages/bolt/tests/snapshots/bolt__parse_262__0.txt index 0b2087109..170420c46 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_262__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_262__0.txt @@ -50,3 +50,4 @@ class Foo: location: SourceLocation(pos=25, lineno=2, colno=15) end_location: SourceLocation(pos=26, lineno=2, colno=16) value: 2 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_264__0.txt b/packages/bolt/tests/snapshots/bolt__parse_264__0.txt index e9463ecee..2b9543f19 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_264__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_264__0.txt @@ -37,7 +37,9 @@ class Foo: location: SourceLocation(pos=23, lineno=2, colno=13) end_location: SourceLocation(pos=27, lineno=2, colno=17) name: 'self' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=38, lineno=3, colno=9) end_location: SourceLocation(pos=45, lineno=3, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_265__0.txt b/packages/bolt/tests/snapshots/bolt__parse_265__0.txt index f8e0450eb..7eaa395a0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_265__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_265__0.txt @@ -42,7 +42,9 @@ class B: location: SourceLocation(pos=19, lineno=2, colno=11) end_location: SourceLocation(pos=23, lineno=2, colno=15) name: 'self' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=34, lineno=3, colno=9) end_location: SourceLocation(pos=58, lineno=4, colno=19) @@ -106,7 +108,9 @@ class B: location: SourceLocation(pos=78, lineno=6, colno=11) end_location: SourceLocation(pos=82, lineno=6, colno=15) name: 'self' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=93, lineno=7, colno=9) end_location: SourceLocation(pos=117, lineno=8, colno=19) diff --git a/packages/bolt/tests/snapshots/bolt__parse_275__0.txt b/packages/bolt/tests/snapshots/bolt__parse_275__0.txt index 8e38f80c1..f416a9937 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_275__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_275__0.txt @@ -25,6 +25,7 @@ say @s[tag=hex.summon] location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: 42 + type_annotation: None location: SourceLocation(pos=9, lineno=2, colno=1) end_location: SourceLocation(pos=31, lineno=2, colno=23) diff --git a/packages/bolt/tests/snapshots/bolt__parse_278__0.txt b/packages/bolt/tests/snapshots/bolt__parse_278__0.txt index dc0ee1879..922010f21 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_278__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_278__0.txt @@ -25,6 +25,7 @@ time set hex.time location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 123 + type_annotation: None location: SourceLocation(pos=10, lineno=2, colno=1) end_location: SourceLocation(pos=27, lineno=2, colno=18) diff --git a/packages/bolt/tests/snapshots/bolt__parse_281__0.txt b/packages/bolt/tests/snapshots/bolt__parse_281__0.txt index 30d2ce6c4..4936d865b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_281__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_281__0.txt @@ -58,3 +58,4 @@ ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] location: SourceLocation(pos=52, lineno=1, colno=53) end_location: SourceLocation(pos=71, lineno=1, colno=72) value: 'minecraft:furnace' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_282__0.txt b/packages/bolt/tests/snapshots/bolt__parse_282__0.txt index 1232af55f..c60fe74db 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_282__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_282__0.txt @@ -25,6 +25,7 @@ ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] location: SourceLocation(pos=5, lineno=1, colno=6) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 42 + type_annotation: None location: SourceLocation(pos=8, lineno=2, colno=1) end_location: SourceLocation(pos=81, lineno=2, colno=74) @@ -79,3 +80,4 @@ ingredients = [{id: "minecraft:blaze_powder"}, {id: "minecraft:furnace"}] location: SourceLocation(pos=60, lineno=2, colno=53) end_location: SourceLocation(pos=79, lineno=2, colno=72) value: 'minecraft:furnace' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_283__0.txt b/packages/bolt/tests/snapshots/bolt__parse_283__0.txt index 6fcd535cf..9a931afce 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_283__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_283__0.txt @@ -18,6 +18,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=17, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_284__0.txt b/packages/bolt/tests/snapshots/bolt__parse_284__0.txt index 9dceb3d68..4a2c32b2e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_284__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_284__0.txt @@ -21,7 +21,9 @@ def f(a): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'a' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=5) end_location: SourceLocation(pos=18, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_285__0.txt b/packages/bolt/tests/snapshots/bolt__parse_285__0.txt index c6ae0f665..67c0cef38 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_285__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_285__0.txt @@ -21,11 +21,13 @@ def f(a=1): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 1 + return_type_annotation: None location: SourceLocation(pos=16, lineno=2, colno=5) end_location: SourceLocation(pos=20, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_286__0.txt b/packages/bolt/tests/snapshots/bolt__parse_286__0.txt index 7fb9cf42f..dc557c9d8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_286__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_286__0.txt @@ -21,11 +21,13 @@ def f(a=1,): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 1 + return_type_annotation: None location: SourceLocation(pos=17, lineno=2, colno=5) end_location: SourceLocation(pos=21, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_287__0.txt b/packages/bolt/tests/snapshots/bolt__parse_287__0.txt index d637d0b8c..f6b97e8fd 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_287__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_287__0.txt @@ -21,6 +21,7 @@ def f(a=1, /): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) @@ -29,6 +30,7 @@ def f(a=1, /): location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=12, lineno=1, colno=13) + return_type_annotation: None location: SourceLocation(pos=19, lineno=2, colno=5) end_location: SourceLocation(pos=23, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_288__0.txt b/packages/bolt/tests/snapshots/bolt__parse_288__0.txt index fd14ed149..b958d5054 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_288__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_288__0.txt @@ -21,6 +21,7 @@ def f(a, /, b): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'a' + type_annotation: None default: None location: SourceLocation(pos=9, lineno=1, colno=10) @@ -29,7 +30,9 @@ def f(a, /, b): location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'b' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=20, lineno=2, colno=5) end_location: SourceLocation(pos=24, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_289__0.txt b/packages/bolt/tests/snapshots/bolt__parse_289__0.txt index 64b7c54fc..b87fb514c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_289__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_289__0.txt @@ -21,6 +21,7 @@ def f(a=1, /, b=2): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) @@ -33,11 +34,13 @@ def f(a=1, /, b=2): location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=17, lineno=1, colno=18) name: 'b' + type_annotation: None default: location: SourceLocation(pos=16, lineno=1, colno=17) end_location: SourceLocation(pos=17, lineno=1, colno=18) value: 2 + return_type_annotation: None location: SourceLocation(pos=24, lineno=2, colno=5) end_location: SourceLocation(pos=28, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_290__0.txt b/packages/bolt/tests/snapshots/bolt__parse_290__0.txt index 29cf518c2..63e57ab41 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_290__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_290__0.txt @@ -21,6 +21,7 @@ def f(a=1, /, b=2, *args): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) @@ -33,6 +34,7 @@ def f(a=1, /, b=2, *args): location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=17, lineno=1, colno=18) name: 'b' + type_annotation: None default: location: SourceLocation(pos=16, lineno=1, colno=17) @@ -42,6 +44,8 @@ def f(a=1, /, b=2, *args): location: SourceLocation(pos=19, lineno=1, colno=20) end_location: SourceLocation(pos=24, lineno=1, colno=25) name: 'args' + type_annotation: None + return_type_annotation: None location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=35, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_291__0.txt b/packages/bolt/tests/snapshots/bolt__parse_291__0.txt index e58294def..6101799a5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_291__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_291__0.txt @@ -21,6 +21,7 @@ def f(a, /, b, *, c): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'a' + type_annotation: None default: None location: SourceLocation(pos=9, lineno=1, colno=10) @@ -29,6 +30,7 @@ def f(a, /, b, *, c): location: SourceLocation(pos=12, lineno=1, colno=13) end_location: SourceLocation(pos=13, lineno=1, colno=14) name: 'b' + type_annotation: None default: None location: SourceLocation(pos=15, lineno=1, colno=16) @@ -37,7 +39,9 @@ def f(a, /, b, *, c): location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=19, lineno=1, colno=20) name: 'c' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=26, lineno=2, colno=5) end_location: SourceLocation(pos=30, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_292__0.txt b/packages/bolt/tests/snapshots/bolt__parse_292__0.txt index 893e50fd5..3df5619aa 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_292__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_292__0.txt @@ -21,6 +21,7 @@ def f(a=1, /, b=2, *, c=3): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) @@ -33,6 +34,7 @@ def f(a=1, /, b=2, *, c=3): location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=17, lineno=1, colno=18) name: 'b' + type_annotation: None default: location: SourceLocation(pos=16, lineno=1, colno=17) @@ -45,11 +47,13 @@ def f(a=1, /, b=2, *, c=3): location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=25, lineno=1, colno=26) name: 'c' + type_annotation: None default: location: SourceLocation(pos=24, lineno=1, colno=25) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 3 + return_type_annotation: None location: SourceLocation(pos=32, lineno=2, colno=5) end_location: SourceLocation(pos=36, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_293__0.txt b/packages/bolt/tests/snapshots/bolt__parse_293__0.txt index 730b8dbf1..465aadd41 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_293__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_293__0.txt @@ -21,6 +21,7 @@ def f(a=1, /, b=2, *, c=3, **kwargs): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) @@ -33,6 +34,7 @@ def f(a=1, /, b=2, *, c=3, **kwargs): location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=17, lineno=1, colno=18) name: 'b' + type_annotation: None default: location: SourceLocation(pos=16, lineno=1, colno=17) @@ -45,6 +47,7 @@ def f(a=1, /, b=2, *, c=3, **kwargs): location: SourceLocation(pos=22, lineno=1, colno=23) end_location: SourceLocation(pos=25, lineno=1, colno=26) name: 'c' + type_annotation: None default: location: SourceLocation(pos=24, lineno=1, colno=25) @@ -54,6 +57,8 @@ def f(a=1, /, b=2, *, c=3, **kwargs): location: SourceLocation(pos=27, lineno=1, colno=28) end_location: SourceLocation(pos=35, lineno=1, colno=36) name: 'kwargs' + type_annotation: None + return_type_annotation: None location: SourceLocation(pos=42, lineno=2, colno=5) end_location: SourceLocation(pos=46, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_294__0.txt b/packages/bolt/tests/snapshots/bolt__parse_294__0.txt index 7d90bf6e5..76f212f99 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_294__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_294__0.txt @@ -21,6 +21,7 @@ def f(a=1, /, b=2, *args, c=3, **kwargs): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) @@ -33,6 +34,7 @@ def f(a=1, /, b=2, *args, c=3, **kwargs): location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=17, lineno=1, colno=18) name: 'b' + type_annotation: None default: location: SourceLocation(pos=16, lineno=1, colno=17) @@ -42,10 +44,12 @@ def f(a=1, /, b=2, *args, c=3, **kwargs): location: SourceLocation(pos=19, lineno=1, colno=20) end_location: SourceLocation(pos=24, lineno=1, colno=25) name: 'args' + type_annotation: None location: SourceLocation(pos=26, lineno=1, colno=27) end_location: SourceLocation(pos=29, lineno=1, colno=30) name: 'c' + type_annotation: None default: location: SourceLocation(pos=28, lineno=1, colno=29) @@ -55,6 +59,8 @@ def f(a=1, /, b=2, *args, c=3, **kwargs): location: SourceLocation(pos=31, lineno=1, colno=32) end_location: SourceLocation(pos=39, lineno=1, colno=40) name: 'kwargs' + type_annotation: None + return_type_annotation: None location: SourceLocation(pos=46, lineno=2, colno=5) end_location: SourceLocation(pos=50, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_309__0.txt b/packages/bolt/tests/snapshots/bolt__parse_309__0.txt index 09e7183d7..bec1d40c6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_309__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_309__0.txt @@ -4,6 +4,6 @@ # : ^^^ # 2 | pass # Notes: -# - Expected assignment but got invalid ':'. +# - Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 5 other tokens but got newline '\n'. memo foo: pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_315__0.txt b/packages/bolt/tests/snapshots/bolt__parse_315__0.txt index c513e99a2..72ef592b0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_315__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_315__0.txt @@ -26,6 +26,7 @@ memo foo=123, bar="hello": location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 123 + type_annotation: None location: SourceLocation(pos=14, lineno=1, colno=15) end_location: SourceLocation(pos=25, lineno=1, colno=26) @@ -41,6 +42,7 @@ memo foo=123, bar="hello": location: SourceLocation(pos=18, lineno=1, colno=19) end_location: SourceLocation(pos=25, lineno=1, colno=26) value: 'hello' + type_annotation: None location: SourceLocation(pos=31, lineno=2, colno=5) end_location: SourceLocation(pos=50, lineno=3, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_317__0.txt b/packages/bolt/tests/snapshots/bolt__parse_317__0.txt index d17ffe69f..5f2e64448 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_317__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_317__0.txt @@ -29,6 +29,7 @@ memo foo=42: location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 42 + type_annotation: None location: SourceLocation(pos=17, lineno=2, colno=5) end_location: SourceLocation(pos=27, lineno=2, colno=15) @@ -72,6 +73,7 @@ memo foo=42: location: SourceLocation(pos=37, lineno=3, colno=10) end_location: SourceLocation(pos=39, lineno=3, colno=12) value: 42 + type_annotation: None location: SourceLocation(pos=45, lineno=4, colno=5) end_location: SourceLocation(pos=55, lineno=4, colno=15) @@ -115,6 +117,7 @@ memo foo=42: location: SourceLocation(pos=65, lineno=5, colno=10) end_location: SourceLocation(pos=67, lineno=5, colno=12) value: 42 + type_annotation: None location: SourceLocation(pos=73, lineno=6, colno=5) end_location: SourceLocation(pos=83, lineno=6, colno=15) diff --git a/packages/bolt/tests/snapshots/bolt__parse_318__0.txt b/packages/bolt/tests/snapshots/bolt__parse_318__0.txt index 65571c6fb..c74519a80 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_318__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_318__0.txt @@ -19,6 +19,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=31, lineno=3, colno=13) diff --git a/packages/bolt/tests/snapshots/bolt__parse_319__0.txt b/packages/bolt/tests/snapshots/bolt__parse_319__0.txt index 0dca889cc..260c3f22c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_319__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_319__0.txt @@ -28,6 +28,7 @@ print(foo) location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=9, lineno=1, colno=10) value: 123 + type_annotation: None location: SourceLocation(pos=10, lineno=2, colno=1) end_location: SourceLocation(pos=56, lineno=4, colno=12) @@ -52,6 +53,7 @@ print(foo) location: SourceLocation(pos=23, lineno=2, colno=14) end_location: SourceLocation(pos=26, lineno=2, colno=17) value: 'bop' + type_annotation: None location: SourceLocation(pos=27, lineno=2, colno=18) end_location: SourceLocation(pos=30, lineno=2, colno=21) @@ -80,6 +82,7 @@ print(foo) location: SourceLocation(pos=43, lineno=3, colno=12) end_location: SourceLocation(pos=44, lineno=3, colno=13) value: 8 + type_annotation: None location: SourceLocation(pos=49, lineno=4, colno=5) end_location: SourceLocation(pos=56, lineno=4, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_324__0.txt b/packages/bolt/tests/snapshots/bolt__parse_324__0.txt index 50e7ba514..886367110 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_324__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_324__0.txt @@ -28,3 +28,4 @@ foo = """ location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=55, lineno=5, colno=4) value: '\n This is a docstring.\n\n Hello world\n' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_327__0.txt b/packages/bolt/tests/snapshots/bolt__parse_327__0.txt index b7d85952b..088cc8b58 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_327__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_327__0.txt @@ -19,6 +19,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_328__0.txt b/packages/bolt/tests/snapshots/bolt__parse_328__0.txt index b3edf34c1..0c0c5701e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_328__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_328__0.txt @@ -22,11 +22,13 @@ def g(a=123): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=11, lineno=1, colno=12) name: 'a' + type_annotation: None default: location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=11, lineno=1, colno=12) value: 123 + return_type_annotation: None location: SourceLocation(pos=18, lineno=2, colno=5) end_location: SourceLocation(pos=54, lineno=3, colno=13) diff --git a/packages/bolt/tests/snapshots/bolt__parse_32__0.txt b/packages/bolt/tests/snapshots/bolt__parse_32__0.txt index 7a5f2abd9..fef8df659 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_32__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_32__0.txt @@ -25,6 +25,7 @@ foo location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 1 + type_annotation: None location: SourceLocation(pos=8, lineno=2, colno=1) end_location: SourceLocation(pos=11, lineno=2, colno=4) diff --git a/packages/bolt/tests/snapshots/bolt__parse_332__0.txt b/packages/bolt/tests/snapshots/bolt__parse_332__0.txt new file mode 100644 index 000000000..1d2d21043 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_332__0.txt @@ -0,0 +1,27 @@ +a = ... +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + value: Ellipsis + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_332__1.txt b/packages/bolt/tests/snapshots/bolt__parse_332__1.txt new file mode 100644 index 000000000..fa480a8a4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_332__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = ... + a = _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_333__0.txt b/packages/bolt/tests/snapshots/bolt__parse_333__0.txt new file mode 100644 index 000000000..a5fe5dc8c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_333__0.txt @@ -0,0 +1,35 @@ +def f() -> int: + pass +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=9) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + decorators: + + name: 'f' + arguments: + + return_type_annotation: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 'int' + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=24, lineno=2, colno=9) + identifier: 'pass' + arguments: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_333__1.txt b/packages/bolt/tests/snapshots/bolt__parse_333__1.txt new file mode 100644 index 000000000..07055b6d3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_333__1.txt @@ -0,0 +1,17 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = int + def f() -> _bolt_var0: + pass +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=2, colno=9) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_334__0.txt b/packages/bolt/tests/snapshots/bolt__parse_334__0.txt new file mode 100644 index 000000000..a7f2fc126 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_334__0.txt @@ -0,0 +1,124 @@ +def f(a: str, /, b: int, c: list[int] | None = None, *d: float, **kwargs: object) -> tuple[int, ...]: + ... +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=2, colno=8) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=2, colno=8) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=100, lineno=1, colno=101) + decorators: + + name: 'f' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + name: 'a' + type_annotation: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: 'str' + default: None + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + name: 'b' + type_annotation: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=23, lineno=1, colno=24) + value: 'int' + default: None + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + name: 'c' + type_annotation: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + operator: '|' + left: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=37, lineno=1, colno=38) + value: + + location: SourceLocation(pos=28, lineno=1, colno=29) + end_location: SourceLocation(pos=32, lineno=1, colno=33) + value: 'list' + arguments: + + location: SourceLocation(pos=33, lineno=1, colno=34) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + value: 'int' + right: + + location: SourceLocation(pos=40, lineno=1, colno=41) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + value: None + default: + + location: SourceLocation(pos=47, lineno=1, colno=48) + end_location: SourceLocation(pos=51, lineno=1, colno=52) + value: None + + location: SourceLocation(pos=53, lineno=1, colno=54) + end_location: SourceLocation(pos=55, lineno=1, colno=56) + name: 'd' + type_annotation: + + location: SourceLocation(pos=57, lineno=1, colno=58) + end_location: SourceLocation(pos=62, lineno=1, colno=63) + value: 'float' + + location: SourceLocation(pos=64, lineno=1, colno=65) + end_location: SourceLocation(pos=72, lineno=1, colno=73) + name: 'kwargs' + type_annotation: + + location: SourceLocation(pos=74, lineno=1, colno=75) + end_location: SourceLocation(pos=80, lineno=1, colno=81) + value: 'object' + return_type_annotation: + + location: SourceLocation(pos=85, lineno=1, colno=86) + end_location: SourceLocation(pos=100, lineno=1, colno=101) + value: + + location: SourceLocation(pos=85, lineno=1, colno=86) + end_location: SourceLocation(pos=90, lineno=1, colno=91) + value: 'tuple' + arguments: + + location: SourceLocation(pos=91, lineno=1, colno=92) + end_location: SourceLocation(pos=94, lineno=1, colno=95) + value: 'int' + + location: SourceLocation(pos=96, lineno=1, colno=97) + end_location: SourceLocation(pos=99, lineno=1, colno=100) + value: Ellipsis + + location: SourceLocation(pos=106, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=2, colno=8) + commands: + + location: SourceLocation(pos=106, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=2, colno=8) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=106, lineno=2, colno=5) + end_location: SourceLocation(pos=109, lineno=2, colno=8) + value: Ellipsis diff --git a/packages/bolt/tests/snapshots/bolt__parse_334__1.txt b/packages/bolt/tests/snapshots/bolt__parse_334__1.txt new file mode 100644 index 000000000..221896d9c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_334__1.txt @@ -0,0 +1,33 @@ +_bolt_lineno = [1], [1] +_bolt_helper_missing = _bolt_runtime.helpers['missing'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var10: + _bolt_var0 = str + _bolt_var1 = int + _bolt_var2 = list + _bolt_var3 = int + _bolt_var2 = _bolt_var2[_bolt_var3] + _bolt_var4 = None + _bolt_var2 = _bolt_var2 | _bolt_var4 + _bolt_var5 = float + _bolt_var6 = object + _bolt_var7 = tuple + _bolt_var8 = int + _bolt_var9 = ... + _bolt_var7 = _bolt_var7[_bolt_var8, _bolt_var9] + def f(a: _bolt_var0, /, b: _bolt_var1, c: _bolt_var2 = _bolt_helper_missing, *d: _bolt_var5, **kwargs: _bolt_var6) -> _bolt_var7: + if c is _bolt_helper_missing: + _bolt_var10 = None + c = _bolt_var10 + _bolt_var11 = ... +_bolt_var11 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var10)) +--- +output = _bolt_var11 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=109, lineno=2, colno=8) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_335__0.txt b/packages/bolt/tests/snapshots/bolt__parse_335__0.txt new file mode 100644 index 000000000..e26936b92 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_335__0.txt @@ -0,0 +1,7 @@ +#>ERROR Identifier "f" is not defined. +# line 1, column 38 +# 1 | def f(a: int, b: int = f(a - 1), *c: f) -> int: +# : ^ +# 2 | return a + b +def f(a: int, b: int = f(a - 1), *c: f) -> int: + return a + b diff --git a/packages/bolt/tests/snapshots/bolt__parse_336__0.txt b/packages/bolt/tests/snapshots/bolt__parse_336__0.txt new file mode 100644 index 000000000..8419f29f4 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_336__0.txt @@ -0,0 +1,25 @@ +foo: int +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + type_annotation: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'int' diff --git a/packages/bolt/tests/snapshots/bolt__parse_336__1.txt b/packages/bolt/tests/snapshots/bolt__parse_336__1.txt new file mode 100644 index 000000000..f370f2206 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_336__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = int + foo: _bolt_var0 +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_337__0.txt b/packages/bolt/tests/snapshots/bolt__parse_337__0.txt new file mode 100644 index 000000000..623cadaac --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_337__0.txt @@ -0,0 +1,31 @@ +foo: int = 123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=11, lineno=1, colno=12) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + value: 123 + type_annotation: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'int' diff --git a/packages/bolt/tests/snapshots/bolt__parse_337__1.txt b/packages/bolt/tests/snapshots/bolt__parse_337__1.txt new file mode 100644 index 000000000..b68fa8258 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_337__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 123 + foo = _bolt_var0 + _bolt_var1 = int + foo: _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_338__0.txt b/packages/bolt/tests/snapshots/bolt__parse_338__0.txt new file mode 100644 index 000000000..5b89f2d96 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_338__0.txt @@ -0,0 +1,47 @@ +foo: int +foo = 123 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + identifier: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=1, colno=4) + value: 'foo' + rebind: False + type_annotation: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + value: 'int' + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=9, lineno=2, colno=1) + end_location: SourceLocation(pos=12, lineno=2, colno=4) + value: 'foo' + rebind: False + value: + + location: SourceLocation(pos=15, lineno=2, colno=7) + end_location: SourceLocation(pos=18, lineno=2, colno=10) + value: 123 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_338__1.txt b/packages/bolt/tests/snapshots/bolt__parse_338__1.txt new file mode 100644 index 000000000..337b1851e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_338__1.txt @@ -0,0 +1,19 @@ +_bolt_lineno = [1, 8], [1, 2] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = int + foo: _bolt_var0 + _bolt_var1 = 123 + foo = _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=1) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_339__0.txt b/packages/bolt/tests/snapshots/bolt__parse_339__0.txt new file mode 100644 index 000000000..6b5fb90b3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_339__0.txt @@ -0,0 +1,5 @@ +#>ERROR Identifier "doesnotexist" is not defined. +# line 1, column 6 +# 1 | foo: doesnotexist = 123 +# : ^^^^^^^^^^^^ +foo: doesnotexist = 123 diff --git a/packages/bolt/tests/snapshots/bolt__parse_33__0.txt b/packages/bolt/tests/snapshots/bolt__parse_33__0.txt index 207faeabc..37c6bb889 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_33__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_33__0.txt @@ -25,6 +25,7 @@ foo = 1 location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 1 + type_annotation: None location: SourceLocation(pos=8, lineno=2, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_340__0.txt b/packages/bolt/tests/snapshots/bolt__parse_340__0.txt new file mode 100644 index 000000000..39c9adfeb --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_340__0.txt @@ -0,0 +1,67 @@ +class A: + foo: int + bar: str = "hello" +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=3, colno=23) + identifier: 'class:name:body' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=7, lineno=1, colno=8) + decorators: + + value: 'A' + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=23) + commands: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + identifier: + + location: SourceLocation(pos=13, lineno=2, colno=5) + end_location: SourceLocation(pos=16, lineno=2, colno=8) + value: 'foo' + rebind: False + type_annotation: + + location: SourceLocation(pos=18, lineno=2, colno=10) + end_location: SourceLocation(pos=21, lineno=2, colno=13) + value: 'int' + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=23) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=44, lineno=3, colno=23) + operator: '=' + target: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=29, lineno=3, colno=8) + value: 'bar' + rebind: False + value: + + location: SourceLocation(pos=37, lineno=3, colno=16) + end_location: SourceLocation(pos=44, lineno=3, colno=23) + value: 'hello' + type_annotation: + + location: SourceLocation(pos=31, lineno=3, colno=10) + end_location: SourceLocation(pos=34, lineno=3, colno=13) + value: 'str' diff --git a/packages/bolt/tests/snapshots/bolt__parse_340__1.txt b/packages/bolt/tests/snapshots/bolt__parse_340__1.txt new file mode 100644 index 000000000..cfab1d3a2 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_340__1.txt @@ -0,0 +1,24 @@ +_bolt_lineno = [1, 6, 9], [1, 2, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + class A: + _bolt_var0 = int + foo: _bolt_var0 + _bolt_var1 = 'hello' + bar = _bolt_var1 + _bolt_var2 = str + bar: _bolt_var2 + del _bolt_var0 + del _bolt_var1 + del _bolt_var2 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=45, lineno=4, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_34__0.txt b/packages/bolt/tests/snapshots/bolt__parse_34__0.txt index 13e402a2b..533152747 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_34__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_34__0.txt @@ -26,6 +26,7 @@ if a == 1: location: SourceLocation(pos=4, lineno=1, colno=5) end_location: SourceLocation(pos=5, lineno=1, colno=6) value: 1 + type_annotation: None location: SourceLocation(pos=6, lineno=2, colno=1) end_location: SourceLocation(pos=26, lineno=3, colno=10) @@ -69,3 +70,4 @@ if a == 1: location: SourceLocation(pos=25, lineno=3, colno=9) end_location: SourceLocation(pos=26, lineno=3, colno=10) value: 0 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt index aaf18dae8..ddc06653a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, literal 'block' or 10 other tokens but reached end of file. +#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 11 other tokens but reached end of file. # line 1, column 3 # 1 | if if diff --git a/packages/bolt/tests/snapshots/bolt__parse_39__0.txt b/packages/bolt/tests/snapshots/bolt__parse_39__0.txt index 8d1bffea1..71b835985 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_39__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_39__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', docstring, false, identifier, null or 4 other tokens but got newline '\n'. +#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 5 other tokens but got newline '\n'. # line 1, column 12 # 1 | if True and if True and diff --git a/packages/bolt/tests/snapshots/bolt__parse_46__0.txt b/packages/bolt/tests/snapshots/bolt__parse_46__0.txt index 70836a58f..54229b5aa 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_46__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_46__0.txt @@ -62,6 +62,7 @@ if score @s tmp matches 42: location: SourceLocation(pos=40, lineno=2, colno=13) end_location: SourceLocation(pos=42, lineno=2, colno=15) value: 42 + type_annotation: None location: SourceLocation(pos=47, lineno=3, colno=5) end_location: SourceLocation(pos=107, lineno=5, colno=26) @@ -128,3 +129,4 @@ if score @s tmp matches 42: location: SourceLocation(pos=106, lineno=5, colno=25) end_location: SourceLocation(pos=107, lineno=5, colno=26) value: 1 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_47__0.txt b/packages/bolt/tests/snapshots/bolt__parse_47__0.txt index 431b8535e..061bf6e8e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_47__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_47__0.txt @@ -37,3 +37,4 @@ foo = ( location: SourceLocation(pos=24, lineno=3, colno=7) end_location: SourceLocation(pos=29, lineno=3, colno=12) value: 'def' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index 620a52298..dae51e3e1 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, docstring, false, identifier or 154 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 155 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_50__0.txt b/packages/bolt/tests/snapshots/bolt__parse_50__0.txt index 36192d1bb..dbddaebff 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_50__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_50__0.txt @@ -25,6 +25,7 @@ foo == 1 location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 1 + type_annotation: None location: SourceLocation(pos=8, lineno=2, colno=1) end_location: SourceLocation(pos=16, lineno=2, colno=9) diff --git a/packages/bolt/tests/snapshots/bolt__parse_53__0.txt b/packages/bolt/tests/snapshots/bolt__parse_53__0.txt index 8070ef7a8..75a577582 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_53__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_53__0.txt @@ -25,6 +25,7 @@ foo = foo location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) value: 1 + type_annotation: None location: SourceLocation(pos=8, lineno=2, colno=1) end_location: SourceLocation(pos=17, lineno=2, colno=10) @@ -45,3 +46,4 @@ foo = foo location: SourceLocation(pos=14, lineno=2, colno=7) end_location: SourceLocation(pos=17, lineno=2, colno=10) value: 'foo' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_55__0.txt b/packages/bolt/tests/snapshots/bolt__parse_55__0.txt index 2be76a96e..39fccf59a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_55__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_55__0.txt @@ -43,3 +43,4 @@ for foo in "foo": location: SourceLocation(pos=28, lineno=2, colno=11) end_location: SourceLocation(pos=31, lineno=2, colno=14) value: 'foo' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_57__0.txt b/packages/bolt/tests/snapshots/bolt__parse_57__0.txt index 888a8a921..436614240 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_57__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_57__0.txt @@ -25,6 +25,7 @@ foo += "hey" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=8, lineno=1, colno=9) value: '' + type_annotation: None location: SourceLocation(pos=9, lineno=2, colno=1) end_location: SourceLocation(pos=21, lineno=2, colno=13) @@ -45,3 +46,4 @@ foo += "hey" location: SourceLocation(pos=16, lineno=2, colno=8) end_location: SourceLocation(pos=21, lineno=2, colno=13) value: 'hey' + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_70__0.txt b/packages/bolt/tests/snapshots/bolt__parse_70__0.txt index 0af8a90c3..3fe31a490 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_70__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_70__0.txt @@ -19,6 +19,7 @@ foo() name: 'foo' arguments: + return_type_annotation: None location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=24, lineno=2, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_71__0.txt b/packages/bolt/tests/snapshots/bolt__parse_71__0.txt index 710a78932..367fc67e3 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_71__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_71__0.txt @@ -20,6 +20,7 @@ def foo(): name: 'foo' arguments: + return_type_annotation: None location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=49, lineno=4, colno=10) @@ -37,6 +38,7 @@ def foo(): name: 'bar' arguments: + return_type_annotation: None location: SourceLocation(pos=34, lineno=3, colno=9) end_location: SourceLocation(pos=39, lineno=3, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_72__0.txt b/packages/bolt/tests/snapshots/bolt__parse_72__0.txt index 9ce50595a..0a55e3e4b 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_72__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_72__0.txt @@ -25,6 +25,7 @@ def foo( location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=16, lineno=2, colno=8) name: 'a' + type_annotation: None default: location: SourceLocation(pos=15, lineno=2, colno=7) @@ -34,6 +35,7 @@ def foo( location: SourceLocation(pos=22, lineno=3, colno=5) end_location: SourceLocation(pos=25, lineno=3, colno=8) name: 'b' + type_annotation: None default: location: SourceLocation(pos=24, lineno=3, colno=7) @@ -43,6 +45,7 @@ def foo( location: SourceLocation(pos=31, lineno=4, colno=5) end_location: SourceLocation(pos=38, lineno=4, colno=12) name: 'c' + type_annotation: None default: location: SourceLocation(pos=33, lineno=4, colno=7) @@ -58,6 +61,7 @@ def foo( location: SourceLocation(pos=37, lineno=4, colno=11) end_location: SourceLocation(pos=38, lineno=4, colno=12) value: 'b' + return_type_annotation: None location: SourceLocation(pos=47, lineno=6, colno=5) end_location: SourceLocation(pos=56, lineno=6, colno=14) diff --git a/packages/bolt/tests/snapshots/bolt__parse_77__0.txt b/packages/bolt/tests/snapshots/bolt__parse_77__0.txt index bc60d3e3e..b8e2a0bcf 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_77__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_77__0.txt @@ -22,16 +22,19 @@ def f(a, b=a): location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'a' + type_annotation: None default: None location: SourceLocation(pos=9, lineno=1, colno=10) end_location: SourceLocation(pos=12, lineno=1, colno=13) name: 'b' + type_annotation: None default: location: SourceLocation(pos=11, lineno=1, colno=12) end_location: SourceLocation(pos=12, lineno=1, colno=13) value: 'a' + return_type_annotation: None location: SourceLocation(pos=19, lineno=2, colno=5) end_location: SourceLocation(pos=37, lineno=3, colno=12) @@ -56,6 +59,7 @@ def f(a, b=a): location: SourceLocation(pos=24, lineno=2, colno=10) end_location: SourceLocation(pos=25, lineno=2, colno=11) value: 'a' + type_annotation: None location: SourceLocation(pos=30, lineno=3, colno=5) end_location: SourceLocation(pos=37, lineno=3, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_81__0.txt b/packages/bolt/tests/snapshots/bolt__parse_81__0.txt index 9238e268b..38679f92e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_81__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_81__0.txt @@ -33,7 +33,9 @@ def foo(something): location: SourceLocation(pos=8, lineno=1, colno=9) end_location: SourceLocation(pos=17, lineno=1, colno=18) name: 'something' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=24, lineno=2, colno=5) end_location: SourceLocation(pos=226, lineno=14, colno=10) @@ -51,6 +53,7 @@ def foo(something): name: 'wat' arguments: + return_type_annotation: None location: SourceLocation(pos=43, lineno=3, colno=9) end_location: SourceLocation(pos=216, lineno=13, colno=16) @@ -112,6 +115,7 @@ def foo(something): location: SourceLocation(pos=141, lineno=9, colno=13) end_location: SourceLocation(pos=148, lineno=9, colno=20) value: 'hello' + type_annotation: None location: SourceLocation(pos=157, lineno=10, colno=9) end_location: SourceLocation(pos=199, lineno=11, colno=23) @@ -160,6 +164,7 @@ def foo(something): location: SourceLocation(pos=198, lineno=11, colno=22) end_location: SourceLocation(pos=199, lineno=11, colno=23) value: 3 + type_annotation: None location: SourceLocation(pos=209, lineno=13, colno=9) end_location: SourceLocation(pos=216, lineno=13, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_82__0.txt b/packages/bolt/tests/snapshots/bolt__parse_82__0.txt index b9571e5f0..f285c6f36 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_82__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_82__0.txt @@ -23,6 +23,7 @@ thing = bar() name: 'foo' arguments: + return_type_annotation: None location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=46, lineno=3, colno=19) @@ -67,6 +68,7 @@ thing = bar() value: 'bar' arguments: + type_annotation: None location: SourceLocation(pos=47, lineno=4, colno=1) end_location: SourceLocation(pos=93, lineno=6, colno=19) @@ -80,6 +82,7 @@ thing = bar() name: 'bar' arguments: + return_type_annotation: None location: SourceLocation(pos=62, lineno=5, colno=5) end_location: SourceLocation(pos=93, lineno=6, colno=19) @@ -124,6 +127,7 @@ thing = bar() value: 'foo' arguments: + type_annotation: None location: SourceLocation(pos=94, lineno=7, colno=1) end_location: SourceLocation(pos=107, lineno=7, colno=14) @@ -150,3 +154,4 @@ thing = bar() value: 'bar' arguments: + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_84__0.txt b/packages/bolt/tests/snapshots/bolt__parse_84__0.txt index 747228148..fed315fdb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_84__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_84__0.txt @@ -18,6 +18,7 @@ def foo(): name: 'foo' arguments: + return_type_annotation: None location: SourceLocation(pos=15, lineno=2, colno=5) end_location: SourceLocation(pos=21, lineno=2, colno=11) diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt index 06c30ba27..5c8cab60f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt @@ -20,6 +20,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=52, lineno=4, colno=12) @@ -37,6 +38,7 @@ def f(): name: 'g' arguments: + return_type_annotation: None location: SourceLocation(pos=30, lineno=3, colno=9) end_location: SourceLocation(pos=40, lineno=3, colno=19) @@ -70,3 +72,4 @@ def f(): location: SourceLocation(pos=51, lineno=4, colno=11) end_location: SourceLocation(pos=52, lineno=4, colno=12) value: 0 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt index 212d84c57..ddbe761bb 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_89__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_89__0.txt @@ -22,7 +22,9 @@ f("thing") location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=7, lineno=1, colno=8) name: 'x' + type_annotation: None default: None + return_type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=5) end_location: SourceLocation(pos=26, lineno=2, colno=17) diff --git a/packages/bolt/tests/snapshots/bolt__parse_92__0.txt b/packages/bolt/tests/snapshots/bolt__parse_92__0.txt index e6d4f0980..8f1b73804 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_92__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_92__0.txt @@ -27,6 +27,7 @@ foo = "hello" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'hello' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=32, lineno=4, colno=2) diff --git a/packages/bolt/tests/snapshots/bolt__parse_93__0.txt b/packages/bolt/tests/snapshots/bolt__parse_93__0.txt index 71e6fa4bb..18a9f2f89 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_93__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_93__0.txt @@ -27,6 +27,7 @@ foo = "hello" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'hello' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=32, lineno=4, colno=2) diff --git a/packages/bolt/tests/snapshots/bolt__parse_94__0.txt b/packages/bolt/tests/snapshots/bolt__parse_94__0.txt index fcbb520c3..cbe021ee0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_94__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_94__0.txt @@ -28,6 +28,7 @@ foo = "hello" location: SourceLocation(pos=6, lineno=1, colno=7) end_location: SourceLocation(pos=13, lineno=1, colno=14) value: 'hello' + type_annotation: None location: SourceLocation(pos=14, lineno=2, colno=1) end_location: SourceLocation(pos=50, lineno=5, colno=2) diff --git a/packages/bolt/tests/snapshots/bolt__parse_95__0.txt b/packages/bolt/tests/snapshots/bolt__parse_95__0.txt index 2371e8bd8..8c5ae2aa0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_95__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_95__0.txt @@ -154,3 +154,4 @@ my_predicate = { location: SourceLocation(pos=229, lineno=10, colno=18) end_location: SourceLocation(pos=230, lineno=10, colno=19) value: 1 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt index 91bf2f0e6..005e71cc8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_96__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_96__0.txt @@ -154,3 +154,4 @@ my_predicate = { location: SourceLocation(pos=211, lineno=10, colno=16) end_location: SourceLocation(pos=212, lineno=10, colno=17) value: 1 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt index b18cb9bf6..98a0906ee 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt @@ -18,6 +18,7 @@ def f(): name: 'f' arguments: + return_type_annotation: None location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=56, lineno=2, colno=48) diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md new file mode 100644 index 000000000..00e57a929 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md @@ -0,0 +1,31 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say hey +say 123 +say {'b': , 'c': list[int] | None, 'a': , 'd': , 'kwargs': , 'return': tuple[int, ...]} +say False +say hello +say {'foo': , 'bar': } +say {'foo': list[int], 'bar': str | None, 'return': None} +say B(foo=[1, 2], bar='three') +say ['hello'] +say ['hello', 'world'] +``` From 29874787b17bd40421a5b2b96d5c385c32409f01 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 2 Feb 2023 02:12:33 +0000 Subject: [PATCH 1123/1554] 0.26.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 48ca4523b..2e736581c 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.26.0 (2023-02-02) +### Feature +* Add type annotations ([`a3970f1`](https://github.com/mcbeet/bolt/commit/a3970f1a61668c5cf772ad24eacd7a835aa1824e)) + ## v0.25.0 (2023-02-01) ### Feature * Add docstrings ([`c1c1488`](https://github.com/mcbeet/bolt/commit/c1c1488d60d58abc2a66d8cd02b671831bbf4473)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index f7d5ba3a4..d0122c7af 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.25.0" +__version__ = "0.26.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index b381c2dc6..98c65721c 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.25.0" +version = "0.26.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From ae05773b6133f1eb61caec0146aec492bbd7c642 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 3 Feb 2023 18:47:06 +0100 Subject: [PATCH 1124/1554] test: nested memo --- .../src/data/demo/functions/foo.mcfunction | 7 + .../tests/resources/bolt_examples.mcfunction | 7 + .../tests/snapshots/bolt__parse_341__0.txt | 127 ++++++++++++++++++ .../tests/snapshots/bolt__parse_341__1.txt | 99 ++++++++++++++ .../examples__build_bolt_memo__0.pack.md | 4 + 5 files changed, 244 insertions(+) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_341__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_341__1.txt diff --git a/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction index 7cc3eb367..d1990b4c5 100644 --- a/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_memo/src/data/demo/functions/foo.mcfunction @@ -16,3 +16,10 @@ memo a, a: say a say wat + +a = 1 +b = 2 +memo a, b: + say (a + b) + memo b: + say b diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 1eda848d2..8f7096ea8 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1236,3 +1236,10 @@ foo: doesnotexist = 123 class A: foo: int bar: str = "hello" +### +a = 1 +b = 2 +memo a, b: + say (a + b) + memo b: + say b diff --git a/packages/bolt/tests/snapshots/bolt__parse_341__0.txt b/packages/bolt/tests/snapshots/bolt__parse_341__0.txt new file mode 100644 index 000000000..4e3e9f505 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_341__0.txt @@ -0,0 +1,127 @@ +a = 1 +b = 2 +memo a, b: + say (a + b) + memo b: + say b +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=7, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'a' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + type_annotation: None + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=7, lineno=2, colno=2) + value: 'b' + rebind: False + value: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + value: 2 + type_annotation: None + + location: SourceLocation(pos=12, lineno=3, colno=1) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + identifier: 'memo:0:1' + arguments: + + location: SourceLocation(pos=17, lineno=3, colno=6) + end_location: SourceLocation(pos=18, lineno=3, colno=7) + value: 'a' + + location: SourceLocation(pos=20, lineno=3, colno=9) + end_location: SourceLocation(pos=21, lineno=3, colno=10) + value: 'b' + + location: SourceLocation(pos=27, lineno=4, colno=5) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=27, lineno=4, colno=5) + end_location: SourceLocation(pos=37, lineno=4, colno=15) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=32, lineno=4, colno=10) + end_location: SourceLocation(pos=37, lineno=4, colno=15) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=32, lineno=4, colno=10) + end_location: SourceLocation(pos=37, lineno=4, colno=15) + operator: '+' + left: + + location: SourceLocation(pos=32, lineno=4, colno=10) + end_location: SourceLocation(pos=33, lineno=4, colno=11) + value: 'a' + right: + + location: SourceLocation(pos=36, lineno=4, colno=14) + end_location: SourceLocation(pos=37, lineno=4, colno=15) + value: 'b' + + location: SourceLocation(pos=43, lineno=5, colno=5) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + identifier: 'memo:0' + arguments: + + location: SourceLocation(pos=48, lineno=5, colno=10) + end_location: SourceLocation(pos=49, lineno=5, colno=11) + value: 'b' + + location: SourceLocation(pos=59, lineno=6, colno=9) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + commands: + + location: SourceLocation(pos=59, lineno=6, colno=9) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=63, lineno=6, colno=13) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=63, lineno=6, colno=13) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + value: 'b' + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + persistent_id: UUID('23b8c1e9-3924-56de-3eb1-3b9046685257') diff --git a/packages/bolt/tests/snapshots/bolt__parse_341__1.txt b/packages/bolt/tests/snapshots/bolt__parse_341__1.txt new file mode 100644 index 000000000..93e0fdf77 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_341__1.txt @@ -0,0 +1,99 @@ +_bolt_lineno = [1, 11, 12, 21, 26, 34], [1, 2, 3, 4, 5, 6] +_bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 = None +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +with _bolt_runtime.scope() as _bolt_var8: + _bolt_var0 = 1 + a = _bolt_var0 + _bolt_var1 = 2 + b = _bolt_var1 + _bolt_var2 = a + _bolt_var3 = b + if _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 is None: + _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257 = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257 = _bolt_memo_storage_23b8c1e9392456de3eb13b9046685257[(_bolt_var2, _bolt_var3,)] + if _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_23b8c1e9392456de3eb13b9046685257, __name__): + _bolt_var4 = a + _bolt_var5 = b + _bolt_var4 = _bolt_var4 + _bolt_var5 + _bolt_var4 = _bolt_helper_interpolate_message(_bolt_var4, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var4]))) + _bolt_var6 = b + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[3], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var6,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var7 = b + _bolt_var7 = _bolt_helper_interpolate_message(_bolt_var7, _bolt_refs[4]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var7]))) +_bolt_var9 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var8)) +--- +output = _bolt_var9 +--- +_bolt_refs[0] + + location: SourceLocation(pos=12, lineno=3, colno=1) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + identifier: 'memo:0:1' + arguments: + + + + persistent_id: UUID('23b8c1e9-3924-56de-3eb1-3b9046685257') +_bolt_refs[1] + + location: SourceLocation(pos=32, lineno=4, colno=10) + end_location: SourceLocation(pos=37, lineno=4, colno=15) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=27, lineno=4, colno=5) + end_location: SourceLocation(pos=37, lineno=4, colno=15) + identifier: 'say:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=43, lineno=5, colno=5) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + identifier: 'memo:0' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[4] + + location: SourceLocation(pos=63, lineno=6, colno=13) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[5] + + location: SourceLocation(pos=59, lineno=6, colno=9) + end_location: SourceLocation(pos=64, lineno=6, colno=14) + identifier: 'say:message' + arguments: + +_bolt_refs[6] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=65, lineno=7, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md index c9e4dae64..9527c1528 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md @@ -119,6 +119,8 @@ execute if score @s thingy matches 29..56 run function demo:ref/bar/tree_57/29_5 say 123 say (((1, 2), (1, 2)), ((1, 2), (1, 2))) say wat +say 3 +say 2 ``` `@function demo:ref/bar/tree_42/0_20` @@ -902,6 +904,8 @@ execute if score @s thingy matches 29..56 run function demo:bar/tree_57/29_56 say 123 say (((1, 2), (1, 2)), ((1, 2), (1, 2))) say wat +say 3 +say 2 ``` `@function demo:bar/tree_42/0_1` From ac71324284e9789e7908f07e16a5c8ea09d3fd99 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Feb 2023 02:54:37 +0100 Subject: [PATCH 1125/1554] feat: restore memo bindings --- packages/bolt/bolt/ast.py | 21 ++- packages/bolt/bolt/codegen.py | 11 ++ packages/bolt/bolt/memo.py | 18 +- packages/bolt/bolt/parse.py | 124 ++++++++++++++ packages/bolt/bolt/resources/commands.json | 2 +- packages/bolt/bolt/semantics.py | 24 ++- packages/bolt/bolt/utils.py | 14 ++ .../src/data/demo/functions/vars.mcfunction | 23 +++ .../tests/resources/bolt_examples.mcfunction | 30 ++++ .../tests/snapshots/bolt__parse_319__0.txt | 3 +- .../tests/snapshots/bolt__parse_319__1.txt | 6 +- .../tests/snapshots/bolt__parse_342__0.txt | 10 ++ .../tests/snapshots/bolt__parse_343__0.txt | 159 ++++++++++++++++++ .../tests/snapshots/bolt__parse_343__1.txt | 58 +++++++ .../tests/snapshots/bolt__parse_344__0.txt | 82 +++++++++ .../tests/snapshots/bolt__parse_344__1.txt | 64 +++++++ .../tests/snapshots/bolt__parse_345__0.txt | 104 ++++++++++++ .../tests/snapshots/bolt__parse_345__1.txt | 70 ++++++++ .../tests/snapshots/bolt__parse_346__0.txt | 104 ++++++++++++ .../tests/snapshots/bolt__parse_346__1.txt | 70 ++++++++ .../examples__build_bolt_memo__0.pack.md | 114 +++++++++++++ 21 files changed, 1090 insertions(+), 21 deletions(-) create mode 100644 packages/bolt/examples/bolt_memo/src/data/demo/functions/vars.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_342__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_343__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_343__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_344__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_344__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_345__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_345__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_346__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_346__1.txt diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index b91dcc71c..e54f3644a 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -47,6 +47,8 @@ "AstClassName", "AstClassBases", "AstClassRoot", + "AstEscapeAnalysisRoot", + "AstEscapeRoot", "AstMemo", "AstMemoResult", "AstInterpolation", @@ -58,7 +60,7 @@ import re from dataclasses import dataclass -from typing import Any, Optional, Union +from typing import Any, List, Optional, Tuple, Union from uuid import UUID, uuid4 from beet.core.utils import JsonDict, extra_field, required_field @@ -75,6 +77,7 @@ from tokenstream import TokenStream from .pattern import IDENTIFIER_PATTERN +from .semantics import Binding @dataclass(frozen=True, slots=True) @@ -449,6 +452,22 @@ class AstClassRoot(AstRoot): """Ast class root node.""" +@dataclass(frozen=True, slots=True) +class AstEscapeAnalysisRoot(AstRoot): + """Ast escape analysis root node.""" + + refcount_snapshots: List[Tuple[str, Binding, int]] = extra_field( + default_factory=list + ) + + +@dataclass(frozen=True, slots=True) +class AstEscapeRoot(AstRoot): + """Ast escape root node.""" + + identifiers: Tuple[str, ...] = () + + @dataclass(frozen=True, slots=True) class AstMemo(AstCommand): """Ast memo node.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index c9d72bf78..af634513d 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -48,6 +48,7 @@ AstDict, AstDictItem, AstDocstring, + AstEscapeRoot, AstExpressionBinary, AstExpressionUnary, AstFormatString, @@ -516,6 +517,12 @@ def memo( keys: List[str] = [] *arguments, body = node.arguments + cached_identifiers = ( + "".join(f"{name}," for name in body.identifiers) + if isinstance(body, AstEscapeRoot) + else None + ) + for arg in arguments: if isinstance(arg, AstAssignment): target = cast(AstTargetIdentifier, arg.target) @@ -541,6 +548,8 @@ def memo( acc.statement(f"if {invocation}.cached:") with acc.block(): acc.statement(f"_bolt_runtime.memo.restore(_bolt_runtime, {invocation})") + if cached_identifiers: + acc.statement(f"({cached_identifiers}) = {invocation}.bindings") acc.statement("else:") with acc.block(): @@ -549,6 +558,8 @@ def memo( ) with acc.block(): yield from visit_body(cast(AstRoot, body), acc) + if cached_identifiers: + acc.statement(f"{invocation}.bindings = ({cached_identifiers})") return [] diff --git a/packages/bolt/bolt/memo.py b/packages/bolt/bolt/memo.py index bd73328c7..6f1a28ee0 100644 --- a/packages/bolt/bolt/memo.py +++ b/packages/bolt/bolt/memo.py @@ -9,7 +9,6 @@ import logging -import pickle from contextlib import contextmanager from dataclasses import dataclass from pathlib import Path @@ -45,6 +44,7 @@ from .ast import AstMemo, AstMemoResult from .emit import CommandEmitter +from .utils import dump_pickle, load_pickle logger = logging.getLogger("memo") @@ -126,6 +126,12 @@ def __init__(self, parent: "MemoStorage", state_id: int): default=DataPack, ) + bindings: ClassVar[MemoState[Tuple[Any, ...]]] = MemoState( + load=load_pickle, + dump=dump_pickle, + default=tuple, + ) + def __getstate__(self) -> Tuple["MemoStorage", int, bool, int]: return self.parent, self.state_id, self.cached, self.epoch @@ -267,18 +273,16 @@ def missing(self, key: str) -> MemoFileIndex: index_path = self.cache.get_path(f"{key}-memo") if index_path.is_file(): - with index_path.open("rb") as f: - if isinstance(memo_file_index := pickle.load(f), MemoFileIndex): - memo_file_index.path = index_path - return memo_file_index + if isinstance(memo_file_index := load_pickle(index_path), MemoFileIndex): + memo_file_index.path = index_path + return memo_file_index return MemoFileIndex(key, index_path) def flush(self): for memo_file_index in self.values(): if memo_file_index.path: - with memo_file_index.path.open("wb") as f: - pickle.dump(memo_file_index, f, protocol=pickle.HIGHEST_PROTOCOL) + dump_pickle(memo_file_index.path, memo_file_index) @property def gc_cutoff(self) -> int: diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 6f358fd11..64ded094a 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -14,6 +14,9 @@ "DisableInterpolationParser", "ForkLexicalScopeParser", "AssignmentStatementParser", + "EscapeAnalysisParser", + "EscapeAnalysisResolver", + "MemoHandler", "parse_decorator", "AssignmentTargetParser", "IfElseLoweringParser", @@ -106,6 +109,8 @@ AstDictItem, AstDictUnquotedKey, AstDocstring, + AstEscapeAnalysisRoot, + AstEscapeRoot, AstExpression, AstExpressionBinary, AstExpressionUnary, @@ -162,6 +167,7 @@ TRUE_PATTERN, ) from .semantics import ( + Binding, ClassScope, FunctionScope, GlobalScope, @@ -223,6 +229,7 @@ def get_bolt_parsers( "command:argument:bolt:class_bases": delegate("bolt:class_bases"), "command:argument:bolt:class_root": delegate("bolt:class_root"), "command:argument:bolt:memo_variable": delegate("bolt:memo_variable"), + "command:argument:bolt:memo_root": delegate("bolt:memo_root"), "command:argument:bolt:del_target": delegate("bolt:del_target"), ################################################################################ # Bolt @@ -313,6 +320,7 @@ def get_bolt_parsers( ] ) ), + "bolt:memo_root": EscapeAnalysisParser(delegate("nested_root")), "bolt:del_target": parse_del_target, "bolt:interpolation": BuiltinCallRestriction( PrimaryParser(delegate("bolt:identifier"), truncate=True), @@ -611,6 +619,7 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): }, ) parser = DeferredRootBacktracker(parser, macro_handler=macro_handler) + parser = EscapeAnalysisResolver(parser) parser = DecoratorResolver(parser) parser = ProcMacroExpansion(parser) parser = RootScopeHandler(parser) @@ -828,6 +837,121 @@ def __call__(self, stream: TokenStream) -> Any: return node +@dataclass +class EscapeAnalysisParser: + """Initiate escape analysis on a nested block.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + lexical_scope = get_stream_lexical_scope(stream) + previous_bindings = { + identifier: len(variable.bindings) + for identifier, variable in lexical_scope.variables.items() + } + + if isinstance(node := self.parser(stream), AstRoot): + refcount_snapshots: List[Tuple[str, Binding, int]] = [] + + for identifier, variable in lexical_scope.variables.items(): + nb_bindings = previous_bindings.get(identifier) + last_binding = len(variable.bindings) - 1 + if nb_bindings is None or last_binding >= nb_bindings: + binding = variable.bindings[last_binding] + refcount = len(binding.references) + if variable.storage != "local": + exc = InvalidSyntax( + f'Binding to {variable.storage} variable "{identifier}" is not allowed in this context.' + ) + raise set_location(exc, binding.origin) + refcount_snapshots.append((identifier, binding, refcount)) + + if refcount_snapshots: + escape_analysis = AstEscapeAnalysisRoot( + commands=node.commands, + refcount_snapshots=refcount_snapshots, + ) + node = set_location(escape_analysis, node) + stream.data["do_escape_analysis"] = True + + return node + + +@dataclass +class EscapeAnalysisResolver: + """Resolve escape analysis.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + if not stream.data.get("root_scope"): + return self.parser(stream) + + stream.data["do_escape_analysis"] = False + + if ( + isinstance(node := self.parser(stream), AstRoot) + and stream.data["do_escape_analysis"] + ): + node = self.resolve(node) + + return node + + def resolve(self, node: AstRoot) -> AstRoot: + should_replace = False + commands: List[AstCommand] = [] + + for command in node.commands: + stack: List[AstCommand] = [command] + + while command.arguments and isinstance( + command := command.arguments[-1], AstCommand + ): + stack.append(command) + + command = stack.pop() + + if ( + command.arguments + and isinstance(root := command.arguments[-1], AstRoot) + and (resolved_root := self.resolve(root)) is not root + ): + should_replace = True + + command = replace( + command, + arguments=AstChildren([*command.arguments[:-1], resolved_root]), + ) + while stack: + parent = stack.pop() + command = replace( + parent, + arguments=AstChildren([*parent.arguments[:-1], command]), + ) + + elif stack: + command = stack[0] + + commands.append(command) + + if isinstance(node, AstEscapeAnalysisRoot): + identifiers = tuple( + name + for name, binding, refcount in node.refcount_snapshots + if len(binding.references) > refcount + ) + node = set_location( + AstEscapeRoot(commands=AstChildren(commands), identifiers=identifiers) + if identifiers + else AstRoot(commands=AstChildren(commands)), + node, + ) + elif should_replace: + node = replace(node, commands=AstChildren(commands)) + + return node + + @dataclass class MemoHandler: """Handle memo.""" diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 5dca548b8..3d48b9051 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -118,7 +118,7 @@ "children": { "body": { "type": "argument", - "parser": "mecha:nested_root", + "parser": "bolt:memo_root", "executable": true }, "variable": { diff --git a/packages/bolt/bolt/semantics.py b/packages/bolt/bolt/semantics.py index 527c0412c..91b851c03 100644 --- a/packages/bolt/bolt/semantics.py +++ b/packages/bolt/bolt/semantics.py @@ -295,23 +295,29 @@ def fork(self) -> "LexicalScope": self, parent=self.parent and self.parent.fork(), dirty=False, - variables={ - identifier: variable.fork() - for identifier, variable in self.variables.items() - }, + variables=self.fork_variables(), ) + def fork_variables(self) -> Dict[str, Variable]: + return { + identifier: variable.fork() + for identifier, variable in self.variables.items() + } + def reconcile(self, lexical_scope: "LexicalScope"): if lexical_scope.dirty: self.dirty = True - for identifier, variable in lexical_scope.variables.items(): - if current_variable := self.variables.get(identifier): - current_variable.reconcile(variable) - else: - self.variables[identifier] = variable + self.reconcile_variables(lexical_scope.variables) if self.parent and lexical_scope.parent: self.parent.reconcile(lexical_scope.parent) + def reconcile_variables(self, variables: Dict[str, Variable]): + for identifier, variable in variables.items(): + if current_variable := self.variables.get(identifier): + current_variable.reconcile(variable) + else: + self.variables[identifier] = variable + def create_pending_binding(self, identifier: str, node: AstNode): self.pending_bindings.append((identifier, node)) diff --git a/packages/bolt/bolt/utils.py b/packages/bolt/bolt/utils.py index 7a58f171e..e13cd3acc 100644 --- a/packages/bolt/bolt/utils.py +++ b/packages/bolt/bolt/utils.py @@ -2,17 +2,21 @@ "rewrite_traceback", "fake_traceback", "suggest_typo", + "load_pickle", + "dump_pickle", "internal", "INTERNAL_CODE", ] +import pickle from bisect import bisect from difflib import get_close_matches from types import CodeType, TracebackType from typing import Any, Iterable, List, Optional, Set, TypeVar from beet import Container +from beet.core.utils import FileSystemPath from mecha.utils import string_to_number T = TypeVar("T") @@ -90,3 +94,13 @@ def suggest_typo(wrong: str, possibilities: Iterable[str]) -> Optional[str]: return ", ".join(head + [f"{before_last} or {last}"]) return None + + +def load_pickle(path: FileSystemPath) -> Any: + with open(path, "rb") as f: + return pickle.load(f) + + +def dump_pickle(path: FileSystemPath, value: Any): + with open(path, "wb") as f: + return pickle.dump(value, f, protocol=pickle.HIGHEST_PROTOCOL) diff --git a/packages/bolt/examples/bolt_memo/src/data/demo/functions/vars.mcfunction b/packages/bolt/examples/bolt_memo/src/data/demo/functions/vars.mcfunction new file mode 100644 index 000000000..048c26ca1 --- /dev/null +++ b/packages/bolt/examples/bolt_memo/src/data/demo/functions/vars.mcfunction @@ -0,0 +1,23 @@ +g_uwu = 1 +memo: + g_uwu = 5 +say g_uwu + +def ok(): + memo: + value = 10 + global g_uwu + g_uwu = value + +ok() +say g_uwu + +def fib(n): + if n <= 1: + return n + memo n: + result = fib(n - 1) + fib(n - 2) + return result + +for i in range(50): + say f"fib({i}) = {fib(i)}" diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 8f7096ea8..4c790e5ff 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1243,3 +1243,33 @@ memo a, b: say (a + b) memo b: say b +### +uwu = 0 +def f(): + global uwu + memo: + uwu = 9 +### +def fib(n): + if n <= 1: + return n + memo n: + result = fib(n - 1) + fib(n - 2) + return result +### +thing = 9 +memo thing: + thing += 1 +say thing +### +thing = 9 +memo thing: + thing += 1 +thing = 7 +say thing +### +thing = 9 +memo thing: + thing += 1 +thing *= 7 +say thing diff --git a/packages/bolt/tests/snapshots/bolt__parse_319__0.txt b/packages/bolt/tests/snapshots/bolt__parse_319__0.txt index 260c3f22c..2f2cd29e2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_319__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_319__0.txt @@ -58,7 +58,7 @@ print(foo) location: SourceLocation(pos=27, lineno=2, colno=18) end_location: SourceLocation(pos=30, lineno=2, colno=21) value: 'foo' - + location: SourceLocation(pos=36, lineno=3, colno=5) end_location: SourceLocation(pos=56, lineno=4, colno=12) commands: @@ -99,6 +99,7 @@ print(foo) location: SourceLocation(pos=53, lineno=4, colno=9) end_location: SourceLocation(pos=56, lineno=4, colno=12) value: 'foo' + identifiers: ('foo',) persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') location: SourceLocation(pos=57, lineno=5, colno=1) diff --git a/packages/bolt/tests/snapshots/bolt__parse_319__1.txt b/packages/bolt/tests/snapshots/bolt__parse_319__1.txt index c105327b1..23bad2f1f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_319__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_319__1.txt @@ -1,4 +1,4 @@ -_bolt_lineno = [1, 10, 22, 26, 29], [1, 2, 3, 4, 5] +_bolt_lineno = [1, 10, 23, 27, 31], [1, 2, 3, 4, 5] _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] @@ -16,6 +16,7 @@ with _bolt_runtime.scope() as _bolt_var8: _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var1, foo, _bolt_var3,)] if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + (foo,) = _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings else: with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): _bolt_var4 = 8 @@ -26,6 +27,7 @@ with _bolt_runtime.scope() as _bolt_var8: _bolt_var5 = foo _bolt_var5 = _bolt_helper_interpolate_message(_bolt_var5, _bolt_refs[1]) _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var5]))) + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings = (foo,) _bolt_var6 = print _bolt_var7 = foo _bolt_var6 = _bolt_var6(_bolt_var7) @@ -42,7 +44,7 @@ _bolt_refs[0] - + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') _bolt_refs[1] diff --git a/packages/bolt/tests/snapshots/bolt__parse_342__0.txt b/packages/bolt/tests/snapshots/bolt__parse_342__0.txt new file mode 100644 index 000000000..0f0b09d47 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_342__0.txt @@ -0,0 +1,10 @@ +uwu = 0 +def f(): + global uwu + memo: +#>ERROR Binding to global variable "uwu" is not allowed in this context. +# line 5, column 9 +# 4 | memo: +# 5 | uwu = 9 +# : ^^^ + uwu = 9 diff --git a/packages/bolt/tests/snapshots/bolt__parse_343__0.txt b/packages/bolt/tests/snapshots/bolt__parse_343__0.txt new file mode 100644 index 000000000..1eff4bd92 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_343__0.txt @@ -0,0 +1,159 @@ +def fib(n): + if n <= 1: + return n + memo n: + result = fib(n - 1) + fib(n - 2) + return result +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=114, lineno=6, colno=18) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=114, lineno=6, colno=18) + identifier: 'def:function:body' + arguments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + decorators: + + name: 'fib' + arguments: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'n' + type_annotation: None + default: None + return_type_annotation: None + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=114, lineno=6, colno=18) + commands: + + location: SourceLocation(pos=16, lineno=2, colno=5) + end_location: SourceLocation(pos=43, lineno=3, colno=17) + identifier: 'if:condition:body' + arguments: + + location: SourceLocation(pos=19, lineno=2, colno=8) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + operator: '<=' + left: + + location: SourceLocation(pos=19, lineno=2, colno=8) + end_location: SourceLocation(pos=20, lineno=2, colno=9) + value: 'n' + right: + + location: SourceLocation(pos=24, lineno=2, colno=13) + end_location: SourceLocation(pos=25, lineno=2, colno=14) + value: 1 + + location: SourceLocation(pos=35, lineno=3, colno=9) + end_location: SourceLocation(pos=43, lineno=3, colno=17) + commands: + + location: SourceLocation(pos=35, lineno=3, colno=9) + end_location: SourceLocation(pos=43, lineno=3, colno=17) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=42, lineno=3, colno=16) + end_location: SourceLocation(pos=43, lineno=3, colno=17) + value: 'n' + + location: SourceLocation(pos=48, lineno=4, colno=5) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + identifier: 'memo:0' + arguments: + + location: SourceLocation(pos=53, lineno=4, colno=10) + end_location: SourceLocation(pos=54, lineno=4, colno=11) + value: 'n' + + location: SourceLocation(pos=64, lineno=5, colno=9) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + commands: + + location: SourceLocation(pos=64, lineno=5, colno=9) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=64, lineno=5, colno=9) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + operator: '=' + target: + + location: SourceLocation(pos=64, lineno=5, colno=9) + end_location: SourceLocation(pos=70, lineno=5, colno=15) + value: 'result' + rebind: False + value: + + location: SourceLocation(pos=73, lineno=5, colno=18) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + operator: '+' + left: + + location: SourceLocation(pos=73, lineno=5, colno=18) + end_location: SourceLocation(pos=83, lineno=5, colno=28) + value: + + location: SourceLocation(pos=73, lineno=5, colno=18) + end_location: SourceLocation(pos=76, lineno=5, colno=21) + value: 'fib' + arguments: + + location: SourceLocation(pos=77, lineno=5, colno=22) + end_location: SourceLocation(pos=82, lineno=5, colno=27) + operator: '-' + left: + + location: SourceLocation(pos=77, lineno=5, colno=22) + end_location: SourceLocation(pos=78, lineno=5, colno=23) + value: 'n' + right: + + location: SourceLocation(pos=81, lineno=5, colno=26) + end_location: SourceLocation(pos=82, lineno=5, colno=27) + value: 1 + right: + + location: SourceLocation(pos=86, lineno=5, colno=31) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + value: + + location: SourceLocation(pos=86, lineno=5, colno=31) + end_location: SourceLocation(pos=89, lineno=5, colno=34) + value: 'fib' + arguments: + + location: SourceLocation(pos=90, lineno=5, colno=35) + end_location: SourceLocation(pos=95, lineno=5, colno=40) + operator: '-' + left: + + location: SourceLocation(pos=90, lineno=5, colno=35) + end_location: SourceLocation(pos=91, lineno=5, colno=36) + value: 'n' + right: + + location: SourceLocation(pos=94, lineno=5, colno=39) + end_location: SourceLocation(pos=95, lineno=5, colno=40) + value: 2 + type_annotation: None + identifiers: ('result',) + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=101, lineno=6, colno=5) + end_location: SourceLocation(pos=114, lineno=6, colno=18) + identifier: 'return:value' + arguments: + + location: SourceLocation(pos=108, lineno=6, colno=12) + end_location: SourceLocation(pos=114, lineno=6, colno=18) + value: 'result' diff --git a/packages/bolt/tests/snapshots/bolt__parse_343__1.txt b/packages/bolt/tests/snapshots/bolt__parse_343__1.txt new file mode 100644 index 000000000..28fdd03e6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_343__1.txt @@ -0,0 +1,58 @@ +_bolt_lineno = [1, 8, 13, 15, 25, 38], [1, 2, 3, 4, 5, 6] +_bolt_helper_branch = _bolt_runtime.helpers['branch'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var0: + def fib(n): + _bolt_var0 = n + _bolt_var1 = 1 + _bolt_var0 = _bolt_var0 <= _bolt_var1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_var2 = n + return _bolt_var2 + _bolt_var3 = n + global _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var3,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + (result,) = _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var4 = fib + _bolt_var5 = n + _bolt_var6 = 1 + _bolt_var5 = _bolt_var5 - _bolt_var6 + _bolt_var4 = _bolt_var4(_bolt_var5) + _bolt_var7 = fib + _bolt_var8 = n + _bolt_var9 = 2 + _bolt_var8 = _bolt_var8 - _bolt_var9 + _bolt_var7 = _bolt_var7(_bolt_var8) + _bolt_var4 = _bolt_var4 + _bolt_var7 + result = _bolt_var4 + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings = (result,) + _bolt_var10 = result + return _bolt_var10 +_bolt_var1 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var0)) +--- +output = _bolt_var1 +--- +_bolt_refs[0] + + location: SourceLocation(pos=48, lineno=4, colno=5) + end_location: SourceLocation(pos=96, lineno=5, colno=41) + identifier: 'memo:0' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=114, lineno=6, colno=18) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_344__0.txt b/packages/bolt/tests/snapshots/bolt__parse_344__0.txt new file mode 100644 index 000000000..1200d6a0d --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_344__0.txt @@ -0,0 +1,82 @@ +thing = 9 +memo thing: + thing += 1 +say thing +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=5, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'thing' + rebind: False + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 9 + type_annotation: None + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'memo:0' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=6) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + value: 'thing' + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + operator: '+=' + target: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=10) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=35, lineno=3, colno=14) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + value: 1 + type_annotation: None + identifiers: ('thing',) + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=41, lineno=4, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=41, lineno=4, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + value: 'thing' diff --git a/packages/bolt/tests/snapshots/bolt__parse_344__1.txt b/packages/bolt/tests/snapshots/bolt__parse_344__1.txt new file mode 100644 index 000000000..56aedf32b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_344__1.txt @@ -0,0 +1,64 @@ +_bolt_lineno = [1, 10, 20, 25], [1, 2, 3, 4] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 9 + thing = _bolt_var0 + _bolt_var1 = thing + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var1,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + (thing,) = _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var2 = 1 + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing += _bolt_var2 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings = (thing,) + _bolt_var3 = thing + _bolt_var3 = _bolt_helper_interpolate_message(_bolt_var3, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var3]))) +_bolt_var5 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var4)) +--- +output = _bolt_var5 +--- +_bolt_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'memo:0' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=41, lineno=4, colno=5) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + identifier: 'say:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=5, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_345__0.txt b/packages/bolt/tests/snapshots/bolt__parse_345__0.txt new file mode 100644 index 000000000..267650297 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_345__0.txt @@ -0,0 +1,104 @@ +thing = 9 +memo thing: + thing += 1 +thing = 7 +say thing +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=57, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'thing' + rebind: False + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 9 + type_annotation: None + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'memo:0' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=6) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + value: 'thing' + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + operator: '+=' + target: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=10) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=35, lineno=3, colno=14) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + value: 1 + type_annotation: None + identifiers: ('thing',) + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=42, lineno=4, colno=6) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=45, lineno=4, colno=9) + end_location: SourceLocation(pos=46, lineno=4, colno=10) + value: 7 + type_annotation: None + + location: SourceLocation(pos=47, lineno=5, colno=1) + end_location: SourceLocation(pos=56, lineno=5, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=51, lineno=5, colno=5) + end_location: SourceLocation(pos=56, lineno=5, colno=10) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=51, lineno=5, colno=5) + end_location: SourceLocation(pos=56, lineno=5, colno=10) + value: 'thing' diff --git a/packages/bolt/tests/snapshots/bolt__parse_345__1.txt b/packages/bolt/tests/snapshots/bolt__parse_345__1.txt new file mode 100644 index 000000000..7918b9f1b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_345__1.txt @@ -0,0 +1,70 @@ +_bolt_lineno = [1, 10, 20, 26, 30], [1, 2, 3, 4, 5] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 9 + thing = _bolt_var0 + _bolt_var1 = thing + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var1,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + (thing,) = _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var2 = 1 + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing += _bolt_var2 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings = (thing,) + _bolt_var3 = 7 + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing = _bolt_var3 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) + _bolt_var4 = thing + _bolt_var4 = _bolt_helper_interpolate_message(_bolt_var4, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var4]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var5)) +--- +output = _bolt_var6 +--- +_bolt_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'memo:0' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=51, lineno=5, colno=5) + end_location: SourceLocation(pos=56, lineno=5, colno=10) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=47, lineno=5, colno=1) + end_location: SourceLocation(pos=56, lineno=5, colno=10) + identifier: 'say:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=57, lineno=6, colno=1) + commands: + + + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_346__0.txt b/packages/bolt/tests/snapshots/bolt__parse_346__0.txt new file mode 100644 index 000000000..95ff3d00e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_346__0.txt @@ -0,0 +1,104 @@ +thing = 9 +memo thing: + thing += 1 +thing *= 7 +say thing +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=6, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'thing' + rebind: False + value: + + location: SourceLocation(pos=8, lineno=1, colno=9) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + value: 9 + type_annotation: None + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'memo:0' + arguments: + + location: SourceLocation(pos=15, lineno=2, colno=6) + end_location: SourceLocation(pos=20, lineno=2, colno=11) + value: 'thing' + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + commands: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + operator: '+=' + target: + + location: SourceLocation(pos=26, lineno=3, colno=5) + end_location: SourceLocation(pos=31, lineno=3, colno=10) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=35, lineno=3, colno=14) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + value: 1 + type_annotation: None + identifiers: ('thing',) + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=11) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=47, lineno=4, colno=11) + operator: '*=' + target: + + location: SourceLocation(pos=37, lineno=4, colno=1) + end_location: SourceLocation(pos=42, lineno=4, colno=6) + value: 'thing' + rebind: True + value: + + location: SourceLocation(pos=46, lineno=4, colno=10) + end_location: SourceLocation(pos=47, lineno=4, colno=11) + value: 7 + type_annotation: None + + location: SourceLocation(pos=48, lineno=5, colno=1) + end_location: SourceLocation(pos=57, lineno=5, colno=10) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=52, lineno=5, colno=5) + end_location: SourceLocation(pos=57, lineno=5, colno=10) + prefix: None + unpack: None + converter: 'message' + value: + + location: SourceLocation(pos=52, lineno=5, colno=5) + end_location: SourceLocation(pos=57, lineno=5, colno=10) + value: 'thing' diff --git a/packages/bolt/tests/snapshots/bolt__parse_346__1.txt b/packages/bolt/tests/snapshots/bolt__parse_346__1.txt new file mode 100644 index 000000000..77966d899 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_346__1.txt @@ -0,0 +1,70 @@ +_bolt_lineno = [1, 10, 20, 26, 30], [1, 2, 3, 4, 5] +_bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = None +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 9 + thing = _bolt_var0 + _bolt_var1 = thing + if _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d is None: + _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d = _bolt_runtime.memo.registry[__file__][_bolt_refs[0], 0] + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d = _bolt_memo_storage_bdd640fb06671ad11c80317fa3b1799d[(_bolt_var1,)] + if _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.cached: + _bolt_runtime.memo.restore(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d) + (thing,) = _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings + else: + with _bolt_runtime.memo.record(_bolt_runtime, _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d, __name__): + _bolt_var2 = 1 + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing += _bolt_var2 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) + _bolt_memo_invocation_bdd640fb06671ad11c80317fa3b1799d.bindings = (thing,) + _bolt_var3 = 7 + _bolt_rebind = _bolt_helper_get_rebind(thing) + thing *= _bolt_var3 + if _bolt_rebind is not None: + thing = _bolt_rebind(thing) + _bolt_var4 = thing + _bolt_var4 = _bolt_helper_interpolate_message(_bolt_var4, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var4]))) +_bolt_var6 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var5)) +--- +output = _bolt_var6 +--- +_bolt_refs[0] + + location: SourceLocation(pos=10, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=3, colno=15) + identifier: 'memo:0' + arguments: + + + persistent_id: UUID('bdd640fb-0667-1ad1-1c80-317fa3b1799d') +_bolt_refs[1] + + location: SourceLocation(pos=52, lineno=5, colno=5) + end_location: SourceLocation(pos=57, lineno=5, colno=10) + prefix: None + unpack: None + converter: 'message' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=48, lineno=5, colno=1) + end_location: SourceLocation(pos=57, lineno=5, colno=10) + identifier: 'say:message' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=6, colno=1) + commands: + + + + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md index 9527c1528..80a7f55ad 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md @@ -123,6 +123,63 @@ say 3 say 2 ``` +`@function demo:ref/vars` + +```mcfunction +say 5 +say 10 +say fib(0) = 0 +say fib(1) = 1 +say fib(2) = 1 +say fib(3) = 2 +say fib(4) = 3 +say fib(5) = 5 +say fib(6) = 8 +say fib(7) = 13 +say fib(8) = 21 +say fib(9) = 34 +say fib(10) = 55 +say fib(11) = 89 +say fib(12) = 144 +say fib(13) = 233 +say fib(14) = 377 +say fib(15) = 610 +say fib(16) = 987 +say fib(17) = 1597 +say fib(18) = 2584 +say fib(19) = 4181 +say fib(20) = 6765 +say fib(21) = 10946 +say fib(22) = 17711 +say fib(23) = 28657 +say fib(24) = 46368 +say fib(25) = 75025 +say fib(26) = 121393 +say fib(27) = 196418 +say fib(28) = 317811 +say fib(29) = 514229 +say fib(30) = 832040 +say fib(31) = 1346269 +say fib(32) = 2178309 +say fib(33) = 3524578 +say fib(34) = 5702887 +say fib(35) = 9227465 +say fib(36) = 14930352 +say fib(37) = 24157817 +say fib(38) = 39088169 +say fib(39) = 63245986 +say fib(40) = 102334155 +say fib(41) = 165580141 +say fib(42) = 267914296 +say fib(43) = 433494437 +say fib(44) = 701408733 +say fib(45) = 1134903170 +say fib(46) = 1836311903 +say fib(47) = 2971215073 +say fib(48) = 4807526976 +say fib(49) = 7778742049 +``` + `@function demo:ref/bar/tree_42/0_20` ```mcfunction @@ -908,6 +965,63 @@ say 3 say 2 ``` +`@function demo:vars` + +```mcfunction +say 5 +say 10 +say fib(0) = 0 +say fib(1) = 1 +say fib(2) = 1 +say fib(3) = 2 +say fib(4) = 3 +say fib(5) = 5 +say fib(6) = 8 +say fib(7) = 13 +say fib(8) = 21 +say fib(9) = 34 +say fib(10) = 55 +say fib(11) = 89 +say fib(12) = 144 +say fib(13) = 233 +say fib(14) = 377 +say fib(15) = 610 +say fib(16) = 987 +say fib(17) = 1597 +say fib(18) = 2584 +say fib(19) = 4181 +say fib(20) = 6765 +say fib(21) = 10946 +say fib(22) = 17711 +say fib(23) = 28657 +say fib(24) = 46368 +say fib(25) = 75025 +say fib(26) = 121393 +say fib(27) = 196418 +say fib(28) = 317811 +say fib(29) = 514229 +say fib(30) = 832040 +say fib(31) = 1346269 +say fib(32) = 2178309 +say fib(33) = 3524578 +say fib(34) = 5702887 +say fib(35) = 9227465 +say fib(36) = 14930352 +say fib(37) = 24157817 +say fib(38) = 39088169 +say fib(39) = 63245986 +say fib(40) = 102334155 +say fib(41) = 165580141 +say fib(42) = 267914296 +say fib(43) = 433494437 +say fib(44) = 701408733 +say fib(45) = 1134903170 +say fib(46) = 1836311903 +say fib(47) = 2971215073 +say fib(48) = 4807526976 +say fib(49) = 7778742049 +``` + `@function demo:bar/tree_42/0_1` ```mcfunction From 885b287458f499e1e755d353f258bacdb7a6bba0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 5 Feb 2023 01:55:26 +0000 Subject: [PATCH 1126/1554] 0.27.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 2e736581c..a91a5fa7a 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.27.0 (2023-02-05) +### Feature +* Restore memo bindings ([`48c5fe9`](https://github.com/mcbeet/bolt/commit/48c5fe996ff5a575bf50b5bf5f572320fedfb39e)) + ## v0.26.0 (2023-02-02) ### Feature * Add type annotations ([`a3970f1`](https://github.com/mcbeet/bolt/commit/a3970f1a61668c5cf772ad24eacd7a835aa1824e)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index d0122c7af..e0e8fda33 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.26.0" +__version__ = "0.27.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 98c65721c..e8e72fd7e 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.26.0" +version = "0.27.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 44ed92d8ed15b12ab10fde9c201a49e1a425ac5f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 5 Feb 2023 03:38:28 +0100 Subject: [PATCH 1127/1554] feat: error when using unsupported statements in memo --- packages/bolt/bolt/parse.py | 27 ++++++++++++++++--- .../tests/resources/bolt_examples.mcfunction | 12 +++++++++ .../tests/snapshots/bolt__parse_119__0.txt | 2 +- .../tests/snapshots/bolt__parse_260__0.txt | 2 +- .../tests/snapshots/bolt__parse_261__0.txt | 2 +- .../tests/snapshots/bolt__parse_347__0.txt | 8 ++++++ .../tests/snapshots/bolt__parse_348__0.txt | 8 ++++++ .../tests/snapshots/bolt__parse_349__0.txt | 8 ++++++ .../tests/snapshots/bolt__parse_85__0.txt | 2 +- 9 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_347__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_348__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_349__0.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 64ded094a..3ca9db7db 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -16,6 +16,7 @@ "AssignmentStatementParser", "EscapeAnalysisParser", "EscapeAnalysisResolver", + "MemoRootParser", "MemoHandler", "parse_decorator", "AssignmentTargetParser", @@ -320,7 +321,7 @@ def get_bolt_parsers( ] ) ), - "bolt:memo_root": EscapeAnalysisParser(delegate("nested_root")), + "bolt:memo_root": MemoRootParser(EscapeAnalysisParser(delegate("nested_root"))), "bolt:del_target": parse_del_target, "bolt:interpolation": BuiltinCallRestriction( PrimaryParser(delegate("bolt:identifier"), truncate=True), @@ -608,6 +609,7 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): parser = LexicalScopeConstraint( parser, type=FunctionScope, + flags={"memo": False}, command_identifiers={ "return", "return:value", @@ -952,6 +954,17 @@ def resolve(self, node: AstRoot) -> AstRoot: return node +@dataclass +class MemoRootParser: + """Parse memo root.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + with stream.provide(loop=False, memo=True): + return self.parser(stream) + + @dataclass class MemoHandler: """Handle memo.""" @@ -2021,6 +2034,8 @@ def resolve_deferred(self, node: AstRoot, stream: TokenStream) -> AstRoot: self.macro_handler.flush_pending_macros(stream) deferred_stream = deferred_root.stream + deferred_stream.data["loop"] = False + deferred_stream.data["memo"] = False deferred_stream.data["local_spec"] = False deferred_stream.data["spec"] = get_stream_spec(stream) deferred_stream.data["macro_scope"] = get_stream_macro_scope(stream) @@ -2058,20 +2073,26 @@ class LexicalScopeConstraint: parser: Parser type: Type[LexicalScope] + flags: Dict[str, bool] command_identifiers: Set[str] def __call__(self, stream: TokenStream) -> AstRoot: node = self.parser(stream) lexical_scope = get_stream_lexical_scope(stream) - if isinstance(lexical_scope, self.type): + if isinstance(lexical_scope, self.type) and all( + stream.data.get(flag, False) == enabled + for flag, enabled in self.flags.items() + ): return node if isinstance(node, AstRoot): for command in node.commands: if command.identifier in self.command_identifiers: name, _, _ = command.identifier.partition(":") - exc = InvalidSyntax(f'Can only use "{name}" in functions.') + exc = InvalidSyntax( + f'Statement "{name}" is not allowed in this context.' + ) raise set_location(exc, command) return node diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 4c790e5ff..c20e28c71 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1273,3 +1273,15 @@ memo thing: thing += 1 thing *= 7 say thing +### +for i in range(10): + def f(): + break +### +for i in range(10): + memo: + break +### +def f(): + memo: + return 9999 diff --git a/packages/bolt/tests/snapshots/bolt__parse_119__0.txt b/packages/bolt/tests/snapshots/bolt__parse_119__0.txt index 8d35fc811..8eb37413e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_119__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_119__0.txt @@ -1,5 +1,5 @@ if True: -#>ERROR Can only use "yield" in functions. +#>ERROR Statement "yield" is not allowed in this context. # line 2, column 5 # 1 | if True: # 2 | yield diff --git a/packages/bolt/tests/snapshots/bolt__parse_260__0.txt b/packages/bolt/tests/snapshots/bolt__parse_260__0.txt index 696fc8ae7..c166513c7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_260__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_260__0.txt @@ -1,5 +1,5 @@ class Foo: -#>ERROR Can only use "return" in functions. +#>ERROR Statement "return" is not allowed in this context. # line 2, column 5 # 1 | class Foo: # 2 | return diff --git a/packages/bolt/tests/snapshots/bolt__parse_261__0.txt b/packages/bolt/tests/snapshots/bolt__parse_261__0.txt index 28a9be8da..fed294fe8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_261__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_261__0.txt @@ -1,6 +1,6 @@ def f(): class Foo: -#>ERROR Can only use "return" in functions. +#>ERROR Statement "return" is not allowed in this context. # line 3, column 9 # 2 | class Foo: # 3 | return diff --git a/packages/bolt/tests/snapshots/bolt__parse_347__0.txt b/packages/bolt/tests/snapshots/bolt__parse_347__0.txt new file mode 100644 index 000000000..317ee05d9 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_347__0.txt @@ -0,0 +1,8 @@ +for i in range(10): + def f(): +#>ERROR Can only use "break" in loops. +# line 3, column 9 +# 2 | def f(): +# 3 | break +# : ^^^^^ + break diff --git a/packages/bolt/tests/snapshots/bolt__parse_348__0.txt b/packages/bolt/tests/snapshots/bolt__parse_348__0.txt new file mode 100644 index 000000000..e33872fae --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_348__0.txt @@ -0,0 +1,8 @@ +for i in range(10): + memo: +#>ERROR Can only use "break" in loops. +# line 3, column 9 +# 2 | memo: +# 3 | break +# : ^^^^^ + break diff --git a/packages/bolt/tests/snapshots/bolt__parse_349__0.txt b/packages/bolt/tests/snapshots/bolt__parse_349__0.txt new file mode 100644 index 000000000..4d09342bd --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_349__0.txt @@ -0,0 +1,8 @@ +def f(): + memo: +#>ERROR Statement "return" is not allowed in this context. +# line 3, column 9 +# 2 | memo: +# 3 | return 9999 +# : ^^^^^^^^^^^ + return 9999 diff --git a/packages/bolt/tests/snapshots/bolt__parse_85__0.txt b/packages/bolt/tests/snapshots/bolt__parse_85__0.txt index af54fde1a..9e5387092 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_85__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_85__0.txt @@ -1,4 +1,4 @@ -#>ERROR Can only use "return" in functions. +#>ERROR Statement "return" is not allowed in this context. # line 1, column 1 # 1 | return "hello" # : ^^^^^^^^^^^^^^ From 149268dcd6b89ad4a341094261fea1052c8f84bd Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 5 Feb 2023 02:39:23 +0000 Subject: [PATCH 1128/1554] 0.28.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index a91a5fa7a..db0561624 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.28.0 (2023-02-05) +### Feature +* Error when using unsupported statements in memo ([`e57c845`](https://github.com/mcbeet/bolt/commit/e57c845f28cd40669ace582dcb2f404cf384582d)) + ## v0.27.0 (2023-02-05) ### Feature * Restore memo bindings ([`48c5fe9`](https://github.com/mcbeet/bolt/commit/48c5fe996ff5a575bf50b5bf5f572320fedfb39e)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e0e8fda33..095753d97 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.27.0" +__version__ = "0.28.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index e8e72fd7e..584783368 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.27.0" +version = "0.28.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From eea73cf9b58af2a36e2a21ba1fe6e792d2dda9a7 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 6 Feb 2023 23:39:07 +0100 Subject: [PATCH 1129/1554] chore: update deps --- packages/mecha/poetry.lock | 113 +++++++++++++++------------------- packages/mecha/pyproject.toml | 10 +-- 2 files changed, 55 insertions(+), 68 deletions(-) diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 10664b937..7e43c223c 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -46,41 +46,46 @@ image = ["Pillow"] [[package]] name = "black" -version = "22.10.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -446,19 +451,19 @@ files = [ [[package]] name = "isort" -version = "5.10.1" +version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.8.0" files = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, ] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] @@ -721,19 +726,16 @@ files = [ [[package]] name = "packaging" -version = "21.3" +version = "23.0" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "pathspec" version = "0.10.2" @@ -873,31 +875,16 @@ files = [ [package.extras] plugins = ["importlib-metadata"] -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, + {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, + {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, ] [package.dependencies] @@ -950,14 +937,14 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.32.2" +version = "7.33.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" files = [ - {file = "python-semantic-release-7.32.2.tar.gz", hash = "sha256:4d8f5d20680723e1329765b6f3e28b43f058fd1ef5f423f6f95397cd927c3ebc"}, - {file = "python_semantic_release-7.32.2-py3-none-any.whl", hash = "sha256:9fcf82f403b91a61e58728ea05e2e2e25010ce9ed07830fe78251819b4b834d9"}, + {file = "python-semantic-release-7.33.1.tar.gz", hash = "sha256:9d2e5681c2c296e0fc5d24088b59d7528c1c162920df29a4663d1131b5dfc97b"}, + {file = "python_semantic_release-7.33.1-py3-none-any.whl", hash = "sha256:ad8bc816526d3d0d7a4cf4833cc57e655a28b34d6fa33b3d2786a07ae4e8a075"}, ] [package.dependencies] @@ -978,7 +965,7 @@ wheel = "*" dev = ["black", "isort", "tox"] docs = ["Jinja2 (==3.0.3)", "Sphinx (==1.3.6)"] mypy = ["mypy", "types-requests"] -test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=5,<6)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] +test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=7,<8)", "pytest-mock (>=2,<3)", "pytest-xdist (>=1,<2)", "responses (==0.13.3)"] [[package]] name = "pywin32-ctypes" @@ -1168,14 +1155,14 @@ files = [ [[package]] name = "tokenstream" -version = "1.4.2" +version = "1.5.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.10,<4.0" files = [ - {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, - {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, + {file = "tokenstream-1.5.0-py3-none-any.whl", hash = "sha256:adf5805f3e734c863a535c5cfc31fed4bd831647b1f51d1aab69e5a81eb63b8e"}, + {file = "tokenstream-1.5.0.tar.gz", hash = "sha256:3cb57c810f2fd1e57653c8270251a3df47656ef04f07eb3d4fc442f64f9ff0c0"}, ] [[package]] @@ -1408,4 +1395,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "9d77661e472bb34c0c3847cb17ad3f268c29509286ccbdd1779c1da8eb9e1eaf" +content-hash = "e9f42e0f560c9c628a03255538c4594306b4980f152da0d90af2733aee7636b2" diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 642952b76..7db8f26de 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -24,13 +24,13 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.10" beet = ">=0.83.1" -tokenstream = "^1.4.2" +tokenstream = "^1.5.0" [tool.poetry.group.dev.dependencies] -black = "^22.10.0" -pytest = "^7.2.0" -isort = "^5.10.1" -python-semantic-release = "^7.32.2" +black = "^23.1.0" +pytest = "^7.2.1" +isort = "^5.12.0" +python-semantic-release = "^7.33.1" pytest-insta = "^0.2.0" lectern = ">=0.26.0" From ca876874a26c7544385b614d429ee7bfc37c95ca Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Feb 2023 00:43:30 +0100 Subject: [PATCH 1130/1554] feat: update 1.19 --- packages/mecha/mecha/parse.py | 5 + packages/mecha/mecha/resources/1_19.json | 3053 +++++++++++++++-- .../snapshots/parse__command_examples__0.txt | 35 +- .../parse__multiline_command_examples__0.txt | 6 +- .../tests/snapshots/spec__prototypes__0.json | 279 +- 5 files changed, 2990 insertions(+), 388 deletions(-) diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index b40b0be58..6fcdd03c4 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -427,6 +427,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:float_range": delegate("range"), "command:argument:minecraft:function": delegate("resource_location_or_tag"), "command:argument:minecraft:game_profile": delegate("game_profile"), + "command:argument:minecraft:gamemode": delegate("gamemode"), "command:argument:minecraft:int_range": delegate("integer_range"), "command:argument:minecraft:item_enchantment": delegate("word"), "command:argument:minecraft:item_predicate": MultilineParser( @@ -454,9 +455,13 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:particle": delegate("particle"), "command:argument:minecraft:resource_location": delegate("resource_location"), "command:argument:minecraft:resource": delegate("resource_location"), + "command:argument:minecraft:resource_key": delegate("resource_location"), "command:argument:minecraft:resource_or_tag": delegate( "resource_location_or_tag" ), + "command:argument:minecraft:resource_or_tag_key": delegate( + "resource_location_or_tag" + ), "command:argument:minecraft:rotation": delegate("rotation"), "command:argument:minecraft:score_holder": delegate("score_holder"), "command:argument:minecraft:scoreboard_slot": delegate("scoreboard_slot"), diff --git a/packages/mecha/mecha/resources/1_19.json b/packages/mecha/mecha/resources/1_19.json index 33906dad6..c5e8c2012 100644 --- a/packages/mecha/mecha/resources/1_19.json +++ b/packages/mecha/mecha/resources/1_19.json @@ -630,12 +630,258 @@ }, "executable": true, "parser": "minecraft:block_pos" + }, + "to": { + "type": "literal", + "children": { + "targetDimension": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:dimension" + } + } } }, "parser": "minecraft:block_pos" } }, "parser": "minecraft:block_pos" + }, + "from": { + "type": "literal", + "children": { + "sourceDimension": { + "type": "argument", + "children": { + "begin": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + }, + "to": { + "type": "literal", + "children": { + "targetDimension": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:dimension" + } + } + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:dimension" + } + } } } }, @@ -855,73 +1101,313 @@ } } }, - "value": { + "string": { "type": "literal", "children": { - "value": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_tag" - } - } - } - } - }, - "insert": { - "type": "literal", - "children": { - "index": { - "type": "argument", - "children": { - "from": { + "block": { "type": "literal", "children": { - "block": { - "type": "literal", + "sourcePos": { + "type": "argument", "children": { - "sourcePos": { + "sourcePath": { "type": "argument", "children": { - "sourcePath": { + "start": { "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, - "parser": "minecraft:nbt_path" + "parser": "brigadier:integer", + "properties": { + "min": 0 + } } }, "executable": true, - "parser": "minecraft:block_pos" + "parser": "minecraft:nbt_path" } - } - }, - "entity": { - "type": "literal", + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", "children": { - "source": { + "sourcePath": { "type": "argument", "children": { - "sourcePath": { + "start": { "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, - "parser": "minecraft:nbt_path" + "parser": "brigadier:integer", + "properties": { + "min": 0 + } } }, "executable": true, - "parser": "minecraft:entity", - "properties": { - "type": "entities", - "amount": "single" - } + "parser": "minecraft:nbt_path" } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" } - }, - "storage": { - "type": "literal", - "children": { - "source": { - "type": "argument", - "children": { - "sourcePath": { + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1011,22 +1497,7 @@ } } }, - "value": { - "type": "literal", - "children": { - "value": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_tag" - } - } - } - } - }, - "prepend": { - "type": "literal", - "children": { - "from": { + "string": { "type": "literal", "children": { "block": { @@ -1037,6 +1508,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1054,6 +1545,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1075,6 +1586,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1098,7 +1629,7 @@ } } }, - "set": { + "prepend": { "type": "literal", "children": { "from": { @@ -1161,39 +1692,7 @@ } } }, - "value": { - "type": "literal", - "children": { - "value": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_tag" - } - } - } - } - } - }, - "parser": "minecraft:nbt_path" - } - }, - "parser": "minecraft:block_pos" - } - } - }, - "entity": { - "type": "literal", - "children": { - "target": { - "type": "argument", - "children": { - "targetPath": { - "type": "argument", - "children": { - "append": { - "type": "literal", - "children": { - "from": { + "string": { "type": "literal", "children": { "block": { @@ -1204,6 +1703,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1221,6 +1740,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1242,6 +1781,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1265,91 +1824,70 @@ } } }, - "insert": { + "set": { "type": "literal", "children": { - "index": { - "type": "argument", + "from": { + "type": "literal", "children": { - "from": { + "block": { "type": "literal", "children": { - "block": { - "type": "literal", + "sourcePos": { + "type": "argument", "children": { - "sourcePos": { + "sourcePath": { "type": "argument", - "children": { - "sourcePath": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_path" - } - }, "executable": true, - "parser": "minecraft:block_pos" + "parser": "minecraft:nbt_path" } - } - }, - "entity": { - "type": "literal", - "children": { - "source": { - "type": "argument", - "children": { - "sourcePath": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_path" - } - }, - "executable": true, - "parser": "minecraft:entity", - "properties": { - "type": "entities", - "amount": "single" - } - } - } - }, - "storage": { - "type": "literal", + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", "children": { - "source": { + "sourcePath": { "type": "argument", - "children": { - "sourcePath": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_path" - } - }, "executable": true, - "parser": "minecraft:resource_location" + "parser": "minecraft:nbt_path" } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" } } } }, - "value": { + "storage": { "type": "literal", "children": { - "value": { + "source": { "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, "executable": true, - "parser": "minecraft:nbt_tag" + "parser": "minecraft:resource_location" } } } - }, - "parser": "brigadier:integer" - } - } - }, - "merge": { - "type": "literal", - "children": { - "from": { + } + }, + "string": { "type": "literal", "children": { "block": { @@ -1360,6 +1898,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1377,6 +1935,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1398,6 +1976,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1420,8 +2018,25 @@ } } } - }, - "prepend": { + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { "type": "literal", "children": { "from": { @@ -1484,22 +2099,7 @@ } } }, - "value": { - "type": "literal", - "children": { - "value": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_tag" - } - } - } - } - }, - "set": { - "type": "literal", - "children": { - "from": { + "string": { "type": "literal", "children": { "block": { @@ -1510,6 +2110,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1527,6 +2147,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1548,6 +2188,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1570,42 +2230,1304 @@ } } } - } - }, - "parser": "minecraft:nbt_path" - } - }, - "parser": "minecraft:entity", - "properties": { - "type": "entities", - "amount": "single" - } - } - } - }, - "storage": { - "type": "literal", - "children": { - "target": { - "type": "argument", - "children": { - "targetPath": { - "type": "argument", - "children": { - "append": { + }, + "insert": { "type": "literal", "children": { - "from": { - "type": "literal", + "index": { + "type": "argument", "children": { - "block": { + "from": { "type": "literal", "children": { - "sourcePos": { - "type": "argument", + "block": { + "type": "literal", "children": { - "sourcePath": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1623,6 +3545,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1644,6 +3586,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1667,91 +3629,70 @@ } } }, - "insert": { + "prepend": { "type": "literal", "children": { - "index": { - "type": "argument", + "from": { + "type": "literal", "children": { - "from": { + "block": { "type": "literal", "children": { - "block": { - "type": "literal", - "children": { - "sourcePos": { - "type": "argument", - "children": { - "sourcePath": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_path" - } - }, - "executable": true, - "parser": "minecraft:block_pos" - } - } - }, - "entity": { - "type": "literal", + "sourcePos": { + "type": "argument", "children": { - "source": { + "sourcePath": { "type": "argument", - "children": { - "sourcePath": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_path" - } - }, "executable": true, - "parser": "minecraft:entity", - "properties": { - "type": "entities", - "amount": "single" - } + "parser": "minecraft:nbt_path" } - } - }, - "storage": { - "type": "literal", + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", "children": { - "source": { + "sourcePath": { "type": "argument", - "children": { - "sourcePath": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_path" - } - }, "executable": true, - "parser": "minecraft:resource_location" + "parser": "minecraft:nbt_path" } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" } } } }, - "value": { + "storage": { "type": "literal", "children": { - "value": { + "source": { "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, "executable": true, - "parser": "minecraft:nbt_tag" + "parser": "minecraft:resource_location" } } } - }, - "parser": "brigadier:integer" - } - } - }, - "merge": { - "type": "literal", - "children": { - "from": { + } + }, + "string": { "type": "literal", "children": { "block": { @@ -1762,6 +3703,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1779,6 +3740,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1800,6 +3781,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1823,7 +3824,7 @@ } } }, - "prepend": { + "set": { "type": "literal", "children": { "from": { @@ -1886,22 +3887,7 @@ } } }, - "value": { - "type": "literal", - "children": { - "value": { - "type": "argument", - "executable": true, - "parser": "minecraft:nbt_tag" - } - } - } - } - }, - "set": { - "type": "literal", - "children": { - "from": { + "string": { "type": "literal", "children": { "block": { @@ -1912,6 +3898,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1929,6 +3935,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -1950,6 +3976,26 @@ "children": { "sourcePath": { "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, "executable": true, "parser": "minecraft:nbt_path" } @@ -2149,21 +4195,10 @@ "defaultgamemode": { "type": "literal", "children": { - "adventure": { - "type": "literal", - "executable": true - }, - "creative": { - "type": "literal", - "executable": true - }, - "spectator": { - "type": "literal", - "executable": true - }, - "survival": { - "type": "literal", - "executable": true + "gamemode": { + "type": "argument", + "executable": true, + "parser": "minecraft:gamemode" } } }, @@ -2211,7 +4246,10 @@ "effect": { "type": "argument", "executable": true, - "parser": "minecraft:mob_effect" + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:mob_effect" + } } }, "executable": true, @@ -2233,6 +4271,28 @@ "effect": { "type": "argument", "children": { + "infinite": { + "type": "literal", + "children": { + "amplifier": { + "type": "argument", + "children": { + "hideParticles": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 255, + "min": 0 + } + } + }, + "executable": true + }, "seconds": { "type": "argument", "children": { @@ -2262,7 +4322,10 @@ } }, "executable": true, - "parser": "minecraft:mob_effect" + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:mob_effect" + } } }, "parser": "minecraft:entity", @@ -2294,7 +4357,10 @@ } }, "executable": true, - "parser": "minecraft:item_enchantment" + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:enchantment" + } } }, "parser": "minecraft:entity", @@ -2389,6 +4455,26 @@ "if": { "type": "literal", "children": { + "biome": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "biome": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + }, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, "block": { "type": "literal", "children": { @@ -2499,6 +4585,17 @@ } } }, + "dimension": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "executable": true, + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, "entity": { "type": "literal", "children": { @@ -2514,6 +4611,16 @@ } } }, + "loaded": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "redirect": ["execute"] + } + } + }, "predicate": { "type": "literal", "children": { @@ -2668,6 +4775,43 @@ } } }, + "on": { + "type": "literal", + "children": { + "attacker": { + "type": "literal", + "redirect": ["execute"] + }, + "controller": { + "type": "literal", + "redirect": ["execute"] + }, + "leasher": { + "type": "literal", + "redirect": ["execute"] + }, + "origin": { + "type": "literal", + "redirect": ["execute"] + }, + "owner": { + "type": "literal", + "redirect": ["execute"] + }, + "passengers": { + "type": "literal", + "redirect": ["execute"] + }, + "target": { + "type": "literal", + "redirect": ["execute"] + }, + "vehicle": { + "type": "literal", + "redirect": ["execute"] + } + } + }, "positioned": { "type": "literal", "children": { @@ -3283,6 +5427,26 @@ "unless": { "type": "literal", "children": { + "biome": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "biome": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + }, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, "block": { "type": "literal", "children": { @@ -3393,6 +5557,17 @@ } } }, + "dimension": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "executable": true, + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, "entity": { "type": "literal", "children": { @@ -3408,6 +5583,16 @@ } } }, + "loaded": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "parser": "minecraft:block_pos", + "redirect": ["execute"] + } + } + }, "predicate": { "type": "literal", "children": { @@ -3696,6 +5881,46 @@ } } }, + "fillbiome": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "children": { + "biome": { + "type": "argument", + "children": { + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + } + } + } + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:worldgen/biome" + } + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, "forceload": { "type": "literal", "children": { @@ -3763,8 +5988,8 @@ "gamemode": { "type": "literal", "children": { - "adventure": { - "type": "literal", + "gamemode": { + "type": "argument", "children": { "target": { "type": "argument", @@ -3776,59 +6001,37 @@ } } }, - "executable": true - }, - "creative": { + "executable": true, + "parser": "minecraft:gamemode" + } + } + }, + "gamerule": { + "type": "literal", + "children": { + "announceAdvancements": { "type": "literal", "children": { - "target": { + "value": { "type": "argument", "executable": true, - "parser": "minecraft:entity", - "properties": { - "type": "players", - "amount": "multiple" - } + "parser": "brigadier:bool" } }, "executable": true }, - "spectator": { + "blockExplosionDropDecay": { "type": "literal", "children": { - "target": { + "value": { "type": "argument", "executable": true, - "parser": "minecraft:entity", - "properties": { - "type": "players", - "amount": "multiple" - } + "parser": "brigadier:bool" } }, "executable": true }, - "survival": { - "type": "literal", - "children": { - "target": { - "type": "argument", - "executable": true, - "parser": "minecraft:entity", - "properties": { - "type": "players", - "amount": "multiple" - } - } - }, - "executable": true - } - } - }, - "gamerule": { - "type": "literal", - "children": { - "announceAdvancements": { + "commandBlockOutput": { "type": "literal", "children": { "value": { @@ -3839,13 +6042,13 @@ }, "executable": true }, - "commandBlockOutput": { + "commandModificationBlockLimit": { "type": "literal", "children": { "value": { "type": "argument", "executable": true, - "parser": "brigadier:bool" + "parser": "brigadier:integer" } }, "executable": true @@ -4070,6 +6273,17 @@ }, "executable": true }, + "globalSoundEvents": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, "keepInventory": { "type": "literal", "children": { @@ -4081,6 +6295,17 @@ }, "executable": true }, + "lavaSourceConversion": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, "logAdminCommands": { "type": "literal", "children": { @@ -4114,6 +6339,17 @@ }, "executable": true }, + "mobExplosionDropDecay": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, "mobGriefing": { "type": "literal", "children": { @@ -4191,6 +6427,17 @@ }, "executable": true }, + "snowAccumulationHeight": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, "spawnRadius": { "type": "literal", "children": { @@ -4213,6 +6460,17 @@ }, "executable": true }, + "tntExplosionDropDecay": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, "universalAnger": { "type": "literal", "children": { @@ -4223,6 +6481,17 @@ } }, "executable": true + }, + "waterSourceConversion": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true } } }, @@ -4617,7 +6886,7 @@ "structure": { "type": "argument", "executable": true, - "parser": "minecraft:resource_or_tag", + "parser": "minecraft:resource_or_tag_key", "properties": { "registry": "minecraft:worldgen/structure" } @@ -5455,7 +7724,7 @@ } }, "executable": true, - "parser": "minecraft:resource", + "parser": "minecraft:resource_key", "properties": { "registry": "minecraft:worldgen/configured_feature" } @@ -5491,7 +7760,7 @@ "parser": "minecraft:resource_location" } }, - "parser": "minecraft:resource", + "parser": "minecraft:resource_key", "properties": { "registry": "minecraft:worldgen/template_pool" } @@ -5511,7 +7780,7 @@ } }, "executable": true, - "parser": "minecraft:resource", + "parser": "minecraft:resource_key", "properties": { "registry": "minecraft:worldgen/structure" } @@ -6113,14 +8382,28 @@ "publish": { "type": "literal", "children": { - "port": { + "allowCommands": { "type": "argument", + "children": { + "gamemode": { + "type": "argument", + "children": { + "port": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 65535, + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:gamemode" + } + }, "executable": true, - "parser": "brigadier:integer", - "properties": { - "max": 65535, - "min": 0 - } + "parser": "brigadier:bool" } }, "executable": true @@ -6182,6 +8465,39 @@ "type": "literal", "executable": true }, + "ride": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "dismount": { + "type": "literal", + "executable": true + }, + "mount": { + "type": "literal", + "children": { + "vehicle": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, "save-all": { "type": "literal", "children": { @@ -6245,7 +8561,10 @@ } }, "executable": true, - "parser": "minecraft:time" + "parser": "minecraft:time", + "properties": { + "min": 0 + } } }, "parser": "minecraft:function" @@ -6903,7 +9222,10 @@ } }, "executable": true, - "parser": "minecraft:entity_summon" + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:entity_type" + } } } }, @@ -7299,7 +9621,10 @@ "time": { "type": "argument", "executable": true, - "parser": "minecraft:time" + "parser": "minecraft:time", + "properties": { + "min": 0 + } } } }, @@ -7342,7 +9667,10 @@ "time": { "type": "argument", "executable": true, - "parser": "minecraft:time" + "parser": "minecraft:time", + "properties": { + "min": 0 + } } } } @@ -7394,19 +9722,19 @@ "fadeOut": { "type": "argument", "executable": true, - "parser": "brigadier:integer", + "parser": "minecraft:time", "properties": { "min": 0 } } }, - "parser": "brigadier:integer", + "parser": "minecraft:time", "properties": { "min": 0 } } }, - "parser": "brigadier:integer", + "parser": "minecraft:time", "properties": { "min": 0 } @@ -7485,10 +9813,9 @@ "duration": { "type": "argument", "executable": true, - "parser": "brigadier:integer", + "parser": "minecraft:time", "properties": { - "max": 1000000, - "min": 0 + "min": 1 } } }, @@ -7500,10 +9827,9 @@ "duration": { "type": "argument", "executable": true, - "parser": "brigadier:integer", + "parser": "minecraft:time", "properties": { - "max": 1000000, - "min": 0 + "min": 1 } } }, @@ -7515,10 +9841,9 @@ "duration": { "type": "argument", "executable": true, - "parser": "brigadier:integer", + "parser": "minecraft:time", "properties": { - "max": 1000000, - "min": 0 + "min": 1 } } }, diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index a8d7feb79..a8868f844 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -694,9 +694,12 @@ location: SourceLocation(pos=915, lineno=21, colno=1) end_location: SourceLocation(pos=939, lineno=21, colno=25) - identifier: 'defaultgamemode:survival' + identifier: 'defaultgamemode:gamemode' arguments: - + + location: SourceLocation(pos=931, lineno=21, colno=17) + end_location: SourceLocation(pos=939, lineno=21, colno=25) + value: 'survival' location: SourceLocation(pos=949, lineno=23, colno=1) end_location: SourceLocation(pos=999, lineno=23, colno=51) @@ -830,10 +833,12 @@ variable: 'a' arguments: - + location: SourceLocation(pos=1154, lineno=29, colno=12) end_location: SourceLocation(pos=1162, lineno=29, colno=20) - value: 'infinity' + is_tag: False + namespace: None + path: 'infinity' location: SourceLocation(pos=1163, lineno=30, colno=1) end_location: SourceLocation(pos=1185, lineno=30, colno=23) @@ -845,10 +850,12 @@ variable: 'p' arguments: - + location: SourceLocation(pos=1174, lineno=30, colno=12) end_location: SourceLocation(pos=1183, lineno=30, colno=21) - value: 'sharpness' + is_tag: False + namespace: None + path: 'sharpness' location: SourceLocation(pos=1184, lineno=30, colno=22) end_location: SourceLocation(pos=1185, lineno=30, colno=23) @@ -3288,14 +3295,21 @@ location: SourceLocation(pos=3436, lineno=75, colno=1) end_location: SourceLocation(pos=3453, lineno=75, colno=18) - identifier: 'gamemode:creative' + identifier: 'gamemode:gamemode' arguments: - + + location: SourceLocation(pos=3445, lineno=75, colno=10) + end_location: SourceLocation(pos=3453, lineno=75, colno=18) + value: 'creative' location: SourceLocation(pos=3454, lineno=76, colno=1) end_location: SourceLocation(pos=3474, lineno=76, colno=21) - identifier: 'gamemode:survival:target' + identifier: 'gamemode:gamemode:target' arguments: + + location: SourceLocation(pos=3463, lineno=76, colno=10) + end_location: SourceLocation(pos=3471, lineno=76, colno=18) + value: 'survival' location: SourceLocation(pos=3472, lineno=76, colno=19) end_location: SourceLocation(pos=3474, lineno=76, colno=21) @@ -5303,10 +5317,11 @@ end_location: SourceLocation(pos=5964, lineno=144, colno=19) identifier: 'weather:clear:duration' arguments: - + location: SourceLocation(pos=5960, lineno=144, colno=15) end_location: SourceLocation(pos=5964, lineno=144, colno=19) value: 1200 + unit: 'tick' location: SourceLocation(pos=5965, lineno=145, colno=1) end_location: SourceLocation(pos=5977, lineno=145, colno=13) diff --git a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt index f8cfd6386..2cdbe74a2 100644 --- a/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__multiline_command_examples__0.txt @@ -870,8 +870,12 @@ location: SourceLocation(pos=1557, lineno=92, colno=9) end_location: SourceLocation(pos=1611, lineno=95, colno=24) - identifier: 'gamemode:survival:target' + identifier: 'gamemode:gamemode:target' arguments: + + location: SourceLocation(pos=1578, lineno=93, colno=13) + end_location: SourceLocation(pos=1586, lineno=93, colno=21) + value: 'survival' location: SourceLocation(pos=1600, lineno=95, colno=13) end_location: SourceLocation(pos=1611, lineno=95, colno=24) diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json index 393bf34b8..a3d9f43af 100644 --- a/packages/mecha/tests/snapshots/spec__prototypes__0.json +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -71,6 +71,45 @@ "clone:begin:end:destination:replace:force", "clone:begin:end:destination:replace:move", "clone:begin:end:destination:replace:normal", + "clone:begin:end:to:targetDimension:destination", + "clone:begin:end:to:targetDimension:destination:filtered:filter", + "clone:begin:end:to:targetDimension:destination:filtered:filter:force", + "clone:begin:end:to:targetDimension:destination:filtered:filter:move", + "clone:begin:end:to:targetDimension:destination:filtered:filter:normal", + "clone:begin:end:to:targetDimension:destination:masked", + "clone:begin:end:to:targetDimension:destination:masked:force", + "clone:begin:end:to:targetDimension:destination:masked:move", + "clone:begin:end:to:targetDimension:destination:masked:normal", + "clone:begin:end:to:targetDimension:destination:replace", + "clone:begin:end:to:targetDimension:destination:replace:force", + "clone:begin:end:to:targetDimension:destination:replace:move", + "clone:begin:end:to:targetDimension:destination:replace:normal", + "clone:from:sourceDimension:begin:end:destination", + "clone:from:sourceDimension:begin:end:destination:filtered:filter", + "clone:from:sourceDimension:begin:end:destination:filtered:filter:force", + "clone:from:sourceDimension:begin:end:destination:filtered:filter:move", + "clone:from:sourceDimension:begin:end:destination:filtered:filter:normal", + "clone:from:sourceDimension:begin:end:destination:masked", + "clone:from:sourceDimension:begin:end:destination:masked:force", + "clone:from:sourceDimension:begin:end:destination:masked:move", + "clone:from:sourceDimension:begin:end:destination:masked:normal", + "clone:from:sourceDimension:begin:end:destination:replace", + "clone:from:sourceDimension:begin:end:destination:replace:force", + "clone:from:sourceDimension:begin:end:destination:replace:move", + "clone:from:sourceDimension:begin:end:destination:replace:normal", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:force", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:move", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:normal", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:force", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:move", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:normal", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:force", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:move", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:normal", "data:get:block:targetPos", "data:get:block:targetPos:path", "data:get:block:targetPos:path:scale", @@ -89,6 +128,18 @@ "data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:append:from:storage:source", "data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:append:string:entity:source", + "data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:append:string:storage:source", + "data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:append:value:value", "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -96,6 +147,18 @@ "data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:insert:index:from:storage:source", "data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:insert:index:value:value", "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", @@ -103,6 +166,18 @@ "data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:merge:from:storage:source", "data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:merge:string:entity:source", + "data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:merge:string:storage:source", + "data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:merge:value:value", "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -110,6 +185,18 @@ "data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:prepend:from:storage:source", "data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:prepend:value:value", "data:modify:block:targetPos:targetPath:set:from:block:sourcePos", "data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", @@ -117,6 +204,18 @@ "data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:set:from:storage:source", "data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:set:string:entity:source", + "data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:set:string:storage:source", + "data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:set:value:value", "data:modify:entity:target:targetPath:append:from:block:sourcePos", "data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", @@ -124,6 +223,18 @@ "data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:append:from:storage:source", "data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:string:block:sourcePos", + "data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:append:string:entity:source", + "data:modify:entity:target:targetPath:append:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:append:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:append:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:append:string:storage:source", + "data:modify:entity:target:targetPath:append:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:append:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:append:value:value", "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -131,6 +242,18 @@ "data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:insert:index:from:storage:source", "data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:insert:index:string:entity:source", + "data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:insert:index:string:storage:source", + "data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:insert:index:value:value", "data:modify:entity:target:targetPath:merge:from:block:sourcePos", "data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", @@ -138,6 +261,18 @@ "data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:merge:from:storage:source", "data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:merge:string:entity:source", + "data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:merge:string:storage:source", + "data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:merge:value:value", "data:modify:entity:target:targetPath:prepend:from:block:sourcePos", "data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -145,6 +280,18 @@ "data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:prepend:from:storage:source", "data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:prepend:string:entity:source", + "data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:prepend:string:storage:source", + "data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:prepend:value:value", "data:modify:entity:target:targetPath:set:from:block:sourcePos", "data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", @@ -152,6 +299,18 @@ "data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:set:from:storage:source", "data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:string:block:sourcePos", + "data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:set:string:entity:source", + "data:modify:entity:target:targetPath:set:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:set:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:set:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:set:string:storage:source", + "data:modify:entity:target:targetPath:set:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:set:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:set:value:value", "data:modify:storage:target:targetPath:append:from:block:sourcePos", "data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", @@ -159,6 +318,18 @@ "data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:append:from:storage:source", "data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:string:block:sourcePos", + "data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:append:string:entity:source", + "data:modify:storage:target:targetPath:append:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:append:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:append:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:append:string:storage:source", + "data:modify:storage:target:targetPath:append:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:append:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:append:value:value", "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -166,6 +337,18 @@ "data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:insert:index:from:storage:source", "data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:insert:index:string:entity:source", + "data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:insert:index:string:storage:source", + "data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:insert:index:value:value", "data:modify:storage:target:targetPath:merge:from:block:sourcePos", "data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", @@ -173,6 +356,18 @@ "data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:merge:from:storage:source", "data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:merge:string:entity:source", + "data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:merge:string:storage:source", + "data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:merge:value:value", "data:modify:storage:target:targetPath:prepend:from:block:sourcePos", "data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -180,6 +375,18 @@ "data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:prepend:from:storage:source", "data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:prepend:string:entity:source", + "data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:prepend:string:storage:source", + "data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:prepend:value:value", "data:modify:storage:target:targetPath:set:from:block:sourcePos", "data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", @@ -187,6 +394,18 @@ "data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:set:from:storage:source", "data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:set:string:block:sourcePos", + "data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:set:string:entity:source", + "data:modify:storage:target:targetPath:set:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:set:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:set:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:set:string:storage:source", + "data:modify:storage:target:targetPath:set:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:set:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:set:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:set:value:value", "data:remove:block:targetPos:path", "data:remove:entity:target:path", @@ -203,10 +422,7 @@ "debug:function:name", "debug:start", "debug:stop", - "defaultgamemode:adventure", - "defaultgamemode:creative", - "defaultgamemode:spectator", - "defaultgamemode:survival", + "defaultgamemode:gamemode", "deop:targets", "difficulty", "difficulty:easy", @@ -217,6 +433,9 @@ "effect:clear:targets", "effect:clear:targets:effect", "effect:give:targets:effect", + "effect:give:targets:effect:infinite", + "effect:give:targets:effect:infinite:amplifier", + "effect:give:targets:effect:infinite:amplifier:hideParticles", "effect:give:targets:effect:seconds", "effect:give:targets:effect:seconds:amplifier", "effect:give:targets:effect:seconds:amplifier:hideParticles", @@ -229,6 +448,8 @@ "execute:at:targets:subcommand", "execute:facing:entity:targets:anchor:subcommand", "execute:facing:pos:subcommand", + "execute:if:biome:pos:biome", + "execute:if:biome:pos:biome:subcommand", "execute:if:block:pos:block", "execute:if:block:pos:block:subcommand", "execute:if:blocks:start:end:destination:all", @@ -241,8 +462,11 @@ "execute:if:data:entity:source:path:subcommand", "execute:if:data:storage:source:path", "execute:if:data:storage:source:path:subcommand", + "execute:if:dimension:dimension", + "execute:if:dimension:dimension:subcommand", "execute:if:entity:entities", "execute:if:entity:entities:subcommand", + "execute:if:loaded:pos:subcommand", "execute:if:predicate:predicate", "execute:if:predicate:predicate:subcommand", "execute:if:score:target:targetObjective:<:source:sourceObjective", @@ -258,6 +482,14 @@ "execute:if:score:target:targetObjective:matches:range", "execute:if:score:target:targetObjective:matches:range:subcommand", "execute:in:dimension:subcommand", + "execute:on:attacker:subcommand", + "execute:on:controller:subcommand", + "execute:on:leasher:subcommand", + "execute:on:origin:subcommand", + "execute:on:owner:subcommand", + "execute:on:passengers:subcommand", + "execute:on:target:subcommand", + "execute:on:vehicle:subcommand", "execute:positioned:as:targets:subcommand", "execute:positioned:pos:subcommand", "execute:rotated:as:targets:subcommand", @@ -305,6 +537,8 @@ "execute:store:success:storage:target:path:int:scale:subcommand", "execute:store:success:storage:target:path:long:scale:subcommand", "execute:store:success:storage:target:path:short:scale:subcommand", + "execute:unless:biome:pos:biome", + "execute:unless:biome:pos:biome:subcommand", "execute:unless:block:pos:block", "execute:unless:block:pos:block:subcommand", "execute:unless:blocks:start:end:destination:all", @@ -317,8 +551,11 @@ "execute:unless:data:entity:source:path:subcommand", "execute:unless:data:storage:source:path", "execute:unless:data:storage:source:path:subcommand", + "execute:unless:dimension:dimension", + "execute:unless:dimension:dimension:subcommand", "execute:unless:entity:entities", "execute:unless:entity:entities:subcommand", + "execute:unless:loaded:pos:subcommand", "execute:unless:predicate:predicate", "execute:unless:predicate:predicate:subcommand", "execute:unless:score:target:targetObjective:<:source:sourceObjective", @@ -348,6 +585,8 @@ "fill:from:to:block:outline", "fill:from:to:block:replace", "fill:from:to:block:replace:filter", + "fillbiome:from:to:biome", + "fillbiome:from:to:biome:replace:filter", "forceload:add:from", "forceload:add:from:to", "forceload:query", @@ -356,18 +595,16 @@ "forceload:remove:from", "forceload:remove:from:to", "function:name", - "gamemode:adventure", - "gamemode:adventure:target", - "gamemode:creative", - "gamemode:creative:target", - "gamemode:spectator", - "gamemode:spectator:target", - "gamemode:survival", - "gamemode:survival:target", + "gamemode:gamemode", + "gamemode:gamemode:target", "gamerule:announceAdvancements", "gamerule:announceAdvancements:value", + "gamerule:blockExplosionDropDecay", + "gamerule:blockExplosionDropDecay:value", "gamerule:commandBlockOutput", "gamerule:commandBlockOutput:value", + "gamerule:commandModificationBlockLimit", + "gamerule:commandModificationBlockLimit:value", "gamerule:disableElytraMovementCheck", "gamerule:disableElytraMovementCheck:value", "gamerule:disableRaids", @@ -408,14 +645,20 @@ "gamerule:forgiveDeadPlayers:value", "gamerule:freezeDamage", "gamerule:freezeDamage:value", + "gamerule:globalSoundEvents", + "gamerule:globalSoundEvents:value", "gamerule:keepInventory", "gamerule:keepInventory:value", + "gamerule:lavaSourceConversion", + "gamerule:lavaSourceConversion:value", "gamerule:logAdminCommands", "gamerule:logAdminCommands:value", "gamerule:maxCommandChainLength", "gamerule:maxCommandChainLength:value", "gamerule:maxEntityCramming", "gamerule:maxEntityCramming:value", + "gamerule:mobExplosionDropDecay", + "gamerule:mobExplosionDropDecay:value", "gamerule:mobGriefing", "gamerule:mobGriefing:value", "gamerule:naturalRegeneration", @@ -430,12 +673,18 @@ "gamerule:sendCommandFeedback:value", "gamerule:showDeathMessages", "gamerule:showDeathMessages:value", + "gamerule:snowAccumulationHeight", + "gamerule:snowAccumulationHeight:value", "gamerule:spawnRadius", "gamerule:spawnRadius:value", "gamerule:spectatorsGenerateChunks", "gamerule:spectatorsGenerateChunks:value", + "gamerule:tntExplosionDropDecay", + "gamerule:tntExplosionDropDecay:value", "gamerule:universalAnger", "gamerule:universalAnger:value", + "gamerule:waterSourceConversion", + "gamerule:waterSourceConversion:value", "give:targets:item", "give:targets:item:count", "help", @@ -612,12 +861,16 @@ "playsound:sound:weather:targets:pos:volume:pitch", "playsound:sound:weather:targets:pos:volume:pitch:minVolume", "publish", - "publish:port", + "publish:allowCommands", + "publish:allowCommands:gamemode", + "publish:allowCommands:gamemode:port", "recipe:give:targets:*", "recipe:give:targets:recipe", "recipe:take:targets:*", "recipe:take:targets:recipe", "reload", + "ride:target:dismount", + "ride:target:mount:vehicle", "save-all", "save-all:flush", "save-off", From 6a0aec099ca4fa5d2e64c78d8a8971573e60f9ee Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Feb 2023 23:44:10 +0000 Subject: [PATCH 1131/1554] 0.66.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 841b68570..2ca7c632f 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.66.0 (2023-02-06) +### Feature +* Update 1.19 ([`ab74039`](https://github.com/mcbeet/mecha/commit/ab7403976be1f0185d0b346103bd5bb6eb837d67)) + ## v0.65.1 (2023-02-01) ### Fix * Update some typings ([`d08b712`](https://github.com/mcbeet/mecha/commit/d08b712ce3f8d60f52c44af6e37b154e37ee4ed7)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index b9937fc34..61dc37026 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.65.1" +__version__ = "0.66.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 7db8f26de..1b3d61f0d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.65.1" +version = "0.66.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 17e1255eb237a8d136243defcb80610667b02855 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 04:10:32 +0000 Subject: [PATCH 1132/1554] build(deps-dev): bump isort from 5.10.1 to 5.12.0 Bumps [isort](https://github.com/pycqa/isort) from 5.10.1 to 5.12.0. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.10.1...5.12.0) --- updated-dependencies: - dependency-name: isort dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/bolt/poetry.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index f60a4bc02..436ab9566 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -437,19 +437,19 @@ files = [ [[package]] name = "isort" -version = "5.10.1" +version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.8.0" files = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, ] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] From 4013eb073f7deb6bf37b34c9b00a4b9d95dacf03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 04:12:58 +0000 Subject: [PATCH 1133/1554] build(deps-dev): bump python-semantic-release from 7.33.0 to 7.33.1 Bumps [python-semantic-release](https://github.com/relekang/python-semantic-release) from 7.33.0 to 7.33.1. - [Release notes](https://github.com/relekang/python-semantic-release/releases) - [Changelog](https://github.com/python-semantic-release/python-semantic-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/relekang/python-semantic-release/compare/v7.33.0...v7.33.1) --- updated-dependencies: - dependency-name: python-semantic-release dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/bolt/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 436ab9566..3875dd972 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -957,14 +957,14 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.33.0" +version = "7.33.1" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" files = [ - {file = "python-semantic-release-7.33.0.tar.gz", hash = "sha256:c559161c091e24f555c021fee63a9a704cc7ae59e774913ba5018fa3c9ce2e89"}, - {file = "python_semantic_release-7.33.0-py3-none-any.whl", hash = "sha256:b1fcc2d3be64e1b8d98228b2e2377f1c664e12eca038754eb8d0453c2ff4b438"}, + {file = "python-semantic-release-7.33.1.tar.gz", hash = "sha256:9d2e5681c2c296e0fc5d24088b59d7528c1c162920df29a4663d1131b5dfc97b"}, + {file = "python_semantic_release-7.33.1-py3-none-any.whl", hash = "sha256:ad8bc816526d3d0d7a4cf4833cc57e655a28b34d6fa33b3d2786a07ae4e8a075"}, ] [package.dependencies] From d0db46d7d5475e581683f79266e66a419809718d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 7 Feb 2023 00:51:01 +0100 Subject: [PATCH 1134/1554] feat: update 1.19 --- packages/bolt/poetry.lock | 18 +- packages/bolt/pyproject.toml | 2 +- .../tests/snapshots/bolt__parse_230__0.txt | 2 +- .../tests/snapshots/bolt__parse_38__0.txt | 2 +- .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_98__0.txt | 2 +- .../tests/snapshots/bolt__parse_99__0.txt | 2 +- .../tests/snapshots/spec__prototypes__0.json | 558 +++++++++++++++++- 8 files changed, 547 insertions(+), 41 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 3875dd972..6da82b3f8 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -635,19 +635,19 @@ files = [ [[package]] name = "mecha" -version = "0.65.1" +version = "0.66.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "mecha-0.65.1-py3-none-any.whl", hash = "sha256:65fc9a3d205b293cd13028bf660771a04c48da85ab22fbdb0f72d44cb1e261fa"}, - {file = "mecha-0.65.1.tar.gz", hash = "sha256:309edd558254a60132898de95e66f6b2ae6c06b6ea91f309ab0c277026296860"}, + {file = "mecha-0.66.0-py3-none-any.whl", hash = "sha256:faf8c8b434291ddb3b630f08257bef3ee4950555bcc26b5995c7d220797abf3c"}, + {file = "mecha-0.66.0.tar.gz", hash = "sha256:ccf6c03d5ef7dff205f20965502ea13ae07540290f56a68bc1e862dfaf22e4d0"}, ] [package.dependencies] beet = ">=0.83.1" -tokenstream = ">=1.4.2,<2.0.0" +tokenstream = ">=1.5.0,<2.0.0" [[package]] name = "more-itertools" @@ -1175,14 +1175,14 @@ files = [ [[package]] name = "tokenstream" -version = "1.4.2" +version = "1.5.0" description = "A versatile token stream for handwritten parsers" category = "main" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.10,<4.0" files = [ - {file = "tokenstream-1.4.2-py3-none-any.whl", hash = "sha256:e4979949e3ca8ab68fe9e924005e668da5b262892c370daf043d767e8e509e4b"}, - {file = "tokenstream-1.4.2.tar.gz", hash = "sha256:f106b0bd0ae629847485e8ddfc9ac3c479c6c2d8c9db164f9b666e9fda6608cf"}, + {file = "tokenstream-1.5.0-py3-none-any.whl", hash = "sha256:adf5805f3e734c863a535c5cfc31fed4bd831647b1f51d1aab69e5a81eb63b8e"}, + {file = "tokenstream-1.5.0.tar.gz", hash = "sha256:3cb57c810f2fd1e57653c8270251a3df47656ef04f07eb3d4fc442f64f9ff0c0"}, ] [[package]] @@ -1415,4 +1415,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "5ed04c30958a2d8f94bb0b58614ac7bec0f13085263f03d4dff724e4f54fd8f3" +content-hash = "6a39f2cf77080ba472762b353da0839840e65852335d7dcddfff07272632ca82" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 584783368..47324911a 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" beet = ">=0.83.1" -mecha = ">=0.65.1" +mecha = ">=0.66.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.1" diff --git a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt index 6f03d2c6c..b391ccdd6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt @@ -1,6 +1,6 @@ macro foo: pass -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 124 other tokens but got literal 'foo'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 127 other tokens but got literal 'foo'. # line 3, column 7 # 2 | pass # 3 | as @p foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt index ddc06653a..bc8ddc925 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_38__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_38__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 11 other tokens but reached end of file. +#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 14 other tokens but reached end of file. # line 1, column 3 # 1 | if if diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index dae51e3e1..3dc784ff6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 155 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 158 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_98__0.txt b/packages/bolt/tests/snapshots/bolt__parse_98__0.txt index 3fc75c2b2..923f5fa6f 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_98__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_98__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected literal 'block', literal 'blocks', literal 'data', literal 'entity', literal 'predicate' or literal 'score' but got literal '"foo"'. +#>ERROR Expected literal 'biome', literal 'block', literal 'blocks', literal 'data', literal 'dimension', literal 'entity' or 3 other tokens but got literal '"foo"'. # line 1, column 10 # 1 | at @s if "foo" == "bar": # : ^^^^^ diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt index bb65fe420..d0185e339 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 124 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 127 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 7406f62a2..26488db05 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -94,6 +94,45 @@ "clone:begin:end:destination:replace:force", "clone:begin:end:destination:replace:move", "clone:begin:end:destination:replace:normal", + "clone:begin:end:to:targetDimension:destination", + "clone:begin:end:to:targetDimension:destination:filtered:filter", + "clone:begin:end:to:targetDimension:destination:filtered:filter:force", + "clone:begin:end:to:targetDimension:destination:filtered:filter:move", + "clone:begin:end:to:targetDimension:destination:filtered:filter:normal", + "clone:begin:end:to:targetDimension:destination:masked", + "clone:begin:end:to:targetDimension:destination:masked:force", + "clone:begin:end:to:targetDimension:destination:masked:move", + "clone:begin:end:to:targetDimension:destination:masked:normal", + "clone:begin:end:to:targetDimension:destination:replace", + "clone:begin:end:to:targetDimension:destination:replace:force", + "clone:begin:end:to:targetDimension:destination:replace:move", + "clone:begin:end:to:targetDimension:destination:replace:normal", + "clone:from:sourceDimension:begin:end:destination", + "clone:from:sourceDimension:begin:end:destination:filtered:filter", + "clone:from:sourceDimension:begin:end:destination:filtered:filter:force", + "clone:from:sourceDimension:begin:end:destination:filtered:filter:move", + "clone:from:sourceDimension:begin:end:destination:filtered:filter:normal", + "clone:from:sourceDimension:begin:end:destination:masked", + "clone:from:sourceDimension:begin:end:destination:masked:force", + "clone:from:sourceDimension:begin:end:destination:masked:move", + "clone:from:sourceDimension:begin:end:destination:masked:normal", + "clone:from:sourceDimension:begin:end:destination:replace", + "clone:from:sourceDimension:begin:end:destination:replace:force", + "clone:from:sourceDimension:begin:end:destination:replace:move", + "clone:from:sourceDimension:begin:end:destination:replace:normal", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:force", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:move", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:normal", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:force", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:move", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:normal", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:force", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:move", + "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:normal", "continue", "data:get:block:targetPos", "data:get:block:targetPos:path", @@ -113,6 +152,18 @@ "data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:append:from:storage:source", "data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:append:string:entity:source", + "data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:append:string:storage:source", + "data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:append:value:value", "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", "data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -120,6 +171,18 @@ "data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:insert:index:from:storage:source", "data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:insert:index:value:value", "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", "data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", @@ -127,6 +190,18 @@ "data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:merge:from:storage:source", "data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:merge:string:entity:source", + "data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:merge:string:storage:source", + "data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:merge:value:value", "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", "data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -134,6 +209,18 @@ "data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:prepend:from:storage:source", "data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:prepend:value:value", "data:modify:block:targetPos:targetPath:set:from:block:sourcePos", "data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", @@ -141,6 +228,18 @@ "data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", "data:modify:block:targetPos:targetPath:set:from:storage:source", "data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath:start", + "data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:set:string:entity:source", + "data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath:start:end", + "data:modify:block:targetPos:targetPath:set:string:storage:source", + "data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath", + "data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start", + "data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start:end", "data:modify:block:targetPos:targetPath:set:value:value", "data:modify:entity:target:targetPath:append:from:block:sourcePos", "data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", @@ -148,6 +247,18 @@ "data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:append:from:storage:source", "data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:string:block:sourcePos", + "data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:append:string:entity:source", + "data:modify:entity:target:targetPath:append:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:append:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:append:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:append:string:storage:source", + "data:modify:entity:target:targetPath:append:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:append:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:append:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:append:value:value", "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", "data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -155,6 +266,18 @@ "data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:insert:index:from:storage:source", "data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:insert:index:string:entity:source", + "data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:insert:index:string:storage:source", + "data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:insert:index:value:value", "data:modify:entity:target:targetPath:merge:from:block:sourcePos", "data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", @@ -162,6 +285,18 @@ "data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:merge:from:storage:source", "data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:merge:string:entity:source", + "data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:merge:string:storage:source", + "data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:merge:value:value", "data:modify:entity:target:targetPath:prepend:from:block:sourcePos", "data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -169,6 +304,18 @@ "data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:prepend:from:storage:source", "data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:prepend:string:entity:source", + "data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:prepend:string:storage:source", + "data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:prepend:value:value", "data:modify:entity:target:targetPath:set:from:block:sourcePos", "data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", @@ -176,6 +323,18 @@ "data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", "data:modify:entity:target:targetPath:set:from:storage:source", "data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:string:block:sourcePos", + "data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath", + "data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath:start", + "data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "data:modify:entity:target:targetPath:set:string:entity:source", + "data:modify:entity:target:targetPath:set:string:entity:source:sourcePath", + "data:modify:entity:target:targetPath:set:string:entity:source:sourcePath:start", + "data:modify:entity:target:targetPath:set:string:entity:source:sourcePath:start:end", + "data:modify:entity:target:targetPath:set:string:storage:source", + "data:modify:entity:target:targetPath:set:string:storage:source:sourcePath", + "data:modify:entity:target:targetPath:set:string:storage:source:sourcePath:start", + "data:modify:entity:target:targetPath:set:string:storage:source:sourcePath:start:end", "data:modify:entity:target:targetPath:set:value:value", "data:modify:storage:target:targetPath:append:from:block:sourcePos", "data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", @@ -183,6 +342,18 @@ "data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:append:from:storage:source", "data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:string:block:sourcePos", + "data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:append:string:entity:source", + "data:modify:storage:target:targetPath:append:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:append:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:append:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:append:string:storage:source", + "data:modify:storage:target:targetPath:append:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:append:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:append:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:append:value:value", "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", "data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -190,6 +361,18 @@ "data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:insert:index:from:storage:source", "data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:insert:index:string:entity:source", + "data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:insert:index:string:storage:source", + "data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:insert:index:value:value", "data:modify:storage:target:targetPath:merge:from:block:sourcePos", "data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", @@ -197,6 +380,18 @@ "data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:merge:from:storage:source", "data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:merge:string:entity:source", + "data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:merge:string:storage:source", + "data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:merge:value:value", "data:modify:storage:target:targetPath:prepend:from:block:sourcePos", "data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -204,6 +399,18 @@ "data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:prepend:from:storage:source", "data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:prepend:string:entity:source", + "data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:prepend:string:storage:source", + "data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:prepend:value:value", "data:modify:storage:target:targetPath:set:from:block:sourcePos", "data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", @@ -211,6 +418,18 @@ "data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", "data:modify:storage:target:targetPath:set:from:storage:source", "data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", + "data:modify:storage:target:targetPath:set:string:block:sourcePos", + "data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath", + "data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath:start", + "data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "data:modify:storage:target:targetPath:set:string:entity:source", + "data:modify:storage:target:targetPath:set:string:entity:source:sourcePath", + "data:modify:storage:target:targetPath:set:string:entity:source:sourcePath:start", + "data:modify:storage:target:targetPath:set:string:entity:source:sourcePath:start:end", + "data:modify:storage:target:targetPath:set:string:storage:source", + "data:modify:storage:target:targetPath:set:string:storage:source:sourcePath", + "data:modify:storage:target:targetPath:set:string:storage:source:sourcePath:start", + "data:modify:storage:target:targetPath:set:string:storage:source:sourcePath:start:end", "data:modify:storage:target:targetPath:set:value:value", "data:remove:block:targetPos:path", "data:remove:entity:target:path", @@ -228,10 +447,7 @@ "debug:start", "debug:stop", "def:function:body", - "defaultgamemode:adventure", - "defaultgamemode:creative", - "defaultgamemode:spectator", - "defaultgamemode:survival", + "defaultgamemode:gamemode", "del", "del:target", "deop:targets", @@ -246,6 +462,9 @@ "effect:clear:targets", "effect:clear:targets:effect", "effect:give:targets:effect", + "effect:give:targets:effect:infinite", + "effect:give:targets:effect:infinite:amplifier", + "effect:give:targets:effect:infinite:amplifier:hideParticles", "effect:give:targets:effect:seconds", "effect:give:targets:effect:seconds:amplifier", "effect:give:targets:effect:seconds:amplifier:hideParticles", @@ -344,6 +563,45 @@ "execute:clone:begin:end:destination:replace:force", "execute:clone:begin:end:destination:replace:move", "execute:clone:begin:end:destination:replace:normal", + "execute:clone:begin:end:to:targetDimension:destination", + "execute:clone:begin:end:to:targetDimension:destination:filtered:filter", + "execute:clone:begin:end:to:targetDimension:destination:filtered:filter:force", + "execute:clone:begin:end:to:targetDimension:destination:filtered:filter:move", + "execute:clone:begin:end:to:targetDimension:destination:filtered:filter:normal", + "execute:clone:begin:end:to:targetDimension:destination:masked", + "execute:clone:begin:end:to:targetDimension:destination:masked:force", + "execute:clone:begin:end:to:targetDimension:destination:masked:move", + "execute:clone:begin:end:to:targetDimension:destination:masked:normal", + "execute:clone:begin:end:to:targetDimension:destination:replace", + "execute:clone:begin:end:to:targetDimension:destination:replace:force", + "execute:clone:begin:end:to:targetDimension:destination:replace:move", + "execute:clone:begin:end:to:targetDimension:destination:replace:normal", + "execute:clone:from:sourceDimension:begin:end:destination", + "execute:clone:from:sourceDimension:begin:end:destination:filtered:filter", + "execute:clone:from:sourceDimension:begin:end:destination:filtered:filter:force", + "execute:clone:from:sourceDimension:begin:end:destination:filtered:filter:move", + "execute:clone:from:sourceDimension:begin:end:destination:filtered:filter:normal", + "execute:clone:from:sourceDimension:begin:end:destination:masked", + "execute:clone:from:sourceDimension:begin:end:destination:masked:force", + "execute:clone:from:sourceDimension:begin:end:destination:masked:move", + "execute:clone:from:sourceDimension:begin:end:destination:masked:normal", + "execute:clone:from:sourceDimension:begin:end:destination:replace", + "execute:clone:from:sourceDimension:begin:end:destination:replace:force", + "execute:clone:from:sourceDimension:begin:end:destination:replace:move", + "execute:clone:from:sourceDimension:begin:end:destination:replace:normal", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:force", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:move", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:filtered:filter:normal", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:force", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:move", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked:normal", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:force", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:move", + "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:normal", "execute:commands", "execute:data:get:block:targetPos", "execute:data:get:block:targetPos:path", @@ -363,6 +621,18 @@ "execute:data:modify:block:targetPos:targetPath:append:from:entity:source:sourcePath", "execute:data:modify:block:targetPos:targetPath:append:from:storage:source", "execute:data:modify:block:targetPos:targetPath:append:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:string:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:append:string:entity:source", + "execute:data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:append:string:entity:source:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:append:string:storage:source", + "execute:data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:append:string:storage:source:sourcePath:start:end", "execute:data:modify:block:targetPos:targetPath:append:value:value", "execute:data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos", "execute:data:modify:block:targetPos:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -370,6 +640,18 @@ "execute:data:modify:block:targetPos:targetPath:insert:index:from:entity:source:sourcePath", "execute:data:modify:block:targetPos:targetPath:insert:index:from:storage:source", "execute:data:modify:block:targetPos:targetPath:insert:index:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:entity:source", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:storage:source", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start:end", "execute:data:modify:block:targetPos:targetPath:insert:index:value:value", "execute:data:modify:block:targetPos:targetPath:merge:from:block:sourcePos", "execute:data:modify:block:targetPos:targetPath:merge:from:block:sourcePos:sourcePath", @@ -377,6 +659,18 @@ "execute:data:modify:block:targetPos:targetPath:merge:from:entity:source:sourcePath", "execute:data:modify:block:targetPos:targetPath:merge:from:storage:source", "execute:data:modify:block:targetPos:targetPath:merge:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:string:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:merge:string:entity:source", + "execute:data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:merge:string:entity:source:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:merge:string:storage:source", + "execute:data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start:end", "execute:data:modify:block:targetPos:targetPath:merge:value:value", "execute:data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos", "execute:data:modify:block:targetPos:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -384,6 +678,18 @@ "execute:data:modify:block:targetPos:targetPath:prepend:from:entity:source:sourcePath", "execute:data:modify:block:targetPos:targetPath:prepend:from:storage:source", "execute:data:modify:block:targetPos:targetPath:prepend:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:prepend:string:entity:source", + "execute:data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:prepend:string:storage:source", + "execute:data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:prepend:string:storage:source:sourcePath:start:end", "execute:data:modify:block:targetPos:targetPath:prepend:value:value", "execute:data:modify:block:targetPos:targetPath:set:from:block:sourcePos", "execute:data:modify:block:targetPos:targetPath:set:from:block:sourcePos:sourcePath", @@ -391,6 +697,18 @@ "execute:data:modify:block:targetPos:targetPath:set:from:entity:source:sourcePath", "execute:data:modify:block:targetPos:targetPath:set:from:storage:source", "execute:data:modify:block:targetPos:targetPath:set:from:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:string:block:sourcePos", + "execute:data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:set:string:entity:source", + "execute:data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:set:string:entity:source:sourcePath:start:end", + "execute:data:modify:block:targetPos:targetPath:set:string:storage:source", + "execute:data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath", + "execute:data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start", + "execute:data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start:end", "execute:data:modify:block:targetPos:targetPath:set:value:value", "execute:data:modify:entity:target:targetPath:append:from:block:sourcePos", "execute:data:modify:entity:target:targetPath:append:from:block:sourcePos:sourcePath", @@ -398,6 +716,18 @@ "execute:data:modify:entity:target:targetPath:append:from:entity:source:sourcePath", "execute:data:modify:entity:target:targetPath:append:from:storage:source", "execute:data:modify:entity:target:targetPath:append:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:append:string:block:sourcePos", + "execute:data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath:start", + "execute:data:modify:entity:target:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:append:string:entity:source", + "execute:data:modify:entity:target:targetPath:append:string:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:append:string:entity:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:append:string:entity:source:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:append:string:storage:source", + "execute:data:modify:entity:target:targetPath:append:string:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:append:string:storage:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:append:string:storage:source:sourcePath:start:end", "execute:data:modify:entity:target:targetPath:append:value:value", "execute:data:modify:entity:target:targetPath:insert:index:from:block:sourcePos", "execute:data:modify:entity:target:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -405,6 +735,18 @@ "execute:data:modify:entity:target:targetPath:insert:index:from:entity:source:sourcePath", "execute:data:modify:entity:target:targetPath:insert:index:from:storage:source", "execute:data:modify:entity:target:targetPath:insert:index:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:string:block:sourcePos", + "execute:data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "execute:data:modify:entity:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:insert:index:string:entity:source", + "execute:data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:insert:index:string:storage:source", + "execute:data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:insert:index:string:storage:source:sourcePath:start:end", "execute:data:modify:entity:target:targetPath:insert:index:value:value", "execute:data:modify:entity:target:targetPath:merge:from:block:sourcePos", "execute:data:modify:entity:target:targetPath:merge:from:block:sourcePos:sourcePath", @@ -412,6 +754,18 @@ "execute:data:modify:entity:target:targetPath:merge:from:entity:source:sourcePath", "execute:data:modify:entity:target:targetPath:merge:from:storage:source", "execute:data:modify:entity:target:targetPath:merge:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:string:block:sourcePos", + "execute:data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath:start", + "execute:data:modify:entity:target:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:merge:string:entity:source", + "execute:data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:merge:string:entity:source:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:merge:string:storage:source", + "execute:data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:merge:string:storage:source:sourcePath:start:end", "execute:data:modify:entity:target:targetPath:merge:value:value", "execute:data:modify:entity:target:targetPath:prepend:from:block:sourcePos", "execute:data:modify:entity:target:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -419,6 +773,18 @@ "execute:data:modify:entity:target:targetPath:prepend:from:entity:source:sourcePath", "execute:data:modify:entity:target:targetPath:prepend:from:storage:source", "execute:data:modify:entity:target:targetPath:prepend:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:string:block:sourcePos", + "execute:data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "execute:data:modify:entity:target:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:prepend:string:entity:source", + "execute:data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:prepend:string:entity:source:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:prepend:string:storage:source", + "execute:data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:prepend:string:storage:source:sourcePath:start:end", "execute:data:modify:entity:target:targetPath:prepend:value:value", "execute:data:modify:entity:target:targetPath:set:from:block:sourcePos", "execute:data:modify:entity:target:targetPath:set:from:block:sourcePos:sourcePath", @@ -426,6 +792,18 @@ "execute:data:modify:entity:target:targetPath:set:from:entity:source:sourcePath", "execute:data:modify:entity:target:targetPath:set:from:storage:source", "execute:data:modify:entity:target:targetPath:set:from:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:set:string:block:sourcePos", + "execute:data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath", + "execute:data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath:start", + "execute:data:modify:entity:target:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:set:string:entity:source", + "execute:data:modify:entity:target:targetPath:set:string:entity:source:sourcePath", + "execute:data:modify:entity:target:targetPath:set:string:entity:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:set:string:entity:source:sourcePath:start:end", + "execute:data:modify:entity:target:targetPath:set:string:storage:source", + "execute:data:modify:entity:target:targetPath:set:string:storage:source:sourcePath", + "execute:data:modify:entity:target:targetPath:set:string:storage:source:sourcePath:start", + "execute:data:modify:entity:target:targetPath:set:string:storage:source:sourcePath:start:end", "execute:data:modify:entity:target:targetPath:set:value:value", "execute:data:modify:storage:target:targetPath:append:from:block:sourcePos", "execute:data:modify:storage:target:targetPath:append:from:block:sourcePos:sourcePath", @@ -433,6 +811,18 @@ "execute:data:modify:storage:target:targetPath:append:from:entity:source:sourcePath", "execute:data:modify:storage:target:targetPath:append:from:storage:source", "execute:data:modify:storage:target:targetPath:append:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:append:string:block:sourcePos", + "execute:data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath:start", + "execute:data:modify:storage:target:targetPath:append:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:append:string:entity:source", + "execute:data:modify:storage:target:targetPath:append:string:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:append:string:entity:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:append:string:entity:source:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:append:string:storage:source", + "execute:data:modify:storage:target:targetPath:append:string:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:append:string:storage:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:append:string:storage:source:sourcePath:start:end", "execute:data:modify:storage:target:targetPath:append:value:value", "execute:data:modify:storage:target:targetPath:insert:index:from:block:sourcePos", "execute:data:modify:storage:target:targetPath:insert:index:from:block:sourcePos:sourcePath", @@ -440,6 +830,18 @@ "execute:data:modify:storage:target:targetPath:insert:index:from:entity:source:sourcePath", "execute:data:modify:storage:target:targetPath:insert:index:from:storage:source", "execute:data:modify:storage:target:targetPath:insert:index:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:string:block:sourcePos", + "execute:data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start", + "execute:data:modify:storage:target:targetPath:insert:index:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:insert:index:string:entity:source", + "execute:data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:insert:index:string:entity:source:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:insert:index:string:storage:source", + "execute:data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:insert:index:string:storage:source:sourcePath:start:end", "execute:data:modify:storage:target:targetPath:insert:index:value:value", "execute:data:modify:storage:target:targetPath:merge:from:block:sourcePos", "execute:data:modify:storage:target:targetPath:merge:from:block:sourcePos:sourcePath", @@ -447,6 +849,18 @@ "execute:data:modify:storage:target:targetPath:merge:from:entity:source:sourcePath", "execute:data:modify:storage:target:targetPath:merge:from:storage:source", "execute:data:modify:storage:target:targetPath:merge:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:string:block:sourcePos", + "execute:data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath:start", + "execute:data:modify:storage:target:targetPath:merge:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:merge:string:entity:source", + "execute:data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:merge:string:entity:source:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:merge:string:storage:source", + "execute:data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:merge:string:storage:source:sourcePath:start:end", "execute:data:modify:storage:target:targetPath:merge:value:value", "execute:data:modify:storage:target:targetPath:prepend:from:block:sourcePos", "execute:data:modify:storage:target:targetPath:prepend:from:block:sourcePos:sourcePath", @@ -454,6 +868,18 @@ "execute:data:modify:storage:target:targetPath:prepend:from:entity:source:sourcePath", "execute:data:modify:storage:target:targetPath:prepend:from:storage:source", "execute:data:modify:storage:target:targetPath:prepend:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:string:block:sourcePos", + "execute:data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath:start", + "execute:data:modify:storage:target:targetPath:prepend:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:prepend:string:entity:source", + "execute:data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:prepend:string:entity:source:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:prepend:string:storage:source", + "execute:data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:prepend:string:storage:source:sourcePath:start:end", "execute:data:modify:storage:target:targetPath:prepend:value:value", "execute:data:modify:storage:target:targetPath:set:from:block:sourcePos", "execute:data:modify:storage:target:targetPath:set:from:block:sourcePos:sourcePath", @@ -461,6 +887,18 @@ "execute:data:modify:storage:target:targetPath:set:from:entity:source:sourcePath", "execute:data:modify:storage:target:targetPath:set:from:storage:source", "execute:data:modify:storage:target:targetPath:set:from:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:set:string:block:sourcePos", + "execute:data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath", + "execute:data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath:start", + "execute:data:modify:storage:target:targetPath:set:string:block:sourcePos:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:set:string:entity:source", + "execute:data:modify:storage:target:targetPath:set:string:entity:source:sourcePath", + "execute:data:modify:storage:target:targetPath:set:string:entity:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:set:string:entity:source:sourcePath:start:end", + "execute:data:modify:storage:target:targetPath:set:string:storage:source", + "execute:data:modify:storage:target:targetPath:set:string:storage:source:sourcePath", + "execute:data:modify:storage:target:targetPath:set:string:storage:source:sourcePath:start", + "execute:data:modify:storage:target:targetPath:set:string:storage:source:sourcePath:start:end", "execute:data:modify:storage:target:targetPath:set:value:value", "execute:data:remove:block:targetPos:path", "execute:data:remove:entity:target:path", @@ -477,10 +915,7 @@ "execute:debug:function:name", "execute:debug:start", "execute:debug:stop", - "execute:defaultgamemode:adventure", - "execute:defaultgamemode:creative", - "execute:defaultgamemode:spectator", - "execute:defaultgamemode:survival", + "execute:defaultgamemode:gamemode", "execute:deop:targets", "execute:difficulty:easy", "execute:difficulty:hard", @@ -492,6 +927,9 @@ "execute:effect:clear:targets", "execute:effect:clear:targets:effect", "execute:effect:give:targets:effect", + "execute:effect:give:targets:effect:infinite", + "execute:effect:give:targets:effect:infinite:amplifier", + "execute:effect:give:targets:effect:infinite:amplifier:hideParticles", "execute:effect:give:targets:effect:seconds", "execute:effect:give:targets:effect:seconds:amplifier", "execute:effect:give:targets:effect:seconds:amplifier:hideParticles", @@ -516,6 +954,8 @@ "execute:fill:from:to:block:outline", "execute:fill:from:to:block:replace", "execute:fill:from:to:block:replace:filter", + "execute:fillbiome:from:to:biome", + "execute:fillbiome:from:to:biome:replace:filter", "execute:fluid_tag:name:content", "execute:font:name:content", "execute:forceload:add:from", @@ -529,18 +969,16 @@ "execute:function:name:commands", "execute:function_tag:name:content", "execute:game_event_tag:name:content", - "execute:gamemode:adventure", - "execute:gamemode:adventure:target", - "execute:gamemode:creative", - "execute:gamemode:creative:target", - "execute:gamemode:spectator", - "execute:gamemode:spectator:target", - "execute:gamemode:survival", - "execute:gamemode:survival:target", + "execute:gamemode:gamemode", + "execute:gamemode:gamemode:target", "execute:gamerule:announceAdvancements", "execute:gamerule:announceAdvancements:value", + "execute:gamerule:blockExplosionDropDecay", + "execute:gamerule:blockExplosionDropDecay:value", "execute:gamerule:commandBlockOutput", "execute:gamerule:commandBlockOutput:value", + "execute:gamerule:commandModificationBlockLimit", + "execute:gamerule:commandModificationBlockLimit:value", "execute:gamerule:disableElytraMovementCheck", "execute:gamerule:disableElytraMovementCheck:value", "execute:gamerule:disableRaids", @@ -581,14 +1019,20 @@ "execute:gamerule:forgiveDeadPlayers:value", "execute:gamerule:freezeDamage", "execute:gamerule:freezeDamage:value", + "execute:gamerule:globalSoundEvents", + "execute:gamerule:globalSoundEvents:value", "execute:gamerule:keepInventory", "execute:gamerule:keepInventory:value", + "execute:gamerule:lavaSourceConversion", + "execute:gamerule:lavaSourceConversion:value", "execute:gamerule:logAdminCommands", "execute:gamerule:logAdminCommands:value", "execute:gamerule:maxCommandChainLength", "execute:gamerule:maxCommandChainLength:value", "execute:gamerule:maxEntityCramming", "execute:gamerule:maxEntityCramming:value", + "execute:gamerule:mobExplosionDropDecay", + "execute:gamerule:mobExplosionDropDecay:value", "execute:gamerule:mobGriefing", "execute:gamerule:mobGriefing:value", "execute:gamerule:naturalRegeneration", @@ -603,15 +1047,23 @@ "execute:gamerule:sendCommandFeedback:value", "execute:gamerule:showDeathMessages", "execute:gamerule:showDeathMessages:value", + "execute:gamerule:snowAccumulationHeight", + "execute:gamerule:snowAccumulationHeight:value", "execute:gamerule:spawnRadius", "execute:gamerule:spawnRadius:value", "execute:gamerule:spectatorsGenerateChunks", "execute:gamerule:spectatorsGenerateChunks:value", + "execute:gamerule:tntExplosionDropDecay", + "execute:gamerule:tntExplosionDropDecay:value", "execute:gamerule:universalAnger", "execute:gamerule:universalAnger:value", + "execute:gamerule:waterSourceConversion", + "execute:gamerule:waterSourceConversion:value", "execute:give:targets:item", "execute:give:targets:item:count", "execute:help:command", + "execute:if:biome:pos:biome", + "execute:if:biome:pos:biome:subcommand", "execute:if:block:pos:block", "execute:if:block:pos:block:subcommand", "execute:if:blocks:start:end:destination:all", @@ -624,8 +1076,11 @@ "execute:if:data:entity:source:path:subcommand", "execute:if:data:storage:source:path", "execute:if:data:storage:source:path:subcommand", + "execute:if:dimension:dimension", + "execute:if:dimension:dimension:subcommand", "execute:if:entity:entities", "execute:if:entity:entities:subcommand", + "execute:if:loaded:pos:subcommand", "execute:if:predicate:predicate", "execute:if:predicate:predicate:subcommand", "execute:if:score:target:targetObjective:<:source:sourceObjective", @@ -780,6 +1235,14 @@ "execute:merge:worldgen_template_pool:name:content", "execute:model:name:content", "execute:msg:targets:message", + "execute:on:attacker:subcommand", + "execute:on:controller:subcommand", + "execute:on:leasher:subcommand", + "execute:on:origin:subcommand", + "execute:on:owner:subcommand", + "execute:on:passengers:subcommand", + "execute:on:target:subcommand", + "execute:on:vehicle:subcommand", "execute:op:targets", "execute:pardon-ip:target", "execute:pardon:targets", @@ -870,13 +1333,17 @@ "execute:prepend:worldgen_placed_feature_tag:name:content", "execute:prepend:worldgen_structure_set_tag:name:content", "execute:prepend:worldgen_structure_tag:name:content", - "execute:publish:port", + "execute:publish:allowCommands", + "execute:publish:allowCommands:gamemode", + "execute:publish:allowCommands:gamemode:port", "execute:raw:value", "execute:recipe:give:targets:*", "execute:recipe:give:targets:recipe", "execute:recipe:name:content", "execute:recipe:take:targets:*", "execute:recipe:take:targets:recipe", + "execute:ride:target:dismount", + "execute:ride:target:mount:vehicle", "execute:rotated:as:targets:subcommand", "execute:rotated:rot:subcommand", "execute:run:subcommand", @@ -1061,6 +1528,8 @@ "execute:trigger:objective", "execute:trigger:objective:add:value", "execute:trigger:objective:set:value", + "execute:unless:biome:pos:biome", + "execute:unless:biome:pos:biome:subcommand", "execute:unless:block:pos:block", "execute:unless:block:pos:block:subcommand", "execute:unless:blocks:start:end:destination:all", @@ -1073,8 +1542,11 @@ "execute:unless:data:entity:source:path:subcommand", "execute:unless:data:storage:source:path", "execute:unless:data:storage:source:path:subcommand", + "execute:unless:dimension:dimension", + "execute:unless:dimension:dimension:subcommand", "execute:unless:entity:entities", "execute:unless:entity:entities:subcommand", + "execute:unless:loaded:pos:subcommand", "execute:unless:predicate:predicate", "execute:unless:predicate:predicate:subcommand", "execute:unless:score:target:targetObjective:<:source:sourceObjective", @@ -1155,6 +1627,8 @@ "fill:from:to:block:outline", "fill:from:to:block:replace", "fill:from:to:block:replace:filter", + "fillbiome:from:to:biome", + "fillbiome:from:to:biome:replace:filter", "fluid_tag:name:content", "font:name:content", "for:target:in:iterable:body", @@ -1172,18 +1646,16 @@ "function:name:commands", "function_tag:name:content", "game_event_tag:name:content", - "gamemode:adventure", - "gamemode:adventure:target", - "gamemode:creative", - "gamemode:creative:target", - "gamemode:spectator", - "gamemode:spectator:target", - "gamemode:survival", - "gamemode:survival:target", + "gamemode:gamemode", + "gamemode:gamemode:target", "gamerule:announceAdvancements", "gamerule:announceAdvancements:value", + "gamerule:blockExplosionDropDecay", + "gamerule:blockExplosionDropDecay:value", "gamerule:commandBlockOutput", "gamerule:commandBlockOutput:value", + "gamerule:commandModificationBlockLimit", + "gamerule:commandModificationBlockLimit:value", "gamerule:disableElytraMovementCheck", "gamerule:disableElytraMovementCheck:value", "gamerule:disableRaids", @@ -1224,14 +1696,20 @@ "gamerule:forgiveDeadPlayers:value", "gamerule:freezeDamage", "gamerule:freezeDamage:value", + "gamerule:globalSoundEvents", + "gamerule:globalSoundEvents:value", "gamerule:keepInventory", "gamerule:keepInventory:value", + "gamerule:lavaSourceConversion", + "gamerule:lavaSourceConversion:value", "gamerule:logAdminCommands", "gamerule:logAdminCommands:value", "gamerule:maxCommandChainLength", "gamerule:maxCommandChainLength:value", "gamerule:maxEntityCramming", "gamerule:maxEntityCramming:value", + "gamerule:mobExplosionDropDecay", + "gamerule:mobExplosionDropDecay:value", "gamerule:mobGriefing", "gamerule:mobGriefing:value", "gamerule:naturalRegeneration", @@ -1246,12 +1724,18 @@ "gamerule:sendCommandFeedback:value", "gamerule:showDeathMessages", "gamerule:showDeathMessages:value", + "gamerule:snowAccumulationHeight", + "gamerule:snowAccumulationHeight:value", "gamerule:spawnRadius", "gamerule:spawnRadius:value", "gamerule:spectatorsGenerateChunks", "gamerule:spectatorsGenerateChunks:value", + "gamerule:tntExplosionDropDecay", + "gamerule:tntExplosionDropDecay:value", "gamerule:universalAnger", "gamerule:universalAnger:value", + "gamerule:waterSourceConversion", + "gamerule:waterSourceConversion:value", "give:targets:item", "give:targets:item:count", "global:name", @@ -1259,6 +1743,8 @@ "global:subcommand", "help", "help:command", + "if:biome:pos:biome", + "if:biome:pos:biome:subcommand", "if:block:pos:block", "if:block:pos:block:subcommand", "if:blocks:start:end:destination:all", @@ -1272,8 +1758,11 @@ "if:data:entity:source:path:subcommand", "if:data:storage:source:path", "if:data:storage:source:path:subcommand", + "if:dimension:dimension", + "if:dimension:dimension:subcommand", "if:entity:entities", "if:entity:entities:subcommand", + "if:loaded:pos:subcommand", "if:predicate:predicate", "if:predicate:predicate:subcommand", "if:score:target:targetObjective:<:source:sourceObjective", @@ -1442,6 +1931,14 @@ "nonlocal:name", "nonlocal:name:subcommand", "nonlocal:subcommand", + "on:attacker:subcommand", + "on:controller:subcommand", + "on:leasher:subcommand", + "on:origin:subcommand", + "on:owner:subcommand", + "on:passengers:subcommand", + "on:target:subcommand", + "on:vehicle:subcommand", "op:targets", "pardon-ip:target", "pardon:targets", @@ -1534,7 +2031,9 @@ "prepend:worldgen_structure_set_tag:name:content", "prepend:worldgen_structure_tag:name:content", "publish", - "publish:port", + "publish:allowCommands", + "publish:allowCommands:gamemode", + "publish:allowCommands:gamemode:port", "raise", "raise:exception", "raise:exception:from:cause", @@ -1547,6 +2046,8 @@ "reload", "return", "return:value", + "ride:target:dismount", + "ride:target:mount:vehicle", "rotated:as:targets:subcommand", "rotated:rot:subcommand", "save-all", @@ -1738,6 +2239,8 @@ "trigger:objective", "trigger:objective:add:value", "trigger:objective:set:value", + "unless:biome:pos:biome", + "unless:biome:pos:biome:subcommand", "unless:block:pos:block", "unless:block:pos:block:subcommand", "unless:blocks:start:end:destination:all", @@ -1750,8 +2253,11 @@ "unless:data:entity:source:path:subcommand", "unless:data:storage:source:path", "unless:data:storage:source:path:subcommand", + "unless:dimension:dimension", + "unless:dimension:dimension:subcommand", "unless:entity:entities", "unless:entity:entities:subcommand", + "unless:loaded:pos:subcommand", "unless:predicate:predicate", "unless:predicate:predicate:subcommand", "unless:score:target:targetObjective:<:source:sourceObjective", From 203da263010b130b29b26771779f1ecf2de1dd3c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 6 Feb 2023 23:52:45 +0000 Subject: [PATCH 1135/1554] 0.29.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index db0561624..5548d5def 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.29.0 (2023-02-06) +### Feature +* Update 1.19 ([`0a8ca58`](https://github.com/mcbeet/bolt/commit/0a8ca580f4e3b155154fd8714ddb6ccc4c13121f)) + ## v0.28.0 (2023-02-05) ### Feature * Error when using unsupported statements in memo ([`e57c845`](https://github.com/mcbeet/bolt/commit/e57c845f28cd40669ace582dcb2f404cf384582d)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 095753d97..e91c9fc88 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.28.0" +__version__ = "0.29.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 47324911a..e2c882d2a 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.28.0" +version = "0.29.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 73506efb9a545c5553723bff904af6f842383d9d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 8 Feb 2023 19:06:18 +0100 Subject: [PATCH 1136/1554] feat: update command tree --- .../src/data/demo/functions/foo.mcfunction | 12 +++ .../functions/implicit_execute.mcfunction | 2 +- packages/mecha/mecha/resources/1_19.json | 101 ++++++++++++++++++ ...s__build_basic_implicit_execute__0.pack.md | 8 ++ .../tests/snapshots/spec__prototypes__0.json | 10 ++ 5 files changed, 132 insertions(+), 1 deletion(-) diff --git a/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction index 0507ddfa7..2b538f09f 100644 --- a/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction +++ b/packages/mecha/examples/basic_implicit_execute/src/data/demo/functions/foo.mcfunction @@ -9,3 +9,15 @@ as @a at @s setblock ~ ~ ~ stone execute store result score PLAYER_COUNT global if entity @a store result score PLAYER_COUNT global if entity @a + +summon pig +summon pig ~ ~ ~ {Fire:120s} +execute summon pig data merge entity @s {Fire:120s} +execute summon pig: + data merge entity @s {Fire:120s} + +at @a run summon pig +at @a run summon pig ~ ~ ~ {Fire:120s} +at @a summon pig data merge entity @s {Fire:120s} +at @a summon pig: + data merge entity @s {Fire:120s} diff --git a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction index 52969db42..0c8e335a7 100644 --- a/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction +++ b/packages/mecha/examples/kitchen_sink/src/data/demo/functions/implicit_execute.mcfunction @@ -1,5 +1,5 @@ as @a at @s align xyz - summon armor_stand ~ ~ ~ { + run summon armor_stand ~ ~ ~ { Tags: [ "position_history", "new" diff --git a/packages/mecha/mecha/resources/1_19.json b/packages/mecha/mecha/resources/1_19.json index c5e8c2012..a036a3b21 100644 --- a/packages/mecha/mecha/resources/1_19.json +++ b/packages/mecha/mecha/resources/1_19.json @@ -885,6 +885,81 @@ } } }, + "damage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "amount": { + "type": "argument", + "children": { + "damageType": { + "type": "argument", + "children": { + "at": { + "type": "literal", + "children": { + "location": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec3" + } + } + }, + "by": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "cause": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:damage_type" + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, "data": { "type": "literal", "children": { @@ -4616,6 +4691,7 @@ "children": { "pos": { "type": "argument", + "executable": true, "parser": "minecraft:block_pos", "redirect": ["execute"] } @@ -5424,6 +5500,19 @@ } } }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:entity_type" + }, + "redirect": ["execute"] + } + } + }, "unless": { "type": "literal", "children": { @@ -5588,6 +5677,7 @@ "children": { "pos": { "type": "argument", + "executable": true, "parser": "minecraft:block_pos", "redirect": ["execute"] } @@ -6196,6 +6286,17 @@ }, "executable": true }, + "doVinesSpread": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, "doWardenSpawning": { "type": "literal", "children": { diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md index d71d091f8..bc879da68 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -28,4 +28,12 @@ execute if score @p tmp matches 1 run say hello execute as @a at @s run setblock ~ ~ ~ stone execute store result score PLAYER_COUNT global if entity @a execute store result score PLAYER_COUNT global if entity @a +summon pig +summon pig ~ ~ ~ {Fire: 120s} +execute summon pig run data merge entity @s {Fire: 120s} +execute summon pig run data merge entity @s {Fire: 120s} +execute at @a run summon pig +execute at @a run summon pig ~ ~ ~ {Fire: 120s} +execute at @a summon pig run data merge entity @s {Fire: 120s} +execute at @a summon pig run data merge entity @s {Fire: 120s} ``` diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json index a3d9f43af..640cbc421 100644 --- a/packages/mecha/tests/snapshots/spec__prototypes__0.json +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -110,6 +110,11 @@ "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:force", "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:move", "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:normal", + "damage:target:amount", + "damage:target:amount:damageType", + "damage:target:amount:damageType:at:location", + "damage:target:amount:damageType:by:entity", + "damage:target:amount:damageType:by:entity:from:cause", "data:get:block:targetPos", "data:get:block:targetPos:path", "data:get:block:targetPos:path:scale", @@ -466,6 +471,7 @@ "execute:if:dimension:dimension:subcommand", "execute:if:entity:entities", "execute:if:entity:entities:subcommand", + "execute:if:loaded:pos", "execute:if:loaded:pos:subcommand", "execute:if:predicate:predicate", "execute:if:predicate:predicate:subcommand", @@ -537,6 +543,7 @@ "execute:store:success:storage:target:path:int:scale:subcommand", "execute:store:success:storage:target:path:long:scale:subcommand", "execute:store:success:storage:target:path:short:scale:subcommand", + "execute:summon:entity:subcommand", "execute:unless:biome:pos:biome", "execute:unless:biome:pos:biome:subcommand", "execute:unless:block:pos:block", @@ -555,6 +562,7 @@ "execute:unless:dimension:dimension:subcommand", "execute:unless:entity:entities", "execute:unless:entity:entities:subcommand", + "execute:unless:loaded:pos", "execute:unless:loaded:pos:subcommand", "execute:unless:predicate:predicate", "execute:unless:predicate:predicate:subcommand", @@ -631,6 +639,8 @@ "gamerule:doTileDrops:value", "gamerule:doTraderSpawning", "gamerule:doTraderSpawning:value", + "gamerule:doVinesSpread", + "gamerule:doVinesSpread:value", "gamerule:doWardenSpawning", "gamerule:doWardenSpawning:value", "gamerule:doWeatherCycle", From a24748e364fee1d62550a67e258f0a2db857d735 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Feb 2023 18:06:58 +0000 Subject: [PATCH 1137/1554] 0.67.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 2ca7c632f..e2f7f908c 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.67.0 (2023-02-08) +### Feature +* Update command tree ([`c74062a`](https://github.com/mcbeet/mecha/commit/c74062adb614cc1266be1d90137bfccf39f1483b)) + ## v0.66.0 (2023-02-06) ### Feature * Update 1.19 ([`ab74039`](https://github.com/mcbeet/mecha/commit/ab7403976be1f0185d0b346103bd5bb6eb837d67)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 61dc37026..5b5646a21 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.66.0" +__version__ = "0.67.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 1b3d61f0d..c5e18c095 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.66.0" +version = "0.67.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 7f71ddcd64b936207bea7c9bc77a723c23256d8f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 8 Feb 2023 23:00:44 +0100 Subject: [PATCH 1138/1554] test: new command examples --- .../resources/command_examples.mcfunction | 33 + .../snapshots/parse__command_examples__0.txt | 1218 ++++++++++++++++- .../snapshots/parse__command_examples__1.txt | 32 + 3 files changed, 1281 insertions(+), 2 deletions(-) diff --git a/packages/mecha/tests/resources/command_examples.mcfunction b/packages/mecha/tests/resources/command_examples.mcfunction index 152fef44b..1fae980b7 100644 --- a/packages/mecha/tests/resources/command_examples.mcfunction +++ b/packages/mecha/tests/resources/command_examples.mcfunction @@ -154,3 +154,36 @@ place template minecraft:fossil/spine_1 ~ ~ ~ 180 place template minecraft:fossil/spine_1 ~ ~ ~ clockwise_90 left_right place template minecraft:fossil/spine_1 ~ ~ ~ none front_back 0.5 place template minecraft:fossil/spine_1 ~ ~ ~ counterclockwise_90 none 0.6 42 +# 23w06a +execute on vehicle at @s if loaded ~10 ~ ~ run tp @s ~10 ~ ~ +execute if biome ~10 ~ ~ minecraft:plains run say ok +execute if dimension minecraft:overworld run say ok +execute unless loaded ~ ~ ~ run say ok +execute unless biome ~10 ~ ~ minecraft:forest run say ok +execute unless dimension minecraft:overworld run say ok +fillbiome ~ ~ ~ ~16 ~16 ~16 minecraft:deep_dark +gamemode survival @a +gamerule blockExplosionDropDecay true +gamerule commandModificationBlockLimit 1000 +gamerule globalSoundEvents false +gamerule lavaSourceConversion true +gamerule mobExplosionDropDecay true +gamerule snowAccumulationHeight 10 +gamerule tntExplosionDropDecay true +gamerule waterSourceConversion true +clone ~ ~ ~ ~10 ~10 ~10 0 0 0 masked +clone from overworld ~ ~ ~ ~10 ~10 ~10 0 0 0 masked +clone ~ ~ ~ ~10 ~10 ~10 to nether 0 0 0 masked +clone from overworld ~ ~ ~ ~10 ~10 ~10 to nether 0 0 0 masked +data modify block ~ ~ ~ Name set string storage test:main value 0 1 +data modify block ~ ~ ~ Name append string block ~ ~1 ~ value 0 1 +data modify block ~ ~ ~ Name prepend string entity @s EntityName 0 1 +data modify block ~ ~ ~ Name insert 0 string storage test:main value 0 1 +data modify block ~ ~ ~ Name merge string storage test:main value 0 1 +title @s times 0.5s 10t 1d +weather clear 10t +weather rain 0.235s +weather thunder 1d +ride @s mount @e[type=pig,limit=1,sort=nearest] +ride @s dismount +execute if score @s abc matches 0 run ride @s dismount diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index a8868f844..199e5bcf0 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=6669, lineno=157, colno=1) + end_location: SourceLocation(pos=8106, lineno=190, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -5813,4 +5813,1218 @@ location: SourceLocation(pos=6666, lineno=156, colno=76) end_location: SourceLocation(pos=6668, lineno=156, colno=78) - value: 42 \ No newline at end of file + value: 42 + + location: SourceLocation(pos=6678, lineno=158, colno=1) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6686, lineno=158, colno=9) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + identifier: 'execute:on:vehicle:subcommand' + arguments: + + location: SourceLocation(pos=6697, lineno=158, colno=20) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + identifier: 'execute:at:targets:subcommand' + arguments: + + location: SourceLocation(pos=6700, lineno=158, colno=23) + end_location: SourceLocation(pos=6702, lineno=158, colno=25) + variable: 's' + arguments: + + + location: SourceLocation(pos=6703, lineno=158, colno=26) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + identifier: 'execute:if:loaded:pos:subcommand' + arguments: + + location: SourceLocation(pos=6713, lineno=158, colno=36) + end_location: SourceLocation(pos=6720, lineno=158, colno=43) + x: + + location: SourceLocation(pos=6713, lineno=158, colno=36) + end_location: SourceLocation(pos=6716, lineno=158, colno=39) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=6717, lineno=158, colno=40) + end_location: SourceLocation(pos=6718, lineno=158, colno=41) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6719, lineno=158, colno=42) + end_location: SourceLocation(pos=6720, lineno=158, colno=43) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6721, lineno=158, colno=44) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6725, lineno=158, colno=48) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + identifier: 'tp:targets:location' + arguments: + + location: SourceLocation(pos=6728, lineno=158, colno=51) + end_location: SourceLocation(pos=6730, lineno=158, colno=53) + variable: 's' + arguments: + + + location: SourceLocation(pos=6731, lineno=158, colno=54) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + x: + + location: SourceLocation(pos=6731, lineno=158, colno=54) + end_location: SourceLocation(pos=6734, lineno=158, colno=57) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=6735, lineno=158, colno=58) + end_location: SourceLocation(pos=6736, lineno=158, colno=59) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6737, lineno=158, colno=60) + end_location: SourceLocation(pos=6738, lineno=158, colno=61) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6739, lineno=159, colno=1) + end_location: SourceLocation(pos=6791, lineno=159, colno=53) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6747, lineno=159, colno=9) + end_location: SourceLocation(pos=6791, lineno=159, colno=53) + identifier: 'execute:if:biome:pos:biome:subcommand' + arguments: + + location: SourceLocation(pos=6756, lineno=159, colno=18) + end_location: SourceLocation(pos=6763, lineno=159, colno=25) + x: + + location: SourceLocation(pos=6756, lineno=159, colno=18) + end_location: SourceLocation(pos=6759, lineno=159, colno=21) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=6760, lineno=159, colno=22) + end_location: SourceLocation(pos=6761, lineno=159, colno=23) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6762, lineno=159, colno=24) + end_location: SourceLocation(pos=6763, lineno=159, colno=25) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6764, lineno=159, colno=26) + end_location: SourceLocation(pos=6780, lineno=159, colno=42) + is_tag: False + namespace: 'minecraft' + path: 'plains' + + location: SourceLocation(pos=6781, lineno=159, colno=43) + end_location: SourceLocation(pos=6791, lineno=159, colno=53) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6785, lineno=159, colno=47) + end_location: SourceLocation(pos=6791, lineno=159, colno=53) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=6789, lineno=159, colno=51) + end_location: SourceLocation(pos=6791, lineno=159, colno=53) + fragments: + + location: SourceLocation(pos=6789, lineno=159, colno=51) + end_location: SourceLocation(pos=6791, lineno=159, colno=53) + value: 'ok' + + location: SourceLocation(pos=6792, lineno=160, colno=1) + end_location: SourceLocation(pos=6843, lineno=160, colno=52) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6800, lineno=160, colno=9) + end_location: SourceLocation(pos=6843, lineno=160, colno=52) + identifier: 'execute:if:dimension:dimension:subcommand' + arguments: + + location: SourceLocation(pos=6813, lineno=160, colno=22) + end_location: SourceLocation(pos=6832, lineno=160, colno=41) + is_tag: False + namespace: 'minecraft' + path: 'overworld' + + location: SourceLocation(pos=6833, lineno=160, colno=42) + end_location: SourceLocation(pos=6843, lineno=160, colno=52) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6837, lineno=160, colno=46) + end_location: SourceLocation(pos=6843, lineno=160, colno=52) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=6841, lineno=160, colno=50) + end_location: SourceLocation(pos=6843, lineno=160, colno=52) + fragments: + + location: SourceLocation(pos=6841, lineno=160, colno=50) + end_location: SourceLocation(pos=6843, lineno=160, colno=52) + value: 'ok' + + location: SourceLocation(pos=6844, lineno=161, colno=1) + end_location: SourceLocation(pos=6882, lineno=161, colno=39) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6852, lineno=161, colno=9) + end_location: SourceLocation(pos=6882, lineno=161, colno=39) + identifier: 'execute:unless:loaded:pos:subcommand' + arguments: + + location: SourceLocation(pos=6866, lineno=161, colno=23) + end_location: SourceLocation(pos=6871, lineno=161, colno=28) + x: + + location: SourceLocation(pos=6866, lineno=161, colno=23) + end_location: SourceLocation(pos=6867, lineno=161, colno=24) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=6868, lineno=161, colno=25) + end_location: SourceLocation(pos=6869, lineno=161, colno=26) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6870, lineno=161, colno=27) + end_location: SourceLocation(pos=6871, lineno=161, colno=28) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6872, lineno=161, colno=29) + end_location: SourceLocation(pos=6882, lineno=161, colno=39) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6876, lineno=161, colno=33) + end_location: SourceLocation(pos=6882, lineno=161, colno=39) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=6880, lineno=161, colno=37) + end_location: SourceLocation(pos=6882, lineno=161, colno=39) + fragments: + + location: SourceLocation(pos=6880, lineno=161, colno=37) + end_location: SourceLocation(pos=6882, lineno=161, colno=39) + value: 'ok' + + location: SourceLocation(pos=6883, lineno=162, colno=1) + end_location: SourceLocation(pos=6939, lineno=162, colno=57) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6891, lineno=162, colno=9) + end_location: SourceLocation(pos=6939, lineno=162, colno=57) + identifier: 'execute:unless:biome:pos:biome:subcommand' + arguments: + + location: SourceLocation(pos=6904, lineno=162, colno=22) + end_location: SourceLocation(pos=6911, lineno=162, colno=29) + x: + + location: SourceLocation(pos=6904, lineno=162, colno=22) + end_location: SourceLocation(pos=6907, lineno=162, colno=25) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=6908, lineno=162, colno=26) + end_location: SourceLocation(pos=6909, lineno=162, colno=27) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=6910, lineno=162, colno=28) + end_location: SourceLocation(pos=6911, lineno=162, colno=29) + type: 'relative' + value: 0 + + location: SourceLocation(pos=6912, lineno=162, colno=30) + end_location: SourceLocation(pos=6928, lineno=162, colno=46) + is_tag: False + namespace: 'minecraft' + path: 'forest' + + location: SourceLocation(pos=6929, lineno=162, colno=47) + end_location: SourceLocation(pos=6939, lineno=162, colno=57) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6933, lineno=162, colno=51) + end_location: SourceLocation(pos=6939, lineno=162, colno=57) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=6937, lineno=162, colno=55) + end_location: SourceLocation(pos=6939, lineno=162, colno=57) + fragments: + + location: SourceLocation(pos=6937, lineno=162, colno=55) + end_location: SourceLocation(pos=6939, lineno=162, colno=57) + value: 'ok' + + location: SourceLocation(pos=6940, lineno=163, colno=1) + end_location: SourceLocation(pos=6995, lineno=163, colno=56) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=6948, lineno=163, colno=9) + end_location: SourceLocation(pos=6995, lineno=163, colno=56) + identifier: 'execute:unless:dimension:dimension:subcommand' + arguments: + + location: SourceLocation(pos=6965, lineno=163, colno=26) + end_location: SourceLocation(pos=6984, lineno=163, colno=45) + is_tag: False + namespace: 'minecraft' + path: 'overworld' + + location: SourceLocation(pos=6985, lineno=163, colno=46) + end_location: SourceLocation(pos=6995, lineno=163, colno=56) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=6989, lineno=163, colno=50) + end_location: SourceLocation(pos=6995, lineno=163, colno=56) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=6993, lineno=163, colno=54) + end_location: SourceLocation(pos=6995, lineno=163, colno=56) + fragments: + + location: SourceLocation(pos=6993, lineno=163, colno=54) + end_location: SourceLocation(pos=6995, lineno=163, colno=56) + value: 'ok' + + location: SourceLocation(pos=6996, lineno=164, colno=1) + end_location: SourceLocation(pos=7043, lineno=164, colno=48) + identifier: 'fillbiome:from:to:biome' + arguments: + + location: SourceLocation(pos=7006, lineno=164, colno=11) + end_location: SourceLocation(pos=7011, lineno=164, colno=16) + x: + + location: SourceLocation(pos=7006, lineno=164, colno=11) + end_location: SourceLocation(pos=7007, lineno=164, colno=12) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7008, lineno=164, colno=13) + end_location: SourceLocation(pos=7009, lineno=164, colno=14) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7010, lineno=164, colno=15) + end_location: SourceLocation(pos=7011, lineno=164, colno=16) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7012, lineno=164, colno=17) + end_location: SourceLocation(pos=7023, lineno=164, colno=28) + x: + + location: SourceLocation(pos=7012, lineno=164, colno=17) + end_location: SourceLocation(pos=7015, lineno=164, colno=20) + type: 'relative' + value: 16 + y: + + location: SourceLocation(pos=7016, lineno=164, colno=21) + end_location: SourceLocation(pos=7019, lineno=164, colno=24) + type: 'relative' + value: 16 + z: + + location: SourceLocation(pos=7020, lineno=164, colno=25) + end_location: SourceLocation(pos=7023, lineno=164, colno=28) + type: 'relative' + value: 16 + + location: SourceLocation(pos=7024, lineno=164, colno=29) + end_location: SourceLocation(pos=7043, lineno=164, colno=48) + is_tag: False + namespace: 'minecraft' + path: 'deep_dark' + + location: SourceLocation(pos=7044, lineno=165, colno=1) + end_location: SourceLocation(pos=7064, lineno=165, colno=21) + identifier: 'gamemode:gamemode:target' + arguments: + + location: SourceLocation(pos=7053, lineno=165, colno=10) + end_location: SourceLocation(pos=7061, lineno=165, colno=18) + value: 'survival' + + location: SourceLocation(pos=7062, lineno=165, colno=19) + end_location: SourceLocation(pos=7064, lineno=165, colno=21) + variable: 'a' + arguments: + + + location: SourceLocation(pos=7065, lineno=166, colno=1) + end_location: SourceLocation(pos=7102, lineno=166, colno=38) + identifier: 'gamerule:blockExplosionDropDecay:value' + arguments: + + location: SourceLocation(pos=7098, lineno=166, colno=34) + end_location: SourceLocation(pos=7102, lineno=166, colno=38) + value: True + + location: SourceLocation(pos=7103, lineno=167, colno=1) + end_location: SourceLocation(pos=7146, lineno=167, colno=44) + identifier: 'gamerule:commandModificationBlockLimit:value' + arguments: + + location: SourceLocation(pos=7142, lineno=167, colno=40) + end_location: SourceLocation(pos=7146, lineno=167, colno=44) + value: 1000 + + location: SourceLocation(pos=7147, lineno=168, colno=1) + end_location: SourceLocation(pos=7179, lineno=168, colno=33) + identifier: 'gamerule:globalSoundEvents:value' + arguments: + + location: SourceLocation(pos=7174, lineno=168, colno=28) + end_location: SourceLocation(pos=7179, lineno=168, colno=33) + value: False + + location: SourceLocation(pos=7180, lineno=169, colno=1) + end_location: SourceLocation(pos=7214, lineno=169, colno=35) + identifier: 'gamerule:lavaSourceConversion:value' + arguments: + + location: SourceLocation(pos=7210, lineno=169, colno=31) + end_location: SourceLocation(pos=7214, lineno=169, colno=35) + value: True + + location: SourceLocation(pos=7215, lineno=170, colno=1) + end_location: SourceLocation(pos=7250, lineno=170, colno=36) + identifier: 'gamerule:mobExplosionDropDecay:value' + arguments: + + location: SourceLocation(pos=7246, lineno=170, colno=32) + end_location: SourceLocation(pos=7250, lineno=170, colno=36) + value: True + + location: SourceLocation(pos=7251, lineno=171, colno=1) + end_location: SourceLocation(pos=7285, lineno=171, colno=35) + identifier: 'gamerule:snowAccumulationHeight:value' + arguments: + + location: SourceLocation(pos=7283, lineno=171, colno=33) + end_location: SourceLocation(pos=7285, lineno=171, colno=35) + value: 10 + + location: SourceLocation(pos=7286, lineno=172, colno=1) + end_location: SourceLocation(pos=7321, lineno=172, colno=36) + identifier: 'gamerule:tntExplosionDropDecay:value' + arguments: + + location: SourceLocation(pos=7317, lineno=172, colno=32) + end_location: SourceLocation(pos=7321, lineno=172, colno=36) + value: True + + location: SourceLocation(pos=7322, lineno=173, colno=1) + end_location: SourceLocation(pos=7357, lineno=173, colno=36) + identifier: 'gamerule:waterSourceConversion:value' + arguments: + + location: SourceLocation(pos=7353, lineno=173, colno=32) + end_location: SourceLocation(pos=7357, lineno=173, colno=36) + value: True + + location: SourceLocation(pos=7358, lineno=174, colno=1) + end_location: SourceLocation(pos=7394, lineno=174, colno=37) + identifier: 'clone:begin:end:destination:masked' + arguments: + + location: SourceLocation(pos=7364, lineno=174, colno=7) + end_location: SourceLocation(pos=7369, lineno=174, colno=12) + x: + + location: SourceLocation(pos=7364, lineno=174, colno=7) + end_location: SourceLocation(pos=7365, lineno=174, colno=8) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7366, lineno=174, colno=9) + end_location: SourceLocation(pos=7367, lineno=174, colno=10) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7368, lineno=174, colno=11) + end_location: SourceLocation(pos=7369, lineno=174, colno=12) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7370, lineno=174, colno=13) + end_location: SourceLocation(pos=7381, lineno=174, colno=24) + x: + + location: SourceLocation(pos=7370, lineno=174, colno=13) + end_location: SourceLocation(pos=7373, lineno=174, colno=16) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=7374, lineno=174, colno=17) + end_location: SourceLocation(pos=7377, lineno=174, colno=20) + type: 'relative' + value: 10 + z: + + location: SourceLocation(pos=7378, lineno=174, colno=21) + end_location: SourceLocation(pos=7381, lineno=174, colno=24) + type: 'relative' + value: 10 + + location: SourceLocation(pos=7382, lineno=174, colno=25) + end_location: SourceLocation(pos=7387, lineno=174, colno=30) + x: + + location: SourceLocation(pos=7382, lineno=174, colno=25) + end_location: SourceLocation(pos=7383, lineno=174, colno=26) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=7384, lineno=174, colno=27) + end_location: SourceLocation(pos=7385, lineno=174, colno=28) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=7386, lineno=174, colno=29) + end_location: SourceLocation(pos=7387, lineno=174, colno=30) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=7395, lineno=175, colno=1) + end_location: SourceLocation(pos=7446, lineno=175, colno=52) + identifier: 'clone:from:sourceDimension:begin:end:destination:masked' + arguments: + + location: SourceLocation(pos=7406, lineno=175, colno=12) + end_location: SourceLocation(pos=7415, lineno=175, colno=21) + is_tag: False + namespace: None + path: 'overworld' + + location: SourceLocation(pos=7416, lineno=175, colno=22) + end_location: SourceLocation(pos=7421, lineno=175, colno=27) + x: + + location: SourceLocation(pos=7416, lineno=175, colno=22) + end_location: SourceLocation(pos=7417, lineno=175, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7418, lineno=175, colno=24) + end_location: SourceLocation(pos=7419, lineno=175, colno=25) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7420, lineno=175, colno=26) + end_location: SourceLocation(pos=7421, lineno=175, colno=27) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7422, lineno=175, colno=28) + end_location: SourceLocation(pos=7433, lineno=175, colno=39) + x: + + location: SourceLocation(pos=7422, lineno=175, colno=28) + end_location: SourceLocation(pos=7425, lineno=175, colno=31) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=7426, lineno=175, colno=32) + end_location: SourceLocation(pos=7429, lineno=175, colno=35) + type: 'relative' + value: 10 + z: + + location: SourceLocation(pos=7430, lineno=175, colno=36) + end_location: SourceLocation(pos=7433, lineno=175, colno=39) + type: 'relative' + value: 10 + + location: SourceLocation(pos=7434, lineno=175, colno=40) + end_location: SourceLocation(pos=7439, lineno=175, colno=45) + x: + + location: SourceLocation(pos=7434, lineno=175, colno=40) + end_location: SourceLocation(pos=7435, lineno=175, colno=41) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=7436, lineno=175, colno=42) + end_location: SourceLocation(pos=7437, lineno=175, colno=43) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=7438, lineno=175, colno=44) + end_location: SourceLocation(pos=7439, lineno=175, colno=45) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=7447, lineno=176, colno=1) + end_location: SourceLocation(pos=7493, lineno=176, colno=47) + identifier: 'clone:begin:end:to:targetDimension:destination:masked' + arguments: + + location: SourceLocation(pos=7453, lineno=176, colno=7) + end_location: SourceLocation(pos=7458, lineno=176, colno=12) + x: + + location: SourceLocation(pos=7453, lineno=176, colno=7) + end_location: SourceLocation(pos=7454, lineno=176, colno=8) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7455, lineno=176, colno=9) + end_location: SourceLocation(pos=7456, lineno=176, colno=10) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7457, lineno=176, colno=11) + end_location: SourceLocation(pos=7458, lineno=176, colno=12) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7459, lineno=176, colno=13) + end_location: SourceLocation(pos=7470, lineno=176, colno=24) + x: + + location: SourceLocation(pos=7459, lineno=176, colno=13) + end_location: SourceLocation(pos=7462, lineno=176, colno=16) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=7463, lineno=176, colno=17) + end_location: SourceLocation(pos=7466, lineno=176, colno=20) + type: 'relative' + value: 10 + z: + + location: SourceLocation(pos=7467, lineno=176, colno=21) + end_location: SourceLocation(pos=7470, lineno=176, colno=24) + type: 'relative' + value: 10 + + location: SourceLocation(pos=7474, lineno=176, colno=28) + end_location: SourceLocation(pos=7480, lineno=176, colno=34) + is_tag: False + namespace: None + path: 'nether' + + location: SourceLocation(pos=7481, lineno=176, colno=35) + end_location: SourceLocation(pos=7486, lineno=176, colno=40) + x: + + location: SourceLocation(pos=7481, lineno=176, colno=35) + end_location: SourceLocation(pos=7482, lineno=176, colno=36) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=7483, lineno=176, colno=37) + end_location: SourceLocation(pos=7484, lineno=176, colno=38) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=7485, lineno=176, colno=39) + end_location: SourceLocation(pos=7486, lineno=176, colno=40) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=7494, lineno=177, colno=1) + end_location: SourceLocation(pos=7555, lineno=177, colno=62) + identifier: 'clone:from:sourceDimension:begin:end:to:targetDimension:destination:masked' + arguments: + + location: SourceLocation(pos=7505, lineno=177, colno=12) + end_location: SourceLocation(pos=7514, lineno=177, colno=21) + is_tag: False + namespace: None + path: 'overworld' + + location: SourceLocation(pos=7515, lineno=177, colno=22) + end_location: SourceLocation(pos=7520, lineno=177, colno=27) + x: + + location: SourceLocation(pos=7515, lineno=177, colno=22) + end_location: SourceLocation(pos=7516, lineno=177, colno=23) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7517, lineno=177, colno=24) + end_location: SourceLocation(pos=7518, lineno=177, colno=25) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7519, lineno=177, colno=26) + end_location: SourceLocation(pos=7520, lineno=177, colno=27) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7521, lineno=177, colno=28) + end_location: SourceLocation(pos=7532, lineno=177, colno=39) + x: + + location: SourceLocation(pos=7521, lineno=177, colno=28) + end_location: SourceLocation(pos=7524, lineno=177, colno=31) + type: 'relative' + value: 10 + y: + + location: SourceLocation(pos=7525, lineno=177, colno=32) + end_location: SourceLocation(pos=7528, lineno=177, colno=35) + type: 'relative' + value: 10 + z: + + location: SourceLocation(pos=7529, lineno=177, colno=36) + end_location: SourceLocation(pos=7532, lineno=177, colno=39) + type: 'relative' + value: 10 + + location: SourceLocation(pos=7536, lineno=177, colno=43) + end_location: SourceLocation(pos=7542, lineno=177, colno=49) + is_tag: False + namespace: None + path: 'nether' + + location: SourceLocation(pos=7543, lineno=177, colno=50) + end_location: SourceLocation(pos=7548, lineno=177, colno=55) + x: + + location: SourceLocation(pos=7543, lineno=177, colno=50) + end_location: SourceLocation(pos=7544, lineno=177, colno=51) + type: 'absolute' + value: 0 + y: + + location: SourceLocation(pos=7545, lineno=177, colno=52) + end_location: SourceLocation(pos=7546, lineno=177, colno=53) + type: 'absolute' + value: 0 + z: + + location: SourceLocation(pos=7547, lineno=177, colno=54) + end_location: SourceLocation(pos=7548, lineno=177, colno=55) + type: 'absolute' + value: 0 + + location: SourceLocation(pos=7556, lineno=178, colno=1) + end_location: SourceLocation(pos=7623, lineno=178, colno=68) + identifier: 'data:modify:block:targetPos:targetPath:set:string:storage:source:sourcePath:start:end' + arguments: + + location: SourceLocation(pos=7574, lineno=178, colno=19) + end_location: SourceLocation(pos=7579, lineno=178, colno=24) + x: + + location: SourceLocation(pos=7574, lineno=178, colno=19) + end_location: SourceLocation(pos=7575, lineno=178, colno=20) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7576, lineno=178, colno=21) + end_location: SourceLocation(pos=7577, lineno=178, colno=22) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7578, lineno=178, colno=23) + end_location: SourceLocation(pos=7579, lineno=178, colno=24) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7580, lineno=178, colno=25) + end_location: SourceLocation(pos=7584, lineno=178, colno=29) + components: + + location: SourceLocation(pos=7580, lineno=178, colno=25) + end_location: SourceLocation(pos=7584, lineno=178, colno=29) + value: 'Name' + + location: SourceLocation(pos=7604, lineno=178, colno=49) + end_location: SourceLocation(pos=7613, lineno=178, colno=58) + is_tag: False + namespace: 'test' + path: 'main' + + location: SourceLocation(pos=7614, lineno=178, colno=59) + end_location: SourceLocation(pos=7619, lineno=178, colno=64) + components: + + location: SourceLocation(pos=7614, lineno=178, colno=59) + end_location: SourceLocation(pos=7619, lineno=178, colno=64) + value: 'value' + + location: SourceLocation(pos=7620, lineno=178, colno=65) + end_location: SourceLocation(pos=7621, lineno=178, colno=66) + value: 0 + + location: SourceLocation(pos=7622, lineno=178, colno=67) + end_location: SourceLocation(pos=7623, lineno=178, colno=68) + value: 1 + + location: SourceLocation(pos=7624, lineno=179, colno=1) + end_location: SourceLocation(pos=7689, lineno=179, colno=66) + identifier: 'data:modify:block:targetPos:targetPath:append:string:block:sourcePos:sourcePath:start:end' + arguments: + + location: SourceLocation(pos=7642, lineno=179, colno=19) + end_location: SourceLocation(pos=7647, lineno=179, colno=24) + x: + + location: SourceLocation(pos=7642, lineno=179, colno=19) + end_location: SourceLocation(pos=7643, lineno=179, colno=20) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7644, lineno=179, colno=21) + end_location: SourceLocation(pos=7645, lineno=179, colno=22) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7646, lineno=179, colno=23) + end_location: SourceLocation(pos=7647, lineno=179, colno=24) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7648, lineno=179, colno=25) + end_location: SourceLocation(pos=7652, lineno=179, colno=29) + components: + + location: SourceLocation(pos=7648, lineno=179, colno=25) + end_location: SourceLocation(pos=7652, lineno=179, colno=29) + value: 'Name' + + location: SourceLocation(pos=7673, lineno=179, colno=50) + end_location: SourceLocation(pos=7679, lineno=179, colno=56) + x: + + location: SourceLocation(pos=7673, lineno=179, colno=50) + end_location: SourceLocation(pos=7674, lineno=179, colno=51) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7675, lineno=179, colno=52) + end_location: SourceLocation(pos=7677, lineno=179, colno=54) + type: 'relative' + value: 1 + z: + + location: SourceLocation(pos=7678, lineno=179, colno=55) + end_location: SourceLocation(pos=7679, lineno=179, colno=56) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7680, lineno=179, colno=57) + end_location: SourceLocation(pos=7685, lineno=179, colno=62) + components: + + location: SourceLocation(pos=7680, lineno=179, colno=57) + end_location: SourceLocation(pos=7685, lineno=179, colno=62) + value: 'value' + + location: SourceLocation(pos=7686, lineno=179, colno=63) + end_location: SourceLocation(pos=7687, lineno=179, colno=64) + value: 0 + + location: SourceLocation(pos=7688, lineno=179, colno=65) + end_location: SourceLocation(pos=7689, lineno=179, colno=66) + value: 1 + + location: SourceLocation(pos=7690, lineno=180, colno=1) + end_location: SourceLocation(pos=7758, lineno=180, colno=69) + identifier: 'data:modify:block:targetPos:targetPath:prepend:string:entity:source:sourcePath:start:end' + arguments: + + location: SourceLocation(pos=7708, lineno=180, colno=19) + end_location: SourceLocation(pos=7713, lineno=180, colno=24) + x: + + location: SourceLocation(pos=7708, lineno=180, colno=19) + end_location: SourceLocation(pos=7709, lineno=180, colno=20) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7710, lineno=180, colno=21) + end_location: SourceLocation(pos=7711, lineno=180, colno=22) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7712, lineno=180, colno=23) + end_location: SourceLocation(pos=7713, lineno=180, colno=24) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7714, lineno=180, colno=25) + end_location: SourceLocation(pos=7718, lineno=180, colno=29) + components: + + location: SourceLocation(pos=7714, lineno=180, colno=25) + end_location: SourceLocation(pos=7718, lineno=180, colno=29) + value: 'Name' + + location: SourceLocation(pos=7741, lineno=180, colno=52) + end_location: SourceLocation(pos=7743, lineno=180, colno=54) + variable: 's' + arguments: + + + location: SourceLocation(pos=7744, lineno=180, colno=55) + end_location: SourceLocation(pos=7754, lineno=180, colno=65) + components: + + location: SourceLocation(pos=7744, lineno=180, colno=55) + end_location: SourceLocation(pos=7754, lineno=180, colno=65) + value: 'EntityName' + + location: SourceLocation(pos=7755, lineno=180, colno=66) + end_location: SourceLocation(pos=7756, lineno=180, colno=67) + value: 0 + + location: SourceLocation(pos=7757, lineno=180, colno=68) + end_location: SourceLocation(pos=7758, lineno=180, colno=69) + value: 1 + + location: SourceLocation(pos=7759, lineno=181, colno=1) + end_location: SourceLocation(pos=7831, lineno=181, colno=73) + identifier: 'data:modify:block:targetPos:targetPath:insert:index:string:storage:source:sourcePath:start:end' + arguments: + + location: SourceLocation(pos=7777, lineno=181, colno=19) + end_location: SourceLocation(pos=7782, lineno=181, colno=24) + x: + + location: SourceLocation(pos=7777, lineno=181, colno=19) + end_location: SourceLocation(pos=7778, lineno=181, colno=20) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7779, lineno=181, colno=21) + end_location: SourceLocation(pos=7780, lineno=181, colno=22) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7781, lineno=181, colno=23) + end_location: SourceLocation(pos=7782, lineno=181, colno=24) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7783, lineno=181, colno=25) + end_location: SourceLocation(pos=7787, lineno=181, colno=29) + components: + + location: SourceLocation(pos=7783, lineno=181, colno=25) + end_location: SourceLocation(pos=7787, lineno=181, colno=29) + value: 'Name' + + location: SourceLocation(pos=7795, lineno=181, colno=37) + end_location: SourceLocation(pos=7796, lineno=181, colno=38) + value: 0 + + location: SourceLocation(pos=7812, lineno=181, colno=54) + end_location: SourceLocation(pos=7821, lineno=181, colno=63) + is_tag: False + namespace: 'test' + path: 'main' + + location: SourceLocation(pos=7822, lineno=181, colno=64) + end_location: SourceLocation(pos=7827, lineno=181, colno=69) + components: + + location: SourceLocation(pos=7822, lineno=181, colno=64) + end_location: SourceLocation(pos=7827, lineno=181, colno=69) + value: 'value' + + location: SourceLocation(pos=7828, lineno=181, colno=70) + end_location: SourceLocation(pos=7829, lineno=181, colno=71) + value: 0 + + location: SourceLocation(pos=7830, lineno=181, colno=72) + end_location: SourceLocation(pos=7831, lineno=181, colno=73) + value: 1 + + location: SourceLocation(pos=7832, lineno=182, colno=1) + end_location: SourceLocation(pos=7901, lineno=182, colno=70) + identifier: 'data:modify:block:targetPos:targetPath:merge:string:storage:source:sourcePath:start:end' + arguments: + + location: SourceLocation(pos=7850, lineno=182, colno=19) + end_location: SourceLocation(pos=7855, lineno=182, colno=24) + x: + + location: SourceLocation(pos=7850, lineno=182, colno=19) + end_location: SourceLocation(pos=7851, lineno=182, colno=20) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=7852, lineno=182, colno=21) + end_location: SourceLocation(pos=7853, lineno=182, colno=22) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=7854, lineno=182, colno=23) + end_location: SourceLocation(pos=7855, lineno=182, colno=24) + type: 'relative' + value: 0 + + location: SourceLocation(pos=7856, lineno=182, colno=25) + end_location: SourceLocation(pos=7860, lineno=182, colno=29) + components: + + location: SourceLocation(pos=7856, lineno=182, colno=25) + end_location: SourceLocation(pos=7860, lineno=182, colno=29) + value: 'Name' + + location: SourceLocation(pos=7882, lineno=182, colno=51) + end_location: SourceLocation(pos=7891, lineno=182, colno=60) + is_tag: False + namespace: 'test' + path: 'main' + + location: SourceLocation(pos=7892, lineno=182, colno=61) + end_location: SourceLocation(pos=7897, lineno=182, colno=66) + components: + + location: SourceLocation(pos=7892, lineno=182, colno=61) + end_location: SourceLocation(pos=7897, lineno=182, colno=66) + value: 'value' + + location: SourceLocation(pos=7898, lineno=182, colno=67) + end_location: SourceLocation(pos=7899, lineno=182, colno=68) + value: 0 + + location: SourceLocation(pos=7900, lineno=182, colno=69) + end_location: SourceLocation(pos=7901, lineno=182, colno=70) + value: 1 + + location: SourceLocation(pos=7902, lineno=183, colno=1) + end_location: SourceLocation(pos=7928, lineno=183, colno=27) + identifier: 'title:targets:times:fadeIn:stay:fadeOut' + arguments: + + location: SourceLocation(pos=7908, lineno=183, colno=7) + end_location: SourceLocation(pos=7910, lineno=183, colno=9) + variable: 's' + arguments: + + + location: SourceLocation(pos=7917, lineno=183, colno=16) + end_location: SourceLocation(pos=7921, lineno=183, colno=20) + value: 0.5 + unit: 'second' + + location: SourceLocation(pos=7922, lineno=183, colno=21) + end_location: SourceLocation(pos=7925, lineno=183, colno=24) + value: 10 + unit: 'tick' + + location: SourceLocation(pos=7926, lineno=183, colno=25) + end_location: SourceLocation(pos=7928, lineno=183, colno=27) + value: 1 + unit: 'day' + + location: SourceLocation(pos=7929, lineno=184, colno=1) + end_location: SourceLocation(pos=7946, lineno=184, colno=18) + identifier: 'weather:clear:duration' + arguments: + + location: SourceLocation(pos=7943, lineno=184, colno=15) + end_location: SourceLocation(pos=7946, lineno=184, colno=18) + value: 10 + unit: 'tick' + + location: SourceLocation(pos=7947, lineno=185, colno=1) + end_location: SourceLocation(pos=7966, lineno=185, colno=20) + identifier: 'weather:rain:duration' + arguments: + + location: SourceLocation(pos=7960, lineno=185, colno=14) + end_location: SourceLocation(pos=7966, lineno=185, colno=20) + value: 0.235 + unit: 'second' + + location: SourceLocation(pos=7967, lineno=186, colno=1) + end_location: SourceLocation(pos=7985, lineno=186, colno=19) + identifier: 'weather:thunder:duration' + arguments: + + location: SourceLocation(pos=7983, lineno=186, colno=17) + end_location: SourceLocation(pos=7985, lineno=186, colno=19) + value: 1 + unit: 'day' + + location: SourceLocation(pos=7986, lineno=187, colno=1) + end_location: SourceLocation(pos=8033, lineno=187, colno=48) + identifier: 'ride:target:mount:vehicle' + arguments: + + location: SourceLocation(pos=7991, lineno=187, colno=6) + end_location: SourceLocation(pos=7993, lineno=187, colno=8) + variable: 's' + arguments: + + + location: SourceLocation(pos=8000, lineno=187, colno=15) + end_location: SourceLocation(pos=8033, lineno=187, colno=48) + variable: 'e' + arguments: + + location: SourceLocation(pos=8003, lineno=187, colno=18) + end_location: SourceLocation(pos=8011, lineno=187, colno=26) + inverted: False + key: + + location: SourceLocation(pos=8003, lineno=187, colno=18) + end_location: SourceLocation(pos=8007, lineno=187, colno=22) + value: 'type' + value: + + location: SourceLocation(pos=8008, lineno=187, colno=23) + end_location: SourceLocation(pos=8011, lineno=187, colno=26) + is_tag: False + namespace: None + path: 'pig' + + location: SourceLocation(pos=8012, lineno=187, colno=27) + end_location: SourceLocation(pos=8019, lineno=187, colno=34) + inverted: False + key: + + location: SourceLocation(pos=8012, lineno=187, colno=27) + end_location: SourceLocation(pos=8017, lineno=187, colno=32) + value: 'limit' + value: + + location: SourceLocation(pos=8018, lineno=187, colno=33) + end_location: SourceLocation(pos=8019, lineno=187, colno=34) + value: 1 + + location: SourceLocation(pos=8020, lineno=187, colno=35) + end_location: SourceLocation(pos=8032, lineno=187, colno=47) + inverted: False + key: + + location: SourceLocation(pos=8020, lineno=187, colno=35) + end_location: SourceLocation(pos=8024, lineno=187, colno=39) + value: 'sort' + value: + + location: SourceLocation(pos=8025, lineno=187, colno=40) + end_location: SourceLocation(pos=8032, lineno=187, colno=47) + value: 'nearest' + + location: SourceLocation(pos=8034, lineno=188, colno=1) + end_location: SourceLocation(pos=8050, lineno=188, colno=17) + identifier: 'ride:target:dismount' + arguments: + + location: SourceLocation(pos=8039, lineno=188, colno=6) + end_location: SourceLocation(pos=8041, lineno=188, colno=8) + variable: 's' + arguments: + + + location: SourceLocation(pos=8051, lineno=189, colno=1) + end_location: SourceLocation(pos=8105, lineno=189, colno=55) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=8059, lineno=189, colno=9) + end_location: SourceLocation(pos=8105, lineno=189, colno=55) + identifier: 'execute:if:score:target:targetObjective:matches:range:subcommand' + arguments: + + location: SourceLocation(pos=8068, lineno=189, colno=18) + end_location: SourceLocation(pos=8070, lineno=189, colno=20) + variable: 's' + arguments: + + + location: SourceLocation(pos=8071, lineno=189, colno=21) + end_location: SourceLocation(pos=8074, lineno=189, colno=24) + value: 'abc' + + location: SourceLocation(pos=8083, lineno=189, colno=33) + end_location: SourceLocation(pos=8084, lineno=189, colno=34) + min: 0 + max: 0 + + location: SourceLocation(pos=8085, lineno=189, colno=35) + end_location: SourceLocation(pos=8105, lineno=189, colno=55) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=8089, lineno=189, colno=39) + end_location: SourceLocation(pos=8105, lineno=189, colno=55) + identifier: 'ride:target:dismount' + arguments: + + location: SourceLocation(pos=8094, lineno=189, colno=44) + end_location: SourceLocation(pos=8096, lineno=189, colno=46) + variable: 's' + arguments: + \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index f6ceed666..b8b974307 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -126,3 +126,35 @@ place template minecraft:fossil/spine_1 ~ ~ ~ 180 place template minecraft:fossil/spine_1 ~ ~ ~ clockwise_90 left_right place template minecraft:fossil/spine_1 ~ ~ ~ none front_back 0.5 place template minecraft:fossil/spine_1 ~ ~ ~ counterclockwise_90 none 0.6 42 +execute on vehicle at @s if loaded ~10 ~ ~ run tp @s ~10 ~ ~ +execute if biome ~10 ~ ~ minecraft:plains run say ok +execute if dimension minecraft:overworld run say ok +execute unless loaded ~ ~ ~ run say ok +execute unless biome ~10 ~ ~ minecraft:forest run say ok +execute unless dimension minecraft:overworld run say ok +fillbiome ~ ~ ~ ~16 ~16 ~16 minecraft:deep_dark +gamemode survival @a +gamerule blockExplosionDropDecay true +gamerule commandModificationBlockLimit 1000 +gamerule globalSoundEvents false +gamerule lavaSourceConversion true +gamerule mobExplosionDropDecay true +gamerule snowAccumulationHeight 10 +gamerule tntExplosionDropDecay true +gamerule waterSourceConversion true +clone ~ ~ ~ ~10 ~10 ~10 0 0 0 masked +clone from overworld ~ ~ ~ ~10 ~10 ~10 0 0 0 masked +clone ~ ~ ~ ~10 ~10 ~10 to nether 0 0 0 masked +clone from overworld ~ ~ ~ ~10 ~10 ~10 to nether 0 0 0 masked +data modify block ~ ~ ~ Name set string storage test:main value 0 1 +data modify block ~ ~ ~ Name append string block ~ ~1 ~ value 0 1 +data modify block ~ ~ ~ Name prepend string entity @s EntityName 0 1 +data modify block ~ ~ ~ Name insert 0 string storage test:main value 0 1 +data modify block ~ ~ ~ Name merge string storage test:main value 0 1 +title @s times 0.5s 10 1d +weather clear 10 +weather rain 0.235s +weather thunder 1d +ride @s mount @e[type=pig, limit=1, sort=nearest] +ride @s dismount +execute if score @s abc matches 0 run ride @s dismount From 08a2f1a099d507ef68afb07f901348cda94030ae Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 8 Feb 2023 23:14:00 +0100 Subject: [PATCH 1139/1554] chore: update mecha --- .../src/data/demo/functions/foo.mcfunction | 2 +- packages/bolt/poetry.lock | 8 +++---- packages/bolt/pyproject.toml | 2 +- .../tests/resources/bolt_examples.mcfunction | 2 +- .../tests/snapshots/bolt__parse_176__0.txt | 18 +++++++-------- .../tests/snapshots/bolt__parse_176__1.txt | 8 +++---- .../tests/snapshots/bolt__parse_230__0.txt | 2 +- .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_99__0.txt | 2 +- .../tests/snapshots/spec__prototypes__0.json | 22 ++++++++++++++++--- 10 files changed, 42 insertions(+), 26 deletions(-) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 6bdf2f634..3d032ee9b 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -309,7 +309,7 @@ try_entity_interpolation("0-0-0-0-1") try_entity_interpolation(UUID("12345678-1234-5678-1234-567812345678")) entity_type = "creeper" -at @e[type=entity_type] summon lightning_bolt +at @e[type=entity_type] run summon lightning_bolt language minecraft:aaaa { "menu.singleplayer": "AAAA" diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 6da82b3f8..54fddb869 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -635,14 +635,14 @@ files = [ [[package]] name = "mecha" -version = "0.66.0" +version = "0.67.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "mecha-0.66.0-py3-none-any.whl", hash = "sha256:faf8c8b434291ddb3b630f08257bef3ee4950555bcc26b5995c7d220797abf3c"}, - {file = "mecha-0.66.0.tar.gz", hash = "sha256:ccf6c03d5ef7dff205f20965502ea13ae07540290f56a68bc1e862dfaf22e4d0"}, + {file = "mecha-0.67.0-py3-none-any.whl", hash = "sha256:89c99bdfd34c8731d0781327fc882d1b5dde6e61565fa39f9db09c01ebc9da55"}, + {file = "mecha-0.67.0.tar.gz", hash = "sha256:49a95e34be23495731fb996ff87479b0addca3729e77258be1fb2d5dcc007a9b"}, ] [package.dependencies] @@ -1415,4 +1415,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "6a39f2cf77080ba472762b353da0839840e65852335d7dcddfff07272632ca82" +content-hash = "9a3e0f7b9c4165662f10a230e2e77b069b9d8cb04a2f6fd64d8871a366b7bbec" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index e2c882d2a..b20c4fc79 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -24,7 +24,7 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" beet = ">=0.83.1" -mecha = ">=0.66.0" +mecha = ">=0.67.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.1" diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index c20e28c71..9f9fed98f 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -636,7 +636,7 @@ mypath = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' if data storage some:path/to/storage (mypath) run say hi ### entity_type = "creeper" -at @e[type=entity_type] summon lightning_bolt +at @e[type=entity_type] run summon lightning_bolt ### append function demo:foo ### diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt index 8cf80daf1..d9f0cb3c7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__0.txt @@ -1,9 +1,9 @@ entity_type = "creeper" -at @e[type=entity_type] summon lightning_bolt +at @e[type=entity_type] run summon lightning_bolt --- location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) commands: location: SourceLocation(pos=0, lineno=1, colno=1) @@ -28,12 +28,12 @@ at @e[type=entity_type] summon lightning_bolt type_annotation: None location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'execute:subcommand' arguments: location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'execute:at:targets:subcommand' arguments: @@ -64,17 +64,17 @@ at @e[type=entity_type] summon lightning_bolt value: 'entity_type' location: SourceLocation(pos=48, lineno=2, colno=25) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'execute:run:subcommand' arguments: - location: SourceLocation(pos=48, lineno=2, colno=25) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + location: SourceLocation(pos=52, lineno=2, colno=29) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'summon:entity' arguments: - location: SourceLocation(pos=55, lineno=2, colno=32) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + location: SourceLocation(pos=59, lineno=2, colno=36) + end_location: SourceLocation(pos=73, lineno=2, colno=50) is_tag: False namespace: None path: 'lightning_bolt' diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt index 013cd2888..317c27da5 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt @@ -40,14 +40,14 @@ _bolt_refs[2] _bolt_refs[3] location: SourceLocation(pos=48, lineno=2, colno=25) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'execute:run:subcommand' arguments: _bolt_refs[4] location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'execute:at:targets:subcommand' arguments: @@ -55,14 +55,14 @@ _bolt_refs[4] _bolt_refs[5] location: SourceLocation(pos=24, lineno=2, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) identifier: 'execute:subcommand' arguments: _bolt_refs[6] location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=69, lineno=2, colno=46) + end_location: SourceLocation(pos=73, lineno=2, colno=50) commands: diff --git a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt index b391ccdd6..d9f776a58 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt @@ -1,6 +1,6 @@ macro foo: pass -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 127 other tokens but got literal 'foo'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 128 other tokens but got literal 'foo'. # line 3, column 7 # 2 | pass # 3 | as @p foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index 3dc784ff6..b05eae42a 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 158 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 159 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt index d0185e339..236573f46 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 127 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 128 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 26488db05..073e1ccfe 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -134,6 +134,11 @@ "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:move", "clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:normal", "continue", + "damage:target:amount", + "damage:target:amount:damageType", + "damage:target:amount:damageType:at:location", + "damage:target:amount:damageType:by:entity", + "damage:target:amount:damageType:by:entity:from:cause", "data:get:block:targetPos", "data:get:block:targetPos:path", "data:get:block:targetPos:path:scale", @@ -603,6 +608,11 @@ "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:move", "execute:clone:from:sourceDimension:begin:end:to:targetDimension:destination:replace:normal", "execute:commands", + "execute:damage:target:amount", + "execute:damage:target:amount:damageType", + "execute:damage:target:amount:damageType:at:location", + "execute:damage:target:amount:damageType:by:entity", + "execute:damage:target:amount:damageType:by:entity:from:cause", "execute:data:get:block:targetPos", "execute:data:get:block:targetPos:path", "execute:data:get:block:targetPos:path:scale", @@ -1005,6 +1015,8 @@ "execute:gamerule:doTileDrops:value", "execute:gamerule:doTraderSpawning", "execute:gamerule:doTraderSpawning:value", + "execute:gamerule:doVinesSpread", + "execute:gamerule:doVinesSpread:value", "execute:gamerule:doWardenSpawning", "execute:gamerule:doWardenSpawning:value", "execute:gamerule:doWeatherCycle", @@ -1080,6 +1092,7 @@ "execute:if:dimension:dimension:subcommand", "execute:if:entity:entities", "execute:if:entity:entities:subcommand", + "execute:if:loaded:pos", "execute:if:loaded:pos:subcommand", "execute:if:predicate:predicate", "execute:if:predicate:predicate:subcommand", @@ -1456,9 +1469,7 @@ "execute:store:success:storage:target:path:long:scale:subcommand", "execute:store:success:storage:target:path:short:scale:subcommand", "execute:subcommand", - "execute:summon:entity", - "execute:summon:entity:pos", - "execute:summon:entity:pos:nbt", + "execute:summon:entity:subcommand", "execute:tag:targets:add:name", "execute:tag:targets:list", "execute:tag:targets:remove:name", @@ -1546,6 +1557,7 @@ "execute:unless:dimension:dimension:subcommand", "execute:unless:entity:entities", "execute:unless:entity:entities:subcommand", + "execute:unless:loaded:pos", "execute:unless:loaded:pos:subcommand", "execute:unless:predicate:predicate", "execute:unless:predicate:predicate:subcommand", @@ -1682,6 +1694,8 @@ "gamerule:doTileDrops:value", "gamerule:doTraderSpawning", "gamerule:doTraderSpawning:value", + "gamerule:doVinesSpread", + "gamerule:doVinesSpread:value", "gamerule:doWardenSpawning", "gamerule:doWardenSpawning:value", "gamerule:doWeatherCycle", @@ -1762,6 +1776,7 @@ "if:dimension:dimension:subcommand", "if:entity:entities", "if:entity:entities:subcommand", + "if:loaded:pos", "if:loaded:pos:subcommand", "if:predicate:predicate", "if:predicate:predicate:subcommand", @@ -2257,6 +2272,7 @@ "unless:dimension:dimension:subcommand", "unless:entity:entities", "unless:entity:entities:subcommand", + "unless:loaded:pos", "unless:loaded:pos:subcommand", "unless:predicate:predicate", "unless:predicate:predicate:subcommand", From 1b31c7a601aee58e44b89ce0d1520374ccfc6aa3 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 9 Feb 2023 01:13:50 +0100 Subject: [PATCH 1140/1554] feat: macro subcommands --- packages/bolt/bolt/ast.py | 13 ++ packages/bolt/bolt/parse.py | 45 ++-- packages/bolt/bolt/runtime.py | 14 +- .../data/demo/functions/redirect.mcfunction | 34 +++ .../tests/resources/bolt_examples.mcfunction | 29 +++ .../tests/snapshots/bolt__parse_350__0.txt | 7 + .../tests/snapshots/bolt__parse_351__0.txt | 7 + .../tests/snapshots/bolt__parse_352__0.txt | 8 + .../tests/snapshots/bolt__parse_353__0.txt | 11 + .../tests/snapshots/bolt__parse_354__0.txt | 61 ++++++ .../tests/snapshots/bolt__parse_354__1.txt | 27 +++ .../tests/snapshots/bolt__parse_355__0.txt | 85 ++++++++ .../tests/snapshots/bolt__parse_355__1.txt | 49 +++++ .../tests/snapshots/bolt__parse_356__0.txt | 198 ++++++++++++++++++ .../tests/snapshots/bolt__parse_356__1.txt | 47 +++++ .../examples__build_bolt_macro__0.pack.md | 43 ++++ 16 files changed, 659 insertions(+), 19 deletions(-) create mode 100644 packages/bolt/examples/bolt_macro/src/data/demo/functions/redirect.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_350__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_351__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_352__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_353__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_354__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_354__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_355__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_355__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_356__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_356__1.txt diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index e54f3644a..b0a8b2c65 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -357,6 +357,13 @@ def get_command_tree(self) -> JsonDict: child = {"type": "literal"} tree["children"] = {node.match.value: child} elif isinstance(node, AstMacroMatchArgument): + if node.is_subcommand(): + tree["redirect"] = ( + node.match_argument_properties.evaluate().get("redirect", []) + if node.match_argument_properties + else [] + ) + return tree_root child = {"type": "argument"} child["parser"] = node.match_argument_parser.get_canonical_value() if properties := node.match_argument_properties: @@ -414,6 +421,12 @@ class AstMacroMatchArgument(AstMacroMatch): match_argument_parser: AstResourceLocation = required_field() match_argument_properties: Optional[AstJson] = None + def is_subcommand(self) -> bool: + return ( + not self.match_argument_parser.namespace + and self.match_argument_parser.path == "subcommand" + ) + @dataclass(frozen=True, slots=True) class AstProcMacro(AstMacro): diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 3ca9db7db..9fed35def 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -43,7 +43,7 @@ "GlobalNonlocalHandler", "DocstringHandler", "FlushPendingBindingsParser", - "StatementSubcommandHandler", + "SubcommandConstraint", "DeferredRootBacktracker", "LexicalScopeConstraint", "RootScopeHandler", @@ -184,7 +184,9 @@ def get_bolt_parsers( - parsers: Dict[str, Parser], modules: ModuleManager + parsers: Dict[str, Parser], + modules: ModuleManager, + bolt_prototypes: Set[str], ) -> Dict[str, Parser]: """Return the bolt parsers.""" macro_handler = MacroHandler( @@ -206,7 +208,7 @@ def get_bolt_parsers( macro_handler=macro_handler, ), "nested_root": create_bolt_root_parser(parsers["nested_root"], macro_handler), - "command": create_bolt_command_parser(macro_handler, modules), + "command": create_bolt_command_parser(macro_handler, modules, bolt_prototypes), "command:argument:bolt:if_block": delegate("bolt:if_block"), "command:argument:bolt:elif_condition": delegate("bolt:elif_condition"), "command:argument:bolt:elif_block": delegate("bolt:elif_block"), @@ -628,14 +630,16 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): return parser -def create_bolt_command_parser(parser: Parser, modules: ModuleManager): +def create_bolt_command_parser( + parser: Parser, modules: ModuleManager, bolt_prototypes: Set[str] +): """Compose command parsers.""" parser = MemoHandler(parser) parser = GlobalNonlocalHandler(parser) parser = ImportStatementHandler(parser, modules) parser = DocstringHandler(parser) parser = UndefinedIdentifierErrorHandler(parser) - parser = StatementSubcommandHandler(parser) + parser = SubcommandConstraint(parser, command_identifiers=bolt_prototypes) return parser @@ -1417,10 +1421,11 @@ def __call__(self, stream: TokenStream) -> AstMacroMatch: node.match_argument_properties or node.match_argument_parser, ) - parser_name = node.match_argument_parser.get_canonical_value() - if f"command:argument:{parser_name}" not in spec.parsers: - exc = InvalidSyntax(f'Unrecognized argument parser "{parser_name}".') - raise set_location(exc, node.match_argument_parser) + if not node.is_subcommand(): + name = node.match_argument_parser.get_canonical_value() + if f"command:argument:{name}" not in spec.parsers: + exc = InvalidSyntax(f'Unrecognized argument parser "{name}".') + raise set_location(exc, node.match_argument_parser) lexical_scope = get_stream_lexical_scope(stream) deferred_scope = lexical_scope.deferred(MacroScope) @@ -1500,7 +1505,11 @@ def create_macro( elif isinstance(literal := node.arguments[0], AstMacroMatchLiteral): identifier_parts.append(literal.match.value) elif isinstance(argument := node.arguments[0], AstMacroMatchArgument): - identifier_parts.append(argument.match_identifier.value) + identifier_parts.append( + "subcommand" + if argument.is_subcommand() + else argument.match_identifier.value + ) arguments.append(node.arguments[0]) node = subcommand @@ -1542,6 +1551,11 @@ def create_macro( ) return set_location(macro, command) + for left, right in zip(arguments, arguments[1:]): + if isinstance(left, AstMacroMatchArgument) and left.is_subcommand(): + exc = InvalidSyntax("Unexpected macro argument after subcommand.") + raise set_location(exc, right) + arguments.append(node.arguments[0]) macro = AstMacro( @@ -1968,19 +1982,22 @@ def __call__(self, stream: TokenStream) -> Any: @dataclass -class StatementSubcommandHandler: - """Prevent statements as subcommands.""" +class SubcommandConstraint: + """Prevent using the specified prototypes as general subcommands.""" parser: Parser + command_identifiers: Set[str] def __call__(self, stream: TokenStream) -> Any: if ( isinstance(node := self.parser(stream), AstCommand) and node.arguments and isinstance(child := node.arguments[-1], AstCommand) - and child.identifier == "statement" + and child.identifier in self.command_identifiers + and node.identifier not in self.command_identifiers ): - exc = InvalidSyntax("Can't use statement as a subcommand.") + name, _, _ = child.identifier.partition(":") + exc = InvalidSyntax(f"Can't use {name} as a subcommand.") raise set_location(exc, child) return node diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 9ece5a54a..4b28b2257 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -8,12 +8,12 @@ import builtins from dataclasses import dataclass, field from functools import partial -from importlib.resources import read_text +from importlib.resources import files from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Union from beet import Context, TextFileBase, generate_tree from beet.core.utils import JsonDict, extra_field, required_field -from mecha import AstRoot, CommandTree, Diagnostic, Mecha, Visitor, rule +from mecha import AstRoot, CommandSpec, CommandTree, Diagnostic, Mecha, Visitor, rule from mecha.contrib.nesting import InplaceNestingPredicate from pathspec import PathSpec from tokenstream import set_location @@ -110,9 +110,13 @@ def __init__(self, ctx: Union[Context, Mecha]): mc.providers.append(Module) - commands_json = read_text("bolt.resources", "commands.json") - mc.spec.add_commands(CommandTree.parse_raw(commands_json)) - mc.spec.parsers.update(get_bolt_parsers(mc.spec.parsers, self.modules)) + commands_json = files("bolt.resources").joinpath("commands.json").read_text() + command_tree = CommandTree.parse_raw(commands_json) + bolt_prototypes = set(CommandSpec(tree=command_tree).prototypes) + mc.spec.add_commands(command_tree) + mc.spec.parsers.update( + get_bolt_parsers(mc.spec.parsers, self.modules, bolt_prototypes) + ) mc.steps.insert(0, self.evaluate) diff --git a/packages/bolt/examples/bolt_macro/src/data/demo/functions/redirect.mcfunction b/packages/bolt/examples/bolt_macro/src/data/demo/functions/redirect.mcfunction new file mode 100644 index 000000000..df761c5a7 --- /dev/null +++ b/packages/bolt/examples/bolt_macro/src/data/demo/functions/redirect.mcfunction @@ -0,0 +1,34 @@ +from mecha import AstCommand, AstChildren +from bolt import Runtime + +macro repeat n=brigadier:integer command=subcommand: + execute: + for _ in range(n.value): + yield command + +repeat 2 as @a run repeat 3 say ok +repeat 3 say world + +n = 1 +repeat n if score foo bar matches 1 say over! + +macro as at + targets=minecraft:entity{"type": "entities", "amount": "multiple"} + clause=subcommand{"redirect": ["execute"]}: + as targets at @s: + yield AstCommand(identifier="execute:subcommand", arguments=AstChildren([clause])) + +as at @e[type=pig] if block ~ ~ ~ water say blbllblb +as at @e[type=bat] setblock ~ ~ ~ lava +if score foo bar matches 1 run as at @e[type=chicken] kill @e[type=fox, distance=..4] + +macro execute as at + targets=minecraft:entity{"type": "entities", "amount": "multiple"} + clause=subcommand{"redirect": ["execute"]}: + runtime = ctx.inject(Runtime) + with runtime.scope() as commands: + as at targets: + yield AstCommand(identifier="execute:subcommand", arguments=AstChildren([clause])) + return commands[0].arguments[-1] + +if score foo bar matches 1 as at @e[type=chicken] kill @e[type=fox, distance=..4] diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 9f9fed98f..354403890 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1285,3 +1285,32 @@ for i in range(10): def f(): memo: return 9999 +### +macro hello thing=subcommand after: + pass +### +macro hello thing=subcommand{"redirect": ] + pass +### +macro hello thing=subcommand: + pass +hello print(123) +### +macro hello thing=subcommand: + pass +hello if True: + pass +### +macro hello thing=subcommand: + pass +hello say world +### +macro execute hello thing=subcommand: + pass +as @p hello say world +### +macro hello clause=subcommand{"redirect": ["execute"]}: + pass +hello if block ~ ~ ~ water say blbllblb +hello setblock ~ ~ ~ lava +hello run summon bat diff --git a/packages/bolt/tests/snapshots/bolt__parse_350__0.txt b/packages/bolt/tests/snapshots/bolt__parse_350__0.txt new file mode 100644 index 000000000..6febdca1c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_350__0.txt @@ -0,0 +1,7 @@ +#>ERROR Unexpected macro argument after subcommand. +# line 1, column 30 +# 1 | macro hello thing=subcommand after: +# : ^^^^^ +# 2 | pass +macro hello thing=subcommand after: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_351__0.txt b/packages/bolt/tests/snapshots/bolt__parse_351__0.txt new file mode 100644 index 000000000..d55907471 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_351__0.txt @@ -0,0 +1,7 @@ +#>ERROR Interpolation disabled. +# line 1, column 42 +# 1 | macro hello thing=subcommand{"redirect": ] +# : ^ +# 2 | pass +macro hello thing=subcommand{"redirect": ] + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_352__0.txt b/packages/bolt/tests/snapshots/bolt__parse_352__0.txt new file mode 100644 index 000000000..c8ddd1ce3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_352__0.txt @@ -0,0 +1,8 @@ +macro hello thing=subcommand: + pass +#>ERROR Can't use statement as a subcommand. +# line 3, column 7 +# 2 | pass +# 3 | hello print(123) +# : ^^^^^^^^^^ +hello print(123) diff --git a/packages/bolt/tests/snapshots/bolt__parse_353__0.txt b/packages/bolt/tests/snapshots/bolt__parse_353__0.txt new file mode 100644 index 000000000..3ca2033b6 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_353__0.txt @@ -0,0 +1,11 @@ +macro hello thing=subcommand: + pass +#>ERROR Can't use if as a subcommand. +# line 3, column 7 +# 2 | pass +# 3 | hello if True: +# : ^^^^^^^^ +# 4 | pass +# : ^^^^ +hello if True: + pass diff --git a/packages/bolt/tests/snapshots/bolt__parse_354__0.txt b/packages/bolt/tests/snapshots/bolt__parse_354__0.txt new file mode 100644 index 000000000..32d4bd892 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_354__0.txt @@ -0,0 +1,61 @@ +macro hello thing=subcommand: + pass +hello say world +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=38, lineno=2, colno=9) + identifier: 'hello:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'hello' + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + match_identifier: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + value: 'thing' + match_argument_parser: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + is_tag: False + namespace: None + path: 'subcommand' + match_argument_properties: None + + location: SourceLocation(pos=34, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=34, lineno=2, colno=5) + end_location: SourceLocation(pos=38, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=39, lineno=3, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + identifier: 'hello:subcommand' + arguments: + + location: SourceLocation(pos=45, lineno=3, colno=7) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=49, lineno=3, colno=11) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + fragments: + + location: SourceLocation(pos=49, lineno=3, colno=11) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + value: 'world' diff --git a/packages/bolt/tests/snapshots/bolt__parse_354__1.txt b/packages/bolt/tests/snapshots/bolt__parse_354__1.txt new file mode 100644 index 000000000..e3b8004e8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_354__1.txt @@ -0,0 +1,27 @@ +_bolt_lineno = [1, 8], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + def _bolt_macro0(thing): + pass + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=39, lineno=3, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + identifier: 'hello:subcommand' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=16) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_355__0.txt b/packages/bolt/tests/snapshots/bolt__parse_355__0.txt new file mode 100644 index 000000000..491d79db8 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_355__0.txt @@ -0,0 +1,85 @@ +macro execute hello thing=subcommand: + pass +as @p hello say world +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + identifier: 'execute:hello:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'execute' + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + match: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + value: 'hello' + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + match_identifier: + + location: SourceLocation(pos=20, lineno=1, colno=21) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'thing' + match_argument_parser: + + location: SourceLocation(pos=26, lineno=1, colno=27) + end_location: SourceLocation(pos=36, lineno=1, colno=37) + is_tag: False + namespace: None + path: 'subcommand' + match_argument_properties: None + + location: SourceLocation(pos=42, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=42, lineno=2, colno=5) + end_location: SourceLocation(pos=46, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=47, lineno=3, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=47, lineno=3, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'execute:as:targets:subcommand' + arguments: + + location: SourceLocation(pos=50, lineno=3, colno=4) + end_location: SourceLocation(pos=52, lineno=3, colno=6) + variable: 'p' + arguments: + + + location: SourceLocation(pos=53, lineno=3, colno=7) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'execute:hello:subcommand' + arguments: + + location: SourceLocation(pos=59, lineno=3, colno=13) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=63, lineno=3, colno=17) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + fragments: + + location: SourceLocation(pos=63, lineno=3, colno=17) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + value: 'world' diff --git a/packages/bolt/tests/snapshots/bolt__parse_355__1.txt b/packages/bolt/tests/snapshots/bolt__parse_355__1.txt new file mode 100644 index 000000000..f40f3cc50 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_355__1.txt @@ -0,0 +1,49 @@ +_bolt_lineno = [1, 8], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + def _bolt_macro0(thing): + pass + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], *_bolt_var0]))]))) +_bolt_var2 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=53, lineno=3, colno=7) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'execute:hello:subcommand' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=50, lineno=3, colno=4) + end_location: SourceLocation(pos=52, lineno=3, colno=6) + variable: 'p' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=47, lineno=3, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'execute:as:targets:subcommand' + arguments: + + +_bolt_refs[3] + + location: SourceLocation(pos=47, lineno=3, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + identifier: 'execute:subcommand' + arguments: + +_bolt_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=3, colno=22) + commands: + + diff --git a/packages/bolt/tests/snapshots/bolt__parse_356__0.txt b/packages/bolt/tests/snapshots/bolt__parse_356__0.txt new file mode 100644 index 000000000..22fd9711b --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_356__0.txt @@ -0,0 +1,198 @@ +macro hello clause=subcommand{"redirect": ["execute"]}: + pass +hello if block ~ ~ ~ water say blbllblb +hello setblock ~ ~ ~ lava +hello run summon bat +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=64, lineno=2, colno=9) + identifier: 'hello:subcommand' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'hello' + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=54, lineno=1, colno=55) + match_identifier: + + location: SourceLocation(pos=12, lineno=1, colno=13) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + value: 'clause' + match_argument_parser: + + location: SourceLocation(pos=19, lineno=1, colno=20) + end_location: SourceLocation(pos=29, lineno=1, colno=30) + is_tag: False + namespace: None + path: 'subcommand' + match_argument_properties: + + location: SourceLocation(pos=29, lineno=1, colno=30) + end_location: SourceLocation(pos=54, lineno=1, colno=55) + entries: + + location: SourceLocation(pos=30, lineno=1, colno=31) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + key: + + location: SourceLocation(pos=30, lineno=1, colno=31) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + value: 'redirect' + value: + + location: SourceLocation(pos=42, lineno=1, colno=43) + end_location: SourceLocation(pos=53, lineno=1, colno=54) + elements: + + location: SourceLocation(pos=43, lineno=1, colno=44) + end_location: SourceLocation(pos=52, lineno=1, colno=53) + value: 'execute' + + location: SourceLocation(pos=60, lineno=2, colno=5) + end_location: SourceLocation(pos=64, lineno=2, colno=9) + commands: + + location: SourceLocation(pos=60, lineno=2, colno=5) + end_location: SourceLocation(pos=64, lineno=2, colno=9) + identifier: 'pass' + arguments: + + + location: SourceLocation(pos=65, lineno=3, colno=1) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + identifier: 'hello:subcommand' + arguments: + + location: SourceLocation(pos=71, lineno=3, colno=7) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + identifier: 'execute:if:block:pos:block:subcommand' + arguments: + + location: SourceLocation(pos=80, lineno=3, colno=16) + end_location: SourceLocation(pos=85, lineno=3, colno=21) + x: + + location: SourceLocation(pos=80, lineno=3, colno=16) + end_location: SourceLocation(pos=81, lineno=3, colno=17) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=82, lineno=3, colno=18) + end_location: SourceLocation(pos=83, lineno=3, colno=19) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=84, lineno=3, colno=20) + end_location: SourceLocation(pos=85, lineno=3, colno=21) + type: 'relative' + value: 0 + + location: SourceLocation(pos=86, lineno=3, colno=22) + end_location: SourceLocation(pos=91, lineno=3, colno=27) + identifier: + + location: SourceLocation(pos=86, lineno=3, colno=22) + end_location: SourceLocation(pos=91, lineno=3, colno=27) + is_tag: False + namespace: None + path: 'water' + block_states: + + data_tags: None + + location: SourceLocation(pos=92, lineno=3, colno=28) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=92, lineno=3, colno=28) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=96, lineno=3, colno=32) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + fragments: + + location: SourceLocation(pos=96, lineno=3, colno=32) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + value: 'blbllblb' + + location: SourceLocation(pos=105, lineno=4, colno=1) + end_location: SourceLocation(pos=130, lineno=4, colno=26) + identifier: 'hello:subcommand' + arguments: + + location: SourceLocation(pos=111, lineno=4, colno=7) + end_location: SourceLocation(pos=130, lineno=4, colno=26) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=111, lineno=4, colno=7) + end_location: SourceLocation(pos=130, lineno=4, colno=26) + identifier: 'setblock:pos:block' + arguments: + + location: SourceLocation(pos=120, lineno=4, colno=16) + end_location: SourceLocation(pos=125, lineno=4, colno=21) + x: + + location: SourceLocation(pos=120, lineno=4, colno=16) + end_location: SourceLocation(pos=121, lineno=4, colno=17) + type: 'relative' + value: 0 + y: + + location: SourceLocation(pos=122, lineno=4, colno=18) + end_location: SourceLocation(pos=123, lineno=4, colno=19) + type: 'relative' + value: 0 + z: + + location: SourceLocation(pos=124, lineno=4, colno=20) + end_location: SourceLocation(pos=125, lineno=4, colno=21) + type: 'relative' + value: 0 + + location: SourceLocation(pos=126, lineno=4, colno=22) + end_location: SourceLocation(pos=130, lineno=4, colno=26) + identifier: + + location: SourceLocation(pos=126, lineno=4, colno=22) + end_location: SourceLocation(pos=130, lineno=4, colno=26) + is_tag: False + namespace: None + path: 'lava' + block_states: + + data_tags: None + + location: SourceLocation(pos=131, lineno=5, colno=1) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + identifier: 'hello:subcommand' + arguments: + + location: SourceLocation(pos=137, lineno=5, colno=7) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=141, lineno=5, colno=11) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + identifier: 'summon:entity' + arguments: + + location: SourceLocation(pos=148, lineno=5, colno=18) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + is_tag: False + namespace: None + path: 'bat' diff --git a/packages/bolt/tests/snapshots/bolt__parse_356__1.txt b/packages/bolt/tests/snapshots/bolt__parse_356__1.txt new file mode 100644 index 000000000..32a46d15c --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_356__1.txt @@ -0,0 +1,47 @@ +_bolt_lineno = [1, 8, 10, 12], [1, 3, 4, 5] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + def _bolt_macro0(clause): + pass + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) + _bolt_var1 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[1]) + _bolt_runtime.commands.extend(_bolt_var1) + _bolt_var2 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[2]) + _bolt_runtime.commands.extend(_bolt_var2) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=65, lineno=3, colno=1) + end_location: SourceLocation(pos=104, lineno=3, colno=40) + identifier: 'hello:subcommand' + arguments: + +_bolt_refs[1] + + location: SourceLocation(pos=105, lineno=4, colno=1) + end_location: SourceLocation(pos=130, lineno=4, colno=26) + identifier: 'hello:subcommand' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=131, lineno=5, colno=1) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + identifier: 'hello:subcommand' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=5, colno=21) + commands: + + + + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md index 165300253..925fdd2e5 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md @@ -84,3 +84,46 @@ tellraw @s {"text": "from demo:dummy_message"} kill @e say 42 ``` + +`@function demo:redirect` + +```mcfunction +function demo:redirect/nested_execute_2 +function demo:redirect/nested_execute_3 +execute if score foo bar matches 1 run say over! +execute as @e[type=pig] at @s if block ~ ~ ~ water run say blbllblb +execute as @e[type=bat] at @s run setblock ~ ~ ~ lava +execute if score foo bar matches 1 run execute as @e[type=chicken] at @s run kill @e[type=fox, distance=..4] +execute if score foo bar matches 1 as @e[type=chicken] at @s run kill @e[type=fox, distance=..4] +``` + +`@function demo:redirect/nested_execute_0` + +```mcfunction +say ok +say ok +say ok +``` + +`@function demo:redirect/nested_execute_1` + +```mcfunction +say ok +say ok +say ok +``` + +`@function demo:redirect/nested_execute_2` + +```mcfunction +execute as @a run function demo:redirect/nested_execute_0 +execute as @a run function demo:redirect/nested_execute_1 +``` + +`@function demo:redirect/nested_execute_3` + +```mcfunction +say world +say world +say world +``` From 99b538b50a8d39973f7882d300fa951313e4d928 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 9 Feb 2023 00:14:39 +0000 Subject: [PATCH 1141/1554] 0.30.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 5548d5def..c39569c82 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.30.0 (2023-02-09) +### Feature +* Macro subcommands ([`5db484e`](https://github.com/mcbeet/bolt/commit/5db484ef754bbd5eaeea0c16574ecc23e160a490)) + ## v0.29.0 (2023-02-06) ### Feature * Update 1.19 ([`0a8ca58`](https://github.com/mcbeet/bolt/commit/0a8ca580f4e3b155154fd8714ddb6ccc4c13121f)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index e91c9fc88..f484f8227 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.29.0" +__version__ = "0.30.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index b20c4fc79..fb0228b94 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.29.0" +version = "0.30.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 0ece317c53f61a0c6439bebc3791c8ca7a7baf96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 05:07:54 +0000 Subject: [PATCH 1142/1554] build(deps): bump beet from 0.83.1 to 0.84.0 Bumps [beet](https://github.com/mcbeet/beet) from 0.83.1 to 0.84.0. - [Release notes](https://github.com/mcbeet/beet/releases) - [Changelog](https://github.com/mcbeet/beet/blob/main/CHANGELOG.md) - [Commits](https://github.com/mcbeet/beet/compare/v0.83.1...v0.84.0) --- updated-dependencies: - dependency-name: beet dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/bolt/poetry.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 54fddb869..462a50082 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -20,14 +20,14 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "beet" -version = "0.83.1" +version = "0.84.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "beet-0.83.1-py3-none-any.whl", hash = "sha256:f2f8b261314063d47ebf205c7a4b7902dce139d9d8c1d8019277860d6558d72b"}, - {file = "beet-0.83.1.tar.gz", hash = "sha256:775677c22ee99f8cadafa7fd8147a38a74628772624be20747031ea07d99d9df"}, + {file = "beet-0.84.0-py3-none-any.whl", hash = "sha256:3a4c9111936056d156aea5faaef650bc875f807a9e41d4a591bdd8f26bffe7b1"}, + {file = "beet-0.84.0.tar.gz", hash = "sha256:633f171abcf392071d70cba15f0c9b435a7b9b56dabc248cd25bf967c9e8d288"}, ] [package.dependencies] @@ -36,7 +36,7 @@ click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.10.2,<0.11.0" +pathspec = ">=0.11.0,<0.12.0" pydantic = ">=1.10.2,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" @@ -743,14 +743,14 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.10.2" +version = "0.11.0" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, + {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, + {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, ] [[package]] From 976e1d61fd0d37ce50992c4b2909c9f7a3e29178 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 05:04:47 +0000 Subject: [PATCH 1143/1554] build(deps-dev): bump pyright from 1.1.292 to 1.1.293 Bumps [pyright](https://github.com/Microsoft/pyright/tree/HEAD/packages/pyright) from 1.1.292 to 1.1.293. - [Release notes](https://github.com/Microsoft/pyright/releases) - [Commits](https://github.com/Microsoft/pyright/commits/1.1.293/packages/pyright) --- updated-dependencies: - dependency-name: pyright dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/bolt/package-lock.json | 14 +++++++------- packages/bolt/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bolt/package-lock.json b/packages/bolt/package-lock.json index 6e9167f35..cfbe58a68 100644 --- a/packages/bolt/package-lock.json +++ b/packages/bolt/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "devDependencies": { - "pyright": "^1.1.292" + "pyright": "^1.1.293" } }, "node_modules/pyright": { - "version": "1.1.292", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.292.tgz", - "integrity": "sha512-qwNT2mBKiZXSzVckHkyuCoyrKa8CXh6o4xH7PL/+jeIdiv+a5ljfkxPvIEm6Stln8YEU/tnQb8xODUtgKsu5YA==", + "version": "1.1.293", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.293.tgz", + "integrity": "sha512-VFRGaYwRp5vMTdSpw+0ZwdSz0c/3BRYrBaoSttSelJ6RVYrDkKOE0VKRIyXkA7wxCCqd29zRPbbK4RJWpYoHjg==", "dev": true, "bin": { "pyright": "index.js", @@ -24,9 +24,9 @@ }, "dependencies": { "pyright": { - "version": "1.1.292", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.292.tgz", - "integrity": "sha512-qwNT2mBKiZXSzVckHkyuCoyrKa8CXh6o4xH7PL/+jeIdiv+a5ljfkxPvIEm6Stln8YEU/tnQb8xODUtgKsu5YA==", + "version": "1.1.293", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.293.tgz", + "integrity": "sha512-VFRGaYwRp5vMTdSpw+0ZwdSz0c/3BRYrBaoSttSelJ6RVYrDkKOE0VKRIyXkA7wxCCqd29zRPbbK4RJWpYoHjg==", "dev": true } } diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 9c4fa9e71..0ebdca53b 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -4,6 +4,6 @@ "check": "poetry run pyright" }, "devDependencies": { - "pyright": "^1.1.292" + "pyright": "^1.1.293" } } From 883691baa55cfca91e02ea05b226e8823cd8058d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Thu, 16 Feb 2023 00:45:26 +0100 Subject: [PATCH 1144/1554] fix: properly track del statement semantics --- packages/bolt/bolt/parse.py | 32 +++++----- packages/bolt/bolt/resources/commands.json | 1 - packages/bolt/bolt/semantics.py | 9 ++- .../src/data/demo/functions/foo.mcfunction | 4 ++ .../tests/resources/bolt_examples.mcfunction | 4 ++ .../tests/snapshots/bolt__parse_357__0.txt | 60 +++++++++++++++++++ .../tests/snapshots/bolt__parse_357__1.txt | 21 +++++++ .../tests/snapshots/spec__prototypes__0.json | 1 - 8 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_357__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_357__1.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 9fed35def..6275bd665 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -40,7 +40,7 @@ "parse_python_import", "parse_import_name", "parse_name_list", - "GlobalNonlocalHandler", + "BindingStorageHandler", "DocstringHandler", "FlushPendingBindingsParser", "SubcommandConstraint", @@ -635,7 +635,7 @@ def create_bolt_command_parser( ): """Compose command parsers.""" parser = MemoHandler(parser) - parser = GlobalNonlocalHandler(parser) + parser = BindingStorageHandler(parser) parser = ImportStatementHandler(parser, modules) parser = DocstringHandler(parser) parser = UndefinedIdentifierErrorHandler(parser) @@ -1910,31 +1910,35 @@ def parse_name_list(stream: TokenStream) -> AstIdentifier: @dataclass -class GlobalNonlocalHandler: - """Handle global and nonlocal declarations.""" +class BindingStorageHandler: + """Handle binding storage.""" parser: Parser - storage_qualifiers: Dict[str, Literal["global", "nonlocal"]] = field( + storage_qualifiers: Dict[str, Literal["global", "nonlocal", "deleted"]] = field( default_factory=lambda: { "global:subcommand": "global", "nonlocal:subcommand": "nonlocal", + "del:target": "deleted", } ) def __call__(self, stream: TokenStream) -> Any: if isinstance(node := self.parser(stream), AstCommand): if storage := self.storage_qualifiers.get(node.identifier): - subcommand = cast(AstCommand, node.arguments[0]) - lexical_scope = get_stream_lexical_scope(stream) - while True: - if isinstance(name := subcommand.arguments[0], AstIdentifier): - lexical_scope.bind_storage(name.value, storage, name) - if subcommand.identifier == f"{storage}:name:subcommand": - subcommand = cast(AstCommand, subcommand.arguments[1]) - else: - break + + if isinstance(target := node.arguments[0], AstTargetIdentifier): + lexical_scope.bind_storage(target.value, storage, target) + + elif isinstance(subcommand := node.arguments[0], AstCommand): + while True: + if isinstance(name := subcommand.arguments[0], AstIdentifier): + lexical_scope.bind_storage(name.value, storage, name) + if subcommand.identifier == f"{storage}:name:subcommand": + subcommand = cast(AstCommand, subcommand.arguments[1]) + else: + break return node diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 3d48b9051..3783887c0 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -130,7 +130,6 @@ }, "del": { "type": "literal", - "executable": true, "children": { "target": { "type": "argument", diff --git a/packages/bolt/bolt/semantics.py b/packages/bolt/bolt/semantics.py index 91b851c03..db808f6c0 100644 --- a/packages/bolt/bolt/semantics.py +++ b/packages/bolt/bolt/semantics.py @@ -145,7 +145,7 @@ class Variable: The number of bindings in common after forking. """ - storage: Literal["local", "nonlocal", "global"] = "local" + storage: Literal["local", "nonlocal", "global", "deleted"] = "local" bindings: List[Binding] = field(default_factory=list) cutoff: int = extra_field(default=0) @@ -193,7 +193,8 @@ class LexicalScope: pending_bindings: List[Tuple[str, AstNode]] = extra_field(default_factory=list) def has_binding(self, identifier: str, search_parents: bool = False) -> bool: - return identifier in self.variables or bool( + variable = self.variables.get(identifier) + return (variable and variable.storage != "deleted") or bool( search_parents and self.parent and self.parent.has_binding(identifier, search_parents=True) @@ -260,7 +261,7 @@ def bind_variable(self, identifier: str, node: AstNode): def bind_storage( self, identifier: str, - storage: Literal["nonlocal", "global"], + storage: Literal["nonlocal", "global", "deleted"], node: AstNode, ): self.dirty = True @@ -271,6 +272,8 @@ def bind_storage( if not variable: variable = Variable(storage=storage) self.variables[identifier] = variable + elif storage == "deleted": + variable.storage = storage elif variable.storage != storage: exc = InconsistentIdentifierStorage(identifier, storage, self) raise set_location(exc, node) diff --git a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction index 3d032ee9b..8a9f281dc 100644 --- a/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_basic/src/data/demo/functions/foo.mcfunction @@ -665,3 +665,7 @@ whitelist add random_id other_id = UUID(int=rd.getrandbits(128)) attribute @s minecraft:generic.attack_speed modifier add other_id "double" 0.5 multiply + +x = 1 +del x +x = 2 diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 354403890..58faaee7c 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1314,3 +1314,7 @@ macro hello clause=subcommand{"redirect": ["execute"]}: hello if block ~ ~ ~ water say blbllblb hello setblock ~ ~ ~ lava hello run summon bat +### +x = 1 +del x +x = 2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_357__0.txt b/packages/bolt/tests/snapshots/bolt__parse_357__0.txt new file mode 100644 index 000000000..d07b0bbf1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_357__0.txt @@ -0,0 +1,60 @@ +x = 1 +del x +x = 2 +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=4, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=1, lineno=1, colno=2) + value: 'x' + rebind: False + value: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 1 + type_annotation: None + + location: SourceLocation(pos=6, lineno=2, colno=1) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + identifier: 'del:target' + arguments: + + location: SourceLocation(pos=10, lineno=2, colno=5) + end_location: SourceLocation(pos=11, lineno=2, colno=6) + value: 'x' + rebind: False + + location: SourceLocation(pos=12, lineno=3, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=6) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=12, lineno=3, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=6) + operator: '=' + target: + + location: SourceLocation(pos=12, lineno=3, colno=1) + end_location: SourceLocation(pos=13, lineno=3, colno=2) + value: 'x' + rebind: False + value: + + location: SourceLocation(pos=16, lineno=3, colno=5) + end_location: SourceLocation(pos=17, lineno=3, colno=6) + value: 2 + type_annotation: None diff --git a/packages/bolt/tests/snapshots/bolt__parse_357__1.txt b/packages/bolt/tests/snapshots/bolt__parse_357__1.txt new file mode 100644 index 000000000..a42fcc1dc --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_357__1.txt @@ -0,0 +1,21 @@ +_bolt_lineno = [1, 9], [1, 3] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 1 + x = _bolt_var0 + del x + _bolt_var1 = 2 + x = _bolt_var1 +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=4, colno=1) + commands: + + + diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 073e1ccfe..23e9c9892 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -453,7 +453,6 @@ "debug:stop", "def:function:body", "defaultgamemode:gamemode", - "del", "del:target", "deop:targets", "difficulty", From 58335426cf961c28c805ac23513f6d4069164d66 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 15 Feb 2023 23:46:38 +0000 Subject: [PATCH 1145/1554] 0.30.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index c39569c82..346e9f81d 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.30.1 (2023-02-15) +### Fix +* Properly track del statement semantics ([`66c543f`](https://github.com/mcbeet/bolt/commit/66c543fd82902ed7cbf7e04e6a0b57a45715c0bd)) + ## v0.30.0 (2023-02-09) ### Feature * Macro subcommands ([`5db484e`](https://github.com/mcbeet/bolt/commit/5db484ef754bbd5eaeea0c16574ecc23e160a490)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index f484f8227..a67066ca3 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.30.0" +__version__ = "0.30.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index fb0228b94..ed03823ad 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.30.0" +version = "0.30.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From ef483614749911a7e8dc8c3f86c68fa6b26e670f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 19 Feb 2023 05:01:17 +0100 Subject: [PATCH 1146/1554] feat: add prelude option --- packages/bolt/bolt/ast.py | 17 + packages/bolt/bolt/codegen.py | 14 +- packages/bolt/bolt/module.py | 89 ++- packages/bolt/bolt/parse.py | 41 +- packages/bolt/bolt/plugin.py | 2 + packages/bolt/examples/bolt_prelude/beet.yml | 61 ++ .../src/data/demo/functions/bar.mcfunction | 1 + .../src/data/demo/functions/foo.mcfunction | 11 + .../src/data/demo/modules/macros.bolt | 2 + .../src/data/demo/modules/other.bolt | 9 + .../src/data/demo/modules/prelude.bolt | 8 + .../src/data/no_idea/modules/aaa.bolt | 6 + .../src/data/no_idea/modules/bbb.bolt | 2 + .../src/data/no_idea/modules/prelude.bolt | 6 + .../examples__build_bolt_prelude__0.pack.md | 605 ++++++++++++++++++ 15 files changed, 857 insertions(+), 17 deletions(-) create mode 100644 packages/bolt/examples/bolt_prelude/beet.yml create mode 100644 packages/bolt/examples/bolt_prelude/src/data/demo/functions/bar.mcfunction create mode 100644 packages/bolt/examples/bolt_prelude/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/examples/bolt_prelude/src/data/demo/modules/macros.bolt create mode 100644 packages/bolt/examples/bolt_prelude/src/data/demo/modules/other.bolt create mode 100644 packages/bolt/examples/bolt_prelude/src/data/demo/modules/prelude.bolt create mode 100644 packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/aaa.bolt create mode 100644 packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/bbb.bolt create mode 100644 packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/prelude.bolt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index b0a8b2c65..d36e5854f 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -55,6 +55,7 @@ "AstFromImport", "AstImportedItem", "AstImportedMacro", + "AstPrelude", ] @@ -528,3 +529,19 @@ class AstImportedMacro(AstNode): name: str = required_field() declaration: AstMacro = required_field() + + +@dataclass(frozen=True, slots=True) +class AstPrelude(AstFromImport): + """Ast prelude node.""" + + @classmethod + def placeholder(cls, resource_location: str) -> "AstPrelude": + return cls( + arguments=AstChildren( + [ + AstResourceLocation.from_value(resource_location), + AstImportedItem(name="_bolt_placeholder"), + ] + ) + ) diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index af634513d..ee67edcfc 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -22,6 +22,7 @@ List, Literal, Optional, + Set, Tuple, Type, Union, @@ -70,6 +71,7 @@ AstMacroCall, AstMacroMatchArgument, AstMemo, + AstPrelude, AstProcMacro, AstSlice, AstTarget, @@ -91,6 +93,8 @@ class Accumulator: indentation: str = "" refs: List[Any] = field(default_factory=list) + dependencies: Set[str] = field(default_factory=set) + prelude_imports: List[AstPrelude] = field(default_factory=list) macros: MacroLibrary = field(default_factory=dict) macro_ids: Dict[str, int] = field(default_factory=dict) memo_index: Dict[AstMemo, int] = field(default_factory=dict) @@ -471,6 +475,8 @@ def __call__(self, node: AstRoot) -> CodegenResult: # type: ignore source=acc.get_source(), output=output, refs=acc.refs, + dependencies=acc.dependencies, + prelude_imports=acc.prelude_imports, macros=acc.macros, ) @@ -898,10 +904,12 @@ def import_statement( alias = cast(AstImportedItem, node.arguments[1]).name if module.namespace: + full_path = module.get_value() acc.statement( - f"{alias} = _bolt_runtime.import_module({module.get_value()!r}).namespace", + f"{alias} = _bolt_runtime.import_module({full_path!r}).namespace", lineno=node, ) + acc.dependencies.add(full_path) else: rhs = acc.import_module(module.path) acc.statement(f"{alias} = {rhs}", lineno=node) @@ -923,6 +931,9 @@ def from_import_statement( node: AstFromImport, acc: Accumulator, ) -> Optional[List[str]]: + if isinstance(node, AstPrelude): + acc.prelude_imports.append(node) + module = cast(AstResourceLocation, node.arguments[0]) items = cast( AstChildren[Union[AstImportedItem, AstImportedMacro]], node.arguments[1:] @@ -939,6 +950,7 @@ def from_import_statement( targets.append(item.name) stmt = f"{', '.join(targets)} = _bolt_runtime.from_module_import({full_path!r}, {', '.join(map(repr, names))})" acc.statement(stmt, lineno=node) + acc.dependencies.add(full_path) else: stmt = f"_bolt_from_import = {acc.import_module(module.path)}" acc.statement(stmt, lineno=node) diff --git a/packages/bolt/bolt/module.py b/packages/bolt/bolt/module.py index 9c47f5118..42745e044 100644 --- a/packages/bolt/bolt/module.py +++ b/packages/bolt/bolt/module.py @@ -22,6 +22,7 @@ Callable, ClassVar, Dict, + Iterable, Iterator, List, Mapping, @@ -37,6 +38,9 @@ from beet.core.utils import JsonDict, extra_field, import_from_string, required_field from mecha import ( AstCacheBackend, + AstChildren, + AstNode, + AstResourceLocation, AstRoot, CompilationDatabase, CompilationError, @@ -48,10 +52,11 @@ ) from tokenstream import InvalidSyntax -from .ast import AstMacro +from .ast import AstImportedItem, AstImportedMacro, AstMacro, AstPrelude +from .semantics import LexicalScope from .utils import internal, rewrite_traceback -logger = logging.getLogger("mecha") +logger = logging.getLogger("bolt") class UnusableCompilationUnit(MechaError): @@ -90,7 +95,10 @@ class CompiledModule: ast: AstRoot code: Optional[CodeType] refs: List[Any] + dependencies: Set[str] + prelude_imports: List[AstPrelude] macros: MacroLibrary + lexical_scope: LexicalScope output: Optional[str] resource_location: Optional[str] globals: Set[str] @@ -106,6 +114,8 @@ class CodegenResult: source: Optional[str] = None output: Optional[str] = None refs: List[Any] = field(default_factory=list) + dependencies: Set[str] = field(default_factory=set) + prelude_imports: List[AstPrelude] = field(default_factory=list) macros: MacroLibrary = field(default_factory=dict) @@ -137,8 +147,12 @@ class ModuleManager(Mapping[TextFileBase[Any], CompiledModule]): ) stack: List[CompiledModule] = extra_field(default_factory=list) parse_stack: List[TextFileBase[Any]] = extra_field(default_factory=list) + parse_scopes: Dict[TextFileBase[Any], LexicalScope] = extra_field( + default_factory=dict + ) globals: JsonDict = extra_field(default_factory=dict) builtins: Set[str] = extra_field(default_factory=set) + prelude: Dict[str, Optional[AstPrelude]] = extra_field(default_factory=dict) execution_count: int = 0 @@ -188,7 +202,7 @@ def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: or module.ast is compilation_unit.ast ): return module - logger.warning('Code generation due to ast update for module "%s".', name) + logger.warning('Code generation due to ast update "%s".', name) elif not compilation_unit.ast: previous = self.database.current @@ -208,7 +222,7 @@ def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: return self[current] else: - logger.debug('Code generation for module "%s".', name) + logger.debug('Code generation "%s".', name) result = self.codegen(compilation_unit.ast) @@ -230,7 +244,10 @@ def __getitem__(self, current: Union[TextFileBase[Any], str]) -> CompiledModule: ast=compilation_unit.ast, code=code, refs=result.refs, + dependencies=result.dependencies, + prelude_imports=result.prelude_imports, macros=result.macros, + lexical_scope=self.parse_scopes.get(current) or LexicalScope(), output=result.output, resource_location=compilation_unit.resource_location, globals=set(self.globals), @@ -333,6 +350,59 @@ def parse_push(self, current: TextFileBase[Any]): finally: self.parse_stack.pop() + def add_prelude(self, *args: Union[str, Iterable[str]]): + """Add modules to the prelude.""" + for arg in args: + if isinstance(arg, str): + arg = [arg] + for resource_location in arg: + self.prelude.setdefault(resource_location, None) + + def export_prelude(self, module: CompiledModule) -> Optional[AstPrelude]: + """Export local variables and macros from a given module into a prelude import.""" + if not module.resource_location: + return None + + arguments: List[AstNode] = [ + AstResourceLocation.from_value(module.resource_location) + ] + + for name, variable in module.lexical_scope.variables.items(): + if variable.storage == "local": + arguments.append(AstImportedItem(name=name)) + + for overloads in module.macros.values(): + for name, macro in overloads: + arguments.append(AstImportedMacro(name=name, declaration=macro)) + + return AstPrelude(arguments=AstChildren(arguments)) + + def load_prelude(self) -> List[AstPrelude]: + """Load the prelude imports.""" + current_prelude = self.prelude + + prelude_imports: List[AstPrelude] = [] + + for resource_location, prelude in list(current_prelude.items()): + if not prelude: + self.prelude = {} + try: + module = self[resource_location] + except UnusableCompilationUnit: + pass + else: + prelude = self.export_prelude(module) + finally: + self.prelude = current_prelude + + if not prelude: + prelude = AstPrelude.placeholder(resource_location) + + current_prelude[resource_location] = prelude + prelude_imports.append(prelude) + + return prelude_imports + @dataclass class ModuleCacheBackend(AstCacheBackend): @@ -349,6 +419,8 @@ def load_data(self, f: BufferedReader) -> JsonDict: raise ValueError("Version mismatch.") if data["globals"] != set(self.modules.globals): raise ValueError("Globals mismatch.") + if data["prelude_imports"] != self.modules.load_prelude(): + raise ValueError("Prelude mismatch.") for group, exports in cast(MacroLibrary, data["macros"]).items(): for (_, macro), extern in exports.items(): @@ -371,12 +443,18 @@ def load(self, f: BufferedReader) -> AstRoot: ast=data["ast"], code=marshal.load(f), refs=data["refs"], + dependencies=data["dependencies"], + prelude_imports=data["prelude_imports"], macros=data["macros"], + lexical_scope=data["lexical_scope"], output=data["output"], resource_location=data["resource_location"], globals=data["globals"], ) + for dependency in data["dependencies"]: + self.modules.get(dependency) + return data["ast"] def dump(self, node: AstRoot, f: BufferedWriter): @@ -386,7 +464,10 @@ def dump(self, node: AstRoot, f: BufferedWriter): { "ast": module.ast, "refs": module.refs, + "dependencies": module.dependencies, + "prelude_imports": module.prelude_imports, "macros": module.macros, + "lexical_scope": module.lexical_scope, "output": module.output, "resource_location": module.resource_location, "globals": module.globals, diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 6275bd665..e2fe058ba 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -577,18 +577,38 @@ def __call__(self, stream: TokenStream) -> Any: current = self.modules.database.current resource_location = self.modules.database[current].resource_location + prelude = self.modules.load_prelude() + + if module := self.modules.registry.get(current): + return module.ast + global_scope = GlobalScope( identifiers=set(self.modules.globals) | self.modules.builtins | {"__name__"}, ) + lexical_scope = global_scope.push(LexicalScope) + self.modules.parse_scopes[current] = lexical_scope + + pending_macros = get_stream_pending_macros(stream) + + for from_import in prelude: + for item in from_import.arguments[1:]: + if isinstance(item, AstImportedMacro): + pending_macros.append(item.declaration) + elif isinstance(item, AstImportedItem): + lexical_scope.bind_variable(item.name, item) + with self.modules.parse_push(current), stream.provide( resource_location=resource_location, - lexical_scope=global_scope.push(LexicalScope), + lexical_scope=lexical_scope, ): node = self.parser(stream) + if prelude and isinstance(node, AstRoot): + node = replace(node, commands=AstChildren([*prelude, *node.commands])) + self.macro_handler.cache_local_spec(stream) if isinstance(node, AstRoot) and isinstance(current, Module): @@ -1620,6 +1640,14 @@ def __call__(self, stream: TokenStream) -> AstProcMacroResult: identifier: str = properties["identifier"] module = self.modules[resource_location] + + if not module.executed: + with self.modules.error_handler( + "Top-level statement raised an exception.", + resource_location, + ): + self.modules.eval(module) + runtime: CommandEmitter = module.namespace["_bolt_runtime"] macro = module.namespace["_bolt_proc_macros"][identifier] @@ -1853,17 +1881,6 @@ def handle_from_import(self, stream: TokenStream, node: AstCommand) -> AstComman arguments.append(set_location(imported_macro, item)) pending_macros.append(macro) - if not compiled_module.executed and isinstance( - macro, AstProcMacro - ): - with self.modules.error_handler( - "Top-level statement raised an exception.", - target_name, - ), self.modules.parse_push( - target # type: ignore - ): - self.modules.eval(compiled_module) - elif item.identifier: arguments.append(item) lexical_scope.bind_variable(item.name, item) diff --git a/packages/bolt/bolt/plugin.py b/packages/bolt/bolt/plugin.py index 570af5348..209af4d23 100644 --- a/packages/bolt/bolt/plugin.py +++ b/packages/bolt/bolt/plugin.py @@ -12,6 +12,7 @@ class BoltOptions(BaseModel): entrypoint: ListOption[str] = ListOption() + prelude: ListOption[str] = ListOption() def beet_default(ctx: Context): @@ -23,3 +24,4 @@ def bolt(ctx: Context, opts: BoltOptions): """Plugin for configuring bolt.""" runtime = ctx.inject(Runtime) runtime.evaluate.add_entrypoint(opts.entrypoint.entries()) + runtime.modules.add_prelude(opts.prelude.entries()) diff --git a/packages/bolt/examples/bolt_prelude/beet.yml b/packages/bolt/examples/bolt_prelude/beet.yml new file mode 100644 index 000000000..5af0bc5d6 --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/beet.yml @@ -0,0 +1,61 @@ +pipeline: + - require: + - bolt + data_pack: + load: "src" + pipeline: + - mecha + - beet.contrib.rename_files + - beet.contrib.find_replace + meta: + bolt: + prelude: + - "demo:prelude" + - "no_idea:prelude" + rename_files: + data_pack: + match: "demo:*" + find: "demo:([a-z_/]+)" + replace: 'demo:ref/\1' + find_replace: + data_pack: + match: "demo:*" + substitute: + find: "demo:([a-z_/]+)" + replace: 'demo:ref/\1' + - require: + - bolt + - bolt.contrib.debug_codegen + data_pack: + load: "src" + pipeline: + - mecha + - beet.contrib.rename_files + - beet.contrib.find_replace + meta: + bolt: + prelude: + - "demo:prelude" + - "no_idea:prelude" + rename_files: + data_pack: + match: "demo:*" + find: "demo:([a-z_/]+)" + replace: 'demo:codegen/\1' + find_replace: + data_pack: + match: "demo:*" + substitute: + find: "demo:([a-z_/]+)" + replace: 'demo:codegen/\1' + - require: + - bolt + data_pack: + load: "src" + pipeline: + - mecha + meta: + bolt: + prelude: + - "demo:prelude" + - "no_idea:prelude" diff --git a/packages/bolt/examples/bolt_prelude/src/data/demo/functions/bar.mcfunction b/packages/bolt/examples/bolt_prelude/src/data/demo/functions/bar.mcfunction new file mode 100644 index 000000000..a57829285 --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/demo/functions/bar.mcfunction @@ -0,0 +1 @@ +dump_ast() diff --git a/packages/bolt/examples/bolt_prelude/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_prelude/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..43ed3b8b6 --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,11 @@ +!!! +greet anonymous() +summon CALAMAR +CALAMAR = None + +!!! +alright_then() +what about minecraft:becomeduck + +!!! +dump_ast() diff --git a/packages/bolt/examples/bolt_prelude/src/data/demo/modules/macros.bolt b/packages/bolt/examples/bolt_prelude/src/data/demo/modules/macros.bolt new file mode 100644 index 000000000..551ab18f2 --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/demo/modules/macros.bolt @@ -0,0 +1,2 @@ +macro greet name=brigadier:string{"type": "word"}: + say f"hello {name.value}" diff --git a/packages/bolt/examples/bolt_prelude/src/data/demo/modules/other.bolt b/packages/bolt/examples/bolt_prelude/src/data/demo/modules/other.bolt new file mode 100644 index 000000000..f0334fe24 --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/demo/modules/other.bolt @@ -0,0 +1,9 @@ +from bolt import Runtime + +CALAMAR = minecraft:squid + +def dump_ast(): + runtime = ctx.inject(Runtime) + function generate_path(): + for line in runtime.modules.current.ast.dump().splitlines(): + raw f"# {line}" diff --git a/packages/bolt/examples/bolt_prelude/src/data/demo/modules/prelude.bolt b/packages/bolt/examples/bolt_prelude/src/data/demo/modules/prelude.bolt new file mode 100644 index 000000000..4244fca4d --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/demo/modules/prelude.bolt @@ -0,0 +1,8 @@ +from ./macros import greet +from ./other import CALAMAR, dump_ast + +macro !!!: + say !!! + +def anonymous() -> str: + return "anonymous" diff --git a/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/aaa.bolt b/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/aaa.bolt new file mode 100644 index 000000000..f0e69337a --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/aaa.bolt @@ -0,0 +1,6 @@ +from ./bbb import okok +from demo:macros import greet + +def alright_then(): + okok() + greet steve diff --git a/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/bbb.bolt b/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/bbb.bolt new file mode 100644 index 000000000..608a8e98a --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/bbb.bolt @@ -0,0 +1,2 @@ +def okok(): + say ok ok diff --git a/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/prelude.bolt b/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/prelude.bolt new file mode 100644 index 000000000..d29f46a8d --- /dev/null +++ b/packages/bolt/examples/bolt_prelude/src/data/no_idea/modules/prelude.bolt @@ -0,0 +1,6 @@ +from ./aaa import alright_then + +macro what about(stream): + from mecha import delegate + node = delegate("resource_location", stream) + say repr(node) diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md new file mode 100644 index 000000000..7c0503a10 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md @@ -0,0 +1,605 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 10, + "description": "" + } +} +``` + +### demo + +`@function(strip_final_newline) demo:ref/bar` + +```mcfunction + +``` + +`@function demo:ref/foo` + +```mcfunction +say !!! +say hello anonymous +summon minecraft:squid +say !!! +say ok ok +say hello steve +say AstResourceLocation(is_tag=False, namespace='minecraft', path='becomeduck') +say !!! +``` + +`@function demo:codegen/bar` + +```mcfunction +_bolt_lineno = [1], [1] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + CALAMAR, dump_ast, anonymous, _bolt_macro0, _bolt_macro1 = _bolt_runtime.from_module_import('demo:codegen/prelude', 'CALAMAR', 'dump_ast', 'anonymous', '_bolt_macro0', '_bolt_macro1') + alright_then, _bolt_macro2 = _bolt_runtime.from_module_import('no_idea:prelude', 'alright_then', '_bolt_macro0') + _bolt_var0 = dump_ast + _bolt_var0 = _bolt_var0() +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +``` + +`@function demo:codegen/foo` + +```mcfunction +_bolt_lineno = [1, 13, 18, 22, 26, 28, 31, 33], [1, 2, 3, 4, 6, 7, 10, 11] +_bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] +_bolt_helper_interpolate_word = _bolt_runtime.helpers['interpolate_word'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] +with _bolt_runtime.scope() as _bolt_var9: + CALAMAR, dump_ast, anonymous, _bolt_macro0, _bolt_macro1 = _bolt_runtime.from_module_import('demo:codegen/prelude', 'CALAMAR', 'dump_ast', 'anonymous', '_bolt_macro0', '_bolt_macro1') + alright_then, _bolt_macro2 = _bolt_runtime.from_module_import('no_idea:prelude', 'alright_then', '_bolt_macro0') + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[0]) + _bolt_runtime.commands.extend(_bolt_var0) + _bolt_var1 = anonymous + _bolt_var1 = _bolt_var1() + _bolt_var1 = _bolt_helper_interpolate_word(_bolt_var1, _bolt_refs[1]) + _bolt_var2 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var1]))) + _bolt_runtime.commands.extend(_bolt_var2) + _bolt_var3 = CALAMAR + _bolt_var3 = _bolt_helper_interpolate_resource_location(_bolt_var3, _bolt_refs[3]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_var3]))) + _bolt_var4 = None + _bolt_rebind = _bolt_helper_get_rebind(CALAMAR) + CALAMAR = _bolt_var4 + if _bolt_rebind is not None: + CALAMAR = _bolt_rebind(CALAMAR) + _bolt_var5 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[5]) + _bolt_runtime.commands.extend(_bolt_var5) + _bolt_var6 = alright_then + _bolt_var6 = _bolt_var6() + _bolt_runtime.commands.append(_bolt_refs[7]) + _bolt_var7 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro1, _bolt_refs[6]) + _bolt_runtime.commands.extend(_bolt_var7) + _bolt_var8 = dump_ast + _bolt_var8 = _bolt_var8() +_bolt_var10 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var9)) +``` + +`@function(strip_final_newline) demo:bar` + +```mcfunction + +``` + +`@function demo:foo` + +```mcfunction +say !!! +say hello anonymous +summon minecraft:squid +say !!! +say ok ok +say hello steve +say AstResourceLocation(is_tag=False, namespace='minecraft', path='becomeduck') +say !!! +``` + +### bolt_prelude + +`@function bolt_prelude:generated_0` + +```mcfunction +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=11, lineno=2, colno=1) +# commands: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# identifier: '' +# arguments: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# is_tag: False +# namespace: 'demo' +# path: 'prelude' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'CALAMAR' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'dump_ast' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'anonymous' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: '_bolt_macro0' +# declaration: +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=80, lineno=2, colno=30) +# identifier: 'greet:name' +# arguments: +# +# location: SourceLocation(pos=6, lineno=1, colno=7) +# end_location: SourceLocation(pos=11, lineno=1, colno=12) +# value: 'greet' +# +# location: SourceLocation(pos=12, lineno=1, colno=13) +# end_location: SourceLocation(pos=49, lineno=1, colno=50) +# match_identifier: +# +# location: SourceLocation(pos=12, lineno=1, colno=13) +# end_location: SourceLocation(pos=16, lineno=1, colno=17) +# value: 'name' +# match_argument_parser: +# +# location: SourceLocation(pos=17, lineno=1, colno=18) +# end_location: SourceLocation(pos=33, lineno=1, colno=34) +# is_tag: False +# namespace: 'brigadier' +# path: 'string' +# match_argument_properties: +# +# location: SourceLocation(pos=33, lineno=1, colno=34) +# end_location: SourceLocation(pos=49, lineno=1, colno=50) +# entries: +# +# location: SourceLocation(pos=34, lineno=1, colno=35) +# end_location: SourceLocation(pos=48, lineno=1, colno=49) +# key: +# +# location: SourceLocation(pos=34, lineno=1, colno=35) +# end_location: SourceLocation(pos=40, lineno=1, colno=41) +# value: 'type' +# value: +# +# location: SourceLocation(pos=42, lineno=1, colno=43) +# end_location: SourceLocation(pos=48, lineno=1, colno=49) +# value: 'word' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: '_bolt_macro1' +# declaration: +# +# location: SourceLocation(pos=66, lineno=4, colno=1) +# end_location: SourceLocation(pos=88, lineno=5, colno=12) +# identifier: '!!!' +# arguments: +# +# location: SourceLocation(pos=72, lineno=4, colno=7) +# end_location: SourceLocation(pos=75, lineno=4, colno=10) +# value: '!!!' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# identifier: '' +# arguments: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# is_tag: False +# namespace: 'no_idea' +# path: 'prelude' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'alright_then' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: '_bolt_macro0' +# declaration: +# +# location: SourceLocation(pos=32, lineno=3, colno=1) +# end_location: SourceLocation(pos=156, lineno=6, colno=19) +# identifier: 'what:about:proc_macro_overload0' +# arguments: +# +# location: SourceLocation(pos=38, lineno=3, colno=7) +# end_location: SourceLocation(pos=42, lineno=3, colno=11) +# value: 'what' +# +# location: SourceLocation(pos=43, lineno=3, colno=12) +# end_location: SourceLocation(pos=48, lineno=3, colno=17) +# match: +# +# location: SourceLocation(pos=43, lineno=3, colno=12) +# end_location: SourceLocation(pos=48, lineno=3, colno=17) +# value: 'about' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# match_identifier: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'proc_macro_overload0' +# match_argument_parser: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# is_tag: False +# namespace: 'bolt' +# path: 'proc_macro' +# match_argument_properties: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# entries: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# key: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'resource_location' +# value: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'no_idea:prelude' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# key: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'identifier' +# value: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'what:about:proc_macro_overload0' +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=10, lineno=1, colno=11) +# identifier: 'statement' +# arguments: +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=10, lineno=1, colno=11) +# value: +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=8, lineno=1, colno=9) +# value: 'dump_ast' +# arguments: +# +``` + +`@function bolt_prelude:generated_1` + +```mcfunction +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=120, lineno=12, colno=1) +# commands: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# identifier: '' +# arguments: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# is_tag: False +# namespace: 'demo' +# path: 'prelude' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'CALAMAR' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'dump_ast' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'anonymous' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: '_bolt_macro0' +# declaration: +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=80, lineno=2, colno=30) +# identifier: 'greet:name' +# arguments: +# +# location: SourceLocation(pos=6, lineno=1, colno=7) +# end_location: SourceLocation(pos=11, lineno=1, colno=12) +# value: 'greet' +# +# location: SourceLocation(pos=12, lineno=1, colno=13) +# end_location: SourceLocation(pos=49, lineno=1, colno=50) +# match_identifier: +# +# location: SourceLocation(pos=12, lineno=1, colno=13) +# end_location: SourceLocation(pos=16, lineno=1, colno=17) +# value: 'name' +# match_argument_parser: +# +# location: SourceLocation(pos=17, lineno=1, colno=18) +# end_location: SourceLocation(pos=33, lineno=1, colno=34) +# is_tag: False +# namespace: 'brigadier' +# path: 'string' +# match_argument_properties: +# +# location: SourceLocation(pos=33, lineno=1, colno=34) +# end_location: SourceLocation(pos=49, lineno=1, colno=50) +# entries: +# +# location: SourceLocation(pos=34, lineno=1, colno=35) +# end_location: SourceLocation(pos=48, lineno=1, colno=49) +# key: +# +# location: SourceLocation(pos=34, lineno=1, colno=35) +# end_location: SourceLocation(pos=40, lineno=1, colno=41) +# value: 'type' +# value: +# +# location: SourceLocation(pos=42, lineno=1, colno=43) +# end_location: SourceLocation(pos=48, lineno=1, colno=49) +# value: 'word' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: '_bolt_macro1' +# declaration: +# +# location: SourceLocation(pos=66, lineno=4, colno=1) +# end_location: SourceLocation(pos=88, lineno=5, colno=12) +# identifier: '!!!' +# arguments: +# +# location: SourceLocation(pos=72, lineno=4, colno=7) +# end_location: SourceLocation(pos=75, lineno=4, colno=10) +# value: '!!!' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# identifier: '' +# arguments: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# is_tag: False +# namespace: 'no_idea' +# path: 'prelude' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: 'alright_then' +# identifier: True +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# name: '_bolt_macro0' +# declaration: +# +# location: SourceLocation(pos=32, lineno=3, colno=1) +# end_location: SourceLocation(pos=156, lineno=6, colno=19) +# identifier: 'what:about:proc_macro_overload0' +# arguments: +# +# location: SourceLocation(pos=38, lineno=3, colno=7) +# end_location: SourceLocation(pos=42, lineno=3, colno=11) +# value: 'what' +# +# location: SourceLocation(pos=43, lineno=3, colno=12) +# end_location: SourceLocation(pos=48, lineno=3, colno=17) +# match: +# +# location: SourceLocation(pos=43, lineno=3, colno=12) +# end_location: SourceLocation(pos=48, lineno=3, colno=17) +# value: 'about' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# match_identifier: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'proc_macro_overload0' +# match_argument_parser: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# is_tag: False +# namespace: 'bolt' +# path: 'proc_macro' +# match_argument_properties: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# entries: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# key: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'resource_location' +# value: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'no_idea:prelude' +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# key: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'identifier' +# value: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: 'what:about:proc_macro_overload0' +# +# location: SourceLocation(pos=0, lineno=1, colno=1) +# end_location: SourceLocation(pos=3, lineno=1, colno=4) +# identifier: '!!!' +# arguments: +# +# +# location: SourceLocation(pos=4, lineno=2, colno=1) +# end_location: SourceLocation(pos=21, lineno=2, colno=18) +# identifier: 'greet:name' +# arguments: +# +# location: SourceLocation(pos=10, lineno=2, colno=7) +# end_location: SourceLocation(pos=21, lineno=2, colno=18) +# prefix: None +# unpack: None +# converter: 'word' +# value: +# +# location: SourceLocation(pos=10, lineno=2, colno=7) +# end_location: SourceLocation(pos=21, lineno=2, colno=18) +# value: +# +# location: SourceLocation(pos=10, lineno=2, colno=7) +# end_location: SourceLocation(pos=19, lineno=2, colno=16) +# value: 'anonymous' +# arguments: +# +# +# location: SourceLocation(pos=22, lineno=3, colno=1) +# end_location: SourceLocation(pos=36, lineno=3, colno=15) +# identifier: 'summon:entity' +# arguments: +# +# location: SourceLocation(pos=29, lineno=3, colno=8) +# end_location: SourceLocation(pos=36, lineno=3, colno=15) +# prefix: None +# unpack: None +# converter: 'resource_location' +# value: +# +# location: SourceLocation(pos=29, lineno=3, colno=8) +# end_location: SourceLocation(pos=36, lineno=3, colno=15) +# value: 'CALAMAR' +# +# location: SourceLocation(pos=37, lineno=4, colno=1) +# end_location: SourceLocation(pos=51, lineno=4, colno=15) +# identifier: 'statement' +# arguments: +# +# location: SourceLocation(pos=37, lineno=4, colno=1) +# end_location: SourceLocation(pos=51, lineno=4, colno=15) +# operator: '=' +# target: +# +# location: SourceLocation(pos=37, lineno=4, colno=1) +# end_location: SourceLocation(pos=44, lineno=4, colno=8) +# value: 'CALAMAR' +# rebind: True +# value: +# +# location: SourceLocation(pos=47, lineno=4, colno=11) +# end_location: SourceLocation(pos=51, lineno=4, colno=15) +# value: None +# type_annotation: None +# +# location: SourceLocation(pos=53, lineno=6, colno=1) +# end_location: SourceLocation(pos=56, lineno=6, colno=4) +# identifier: '!!!' +# arguments: +# +# +# location: SourceLocation(pos=57, lineno=7, colno=1) +# end_location: SourceLocation(pos=71, lineno=7, colno=15) +# identifier: 'statement' +# arguments: +# +# location: SourceLocation(pos=57, lineno=7, colno=1) +# end_location: SourceLocation(pos=71, lineno=7, colno=15) +# value: +# +# location: SourceLocation(pos=57, lineno=7, colno=1) +# end_location: SourceLocation(pos=69, lineno=7, colno=13) +# value: 'alright_then' +# arguments: +# +# +# location: SourceLocation(pos=142, lineno=6, colno=5) +# end_location: SourceLocation(pos=156, lineno=6, colno=19) +# identifier: 'say:message' +# arguments: +# +# location: SourceLocation(pos=146, lineno=6, colno=9) +# end_location: SourceLocation(pos=156, lineno=6, colno=19) +# fragments: +# +# location: SourceLocation(pos=-1, lineno=0, colno=0) +# end_location: SourceLocation(pos=-1, lineno=0, colno=0) +# value: "AstResourceLocation(is_tag=False, namespace='minecraft', path='becomeduck')" +# +# location: SourceLocation(pos=105, lineno=10, colno=1) +# end_location: SourceLocation(pos=108, lineno=10, colno=4) +# identifier: '!!!' +# arguments: +# +# +# location: SourceLocation(pos=109, lineno=11, colno=1) +# end_location: SourceLocation(pos=119, lineno=11, colno=11) +# identifier: 'statement' +# arguments: +# +# location: SourceLocation(pos=109, lineno=11, colno=1) +# end_location: SourceLocation(pos=119, lineno=11, colno=11) +# value: +# +# location: SourceLocation(pos=109, lineno=11, colno=1) +# end_location: SourceLocation(pos=117, lineno=11, colno=9) +# value: 'dump_ast' +# arguments: +# +``` From 6d15ed106831e1028a29130e61ba9ec0b242bbe2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 19 Feb 2023 04:02:56 +0000 Subject: [PATCH 1147/1554] 0.31.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 346e9f81d..680ac007e 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.31.0 (2023-02-19) +### Feature +* Add prelude option ([`b0937e0`](https://github.com/mcbeet/bolt/commit/b0937e06affd62e8f358638358ce2797644d36e7)) + ## v0.30.1 (2023-02-15) ### Fix * Properly track del statement semantics ([`66c543f`](https://github.com/mcbeet/bolt/commit/66c543fd82902ed7cbf7e04e6a0b57a45715c0bd)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index a67066ca3..cee585fc6 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.30.1" +__version__ = "0.31.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index ed03823ad..bd519c547 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.30.1" +version = "0.31.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 3f44f9aaeb45be23e82123cf1212d0410a06e124 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 02:01:25 +0200 Subject: [PATCH 1148/1554] chore: update workflow --- packages/mecha/.github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mecha/.github/workflows/main.yml b/packages/mecha/.github/workflows/main.yml index 18f37cfee..d16c349d4 100644 --- a/packages/mecha/.github/workflows/main.yml +++ b/packages/mecha/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: env: PYTHON_VERSION: "3.10" - POETRY_VERSION: "1.3.2" + POETRY_VERSION: "1.4.2" jobs: main: From 0f4bac605c0aac902a490109d822be38c51a924c Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 02:35:55 +0200 Subject: [PATCH 1149/1554] feat: 1.19.4 --- packages/mecha/mecha/ast.py | 14 + packages/mecha/mecha/parse.py | 3 + packages/mecha/mecha/resources/1_19.json | 10 + packages/mecha/poetry.lock | 803 ++++++++++-------- packages/mecha/pyproject.toml | 8 +- .../tests/resources/argument_examples.json | 14 + .../resources/command_examples.mcfunction | 1 + .../examples__build_basic__0.pack.md | 2 +- .../examples__build_basic_debug__0.pack.md | 2 +- ...xamples__build_basic_formatting__0.pack.md | 2 +- ...s__build_basic_implicit_execute__0.pack.md | 2 +- .../examples__build_basic_lint__0.pack.md | 2 +- .../examples__build_basic_messages__0.pack.md | 2 +- ...examples__build_basic_multiline__0.pack.md | 2 +- ...s__build_basic_nested_resources__0.pack.md | 2 +- ...amples__build_basic_nested_yaml__0.pack.md | 2 +- .../examples__build_basic_nesting__0.pack.md | 2 +- .../examples__build_basic_preserve__0.pack.md | 2 +- .../examples__build_basic_raw__0.pack.md | 2 +- .../examples__build_basic_readonly__0.pack.md | 2 +- ...__build_basic_relative_location__0.pack.md | 2 +- ...xamples__build_basic_source_map__0.pack.md | 2 +- .../examples__build_basic_stats__0.pack.md | 2 +- .../examples__build_custom_command__0.pack.md | 2 +- ...uild_custom_execute_destination__0.pack.md | 2 +- ...amples__build_gather_objectives__0.pack.md | 2 +- .../examples__build_kitchen_sink__0.pack.md | 2 +- ...nt_examples_minecraft_heightmap_0_0__0.txt | 12 + ...nt_examples_minecraft_heightmap_0_1__0.txt | 12 + ...nt_examples_minecraft_heightmap_0_2__0.txt | 12 + ...nt_examples_minecraft_heightmap_0_3__0.txt | 12 + ...nt_examples_minecraft_heightmap_1_0__0.txt | 9 + .../snapshots/parse__command_examples__0.txt | 34 +- .../snapshots/parse__command_examples__1.txt | 1 + .../tests/snapshots/spec__prototypes__0.json | 1 + 35 files changed, 592 insertions(+), 394 deletions(-) create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_0__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_1__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_2__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_3__0.txt create mode 100644 packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_1_0__0.txt diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index d33a25817..52284a1f5 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -26,6 +26,7 @@ "AstColorReset", "AstSortOrder", "AstGamemode", + "AstHeightmap", "AstEntityAnchor", "AstTemplateRotation", "AstTemplateMirror", @@ -531,6 +532,19 @@ class AstGamemode(AstOption): options = {"adventure", "creative", "spectator", "survival"} +@dataclass(frozen=True, slots=True) +class AstHeightmap(AstOption): + """Ast heightmap node.""" + + parser = "heightmap" + options = { + "world_surface", + "motion_blocking", + "motion_blocking_no_leaves", + "ocean_floor", + } + + @dataclass(frozen=True, slots=True) class AstEntityAnchor(AstOption): """Ast entity anchor node.""" diff --git a/packages/mecha/mecha/parse.py b/packages/mecha/mecha/parse.py index 6fcdd03c4..1db1811b3 100644 --- a/packages/mecha/mecha/parse.py +++ b/packages/mecha/mecha/parse.py @@ -106,6 +106,7 @@ AstFallingDustParticleParameters, AstGamemode, AstGreedy, + AstHeightmap, AstItem, AstItemParticleParameters, AstItemSlot, @@ -226,6 +227,7 @@ def get_default_parsers() -> Dict[str, Parser]: "color_reset": BasicLiteralParser(AstColorReset), "sort_order": BasicLiteralParser(AstSortOrder), "gamemode": BasicLiteralParser(AstGamemode), + "heightmap": BasicLiteralParser(AstHeightmap), "entity_anchor": BasicLiteralParser(AstEntityAnchor), "template_rotation": BasicLiteralParser(AstTemplateRotation), "template_mirror": BasicLiteralParser(AstTemplateMirror), @@ -428,6 +430,7 @@ def get_default_parsers() -> Dict[str, Parser]: "command:argument:minecraft:function": delegate("resource_location_or_tag"), "command:argument:minecraft:game_profile": delegate("game_profile"), "command:argument:minecraft:gamemode": delegate("gamemode"), + "command:argument:minecraft:heightmap": delegate("heightmap"), "command:argument:minecraft:int_range": delegate("integer_range"), "command:argument:minecraft:item_enchantment": delegate("word"), "command:argument:minecraft:item_predicate": MultilineParser( diff --git a/packages/mecha/mecha/resources/1_19.json b/packages/mecha/mecha/resources/1_19.json index a036a3b21..4b6003ba7 100644 --- a/packages/mecha/mecha/resources/1_19.json +++ b/packages/mecha/mecha/resources/1_19.json @@ -4905,6 +4905,16 @@ } } }, + "over": { + "type": "literal", + "children": { + "heightmap": { + "type": "argument", + "parser": "minecraft:heightmap", + "redirect": ["execute"] + } + } + }, "pos": { "type": "argument", "parser": "minecraft:vec3", diff --git a/packages/mecha/poetry.lock b/packages/mecha/poetry.lock index 7e43c223c..f6c0828b2 100644 --- a/packages/mecha/poetry.lock +++ b/packages/mecha/poetry.lock @@ -1,33 +1,15 @@ # This file is automatically @generated by Poetry and should not be changed by hand. -[[package]] -name = "attrs" -version = "22.1.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] - -[package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] - [[package]] name = "beet" -version = "0.83.1" +version = "0.86.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "beet-0.83.1-py3-none-any.whl", hash = "sha256:f2f8b261314063d47ebf205c7a4b7902dce139d9d8c1d8019277860d6558d72b"}, - {file = "beet-0.83.1.tar.gz", hash = "sha256:775677c22ee99f8cadafa7fd8147a38a74628772624be20747031ea07d99d9df"}, + {file = "beet-0.86.0-py3-none-any.whl", hash = "sha256:b75fe7303adff14b450d22f655b07abf1d4e3d6a85c82142115c3bacb1408b70"}, + {file = "beet-0.86.0.tar.gz", hash = "sha256:aa3beb29f808c1b63151a066ecf06b1f2465dd1bdbdfdf6f598a5ed57dcaee7c"}, ] [package.dependencies] @@ -36,8 +18,8 @@ click-help-colors = ">=0.9.1,<0.10.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" -pathspec = ">=0.10.2,<0.11.0" -pydantic = ">=1.10.2,<2.0.0" +pathspec = ">=0.11.0,<0.12.0" +pydantic = ">=1.10.7,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" @@ -46,37 +28,37 @@ image = ["Pillow"] [[package]] name = "black" -version = "23.1.0" +version = "23.3.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, - {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, - {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, - {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, - {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, - {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, - {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, - {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, - {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, - {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, - {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, - {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, - {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, - {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, - {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, - {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, - {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, - {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, - {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, - {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, - {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, - {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, - {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, - {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, - {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, ] [package.dependencies] @@ -95,14 +77,14 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "5.0.1" +version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, - {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, ] [package.dependencies] @@ -111,18 +93,17 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.2)"] -dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] [[package]] name = "certifi" -version = "2022.9.24" +version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, ] [[package]] @@ -204,19 +185,89 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" version = "8.1.3" @@ -279,50 +330,45 @@ files = [ [[package]] name = "cryptography" -version = "38.0.3" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, - {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, - {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, - {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, ] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] [[package]] name = "docutils" @@ -350,14 +396,14 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.0" +version = "1.1.1" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] [package.extras] @@ -365,14 +411,14 @@ test = ["pytest (>=6)"] [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, ] [package.dependencies] @@ -380,14 +426,14 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.29" -description = "GitPython is a python library used to interact with Git repositories" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, ] [package.dependencies] @@ -407,34 +453,34 @@ files = [ [[package]] name = "importlib-metadata" -version = "5.0.0" +version = "6.6.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] @@ -522,24 +568,25 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.11.0" +version = "23.13.1" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, - {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, ] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} "jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] +completion = ["shtab"] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] @@ -562,24 +609,24 @@ markdown-it-py = ">=2.1.0,<3.0.0" [[package]] name = "markdown-it-py" -version = "2.1.0" +version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, ] [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code-style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] @@ -587,52 +634,62 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, ] [[package]] @@ -649,26 +706,26 @@ files = [ [[package]] name = "more-itertools" -version = "9.0.0" +version = "9.1.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, - {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, ] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] @@ -688,96 +745,96 @@ numpy = "*" [[package]] name = "numpy" -version = "1.23.4" -description = "NumPy is the fundamental package for array computing with Python." +version = "1.24.3" +description = "Fundamental package for array computing in Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, - {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, - {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, - {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, - {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, - {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, - {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, - {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, - {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, - {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, - {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] name = "pathspec" -version = "0.10.2" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] [[package]] name = "pkginfo" -version = "1.8.3" -description = "Query metadatdata from sdists / bdists / installed packages." +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" files = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, ] [package.extras] -testing = ["coverage", "nose"] +testing = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "2.5.4" +version = "3.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, ] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -809,52 +866,52 @@ files = [ [[package]] name = "pydantic" -version = "1.10.2" +version = "1.10.7" description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, ] [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -862,14 +919,14 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.13.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -877,18 +934,17 @@ plugins = ["importlib-metadata"] [[package]] name = "pytest" -version = "7.2.1" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, - {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -897,7 +953,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-insta" @@ -917,19 +973,19 @@ wrapt = ">=1.14.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.11.0" +version = "3.14.0" description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, - {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, + {file = "python-gitlab-3.14.0.tar.gz", hash = "sha256:ef3b8960faeee9880f82b0872d807e3fab94ace12b0d2a8418a97875c8812d3c"}, + {file = "python_gitlab-3.14.0-py3-none-any.whl", hash = "sha256:da614c014c6860147783dde8c216218d8fc6bd83a8bd2e3929dcdf11b211aa58"}, ] [package.dependencies] requests = ">=2.25.0" -requests-toolbelt = ">=0.9.1" +requests-toolbelt = ">=0.10.1" [package.extras] autocompletion = ["argcomplete (>=1.10.0,<3)"] @@ -937,14 +993,14 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.33.1" +version = "7.33.3" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" files = [ - {file = "python-semantic-release-7.33.1.tar.gz", hash = "sha256:9d2e5681c2c296e0fc5d24088b59d7528c1c162920df29a4663d1131b5dfc97b"}, - {file = "python_semantic_release-7.33.1-py3-none-any.whl", hash = "sha256:ad8bc816526d3d0d7a4cf4833cc57e655a28b34d6fa33b3d2786a07ae4e8a075"}, + {file = "python-semantic-release-7.33.3.tar.gz", hash = "sha256:6f1b28e16ac7bcd67722945794a66ae7df7dcaabcc719324f89cce7015fe5c88"}, + {file = "python_semantic_release-7.33.3-py3-none-any.whl", hash = "sha256:911b9cef443d1eb2d6449a42d3728e9c54c01fe7a35e5a7fb607b5f9c764451d"}, ] [package.dependencies] @@ -1051,19 +1107,19 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "dev" optional = false python-versions = ">=3.7, <4" files = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" @@ -1191,26 +1247,26 @@ files = [ [[package]] name = "tomlkit" -version = "0.11.6" +version = "0.11.7" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, + {file = "tomlkit-0.11.7-py3-none-any.whl", hash = "sha256:5325463a7da2ef0c6bbfefb62a3dc883aebe679984709aee32a317907d0a8d3c"}, + {file = "tomlkit-0.11.7.tar.gz", hash = "sha256:f392ef70ad87a672f02519f99967d28a4d3047133e2d1df936511465fbb3791d"}, ] [[package]] name = "tqdm" -version = "4.64.1" +version = "4.65.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" files = [ - {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, - {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, ] [package.dependencies] @@ -1248,26 +1304,26 @@ urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] [[package]] name = "urllib3" -version = "1.26.12" +version = "1.26.15" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, ] [package.extras] @@ -1289,110 +1345,121 @@ files = [ [[package]] name = "wheel" -version = "0.38.4" +version = "0.40.0" description = "A built-package format for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, - {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, + {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, + {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, ] [package.extras] -test = ["pytest (>=3.0.0)"] +test = ["pytest (>=6.0.0)"] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] [[package]] name = "zipp" -version = "3.10.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, - {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "e9f42e0f560c9c628a03255538c4594306b4980f152da0d90af2733aee7636b2" +content-hash = "7135e77f373661b7444cb5272c462d829ed5e0d425d6cb63dab9bfcbf39fc1b8" diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index c5e18c095..fb28e880d 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -23,14 +23,14 @@ include = ["mecha/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.83.1" +beet = ">=0.86.0" tokenstream = "^1.5.0" [tool.poetry.group.dev.dependencies] -black = "^23.1.0" -pytest = "^7.2.1" +black = "^23.3.0" +pytest = "^7.3.1" isort = "^5.12.0" -python-semantic-release = "^7.33.1" +python-semantic-release = "^7.33.3" pytest-insta = "^0.2.0" lectern = ">=0.26.0" diff --git a/packages/mecha/tests/resources/argument_examples.json b/packages/mecha/tests/resources/argument_examples.json index 9bc9a12b9..02c113bc1 100644 --- a/packages/mecha/tests/resources/argument_examples.json +++ b/packages/mecha/tests/resources/argument_examples.json @@ -267,6 +267,20 @@ "examples": ["@e", "@s[type=cow]", "@e[type=!player]"] } ], + "minecraft:heightmap": [ + { + "examples": [ + "world_surface", + "motion_blocking", + "motion_blocking_no_leaves", + "ocean_floor" + ] + }, + { + "invalid": true, + "examples": ["123"] + } + ], "minecraft:int_range": [ { "examples": ["0..5", "0", "-5", "-100..", "..100", "..0", "0.."] diff --git a/packages/mecha/tests/resources/command_examples.mcfunction b/packages/mecha/tests/resources/command_examples.mcfunction index 1fae980b7..2281d911d 100644 --- a/packages/mecha/tests/resources/command_examples.mcfunction +++ b/packages/mecha/tests/resources/command_examples.mcfunction @@ -187,3 +187,4 @@ weather thunder 1d ride @s mount @e[type=pig,limit=1,sort=nearest] ride @s dismount execute if score @s abc matches 0 run ride @s dismount +execute positioned over ocean_floor run summon skeleton diff --git a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md index 6d5fff4af..8a69b018a 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md index 341aeb6ee..7ccf172e0 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_debug__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md index 631e2d7f0..4252631f8 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_formatting__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md index bc879da68..6a321a839 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_implicit_execute__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md index 8229c170f..e4849085f 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_lint__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md index 22df64992..0e62dc6cd 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_messages__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md index e91dcb077..c1e9c9565 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_multiline__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md index 75185b681..567f0acae 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nested_resources__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md index c5811e629..4726a478b 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nested_yaml__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md index 36af6d45f..87500bea1 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_nesting__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md index ce4fe1abd..fad11184a 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_preserve__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md index 448387094..05c24cf8c 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_raw__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md index d12fc99ab..0d16dc42d 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_readonly__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md index d1c60a211..9c26fc0da 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_relative_location__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md index e8d7b55ff..f9c97309b 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_source_map__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md index 3369b0f56..9f95e48c2 100644 --- a/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_stats__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md index 075e4c1ef..8710624e8 100644 --- a/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_custom_command__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md b/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md index 35bfe97cf..768723f78 100644 --- a/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_custom_execute_destination__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md index f86686a77..860a8c988 100644 --- a/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_gather_objectives__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md index 108cc2a9f..d59c79c9e 100644 --- a/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_kitchen_sink__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_0__0.txt new file mode 100644 index 000000000..93ec53fbe --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_0__0.txt @@ -0,0 +1,12 @@ +minecraft:heightmap 0 0 +--- +{} +--- +world_surface +--- +world_surface +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + value: 'world_surface' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_1__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_1__0.txt new file mode 100644 index 000000000..fef65f030 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_1__0.txt @@ -0,0 +1,12 @@ +minecraft:heightmap 0 1 +--- +{} +--- +motion_blocking +--- +motion_blocking +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=15, lineno=1, colno=16) + value: 'motion_blocking' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_2__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_2__0.txt new file mode 100644 index 000000000..4702c9e15 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_2__0.txt @@ -0,0 +1,12 @@ +minecraft:heightmap 0 2 +--- +{} +--- +motion_blocking_no_leaves +--- +motion_blocking_no_leaves +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + value: 'motion_blocking_no_leaves' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_3__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_3__0.txt new file mode 100644 index 000000000..10dbf06db --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_0_3__0.txt @@ -0,0 +1,12 @@ +minecraft:heightmap 0 3 +--- +{} +--- +ocean_floor +--- +ocean_floor +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + value: 'ocean_floor' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_1_0__0.txt b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_1_0__0.txt new file mode 100644 index 000000000..fe6cc1cb1 --- /dev/null +++ b/packages/mecha/tests/snapshots/parse__argument_examples_minecraft_heightmap_1_0__0.txt @@ -0,0 +1,9 @@ +minecraft:heightmap 1 0 +--- +{} +--- +123 +--- +Reported 1 error. + +line 1, column 1: Expected heightmap but got literal '123'. \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__0.txt b/packages/mecha/tests/snapshots/parse__command_examples__0.txt index 199e5bcf0..ad03182c5 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__0.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__0.txt @@ -1,6 +1,6 @@ location: SourceLocation(pos=0, lineno=1, colno=1) - end_location: SourceLocation(pos=8106, lineno=190, colno=1) + end_location: SourceLocation(pos=8162, lineno=191, colno=1) commands: location: SourceLocation(pos=14, lineno=2, colno=1) @@ -7027,4 +7027,34 @@ end_location: SourceLocation(pos=8096, lineno=189, colno=46) variable: 's' arguments: - \ No newline at end of file + + + location: SourceLocation(pos=8106, lineno=190, colno=1) + end_location: SourceLocation(pos=8161, lineno=190, colno=56) + identifier: 'execute:subcommand' + arguments: + + location: SourceLocation(pos=8114, lineno=190, colno=9) + end_location: SourceLocation(pos=8161, lineno=190, colno=56) + identifier: 'execute:positioned:over:heightmap:subcommand' + arguments: + + location: SourceLocation(pos=8130, lineno=190, colno=25) + end_location: SourceLocation(pos=8141, lineno=190, colno=36) + value: 'ocean_floor' + + location: SourceLocation(pos=8142, lineno=190, colno=37) + end_location: SourceLocation(pos=8161, lineno=190, colno=56) + identifier: 'execute:run:subcommand' + arguments: + + location: SourceLocation(pos=8146, lineno=190, colno=41) + end_location: SourceLocation(pos=8161, lineno=190, colno=56) + identifier: 'summon:entity' + arguments: + + location: SourceLocation(pos=8153, lineno=190, colno=48) + end_location: SourceLocation(pos=8161, lineno=190, colno=56) + is_tag: False + namespace: None + path: 'skeleton' \ No newline at end of file diff --git a/packages/mecha/tests/snapshots/parse__command_examples__1.txt b/packages/mecha/tests/snapshots/parse__command_examples__1.txt index b8b974307..6227b5c0d 100644 --- a/packages/mecha/tests/snapshots/parse__command_examples__1.txt +++ b/packages/mecha/tests/snapshots/parse__command_examples__1.txt @@ -158,3 +158,4 @@ weather thunder 1d ride @s mount @e[type=pig, limit=1, sort=nearest] ride @s dismount execute if score @s abc matches 0 run ride @s dismount +execute positioned over ocean_floor run summon skeleton diff --git a/packages/mecha/tests/snapshots/spec__prototypes__0.json b/packages/mecha/tests/snapshots/spec__prototypes__0.json index 640cbc421..eb136d82c 100644 --- a/packages/mecha/tests/snapshots/spec__prototypes__0.json +++ b/packages/mecha/tests/snapshots/spec__prototypes__0.json @@ -497,6 +497,7 @@ "execute:on:target:subcommand", "execute:on:vehicle:subcommand", "execute:positioned:as:targets:subcommand", + "execute:positioned:over:heightmap:subcommand", "execute:positioned:pos:subcommand", "execute:rotated:as:targets:subcommand", "execute:rotated:rot:subcommand", From 4b9479eb9526306bc4c0dd47109c0fe887dd26a4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Apr 2023 00:37:08 +0000 Subject: [PATCH 1150/1554] 0.68.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index e2f7f908c..b9ca3cbd0 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.68.0 (2023-04-25) +### Feature +* 1.19.4 ([`31570c8`](https://github.com/mcbeet/mecha/commit/31570c8aadb5f9bfdce813452a5810a36e3fde45)) + ## v0.67.0 (2023-02-08) ### Feature * Update command tree ([`c74062a`](https://github.com/mcbeet/mecha/commit/c74062adb614cc1266be1d90137bfccf39f1483b)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 5b5646a21..6d4e3a205 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.67.0" +__version__ = "0.68.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index fb28e880d..28f771c59 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.67.0" +version = "0.68.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 714111b0f5a2313475ce5a3f946f645535f1ee54 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 02:43:13 +0200 Subject: [PATCH 1151/1554] feat: 23w16a --- packages/mecha/examples/basic_1_20/beet.yml | 5 + .../src/data/demo/functions/foo.mcfunction | 2 + packages/mecha/mecha/resources/1_20.json | 10150 ++++++++++++++++ .../examples__build_basic_1_20__0.pack.md | 36 + 4 files changed, 10193 insertions(+) create mode 100644 packages/mecha/examples/basic_1_20/beet.yml create mode 100644 packages/mecha/examples/basic_1_20/src/data/demo/functions/foo.mcfunction create mode 100644 packages/mecha/mecha/resources/1_20.json create mode 100644 packages/mecha/tests/snapshots/examples__build_basic_1_20__0.pack.md diff --git a/packages/mecha/examples/basic_1_20/beet.yml b/packages/mecha/examples/basic_1_20/beet.yml new file mode 100644 index 000000000..9e5bf07a5 --- /dev/null +++ b/packages/mecha/examples/basic_1_20/beet.yml @@ -0,0 +1,5 @@ +minecraft: "1.20" +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/mecha/examples/basic_1_20/src/data/demo/functions/foo.mcfunction b/packages/mecha/examples/basic_1_20/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..c7e257c4e --- /dev/null +++ b/packages/mecha/examples/basic_1_20/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,2 @@ +execute if entity @e[type=pig] run return 1 +return 0 diff --git a/packages/mecha/mecha/resources/1_20.json b/packages/mecha/mecha/resources/1_20.json new file mode 100644 index 000000000..9a1dacabc --- /dev/null +++ b/packages/mecha/mecha/resources/1_20.json @@ -0,0 +1,10150 @@ +{ + "type": "root", + "children": { + "advancement": { + "type": "literal", + "children": { + "grant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "everything": { + "type": "literal", + "executable": true + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "children": { + "criterion": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "revoke": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "everything": { + "type": "literal", + "executable": true + }, + "from": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "only": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "children": { + "criterion": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "through": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "until": { + "type": "literal", + "children": { + "advancement": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + } + }, + "attribute": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "attribute": { + "type": "argument", + "children": { + "base": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + } + } + } + }, + "get": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true + }, + "modifier": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "children": { + "name": { + "type": "argument", + "children": { + "value": { + "type": "argument", + "children": { + "add": { + "type": "literal", + "executable": true + }, + "multiply": { + "type": "literal", + "executable": true + }, + "multiply_base": { + "type": "literal", + "executable": true + } + }, + "parser": "brigadier:double" + } + }, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + }, + "parser": "minecraft:uuid" + } + } + }, + "remove": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "executable": true, + "parser": "minecraft:uuid" + } + } + }, + "value": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "uuid": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:uuid" + } + } + } + } + } + } + } + }, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:attribute" + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "ban": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "reason": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "ban-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "reason": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "banlist": { + "type": "literal", + "children": { + "ips": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "bossbar": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "get": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "max": { + "type": "literal", + "executable": true + }, + "players": { + "type": "literal", + "executable": true + }, + "value": { + "type": "literal", + "executable": true + }, + "visible": { + "type": "literal", + "executable": true + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "set": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "color": { + "type": "literal", + "children": { + "blue": { + "type": "literal", + "executable": true + }, + "green": { + "type": "literal", + "executable": true + }, + "pink": { + "type": "literal", + "executable": true + }, + "purple": { + "type": "literal", + "executable": true + }, + "red": { + "type": "literal", + "executable": true + }, + "white": { + "type": "literal", + "executable": true + }, + "yellow": { + "type": "literal", + "executable": true + } + } + }, + "max": { + "type": "literal", + "children": { + "max": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 1 + } + } + } + }, + "name": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "players": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "style": { + "type": "literal", + "children": { + "notched_10": { + "type": "literal", + "executable": true + }, + "notched_12": { + "type": "literal", + "executable": true + }, + "notched_20": { + "type": "literal", + "executable": true + }, + "notched_6": { + "type": "literal", + "executable": true + }, + "progress": { + "type": "literal", + "executable": true + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "visible": { + "type": "literal", + "children": { + "visible": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + } + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "item": { + "type": "argument", + "children": { + "maxCount": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:item_predicate" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "clone": { + "type": "literal", + "children": { + "begin": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + }, + "to": { + "type": "literal", + "children": { + "targetDimension": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:dimension" + } + } + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + }, + "from": { + "type": "literal", + "children": { + "sourceDimension": { + "type": "argument", + "children": { + "begin": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + }, + "to": { + "type": "literal", + "children": { + "targetDimension": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "filtered": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_predicate" + } + } + }, + "masked": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "force": { + "type": "literal", + "executable": true + }, + "move": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:dimension" + } + } + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:dimension" + } + } + } + } + }, + "damage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "amount": { + "type": "argument", + "children": { + "damageType": { + "type": "argument", + "children": { + "at": { + "type": "literal", + "children": { + "location": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec3" + } + } + }, + "by": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "cause": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:damage_type" + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "data": { + "type": "literal", + "children": { + "get": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "scale": { + "type": "argument", + "executable": true, + "parser": "brigadier:double" + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "merge": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetPath": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "index": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + }, + "parser": "brigadier:integer" + } + } + }, + "merge": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "prepend": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + }, + "set": { + "type": "literal", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "string": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourcePath": { + "type": "argument", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "value": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_tag" + } + } + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + } + } + }, + "datapack": { + "type": "literal", + "children": { + "disable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "enable": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "children": { + "after": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "before": { + "type": "literal", + "children": { + "existing": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "first": { + "type": "literal", + "executable": true + }, + "last": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "phrase" + } + } + } + }, + "list": { + "type": "literal", + "children": { + "available": { + "type": "literal", + "executable": true + }, + "enabled": { + "type": "literal", + "executable": true + } + }, + "executable": true + } + } + }, + "debug": { + "type": "literal", + "children": { + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:function" + } + } + }, + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "defaultgamemode": { + "type": "literal", + "children": { + "gamemode": { + "type": "argument", + "executable": true, + "parser": "minecraft:gamemode" + } + } + }, + "deop": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "difficulty": { + "type": "literal", + "children": { + "easy": { + "type": "literal", + "executable": true + }, + "hard": { + "type": "literal", + "executable": true + }, + "normal": { + "type": "literal", + "executable": true + }, + "peaceful": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "effect": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "effect": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:mob_effect" + } + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "executable": true + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "effect": { + "type": "argument", + "children": { + "infinite": { + "type": "literal", + "children": { + "amplifier": { + "type": "argument", + "children": { + "hideParticles": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 255, + "min": 0 + } + } + }, + "executable": true + }, + "seconds": { + "type": "argument", + "children": { + "amplifier": { + "type": "argument", + "children": { + "hideParticles": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 255, + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 1000000, + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:mob_effect" + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + }, + "enchant": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "enchantment": { + "type": "argument", + "children": { + "level": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:enchantment" + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "execute": { + "type": "literal", + "children": { + "align": { + "type": "literal", + "children": { + "axes": { + "type": "argument", + "parser": "minecraft:swizzle", + "redirect": ["execute"] + } + } + }, + "anchored": { + "type": "literal", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + } + }, + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "at": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "anchor": { + "type": "argument", + "parser": "minecraft:entity_anchor", + "redirect": ["execute"] + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "if": { + "type": "literal", + "children": { + "biome": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "biome": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + }, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_predicate", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "data": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "dimension": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "executable": true, + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "loaded": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos", + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location", + "redirect": ["execute"] + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetObjective": { + "type": "argument", + "children": { + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "executable": true, + "parser": "minecraft:int_range", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + } + } + }, + "in": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, + "on": { + "type": "literal", + "children": { + "attacker": { + "type": "literal", + "redirect": ["execute"] + }, + "controller": { + "type": "literal", + "redirect": ["execute"] + }, + "leasher": { + "type": "literal", + "redirect": ["execute"] + }, + "origin": { + "type": "literal", + "redirect": ["execute"] + }, + "owner": { + "type": "literal", + "redirect": ["execute"] + }, + "passengers": { + "type": "literal", + "redirect": ["execute"] + }, + "target": { + "type": "literal", + "redirect": ["execute"] + }, + "vehicle": { + "type": "literal", + "redirect": ["execute"] + } + } + }, + "positioned": { + "type": "literal", + "children": { + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "over": { + "type": "literal", + "children": { + "heightmap": { + "type": "argument", + "parser": "minecraft:heightmap", + "redirect": ["execute"] + } + } + }, + "pos": { + "type": "argument", + "parser": "minecraft:vec3", + "redirect": ["execute"] + } + } + }, + "rotated": { + "type": "literal", + "children": { + "as": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "rot": { + "type": "argument", + "parser": "minecraft:rotation", + "redirect": ["execute"] + } + } + }, + "run": { + "type": "literal" + }, + "store": { + "type": "literal", + "children": { + "result": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "max": { + "type": "literal", + "redirect": ["execute"] + }, + "value": { + "type": "literal", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "success": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "bossbar": { + "type": "literal", + "children": { + "id": { + "type": "argument", + "children": { + "max": { + "type": "literal", + "redirect": ["execute"] + }, + "value": { + "type": "literal", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "entity": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "score": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "children": { + "byte": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "double": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "float": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "int": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "long": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + }, + "short": { + "type": "literal", + "children": { + "scale": { + "type": "argument", + "parser": "brigadier:double", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:nbt_path" + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + } + } + }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:entity_type" + }, + "redirect": ["execute"] + } + } + }, + "unless": { + "type": "literal", + "children": { + "biome": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "biome": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + }, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_predicate", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "blocks": { + "type": "literal", + "children": { + "start": { + "type": "argument", + "children": { + "end": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "children": { + "all": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + }, + "masked": { + "type": "literal", + "executable": true, + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "data": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "sourcePos": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "storage": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "path": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_path", + "redirect": ["execute"] + } + }, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "dimension": { + "type": "literal", + "children": { + "dimension": { + "type": "argument", + "executable": true, + "parser": "minecraft:dimension", + "redirect": ["execute"] + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + }, + "redirect": ["execute"] + } + } + }, + "loaded": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos", + "redirect": ["execute"] + } + } + }, + "predicate": { + "type": "literal", + "children": { + "predicate": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location", + "redirect": ["execute"] + } + } + }, + "score": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "targetObjective": { + "type": "argument", + "children": { + "<": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "<=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + ">=": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective", + "redirect": ["execute"] + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "matches": { + "type": "literal", + "children": { + "range": { + "type": "argument", + "executable": true, + "parser": "minecraft:int_range", + "redirect": ["execute"] + } + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + } + } + } + } + }, + "experience": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "amount": { + "type": "argument", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "brigadier:integer" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "query": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "single" + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "amount": { + "type": "argument", + "children": { + "levels": { + "type": "literal", + "executable": true + }, + "points": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + } + }, + "fill": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "hollow": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "outline": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_predicate" + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_state" + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "fillbiome": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "children": { + "biome": { + "type": "argument", + "children": { + "replace": { + "type": "literal", + "children": { + "filter": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + } + } + } + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:worldgen/biome" + } + } + }, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "forceload": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "executable": true, + "parser": "minecraft:column_pos" + } + }, + "executable": true, + "parser": "minecraft:column_pos" + } + } + }, + "query": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:column_pos" + } + }, + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "all": { + "type": "literal", + "executable": true + }, + "from": { + "type": "argument", + "children": { + "to": { + "type": "argument", + "executable": true, + "parser": "minecraft:column_pos" + } + }, + "executable": true, + "parser": "minecraft:column_pos" + } + } + } + } + }, + "function": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "minecraft:function" + } + } + }, + "gamemode": { + "type": "literal", + "children": { + "gamemode": { + "type": "argument", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true, + "parser": "minecraft:gamemode" + } + } + }, + "gamerule": { + "type": "literal", + "children": { + "announceAdvancements": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "blockExplosionDropDecay": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "commandBlockOutput": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "commandModificationBlockLimit": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "disableElytraMovementCheck": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "disableRaids": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doDaylightCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doEntityDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doFireTick": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doImmediateRespawn": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doInsomnia": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doLimitedCrafting": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doMobLoot": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doMobSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doPatrolSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doTileDrops": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doTraderSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doVinesSpread": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doWardenSpawning": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "doWeatherCycle": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "drowningDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "fallDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "fireDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "forgiveDeadPlayers": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "freezeDamage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "globalSoundEvents": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "keepInventory": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "lavaSourceConversion": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "logAdminCommands": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "maxCommandChainLength": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "maxEntityCramming": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "mobExplosionDropDecay": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "mobGriefing": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "naturalRegeneration": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "playersSleepingPercentage": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "randomTickSpeed": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "reducedDebugInfo": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "sendCommandFeedback": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "showDeathMessages": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "snowAccumulationHeight": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "spawnRadius": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true + }, + "spectatorsGenerateChunks": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "tntExplosionDropDecay": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "universalAnger": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "waterSourceConversion": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + } + } + }, + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "item": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "help": { + "type": "literal", + "children": { + "command": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + }, + "executable": true + }, + "item": { + "type": "literal", + "children": { + "modify": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + }, + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + } + }, + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 64, + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:item_stack" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "from": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "source": { + "type": "argument", + "children": { + "sourceSlot": { + "type": "argument", + "children": { + "modifier": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + } + }, + "with": { + "type": "literal", + "children": { + "item": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 64, + "min": 1 + } + } + }, + "executable": true, + "parser": "minecraft:item_stack" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + } + } + }, + "jfr": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "kick": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "reason": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "kill": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "executable": true + }, + "list": { + "type": "literal", + "children": { + "uuids": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "locate": { + "type": "literal", + "children": { + "biome": { + "type": "literal", + "children": { + "biome": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:worldgen/biome" + } + } + } + }, + "poi": { + "type": "literal", + "children": { + "poi": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag", + "properties": { + "registry": "minecraft:point_of_interest_type" + } + } + } + }, + "structure": { + "type": "literal", + "children": { + "structure": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_or_tag_key", + "properties": { + "registry": "minecraft:worldgen/structure" + } + } + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "players": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "insert": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "replace": { + "type": "literal", + "children": { + "block": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + }, + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "entity": { + "type": "literal", + "children": { + "entities": { + "type": "argument", + "children": { + "slot": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + }, + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:item_slot" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + } + } + }, + "spawn": { + "type": "literal", + "children": { + "targetPos": { + "type": "argument", + "children": { + "fish": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "kill": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "loot": { + "type": "literal", + "children": { + "loot_table": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "mine": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "mainhand": { + "type": "literal", + "executable": true + }, + "offhand": { + "type": "literal", + "executable": true + }, + "tool": { + "type": "argument", + "executable": true, + "parser": "minecraft:item_stack" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + } + } + }, + "parser": "minecraft:vec3" + } + } + } + } + }, + "me": { + "type": "literal", + "children": { + "action": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + } + }, + "msg": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "op": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "pardon": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "pardon-ip": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "particle": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "delta": { + "type": "argument", + "children": { + "speed": { + "type": "argument", + "children": { + "count": { + "type": "argument", + "children": { + "force": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "normal": { + "type": "literal", + "children": { + "viewers": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:particle" + } + } + }, + "perf": { + "type": "literal", + "children": { + "start": { + "type": "literal", + "executable": true + }, + "stop": { + "type": "literal", + "executable": true + } + } + }, + "place": { + "type": "literal", + "children": { + "feature": { + "type": "literal", + "children": { + "feature": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:resource_key", + "properties": { + "registry": "minecraft:worldgen/configured_feature" + } + } + } + }, + "jigsaw": { + "type": "literal", + "children": { + "pool": { + "type": "argument", + "children": { + "target": { + "type": "argument", + "children": { + "max_depth": { + "type": "argument", + "children": { + "position": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 7, + "min": 1 + } + } + }, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:resource_key", + "properties": { + "registry": "minecraft:worldgen/template_pool" + } + } + } + }, + "structure": { + "type": "literal", + "children": { + "structure": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:resource_key", + "properties": { + "registry": "minecraft:worldgen/structure" + } + } + } + }, + "template": { + "type": "literal", + "children": { + "template": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "rotation": { + "type": "argument", + "children": { + "mirror": { + "type": "argument", + "children": { + "integrity": { + "type": "argument", + "children": { + "seed": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:template_mirror" + } + }, + "executable": true, + "parser": "minecraft:template_rotation" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:resource_location" + } + } + } + } + }, + "playsound": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "children": { + "ambient": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "block": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "hostile": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "master": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "music": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "neutral": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "player": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "record": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "voice": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "weather": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "volume": { + "type": "argument", + "children": { + "pitch": { + "type": "argument", + "children": { + "minVolume": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 1.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "max": 2.0, + "min": 0.0 + } + } + }, + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + }, + "parser": "minecraft:resource_location" + } + } + }, + "publish": { + "type": "literal", + "children": { + "allowCommands": { + "type": "argument", + "children": { + "gamemode": { + "type": "argument", + "children": { + "port": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "max": 65535, + "min": 0 + } + } + }, + "executable": true, + "parser": "minecraft:gamemode" + } + }, + "executable": true, + "parser": "brigadier:bool" + } + }, + "executable": true + }, + "recipe": { + "type": "literal", + "children": { + "give": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "*": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "take": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "*": { + "type": "literal", + "executable": true + }, + "recipe": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + } + } + }, + "reload": { + "type": "literal", + "executable": true + }, + "return": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + } + }, + "ride": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "dismount": { + "type": "literal", + "executable": true + }, + "mount": { + "type": "literal", + "children": { + "vehicle": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "save-all": { + "type": "literal", + "children": { + "flush": { + "type": "literal", + "executable": true + } + }, + "executable": true + }, + "save-off": { + "type": "literal", + "executable": true + }, + "save-on": { + "type": "literal", + "executable": true + }, + "say": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + } + }, + "schedule": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "greedy" + } + } + } + }, + "function": { + "type": "literal", + "children": { + "function": { + "type": "argument", + "children": { + "time": { + "type": "argument", + "children": { + "append": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:function" + } + } + } + } + }, + "scoreboard": { + "type": "literal", + "children": { + "objectives": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "children": { + "criteria": { + "type": "argument", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "executable": true, + "parser": "minecraft:objective_criteria" + } + }, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "modify": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "children": { + "displayname": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "rendertype": { + "type": "literal", + "children": { + "hearts": { + "type": "literal", + "executable": true + }, + "integer": { + "type": "literal", + "executable": true + } + } + } + }, + "parser": "minecraft:objective" + } + } + }, + "remove": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + } + }, + "setdisplay": { + "type": "literal", + "children": { + "slot": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "executable": true, + "parser": "minecraft:scoreboard_slot" + } + } + } + } + }, + "players": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "children": { + "score": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "enable": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "get": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + } + }, + "list": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "single" + } + } + }, + "executable": true + }, + "operation": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "targetObjective": { + "type": "argument", + "children": { + "operation": { + "type": "argument", + "children": { + "source": { + "type": "argument", + "children": { + "sourceObjective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + }, + "parser": "minecraft:operation" + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "children": { + "score": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "reset": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "executable": true, + "parser": "minecraft:objective" + } + }, + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "set": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "objective": { + "type": "argument", + "children": { + "score": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + }, + "parser": "minecraft:objective" + } + }, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + } + } + } + } + }, + "seed": { + "type": "literal", + "executable": true + }, + "setblock": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "block": { + "type": "argument", + "children": { + "destroy": { + "type": "literal", + "executable": true + }, + "keep": { + "type": "literal", + "executable": true + }, + "replace": { + "type": "literal", + "executable": true + } + }, + "executable": true, + "parser": "minecraft:block_state" + } + }, + "parser": "minecraft:block_pos" + } + } + }, + "setidletimeout": { + "type": "literal", + "children": { + "minutes": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "setworldspawn": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "children": { + "angle": { + "type": "argument", + "executable": true, + "parser": "minecraft:angle" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true + }, + "spawnpoint": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "angle": { + "type": "argument", + "executable": true, + "parser": "minecraft:angle" + } + }, + "executable": true, + "parser": "minecraft:block_pos" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + }, + "executable": true + }, + "spectate": { + "type": "literal", + "children": { + "target": { + "type": "argument", + "children": { + "player": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "single" + } + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + }, + "executable": true + }, + "spreadplayers": { + "type": "literal", + "children": { + "center": { + "type": "argument", + "children": { + "spreadDistance": { + "type": "argument", + "children": { + "maxRange": { + "type": "argument", + "children": { + "respectTeams": { + "type": "argument", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "parser": "brigadier:bool" + }, + "under": { + "type": "literal", + "children": { + "maxHeight": { + "type": "argument", + "children": { + "respectTeams": { + "type": "argument", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + }, + "parser": "brigadier:bool" + } + }, + "parser": "brigadier:integer" + } + } + } + }, + "parser": "brigadier:float", + "properties": { + "min": 1.0 + } + } + }, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + }, + "parser": "minecraft:vec2" + } + } + }, + "stop": { + "type": "literal", + "executable": true + }, + "stopsound": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "*": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + } + }, + "ambient": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "block": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "hostile": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "master": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "music": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "neutral": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "player": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "record": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "voice": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + }, + "weather": { + "type": "literal", + "children": { + "sound": { + "type": "argument", + "executable": true, + "parser": "minecraft:resource_location" + } + }, + "executable": true + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "summon": { + "type": "literal", + "children": { + "entity": { + "type": "argument", + "children": { + "pos": { + "type": "argument", + "children": { + "nbt": { + "type": "argument", + "executable": true, + "parser": "minecraft:nbt_compound_tag" + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "executable": true, + "parser": "minecraft:resource", + "properties": { + "registry": "minecraft:entity_type" + } + } + } + }, + "tag": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "add": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "name": { + "type": "argument", + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "team": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "executable": true, + "parser": "brigadier:string", + "properties": { + "type": "word" + } + } + } + }, + "empty": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "executable": true, + "parser": "minecraft:team" + } + } + }, + "join": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "children": { + "members": { + "type": "argument", + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + }, + "executable": true, + "parser": "minecraft:team" + } + } + }, + "leave": { + "type": "literal", + "children": { + "members": { + "type": "argument", + "executable": true, + "parser": "minecraft:score_holder", + "properties": { + "amount": "multiple" + } + } + } + }, + "list": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "executable": true, + "parser": "minecraft:team" + } + }, + "executable": true + }, + "modify": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "children": { + "collisionRule": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + }, + "pushOtherTeams": { + "type": "literal", + "executable": true + }, + "pushOwnTeam": { + "type": "literal", + "executable": true + } + } + }, + "color": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "minecraft:color" + } + } + }, + "deathMessageVisibility": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + } + } + }, + "displayName": { + "type": "literal", + "children": { + "displayName": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "friendlyFire": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + } + }, + "nametagVisibility": { + "type": "literal", + "children": { + "always": { + "type": "literal", + "executable": true + }, + "hideForOtherTeams": { + "type": "literal", + "executable": true + }, + "hideForOwnTeam": { + "type": "literal", + "executable": true + }, + "never": { + "type": "literal", + "executable": true + } + } + }, + "prefix": { + "type": "literal", + "children": { + "prefix": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "seeFriendlyInvisibles": { + "type": "literal", + "children": { + "allowed": { + "type": "argument", + "executable": true, + "parser": "brigadier:bool" + } + } + }, + "suffix": { + "type": "literal", + "children": { + "suffix": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + } + }, + "parser": "minecraft:team" + } + } + }, + "remove": { + "type": "literal", + "children": { + "team": { + "type": "argument", + "executable": true, + "parser": "minecraft:team" + } + } + } + } + }, + "teammsg": { + "type": "literal", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:message" + } + } + }, + "teleport": { + "type": "literal", + "children": { + "destination": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + }, + "location": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec3" + }, + "targets": { + "type": "argument", + "children": { + "destination": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + }, + "location": { + "type": "argument", + "children": { + "facing": { + "type": "literal", + "children": { + "entity": { + "type": "literal", + "children": { + "facingEntity": { + "type": "argument", + "children": { + "facingAnchor": { + "type": "argument", + "executable": true, + "parser": "minecraft:entity_anchor" + } + }, + "executable": true, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "single" + } + } + } + }, + "facingLocation": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec3" + } + } + }, + "rotation": { + "type": "argument", + "executable": true, + "parser": "minecraft:rotation" + } + }, + "executable": true, + "parser": "minecraft:vec3" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "entities", + "amount": "multiple" + } + } + } + }, + "tell": { + "type": "literal", + "redirect": ["msg"] + }, + "tellraw": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "message": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "time": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 0 + } + } + } + }, + "query": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "daytime": { + "type": "literal", + "executable": true + }, + "gametime": { + "type": "literal", + "executable": true + } + } + }, + "set": { + "type": "literal", + "children": { + "day": { + "type": "literal", + "executable": true + }, + "midnight": { + "type": "literal", + "executable": true + }, + "night": { + "type": "literal", + "executable": true + }, + "noon": { + "type": "literal", + "executable": true + }, + "time": { + "type": "argument", + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 0 + } + } + } + } + } + }, + "title": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "children": { + "actionbar": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "clear": { + "type": "literal", + "executable": true + }, + "reset": { + "type": "literal", + "executable": true + }, + "subtitle": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + }, + "times": { + "type": "literal", + "children": { + "fadeIn": { + "type": "argument", + "children": { + "stay": { + "type": "argument", + "children": { + "fadeOut": { + "type": "argument", + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:time", + "properties": { + "min": 0 + } + } + }, + "parser": "minecraft:time", + "properties": { + "min": 0 + } + } + } + }, + "title": { + "type": "literal", + "children": { + "title": { + "type": "argument", + "executable": true, + "parser": "minecraft:component" + } + } + } + }, + "parser": "minecraft:entity", + "properties": { + "type": "players", + "amount": "multiple" + } + } + } + }, + "tm": { + "type": "literal", + "redirect": ["teammsg"] + }, + "tp": { + "type": "literal", + "redirect": ["teleport"] + }, + "trigger": { + "type": "literal", + "children": { + "objective": { + "type": "argument", + "children": { + "add": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + } + }, + "set": { + "type": "literal", + "children": { + "value": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer" + } + } + } + }, + "executable": true, + "parser": "minecraft:objective" + } + } + }, + "w": { + "type": "literal", + "redirect": ["msg"] + }, + "weather": { + "type": "literal", + "children": { + "clear": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 1 + } + } + }, + "executable": true + }, + "rain": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 1 + } + } + }, + "executable": true + }, + "thunder": { + "type": "literal", + "children": { + "duration": { + "type": "argument", + "executable": true, + "parser": "minecraft:time", + "properties": { + "min": 1 + } + } + }, + "executable": true + } + } + }, + "whitelist": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + }, + "list": { + "type": "literal", + "executable": true + }, + "off": { + "type": "literal", + "executable": true + }, + "on": { + "type": "literal", + "executable": true + }, + "reload": { + "type": "literal", + "executable": true + }, + "remove": { + "type": "literal", + "children": { + "targets": { + "type": "argument", + "executable": true, + "parser": "minecraft:game_profile" + } + } + } + } + }, + "worldborder": { + "type": "literal", + "children": { + "add": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:double", + "properties": { + "max": 59999968.0, + "min": -59999968.0 + } + } + } + }, + "center": { + "type": "literal", + "children": { + "pos": { + "type": "argument", + "executable": true, + "parser": "minecraft:vec2" + } + } + }, + "damage": { + "type": "literal", + "children": { + "amount": { + "type": "literal", + "children": { + "damagePerBlock": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + } + }, + "buffer": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "executable": true, + "parser": "brigadier:float", + "properties": { + "min": 0.0 + } + } + } + } + } + }, + "get": { + "type": "literal", + "executable": true + }, + "set": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + }, + "executable": true, + "parser": "brigadier:double", + "properties": { + "max": 59999968.0, + "min": -59999968.0 + } + } + } + }, + "warning": { + "type": "literal", + "children": { + "distance": { + "type": "literal", + "children": { + "distance": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + }, + "time": { + "type": "literal", + "children": { + "time": { + "type": "argument", + "executable": true, + "parser": "brigadier:integer", + "properties": { + "min": 0 + } + } + } + } + } + } + } + }, + "xp": { + "type": "literal", + "redirect": ["experience"] + } + } +} diff --git a/packages/mecha/tests/snapshots/examples__build_basic_1_20__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_1_20__0.pack.md new file mode 100644 index 000000000..071d52698 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_basic_1_20__0.pack.md @@ -0,0 +1,36 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 14, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +execute if entity @e[type=pig] run return 1 +return 0 +``` + +## Resource pack + +`@resource_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 14, + "description": "" + } +} +``` From d80a9e0558b1a94cdf92176396677b0cbea85927 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Apr 2023 00:44:05 +0000 Subject: [PATCH 1152/1554] 0.69.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index b9ca3cbd0..a44c15229 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.69.0 (2023-04-25) +### Feature +* 23w16a ([`b93bd3f`](https://github.com/mcbeet/mecha/commit/b93bd3fdcea18c5e391387fdfd9b6c2bb59d59e0)) + ## v0.68.0 (2023-04-25) ### Feature * 1.19.4 ([`31570c8`](https://github.com/mcbeet/mecha/commit/31570c8aadb5f9bfdce813452a5810a36e3fde45)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 6d4e3a205..c81d01e27 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.68.0" +__version__ = "0.69.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 28f771c59..2f0fecbaa 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.68.0" +version = "0.69.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From b2f9e11197d3b13528d4765263807fad9e790bb4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 02:54:06 +0200 Subject: [PATCH 1153/1554] feat: update mecha --- packages/bolt/.github/workflows/main.yml | 2 +- packages/bolt/poetry.lock | 819 ++++++++++-------- packages/bolt/pyproject.toml | 12 +- .../tests/snapshots/bolt__parse_230__0.txt | 2 +- .../tests/snapshots/bolt__parse_48__0.txt | 2 +- .../tests/snapshots/bolt__parse_99__0.txt | 2 +- .../examples__build_bolt_basic__0.pack.md | 4 +- .../examples__build_bolt_chicken__0.pack.md | 2 +- .../examples__build_bolt_circular__0.pack.md | 2 +- .../examples__build_bolt_class__0.pack.md | 2 +- ...ples__build_bolt_compile_cached__0.pack.md | 2 +- .../examples__build_bolt_debug__0.pack.md | 2 +- .../examples__build_bolt_defer__0.pack.md | 2 +- .../examples__build_bolt_docstring__0.pack.md | 2 +- .../examples__build_bolt_flat__0.pack.md | 2 +- ...__build_bolt_function_signature__0.pack.md | 2 +- .../examples__build_bolt_generated__0.pack.md | 2 +- .../examples__build_bolt_lazy__0.pack.md | 2 +- .../examples__build_bolt_macro__0.pack.md | 2 +- ...examples__build_bolt_macro_perf__0.pack.md | 2 +- .../examples__build_bolt_memo__0.pack.md | 2 +- .../examples__build_bolt_merge__0.pack.md | 2 +- .../examples__build_bolt_order__0.pack.md | 2 +- .../examples__build_bolt_prelude__0.pack.md | 2 +- ...examples__build_bolt_proc_macro__0.pack.md | 2 +- ...mples__build_bolt_shadow_global__0.pack.md | 2 +- ..._build_bolt_strip_final_newline__0.pack.md | 2 +- .../examples__build_bolt_summon__0.pack.md | 2 +- ...es__build_bolt_type_annotations__0.pack.md | 2 +- .../tests/snapshots/spec__prototypes__0.json | 10 + 30 files changed, 485 insertions(+), 412 deletions(-) diff --git a/packages/bolt/.github/workflows/main.yml b/packages/bolt/.github/workflows/main.yml index a6abe09c9..492211f7b 100644 --- a/packages/bolt/.github/workflows/main.yml +++ b/packages/bolt/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: env: PYTHON_VERSION: "3.10" - POETRY_VERSION: "1.3.2" + POETRY_VERSION: "1.4.2" jobs: main: diff --git a/packages/bolt/poetry.lock b/packages/bolt/poetry.lock index 462a50082..020b385aa 100644 --- a/packages/bolt/poetry.lock +++ b/packages/bolt/poetry.lock @@ -1,33 +1,15 @@ # This file is automatically @generated by Poetry and should not be changed by hand. -[[package]] -name = "attrs" -version = "22.1.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] - -[package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] - [[package]] name = "beet" -version = "0.84.0" +version = "0.86.0" description = "The Minecraft pack development kit" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "beet-0.84.0-py3-none-any.whl", hash = "sha256:3a4c9111936056d156aea5faaef650bc875f807a9e41d4a591bdd8f26bffe7b1"}, - {file = "beet-0.84.0.tar.gz", hash = "sha256:633f171abcf392071d70cba15f0c9b435a7b9b56dabc248cd25bf967c9e8d288"}, + {file = "beet-0.86.0-py3-none-any.whl", hash = "sha256:b75fe7303adff14b450d22f655b07abf1d4e3d6a85c82142115c3bacb1408b70"}, + {file = "beet-0.86.0.tar.gz", hash = "sha256:aa3beb29f808c1b63151a066ecf06b1f2465dd1bdbdfdf6f598a5ed57dcaee7c"}, ] [package.dependencies] @@ -37,7 +19,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} Jinja2 = ">=3.1.2,<4.0.0" nbtlib = ">=1.12.1,<2.0.0" pathspec = ">=0.11.0,<0.12.0" -pydantic = ">=1.10.2,<2.0.0" +pydantic = ">=1.10.7,<2.0.0" PyYAML = ">=6.0,<7.0" toml = ">=0.10.2,<0.11.0" @@ -46,32 +28,46 @@ image = ["Pillow"] [[package]] name = "black" -version = "22.12.0" +version = "23.3.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -81,14 +77,14 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "5.0.1" +version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, - {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, ] [package.dependencies] @@ -97,18 +93,17 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.2)"] -dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] [[package]] name = "certifi" -version = "2022.9.24" +version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, ] [[package]] @@ -190,19 +185,89 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" version = "8.1.3" @@ -265,50 +330,45 @@ files = [ [[package]] name = "cryptography" -version = "38.0.3" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, - {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, - {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, - {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, ] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] [[package]] name = "docutils" @@ -336,14 +396,14 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.0.4" +version = "1.1.1" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, - {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] [package.extras] @@ -351,14 +411,14 @@ test = ["pytest (>=6)"] [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, ] [package.dependencies] @@ -366,14 +426,14 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.29" -description = "GitPython is a python library used to interact with Git repositories" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, ] [package.dependencies] @@ -393,34 +453,34 @@ files = [ [[package]] name = "importlib-metadata" -version = "5.0.0" +version = "6.6.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] @@ -508,24 +568,25 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "23.11.0" +version = "23.13.1" description = "Store and access your passwords safely." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "keyring-23.11.0-py3-none-any.whl", hash = "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e"}, - {file = "keyring-23.11.0.tar.gz", hash = "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361"}, + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, ] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} "jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] +completion = ["shtab"] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] @@ -548,24 +609,24 @@ markdown-it-py = ">=2.1.0,<3.0.0" [[package]] name = "markdown-it-py" -version = "2.1.0" +version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, ] [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code-style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] @@ -573,52 +634,62 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, ] [[package]] @@ -635,42 +706,42 @@ files = [ [[package]] name = "mecha" -version = "0.67.0" +version = "0.69.0" description = "A powerful Minecraft command library" category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ - {file = "mecha-0.67.0-py3-none-any.whl", hash = "sha256:89c99bdfd34c8731d0781327fc882d1b5dde6e61565fa39f9db09c01ebc9da55"}, - {file = "mecha-0.67.0.tar.gz", hash = "sha256:49a95e34be23495731fb996ff87479b0addca3729e77258be1fb2d5dcc007a9b"}, + {file = "mecha-0.69.0-py3-none-any.whl", hash = "sha256:b6ecdf2be13457a7d08dfabe955312085c5d53b0eb46360e825a6ca745e06073"}, + {file = "mecha-0.69.0.tar.gz", hash = "sha256:5b59b569ab89d8c608e7eb6e8b50c71fa0648496248428e2ca1be58be321f6b6"}, ] [package.dependencies] -beet = ">=0.83.1" +beet = ">=0.86.0" tokenstream = ">=1.5.0,<2.0.0" [[package]] name = "more-itertools" -version = "9.0.0" +version = "9.1.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, - {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, ] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] @@ -690,99 +761,96 @@ numpy = "*" [[package]] name = "numpy" -version = "1.23.5" -description = "NumPy is the fundamental package for array computing with Python." +version = "1.24.3" +description = "Fundamental package for array computing in Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] [[package]] name = "packaging" -version = "21.3" +version = "23.1" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "pathspec" -version = "0.11.0" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] [[package]] name = "pkginfo" -version = "1.8.3" -description = "Query metadatdata from sdists / bdists / installed packages." +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" files = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, ] [package.extras] -testing = ["coverage", "nose"] +testing = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "2.5.4" +version = "3.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, ] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -814,52 +882,52 @@ files = [ [[package]] name = "pydantic" -version = "1.10.2" +version = "1.10.7" description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, ] [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -867,48 +935,32 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.13.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] plugins = ["importlib-metadata"] -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pytest" -version = "7.2.1" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, - {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -917,7 +969,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-insta" @@ -937,19 +989,19 @@ wrapt = ">=1.14.1,<2.0.0" [[package]] name = "python-gitlab" -version = "3.11.0" +version = "3.14.0" description = "Interact with GitLab API" category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "python-gitlab-3.11.0.tar.gz", hash = "sha256:db9472b6ae4fba968b409dc32faee20dd65089065daa93e08d21b796a65d6578"}, - {file = "python_gitlab-3.11.0-py3-none-any.whl", hash = "sha256:9f91d7d3967067a8fba46f23e8176bc1d006d3d26abc9f8f1f8d2d84da1d45d8"}, + {file = "python-gitlab-3.14.0.tar.gz", hash = "sha256:ef3b8960faeee9880f82b0872d807e3fab94ace12b0d2a8418a97875c8812d3c"}, + {file = "python_gitlab-3.14.0-py3-none-any.whl", hash = "sha256:da614c014c6860147783dde8c216218d8fc6bd83a8bd2e3929dcdf11b211aa58"}, ] [package.dependencies] requests = ">=2.25.0" -requests-toolbelt = ">=0.9.1" +requests-toolbelt = ">=0.10.1" [package.extras] autocompletion = ["argcomplete (>=1.10.0,<3)"] @@ -957,14 +1009,14 @@ yaml = ["PyYaml (>=5.2)"] [[package]] name = "python-semantic-release" -version = "7.33.1" +version = "7.33.3" description = "Automatic Semantic Versioning for Python projects" category = "dev" optional = false python-versions = "*" files = [ - {file = "python-semantic-release-7.33.1.tar.gz", hash = "sha256:9d2e5681c2c296e0fc5d24088b59d7528c1c162920df29a4663d1131b5dfc97b"}, - {file = "python_semantic_release-7.33.1-py3-none-any.whl", hash = "sha256:ad8bc816526d3d0d7a4cf4833cc57e655a28b34d6fa33b3d2786a07ae4e8a075"}, + {file = "python-semantic-release-7.33.3.tar.gz", hash = "sha256:6f1b28e16ac7bcd67722945794a66ae7df7dcaabcc719324f89cce7015fe5c88"}, + {file = "python_semantic_release-7.33.3-py3-none-any.whl", hash = "sha256:911b9cef443d1eb2d6449a42d3728e9c54c01fe7a35e5a7fb607b5f9c764451d"}, ] [package.dependencies] @@ -1071,19 +1123,19 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "dev" optional = false python-versions = ">=3.7, <4" files = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" @@ -1211,26 +1263,26 @@ files = [ [[package]] name = "tomlkit" -version = "0.11.6" +version = "0.11.7" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, + {file = "tomlkit-0.11.7-py3-none-any.whl", hash = "sha256:5325463a7da2ef0c6bbfefb62a3dc883aebe679984709aee32a317907d0a8d3c"}, + {file = "tomlkit-0.11.7.tar.gz", hash = "sha256:f392ef70ad87a672f02519f99967d28a4d3047133e2d1df936511465fbb3791d"}, ] [[package]] name = "tqdm" -version = "4.64.1" +version = "4.65.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" files = [ - {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, - {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, ] [package.dependencies] @@ -1268,26 +1320,26 @@ urllib3 = ">=1.26.0" [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] [[package]] name = "urllib3" -version = "1.26.12" +version = "1.26.15" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, ] [package.extras] @@ -1309,110 +1361,121 @@ files = [ [[package]] name = "wheel" -version = "0.38.4" +version = "0.40.0" description = "A built-package format for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, - {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, + {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, + {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, ] [package.extras] -test = ["pytest (>=3.0.0)"] +test = ["pytest (>=6.0.0)"] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] [[package]] name = "zipp" -version = "3.10.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, - {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "9a3e0f7b9c4165662f10a230e2e77b069b9d8cb04a2f6fd64d8871a366b7bbec" +content-hash = "664f0eacc91e1b6c3542b0a220f412a05b8c42303f7c03e1b99756659236bf92" diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index bd519c547..f43a0291b 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -23,14 +23,14 @@ include = ["bolt/py.typed"] [tool.poetry.dependencies] python = "^3.10" -beet = ">=0.83.1" -mecha = ">=0.67.0" +beet = ">=0.86.0" +mecha = ">=0.69.0" [tool.poetry.group.dev.dependencies] -pytest = "^7.2.1" -black = "^22.12.0" -isort = "^5.10.1" -python-semantic-release = "^7.33.0" +pytest = "^7.3.1" +black = "^23.3.0" +isort = "^5.12.0" +python-semantic-release = "^7.33.3" pytest-insta = "^0.2.0" lectern = ">=0.26.0" diff --git a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt index d9f776a58..4a8e3e9b4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_230__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_230__0.txt @@ -1,6 +1,6 @@ macro foo: pass -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 128 other tokens but got literal 'foo'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 130 other tokens but got literal 'foo'. # line 3, column 7 # 2 | pass # 3 | as @p foo diff --git a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt index b05eae42a..420df5ccc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_48__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_48__0.txt @@ -1,5 +1,5 @@ 1 * 2 -#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 159 other tokens but got literal '*'. +#>ERROR Expected bracket '[', curly '{', decorator, docstring, ellipsis, false or 161 other tokens but got literal '*'. # line 2, column 1 # 1 | 1 * 2 # 2 | * 3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt index 236573f46..8e82e68c9 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_99__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_99__0.txt @@ -1,4 +1,4 @@ -#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 128 other tokens but got literal 'for'. +#>ERROR Expected colon, literal 'advancement', literal 'align', literal 'anchored', literal 'append', literal 'as' or 130 other tokens but got literal 'for'. # line 1, column 7 # 1 | at @s for i in "foo": # : ^^^ diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md index d08b67190..c34c08911 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_basic__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } @@ -643,7 +643,7 @@ say json loaded! ```json { "pack": { - "pack_format": 9, + "pack_format": 13, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md index 4574e9c36..7c7fcb586 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_chicken__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md index 5de9576b4..76be7bb58 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_circular__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md index 8e86b8a55..23fef49f2 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_class__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md index ab59c5ced..f5483ea53 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_compile_cached__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md index 324d811d4..c4257bbfc 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_debug__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md index 9f8447ac5..339d3a28b 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_defer__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md index 93ce479e0..f5dd3fcb0 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_docstring__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md index 50b6417b4..64f724524 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_flat__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md index 631aa3105..e6052f6d2 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_function_signature__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md index 243a4cb77..f6b4915ab 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_generated__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md index e2010c0a2..c0ca95582 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_lazy__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md index 925fdd2e5..3fc8e7c77 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_macro__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md index dab1ed917..52571442c 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_macro_perf__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md index 80a7f55ad..a19eff208 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_memo__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md index a1c852406..4b36fc0b2 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_merge__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md index 1f809e4bf..baedf9198 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_order__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md index 7c0503a10..cb838172a 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_prelude__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md index 0e24b7814..2f51e29aa 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_proc_macro__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md index d281a94ab..c519fc2e4 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_shadow_global__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md index e96926775..bc6a45e3e 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_strip_final_newline__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md index 48c7c43b7..7f31780d7 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_summon__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md index 00e57a929..74c5c0ab4 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_type_annotations__0.pack.md @@ -7,7 +7,7 @@ ```json { "pack": { - "pack_format": 10, + "pack_format": 12, "description": "" } } diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index 23e9c9892..dffa250ce 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -75,6 +75,7 @@ "bossbar:set:id:value:value", "bossbar:set:id:visible:visible", "break", + "chat_type:name:content", "class:name:bases:body", "class:name:body", "clear", @@ -139,6 +140,7 @@ "damage:target:amount:damageType:at:location", "damage:target:amount:damageType:by:entity", "damage:target:amount:damageType:by:entity:from:cause", + "damage_type:name:content", "data:get:block:targetPos", "data:get:block:targetPos:path", "data:get:block:targetPos:path:scale", @@ -551,6 +553,7 @@ "execute:bossbar:set:id:style:progress", "execute:bossbar:set:id:value:value", "execute:bossbar:set:id:visible:visible", + "execute:chat_type:name:content", "execute:clear:targets", "execute:clear:targets:item", "execute:clear:targets:item:maxCount", @@ -612,6 +615,7 @@ "execute:damage:target:amount:damageType:at:location", "execute:damage:target:amount:damageType:by:entity", "execute:damage:target:amount:damageType:by:entity:from:cause", + "execute:damage_type:name:content", "execute:data:get:block:targetPos", "execute:data:get:block:targetPos:path", "execute:data:get:block:targetPos:path:scale", @@ -1210,6 +1214,8 @@ "execute:merge:atlas:name:content", "execute:merge:block_tag:name:content", "execute:merge:blockstate:name:content", + "execute:merge:chat_type:name:content", + "execute:merge:damage_type:name:content", "execute:merge:dimension:name:content", "execute:merge:dimension_type:name:content", "execute:merge:entity_type_tag:name:content", @@ -1331,6 +1337,7 @@ "execute:playsound:sound:weather:targets:pos:volume:pitch", "execute:playsound:sound:weather:targets:pos:volume:pitch:minVolume", "execute:positioned:as:targets:subcommand", + "execute:positioned:over:heightmap:subcommand", "execute:positioned:pos:subcommand", "execute:predicate:name:content", "execute:prepend:block_tag:name:content", @@ -1905,6 +1912,8 @@ "merge:atlas:name:content", "merge:block_tag:name:content", "merge:blockstate:name:content", + "merge:chat_type:name:content", + "merge:damage_type:name:content", "merge:dimension:name:content", "merge:dimension_type:name:content", "merge:entity_type_tag:name:content", @@ -2030,6 +2039,7 @@ "playsound:sound:weather:targets:pos:volume:pitch", "playsound:sound:weather:targets:pos:volume:pitch:minVolume", "positioned:as:targets:subcommand", + "positioned:over:heightmap:subcommand", "positioned:pos:subcommand", "predicate:name:content", "prepend:block_tag:name:content", From b35d029d48a052fe4f0faadfe0ecb8f1026ed963 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Apr 2023 00:55:46 +0000 Subject: [PATCH 1154/1554] 0.32.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 680ac007e..bdbc34bac 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.32.0 (2023-04-25) +### Feature +* Update mecha ([`fba874e`](https://github.com/mcbeet/bolt/commit/fba874e345e655231cf1a66951c78b719fbb68c1)) + ## v0.31.0 (2023-02-19) ### Feature * Add prelude option ([`b0937e0`](https://github.com/mcbeet/bolt/commit/b0937e06affd62e8f358638358ce2797644d36e7)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index cee585fc6..70eaa13ff 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.31.0" +__version__ = "0.32.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index f43a0291b..5fd033dd4 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.31.0" +version = "0.32.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From ef14288c725d3fb1a84dc4d17b7ee015c65a51a4 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 03:34:11 +0200 Subject: [PATCH 1155/1554] feat: handle vanilla return --- packages/bolt/bolt/codegen.py | 2 +- packages/bolt/bolt/parse.py | 41 ++++++++++++++++++- packages/bolt/bolt/resources/commands.json | 2 +- packages/bolt/examples/bolt_1_20/beet.yml | 7 ++++ .../src/data/demo/functions/foo.mcfunction | 7 ++++ .../tests/snapshots/bolt__parse_193__0.txt | 2 +- .../tests/snapshots/bolt__parse_194__0.txt | 4 +- .../tests/snapshots/bolt__parse_196__0.txt | 2 +- .../tests/snapshots/bolt__parse_197__0.txt | 2 +- .../tests/snapshots/bolt__parse_265__0.txt | 4 +- .../tests/snapshots/bolt__parse_327__0.txt | 2 +- .../tests/snapshots/bolt__parse_328__0.txt | 2 +- .../tests/snapshots/bolt__parse_343__0.txt | 4 +- .../tests/snapshots/bolt__parse_87__0.txt | 2 +- .../tests/snapshots/bolt__parse_97__0.txt | 2 +- .../examples__build_bolt_1_20__0.pack.md | 37 +++++++++++++++++ .../tests/snapshots/spec__prototypes__0.json | 2 +- 17 files changed, 107 insertions(+), 17 deletions(-) create mode 100644 packages/bolt/examples/bolt_1_20/beet.yml create mode 100644 packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index ee67edcfc..9ffd63a0c 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -641,7 +641,7 @@ def function( return [] @rule(AstCommand, identifier="return") - @rule(AstCommand, identifier="return:value") + @rule(AstCommand, identifier="return:pythonresult") def return_statement( self, node: AstCommand, diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index e2fe058ba..8fb736415 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -21,6 +21,7 @@ "parse_decorator", "AssignmentTargetParser", "IfElseLoweringParser", + "VanillaReturnHandler", "BreakContinueConstraint", "parse_deferred_root", "parse_function_signature", @@ -73,6 +74,7 @@ AstCommand, AstJson, AstNode, + AstNumber, AstResourceLocation, AstRoot, BasicLiteralParser, @@ -620,6 +622,7 @@ def __call__(self, stream: TokenStream) -> Any: def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): """Compose root parsers.""" parser = FlushPendingBindingsParser(parser, before=True) + parser = VanillaReturnHandler(parser) parser = IfElseLoweringParser(parser) parser = BreakContinueConstraint( parser, @@ -634,7 +637,7 @@ def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): flags={"memo": False}, command_identifiers={ "return", - "return:value", + "return:pythonresult", "yield", "yield:value", "yield:from:value", @@ -1124,6 +1127,42 @@ def __call__(self, stream: TokenStream) -> AstTarget: return set_location(node, nodes[0], nodes[-1]) +@dataclass +class VanillaReturnHandler: + """Turn vanilla return into bolt return statement when not prefixed by execute.""" + + parser: Parser + + def __call__(self, stream: TokenStream) -> Any: + node: AstRoot = self.parser(stream) + + changed = False + result: List[AstCommand] = [] + + for command in node.commands: + if command.identifier == "return:value" and command.arguments: + changed = True + + arg = command.arguments[0] + if isinstance(arg, AstNumber): + arg = set_location(AstValue(value=arg.value), arg) + elif isinstance(arg, AstInterpolation): + arg = arg.value + + command = set_location( + AstCommand( + identifier="return:pythonresult", arguments=AstChildren([arg]) + ) + ) + + result.append(command) + + if changed: + node = replace(node, commands=AstChildren(result)) + + return node + + @dataclass class IfElseLoweringParser: """Parser that turns elif statements into if statements in an else clause.""" diff --git a/packages/bolt/bolt/resources/commands.json b/packages/bolt/bolt/resources/commands.json index 3783887c0..60f8d7484 100644 --- a/packages/bolt/bolt/resources/commands.json +++ b/packages/bolt/bolt/resources/commands.json @@ -26,7 +26,7 @@ "type": "literal", "executable": true, "children": { - "value": { + "pythonresult": { "type": "argument", "parser": "bolt:expression", "executable": true diff --git a/packages/bolt/examples/bolt_1_20/beet.yml b/packages/bolt/examples/bolt_1_20/beet.yml new file mode 100644 index 000000000..deca9b860 --- /dev/null +++ b/packages/bolt/examples/bolt_1_20/beet.yml @@ -0,0 +1,7 @@ +minecraft: "1.20" +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..a862da211 --- /dev/null +++ b/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,7 @@ +def f(): + execute if entity @e[type=pig] run return 123 + n = 77 + execute return n + return 99999 + +say f() diff --git a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt index 852bcef66..d1b05534c 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_193__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_193__0.txt @@ -228,7 +228,7 @@ b = a location: SourceLocation(pos=268, lineno=9, colno=5) end_location: SourceLocation(pos=279, lineno=9, colno=16) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=275, lineno=9, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt index 9ca5766b6..b4269aaab 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_194__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_194__0.txt @@ -97,7 +97,7 @@ say Counter(9).incr() location: SourceLocation(pos=76, lineno=5, colno=9) end_location: SourceLocation(pos=84, lineno=5, colno=17) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=83, lineno=5, colno=16) @@ -106,7 +106,7 @@ say Counter(9).incr() location: SourceLocation(pos=89, lineno=6, colno=5) end_location: SourceLocation(pos=110, lineno=6, colno=26) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=96, lineno=6, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt index 8b2ae4ce8..69e464708 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_196__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_196__0.txt @@ -99,7 +99,7 @@ def foo(value): location: SourceLocation(pos=82, lineno=6, colno=5) end_location: SourceLocation(pos=95, lineno=6, colno=18) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=89, lineno=6, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt index fba04e3a7..f8b46144e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_197__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_197__0.txt @@ -121,7 +121,7 @@ def foo(value): location: SourceLocation(pos=102, lineno=7, colno=5) end_location: SourceLocation(pos=115, lineno=7, colno=18) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=109, lineno=7, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_265__0.txt b/packages/bolt/tests/snapshots/bolt__parse_265__0.txt index 7eaa395a0..27c8f526d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_265__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_265__0.txt @@ -65,7 +65,7 @@ class B: location: SourceLocation(pos=48, lineno=4, colno=9) end_location: SourceLocation(pos=58, lineno=4, colno=19) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=55, lineno=4, colno=16) @@ -131,7 +131,7 @@ class B: location: SourceLocation(pos=107, lineno=8, colno=9) end_location: SourceLocation(pos=117, lineno=8, colno=19) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=114, lineno=8, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_327__0.txt b/packages/bolt/tests/snapshots/bolt__parse_327__0.txt index 088cc8b58..2739d2123 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_327__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_327__0.txt @@ -36,7 +36,7 @@ def f(): location: SourceLocation(pos=35, lineno=3, colno=5) end_location: SourceLocation(pos=44, lineno=3, colno=14) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=42, lineno=3, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_328__0.txt b/packages/bolt/tests/snapshots/bolt__parse_328__0.txt index 0c0c5701e..6a3820eca 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_328__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_328__0.txt @@ -45,7 +45,7 @@ def g(a=123): location: SourceLocation(pos=46, lineno=3, colno=5) end_location: SourceLocation(pos=54, lineno=3, colno=13) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=53, lineno=3, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_343__0.txt b/packages/bolt/tests/snapshots/bolt__parse_343__0.txt index 1eff4bd92..244098662 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_343__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_343__0.txt @@ -58,7 +58,7 @@ def fib(n): location: SourceLocation(pos=35, lineno=3, colno=9) end_location: SourceLocation(pos=43, lineno=3, colno=17) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=42, lineno=3, colno=16) @@ -151,7 +151,7 @@ def fib(n): location: SourceLocation(pos=101, lineno=6, colno=5) end_location: SourceLocation(pos=114, lineno=6, colno=18) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=108, lineno=6, colno=12) diff --git a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt index 5c8cab60f..9c1bbd5b7 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_87__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_87__0.txt @@ -46,7 +46,7 @@ def f(): location: SourceLocation(pos=30, lineno=3, colno=9) end_location: SourceLocation(pos=40, lineno=3, colno=19) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=37, lineno=3, colno=16) diff --git a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt index 98a0906ee..740c58595 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_97__0.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_97__0.txt @@ -26,7 +26,7 @@ def f(): location: SourceLocation(pos=13, lineno=2, colno=5) end_location: SourceLocation(pos=56, lineno=2, colno=48) - identifier: 'return:value' + identifier: 'return:pythonresult' arguments: location: SourceLocation(pos=20, lineno=2, colno=12) diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md new file mode 100644 index 000000000..96547222b --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md @@ -0,0 +1,37 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 14, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +execute if entity @e[type=pig] run return 123 +return 77 +say 99999 +``` + +## Resource pack + +`@resource_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 14, + "description": "" + } +} +``` diff --git a/packages/bolt/tests/snapshots/spec__prototypes__0.json b/packages/bolt/tests/snapshots/spec__prototypes__0.json index dffa250ce..9869de797 100644 --- a/packages/bolt/tests/snapshots/spec__prototypes__0.json +++ b/packages/bolt/tests/snapshots/spec__prototypes__0.json @@ -2069,7 +2069,7 @@ "recipe:take:targets:recipe", "reload", "return", - "return:value", + "return:pythonresult", "ride:target:dismount", "ride:target:mount:vehicle", "rotated:as:targets:subcommand", From 0e51cb63b6373044bae02816ee8a4f480f2c6974 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Apr 2023 01:35:04 +0000 Subject: [PATCH 1156/1554] 0.33.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index bdbc34bac..910f71931 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.33.0 (2023-04-25) +### Feature +* Handle vanilla return ([`90c3f54`](https://github.com/mcbeet/bolt/commit/90c3f541c66af7e626f9bab83e4cd35ed71f4d05)) + ## v0.32.0 (2023-04-25) ### Feature * Update mecha ([`fba874e`](https://github.com/mcbeet/bolt/commit/fba874e345e655231cf1a66951c78b719fbb68c1)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 70eaa13ff..11f420677 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.32.0" +__version__ = "0.33.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 5fd033dd4..15ea8fd4f 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.32.0" +version = "0.33.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From ead6d4694eca7a4be5a539692e45d1ec34cd1edb Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 23:34:47 +0200 Subject: [PATCH 1157/1554] chore: adopt black formatter extension --- packages/bolt/.vscode/extensions.json | 1 + packages/bolt/.vscode/settings.json | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/bolt/.vscode/extensions.json b/packages/bolt/.vscode/extensions.json index 206307d3c..cf97a3327 100644 --- a/packages/bolt/.vscode/extensions.json +++ b/packages/bolt/.vscode/extensions.json @@ -2,6 +2,7 @@ "recommendations": [ "ms-python.python", "ms-python.vscode-pylance", + "ms-python.black-formatter", "tamasfe.even-better-toml" ] } diff --git a/packages/bolt/.vscode/settings.json b/packages/bolt/.vscode/settings.json index a0261783e..5f7c0cf82 100644 --- a/packages/bolt/.vscode/settings.json +++ b/packages/bolt/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.formatting.provider": "black", + "python.formatting.provider": "none", "python.languageServer": "Pylance", "python.linting.enabled": false, "python.linting.pylintEnabled": false, @@ -17,6 +17,7 @@ "editor.formatOnPaste": false, "editor.codeActionsOnSave": { "source.organizeImports": true - } + }, + "editor.defaultFormatter": "ms-python.black-formatter" } } From 0abec24d840d96a9427dbbebedf26d142f1b74d8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Tue, 25 Apr 2023 23:36:49 +0200 Subject: [PATCH 1158/1554] fix: only rewrite vanilla return inside function scope --- packages/bolt/bolt/parse.py | 7 ++++++- .../bolt_1_20/src/data/demo/functions/foo.mcfunction | 5 +++++ .../tests/snapshots/examples__build_bolt_1_20__0.pack.md | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 8fb736415..72d6e0803 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -1136,6 +1136,10 @@ class VanillaReturnHandler: def __call__(self, stream: TokenStream) -> Any: node: AstRoot = self.parser(stream) + lexical_scope = get_stream_lexical_scope(stream) + if not isinstance(lexical_scope, FunctionScope): + return node + changed = False result: List[AstCommand] = [] @@ -1152,7 +1156,8 @@ def __call__(self, stream: TokenStream) -> Any: command = set_location( AstCommand( identifier="return:pythonresult", arguments=AstChildren([arg]) - ) + ), + command, ) result.append(command) diff --git a/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction index a862da211..ae76e9c84 100644 --- a/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction +++ b/packages/bolt/examples/bolt_1_20/src/data/demo/functions/foo.mcfunction @@ -5,3 +5,8 @@ def f(): return 99999 say f() + +execute function ./thing: + return 42 + +return 0 diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md index 96547222b..313e7dd4e 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_1_20__0.pack.md @@ -21,6 +21,14 @@ execute if entity @e[type=pig] run return 123 return 77 say 99999 +function demo:thing +return 0 +``` + +`@function demo:thing` + +```mcfunction +return 42 ``` ## Resource pack From a9452cf0063f27fec0f330cc12e415336598a0b9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Apr 2023 21:37:40 +0000 Subject: [PATCH 1159/1554] 0.33.1 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 910f71931..d6f0e94b1 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.33.1 (2023-04-25) +### Fix +* Only rewrite vanilla return inside function scope ([`e874832`](https://github.com/mcbeet/bolt/commit/e874832ef13af24b69382c6d84a2a4fdaeac3fe3)) + ## v0.33.0 (2023-04-25) ### Feature * Handle vanilla return ([`90c3f54`](https://github.com/mcbeet/bolt/commit/90c3f541c66af7e626f9bab83e4cd35ed71f4d05)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 11f420677..8910298ba 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.33.0" +__version__ = "0.33.1" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 15ea8fd4f..70f681c17 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.33.0" +version = "0.33.1" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 15e144c06acf063cd0f4e74da7301228cc8e5db8 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 26 Apr 2023 23:22:17 +0200 Subject: [PATCH 1160/1554] fix: don't handle docstrings behind subcommands --- packages/bolt/bolt/parse.py | 32 +++++++++++++------ .../tests/resources/bolt_examples.mcfunction | 2 ++ .../tests/snapshots/bolt__parse_358__0.txt | 5 +++ 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_358__0.txt diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index 72d6e0803..cf056360a 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -622,6 +622,7 @@ def __call__(self, stream: TokenStream) -> Any: def create_bolt_root_parser(parser: Parser, macro_handler: "MacroHandler"): """Compose root parsers.""" parser = FlushPendingBindingsParser(parser, before=True) + parser = DocstringHandler(parser) parser = VanillaReturnHandler(parser) parser = IfElseLoweringParser(parser) parser = BreakContinueConstraint( @@ -660,7 +661,6 @@ def create_bolt_command_parser( parser = MemoHandler(parser) parser = BindingStorageHandler(parser) parser = ImportStatementHandler(parser, modules) - parser = DocstringHandler(parser) parser = UndefinedIdentifierErrorHandler(parser) parser = SubcommandConstraint(parser, command_identifiers=bolt_prototypes) return parser @@ -2011,14 +2011,28 @@ class DocstringHandler: parser: Parser def __call__(self, stream: TokenStream) -> Any: - if ( - isinstance(node := self.parser(stream), AstCommand) - and node.identifier == "statement" - and node.arguments - and isinstance(literal := node.arguments[0], AstValue) - and isinstance(literal.value, str) - ): - return set_location(AstDocstring(arguments=AstChildren([literal])), node) + node: AstRoot = self.parser(stream) + + changed = False + result: List[AstCommand] = [] + + for command in node.commands: + if ( + command.identifier == "statement" + and command.arguments + and isinstance(literal := command.arguments[0], AstValue) + and isinstance(literal.value, str) + ): + changed = True + command = set_location( + AstDocstring(arguments=AstChildren([literal])), command + ) + + result.append(command) + + if changed: + node = replace(node, commands=AstChildren(result)) + return node diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index 58faaee7c..cbc9167fd 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1318,3 +1318,5 @@ hello run summon bat x = 1 del x x = 2 +### +execute run "not docstring" diff --git a/packages/bolt/tests/snapshots/bolt__parse_358__0.txt b/packages/bolt/tests/snapshots/bolt__parse_358__0.txt new file mode 100644 index 000000000..31f3f472e --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_358__0.txt @@ -0,0 +1,5 @@ +#>ERROR Can't use statement as a subcommand. +# line 1, column 13 +# 1 | execute run "not docstring" +# : ^^^^^^^^^^^^^^^ +execute run "not docstring" From a0ae216048cd0040a946b5eeeb1092c9c6f1534b Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Apr 2023 21:23:11 +0000 Subject: [PATCH 1161/1554] 0.33.2 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index d6f0e94b1..21633274a 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.33.2 (2023-04-26) +### Fix +* Don't handle docstrings behind subcommands ([`2fd8c25`](https://github.com/mcbeet/bolt/commit/2fd8c256cf9272fea7b908b654f0ef25d2118c13)) + ## v0.33.1 (2023-04-25) ### Fix * Only rewrite vanilla return inside function scope ([`e874832`](https://github.com/mcbeet/bolt/commit/e874832ef13af24b69382c6d84a2a4fdaeac3fe3)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 8910298ba..2bce816a3 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.33.1" +__version__ = "0.33.2" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 70f681c17..8961b3102 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.33.1" +version = "0.33.2" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 447288adcd9df2b7f258cd7e88ffb40b89f7e45e Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 May 2023 21:54:39 +0200 Subject: [PATCH 1162/1554] feat: reusable abstract ast and dispatch --- packages/mecha/mecha/ast.py | 57 ++++++++++++++++++++----------- packages/mecha/mecha/dispatch.py | 46 +++++++++++++------------ packages/mecha/mecha/serialize.py | 2 +- 3 files changed, 64 insertions(+), 41 deletions(-) diff --git a/packages/mecha/mecha/ast.py b/packages/mecha/mecha/ast.py index 52284a1f5..b89085660 100644 --- a/packages/mecha/mecha/ast.py +++ b/packages/mecha/mecha/ast.py @@ -1,4 +1,6 @@ __all__ = [ + "AbstractNode", + "AbstractChildren", "AstNode", "AstChildren", "AstRoot", @@ -109,6 +111,7 @@ from .utils import string_to_number T = TypeVar("T") +AbstractNodeType = TypeVar("AbstractNodeType", bound="AbstractNode", covariant=True) AstNodeType = TypeVar("AstNodeType", bound="AstNode", covariant=True) AstLiteralType = TypeVar("AstLiteralType", bound="AstLiteral") @@ -134,37 +137,34 @@ @dataclass(frozen=True, slots=True) -class AstNode: - """Base class for all ast nodes.""" +class AbstractNode: + """Abstract node.""" location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) end_location: SourceLocation = extra_field(default=UNKNOWN_LOCATION) - parser: ClassVar[Optional[str]] = None - compile_hints: ClassVar[JsonDict] = {} - - def __iter__(self) -> Iterator["AstNode"]: + def __iter__(self) -> Iterator["AbstractNode"]: for f in fields(self): attribute = getattr(self, f.name) - if isinstance(attribute, AstChildren): + if isinstance(attribute, AbstractChildren): yield from attribute - if isinstance(attribute, AstNode): + if isinstance(attribute, AbstractNode): yield attribute - def walk(self) -> Iterator["AstNode"]: + def walk(self) -> Iterator["AbstractNode"]: yield self for f in fields(self): attribute = getattr(self, f.name) - if isinstance(attribute, AstChildren): + if isinstance(attribute, AbstractChildren): for child in attribute: # type: ignore - if isinstance(child, AstNode): + if isinstance(child, AbstractNode): yield from child.walk() - elif isinstance(attribute, AstNode): + elif isinstance(attribute, AbstractNode): yield from attribute.walk() def dump( @@ -178,14 +178,14 @@ def dump( f"{prefix} {f.name}:" + ( "\n" + ("\n".join((f"{prefix} {type(child)}" if shallow else child.dump(prefix + " ", shallow, exclude)) for child in attribute) if attribute else prefix + " ") # type: ignore - if isinstance(attribute := getattr(self, f.name), AstChildren) + if isinstance(attribute := getattr(self, f.name), AbstractChildren) else "\n" + ( f"{prefix} {type(attribute)}" if shallow else attribute.dump(prefix + " ", shallow, exclude) ) - if isinstance(attribute, AstNode) + if isinstance(attribute, AbstractNode) else f" {attribute!r}" ) for f in fields(self) @@ -197,23 +197,42 @@ def emit_error(self, exc: T) -> T: return set_location(exc, self) -class AstChildren(Tuple[AstNodeType, ...]): - """Specialized tuple subclass for holding multiple child ast nodes.""" +class AbstractChildren(Tuple[AbstractNodeType, ...]): + """Abstract children.""" def __new__( cls, - children: Iterable[None | AstNodeType | "AstChildren[AstNodeType]"] = (), + children: Iterable[ + None | AbstractNodeType | "AbstractChildren[AbstractNodeType]" + ] = (), ): children = [ c for child in children if child is not None - for c in (child if isinstance(child, AstChildren) else [child]) + for c in (child if isinstance(child, AbstractChildren) else [child]) ] return super().__new__(cls, children) def __repr__(self) -> str: - return f"AstChildren({super().__repr__()})" + return f"{self.__class__.__name__}({super().__repr__()})" + + +class AstNode(AbstractNode): + """Base class for all ast nodes.""" + + parser: ClassVar[Optional[str]] = None + compile_hints: ClassVar[JsonDict] = {} + + def __iter__(self) -> Iterator["AstNode"]: + return super().__iter__() # type: ignore + + def walk(self) -> Iterator["AstNode"]: + return super().walk() # type: ignore + + +class AstChildren(AbstractChildren[AstNodeType]): + """Specialized tuple subclass for holding multiple child ast nodes.""" @dataclass(frozen=True, slots=True) diff --git a/packages/mecha/mecha/dispatch.py b/packages/mecha/mecha/dispatch.py index 2b515112c..9ffb14dfd 100644 --- a/packages/mecha/mecha/dispatch.py +++ b/packages/mecha/mecha/dispatch.py @@ -36,7 +36,7 @@ from beet import BubbleException, WrappedException from beet.core.utils import extra_field -from .ast import AstChildren, AstNode +from .ast import AbstractChildren, AbstractNode from .diagnostic import Diagnostic, DiagnosticCollection T = TypeVar("T") @@ -60,7 +60,7 @@ class Rule: """Rule that can be associated to an ast node by the dispatcher.""" callback: Callable[..., Any] - match_types: Tuple[Type[AstNode], ...] = () + match_types: Tuple[Type[AbstractNode], ...] = () match_fields: FrozenSet[Tuple[str, Any]] = frozenset() name: Optional[str] = None @@ -99,7 +99,9 @@ def rule(func: Callable[..., Any]) -> Rule: @overload -def rule(*args: Type[AstNode], **kwargs: Any) -> Callable[[Callable[..., Any]], Rule]: +def rule( + *args: Type[AbstractNode], **kwargs: Any +) -> Callable[[Callable[..., Any]], Rule]: ... @@ -108,7 +110,7 @@ def rule(*args: Any, **kwargs: Any) -> Any: match_types = () match_fields = frozenset(kwargs.items()) - if args and isinstance(args[0], type) and issubclass(args[0], AstNode): + if args and isinstance(args[0], type) and issubclass(args[0], AbstractNode): match_types = args def decorator(func: Callable[..., Any]) -> Callable[..., Any]: @@ -154,7 +156,7 @@ def add_rule(self, rule: Callable[..., Any]): if rule.name and self.levels.get(rule.name) == "ignore": return - for match_type in rule.match_types or [AstNode]: + for match_type in rule.match_types or [AbstractNode]: l = self.rules.setdefault(match_type, {}).setdefault(rule.match_fields, []) l.append((self.count, rule.name, rule.callback)) self.count += 1 @@ -202,7 +204,7 @@ def reset(self): def dispatch( self, - node: AstNode, + node: AbstractNode, ) -> Iterator[Tuple[Optional[str], Callable[..., Any]]]: """Dispatch rules.""" priority_queue: List[ @@ -233,7 +235,7 @@ def dispatch( dispatched.add(callback) yield name, callback - def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + def invoke(self, node: AbstractNode, *args: Any, **kwargs: Any) -> Any: """Invoke rules on the given ast node.""" for name, rule in self.dispatch(node): self.process(node, name, rule, *args, **kwargs) @@ -241,7 +243,7 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: def process( self, - node: AstNode, + node: AbstractNode, name: Optional[str] = None, rule: Optional[Callable[..., Any]] = None, *args: Any, @@ -266,7 +268,7 @@ def process( child = self.handle_output(node, child, name) feedback = None - if isinstance(child, AstNode): + if isinstance(child, AbstractNode): feedback = self.invoke(child, *args, **kwargs) elif child is not None: msg = f"Invalid node of type {type(child)}." @@ -284,7 +286,7 @@ def process( def handle_output( self, - node: AstNode, + node: AbstractNode, output: Any, name: Optional[str] = None, ) -> Any: @@ -323,7 +325,9 @@ def use_diagnostics(self, diagnostics: DiagnosticCollection) -> Iterator[None]: self.diagnostics = previous_diagnostics @contextmanager - def use_rule(self, node: AstNode, name: Optional[str] = None) -> Iterator[None]: + def use_rule( + self, node: AbstractNode, name: Optional[str] = None + ) -> Iterator[None]: """Handle rule diagnostics.""" try: yield @@ -340,7 +344,7 @@ def use_rule(self, node: AstNode, name: Optional[str] = None) -> Iterator[None]: tb = exc.__traceback__ and exc.__traceback__.tb_next raise CompilationError(msg) from exc.with_traceback(tb) - def __call__(self, node: AstNode) -> T: + def __call__(self, node: AbstractNode) -> T: if not self.count: return node # type: ignore return self.invoke(node) @@ -349,7 +353,7 @@ def __call__(self, node: AstNode) -> T: class Visitor(Dispatcher[Any]): """Ast visitor.""" - def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + def invoke(self, node: AbstractNode, *args: Any, **kwargs: Any) -> Any: name, rule = next(self.dispatch(node), (None, None)) return self.process(node, name, rule, *args, **kwargs) @@ -357,7 +361,7 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: class Reducer(Dispatcher[Any]): """Ast reducer.""" - def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: + def invoke(self, node: AbstractNode, *args: Any, **kwargs: Any) -> Any: for child in node: self.invoke(child, *args, **kwargs) return super().invoke(node, *args, **kwargs) @@ -366,16 +370,16 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: class MutatingReducer(Dispatcher[Any]): """Mutating ast reducer.""" - def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: - to_replace: Dict[str, Union[AstNode, AstChildren[AstNode]]] = {} + def invoke(self, node: AbstractNode, *args: Any, **kwargs: Any) -> Any: + to_replace: Dict[str, Union[AbstractNode, AbstractChildren[AbstractNode]]] = {} for f in fields(node): attribute = getattr(node, f.name) - if isinstance(attribute, AstChildren): - result = AstChildren(self.invoke(child, *args, **kwargs) for child in attribute) # type: ignore + if isinstance(attribute, AbstractChildren): + result = AbstractChildren(self.invoke(child, *args, **kwargs) for child in attribute) # type: ignore if len(result) != len(attribute) or any(child is not original for child, original in zip(result, attribute)): # type: ignore to_replace[f.name] = result - elif isinstance(attribute, AstNode): + elif isinstance(attribute, AbstractNode): result = self.invoke(attribute, *args, **kwargs) if result is not attribute: to_replace[f.name] = result @@ -392,11 +396,11 @@ def invoke(self, node: AstNode, *args: Any, **kwargs: Any) -> Any: result = self.process(node, name, rule, *args, **kwargs) if result is not node: - if isinstance(result, AstNode): + if isinstance(result, AbstractNode): exhausted = False node = result break - elif result is None or isinstance(result, AstChildren): + elif result is None or isinstance(result, AbstractChildren): return result # type: ignore else: msg = f"Invalid node of type {type(result)}." diff --git a/packages/mecha/mecha/serialize.py b/packages/mecha/mecha/serialize.py index 7b3c810a1..79ddcc59a 100644 --- a/packages/mecha/mecha/serialize.py +++ b/packages/mecha/mecha/serialize.py @@ -87,7 +87,7 @@ class Serializer(Visitor): ) ) - def __call__(self, node: AstNode, **kwargs: Any) -> str: + def __call__(self, node: AstNode, **kwargs: Any) -> str: # type: ignore result: List[str] = [] previous_formatting = self.formatting if kwargs else None From 6d28b91e238a701ef096018fc4654fdec038014d Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 3 May 2023 21:56:34 +0200 Subject: [PATCH 1163/1554] chore: adopt black formatter extension --- packages/mecha/.vscode/extensions.json | 1 + packages/mecha/.vscode/settings.json | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/.vscode/extensions.json b/packages/mecha/.vscode/extensions.json index 206307d3c..cf97a3327 100644 --- a/packages/mecha/.vscode/extensions.json +++ b/packages/mecha/.vscode/extensions.json @@ -2,6 +2,7 @@ "recommendations": [ "ms-python.python", "ms-python.vscode-pylance", + "ms-python.black-formatter", "tamasfe.even-better-toml" ] } diff --git a/packages/mecha/.vscode/settings.json b/packages/mecha/.vscode/settings.json index 23de92c05..5f7c0cf82 100644 --- a/packages/mecha/.vscode/settings.json +++ b/packages/mecha/.vscode/settings.json @@ -1,6 +1,5 @@ { - "python.pythonPath": "${workspaceFolder}/.venv", - "python.formatting.provider": "black", + "python.formatting.provider": "none", "python.languageServer": "Pylance", "python.linting.enabled": false, "python.linting.pylintEnabled": false, @@ -18,6 +17,7 @@ "editor.formatOnPaste": false, "editor.codeActionsOnSave": { "source.organizeImports": true - } + }, + "editor.defaultFormatter": "ms-python.black-formatter" } } From 413f0c7f0c57e5a7a3cd790855033af65f045f03 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 3 May 2023 19:57:18 +0000 Subject: [PATCH 1164/1554] 0.70.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index a44c15229..401237658 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.70.0 (2023-05-03) +### Feature +* Reusable abstract ast and dispatch ([`d4cfe86`](https://github.com/mcbeet/mecha/commit/d4cfe86a059c4c66589358c440c79d60cf2d02f3)) + ## v0.69.0 (2023-04-25) ### Feature * 23w16a ([`b93bd3f`](https://github.com/mcbeet/mecha/commit/b93bd3fdcea18c5e391387fdfd9b6c2bb59d59e0)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index c81d01e27..127ead2dc 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.69.0" +__version__ = "0.70.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2f0fecbaa..257546fdb 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.69.0" +version = "0.70.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 0bb79a46065d7c50edb5d76211c061356ceb2bfd Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 7 May 2023 02:51:39 +0200 Subject: [PATCH 1165/1554] feat: initial mcdoc parser --- .../mecha/contrib/validation/__init__.py | 1 + .../mecha/mecha/contrib/validation/mcdoc.py | 1281 +++++++++++++++++ .../mecha/tests/resources/mcdoc_examples.txt | 114 ++ .../tests/snapshots/mcdoc__parse_0__0.txt | 55 + .../tests/snapshots/mcdoc__parse_10__0.txt | 176 +++ .../tests/snapshots/mcdoc__parse_11__0.txt | 221 +++ .../tests/snapshots/mcdoc__parse_12__0.txt | 396 +++++ .../tests/snapshots/mcdoc__parse_13__0.txt | 82 ++ .../tests/snapshots/mcdoc__parse_14__0.txt | 146 ++ .../tests/snapshots/mcdoc__parse_15__0.txt | 47 + .../tests/snapshots/mcdoc__parse_16__0.txt | 870 +++++++++++ .../tests/snapshots/mcdoc__parse_1__0.txt | 67 + .../tests/snapshots/mcdoc__parse_2__0.txt | 98 ++ .../tests/snapshots/mcdoc__parse_3__0.txt | 124 ++ .../tests/snapshots/mcdoc__parse_4__0.txt | 474 ++++++ .../tests/snapshots/mcdoc__parse_5__0.txt | 245 ++++ .../tests/snapshots/mcdoc__parse_6__0.txt | 45 + .../tests/snapshots/mcdoc__parse_7__0.txt | 229 +++ .../tests/snapshots/mcdoc__parse_8__0.txt | 36 + .../tests/snapshots/mcdoc__parse_9__0.txt | 149 ++ packages/mecha/tests/test_mcdoc.py | 19 + 21 files changed, 4875 insertions(+) create mode 100644 packages/mecha/mecha/contrib/validation/__init__.py create mode 100644 packages/mecha/mecha/contrib/validation/mcdoc.py create mode 100644 packages/mecha/tests/resources/mcdoc_examples.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_0__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_10__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_11__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_12__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_13__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_14__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_15__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_16__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_1__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_2__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_3__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_4__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_5__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_6__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_7__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_8__0.txt create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_9__0.txt create mode 100644 packages/mecha/tests/test_mcdoc.py diff --git a/packages/mecha/mecha/contrib/validation/__init__.py b/packages/mecha/mecha/contrib/validation/__init__.py new file mode 100644 index 000000000..5e381f487 --- /dev/null +++ b/packages/mecha/mecha/contrib/validation/__init__.py @@ -0,0 +1 @@ +from .mcdoc import * diff --git a/packages/mecha/mecha/contrib/validation/mcdoc.py b/packages/mecha/mecha/contrib/validation/mcdoc.py new file mode 100644 index 000000000..999cf254b --- /dev/null +++ b/packages/mecha/mecha/contrib/validation/mcdoc.py @@ -0,0 +1,1281 @@ +__all__ = [ + "McdocNode", + "McdocChildren", + "McdocDocComment", + "McdocPrelim", + "McdocBoolean", + "McdocInteger", + "McdocFloat", + "McdocTypedNumber", + "McdocIntegerRange", + "McdocFloatRange", + "McdocString", + "McdocResourceLocation", + "McdocIdentifier", + "McdocPath", + "McdocType", + "McDocUnattributedType", + "McdocTypeModifier", + "McdocAnyType", + "McdocBooleanType", + "McdocStringType", + "McdocNumericType", + "McdocPrimitiveArrayType", + "McdocListType", + "McdocTupleType", + "McdocEnum", + "McdocEnumField", + "McdocEnumValue", + "McdocStruct", + "McdocStructField", + "McdocStructKey", + "McdocDynamicKey", + "McdocSpread", + "McdocReferenceType", + "McdocDispatcherType", + "McdocUnionType", + "McdocIndexBody", + "McdocIndex", + "McdocStaticIndex", + "McdocFallbackIndexKey", + "McdocNoneIndexKey", + "McdocUnknownIndexKey", + "McdocDynamicIndex", + "McdocAccessor", + "McdocKeyIndexKey", + "McdocParentIndexKey", + "McdocTypeArgBlock", + "Mcdoc", + "McdocItem", + "McdocTypeAlias", + "McdocUseStatement", + "McdocDispatchStatement", + "McdocAttribute", + "McdocAttributeValue", + "McdocAttributeTree", + "McdocAttributeTreeNamedValue", + "McdocAttributeTreeName", + "parse_mcdoc", +] + +from contextlib import contextmanager +from dataclasses import dataclass, replace +from typing import ( + Callable, + Iterator, + List, + Literal, + Optional, + Set, + TypeAlias, + TypeVar, + Union, +) + +from beet.core.utils import required_field +from tokenstream import InvalidSyntax, TokenPattern, TokenStream, set_location + +from mecha import AbstractChildren, AbstractNode +from mecha.utils import QuoteHelper + +McdocNodeType = TypeVar("McdocNodeType", bound="McdocNode", covariant=True) + +PATTERN_INTEGER: str = r"0|[-+]?[1-9][0-9]*" +PATTERN_FLOAT: str = r"[-+]?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][-+]?[0-9]+)?" +PATTERN_TYPED_NUMBER: str = rf"{PATTERN_FLOAT}[bBdDfFlLsS]?" +PATTERN_RANGE_DELIMITER: str = r" Iterator["McdocNode"]: + return super().__iter__() # type: ignore + + def walk(self) -> Iterator["McdocNode"]: + return super().walk() # type: ignore + + +class McdocChildren(AbstractChildren[McdocNodeType]): + """Specialized tuple subclass for holding multiple child mcdoc nodes.""" + + +@dataclass(frozen=True, slots=True) +class McdocDocComment(McdocNode): + """Mcdoc doc comment node.""" + + text: str = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocPrelim(McdocNode): + """Mcdoc prelim node.""" + + doc_comments: McdocChildren[McdocDocComment] = required_field() + attributes: McdocChildren["McdocAttribute"] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocBoolean(McdocNode): + """Mcdoc boolean node.""" + + value: bool = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocInteger(McdocNode): + """Mcdoc integer node.""" + + value: int = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocFloat(McdocNode): + """Mcdoc float node.""" + + value: float = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocTypedNumber(McdocNode): + """Mcdoc typed number node.""" + + value: Union[int, float] = required_field() + type: Literal["byte", "short", "int", "long", "float", "double"] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocIntegerRange(McdocNode): + """Mcdoc integer range node.""" + + left: Optional[int] = required_field() + delimiter: Literal["..", "..<", "<..", "<..<"] = required_field() + right: Optional[int] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocFloatRange(McdocNode): + """Mcdoc float range node.""" + + left: Optional[float] = required_field() + delimiter: Literal["..", "..<", "<..", "<..<"] = required_field() + right: Optional[float] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocString(McdocNode): + """Mcdoc string node.""" + + value: str = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocResourceLocation(McdocNode): + """Mcdoc resource location node.""" + + value: str = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocIdentifier(McdocNode): + """Mcdoc identifier node.""" + + name: str = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocPath(McdocNode): + """Mcdoc path node.""" + + absolute: bool = required_field() + segments: McdocChildren[McdocIdentifier] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocType(McdocNode): + """Mcdoc type node.""" + + attributes: McdocChildren["McdocAttribute"] = required_field() + unattributed_type: "McDocUnattributedType" = required_field() + modifiers: McdocChildren["McdocTypeModifier"] = required_field() + + +McDocUnattributedType: TypeAlias = Union[ + "McdocAnyType", + "McdocBooleanType", + "McdocStringType", + McdocBoolean, + McdocString, + McdocTypedNumber, + "McdocNumericType", + "McdocPrimitiveArrayType", + "McdocListType", + "McdocTupleType", + "McdocEnum", + "McdocStruct", + "McdocReferenceType", + "McdocDispatcherType", + "McdocUnionType", +] + +McdocTypeModifier: TypeAlias = Union["McdocIndexBody", "McdocTypeArgBlock"] + + +@dataclass(frozen=True, slots=True) +class McdocAnyType(McdocNode): + """Mcdoc any type node.""" + + +@dataclass(frozen=True, slots=True) +class McdocBooleanType(McdocNode): + """Mcdoc boolean type node.""" + + +@dataclass(frozen=True, slots=True) +class McdocStringType(McdocNode): + """Mcdoc string type node.""" + + length: Optional[McdocIntegerRange] = None + + +@dataclass(frozen=True, slots=True) +class McdocNumericType(McdocNode): + """Mcdoc numeric type node.""" + + name: Literal["byte", "short", "int", "long", "float", "double"] = required_field() + constraint: Optional[McdocIntegerRange] = None + + +@dataclass(frozen=True, slots=True) +class McdocPrimitiveArrayType(McdocNode): + """Mcdoc primitive array type node.""" + + name: Literal["byte", "int", "long"] = required_field() + constraint: Optional[McdocIntegerRange] = None + length: Optional[McdocIntegerRange] = None + + +@dataclass(frozen=True, slots=True) +class McdocListType(McdocNode): + """Mcdoc list type node.""" + + element: McdocType = required_field() + length: Optional[McdocIntegerRange] = None + + +@dataclass(frozen=True, slots=True) +class McdocTupleType(McdocNode): + """Mcdoc tuple type node.""" + + elements: McdocChildren[McdocType] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocEnum(McdocNode): + """Mcdoc enum node.""" + + prelim: McdocPrelim = required_field() + type: Literal[ + "byte", + "short", + "int", + "long", + "string", + "float", + "double", + ] = required_field() + identifier: Optional[McdocIdentifier] = required_field() + fields: McdocChildren["McdocEnumField"] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocEnumField(McdocNode): + """Mcdoc enum field node.""" + + prelim: McdocPrelim = required_field() + identifier: McdocIdentifier = required_field() + value: "McdocEnumValue" = required_field() + + +McdocEnumValue: TypeAlias = Union[McdocTypedNumber, McdocString] + + +@dataclass(frozen=True, slots=True) +class McdocStruct(McdocNode): + """Mcdoc struct node.""" + + prelim: McdocPrelim = required_field() + identifier: Optional[McdocIdentifier] = required_field() + fields: McdocChildren[Union["McdocStructField", "McdocSpread"]] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocStructField(McdocNode): + """Mcdoc struct field node.""" + + prelim: McdocPrelim = required_field() + key: "McdocStructKey" = required_field() + optional: bool = required_field() + type: McdocType = required_field() + + +McdocStructKey: TypeAlias = Union[McdocString, McdocIdentifier, "McdocDynamicKey"] + + +@dataclass(frozen=True, slots=True) +class McdocDynamicKey(McdocNode): + """Mcdoc dynamic key node.""" + + type: McdocType = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocSpread(McdocNode): + """Mcdoc spread node.""" + + attributes: McdocChildren["McdocAttribute"] = required_field() + type: McdocType = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocReferenceType(McdocNode): + """Mcdoc reference type node.""" + + path: McdocPath = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocDispatcherType(McdocNode): + """Mcdoc dispatcher type node.""" + + resource_location: McdocResourceLocation = required_field() + indices: McdocChildren["McdocIndex"] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocUnionType(McdocNode): + """Mcdoc union type node.""" + + types: McdocChildren[McdocType] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocIndexBody(McdocNode): + """Mcdoc index body node.""" + + indices: McdocChildren["McdocIndex"] = required_field() + + +McdocIndex: TypeAlias = Union[ + "McdocStaticIndex", + "McdocDynamicIndex", +] + +McdocStaticIndex: TypeAlias = Union[ + "McdocFallbackIndexKey", + "McdocNoneIndexKey", + "McdocUnknownIndexKey", + McdocIdentifier, + McdocString, + McdocResourceLocation, +] + + +@dataclass(frozen=True, slots=True) +class McdocFallbackIndexKey(McdocNode): + """Mcdoc %fallback index key node.""" + + +@dataclass(frozen=True, slots=True) +class McdocNoneIndexKey(McdocNode): + """Mcdoc %none index key node.""" + + +@dataclass(frozen=True, slots=True) +class McdocUnknownIndexKey(McdocNode): + """Mcdoc %unknown index key node.""" + + +@dataclass(frozen=True, slots=True) +class McdocDynamicIndex(McdocNode): + """Mcdoc dynamic index node.""" + + accessors: McdocChildren["McdocAccessor"] = required_field() + + +McdocAccessor: TypeAlias = Union[ + "McdocKeyIndexKey", + "McdocParentIndexKey", + McdocIdentifier, + McdocString, +] + + +@dataclass(frozen=True, slots=True) +class McdocKeyIndexKey(McdocNode): + """Mcdoc %key index key node.""" + + +@dataclass(frozen=True, slots=True) +class McdocParentIndexKey(McdocNode): + """Mcdoc %parent index key node.""" + + +@dataclass(frozen=True, slots=True) +class McdocTypeArgBlock(McdocNode): + """Mcdoc type arg block node.""" + + arguments: McdocChildren[McdocType] = required_field() + + +@dataclass(frozen=True, slots=True) +class Mcdoc(McdocNode): + """Mcdoc node.""" + + items: McdocChildren["McdocItem"] = required_field() + + +McdocItem: TypeAlias = Union[ + McdocStruct, + McdocEnum, + "McdocTypeAlias", + "McdocUseStatement", + "McdocDispatchStatement", +] + + +@dataclass(frozen=True, slots=True) +class McdocTypeAlias(McdocNode): + """Mcdoc type alias node.""" + + prelim: McdocPrelim = required_field() + identifier: McdocIdentifier = required_field() + parameters: McdocChildren[McdocIdentifier] = required_field() + type: McdocType = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocUseStatement(McdocNode): + """Mcdoc use statement node.""" + + path: McdocPath = required_field() + alias: Optional[McdocIdentifier] = None + + +@dataclass(frozen=True, slots=True) +class McdocDispatchStatement(McdocNode): + """Mcdoc dispatch statement node.""" + + attributes: McdocChildren["McdocAttribute"] = required_field() + resource_location: McdocResourceLocation = required_field() + indices: McdocChildren["McdocStaticIndex"] = required_field() + parameters: McdocChildren[McdocIdentifier] = required_field() + type: McdocType = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocAttribute(McdocNode): + """Mcdoc attribute node.""" + + identifier: McdocIdentifier = required_field() + value: Optional["McdocAttributeValue"] = None + + +McdocAttributeValue: TypeAlias = Union[McdocType, "McdocAttributeTree"] + + +@dataclass(frozen=True, slots=True) +class McdocAttributeTree(McdocNode): + """Mcdoc attribute tree node.""" + + flavor: Literal["brace", "bracket", "curly"] = required_field() + positional_values: McdocChildren[McdocAttributeValue] = required_field() + named_values: McdocChildren["McdocAttributeTreeNamedValue"] = required_field() + + +@dataclass(frozen=True, slots=True) +class McdocAttributeTreeNamedValue(McdocNode): + """Mcdoc attribute tree named value node.""" + + name: "McdocAttributeTreeName" = required_field() + value: McdocAttributeValue = required_field() + + +McdocAttributeTreeName: TypeAlias = Union[McdocIdentifier, McdocString] + + +@contextmanager +def ignore_comments(stream: TokenStream): + with stream.syntax(comment=r"//(?!/)[^\n]*\n?"), stream.ignore("comment"): + yield + + +def parse_prelim(stream: TokenStream) -> McdocPrelim: + with stream.syntax(doc_comment=r"///[^\n]*\n?"): + with stream.intercept("comment"): + while stream.get("comment"): + pass + + start = stream.peek() + doc_comments: List[McdocDocComment] = [] + + for token in stream.collect("doc_comment"): + node = McdocDocComment(text=token.value) + doc_comments.append(set_location(node, token)) + + attributes = parse_attributes(stream) + + node = McdocPrelim( + doc_comments=McdocChildren(doc_comments), + attributes=attributes, + ) + return set_location( + node, + start, + stream.current if doc_comments or attributes else start, + ) + + +def parse_integer(stream: TokenStream) -> McdocInteger: + with stream.syntax(integer=PATTERN_INTEGER): + token = stream.expect("integer") + node = McdocInteger(value=int(token.value)) + return set_location(node, token) + + +def parse_float(stream: TokenStream) -> McdocFloat: + with stream.syntax(float=PATTERN_FLOAT): + token = stream.expect("float") + node = McdocFloat(value=float(token.value)) + return set_location(node, token) + + +def parse_typed_number(stream: TokenStream) -> McdocTypedNumber: + with stream.syntax(typed_number=PATTERN_TYPED_NUMBER): + token = stream.expect("typed_number") + normalized = token.value.lower() + + if normalized.endswith(("b", "s", "l")): + if "." in normalized: + value = int(float(normalized[:-1])) + else: + value = int(normalized[:-1]) + suffix = normalized[-1] + type = "byte" if suffix == "b" else "short" if suffix == "s" else "long" + elif normalized.endswith(("f", "d")): + value = float(normalized[:-1]) + suffix = normalized[-1] + type = "float" if suffix == "f" else "double" + elif "." in normalized: + value = float(normalized) + type = "double" + else: + value = int(normalized) + type = "int" + + node = McdocTypedNumber(value=value, type=type) + return set_location(node, token) + + +def parse_integer_range(stream: TokenStream) -> McdocIntegerRange: + with stream.syntax(integer_range=PATTERN_INTEGER_RANGE): + token = stream.expect("integer_range") + before, delimiter, after = token.value.partition("..") + + if delimiter: + left = int(before.removesuffix("<")) if before else None + right = int(after.removeprefix("<")) if after else None + else: + left = int(before) + delimiter = ".." + right = left + + node = McdocIntegerRange(left=left, delimiter=delimiter, right=right) # type: ignore + return set_location(node, token) + + +def parse_float_range(stream: TokenStream) -> McdocFloatRange: + with stream.syntax(float_range=PATTERN_FLOAT_RANGE): + token = stream.expect("float_range") + before, delimiter, after = token.value.partition("..") + + if delimiter: + left = float(before.removesuffix("<")) if before else None + right = float(after.removeprefix("<")) if after else None + else: + left = float(before) + delimiter = ".." + right = left + + node = McdocFloatRange(left=left, delimiter=delimiter, right=right) # type: ignore + return set_location(node, token) + + +def parse_string(stream: TokenStream) -> McdocString: + with stream.syntax(string=PATTERN_STRING): + token = stream.expect("string") + value = MCDOC_QUOTE_HELPER.unquote_string(token) + node = McdocString(value=value) + return set_location(node, token) + + +def parse_resource_location(stream: TokenStream) -> McdocResourceLocation: + with stream.syntax(resource_location=PATTERN_RESOURCE_LOCATION): + token = stream.expect("resource_location") + node = McdocResourceLocation(value=token.value) + return set_location(node, token) + + +def parse_identifier(stream: TokenStream) -> McdocIdentifier: + with stream.syntax(identifier=PATTERN_IDENTIFIER): + token = stream.expect("identifier") + name = token.value + + if name in RESERVED_WORDS: + exc = InvalidSyntax(f'Can\'t use reserved word "{name}" as an identifier.') + raise set_location(exc, token) + + node = McdocIdentifier(name=name) + return set_location(node, token) + + +def parse_path(stream: TokenStream) -> McdocPath: + with stream.syntax(delimiter=r"::"): + token = stream.get("delimiter") + + absolute = bool(token) + segments: List[McdocIdentifier] = [parse_identifier(stream)] + + while stream.get("delimiter"): + segments.append(parse_identifier(stream)) + + node = McdocPath(absolute=absolute, segments=McdocChildren(segments)) + return set_location(node, token or segments[0], segments[-1]) + + +def parse_type(stream: TokenStream) -> McdocType: + with stream.syntax(bracket=r"\[|\]", angle=r"<|>"): + attributes = parse_attributes(stream) + + unattributed_type: McDocUnattributedType = parse_unattributed_type(stream) + modifiers: List[McdocTypeModifier] = [] + + for open_bracket, open_angle in stream.collect( + ("bracket", "["), + ("angle", "<"), + ): + if open_bracket: + indices: List[McdocIndex] = [] + close_bracket = expect_sequence( + stream, + indices, + lambda s: choose_alternative( + s, parse_dynamic_index, parse_static_index + ), + until=("bracket", "]"), + ) + if not indices: + exc = InvalidSyntax("Expected at least one index.") + raise set_location(exc, open_bracket, close_bracket) + node = McdocIndexBody(indices=McdocChildren(indices)) + modifiers.append(set_location(node, open_bracket, close_bracket)) + + elif open_angle: + arguments: List[McdocType] = [] + close_angle = expect_sequence( + stream, + arguments, + parse_type, + until=("angle", ">"), + ) + node = McdocTypeArgBlock(arguments=McdocChildren(arguments)) + modifiers.append(set_location(node, open_angle, close_angle)) + + node = McdocType( + attributes=attributes, + unattributed_type=unattributed_type, + modifiers=McdocChildren(modifiers), + ) + return set_location( + node, + attributes[0] if attributes else unattributed_type, + modifiers[-1] if modifiers else unattributed_type, + ) + + +def parse_unattributed_type(stream: TokenStream) -> McDocUnattributedType: + with stream.syntax( + any=r"any\b", + boolean=r"boolean\b", + string=r"string\b", + constraint=r"@", + true=r"true\b", + false=r"false\b", + byte=r"byte\b", + short=r"short\b", + int=r"int\b", + long=r"long\b", + float=r"float\b", + double=r"double\b", + array=r"\[\]", + bracket=r"\[|\]", + comma=r",", + ): + token = stream.get( + "any", + "boolean", + "string", + "true", + "false", + "byte", + "short", + "int", + "long", + "float", + "double", + ("bracket", "["), + ) + + if not token: + return choose_alternative( + stream, + parse_string, + parse_typed_number, + parse_enum, + parse_struct, + parse_dispatcher_type, + parse_reference_type, + parse_union_type, + ) + + if token.match("any"): + return set_location(McdocAnyType(), token) + elif token.match("boolean"): + return set_location(McdocBooleanType(), token) + elif token.match("string"): + length = parse_integer_range(stream) if stream.get("constraint") else None + node = McdocStringType(length=length) + return set_location(node, token, node.length) + elif token.match("true"): + return set_location(McdocBoolean(value=True), token) + elif token.match("false"): + return set_location(McdocBoolean(value=False), token) + + if token.type in ("byte", "short", "int", "long", "float", "double"): + node = set_location(McdocNumericType(name=token.type), token) + + if stream.get("constraint"): + node = replace(node, constraint=parse_integer_range(stream)) + node = set_location(node, node, node.constraint) + + if node.name in ("byte", "int", "long"): + if array := stream.get("array"): + length = ( + parse_integer_range(stream) + if stream.get("constraint") + else None + ) + node = McdocPrimitiveArrayType( + name=node.name, + constraint=node.constraint, + length=length, + ) + node = set_location(node, node.name, length or array) + + return node + + element = parse_type(stream) + + if close_bracket := stream.get(("bracket", "]")): + length = None + if stream.get("constraint"): + length = parse_integer_range(stream) + if length == McdocIntegerRange(left=1, delimiter="..", right=1): + node = McdocTupleType(elements=McdocChildren([element])) + else: + node = McdocListType(element=element, length=length) + return set_location(node, token, length or close_bracket) + + stream.expect("comma") + + elements = [element] + close_bracket = expect_sequence( + stream, + elements, + parse_type, + until=("bracket", "]"), + ) + node = McdocTupleType(elements=McdocChildren(elements)) + return set_location(node, token, close_bracket) + + +def parse_enum(stream: TokenStream) -> McdocEnum: + with stream.syntax( + enum=r"enum\b", + brace=r"\(|\)", + byte=r"byte\b", + short=r"short\b", + int=r"int\b", + long=r"long\b", + string=r"string\b", + float=r"float\b", + double=r"double\b", + curly=r"\{|\}", + ): + prelim = parse_prelim(stream) + + stream.expect("enum") + stream.expect(("brace", "(")) + type = stream.expect_any( + "byte", + "short", + "int", + "long", + "string", + "float", + "double", + ) + stream.expect(("brace", ")")) + + identifier = None + with stream.alternative(): + identifier = parse_identifier(stream) + + fields: List[McdocEnumField] = [] + stream.expect(("curly", "{")) + close_curly = expect_sequence( + stream, + fields, + parse_enum_field, + until=("curly", "}"), + ) + + node = McdocEnum( + prelim=prelim, + type=type.value, # type: ignore + identifier=identifier, + fields=McdocChildren(fields), + ) + return set_location(node, prelim, close_curly) + + +def parse_enum_field(stream: TokenStream) -> McdocEnumField: + with stream.syntax(equal=r"="): + prelim = parse_prelim(stream) + + identifier = parse_identifier(stream) + stream.expect("equal") + value = choose_alternative(stream, parse_string, parse_typed_number) + + node = McdocEnumField(prelim=prelim, identifier=identifier, value=value) + return set_location(node, prelim, value) + + +def parse_struct(stream: TokenStream) -> McdocStruct: + with stream.syntax(struct=r"struct\b", curly=r"\{|\}"): + prelim = parse_prelim(stream) + + stream.expect("struct") + + identifier = None + with stream.alternative(): + identifier = parse_identifier(stream) + + fields: List[Union[McdocStructField, McdocSpread]] = [] + stream.expect(("curly", "{")) + close_curly = expect_sequence( + stream, + fields, + lambda s: choose_alternative(s, parse_struct_field, parse_spread), + until=("curly", "}"), + ) + + node = McdocStruct( + prelim=prelim, + identifier=identifier, + fields=McdocChildren(fields), + ) + return set_location(node, prelim, close_curly) + + +def parse_struct_field(stream: TokenStream) -> McdocStructField: + with stream.syntax(optional=r"\?", colon=r":", bracket=r"\[|\]"): + prelim = parse_prelim(stream) + + if open_bracket := stream.get(("bracket", "[")): + type = parse_type(stream) + close_bracket = stream.expect(("bracket", "]")) + key = McdocDynamicKey(type=type) + key = set_location(key, open_bracket, close_bracket) + else: + key = choose_alternative(stream, parse_string, parse_identifier) + + optional = bool(stream.get("optional")) + stream.expect("colon") + + type = parse_type(stream) + + node = McdocStructField(prelim=prelim, key=key, optional=optional, type=type) + return set_location(node, prelim, type) + + +def parse_spread(stream: TokenStream) -> McdocSpread: + with stream.syntax(spread=r"\.\.\."): + attributes = parse_attributes(stream) + token = stream.expect("spread") + type = parse_type(stream) + node = McdocSpread(attributes=attributes, type=type) + return set_location(node, attributes[0] if attributes else token, type) + + +def parse_reference_type(stream: TokenStream) -> McdocReferenceType: + path = parse_path(stream) + node = McdocReferenceType(path=path) + return set_location(node, path) + + +def parse_dispatcher_type(stream: TokenStream) -> McdocDispatcherType: + with stream.syntax(bracket=r"\[|\]"): + resource_location = parse_resource_location(stream) + + open_bracket = stream.expect(("bracket", "[")) + indices: List[McdocIndex] = [] + close_bracket = expect_sequence( + stream, + indices, + lambda s: choose_alternative(s, parse_dynamic_index, parse_static_index), + until=("bracket", "]"), + ) + + if not indices: + exc = InvalidSyntax("Expected at least one index.") + raise set_location(exc, open_bracket, close_bracket) + + node = McdocDispatcherType( + resource_location=resource_location, + indices=McdocChildren(indices), + ) + return set_location(node, resource_location, close_bracket) + + +def parse_union_type(stream: TokenStream) -> McdocUnionType: + with stream.syntax(brace=r"\(|\)", pipe=r"\|"): + open_brace = stream.expect(("brace", "(")) + types: List[McdocType] = [] + close_brace = expect_sequence( + stream, + types, + parse_type, + until=("brace", ")"), + separator=r"\|", + ) + node = McdocUnionType(types=McdocChildren(types)) + return set_location(node, open_brace, close_brace) + + +def parse_static_index(stream: TokenStream) -> McdocStaticIndex: + with stream.syntax(fallback=r"%fallback\b", none=r"%none\b", unknown=r"%unknown\b"): + with stream.alternative(): + fallback, none, unknown = stream.expect("fallback", "none", "unknown") + if fallback: + return set_location(McdocFallbackIndexKey(), fallback) + elif none: + return set_location(McdocNoneIndexKey(), none) + elif unknown: + return set_location(McdocUnknownIndexKey(), unknown) + + return choose_alternative( + stream, + parse_string, + parse_resource_location, + parse_identifier, + ) + + +def parse_dynamic_index(stream: TokenStream) -> McdocDynamicIndex: + with stream.syntax(bracket=r"\[|\]", dot=r"\."): + open_bracket = stream.expect(("bracket", "[")) + + accessors: List[McdocAccessor] = [parse_accessor(stream)] + for _ in stream.collect("dot"): + accessors.append(parse_accessor(stream)) + + close_bracket = stream.expect(("bracket", "]")) + + node = McdocDynamicIndex(accessors=McdocChildren(accessors)) + return set_location(node, open_bracket, close_bracket) + + +def parse_accessor(stream: TokenStream) -> McdocAccessor: + with stream.syntax(key=r"%key\b", parent=r"%parent\b"): + with stream.alternative(): + key, parent = stream.expect("key", "parent") + if key: + return set_location(McdocKeyIndexKey(), key) + elif parent: + return set_location(McdocParentIndexKey(), parent) + + return choose_alternative( + stream, + parse_string, + parse_identifier, + ) + + +def parse_mcdoc(stream: TokenStream) -> Mcdoc: + with ignore_comments(stream): + items: List[McdocItem] = [] + + while stream.peek(): + item = choose_alternative( + stream, + parse_struct, + parse_enum, + parse_type_alias, + parse_use_statement, + parse_dispatch_statement, + ) + items.append(item) + + node = Mcdoc(items=McdocChildren(items)) + return set_location( + node, + items[0] if items else stream.current, + items[-1] if items else stream.current, + ) + + +def parse_type_alias(stream: TokenStream) -> McdocTypeAlias: + with stream.syntax(type=r"type\b", angle=r"<|>", equal=r"="): + prelim = parse_prelim(stream) + + stream.expect("type") + identifier = parse_identifier(stream) + + parameters: List[McdocIdentifier] = [] + if stream.get(("angle", "<")): + expect_sequence( + stream, + parameters, + parse_identifier, + until=("angle", ">"), + ) + + stream.expect("equal") + + type = parse_type(stream) + + node = McdocTypeAlias( + prelim=prelim, + identifier=identifier, + parameters=McdocChildren(parameters), + type=type, + ) + return set_location(node, prelim, type) + + +def parse_use_statement(stream: TokenStream) -> McdocUseStatement: + with stream.syntax(use=r"use\b", as_=r"as\b"): + token = stream.expect("use") + path = parse_path(stream) + + alias = None + if stream.get("as_"): + alias = parse_identifier(stream) + + node = McdocUseStatement(path=path, alias=alias) + return set_location(node, token, alias or path) + + +def parse_dispatch_statement(stream: TokenStream) -> McdocDispatchStatement: + with stream.syntax( + dispatch=r"dispatch\b", + bracket=r"\[|\]", + angle=r"<|>", + to=r"to\b", + ): + attributes = parse_attributes(stream) + + token = stream.expect("dispatch") + + resource_location = parse_resource_location(stream) + + open_bracket = stream.expect(("bracket", "[")) + indices: List[McdocStaticIndex] = [] + close_bracket = expect_sequence( + stream, + indices, + parse_static_index, + until=("bracket", "]"), + ) + + if not indices: + exc = InvalidSyntax("Expected at least one index.") + raise set_location(exc, open_bracket, close_bracket) + + parameters: List[McdocIdentifier] = [] + if stream.get(("angle", "<")): + expect_sequence( + stream, + parameters, + parse_identifier, + until=("angle", ">"), + ) + + stream.expect("to") + + type = parse_type(stream) + + node = McdocDispatchStatement( + attributes=attributes, + resource_location=resource_location, + indices=McdocChildren(indices), + parameters=McdocChildren(parameters), + type=type, + ) + return set_location(node, attributes[0] if attributes else token, type) + + +def parse_attributes(stream: TokenStream) -> McdocChildren[McdocAttribute]: + with stream.syntax(attribute=r"#\[|\]", equal=r"="): + attributes: List[McdocAttribute] = [] + + for open_attribute in stream.collect(("attribute", "#[")): + identifier = parse_identifier(stream) + + if close_attribute := stream.get(("attribute", "]")): + value = None + else: + if stream.get("equal"): + value = choose_alternative(stream, parse_type, parse_attribute_tree) + else: + value = parse_attribute_tree(stream) + close_attribute = stream.expect(("attribute", "]")) + + node = McdocAttribute(identifier=identifier, value=value) + attributes.append(set_location(node, open_attribute, close_attribute)) + + return McdocChildren(attributes) + + +def parse_attribute_tree(stream: TokenStream) -> McdocAttributeTree: + with stream.syntax(brace=r"\(|\)", bracket=r"\[|\]", curly=r"\{|\}", comma=r","): + open_tree = stream.expect_any( + ("brace", "("), + ("bracket", "["), + ("curly", "{"), + ) + + close_pattern = ( + ("brace", ")") + if open_tree.match("brace") + else ("bracket", "]") + if open_tree.match("bracket") + else ("curly", "}") + ) + + positional_values: List[McdocAttributeValue] = [] + named_values: List[McdocAttributeTreeNamedValue] = [] + + for _ in stream.peek_until(close_pattern): + value = choose_alternative( + stream, + parse_attribute_tree, + parse_attribute_tree_named_value, + parse_type, + ) + + if isinstance(value, McdocAttributeTreeNamedValue): + named_values.append(value) + elif not named_values: + positional_values.append(value) + else: + exc = InvalidSyntax("Invalid positional value after named value.") + raise set_location(exc, value) + + if not stream.get("comma"): + stream.expect(close_pattern) + break + + node = McdocAttributeTree( + flavor=close_pattern[0], + positional_values=McdocChildren(positional_values), + named_values=McdocChildren(named_values), + ) + return set_location(node, open_tree, stream.current) + + +def parse_attribute_tree_named_value( + stream: TokenStream, +) -> McdocAttributeTreeNamedValue: + with stream.syntax(equal=r"="): + name = choose_alternative(stream, parse_string, parse_identifier) + + if stream.get("equal"): + value = choose_alternative(stream, parse_type, parse_attribute_tree) + else: + value = parse_attribute_tree(stream) + + node = McdocAttributeTreeNamedValue(name=name, value=value) + return set_location(node, name, value) + + +def expect_sequence( + stream: TokenStream, + nodes: List[McdocNodeType], + parser: Callable[[TokenStream], McdocNodeType], + until: TokenPattern, + separator: str = r",", +): + with stream.syntax(separator=separator): + for _ in stream.peek_until(until): + nodes.append(parser(stream)) + if not stream.get("separator"): + stream.expect(until) + break + return stream.current + + +def choose_alternative( + stream: TokenStream, + *args: Callable[[TokenStream], McdocNodeType], +) -> McdocNodeType: + for parser, alternative in stream.choose(*args): + with alternative: + return parser(stream) + raise ValueError("Unreachable!") diff --git a/packages/mecha/tests/resources/mcdoc_examples.txt b/packages/mecha/tests/resources/mcdoc_examples.txt new file mode 100644 index 000000000..fc3f64dce --- /dev/null +++ b/packages/mecha/tests/resources/mcdoc_examples.txt @@ -0,0 +1,114 @@ +// This is a comment. +struct Foo { + Bar: boolean, // This is another one. +} +### +/// This doc comment describes the struct Foo. +/// External tools, like VS Code, may show this block of text when the user hovers over the name "Foo". +struct Foo { + /// This is another doc comment describing the field "Bar". + Bar: boolean, // This is just a regular comment because it only starts with two slashes. +} +### +struct Tag { + replace?: boolean, + values: [string], +} +### +struct Player { + ...Mob, // Reuse fields from the Mob struct here. + abilities: Abilities, + CustomName: (), // Overrides CustomName from the Mob struct to an empty union. +} +### +type Tag = struct { + replace?: boolean, + values: [V], +} + +type BlockTag = Tag<#[id=block] string> +type EntityTypeTag = Tag<#[id=entity_type] string> +type FunctionTag = Tag<#[id=function] string> +type ItemTag = Tag<#[id=item] string> +### +struct Foo { + id: string, + cow_data: minecraft:entity[cow], + dynamic_entity_data: minecraft:entity[[id]], + command: minecraft:block[command_block][Command], + dynamic_memories: minecraft:entity[[id]][Brain][memories], +} +### +type AnyEntity = minecraft:entity[%fallback] +### +struct RandomIntGenerator { + type?: ("uniform" | "binomial" | "constant"), + ...minecraft:random_int_generator[[type]], +} + +dispatch minecraft:random_int_generator[uniform, %none] to struct { min?: int, max?: int } +### +dispatch minecraft:block[%unknown] to () +### +struct DebugStick { + DebugProperty: struct { + [#[id=block] string]: mcdoc:block_state_name[[%key]], // Get the type of the block state names of the block stored in the key. + }, +} +### +struct Item { + id: #[id=item] string, + tag: struct ItemTag { + BlockStateTag: mcdoc:block_item_states[[%parent.id]] + }, +} +### +type Integer = (byte | short | int | long) +type Float = (float | double) +type Number = (Integer | Float) +### +type NumericRange = ( + T | + [T, T] | + struct { min: T, max: T } +) + +type FloatRange = NumericRange +type IntegerRange = NumericRange +type NaturalRange = NumericRange +### +struct T {} + +type List = [T] +### +type List = [T] + +type Struct = struct { value: T } +### +use demo::foo +use demo::bar as thing +### +struct Foo { + #[id=item] + id1: string, + id2: #[id=item] string, + // id1 and id2 will likely both be supported and have equivalent effects. + + blockStateValue1: ( + #[serializable] string | + byte | short | int | long | float | double + ), + #[serialize_to=string] + blockStateValue2: (string | byte | short | int | long | float | double), + + evilUUID1: ( + #[until("1.16", uuid_string_to_compound)] #[parser=uuid] string | + #[until("1.17", uuid_compound_to_array)] MostLeastCompound | + int[] @ 4 + ), + #[history{ + (#[parser=uuid] string, until="1.16", updater=uuid_string_to_compound), + (MostLeastCompound, until="1.17", updater=uuid_compound_to_array), + }] + evilUUID2: int[] @ 4 +} diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_0__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_0__0.txt new file mode 100644 index 000000000..105a47421 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_0__0.txt @@ -0,0 +1,55 @@ +// This is a comment. +struct Foo { + Bar: boolean, // This is another one. +} +--- + + location: SourceLocation(pos=22, lineno=2, colno=1) + end_location: SourceLocation(pos=75, lineno=4, colno=2) + items: + + location: SourceLocation(pos=22, lineno=2, colno=1) + end_location: SourceLocation(pos=75, lineno=4, colno=2) + prelim: + + location: SourceLocation(pos=22, lineno=2, colno=1) + end_location: SourceLocation(pos=28, lineno=2, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=29, lineno=2, colno=8) + end_location: SourceLocation(pos=32, lineno=2, colno=11) + name: 'Foo' + fields: + + location: SourceLocation(pos=36, lineno=3, colno=2) + end_location: SourceLocation(pos=48, lineno=3, colno=14) + prelim: + + location: SourceLocation(pos=36, lineno=3, colno=2) + end_location: SourceLocation(pos=73, lineno=3, colno=39) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=36, lineno=3, colno=2) + end_location: SourceLocation(pos=39, lineno=3, colno=5) + name: 'Bar' + optional: False + type: + + location: SourceLocation(pos=41, lineno=3, colno=7) + end_location: SourceLocation(pos=48, lineno=3, colno=14) + attributes: + + unattributed_type: + + location: SourceLocation(pos=41, lineno=3, colno=7) + end_location: SourceLocation(pos=48, lineno=3, colno=14) + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_10__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_10__0.txt new file mode 100644 index 000000000..b6a6b477c --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_10__0.txt @@ -0,0 +1,176 @@ +struct Item { + id: #[id=item] string, + tag: struct ItemTag { + BlockStateTag: mcdoc:block_item_states[[%parent.id]] + }, +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=121, lineno=6, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=121, lineno=6, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + name: 'Item' + fields: + + location: SourceLocation(pos=15, lineno=2, colno=2) + end_location: SourceLocation(pos=36, lineno=2, colno=23) + prelim: + + location: SourceLocation(pos=15, lineno=2, colno=2) + end_location: SourceLocation(pos=37, lineno=2, colno=24) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=15, lineno=2, colno=2) + end_location: SourceLocation(pos=17, lineno=2, colno=4) + name: 'id' + optional: False + type: + + location: SourceLocation(pos=19, lineno=2, colno=6) + end_location: SourceLocation(pos=36, lineno=2, colno=23) + attributes: + + location: SourceLocation(pos=19, lineno=2, colno=6) + end_location: SourceLocation(pos=29, lineno=2, colno=16) + identifier: + + location: SourceLocation(pos=21, lineno=2, colno=8) + end_location: SourceLocation(pos=23, lineno=2, colno=10) + name: 'id' + value: + + location: SourceLocation(pos=24, lineno=2, colno=11) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + attributes: + + unattributed_type: + + location: SourceLocation(pos=24, lineno=2, colno=11) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + path: + + location: SourceLocation(pos=24, lineno=2, colno=11) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + absolute: False + segments: + + location: SourceLocation(pos=24, lineno=2, colno=11) + end_location: SourceLocation(pos=28, lineno=2, colno=15) + name: 'item' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=30, lineno=2, colno=17) + end_location: SourceLocation(pos=36, lineno=2, colno=23) + length: None + modifiers: + + + location: SourceLocation(pos=39, lineno=3, colno=2) + end_location: SourceLocation(pos=118, lineno=5, colno=3) + prelim: + + location: SourceLocation(pos=39, lineno=3, colno=2) + end_location: SourceLocation(pos=60, lineno=3, colno=23) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=39, lineno=3, colno=2) + end_location: SourceLocation(pos=42, lineno=3, colno=5) + name: 'tag' + optional: False + type: + + location: SourceLocation(pos=44, lineno=3, colno=7) + end_location: SourceLocation(pos=118, lineno=5, colno=3) + attributes: + + unattributed_type: + + location: SourceLocation(pos=44, lineno=3, colno=7) + end_location: SourceLocation(pos=118, lineno=5, colno=3) + prelim: + + location: SourceLocation(pos=44, lineno=3, colno=7) + end_location: SourceLocation(pos=50, lineno=3, colno=13) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=51, lineno=3, colno=14) + end_location: SourceLocation(pos=58, lineno=3, colno=21) + name: 'ItemTag' + fields: + + location: SourceLocation(pos=63, lineno=4, colno=3) + end_location: SourceLocation(pos=115, lineno=4, colno=55) + prelim: + + location: SourceLocation(pos=63, lineno=4, colno=3) + end_location: SourceLocation(pos=115, lineno=4, colno=55) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=63, lineno=4, colno=3) + end_location: SourceLocation(pos=76, lineno=4, colno=16) + name: 'BlockStateTag' + optional: False + type: + + location: SourceLocation(pos=78, lineno=4, colno=18) + end_location: SourceLocation(pos=115, lineno=4, colno=55) + attributes: + + unattributed_type: + + location: SourceLocation(pos=78, lineno=4, colno=18) + end_location: SourceLocation(pos=115, lineno=4, colno=55) + resource_location: + + location: SourceLocation(pos=78, lineno=4, colno=18) + end_location: SourceLocation(pos=101, lineno=4, colno=41) + value: 'mcdoc:block_item_states' + indices: + + location: SourceLocation(pos=102, lineno=4, colno=42) + end_location: SourceLocation(pos=114, lineno=4, colno=54) + accessors: + + location: SourceLocation(pos=103, lineno=4, colno=43) + end_location: SourceLocation(pos=110, lineno=4, colno=50) + + location: SourceLocation(pos=111, lineno=4, colno=51) + end_location: SourceLocation(pos=113, lineno=4, colno=53) + name: 'id' + modifiers: + + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_11__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_11__0.txt new file mode 100644 index 000000000..4a4fd1d13 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_11__0.txt @@ -0,0 +1,221 @@ +type Integer = (byte | short | int | long) +type Float = (float | double) +type Number = (Integer | Float) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=104, lineno=3, colno=32) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + name: 'Integer' + parameters: + + type: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + attributes: + + unattributed_type: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=42, lineno=1, colno=43) + types: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + attributes: + + unattributed_type: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + name: 'byte' + constraint: None + modifiers: + + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + attributes: + + unattributed_type: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=28, lineno=1, colno=29) + name: 'short' + constraint: None + modifiers: + + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + attributes: + + unattributed_type: + + location: SourceLocation(pos=31, lineno=1, colno=32) + end_location: SourceLocation(pos=34, lineno=1, colno=35) + name: 'int' + constraint: None + modifiers: + + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + attributes: + + unattributed_type: + + location: SourceLocation(pos=37, lineno=1, colno=38) + end_location: SourceLocation(pos=41, lineno=1, colno=42) + name: 'long' + constraint: None + modifiers: + + modifiers: + + + location: SourceLocation(pos=43, lineno=2, colno=1) + end_location: SourceLocation(pos=72, lineno=2, colno=30) + prelim: + + location: SourceLocation(pos=43, lineno=2, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=48, lineno=2, colno=6) + end_location: SourceLocation(pos=53, lineno=2, colno=11) + name: 'Float' + parameters: + + type: + + location: SourceLocation(pos=56, lineno=2, colno=14) + end_location: SourceLocation(pos=72, lineno=2, colno=30) + attributes: + + unattributed_type: + + location: SourceLocation(pos=56, lineno=2, colno=14) + end_location: SourceLocation(pos=72, lineno=2, colno=30) + types: + + location: SourceLocation(pos=57, lineno=2, colno=15) + end_location: SourceLocation(pos=62, lineno=2, colno=20) + attributes: + + unattributed_type: + + location: SourceLocation(pos=57, lineno=2, colno=15) + end_location: SourceLocation(pos=62, lineno=2, colno=20) + name: 'float' + constraint: None + modifiers: + + + location: SourceLocation(pos=65, lineno=2, colno=23) + end_location: SourceLocation(pos=71, lineno=2, colno=29) + attributes: + + unattributed_type: + + location: SourceLocation(pos=65, lineno=2, colno=23) + end_location: SourceLocation(pos=71, lineno=2, colno=29) + name: 'double' + constraint: None + modifiers: + + modifiers: + + + location: SourceLocation(pos=73, lineno=3, colno=1) + end_location: SourceLocation(pos=104, lineno=3, colno=32) + prelim: + + location: SourceLocation(pos=73, lineno=3, colno=1) + end_location: SourceLocation(pos=77, lineno=3, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=78, lineno=3, colno=6) + end_location: SourceLocation(pos=84, lineno=3, colno=12) + name: 'Number' + parameters: + + type: + + location: SourceLocation(pos=87, lineno=3, colno=15) + end_location: SourceLocation(pos=104, lineno=3, colno=32) + attributes: + + unattributed_type: + + location: SourceLocation(pos=87, lineno=3, colno=15) + end_location: SourceLocation(pos=104, lineno=3, colno=32) + types: + + location: SourceLocation(pos=88, lineno=3, colno=16) + end_location: SourceLocation(pos=95, lineno=3, colno=23) + attributes: + + unattributed_type: + + location: SourceLocation(pos=88, lineno=3, colno=16) + end_location: SourceLocation(pos=95, lineno=3, colno=23) + path: + + location: SourceLocation(pos=88, lineno=3, colno=16) + end_location: SourceLocation(pos=95, lineno=3, colno=23) + absolute: False + segments: + + location: SourceLocation(pos=88, lineno=3, colno=16) + end_location: SourceLocation(pos=95, lineno=3, colno=23) + name: 'Integer' + modifiers: + + + location: SourceLocation(pos=98, lineno=3, colno=26) + end_location: SourceLocation(pos=103, lineno=3, colno=31) + attributes: + + unattributed_type: + + location: SourceLocation(pos=98, lineno=3, colno=26) + end_location: SourceLocation(pos=103, lineno=3, colno=31) + path: + + location: SourceLocation(pos=98, lineno=3, colno=26) + end_location: SourceLocation(pos=103, lineno=3, colno=31) + absolute: False + segments: + + location: SourceLocation(pos=98, lineno=3, colno=26) + end_location: SourceLocation(pos=103, lineno=3, colno=31) + name: 'Float' + modifiers: + + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_12__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_12__0.txt new file mode 100644 index 000000000..b06c3dec1 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_12__0.txt @@ -0,0 +1,396 @@ +type NumericRange = ( + T | + [T, T] | + struct { min: T, max: T } +) + +type FloatRange = NumericRange +type IntegerRange = NumericRange +type NaturalRange = NumericRange +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=189, lineno=9, colno=44) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=68, lineno=5, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'NumericRange' + parameters: + + location: SourceLocation(pos=18, lineno=1, colno=19) + end_location: SourceLocation(pos=19, lineno=1, colno=20) + name: 'T' + type: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=68, lineno=5, colno=2) + attributes: + + unattributed_type: + + location: SourceLocation(pos=23, lineno=1, colno=24) + end_location: SourceLocation(pos=68, lineno=5, colno=2) + types: + + location: SourceLocation(pos=26, lineno=2, colno=2) + end_location: SourceLocation(pos=27, lineno=2, colno=3) + attributes: + + unattributed_type: + + location: SourceLocation(pos=26, lineno=2, colno=2) + end_location: SourceLocation(pos=27, lineno=2, colno=3) + path: + + location: SourceLocation(pos=26, lineno=2, colno=2) + end_location: SourceLocation(pos=27, lineno=2, colno=3) + absolute: False + segments: + + location: SourceLocation(pos=26, lineno=2, colno=2) + end_location: SourceLocation(pos=27, lineno=2, colno=3) + name: 'T' + modifiers: + + + location: SourceLocation(pos=31, lineno=3, colno=2) + end_location: SourceLocation(pos=37, lineno=3, colno=8) + attributes: + + unattributed_type: + + location: SourceLocation(pos=31, lineno=3, colno=2) + end_location: SourceLocation(pos=37, lineno=3, colno=8) + elements: + + location: SourceLocation(pos=32, lineno=3, colno=3) + end_location: SourceLocation(pos=33, lineno=3, colno=4) + attributes: + + unattributed_type: + + location: SourceLocation(pos=32, lineno=3, colno=3) + end_location: SourceLocation(pos=33, lineno=3, colno=4) + path: + + location: SourceLocation(pos=32, lineno=3, colno=3) + end_location: SourceLocation(pos=33, lineno=3, colno=4) + absolute: False + segments: + + location: SourceLocation(pos=32, lineno=3, colno=3) + end_location: SourceLocation(pos=33, lineno=3, colno=4) + name: 'T' + modifiers: + + + location: SourceLocation(pos=35, lineno=3, colno=6) + end_location: SourceLocation(pos=36, lineno=3, colno=7) + attributes: + + unattributed_type: + + location: SourceLocation(pos=35, lineno=3, colno=6) + end_location: SourceLocation(pos=36, lineno=3, colno=7) + path: + + location: SourceLocation(pos=35, lineno=3, colno=6) + end_location: SourceLocation(pos=36, lineno=3, colno=7) + absolute: False + segments: + + location: SourceLocation(pos=35, lineno=3, colno=6) + end_location: SourceLocation(pos=36, lineno=3, colno=7) + name: 'T' + modifiers: + + modifiers: + + + location: SourceLocation(pos=41, lineno=4, colno=2) + end_location: SourceLocation(pos=66, lineno=4, colno=27) + attributes: + + unattributed_type: + + location: SourceLocation(pos=41, lineno=4, colno=2) + end_location: SourceLocation(pos=66, lineno=4, colno=27) + prelim: + + location: SourceLocation(pos=41, lineno=4, colno=2) + end_location: SourceLocation(pos=47, lineno=4, colno=8) + doc_comments: + + attributes: + + identifier: None + fields: + + location: SourceLocation(pos=50, lineno=4, colno=11) + end_location: SourceLocation(pos=56, lineno=4, colno=17) + prelim: + + location: SourceLocation(pos=50, lineno=4, colno=11) + end_location: SourceLocation(pos=66, lineno=4, colno=27) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=50, lineno=4, colno=11) + end_location: SourceLocation(pos=53, lineno=4, colno=14) + name: 'min' + optional: False + type: + + location: SourceLocation(pos=55, lineno=4, colno=16) + end_location: SourceLocation(pos=56, lineno=4, colno=17) + attributes: + + unattributed_type: + + location: SourceLocation(pos=55, lineno=4, colno=16) + end_location: SourceLocation(pos=56, lineno=4, colno=17) + path: + + location: SourceLocation(pos=55, lineno=4, colno=16) + end_location: SourceLocation(pos=56, lineno=4, colno=17) + absolute: False + segments: + + location: SourceLocation(pos=55, lineno=4, colno=16) + end_location: SourceLocation(pos=56, lineno=4, colno=17) + name: 'T' + modifiers: + + + location: SourceLocation(pos=58, lineno=4, colno=19) + end_location: SourceLocation(pos=64, lineno=4, colno=25) + prelim: + + location: SourceLocation(pos=58, lineno=4, colno=19) + end_location: SourceLocation(pos=66, lineno=4, colno=27) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=58, lineno=4, colno=19) + end_location: SourceLocation(pos=61, lineno=4, colno=22) + name: 'max' + optional: False + type: + + location: SourceLocation(pos=63, lineno=4, colno=24) + end_location: SourceLocation(pos=64, lineno=4, colno=25) + attributes: + + unattributed_type: + + location: SourceLocation(pos=63, lineno=4, colno=24) + end_location: SourceLocation(pos=64, lineno=4, colno=25) + path: + + location: SourceLocation(pos=63, lineno=4, colno=24) + end_location: SourceLocation(pos=64, lineno=4, colno=25) + absolute: False + segments: + + location: SourceLocation(pos=63, lineno=4, colno=24) + end_location: SourceLocation(pos=64, lineno=4, colno=25) + name: 'T' + modifiers: + + modifiers: + + modifiers: + + + location: SourceLocation(pos=70, lineno=7, colno=1) + end_location: SourceLocation(pos=107, lineno=7, colno=38) + prelim: + + location: SourceLocation(pos=70, lineno=7, colno=1) + end_location: SourceLocation(pos=74, lineno=7, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=75, lineno=7, colno=6) + end_location: SourceLocation(pos=85, lineno=7, colno=16) + name: 'FloatRange' + parameters: + + type: + + location: SourceLocation(pos=88, lineno=7, colno=19) + end_location: SourceLocation(pos=107, lineno=7, colno=38) + attributes: + + unattributed_type: + + location: SourceLocation(pos=88, lineno=7, colno=19) + end_location: SourceLocation(pos=100, lineno=7, colno=31) + path: + + location: SourceLocation(pos=88, lineno=7, colno=19) + end_location: SourceLocation(pos=100, lineno=7, colno=31) + absolute: False + segments: + + location: SourceLocation(pos=88, lineno=7, colno=19) + end_location: SourceLocation(pos=100, lineno=7, colno=31) + name: 'NumericRange' + modifiers: + + location: SourceLocation(pos=100, lineno=7, colno=31) + end_location: SourceLocation(pos=107, lineno=7, colno=38) + arguments: + + location: SourceLocation(pos=101, lineno=7, colno=32) + end_location: SourceLocation(pos=106, lineno=7, colno=37) + attributes: + + unattributed_type: + + location: SourceLocation(pos=101, lineno=7, colno=32) + end_location: SourceLocation(pos=106, lineno=7, colno=37) + name: 'float' + constraint: None + modifiers: + + + location: SourceLocation(pos=108, lineno=8, colno=1) + end_location: SourceLocation(pos=145, lineno=8, colno=38) + prelim: + + location: SourceLocation(pos=108, lineno=8, colno=1) + end_location: SourceLocation(pos=112, lineno=8, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=113, lineno=8, colno=6) + end_location: SourceLocation(pos=125, lineno=8, colno=18) + name: 'IntegerRange' + parameters: + + type: + + location: SourceLocation(pos=128, lineno=8, colno=21) + end_location: SourceLocation(pos=145, lineno=8, colno=38) + attributes: + + unattributed_type: + + location: SourceLocation(pos=128, lineno=8, colno=21) + end_location: SourceLocation(pos=140, lineno=8, colno=33) + path: + + location: SourceLocation(pos=128, lineno=8, colno=21) + end_location: SourceLocation(pos=140, lineno=8, colno=33) + absolute: False + segments: + + location: SourceLocation(pos=128, lineno=8, colno=21) + end_location: SourceLocation(pos=140, lineno=8, colno=33) + name: 'NumericRange' + modifiers: + + location: SourceLocation(pos=140, lineno=8, colno=33) + end_location: SourceLocation(pos=145, lineno=8, colno=38) + arguments: + + location: SourceLocation(pos=141, lineno=8, colno=34) + end_location: SourceLocation(pos=144, lineno=8, colno=37) + attributes: + + unattributed_type: + + location: SourceLocation(pos=141, lineno=8, colno=34) + end_location: SourceLocation(pos=144, lineno=8, colno=37) + name: 'int' + constraint: None + modifiers: + + + location: SourceLocation(pos=146, lineno=9, colno=1) + end_location: SourceLocation(pos=189, lineno=9, colno=44) + prelim: + + location: SourceLocation(pos=146, lineno=9, colno=1) + end_location: SourceLocation(pos=150, lineno=9, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=151, lineno=9, colno=6) + end_location: SourceLocation(pos=163, lineno=9, colno=18) + name: 'NaturalRange' + parameters: + + type: + + location: SourceLocation(pos=166, lineno=9, colno=21) + end_location: SourceLocation(pos=189, lineno=9, colno=44) + attributes: + + unattributed_type: + + location: SourceLocation(pos=166, lineno=9, colno=21) + end_location: SourceLocation(pos=178, lineno=9, colno=33) + path: + + location: SourceLocation(pos=166, lineno=9, colno=21) + end_location: SourceLocation(pos=178, lineno=9, colno=33) + absolute: False + segments: + + location: SourceLocation(pos=166, lineno=9, colno=21) + end_location: SourceLocation(pos=178, lineno=9, colno=33) + name: 'NumericRange' + modifiers: + + location: SourceLocation(pos=178, lineno=9, colno=33) + end_location: SourceLocation(pos=189, lineno=9, colno=44) + arguments: + + location: SourceLocation(pos=179, lineno=9, colno=34) + end_location: SourceLocation(pos=188, lineno=9, colno=43) + attributes: + + unattributed_type: + + location: SourceLocation(pos=179, lineno=9, colno=34) + end_location: SourceLocation(pos=188, lineno=9, colno=43) + name: 'int' + constraint: + + location: SourceLocation(pos=185, lineno=9, colno=40) + end_location: SourceLocation(pos=188, lineno=9, colno=43) + left: 0 + delimiter: '..' + right: None + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_13__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_13__0.txt new file mode 100644 index 000000000..f7aeb4e48 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_13__0.txt @@ -0,0 +1,82 @@ +struct T {} + +type List = [T] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=19) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + name: 'T' + fields: + + + location: SourceLocation(pos=13, lineno=3, colno=1) + end_location: SourceLocation(pos=31, lineno=3, colno=19) + prelim: + + location: SourceLocation(pos=13, lineno=3, colno=1) + end_location: SourceLocation(pos=17, lineno=3, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=18, lineno=3, colno=6) + end_location: SourceLocation(pos=22, lineno=3, colno=10) + name: 'List' + parameters: + + location: SourceLocation(pos=23, lineno=3, colno=11) + end_location: SourceLocation(pos=24, lineno=3, colno=12) + name: 'T' + type: + + location: SourceLocation(pos=28, lineno=3, colno=16) + end_location: SourceLocation(pos=31, lineno=3, colno=19) + attributes: + + unattributed_type: + + location: SourceLocation(pos=28, lineno=3, colno=16) + end_location: SourceLocation(pos=31, lineno=3, colno=19) + element: + + location: SourceLocation(pos=29, lineno=3, colno=17) + end_location: SourceLocation(pos=30, lineno=3, colno=18) + attributes: + + unattributed_type: + + location: SourceLocation(pos=29, lineno=3, colno=17) + end_location: SourceLocation(pos=30, lineno=3, colno=18) + path: + + location: SourceLocation(pos=29, lineno=3, colno=17) + end_location: SourceLocation(pos=30, lineno=3, colno=18) + absolute: False + segments: + + location: SourceLocation(pos=29, lineno=3, colno=17) + end_location: SourceLocation(pos=30, lineno=3, colno=18) + name: 'T' + modifiers: + + length: None + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_14__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_14__0.txt new file mode 100644 index 000000000..6a58a3419 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_14__0.txt @@ -0,0 +1,146 @@ +type List = [T] + +type Struct = struct { value: T } +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=56, lineno=3, colno=37) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=9, lineno=1, colno=10) + name: 'List' + parameters: + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + name: 'T' + type: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + attributes: + + unattributed_type: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=18, lineno=1, colno=19) + element: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + attributes: + + unattributed_type: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + path: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + absolute: False + segments: + + location: SourceLocation(pos=16, lineno=1, colno=17) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'T' + modifiers: + + length: None + modifiers: + + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=56, lineno=3, colno=37) + prelim: + + location: SourceLocation(pos=20, lineno=3, colno=1) + end_location: SourceLocation(pos=24, lineno=3, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=25, lineno=3, colno=6) + end_location: SourceLocation(pos=31, lineno=3, colno=12) + name: 'Struct' + parameters: + + location: SourceLocation(pos=32, lineno=3, colno=13) + end_location: SourceLocation(pos=33, lineno=3, colno=14) + name: 'T' + type: + + location: SourceLocation(pos=37, lineno=3, colno=18) + end_location: SourceLocation(pos=56, lineno=3, colno=37) + attributes: + + unattributed_type: + + location: SourceLocation(pos=37, lineno=3, colno=18) + end_location: SourceLocation(pos=56, lineno=3, colno=37) + prelim: + + location: SourceLocation(pos=37, lineno=3, colno=18) + end_location: SourceLocation(pos=43, lineno=3, colno=24) + doc_comments: + + attributes: + + identifier: None + fields: + + location: SourceLocation(pos=46, lineno=3, colno=27) + end_location: SourceLocation(pos=54, lineno=3, colno=35) + prelim: + + location: SourceLocation(pos=46, lineno=3, colno=27) + end_location: SourceLocation(pos=56, lineno=3, colno=37) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=46, lineno=3, colno=27) + end_location: SourceLocation(pos=51, lineno=3, colno=32) + name: 'value' + optional: False + type: + + location: SourceLocation(pos=53, lineno=3, colno=34) + end_location: SourceLocation(pos=54, lineno=3, colno=35) + attributes: + + unattributed_type: + + location: SourceLocation(pos=53, lineno=3, colno=34) + end_location: SourceLocation(pos=54, lineno=3, colno=35) + path: + + location: SourceLocation(pos=53, lineno=3, colno=34) + end_location: SourceLocation(pos=54, lineno=3, colno=35) + absolute: False + segments: + + location: SourceLocation(pos=53, lineno=3, colno=34) + end_location: SourceLocation(pos=54, lineno=3, colno=35) + name: 'T' + modifiers: + + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_15__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_15__0.txt new file mode 100644 index 000000000..0454cd7b1 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_15__0.txt @@ -0,0 +1,47 @@ +use demo::foo +use demo::bar as thing +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=23) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + path: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + absolute: False + segments: + + location: SourceLocation(pos=4, lineno=1, colno=5) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + name: 'demo' + + location: SourceLocation(pos=10, lineno=1, colno=11) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'foo' + alias: None + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=36, lineno=2, colno=23) + path: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=27, lineno=2, colno=14) + absolute: False + segments: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=22, lineno=2, colno=9) + name: 'demo' + + location: SourceLocation(pos=24, lineno=2, colno=11) + end_location: SourceLocation(pos=27, lineno=2, colno=14) + name: 'bar' + alias: + + location: SourceLocation(pos=31, lineno=2, colno=18) + end_location: SourceLocation(pos=36, lineno=2, colno=23) + name: 'thing' diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_16__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_16__0.txt new file mode 100644 index 000000000..ecb855ebc --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_16__0.txt @@ -0,0 +1,870 @@ +struct Foo { + #[id=item] + id1: string, + id2: #[id=item] string, + // id1 and id2 will likely both be supported and have equivalent effects. + + blockStateValue1: ( + #[serializable] string | + byte | short | int | long | float | double + ), + #[serialize_to=string] + blockStateValue2: (string | byte | short | int | long | float | double), + + evilUUID1: ( + #[until("1.16", uuid_string_to_compound)] #[parser=uuid] string | + #[until("1.17", uuid_compound_to_array)] MostLeastCompound | + int[] @ 4 + ), + #[history{ + (#[parser=uuid] string, until="1.16", updater=uuid_string_to_compound), + (MostLeastCompound, until="1.17", updater=uuid_compound_to_array), + }] + evilUUID2: int[] @ 4 +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=679, lineno=24, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=679, lineno=24, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + name: 'Foo' + fields: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=37, lineno=3, colno=13) + prelim: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=24, lineno=2, colno=12) + doc_comments: + + attributes: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=24, lineno=2, colno=12) + identifier: + + location: SourceLocation(pos=16, lineno=2, colno=4) + end_location: SourceLocation(pos=18, lineno=2, colno=6) + name: 'id' + value: + + location: SourceLocation(pos=19, lineno=2, colno=7) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + attributes: + + unattributed_type: + + location: SourceLocation(pos=19, lineno=2, colno=7) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + path: + + location: SourceLocation(pos=19, lineno=2, colno=7) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + absolute: False + segments: + + location: SourceLocation(pos=19, lineno=2, colno=7) + end_location: SourceLocation(pos=23, lineno=2, colno=11) + name: 'item' + modifiers: + + key: + + location: SourceLocation(pos=26, lineno=3, colno=2) + end_location: SourceLocation(pos=29, lineno=3, colno=5) + name: 'id1' + optional: False + type: + + location: SourceLocation(pos=31, lineno=3, colno=7) + end_location: SourceLocation(pos=37, lineno=3, colno=13) + attributes: + + unattributed_type: + + location: SourceLocation(pos=31, lineno=3, colno=7) + end_location: SourceLocation(pos=37, lineno=3, colno=13) + length: None + modifiers: + + + location: SourceLocation(pos=40, lineno=4, colno=2) + end_location: SourceLocation(pos=62, lineno=4, colno=24) + prelim: + + location: SourceLocation(pos=40, lineno=4, colno=2) + end_location: SourceLocation(pos=63, lineno=4, colno=25) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=40, lineno=4, colno=2) + end_location: SourceLocation(pos=43, lineno=4, colno=5) + name: 'id2' + optional: False + type: + + location: SourceLocation(pos=45, lineno=4, colno=7) + end_location: SourceLocation(pos=62, lineno=4, colno=24) + attributes: + + location: SourceLocation(pos=45, lineno=4, colno=7) + end_location: SourceLocation(pos=55, lineno=4, colno=17) + identifier: + + location: SourceLocation(pos=47, lineno=4, colno=9) + end_location: SourceLocation(pos=49, lineno=4, colno=11) + name: 'id' + value: + + location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=54, lineno=4, colno=16) + attributes: + + unattributed_type: + + location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=54, lineno=4, colno=16) + path: + + location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=54, lineno=4, colno=16) + absolute: False + segments: + + location: SourceLocation(pos=50, lineno=4, colno=12) + end_location: SourceLocation(pos=54, lineno=4, colno=16) + name: 'item' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=56, lineno=4, colno=18) + end_location: SourceLocation(pos=62, lineno=4, colno=24) + length: None + modifiers: + + + location: SourceLocation(pos=141, lineno=7, colno=2) + end_location: SourceLocation(pos=235, lineno=10, colno=3) + prelim: + + location: SourceLocation(pos=141, lineno=7, colno=2) + end_location: SourceLocation(pos=160, lineno=7, colno=21) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=141, lineno=7, colno=2) + end_location: SourceLocation(pos=157, lineno=7, colno=18) + name: 'blockStateValue1' + optional: False + type: + + location: SourceLocation(pos=159, lineno=7, colno=20) + end_location: SourceLocation(pos=235, lineno=10, colno=3) + attributes: + + unattributed_type: + + location: SourceLocation(pos=159, lineno=7, colno=20) + end_location: SourceLocation(pos=235, lineno=10, colno=3) + types: + + location: SourceLocation(pos=163, lineno=8, colno=3) + end_location: SourceLocation(pos=185, lineno=8, colno=25) + attributes: + + location: SourceLocation(pos=163, lineno=8, colno=3) + end_location: SourceLocation(pos=178, lineno=8, colno=18) + identifier: + + location: SourceLocation(pos=165, lineno=8, colno=5) + end_location: SourceLocation(pos=177, lineno=8, colno=17) + name: 'serializable' + value: None + unattributed_type: + + location: SourceLocation(pos=179, lineno=8, colno=19) + end_location: SourceLocation(pos=185, lineno=8, colno=25) + length: None + modifiers: + + + location: SourceLocation(pos=190, lineno=9, colno=3) + end_location: SourceLocation(pos=194, lineno=9, colno=7) + attributes: + + unattributed_type: + + location: SourceLocation(pos=190, lineno=9, colno=3) + end_location: SourceLocation(pos=194, lineno=9, colno=7) + name: 'byte' + constraint: None + modifiers: + + + location: SourceLocation(pos=197, lineno=9, colno=10) + end_location: SourceLocation(pos=202, lineno=9, colno=15) + attributes: + + unattributed_type: + + location: SourceLocation(pos=197, lineno=9, colno=10) + end_location: SourceLocation(pos=202, lineno=9, colno=15) + name: 'short' + constraint: None + modifiers: + + + location: SourceLocation(pos=205, lineno=9, colno=18) + end_location: SourceLocation(pos=208, lineno=9, colno=21) + attributes: + + unattributed_type: + + location: SourceLocation(pos=205, lineno=9, colno=18) + end_location: SourceLocation(pos=208, lineno=9, colno=21) + name: 'int' + constraint: None + modifiers: + + + location: SourceLocation(pos=211, lineno=9, colno=24) + end_location: SourceLocation(pos=215, lineno=9, colno=28) + attributes: + + unattributed_type: + + location: SourceLocation(pos=211, lineno=9, colno=24) + end_location: SourceLocation(pos=215, lineno=9, colno=28) + name: 'long' + constraint: None + modifiers: + + + location: SourceLocation(pos=218, lineno=9, colno=31) + end_location: SourceLocation(pos=223, lineno=9, colno=36) + attributes: + + unattributed_type: + + location: SourceLocation(pos=218, lineno=9, colno=31) + end_location: SourceLocation(pos=223, lineno=9, colno=36) + name: 'float' + constraint: None + modifiers: + + + location: SourceLocation(pos=226, lineno=9, colno=39) + end_location: SourceLocation(pos=232, lineno=9, colno=45) + attributes: + + unattributed_type: + + location: SourceLocation(pos=226, lineno=9, colno=39) + end_location: SourceLocation(pos=232, lineno=9, colno=45) + name: 'double' + constraint: None + modifiers: + + modifiers: + + + location: SourceLocation(pos=238, lineno=11, colno=2) + end_location: SourceLocation(pos=333, lineno=12, colno=73) + prelim: + + location: SourceLocation(pos=238, lineno=11, colno=2) + end_location: SourceLocation(pos=260, lineno=11, colno=24) + doc_comments: + + attributes: + + location: SourceLocation(pos=238, lineno=11, colno=2) + end_location: SourceLocation(pos=260, lineno=11, colno=24) + identifier: + + location: SourceLocation(pos=240, lineno=11, colno=4) + end_location: SourceLocation(pos=252, lineno=11, colno=16) + name: 'serialize_to' + value: + + location: SourceLocation(pos=253, lineno=11, colno=17) + end_location: SourceLocation(pos=259, lineno=11, colno=23) + attributes: + + unattributed_type: + + location: SourceLocation(pos=253, lineno=11, colno=17) + end_location: SourceLocation(pos=259, lineno=11, colno=23) + length: None + modifiers: + + key: + + location: SourceLocation(pos=262, lineno=12, colno=2) + end_location: SourceLocation(pos=278, lineno=12, colno=18) + name: 'blockStateValue2' + optional: False + type: + + location: SourceLocation(pos=280, lineno=12, colno=20) + end_location: SourceLocation(pos=333, lineno=12, colno=73) + attributes: + + unattributed_type: + + location: SourceLocation(pos=280, lineno=12, colno=20) + end_location: SourceLocation(pos=333, lineno=12, colno=73) + types: + + location: SourceLocation(pos=281, lineno=12, colno=21) + end_location: SourceLocation(pos=287, lineno=12, colno=27) + attributes: + + unattributed_type: + + location: SourceLocation(pos=281, lineno=12, colno=21) + end_location: SourceLocation(pos=287, lineno=12, colno=27) + length: None + modifiers: + + + location: SourceLocation(pos=290, lineno=12, colno=30) + end_location: SourceLocation(pos=294, lineno=12, colno=34) + attributes: + + unattributed_type: + + location: SourceLocation(pos=290, lineno=12, colno=30) + end_location: SourceLocation(pos=294, lineno=12, colno=34) + name: 'byte' + constraint: None + modifiers: + + + location: SourceLocation(pos=297, lineno=12, colno=37) + end_location: SourceLocation(pos=302, lineno=12, colno=42) + attributes: + + unattributed_type: + + location: SourceLocation(pos=297, lineno=12, colno=37) + end_location: SourceLocation(pos=302, lineno=12, colno=42) + name: 'short' + constraint: None + modifiers: + + + location: SourceLocation(pos=305, lineno=12, colno=45) + end_location: SourceLocation(pos=308, lineno=12, colno=48) + attributes: + + unattributed_type: + + location: SourceLocation(pos=305, lineno=12, colno=45) + end_location: SourceLocation(pos=308, lineno=12, colno=48) + name: 'int' + constraint: None + modifiers: + + + location: SourceLocation(pos=311, lineno=12, colno=51) + end_location: SourceLocation(pos=315, lineno=12, colno=55) + attributes: + + unattributed_type: + + location: SourceLocation(pos=311, lineno=12, colno=51) + end_location: SourceLocation(pos=315, lineno=12, colno=55) + name: 'long' + constraint: None + modifiers: + + + location: SourceLocation(pos=318, lineno=12, colno=58) + end_location: SourceLocation(pos=323, lineno=12, colno=63) + attributes: + + unattributed_type: + + location: SourceLocation(pos=318, lineno=12, colno=58) + end_location: SourceLocation(pos=323, lineno=12, colno=63) + name: 'float' + constraint: None + modifiers: + + + location: SourceLocation(pos=326, lineno=12, colno=66) + end_location: SourceLocation(pos=332, lineno=12, colno=72) + attributes: + + unattributed_type: + + location: SourceLocation(pos=326, lineno=12, colno=66) + end_location: SourceLocation(pos=332, lineno=12, colno=72) + name: 'double' + constraint: None + modifiers: + + modifiers: + + + location: SourceLocation(pos=337, lineno=14, colno=2) + end_location: SourceLocation(pos=495, lineno=18, colno=3) + prelim: + + location: SourceLocation(pos=337, lineno=14, colno=2) + end_location: SourceLocation(pos=349, lineno=14, colno=14) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=337, lineno=14, colno=2) + end_location: SourceLocation(pos=346, lineno=14, colno=11) + name: 'evilUUID1' + optional: False + type: + + location: SourceLocation(pos=348, lineno=14, colno=13) + end_location: SourceLocation(pos=495, lineno=18, colno=3) + attributes: + + unattributed_type: + + location: SourceLocation(pos=348, lineno=14, colno=13) + end_location: SourceLocation(pos=495, lineno=18, colno=3) + types: + + location: SourceLocation(pos=352, lineno=15, colno=3) + end_location: SourceLocation(pos=415, lineno=15, colno=66) + attributes: + + location: SourceLocation(pos=352, lineno=15, colno=3) + end_location: SourceLocation(pos=393, lineno=15, colno=44) + identifier: + + location: SourceLocation(pos=354, lineno=15, colno=5) + end_location: SourceLocation(pos=359, lineno=15, colno=10) + name: 'until' + value: + + location: SourceLocation(pos=359, lineno=15, colno=10) + end_location: SourceLocation(pos=392, lineno=15, colno=43) + flavor: 'brace' + positional_values: + + location: SourceLocation(pos=360, lineno=15, colno=11) + end_location: SourceLocation(pos=366, lineno=15, colno=17) + attributes: + + unattributed_type: + + location: SourceLocation(pos=360, lineno=15, colno=11) + end_location: SourceLocation(pos=366, lineno=15, colno=17) + value: '1.16' + modifiers: + + + location: SourceLocation(pos=368, lineno=15, colno=19) + end_location: SourceLocation(pos=391, lineno=15, colno=42) + attributes: + + unattributed_type: + + location: SourceLocation(pos=368, lineno=15, colno=19) + end_location: SourceLocation(pos=391, lineno=15, colno=42) + path: + + location: SourceLocation(pos=368, lineno=15, colno=19) + end_location: SourceLocation(pos=391, lineno=15, colno=42) + absolute: False + segments: + + location: SourceLocation(pos=368, lineno=15, colno=19) + end_location: SourceLocation(pos=391, lineno=15, colno=42) + name: 'uuid_string_to_compound' + modifiers: + + named_values: + + + location: SourceLocation(pos=394, lineno=15, colno=45) + end_location: SourceLocation(pos=408, lineno=15, colno=59) + identifier: + + location: SourceLocation(pos=396, lineno=15, colno=47) + end_location: SourceLocation(pos=402, lineno=15, colno=53) + name: 'parser' + value: + + location: SourceLocation(pos=403, lineno=15, colno=54) + end_location: SourceLocation(pos=407, lineno=15, colno=58) + attributes: + + unattributed_type: + + location: SourceLocation(pos=403, lineno=15, colno=54) + end_location: SourceLocation(pos=407, lineno=15, colno=58) + path: + + location: SourceLocation(pos=403, lineno=15, colno=54) + end_location: SourceLocation(pos=407, lineno=15, colno=58) + absolute: False + segments: + + location: SourceLocation(pos=403, lineno=15, colno=54) + end_location: SourceLocation(pos=407, lineno=15, colno=58) + name: 'uuid' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=409, lineno=15, colno=60) + end_location: SourceLocation(pos=415, lineno=15, colno=66) + length: None + modifiers: + + + location: SourceLocation(pos=420, lineno=16, colno=3) + end_location: SourceLocation(pos=478, lineno=16, colno=61) + attributes: + + location: SourceLocation(pos=420, lineno=16, colno=3) + end_location: SourceLocation(pos=460, lineno=16, colno=43) + identifier: + + location: SourceLocation(pos=422, lineno=16, colno=5) + end_location: SourceLocation(pos=427, lineno=16, colno=10) + name: 'until' + value: + + location: SourceLocation(pos=427, lineno=16, colno=10) + end_location: SourceLocation(pos=459, lineno=16, colno=42) + flavor: 'brace' + positional_values: + + location: SourceLocation(pos=428, lineno=16, colno=11) + end_location: SourceLocation(pos=434, lineno=16, colno=17) + attributes: + + unattributed_type: + + location: SourceLocation(pos=428, lineno=16, colno=11) + end_location: SourceLocation(pos=434, lineno=16, colno=17) + value: '1.17' + modifiers: + + + location: SourceLocation(pos=436, lineno=16, colno=19) + end_location: SourceLocation(pos=458, lineno=16, colno=41) + attributes: + + unattributed_type: + + location: SourceLocation(pos=436, lineno=16, colno=19) + end_location: SourceLocation(pos=458, lineno=16, colno=41) + path: + + location: SourceLocation(pos=436, lineno=16, colno=19) + end_location: SourceLocation(pos=458, lineno=16, colno=41) + absolute: False + segments: + + location: SourceLocation(pos=436, lineno=16, colno=19) + end_location: SourceLocation(pos=458, lineno=16, colno=41) + name: 'uuid_compound_to_array' + modifiers: + + named_values: + + unattributed_type: + + location: SourceLocation(pos=461, lineno=16, colno=44) + end_location: SourceLocation(pos=478, lineno=16, colno=61) + path: + + location: SourceLocation(pos=461, lineno=16, colno=44) + end_location: SourceLocation(pos=478, lineno=16, colno=61) + absolute: False + segments: + + location: SourceLocation(pos=461, lineno=16, colno=44) + end_location: SourceLocation(pos=478, lineno=16, colno=61) + name: 'MostLeastCompound' + modifiers: + + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=492, lineno=17, colno=12) + attributes: + + unattributed_type: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=492, lineno=17, colno=12) + name: 'int' + constraint: None + length: + + location: SourceLocation(pos=491, lineno=17, colno=11) + end_location: SourceLocation(pos=492, lineno=17, colno=12) + left: 4 + delimiter: '..' + right: 4 + modifiers: + + modifiers: + + + location: SourceLocation(pos=498, lineno=19, colno=2) + end_location: SourceLocation(pos=677, lineno=23, colno=22) + prelim: + + location: SourceLocation(pos=498, lineno=19, colno=2) + end_location: SourceLocation(pos=655, lineno=22, colno=4) + doc_comments: + + attributes: + + location: SourceLocation(pos=498, lineno=19, colno=2) + end_location: SourceLocation(pos=655, lineno=22, colno=4) + identifier: + + location: SourceLocation(pos=500, lineno=19, colno=4) + end_location: SourceLocation(pos=507, lineno=19, colno=11) + name: 'history' + value: + + location: SourceLocation(pos=507, lineno=19, colno=11) + end_location: SourceLocation(pos=654, lineno=22, colno=3) + flavor: 'curly' + positional_values: + + location: SourceLocation(pos=511, lineno=20, colno=3) + end_location: SourceLocation(pos=581, lineno=20, colno=73) + flavor: 'brace' + positional_values: + + location: SourceLocation(pos=512, lineno=20, colno=4) + end_location: SourceLocation(pos=533, lineno=20, colno=25) + attributes: + + location: SourceLocation(pos=512, lineno=20, colno=4) + end_location: SourceLocation(pos=526, lineno=20, colno=18) + identifier: + + location: SourceLocation(pos=514, lineno=20, colno=6) + end_location: SourceLocation(pos=520, lineno=20, colno=12) + name: 'parser' + value: + + location: SourceLocation(pos=521, lineno=20, colno=13) + end_location: SourceLocation(pos=525, lineno=20, colno=17) + attributes: + + unattributed_type: + + location: SourceLocation(pos=521, lineno=20, colno=13) + end_location: SourceLocation(pos=525, lineno=20, colno=17) + path: + + location: SourceLocation(pos=521, lineno=20, colno=13) + end_location: SourceLocation(pos=525, lineno=20, colno=17) + absolute: False + segments: + + location: SourceLocation(pos=521, lineno=20, colno=13) + end_location: SourceLocation(pos=525, lineno=20, colno=17) + name: 'uuid' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=527, lineno=20, colno=19) + end_location: SourceLocation(pos=533, lineno=20, colno=25) + length: None + modifiers: + + named_values: + + location: SourceLocation(pos=535, lineno=20, colno=27) + end_location: SourceLocation(pos=547, lineno=20, colno=39) + name: + + location: SourceLocation(pos=535, lineno=20, colno=27) + end_location: SourceLocation(pos=540, lineno=20, colno=32) + name: 'until' + value: + + location: SourceLocation(pos=541, lineno=20, colno=33) + end_location: SourceLocation(pos=547, lineno=20, colno=39) + attributes: + + unattributed_type: + + location: SourceLocation(pos=541, lineno=20, colno=33) + end_location: SourceLocation(pos=547, lineno=20, colno=39) + value: '1.16' + modifiers: + + + location: SourceLocation(pos=549, lineno=20, colno=41) + end_location: SourceLocation(pos=580, lineno=20, colno=72) + name: + + location: SourceLocation(pos=549, lineno=20, colno=41) + end_location: SourceLocation(pos=556, lineno=20, colno=48) + name: 'updater' + value: + + location: SourceLocation(pos=557, lineno=20, colno=49) + end_location: SourceLocation(pos=580, lineno=20, colno=72) + attributes: + + unattributed_type: + + location: SourceLocation(pos=557, lineno=20, colno=49) + end_location: SourceLocation(pos=580, lineno=20, colno=72) + path: + + location: SourceLocation(pos=557, lineno=20, colno=49) + end_location: SourceLocation(pos=580, lineno=20, colno=72) + absolute: False + segments: + + location: SourceLocation(pos=557, lineno=20, colno=49) + end_location: SourceLocation(pos=580, lineno=20, colno=72) + name: 'uuid_string_to_compound' + modifiers: + + + location: SourceLocation(pos=585, lineno=21, colno=3) + end_location: SourceLocation(pos=650, lineno=21, colno=68) + flavor: 'brace' + positional_values: + + location: SourceLocation(pos=586, lineno=21, colno=4) + end_location: SourceLocation(pos=603, lineno=21, colno=21) + attributes: + + unattributed_type: + + location: SourceLocation(pos=586, lineno=21, colno=4) + end_location: SourceLocation(pos=603, lineno=21, colno=21) + path: + + location: SourceLocation(pos=586, lineno=21, colno=4) + end_location: SourceLocation(pos=603, lineno=21, colno=21) + absolute: False + segments: + + location: SourceLocation(pos=586, lineno=21, colno=4) + end_location: SourceLocation(pos=603, lineno=21, colno=21) + name: 'MostLeastCompound' + modifiers: + + named_values: + + location: SourceLocation(pos=605, lineno=21, colno=23) + end_location: SourceLocation(pos=617, lineno=21, colno=35) + name: + + location: SourceLocation(pos=605, lineno=21, colno=23) + end_location: SourceLocation(pos=610, lineno=21, colno=28) + name: 'until' + value: + + location: SourceLocation(pos=611, lineno=21, colno=29) + end_location: SourceLocation(pos=617, lineno=21, colno=35) + attributes: + + unattributed_type: + + location: SourceLocation(pos=611, lineno=21, colno=29) + end_location: SourceLocation(pos=617, lineno=21, colno=35) + value: '1.17' + modifiers: + + + location: SourceLocation(pos=619, lineno=21, colno=37) + end_location: SourceLocation(pos=649, lineno=21, colno=67) + name: + + location: SourceLocation(pos=619, lineno=21, colno=37) + end_location: SourceLocation(pos=626, lineno=21, colno=44) + name: 'updater' + value: + + location: SourceLocation(pos=627, lineno=21, colno=45) + end_location: SourceLocation(pos=649, lineno=21, colno=67) + attributes: + + unattributed_type: + + location: SourceLocation(pos=627, lineno=21, colno=45) + end_location: SourceLocation(pos=649, lineno=21, colno=67) + path: + + location: SourceLocation(pos=627, lineno=21, colno=45) + end_location: SourceLocation(pos=649, lineno=21, colno=67) + absolute: False + segments: + + location: SourceLocation(pos=627, lineno=21, colno=45) + end_location: SourceLocation(pos=649, lineno=21, colno=67) + name: 'uuid_compound_to_array' + modifiers: + + named_values: + + key: + + location: SourceLocation(pos=657, lineno=23, colno=2) + end_location: SourceLocation(pos=666, lineno=23, colno=11) + name: 'evilUUID2' + optional: False + type: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=677, lineno=23, colno=22) + attributes: + + unattributed_type: + + location: SourceLocation(pos=-1, lineno=0, colno=0) + end_location: SourceLocation(pos=677, lineno=23, colno=22) + name: 'int' + constraint: None + length: + + location: SourceLocation(pos=676, lineno=23, colno=21) + end_location: SourceLocation(pos=677, lineno=23, colno=22) + left: 4 + delimiter: '..' + right: 4 + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_1__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_1__0.txt new file mode 100644 index 000000000..b0528e654 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_1__0.txt @@ -0,0 +1,67 @@ +/// This doc comment describes the struct Foo. +/// External tools, like VS Code, may show this block of text when the user hovers over the name "Foo". +struct Foo { + /// This is another doc comment describing the field "Bar". + Bar: boolean, // This is just a regular comment because it only starts with two slashes. +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=316, lineno=6, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=316, lineno=6, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=151, lineno=3, colno=1) + doc_comments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=47, lineno=2, colno=1) + text: '/// This doc comment describes the struct Foo.\n' + + location: SourceLocation(pos=47, lineno=2, colno=1) + end_location: SourceLocation(pos=151, lineno=3, colno=1) + text: '/// External tools, like VS Code, may show this block of text when the user hovers over the name "Foo".\n' + attributes: + + identifier: + + location: SourceLocation(pos=158, lineno=3, colno=8) + end_location: SourceLocation(pos=161, lineno=3, colno=11) + name: 'Foo' + fields: + + location: SourceLocation(pos=165, lineno=4, colno=2) + end_location: SourceLocation(pos=238, lineno=5, colno=14) + prelim: + + location: SourceLocation(pos=165, lineno=4, colno=2) + end_location: SourceLocation(pos=225, lineno=5, colno=1) + doc_comments: + + location: SourceLocation(pos=165, lineno=4, colno=2) + end_location: SourceLocation(pos=225, lineno=5, colno=1) + text: '/// This is another doc comment describing the field "Bar".\n' + attributes: + + key: + + location: SourceLocation(pos=226, lineno=5, colno=2) + end_location: SourceLocation(pos=229, lineno=5, colno=5) + name: 'Bar' + optional: False + type: + + location: SourceLocation(pos=231, lineno=5, colno=7) + end_location: SourceLocation(pos=238, lineno=5, colno=14) + attributes: + + unattributed_type: + + location: SourceLocation(pos=231, lineno=5, colno=7) + end_location: SourceLocation(pos=238, lineno=5, colno=14) + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_2__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_2__0.txt new file mode 100644 index 000000000..bdeef9d2e --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_2__0.txt @@ -0,0 +1,98 @@ +struct Tag { + replace?: boolean, + values: [string], +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=4, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=53, lineno=4, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + name: 'Tag' + fields: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=31, lineno=2, colno=19) + prelim: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=32, lineno=2, colno=20) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=21, lineno=2, colno=9) + name: 'replace' + optional: True + type: + + location: SourceLocation(pos=24, lineno=2, colno=12) + end_location: SourceLocation(pos=31, lineno=2, colno=19) + attributes: + + unattributed_type: + + location: SourceLocation(pos=24, lineno=2, colno=12) + end_location: SourceLocation(pos=31, lineno=2, colno=19) + modifiers: + + + location: SourceLocation(pos=34, lineno=3, colno=2) + end_location: SourceLocation(pos=50, lineno=3, colno=18) + prelim: + + location: SourceLocation(pos=34, lineno=3, colno=2) + end_location: SourceLocation(pos=51, lineno=3, colno=19) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=34, lineno=3, colno=2) + end_location: SourceLocation(pos=40, lineno=3, colno=8) + name: 'values' + optional: False + type: + + location: SourceLocation(pos=42, lineno=3, colno=10) + end_location: SourceLocation(pos=50, lineno=3, colno=18) + attributes: + + unattributed_type: + + location: SourceLocation(pos=42, lineno=3, colno=10) + end_location: SourceLocation(pos=50, lineno=3, colno=18) + element: + + location: SourceLocation(pos=43, lineno=3, colno=11) + end_location: SourceLocation(pos=49, lineno=3, colno=17) + attributes: + + unattributed_type: + + location: SourceLocation(pos=43, lineno=3, colno=11) + end_location: SourceLocation(pos=49, lineno=3, colno=17) + length: None + modifiers: + + length: None + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_3__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_3__0.txt new file mode 100644 index 000000000..85beb7596 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_3__0.txt @@ -0,0 +1,124 @@ +struct Player { + ...Mob, // Reuse fields from the Mob struct here. + abilities: Abilities, + CustomName: (), // Overrides CustomName from the Mob struct to an empty union. +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=171, lineno=5, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=171, lineno=5, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + name: 'Player' + fields: + + location: SourceLocation(pos=17, lineno=2, colno=2) + end_location: SourceLocation(pos=23, lineno=2, colno=8) + attributes: + + type: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=8) + attributes: + + unattributed_type: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=8) + path: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=8) + absolute: False + segments: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=23, lineno=2, colno=8) + name: 'Mob' + modifiers: + + + location: SourceLocation(pos=68, lineno=3, colno=2) + end_location: SourceLocation(pos=88, lineno=3, colno=22) + prelim: + + location: SourceLocation(pos=68, lineno=3, colno=2) + end_location: SourceLocation(pos=89, lineno=3, colno=23) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=68, lineno=3, colno=2) + end_location: SourceLocation(pos=77, lineno=3, colno=11) + name: 'abilities' + optional: False + type: + + location: SourceLocation(pos=79, lineno=3, colno=13) + end_location: SourceLocation(pos=88, lineno=3, colno=22) + attributes: + + unattributed_type: + + location: SourceLocation(pos=79, lineno=3, colno=13) + end_location: SourceLocation(pos=88, lineno=3, colno=22) + path: + + location: SourceLocation(pos=79, lineno=3, colno=13) + end_location: SourceLocation(pos=88, lineno=3, colno=22) + absolute: False + segments: + + location: SourceLocation(pos=79, lineno=3, colno=13) + end_location: SourceLocation(pos=88, lineno=3, colno=22) + name: 'Abilities' + modifiers: + + + location: SourceLocation(pos=91, lineno=4, colno=2) + end_location: SourceLocation(pos=105, lineno=4, colno=16) + prelim: + + location: SourceLocation(pos=91, lineno=4, colno=2) + end_location: SourceLocation(pos=169, lineno=4, colno=80) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=91, lineno=4, colno=2) + end_location: SourceLocation(pos=101, lineno=4, colno=12) + name: 'CustomName' + optional: False + type: + + location: SourceLocation(pos=103, lineno=4, colno=14) + end_location: SourceLocation(pos=105, lineno=4, colno=16) + attributes: + + unattributed_type: + + location: SourceLocation(pos=103, lineno=4, colno=14) + end_location: SourceLocation(pos=105, lineno=4, colno=16) + types: + + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_4__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_4__0.txt new file mode 100644 index 000000000..c35deb984 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_4__0.txt @@ -0,0 +1,474 @@ +type Tag = struct { + replace?: boolean, + values: [V], +} + +type BlockTag = Tag<#[id=block] string> +type EntityTypeTag = Tag<#[id=entity_type] string> +type FunctionTag = Tag<#[id=function] string> +type ItemTag = Tag<#[id=item] string> +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=234, lineno=9, colno=38) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=58, lineno=4, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=8, lineno=1, colno=9) + name: 'Tag' + parameters: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + name: 'V' + type: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=58, lineno=4, colno=2) + attributes: + + unattributed_type: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=58, lineno=4, colno=2) + prelim: + + location: SourceLocation(pos=14, lineno=1, colno=15) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + doc_comments: + + attributes: + + identifier: None + fields: + + location: SourceLocation(pos=24, lineno=2, colno=2) + end_location: SourceLocation(pos=41, lineno=2, colno=19) + prelim: + + location: SourceLocation(pos=24, lineno=2, colno=2) + end_location: SourceLocation(pos=42, lineno=2, colno=20) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=24, lineno=2, colno=2) + end_location: SourceLocation(pos=31, lineno=2, colno=9) + name: 'replace' + optional: True + type: + + location: SourceLocation(pos=34, lineno=2, colno=12) + end_location: SourceLocation(pos=41, lineno=2, colno=19) + attributes: + + unattributed_type: + + location: SourceLocation(pos=34, lineno=2, colno=12) + end_location: SourceLocation(pos=41, lineno=2, colno=19) + modifiers: + + + location: SourceLocation(pos=44, lineno=3, colno=2) + end_location: SourceLocation(pos=55, lineno=3, colno=13) + prelim: + + location: SourceLocation(pos=44, lineno=3, colno=2) + end_location: SourceLocation(pos=56, lineno=3, colno=14) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=44, lineno=3, colno=2) + end_location: SourceLocation(pos=50, lineno=3, colno=8) + name: 'values' + optional: False + type: + + location: SourceLocation(pos=52, lineno=3, colno=10) + end_location: SourceLocation(pos=55, lineno=3, colno=13) + attributes: + + unattributed_type: + + location: SourceLocation(pos=52, lineno=3, colno=10) + end_location: SourceLocation(pos=55, lineno=3, colno=13) + element: + + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=54, lineno=3, colno=12) + attributes: + + unattributed_type: + + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=54, lineno=3, colno=12) + path: + + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=54, lineno=3, colno=12) + absolute: False + segments: + + location: SourceLocation(pos=53, lineno=3, colno=11) + end_location: SourceLocation(pos=54, lineno=3, colno=12) + name: 'V' + modifiers: + + length: None + modifiers: + + modifiers: + + + location: SourceLocation(pos=60, lineno=6, colno=1) + end_location: SourceLocation(pos=99, lineno=6, colno=40) + prelim: + + location: SourceLocation(pos=60, lineno=6, colno=1) + end_location: SourceLocation(pos=64, lineno=6, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=65, lineno=6, colno=6) + end_location: SourceLocation(pos=73, lineno=6, colno=14) + name: 'BlockTag' + parameters: + + type: + + location: SourceLocation(pos=76, lineno=6, colno=17) + end_location: SourceLocation(pos=99, lineno=6, colno=40) + attributes: + + unattributed_type: + + location: SourceLocation(pos=76, lineno=6, colno=17) + end_location: SourceLocation(pos=79, lineno=6, colno=20) + path: + + location: SourceLocation(pos=76, lineno=6, colno=17) + end_location: SourceLocation(pos=79, lineno=6, colno=20) + absolute: False + segments: + + location: SourceLocation(pos=76, lineno=6, colno=17) + end_location: SourceLocation(pos=79, lineno=6, colno=20) + name: 'Tag' + modifiers: + + location: SourceLocation(pos=79, lineno=6, colno=20) + end_location: SourceLocation(pos=99, lineno=6, colno=40) + arguments: + + location: SourceLocation(pos=80, lineno=6, colno=21) + end_location: SourceLocation(pos=98, lineno=6, colno=39) + attributes: + + location: SourceLocation(pos=80, lineno=6, colno=21) + end_location: SourceLocation(pos=91, lineno=6, colno=32) + identifier: + + location: SourceLocation(pos=82, lineno=6, colno=23) + end_location: SourceLocation(pos=84, lineno=6, colno=25) + name: 'id' + value: + + location: SourceLocation(pos=85, lineno=6, colno=26) + end_location: SourceLocation(pos=90, lineno=6, colno=31) + attributes: + + unattributed_type: + + location: SourceLocation(pos=85, lineno=6, colno=26) + end_location: SourceLocation(pos=90, lineno=6, colno=31) + path: + + location: SourceLocation(pos=85, lineno=6, colno=26) + end_location: SourceLocation(pos=90, lineno=6, colno=31) + absolute: False + segments: + + location: SourceLocation(pos=85, lineno=6, colno=26) + end_location: SourceLocation(pos=90, lineno=6, colno=31) + name: 'block' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=92, lineno=6, colno=33) + end_location: SourceLocation(pos=98, lineno=6, colno=39) + length: None + modifiers: + + + location: SourceLocation(pos=100, lineno=7, colno=1) + end_location: SourceLocation(pos=150, lineno=7, colno=51) + prelim: + + location: SourceLocation(pos=100, lineno=7, colno=1) + end_location: SourceLocation(pos=104, lineno=7, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=105, lineno=7, colno=6) + end_location: SourceLocation(pos=118, lineno=7, colno=19) + name: 'EntityTypeTag' + parameters: + + type: + + location: SourceLocation(pos=121, lineno=7, colno=22) + end_location: SourceLocation(pos=150, lineno=7, colno=51) + attributes: + + unattributed_type: + + location: SourceLocation(pos=121, lineno=7, colno=22) + end_location: SourceLocation(pos=124, lineno=7, colno=25) + path: + + location: SourceLocation(pos=121, lineno=7, colno=22) + end_location: SourceLocation(pos=124, lineno=7, colno=25) + absolute: False + segments: + + location: SourceLocation(pos=121, lineno=7, colno=22) + end_location: SourceLocation(pos=124, lineno=7, colno=25) + name: 'Tag' + modifiers: + + location: SourceLocation(pos=124, lineno=7, colno=25) + end_location: SourceLocation(pos=150, lineno=7, colno=51) + arguments: + + location: SourceLocation(pos=125, lineno=7, colno=26) + end_location: SourceLocation(pos=149, lineno=7, colno=50) + attributes: + + location: SourceLocation(pos=125, lineno=7, colno=26) + end_location: SourceLocation(pos=142, lineno=7, colno=43) + identifier: + + location: SourceLocation(pos=127, lineno=7, colno=28) + end_location: SourceLocation(pos=129, lineno=7, colno=30) + name: 'id' + value: + + location: SourceLocation(pos=130, lineno=7, colno=31) + end_location: SourceLocation(pos=141, lineno=7, colno=42) + attributes: + + unattributed_type: + + location: SourceLocation(pos=130, lineno=7, colno=31) + end_location: SourceLocation(pos=141, lineno=7, colno=42) + path: + + location: SourceLocation(pos=130, lineno=7, colno=31) + end_location: SourceLocation(pos=141, lineno=7, colno=42) + absolute: False + segments: + + location: SourceLocation(pos=130, lineno=7, colno=31) + end_location: SourceLocation(pos=141, lineno=7, colno=42) + name: 'entity_type' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=143, lineno=7, colno=44) + end_location: SourceLocation(pos=149, lineno=7, colno=50) + length: None + modifiers: + + + location: SourceLocation(pos=151, lineno=8, colno=1) + end_location: SourceLocation(pos=196, lineno=8, colno=46) + prelim: + + location: SourceLocation(pos=151, lineno=8, colno=1) + end_location: SourceLocation(pos=155, lineno=8, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=156, lineno=8, colno=6) + end_location: SourceLocation(pos=167, lineno=8, colno=17) + name: 'FunctionTag' + parameters: + + type: + + location: SourceLocation(pos=170, lineno=8, colno=20) + end_location: SourceLocation(pos=196, lineno=8, colno=46) + attributes: + + unattributed_type: + + location: SourceLocation(pos=170, lineno=8, colno=20) + end_location: SourceLocation(pos=173, lineno=8, colno=23) + path: + + location: SourceLocation(pos=170, lineno=8, colno=20) + end_location: SourceLocation(pos=173, lineno=8, colno=23) + absolute: False + segments: + + location: SourceLocation(pos=170, lineno=8, colno=20) + end_location: SourceLocation(pos=173, lineno=8, colno=23) + name: 'Tag' + modifiers: + + location: SourceLocation(pos=173, lineno=8, colno=23) + end_location: SourceLocation(pos=196, lineno=8, colno=46) + arguments: + + location: SourceLocation(pos=174, lineno=8, colno=24) + end_location: SourceLocation(pos=195, lineno=8, colno=45) + attributes: + + location: SourceLocation(pos=174, lineno=8, colno=24) + end_location: SourceLocation(pos=188, lineno=8, colno=38) + identifier: + + location: SourceLocation(pos=176, lineno=8, colno=26) + end_location: SourceLocation(pos=178, lineno=8, colno=28) + name: 'id' + value: + + location: SourceLocation(pos=179, lineno=8, colno=29) + end_location: SourceLocation(pos=187, lineno=8, colno=37) + attributes: + + unattributed_type: + + location: SourceLocation(pos=179, lineno=8, colno=29) + end_location: SourceLocation(pos=187, lineno=8, colno=37) + path: + + location: SourceLocation(pos=179, lineno=8, colno=29) + end_location: SourceLocation(pos=187, lineno=8, colno=37) + absolute: False + segments: + + location: SourceLocation(pos=179, lineno=8, colno=29) + end_location: SourceLocation(pos=187, lineno=8, colno=37) + name: 'function' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=189, lineno=8, colno=39) + end_location: SourceLocation(pos=195, lineno=8, colno=45) + length: None + modifiers: + + + location: SourceLocation(pos=197, lineno=9, colno=1) + end_location: SourceLocation(pos=234, lineno=9, colno=38) + prelim: + + location: SourceLocation(pos=197, lineno=9, colno=1) + end_location: SourceLocation(pos=201, lineno=9, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=202, lineno=9, colno=6) + end_location: SourceLocation(pos=209, lineno=9, colno=13) + name: 'ItemTag' + parameters: + + type: + + location: SourceLocation(pos=212, lineno=9, colno=16) + end_location: SourceLocation(pos=234, lineno=9, colno=38) + attributes: + + unattributed_type: + + location: SourceLocation(pos=212, lineno=9, colno=16) + end_location: SourceLocation(pos=215, lineno=9, colno=19) + path: + + location: SourceLocation(pos=212, lineno=9, colno=16) + end_location: SourceLocation(pos=215, lineno=9, colno=19) + absolute: False + segments: + + location: SourceLocation(pos=212, lineno=9, colno=16) + end_location: SourceLocation(pos=215, lineno=9, colno=19) + name: 'Tag' + modifiers: + + location: SourceLocation(pos=215, lineno=9, colno=19) + end_location: SourceLocation(pos=234, lineno=9, colno=38) + arguments: + + location: SourceLocation(pos=216, lineno=9, colno=20) + end_location: SourceLocation(pos=233, lineno=9, colno=37) + attributes: + + location: SourceLocation(pos=216, lineno=9, colno=20) + end_location: SourceLocation(pos=226, lineno=9, colno=30) + identifier: + + location: SourceLocation(pos=218, lineno=9, colno=22) + end_location: SourceLocation(pos=220, lineno=9, colno=24) + name: 'id' + value: + + location: SourceLocation(pos=221, lineno=9, colno=25) + end_location: SourceLocation(pos=225, lineno=9, colno=29) + attributes: + + unattributed_type: + + location: SourceLocation(pos=221, lineno=9, colno=25) + end_location: SourceLocation(pos=225, lineno=9, colno=29) + path: + + location: SourceLocation(pos=221, lineno=9, colno=25) + end_location: SourceLocation(pos=225, lineno=9, colno=29) + absolute: False + segments: + + location: SourceLocation(pos=221, lineno=9, colno=25) + end_location: SourceLocation(pos=225, lineno=9, colno=29) + name: 'item' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=227, lineno=9, colno=31) + end_location: SourceLocation(pos=233, lineno=9, colno=37) + length: None + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_5__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_5__0.txt new file mode 100644 index 000000000..9f2c727eb --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_5__0.txt @@ -0,0 +1,245 @@ +struct Foo { + id: string, + cow_data: minecraft:entity[cow], + dynamic_entity_data: minecraft:entity[[id]], + command: minecraft:block[command_block][Command], + dynamic_memories: minecraft:entity[[id]][Brain][memories], +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=218, lineno=7, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=218, lineno=7, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + name: 'Foo' + fields: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=24, lineno=2, colno=12) + prelim: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=25, lineno=2, colno=13) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=14, lineno=2, colno=2) + end_location: SourceLocation(pos=16, lineno=2, colno=4) + name: 'id' + optional: False + type: + + location: SourceLocation(pos=18, lineno=2, colno=6) + end_location: SourceLocation(pos=24, lineno=2, colno=12) + attributes: + + unattributed_type: + + location: SourceLocation(pos=18, lineno=2, colno=6) + end_location: SourceLocation(pos=24, lineno=2, colno=12) + length: None + modifiers: + + + location: SourceLocation(pos=27, lineno=3, colno=2) + end_location: SourceLocation(pos=58, lineno=3, colno=33) + prelim: + + location: SourceLocation(pos=27, lineno=3, colno=2) + end_location: SourceLocation(pos=59, lineno=3, colno=34) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=27, lineno=3, colno=2) + end_location: SourceLocation(pos=35, lineno=3, colno=10) + name: 'cow_data' + optional: False + type: + + location: SourceLocation(pos=37, lineno=3, colno=12) + end_location: SourceLocation(pos=58, lineno=3, colno=33) + attributes: + + unattributed_type: + + location: SourceLocation(pos=37, lineno=3, colno=12) + end_location: SourceLocation(pos=58, lineno=3, colno=33) + resource_location: + + location: SourceLocation(pos=37, lineno=3, colno=12) + end_location: SourceLocation(pos=53, lineno=3, colno=28) + value: 'minecraft:entity' + indices: + + location: SourceLocation(pos=54, lineno=3, colno=29) + end_location: SourceLocation(pos=57, lineno=3, colno=32) + name: 'cow' + modifiers: + + + location: SourceLocation(pos=61, lineno=4, colno=2) + end_location: SourceLocation(pos=104, lineno=4, colno=45) + prelim: + + location: SourceLocation(pos=61, lineno=4, colno=2) + end_location: SourceLocation(pos=105, lineno=4, colno=46) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=61, lineno=4, colno=2) + end_location: SourceLocation(pos=80, lineno=4, colno=21) + name: 'dynamic_entity_data' + optional: False + type: + + location: SourceLocation(pos=82, lineno=4, colno=23) + end_location: SourceLocation(pos=104, lineno=4, colno=45) + attributes: + + unattributed_type: + + location: SourceLocation(pos=82, lineno=4, colno=23) + end_location: SourceLocation(pos=104, lineno=4, colno=45) + resource_location: + + location: SourceLocation(pos=82, lineno=4, colno=23) + end_location: SourceLocation(pos=98, lineno=4, colno=39) + value: 'minecraft:entity' + indices: + + location: SourceLocation(pos=99, lineno=4, colno=40) + end_location: SourceLocation(pos=103, lineno=4, colno=44) + accessors: + + location: SourceLocation(pos=100, lineno=4, colno=41) + end_location: SourceLocation(pos=102, lineno=4, colno=43) + name: 'id' + modifiers: + + + location: SourceLocation(pos=107, lineno=5, colno=2) + end_location: SourceLocation(pos=155, lineno=5, colno=50) + prelim: + + location: SourceLocation(pos=107, lineno=5, colno=2) + end_location: SourceLocation(pos=156, lineno=5, colno=51) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=107, lineno=5, colno=2) + end_location: SourceLocation(pos=114, lineno=5, colno=9) + name: 'command' + optional: False + type: + + location: SourceLocation(pos=116, lineno=5, colno=11) + end_location: SourceLocation(pos=155, lineno=5, colno=50) + attributes: + + unattributed_type: + + location: SourceLocation(pos=116, lineno=5, colno=11) + end_location: SourceLocation(pos=146, lineno=5, colno=41) + resource_location: + + location: SourceLocation(pos=116, lineno=5, colno=11) + end_location: SourceLocation(pos=131, lineno=5, colno=26) + value: 'minecraft:block' + indices: + + location: SourceLocation(pos=132, lineno=5, colno=27) + end_location: SourceLocation(pos=145, lineno=5, colno=40) + name: 'command_block' + modifiers: + + location: SourceLocation(pos=146, lineno=5, colno=41) + end_location: SourceLocation(pos=155, lineno=5, colno=50) + indices: + + location: SourceLocation(pos=147, lineno=5, colno=42) + end_location: SourceLocation(pos=154, lineno=5, colno=49) + name: 'Command' + + location: SourceLocation(pos=158, lineno=6, colno=2) + end_location: SourceLocation(pos=215, lineno=6, colno=59) + prelim: + + location: SourceLocation(pos=158, lineno=6, colno=2) + end_location: SourceLocation(pos=216, lineno=6, colno=60) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=158, lineno=6, colno=2) + end_location: SourceLocation(pos=174, lineno=6, colno=18) + name: 'dynamic_memories' + optional: False + type: + + location: SourceLocation(pos=176, lineno=6, colno=20) + end_location: SourceLocation(pos=215, lineno=6, colno=59) + attributes: + + unattributed_type: + + location: SourceLocation(pos=176, lineno=6, colno=20) + end_location: SourceLocation(pos=198, lineno=6, colno=42) + resource_location: + + location: SourceLocation(pos=176, lineno=6, colno=20) + end_location: SourceLocation(pos=192, lineno=6, colno=36) + value: 'minecraft:entity' + indices: + + location: SourceLocation(pos=193, lineno=6, colno=37) + end_location: SourceLocation(pos=197, lineno=6, colno=41) + accessors: + + location: SourceLocation(pos=194, lineno=6, colno=38) + end_location: SourceLocation(pos=196, lineno=6, colno=40) + name: 'id' + modifiers: + + location: SourceLocation(pos=198, lineno=6, colno=42) + end_location: SourceLocation(pos=205, lineno=6, colno=49) + indices: + + location: SourceLocation(pos=199, lineno=6, colno=43) + end_location: SourceLocation(pos=204, lineno=6, colno=48) + name: 'Brain' + + location: SourceLocation(pos=205, lineno=6, colno=49) + end_location: SourceLocation(pos=215, lineno=6, colno=59) + indices: + + location: SourceLocation(pos=206, lineno=6, colno=50) + end_location: SourceLocation(pos=214, lineno=6, colno=58) + name: 'memories' diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_6__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_6__0.txt new file mode 100644 index 000000000..9d0e28c88 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_6__0.txt @@ -0,0 +1,45 @@ +type AnyEntity = minecraft:entity[%fallback] +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=4, lineno=1, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=5, lineno=1, colno=6) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + name: 'AnyEntity' + parameters: + + type: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + attributes: + + unattributed_type: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=44, lineno=1, colno=45) + resource_location: + + location: SourceLocation(pos=17, lineno=1, colno=18) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + value: 'minecraft:entity' + indices: + + location: SourceLocation(pos=34, lineno=1, colno=35) + end_location: SourceLocation(pos=43, lineno=1, colno=44) + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_7__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_7__0.txt new file mode 100644 index 000000000..fb4b853f7 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_7__0.txt @@ -0,0 +1,229 @@ +struct RandomIntGenerator { + type?: ("uniform" | "binomial" | "constant"), + ...minecraft:random_int_generator[[type]], +} + +dispatch minecraft:random_int_generator[uniform, %none] to struct { min?: int, max?: int } +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=212, lineno=6, colno=91) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=120, lineno=4, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + name: 'RandomIntGenerator' + fields: + + location: SourceLocation(pos=29, lineno=2, colno=2) + end_location: SourceLocation(pos=73, lineno=2, colno=46) + prelim: + + location: SourceLocation(pos=29, lineno=2, colno=2) + end_location: SourceLocation(pos=74, lineno=2, colno=47) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=29, lineno=2, colno=2) + end_location: SourceLocation(pos=33, lineno=2, colno=6) + name: 'type' + optional: True + type: + + location: SourceLocation(pos=36, lineno=2, colno=9) + end_location: SourceLocation(pos=73, lineno=2, colno=46) + attributes: + + unattributed_type: + + location: SourceLocation(pos=36, lineno=2, colno=9) + end_location: SourceLocation(pos=73, lineno=2, colno=46) + types: + + location: SourceLocation(pos=37, lineno=2, colno=10) + end_location: SourceLocation(pos=46, lineno=2, colno=19) + attributes: + + unattributed_type: + + location: SourceLocation(pos=37, lineno=2, colno=10) + end_location: SourceLocation(pos=46, lineno=2, colno=19) + value: 'uniform' + modifiers: + + + location: SourceLocation(pos=49, lineno=2, colno=22) + end_location: SourceLocation(pos=59, lineno=2, colno=32) + attributes: + + unattributed_type: + + location: SourceLocation(pos=49, lineno=2, colno=22) + end_location: SourceLocation(pos=59, lineno=2, colno=32) + value: 'binomial' + modifiers: + + + location: SourceLocation(pos=62, lineno=2, colno=35) + end_location: SourceLocation(pos=72, lineno=2, colno=45) + attributes: + + unattributed_type: + + location: SourceLocation(pos=62, lineno=2, colno=35) + end_location: SourceLocation(pos=72, lineno=2, colno=45) + value: 'constant' + modifiers: + + modifiers: + + + location: SourceLocation(pos=76, lineno=3, colno=2) + end_location: SourceLocation(pos=117, lineno=3, colno=43) + attributes: + + type: + + location: SourceLocation(pos=79, lineno=3, colno=5) + end_location: SourceLocation(pos=117, lineno=3, colno=43) + attributes: + + unattributed_type: + + location: SourceLocation(pos=79, lineno=3, colno=5) + end_location: SourceLocation(pos=117, lineno=3, colno=43) + resource_location: + + location: SourceLocation(pos=79, lineno=3, colno=5) + end_location: SourceLocation(pos=109, lineno=3, colno=35) + value: 'minecraft:random_int_generator' + indices: + + location: SourceLocation(pos=110, lineno=3, colno=36) + end_location: SourceLocation(pos=116, lineno=3, colno=42) + accessors: + + location: SourceLocation(pos=111, lineno=3, colno=37) + end_location: SourceLocation(pos=115, lineno=3, colno=41) + name: 'type' + modifiers: + + + location: SourceLocation(pos=122, lineno=6, colno=1) + end_location: SourceLocation(pos=212, lineno=6, colno=91) + attributes: + + resource_location: + + location: SourceLocation(pos=131, lineno=6, colno=10) + end_location: SourceLocation(pos=161, lineno=6, colno=40) + value: 'minecraft:random_int_generator' + indices: + + location: SourceLocation(pos=162, lineno=6, colno=41) + end_location: SourceLocation(pos=169, lineno=6, colno=48) + name: 'uniform' + + location: SourceLocation(pos=171, lineno=6, colno=50) + end_location: SourceLocation(pos=176, lineno=6, colno=55) + parameters: + + type: + + location: SourceLocation(pos=181, lineno=6, colno=60) + end_location: SourceLocation(pos=212, lineno=6, colno=91) + attributes: + + unattributed_type: + + location: SourceLocation(pos=181, lineno=6, colno=60) + end_location: SourceLocation(pos=212, lineno=6, colno=91) + prelim: + + location: SourceLocation(pos=181, lineno=6, colno=60) + end_location: SourceLocation(pos=187, lineno=6, colno=66) + doc_comments: + + attributes: + + identifier: None + fields: + + location: SourceLocation(pos=190, lineno=6, colno=69) + end_location: SourceLocation(pos=199, lineno=6, colno=78) + prelim: + + location: SourceLocation(pos=190, lineno=6, colno=69) + end_location: SourceLocation(pos=212, lineno=6, colno=91) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=190, lineno=6, colno=69) + end_location: SourceLocation(pos=193, lineno=6, colno=72) + name: 'min' + optional: True + type: + + location: SourceLocation(pos=196, lineno=6, colno=75) + end_location: SourceLocation(pos=199, lineno=6, colno=78) + attributes: + + unattributed_type: + + location: SourceLocation(pos=196, lineno=6, colno=75) + end_location: SourceLocation(pos=199, lineno=6, colno=78) + name: 'int' + constraint: None + modifiers: + + + location: SourceLocation(pos=201, lineno=6, colno=80) + end_location: SourceLocation(pos=210, lineno=6, colno=89) + prelim: + + location: SourceLocation(pos=201, lineno=6, colno=80) + end_location: SourceLocation(pos=212, lineno=6, colno=91) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=201, lineno=6, colno=80) + end_location: SourceLocation(pos=204, lineno=6, colno=83) + name: 'max' + optional: True + type: + + location: SourceLocation(pos=207, lineno=6, colno=86) + end_location: SourceLocation(pos=210, lineno=6, colno=89) + attributes: + + unattributed_type: + + location: SourceLocation(pos=207, lineno=6, colno=86) + end_location: SourceLocation(pos=210, lineno=6, colno=89) + name: 'int' + constraint: None + modifiers: + + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_8__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_8__0.txt new file mode 100644 index 000000000..63e7681e9 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_8__0.txt @@ -0,0 +1,36 @@ +dispatch minecraft:block[%unknown] to () +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + attributes: + + resource_location: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + value: 'minecraft:block' + indices: + + location: SourceLocation(pos=25, lineno=1, colno=26) + end_location: SourceLocation(pos=33, lineno=1, colno=34) + parameters: + + type: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + attributes: + + unattributed_type: + + location: SourceLocation(pos=38, lineno=1, colno=39) + end_location: SourceLocation(pos=40, lineno=1, colno=41) + types: + + modifiers: + diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_9__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_9__0.txt new file mode 100644 index 000000000..961eebfe3 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_9__0.txt @@ -0,0 +1,149 @@ +struct DebugStick { + DebugProperty: struct { + [#[id=block] string]: mcdoc:block_state_name[[%key]], // Get the type of the block state names of the block stored in the key. + }, +} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=179, lineno=5, colno=2) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=179, lineno=5, colno=2) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=17, lineno=1, colno=18) + name: 'DebugStick' + fields: + + location: SourceLocation(pos=21, lineno=2, colno=2) + end_location: SourceLocation(pos=176, lineno=4, colno=3) + prelim: + + location: SourceLocation(pos=21, lineno=2, colno=2) + end_location: SourceLocation(pos=44, lineno=2, colno=25) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=21, lineno=2, colno=2) + end_location: SourceLocation(pos=34, lineno=2, colno=15) + name: 'DebugProperty' + optional: False + type: + + location: SourceLocation(pos=36, lineno=2, colno=17) + end_location: SourceLocation(pos=176, lineno=4, colno=3) + attributes: + + unattributed_type: + + location: SourceLocation(pos=36, lineno=2, colno=17) + end_location: SourceLocation(pos=176, lineno=4, colno=3) + prelim: + + location: SourceLocation(pos=36, lineno=2, colno=17) + end_location: SourceLocation(pos=42, lineno=2, colno=23) + doc_comments: + + attributes: + + identifier: None + fields: + + location: SourceLocation(pos=47, lineno=3, colno=3) + end_location: SourceLocation(pos=99, lineno=3, colno=55) + prelim: + + location: SourceLocation(pos=47, lineno=3, colno=3) + end_location: SourceLocation(pos=48, lineno=3, colno=4) + doc_comments: + + attributes: + + key: + + location: SourceLocation(pos=47, lineno=3, colno=3) + end_location: SourceLocation(pos=67, lineno=3, colno=23) + type: + + location: SourceLocation(pos=48, lineno=3, colno=4) + end_location: SourceLocation(pos=66, lineno=3, colno=22) + attributes: + + location: SourceLocation(pos=48, lineno=3, colno=4) + end_location: SourceLocation(pos=59, lineno=3, colno=15) + identifier: + + location: SourceLocation(pos=50, lineno=3, colno=6) + end_location: SourceLocation(pos=52, lineno=3, colno=8) + name: 'id' + value: + + location: SourceLocation(pos=53, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=14) + attributes: + + unattributed_type: + + location: SourceLocation(pos=53, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=14) + path: + + location: SourceLocation(pos=53, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=14) + absolute: False + segments: + + location: SourceLocation(pos=53, lineno=3, colno=9) + end_location: SourceLocation(pos=58, lineno=3, colno=14) + name: 'block' + modifiers: + + unattributed_type: + + location: SourceLocation(pos=60, lineno=3, colno=16) + end_location: SourceLocation(pos=66, lineno=3, colno=22) + length: None + modifiers: + + optional: False + type: + + location: SourceLocation(pos=69, lineno=3, colno=25) + end_location: SourceLocation(pos=99, lineno=3, colno=55) + attributes: + + unattributed_type: + + location: SourceLocation(pos=69, lineno=3, colno=25) + end_location: SourceLocation(pos=99, lineno=3, colno=55) + resource_location: + + location: SourceLocation(pos=69, lineno=3, colno=25) + end_location: SourceLocation(pos=91, lineno=3, colno=47) + value: 'mcdoc:block_state_name' + indices: + + location: SourceLocation(pos=92, lineno=3, colno=48) + end_location: SourceLocation(pos=98, lineno=3, colno=54) + accessors: + + location: SourceLocation(pos=93, lineno=3, colno=49) + end_location: SourceLocation(pos=97, lineno=3, colno=53) + modifiers: + + modifiers: + diff --git a/packages/mecha/tests/test_mcdoc.py b/packages/mecha/tests/test_mcdoc.py new file mode 100644 index 000000000..628c42bf2 --- /dev/null +++ b/packages/mecha/tests/test_mcdoc.py @@ -0,0 +1,19 @@ +from pathlib import Path + +import pytest +from pytest_insta import SnapshotFixture +from tokenstream import TokenStream + +from mecha.contrib.validation import parse_mcdoc + +MCDOC_EXAMPLES = Path("tests/resources/mcdoc_examples.txt").read_text().split("###\n") + + +@pytest.mark.parametrize( + "source", + MCDOC_EXAMPLES, + ids=range(len(MCDOC_EXAMPLES)), +) +def test_parse(snapshot: SnapshotFixture, source: str): + mcdoc = parse_mcdoc(TokenStream(source)) + assert snapshot() == f"{source}---\n{mcdoc.dump()}\n" From c06cf551c044d46afa6a8548a83ded26888ed98e Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 7 May 2023 00:52:21 +0000 Subject: [PATCH 1166/1554] 0.71.0 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 401237658..e6ced00f0 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.71.0 (2023-05-07) +### Feature +* Initial mcdoc parser ([`b732822`](https://github.com/mcbeet/mecha/commit/b73282253427399cb5358eb46c3df53f93b61266)) + ## v0.70.0 (2023-05-03) ### Feature * Reusable abstract ast and dispatch ([`d4cfe86`](https://github.com/mcbeet/mecha/commit/d4cfe86a059c4c66589358c440c79d60cf2d02f3)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 127ead2dc..5d2ce1a93 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.70.0" +__version__ = "0.71.0" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 257546fdb..2e16bab93 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.70.0" +version = "0.71.0" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From fc9c519dbf7a771cedf68e0ebe7f4b4d62b8a574 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sun, 7 May 2023 03:04:13 +0200 Subject: [PATCH 1167/1554] fix: handle mcdoc super --- .../mecha/mecha/contrib/validation/mcdoc.py | 34 ++++++--- .../mecha/tests/resources/mcdoc_examples.txt | 4 + .../tests/snapshots/mcdoc__parse_17__0.txt | 76 +++++++++++++++++++ 3 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 packages/mecha/tests/snapshots/mcdoc__parse_17__0.txt diff --git a/packages/mecha/mecha/contrib/validation/mcdoc.py b/packages/mecha/mecha/contrib/validation/mcdoc.py index 999cf254b..02cdddadf 100644 --- a/packages/mecha/mecha/contrib/validation/mcdoc.py +++ b/packages/mecha/mecha/contrib/validation/mcdoc.py @@ -13,6 +13,8 @@ "McdocResourceLocation", "McdocIdentifier", "McdocPath", + "McdocPathSegment", + "McdocSuper", "McdocType", "McDocUnattributedType", "McdocTypeModifier", @@ -87,7 +89,7 @@ PATTERN_INTEGER_RANGE: str = rf"(?:{PATTERN_INTEGER})(?:{PATTERN_RANGE_DELIMITER})(?:{PATTERN_INTEGER})?|(?:{PATTERN_RANGE_DELIMITER})?(?:{PATTERN_INTEGER})" PATTERN_FLOAT_RANGE: str = rf"(?:{PATTERN_FLOAT})(?:{PATTERN_RANGE_DELIMITER})(?:{PATTERN_FLOAT})?|(?:{PATTERN_RANGE_DELIMITER})?(?:{PATTERN_FLOAT})" PATTERN_STRING: str = r'"(?:[^"\\]|\\[bfnrt\\"])*"' -PATTERN_RESOURCE_LOCATION: str = r"[a-z0-9_.-]*:[a-z0-9_.-]*(?:/[a-z0-9_.-]*)*" +PATTERN_RESOURCE_LOCATION: str = r"[a-z0-9_.-]*:(?!:)[a-z0-9_.-]*(?:/[a-z0-9_.-]*)*" PATTERN_IDENTIFIER: str = r"[a-zA-Z0-9_]+" @@ -223,7 +225,15 @@ class McdocPath(McdocNode): """Mcdoc path node.""" absolute: bool = required_field() - segments: McdocChildren[McdocIdentifier] = required_field() + segments: McdocChildren["McdocPathSegment"] = required_field() + + +McdocPathSegment: TypeAlias = Union[McdocIdentifier, "McdocSuper"] + + +@dataclass(frozen=True, slots=True) +class McdocSuper(McdocNode): + """Mcdoc super node.""" @dataclass(frozen=True, slots=True) @@ -675,17 +685,23 @@ def parse_identifier(stream: TokenStream) -> McdocIdentifier: def parse_path(stream: TokenStream) -> McdocPath: - with stream.syntax(delimiter=r"::"): - token = stream.get("delimiter") + with stream.syntax(delimiter=r"::", super=r"super\b"): + start = stream.get("delimiter") - absolute = bool(token) - segments: List[McdocIdentifier] = [parse_identifier(stream)] + absolute = bool(start) + segments: List[McdocPathSegment] = [] - while stream.get("delimiter"): - segments.append(parse_identifier(stream)) + while True: + if token := stream.get("super"): + node = set_location(McdocSuper(), token) + else: + node = parse_identifier(stream) + segments.append(node) + if not stream.get("delimiter"): + break node = McdocPath(absolute=absolute, segments=McdocChildren(segments)) - return set_location(node, token or segments[0], segments[-1]) + return set_location(node, start or segments[0], segments[-1]) def parse_type(stream: TokenStream) -> McdocType: diff --git a/packages/mecha/tests/resources/mcdoc_examples.txt b/packages/mecha/tests/resources/mcdoc_examples.txt index fc3f64dce..616c214ce 100644 --- a/packages/mecha/tests/resources/mcdoc_examples.txt +++ b/packages/mecha/tests/resources/mcdoc_examples.txt @@ -112,3 +112,7 @@ struct Foo { }] evilUUID2: int[] @ 4 } +### +struct Foo {} + +type Bar = super::super::qux::Something diff --git a/packages/mecha/tests/snapshots/mcdoc__parse_17__0.txt b/packages/mecha/tests/snapshots/mcdoc__parse_17__0.txt new file mode 100644 index 000000000..81b58f9a6 --- /dev/null +++ b/packages/mecha/tests/snapshots/mcdoc__parse_17__0.txt @@ -0,0 +1,76 @@ +struct Foo {} + +type Bar = super::super::qux::Something +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=40) + items: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + prelim: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=6, lineno=1, colno=7) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=7, lineno=1, colno=8) + end_location: SourceLocation(pos=10, lineno=1, colno=11) + name: 'Foo' + fields: + + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=54, lineno=3, colno=40) + prelim: + + location: SourceLocation(pos=15, lineno=3, colno=1) + end_location: SourceLocation(pos=19, lineno=3, colno=5) + doc_comments: + + attributes: + + identifier: + + location: SourceLocation(pos=20, lineno=3, colno=6) + end_location: SourceLocation(pos=23, lineno=3, colno=9) + name: 'Bar' + parameters: + + type: + + location: SourceLocation(pos=26, lineno=3, colno=12) + end_location: SourceLocation(pos=54, lineno=3, colno=40) + attributes: + + unattributed_type: + + location: SourceLocation(pos=26, lineno=3, colno=12) + end_location: SourceLocation(pos=54, lineno=3, colno=40) + path: + + location: SourceLocation(pos=26, lineno=3, colno=12) + end_location: SourceLocation(pos=54, lineno=3, colno=40) + absolute: False + segments: + + location: SourceLocation(pos=26, lineno=3, colno=12) + end_location: SourceLocation(pos=31, lineno=3, colno=17) + + location: SourceLocation(pos=33, lineno=3, colno=19) + end_location: SourceLocation(pos=38, lineno=3, colno=24) + + location: SourceLocation(pos=40, lineno=3, colno=26) + end_location: SourceLocation(pos=43, lineno=3, colno=29) + name: 'qux' + + location: SourceLocation(pos=45, lineno=3, colno=31) + end_location: SourceLocation(pos=54, lineno=3, colno=40) + name: 'Something' + modifiers: + From 419d9ab75efef639d83663759afa9407b712768e Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 7 May 2023 01:05:04 +0000 Subject: [PATCH 1168/1554] 0.71.1 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index e6ced00f0..9c228f958 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.71.1 (2023-05-07) +### Fix +* Handle mcdoc super ([`7adfb86`](https://github.com/mcbeet/mecha/commit/7adfb8660744476b310b1e4a7ceff3eb8c76cfdc)) + ## v0.71.0 (2023-05-07) ### Feature * Initial mcdoc parser ([`b732822`](https://github.com/mcbeet/mecha/commit/b73282253427399cb5358eb46c3df53f93b61266)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 5d2ce1a93..05b871e32 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.71.0" +__version__ = "0.71.1" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 2e16bab93..85ae0e9ea 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.71.0" +version = "0.71.1" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From 86673fd722591397ec9b7dc7e418aedb5229fb18 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Mon, 8 May 2023 02:53:04 +0200 Subject: [PATCH 1169/1554] fix: swap mcdoc number patterns --- packages/mecha/mecha/contrib/validation/mcdoc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mecha/mecha/contrib/validation/mcdoc.py b/packages/mecha/mecha/contrib/validation/mcdoc.py index 02cdddadf..5c172371c 100644 --- a/packages/mecha/mecha/contrib/validation/mcdoc.py +++ b/packages/mecha/mecha/contrib/validation/mcdoc.py @@ -82,8 +82,8 @@ McdocNodeType = TypeVar("McdocNodeType", bound="McdocNode", covariant=True) -PATTERN_INTEGER: str = r"0|[-+]?[1-9][0-9]*" -PATTERN_FLOAT: str = r"[-+]?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][-+]?[0-9]+)?" +PATTERN_INTEGER: str = r"[-+]?[1-9][0-9]*|0" +PATTERN_FLOAT: str = r"[-+]?(?:[0-9]*\.[0-9]+|[0-9]+)(?:[eE][-+]?[0-9]+)?" PATTERN_TYPED_NUMBER: str = rf"{PATTERN_FLOAT}[bBdDfFlLsS]?" PATTERN_RANGE_DELIMITER: str = r" Date: Mon, 8 May 2023 00:53:54 +0000 Subject: [PATCH 1170/1554] 0.71.2 Automatically generated by python-semantic-release --- packages/mecha/CHANGELOG.md | 4 ++++ packages/mecha/mecha/__init__.py | 2 +- packages/mecha/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/mecha/CHANGELOG.md b/packages/mecha/CHANGELOG.md index 9c228f958..bf97872fa 100644 --- a/packages/mecha/CHANGELOG.md +++ b/packages/mecha/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.71.2 (2023-05-08) +### Fix +* Swap mcdoc number patterns ([`ba18029`](https://github.com/mcbeet/mecha/commit/ba18029f58eedbe5b5f4461e4c053e21b9c4deec)) + ## v0.71.1 (2023-05-07) ### Fix * Handle mcdoc super ([`7adfb86`](https://github.com/mcbeet/mecha/commit/7adfb8660744476b310b1e4a7ceff3eb8c76cfdc)) diff --git a/packages/mecha/mecha/__init__.py b/packages/mecha/mecha/__init__.py index 05b871e32..93579d5e2 100644 --- a/packages/mecha/mecha/__init__.py +++ b/packages/mecha/mecha/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.71.1" +__version__ = "0.71.2" from .api import * diff --git a/packages/mecha/pyproject.toml b/packages/mecha/pyproject.toml index 85ae0e9ea..9de9cab1e 100644 --- a/packages/mecha/pyproject.toml +++ b/packages/mecha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mecha" -version = "0.71.1" +version = "0.71.2" description = "A powerful Minecraft command library" authors = ["Valentin Berlier "] license = "MIT" From e4ac4859177e2a910ba8534bf2643c68c0b2f499 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Fri, 19 May 2023 01:36:06 +0200 Subject: [PATCH 1171/1554] feat: add runtime nesting info --- packages/bolt/bolt/codegen.py | 54 +++++++++++++--- packages/bolt/bolt/emit.py | 12 +++- packages/bolt/examples/bolt_nesting/beet.yml | 6 ++ .../src/data/demo/functions/foo.mcfunction | 21 +++++++ .../tests/snapshots/bolt__parse_103__1.txt | 13 ++-- .../tests/snapshots/bolt__parse_117__1.txt | 13 ++-- .../tests/snapshots/bolt__parse_130__1.txt | 24 +++++--- .../tests/snapshots/bolt__parse_139__1.txt | 61 +++++++++++-------- .../tests/snapshots/bolt__parse_143__1.txt | 11 ++-- .../tests/snapshots/bolt__parse_144__1.txt | 13 ++-- .../tests/snapshots/bolt__parse_174__1.txt | 11 ++-- .../tests/snapshots/bolt__parse_175__1.txt | 9 +-- .../tests/snapshots/bolt__parse_176__1.txt | 9 +-- .../tests/snapshots/bolt__parse_184__1.txt | 9 +-- .../tests/snapshots/bolt__parse_229__1.txt | 9 ++- .../tests/snapshots/bolt__parse_231__1.txt | 8 ++- .../tests/snapshots/bolt__parse_355__1.txt | 8 ++- .../tests/snapshots/bolt__parse_42__1.txt | 33 +++++----- .../tests/snapshots/bolt__parse_43__1.txt | 21 ++++--- .../tests/snapshots/bolt__parse_44__1.txt | 27 ++++---- .../tests/snapshots/bolt__parse_45__1.txt | 17 +++--- .../tests/snapshots/bolt__parse_46__1.txt | 41 +++++++------ .../examples__build_bolt_nesting__0.pack.md | 31 ++++++++++ 23 files changed, 305 insertions(+), 156 deletions(-) create mode 100644 packages/bolt/examples/bolt_nesting/beet.yml create mode 100644 packages/bolt/examples/bolt_nesting/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_nesting__0.pack.md diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 9ffd63a0c..8eeb23919 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -257,6 +257,14 @@ def else_statement(self): with self.if_statement(self.last_condition): yield + def enclose(self, code: str, from_index: int): + """Enclose lines starting from the given index.""" + self.lines[from_index:] = [ + line if line.startswith("!") else f" {line}" + for line in self.lines[from_index:] + ] + self.lines.insert(from_index, f"{self.indentation}{code}\n") + @dataclass class ChildrenCollector: @@ -302,14 +310,7 @@ class RootCommandCollector(CommandCollector): def flush(self) -> str: commands = self.acc.make_variable() - self.acc.lines[self.start_index :] = [ - line if line.startswith("!") else f" {line}" - for line in self.acc.lines[self.start_index :] - ] - self.acc.lines.insert( - self.start_index, - f"{self.acc.indentation}with _bolt_runtime.scope() as {commands}:\n", - ) + self.acc.enclose(f"with _bolt_runtime.scope() as {commands}:", self.start_index) return self.acc.helper("children", commands) @@ -351,7 +352,7 @@ def visit_single( def visit_multiple( - children: AstChildren[AstNode], + children: Tuple[AstNode, ...], acc: Accumulator, children_collector: Type[ChildrenCollector] = ChildrenCollector, ) -> Generator[AstNode, Optional[List[str]], Optional[str]]: @@ -502,6 +503,41 @@ def root( return None return [result] + @rule(AstCommand) + def command( + self, + node: AstCommand, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + if not node.arguments: + return None + + if not isinstance(node.arguments[-1], (AstCommand, AstRoot)): + arguments = yield from visit_multiple(node.arguments, acc) + if arguments is None: + return None + return [acc.replace(acc.make_ref(node), arguments=arguments)] + + arguments = yield from visit_multiple(node.arguments[:-1], acc) + nesting_index = len(acc.lines) + nesting = yield from visit_single(node.arguments[-1]) + + if nesting is None: + if arguments is None: + return None + nesting = acc.make_ref(node.arguments[-1]) + else: + if arguments is None and len(node.arguments) > 1: + arguments = acc.make_ref_slice(node.arguments[:-1]) + push_arguments = f", *{arguments}" if arguments else "" + acc.enclose( + f"with _bolt_runtime.push_nesting({node.identifier!r}{push_arguments}):", + nesting_index, + ) + + arguments = acc.children([f"*{arguments}", nesting] if arguments else [nesting]) + return [acc.replace(acc.make_ref(node), arguments=arguments)] + @rule(AstCommand, identifier="statement") def statement( self, diff --git a/packages/bolt/bolt/emit.py b/packages/bolt/bolt/emit.py index 569d4183c..221def3c8 100644 --- a/packages/bolt/bolt/emit.py +++ b/packages/bolt/bolt/emit.py @@ -4,7 +4,7 @@ from contextlib import contextmanager -from typing import Any, Callable, Generator, Iterator, List, Optional, ParamSpec +from typing import Any, Callable, Generator, Iterator, List, Optional, ParamSpec, Tuple from mecha import AstCommand, AstNode, AstRoot @@ -17,9 +17,11 @@ class CommandEmitter: """Command emitter.""" commands: List[AstCommand] + nesting: List[Tuple[str, Tuple[AstNode, ...]]] def __init__(self): self.commands = [] + self.nesting = [] @contextmanager def scope( @@ -78,3 +80,11 @@ def capture_output( raise TypeError(msg) return output + + @contextmanager + def push_nesting(self, identifier: str, *arguments: AstNode): + self.nesting.append((identifier, arguments)) + try: + yield + finally: + self.nesting.pop() diff --git a/packages/bolt/examples/bolt_nesting/beet.yml b/packages/bolt/examples/bolt_nesting/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_nesting/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_nesting/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_nesting/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..8063c2e32 --- /dev/null +++ b/packages/bolt/examples/bolt_nesting/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,21 @@ +from contextlib import contextmanager +from bolt import Runtime + +runtime = ctx.inject(Runtime) +say runtime.nesting + +@contextmanager +def stuff(): + if score foo temp matches 77: + yield + +as @s say runtime.nesting + +name = ./thing + +with stuff(): + function name: + say runtime.nesting + say runtime.nesting + +say runtime.nesting diff --git a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt index 448f9a732..55e8c32c2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_103__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_103__1.txt @@ -1,13 +1,18 @@ -_bolt_lineno = [1, 8], [1, 4] +_bolt_lineno = [1, 13], [1, 4] _bolt_helper_interpolate_nbt = _bolt_runtime.helpers['interpolate_nbt'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_children = _bolt_runtime.helpers['children'] with _bolt_runtime.scope() as _bolt_var2: _bolt_var0 = '[{"text": "Hello", "bold": true}]' foo = _bolt_var0 - _bolt_var1 = foo - _bolt_var1 = _bolt_helper_interpolate_nbt(_bolt_var1, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[17], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[16], arguments=_bolt_helper_children([_bolt_refs[15], _bolt_helper_replace(_bolt_refs[14], arguments=_bolt_helper_children([_bolt_refs[13], _bolt_helper_replace(_bolt_refs[12], arguments=_bolt_helper_children([_bolt_refs[10], _bolt_refs[11], _bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_refs[7], _bolt_helper_replace(_bolt_refs[6], data_tags=_bolt_helper_replace(_bolt_refs[5], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], value=_bolt_helper_replace(_bolt_refs[3], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1), _bolt_refs[2]])))])))]))]))]))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:as:targets:subcommand', *_bolt_refs[15:16]): + with _bolt_runtime.push_nesting('execute:at:targets:subcommand', *_bolt_refs[13:14]): + with _bolt_runtime.push_nesting('execute:if:block:pos:block:subcommand', *_bolt_refs[10:12]): + with _bolt_runtime.push_nesting('execute:run:subcommand'): + _bolt_var1 = foo + _bolt_var1 = _bolt_helper_interpolate_nbt(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[17], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[16], arguments=_bolt_helper_children([*_bolt_refs[15:16], _bolt_helper_replace(_bolt_refs[14], arguments=_bolt_helper_children([*_bolt_refs[13:14], _bolt_helper_replace(_bolt_refs[12], arguments=_bolt_helper_children([*_bolt_refs[10:12], _bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_refs[7], _bolt_helper_replace(_bolt_refs[6], data_tags=_bolt_helper_replace(_bolt_refs[5], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], value=_bolt_helper_replace(_bolt_refs[3], entries=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1), _bolt_refs[2]])))])))]))]))]))]))]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[18], commands=_bolt_helper_children(_bolt_var2)) --- output = _bolt_var3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt index f6c4a7dd8..415558edc 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_117__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_117__1.txt @@ -1,15 +1,16 @@ -_bolt_lineno = [1, 8], [1, 2] +_bolt_lineno = [1, 9], [1, 2] _bolt_helper_interpolate_range = _bolt_runtime.helpers['interpolate_range'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var4: _bolt_var0 = 8 x = _bolt_var0 - _bolt_var1 = x - _bolt_var2 = None - _bolt_var3 = (_bolt_var1,_bolt_var2,) - _bolt_var3 = _bolt_helper_interpolate_range(_bolt_var3, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_refs[2], _bolt_var3, _bolt_refs[3]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var1 = x + _bolt_var2 = None + _bolt_var3 = (_bolt_var1,_bolt_var2,) + _bolt_var3 = _bolt_helper_interpolate_range(_bolt_var3, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_refs[1], _bolt_refs[2], _bolt_var3]), _bolt_refs[3]]))]))) _bolt_var5 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var4)) --- output = _bolt_var5 diff --git a/packages/bolt/tests/snapshots/bolt__parse_130__1.txt b/packages/bolt/tests/snapshots/bolt__parse_130__1.txt index 9d8f90ce4..6e0567d86 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_130__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_130__1.txt @@ -4,16 +4,20 @@ _bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var2: - with _bolt_runtime.scope() as _bolt_var1: - _bolt_var0 = True - with _bolt_helper_branch(_bolt_var0) as _bolt_condition: - if _bolt_condition: - _bolt_runtime.commands.extend(_bolt_refs[0].commands) - _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) - with _bolt_helper_branch(_bolt_var0) as _bolt_condition: - if _bolt_condition: - _bolt_runtime.commands.extend(_bolt_refs[1].commands) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[10], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([_bolt_refs[6], _bolt_refs[7], _bolt_refs[8], _bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var1))]))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_refs[6:9]): + with _bolt_runtime.push_nesting('execute:if:entity:entities:subcommand', *_bolt_refs[4:5]): + with _bolt_runtime.push_nesting('execute:commands'): + with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = True + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var0 = _bolt_helper_operator_not(_bolt_var0) + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[10], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[9], arguments=_bolt_helper_children([*_bolt_refs[6:9], _bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([*_bolt_refs[4:5], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var1))]))]))]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[11], commands=_bolt_helper_children(_bolt_var2)) --- output = _bolt_var3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt index 529768017..e414aa349 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_139__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_139__1.txt @@ -1,9 +1,9 @@ -_bolt_lineno = [1, 15, 19, 25, 35], [1, 2, 3, 4, 6] +_bolt_lineno = [1, 15, 20, 27, 40], [1, 2, 3, 4, 6] _bolt_helper_get_attribute = _bolt_runtime.helpers['get_attribute'] _bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_branch = _bolt_runtime.helpers['branch'] _bolt_helper_interpolate_range = _bolt_runtime.helpers['interpolate_range'] -_bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_operator_not = _bolt_runtime.helpers['operator_not'] _bolt_helper_interpolate_message = _bolt_runtime.helpers['interpolate_message'] @@ -15,31 +15,38 @@ with _bolt_runtime.scope() as _bolt_var10: _bolt_var2 = node _bolt_var2 = _bolt_helper_get_attribute(_bolt_var2, 'parent') _bolt_var2 = _bolt_helper_interpolate_resource_location(_bolt_var2, _bolt_refs[0]) - with _bolt_runtime.scope() as _bolt_var9: - _bolt_var3 = node - _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'partition') - _bolt_var4 = 5 - _bolt_var3 = _bolt_var3(_bolt_var4) - with _bolt_helper_branch(_bolt_var3) as _bolt_condition: - if _bolt_condition: - _bolt_var5 = node - _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'range') - _bolt_var5 = _bolt_helper_interpolate_range(_bolt_var5, _bolt_refs[1]) - _bolt_var6 = node - _bolt_var6 = _bolt_helper_get_attribute(_bolt_var6, 'children') - _bolt_var6 = _bolt_helper_interpolate_resource_location(_bolt_var6, _bolt_refs[4]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[2], _bolt_refs[3], _bolt_var5, _bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var6]))]))]))]))) - _bolt_var3 = _bolt_helper_operator_not(_bolt_var3) - with _bolt_helper_branch(_bolt_var3) as _bolt_condition: - if _bolt_condition: - _bolt_var7 = node - _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'range') - _bolt_var7 = _bolt_helper_interpolate_range(_bolt_var7, _bolt_refs[9]) - _bolt_var8 = node - _bolt_var8 = _bolt_helper_get_attribute(_bolt_var8, 'value') - _bolt_var8 = _bolt_helper_interpolate_message(_bolt_var8, _bolt_refs[12]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[16], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[15], arguments=_bolt_helper_children([_bolt_refs[10], _bolt_refs[11], _bolt_var7, _bolt_helper_replace(_bolt_refs[14], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[13], arguments=_bolt_helper_children([_bolt_var8]))]))]))]))) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[18], arguments=_bolt_helper_children([_bolt_var2, _bolt_helper_replace(_bolt_refs[17], commands=_bolt_helper_children(_bolt_var9))]))) + with _bolt_runtime.push_nesting('append:function:name:commands', *_bolt_helper_children([_bolt_var2])): + with _bolt_runtime.scope() as _bolt_var9: + _bolt_var3 = node + _bolt_var3 = _bolt_helper_get_attribute(_bolt_var3, 'partition') + _bolt_var4 = 5 + _bolt_var3 = _bolt_var3(_bolt_var4) + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var5 = node + _bolt_var5 = _bolt_helper_get_attribute(_bolt_var5, 'range') + _bolt_var5 = _bolt_helper_interpolate_range(_bolt_var5, _bolt_refs[1]) + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_helper_children([_bolt_refs[2], _bolt_refs[3], _bolt_var5])): + with _bolt_runtime.push_nesting('execute:run:subcommand'): + _bolt_var6 = node + _bolt_var6 = _bolt_helper_get_attribute(_bolt_var6, 'children') + _bolt_var6 = _bolt_helper_interpolate_resource_location(_bolt_var6, _bolt_refs[4]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_refs[2], _bolt_refs[3], _bolt_var5]), _bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_var6]))]))]))]))) + _bolt_var3 = _bolt_helper_operator_not(_bolt_var3) + with _bolt_helper_branch(_bolt_var3) as _bolt_condition: + if _bolt_condition: + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var7 = node + _bolt_var7 = _bolt_helper_get_attribute(_bolt_var7, 'range') + _bolt_var7 = _bolt_helper_interpolate_range(_bolt_var7, _bolt_refs[9]) + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_helper_children([_bolt_refs[10], _bolt_refs[11], _bolt_var7])): + with _bolt_runtime.push_nesting('execute:run:subcommand'): + _bolt_var8 = node + _bolt_var8 = _bolt_helper_get_attribute(_bolt_var8, 'value') + _bolt_var8 = _bolt_helper_interpolate_message(_bolt_var8, _bolt_refs[12]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[16], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[15], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_refs[10], _bolt_refs[11], _bolt_var7]), _bolt_helper_replace(_bolt_refs[14], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[13], arguments=_bolt_helper_children([_bolt_var8]))]))]))]))) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[18], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_var2]), _bolt_helper_replace(_bolt_refs[17], commands=_bolt_helper_children(_bolt_var9))]))) _bolt_var11 = _bolt_helper_replace(_bolt_refs[19], commands=_bolt_helper_children(_bolt_var10)) --- output = _bolt_var11 diff --git a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt index 0a91f50d9..f91fdf782 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_143__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_143__1.txt @@ -1,14 +1,15 @@ -_bolt_lineno = [1, 8], [1, 2] +_bolt_lineno = [1, 9], [1, 2] _bolt_helper_interpolate_coordinate = _bolt_runtime.helpers['interpolate_coordinate'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_children = _bolt_runtime.helpers['children'] with _bolt_runtime.scope() as _bolt_var3: _bolt_var0 = 1 a = _bolt_var0 - _bolt_var1 = a - _bolt_var2 = '^{}'.format(_bolt_var1) - _bolt_var2 = _bolt_helper_interpolate_coordinate(_bolt_var2, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], y=_bolt_var2), _bolt_refs[2], _bolt_refs[3]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var1 = a + _bolt_var2 = '^{}'.format(_bolt_var1) + _bolt_var2 = _bolt_helper_interpolate_coordinate(_bolt_var2, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], y=_bolt_var2), _bolt_refs[2]]), _bolt_refs[3]]))]))) _bolt_var4 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var3)) --- output = _bolt_var4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt index 3d984038d..38aca6c60 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_144__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_144__1.txt @@ -3,12 +3,13 @@ _bolt_helper_interpolate_vec3 = _bolt_runtime.helpers['interpolate_vec3'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var4: - _bolt_var0 = '~' - _bolt_var1 = '~' - _bolt_var2 = '~' - _bolt_var3 = (_bolt_var0,_bolt_var1,_bolt_var2,) - _bolt_var3 = _bolt_helper_interpolate_vec3(_bolt_var3, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_var3, _bolt_refs[1], _bolt_refs[2]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var0 = '~' + _bolt_var1 = '~' + _bolt_var2 = '~' + _bolt_var3 = (_bolt_var0,_bolt_var1,_bolt_var2,) + _bolt_var3 = _bolt_helper_interpolate_vec3(_bolt_var3, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_var3, _bolt_refs[1]]), _bolt_refs[2]]))]))) _bolt_var5 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var4)) --- output = _bolt_var5 diff --git a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt index 4c9afae30..4ab2a6cf8 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_174__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_174__1.txt @@ -1,14 +1,15 @@ -_bolt_lineno = [1, 8], [1, 2] +_bolt_lineno = [1, 9], [1, 2] _bolt_helper_interpolate_nbt_path = _bolt_runtime.helpers['interpolate_nbt_path'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var3: _bolt_var0 = 'aaa' mykey = _bolt_var0 - _bolt_var1 = mykey - _bolt_var2 = 'some.{}.path{{my: "compound"}}'.format(_bolt_var1) - _bolt_var2 = _bolt_helper_interpolate_nbt_path(_bolt_var2, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var2, _bolt_refs[2]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var1 = mykey + _bolt_var2 = 'some.{}.path{{my: "compound"}}'.format(_bolt_var1) + _bolt_var2 = _bolt_helper_interpolate_nbt_path(_bolt_var2, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_refs[1], _bolt_var2]), _bolt_refs[2]]))]))) _bolt_var4 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var3)) --- output = _bolt_var4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt index 40862e791..6554423d2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_175__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_175__1.txt @@ -1,13 +1,14 @@ -_bolt_lineno = [1, 8], [1, 2] +_bolt_lineno = [1, 9], [1, 2] _bolt_helper_interpolate_nbt_path = _bolt_runtime.helpers['interpolate_nbt_path'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var2: _bolt_var0 = 'some.path{my: "compound"}.stuff[42].beep[{my: "subscript"}].boop' mypath = _bolt_var0 - _bolt_var1 = mypath - _bolt_var1 = _bolt_helper_interpolate_nbt_path(_bolt_var1, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[1], _bolt_var1, _bolt_refs[2]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var1 = mypath + _bolt_var1 = _bolt_helper_interpolate_nbt_path(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_refs[1], _bolt_var1]), _bolt_refs[2]]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var2)) --- output = _bolt_var3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt index 317c27da5..4715fcb80 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_176__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_176__1.txt @@ -1,13 +1,14 @@ -_bolt_lineno = [1, 8], [1, 2] +_bolt_lineno = [1, 9], [1, 2] _bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_children = _bolt_runtime.helpers['children'] with _bolt_runtime.scope() as _bolt_var2: _bolt_var0 = 'creeper' entity_type = _bolt_var0 - _bolt_var1 = entity_type - _bolt_var1 = _bolt_helper_interpolate_resource_location(_bolt_var1, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1)])), _bolt_refs[3]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var1 = entity_type + _bolt_var1 = _bolt_helper_interpolate_resource_location(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[5], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], value=_bolt_var1)]))]), _bolt_refs[3]]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[6], commands=_bolt_helper_children(_bolt_var2)) --- output = _bolt_var3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt index 6d183c65d..1cdc260a0 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_184__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_184__1.txt @@ -1,13 +1,14 @@ -_bolt_lineno = [1, 8], [1, 2] +_bolt_lineno = [1, 9], [1, 2] _bolt_helper_interpolate_coordinate = _bolt_runtime.helpers['interpolate_coordinate'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] _bolt_helper_children = _bolt_runtime.helpers['children'] with _bolt_runtime.scope() as _bolt_var2: _bolt_var0 = 1 a = _bolt_var0 - _bolt_var1 = a - _bolt_var1 = _bolt_helper_interpolate_coordinate(f'~{_bolt_var1}', _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], y=_bolt_var1), _bolt_refs[2]]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + _bolt_var1 = a + _bolt_var1 = _bolt_helper_interpolate_coordinate(f'~{_bolt_var1}', _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], y=_bolt_var1)]), _bolt_refs[2]]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var2)) --- output = _bolt_var3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_229__1.txt b/packages/bolt/tests/snapshots/bolt__parse_229__1.txt index f6ecd5d20..383f0dc0e 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_229__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_229__1.txt @@ -1,12 +1,15 @@ -_bolt_lineno = [1, 8], [1, 3] +_bolt_lineno = [1, 11], [1, 3] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(): pass - _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_refs[2], _bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([*_bolt_var0]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:as:targets:subcommand', *_bolt_refs[2:3]): + with _bolt_runtime.push_nesting('execute:run:subcommand'): + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([*_bolt_refs[2:3], _bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([*_bolt_var0]))]))]))) _bolt_var2 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var1)) --- output = _bolt_var2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_231__1.txt b/packages/bolt/tests/snapshots/bolt__parse_231__1.txt index c51241e4a..36db91ea6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_231__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_231__1.txt @@ -1,12 +1,14 @@ -_bolt_lineno = [1, 8], [1, 3] +_bolt_lineno = [1, 10], [1, 3] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(): pass - _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], *_bolt_var0]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:as:targets:subcommand', *_bolt_refs[1:2]): + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([*_bolt_refs[1:2], *_bolt_var0]))]))) _bolt_var2 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var1)) --- output = _bolt_var2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_355__1.txt b/packages/bolt/tests/snapshots/bolt__parse_355__1.txt index f40f3cc50..c2b818b43 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_355__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_355__1.txt @@ -1,12 +1,14 @@ -_bolt_lineno = [1, 8], [1, 3] +_bolt_lineno = [1, 10], [1, 3] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_macro_call = _bolt_runtime.helpers['macro_call'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var1: def _bolt_macro0(thing): pass - _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_refs[1], *_bolt_var0]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:as:targets:subcommand', *_bolt_refs[1:2]): + _bolt_var0 = _bolt_helper_macro_call(_bolt_runtime, _bolt_macro0, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([*_bolt_refs[1:2], *_bolt_var0]))]))) _bolt_var2 = _bolt_helper_replace(_bolt_refs[4], commands=_bolt_helper_children(_bolt_var1)) --- output = _bolt_var2 diff --git a/packages/bolt/tests/snapshots/bolt__parse_42__1.txt b/packages/bolt/tests/snapshots/bolt__parse_42__1.txt index ced9763dd..a2474fbb6 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_42__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_42__1.txt @@ -1,22 +1,25 @@ -_bolt_lineno = [1, 9, 15], [1, 2, 4] +_bolt_lineno = [1, 12, 18], [1, 2, 4] _bolt_helper_branch = _bolt_runtime.helpers['branch'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var5: - with _bolt_runtime.scope() as _bolt_var4: - _bolt_var0 = 'thing' - _bolt_var1 = 'bar' - _bolt_var0 = _bolt_var0 == _bolt_var1 - with _bolt_helper_branch(_bolt_var0) as _bolt_condition: - if _bolt_condition: - _bolt_runtime.commands.extend(_bolt_refs[0].commands) - _bolt_var2 = 'thing' - _bolt_var3 = 'foo' - _bolt_var2 = _bolt_var2 == _bolt_var3 - with _bolt_helper_branch(_bolt_var2) as _bolt_condition: - if _bolt_condition: - _bolt_runtime.commands.extend(_bolt_refs[1].commands) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_refs[5], _bolt_refs[6], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var4))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_refs[4:7]): + with _bolt_runtime.push_nesting('execute:commands'): + with _bolt_runtime.scope() as _bolt_var4: + _bolt_var0 = 'thing' + _bolt_var1 = 'bar' + _bolt_var0 = _bolt_var0 == _bolt_var1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_var2 = 'thing' + _bolt_var3 = 'foo' + _bolt_var2 = _bolt_var2 == _bolt_var3 + with _bolt_helper_branch(_bolt_var2) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([*_bolt_refs[4:7], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var4))]))]))]))) _bolt_var6 = _bolt_helper_replace(_bolt_refs[9], commands=_bolt_helper_children(_bolt_var5)) --- output = _bolt_var6 diff --git a/packages/bolt/tests/snapshots/bolt__parse_43__1.txt b/packages/bolt/tests/snapshots/bolt__parse_43__1.txt index a7e480c5c..05a11a75d 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_43__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_43__1.txt @@ -1,16 +1,19 @@ -_bolt_lineno = [1, 9], [1, 2] +_bolt_lineno = [1, 12], [1, 2] _bolt_helper_branch = _bolt_runtime.helpers['branch'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var3: - with _bolt_runtime.scope() as _bolt_var2: - _bolt_var0 = 'thing' - _bolt_var1 = 'foo' - _bolt_var0 = _bolt_var0 == _bolt_var1 - with _bolt_helper_branch(_bolt_var0) as _bolt_condition: - if _bolt_condition: - _bolt_runtime.commands.extend(_bolt_refs[0].commands) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var2))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_refs[3:6]): + with _bolt_runtime.push_nesting('execute:commands'): + with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'thing' + _bolt_var1 = 'foo' + _bolt_var0 = _bolt_var0 == _bolt_var1 + with _bolt_helper_branch(_bolt_var0) as _bolt_condition: + if _bolt_condition: + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([*_bolt_refs[3:6], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var2))]))]))]))) _bolt_var4 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var3)) --- output = _bolt_var4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt index 79d610c67..e830787c2 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_44__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_44__1.txt @@ -2,18 +2,21 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var3: - with _bolt_runtime.scope() as _bolt_var2: - while True: - _bolt_var0 = True - if not _bolt_var0: - break - _bolt_runtime.commands.extend(_bolt_refs[0].commands) - while True: - _bolt_var1 = True - if not _bolt_var1: - break - _bolt_runtime.commands.extend(_bolt_refs[1].commands) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_refs[4], _bolt_refs[5], _bolt_refs[6], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_refs[4:7]): + with _bolt_runtime.push_nesting('execute:commands'): + with _bolt_runtime.scope() as _bolt_var2: + while True: + _bolt_var0 = True + if not _bolt_var0: + break + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + while True: + _bolt_var1 = True + if not _bolt_var1: + break + _bolt_runtime.commands.extend(_bolt_refs[1].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[8], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([*_bolt_refs[4:7], _bolt_helper_replace(_bolt_refs[3], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2))]))]))]))) _bolt_var4 = _bolt_helper_replace(_bolt_refs[9], commands=_bolt_helper_children(_bolt_var3)) --- output = _bolt_var4 diff --git a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt index 8e56d720a..0598464c4 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_45__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_45__1.txt @@ -2,13 +2,16 @@ _bolt_lineno = [1], [1] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var2: - with _bolt_runtime.scope() as _bolt_var1: - while True: - _bolt_var0 = True - if not _bolt_var0: - break - _bolt_runtime.commands.extend(_bolt_refs[0].commands) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_refs[3:6]): + with _bolt_runtime.push_nesting('execute:commands'): + with _bolt_runtime.scope() as _bolt_var1: + while True: + _bolt_var0 = True + if not _bolt_var0: + break + _bolt_runtime.commands.extend(_bolt_refs[0].commands) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([*_bolt_refs[3:6], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var1))]))]))]))) _bolt_var3 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var2)) --- output = _bolt_var3 diff --git a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt index 627e99bb7..3089cb908 100644 --- a/packages/bolt/tests/snapshots/bolt__parse_46__1.txt +++ b/packages/bolt/tests/snapshots/bolt__parse_46__1.txt @@ -1,26 +1,29 @@ -_bolt_lineno = [1, 8, 10, 16], [1, 2, 3, 5] +_bolt_lineno = [1, 11, 13, 19], [1, 2, 3, 5] _bolt_helper_get_rebind = _bolt_runtime.helpers['get_rebind'] _bolt_helper_children = _bolt_runtime.helpers['children'] _bolt_helper_replace = _bolt_runtime.helpers['replace'] with _bolt_runtime.scope() as _bolt_var6: - with _bolt_runtime.scope() as _bolt_var5: - _bolt_var0 = 42 - count = _bolt_var0 - while True: - _bolt_var1 = count - _bolt_var2 = 0 - _bolt_var1 = _bolt_var1 > _bolt_var2 - if not _bolt_var1: - break - _bolt_runtime.commands.append(_bolt_refs[0]) - _bolt_var3 = count - _bolt_var4 = 1 - _bolt_var3 = _bolt_var3 - _bolt_var4 - _bolt_rebind = _bolt_helper_get_rebind(count) - count = _bolt_var3 - if _bolt_rebind is not None: - count = _bolt_rebind(count) - _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([_bolt_refs[3], _bolt_refs[4], _bolt_refs[5], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var5))]))]))]))) + with _bolt_runtime.push_nesting('execute:subcommand'): + with _bolt_runtime.push_nesting('execute:if:score:target:targetObjective:matches:range:subcommand', *_bolt_refs[3:6]): + with _bolt_runtime.push_nesting('execute:commands'): + with _bolt_runtime.scope() as _bolt_var5: + _bolt_var0 = 42 + count = _bolt_var0 + while True: + _bolt_var1 = count + _bolt_var2 = 0 + _bolt_var1 = _bolt_var1 > _bolt_var2 + if not _bolt_var1: + break + _bolt_runtime.commands.append(_bolt_refs[0]) + _bolt_var3 = count + _bolt_var4 = 1 + _bolt_var3 = _bolt_var3 - _bolt_var4 + _bolt_rebind = _bolt_helper_get_rebind(count) + count = _bolt_var3 + if _bolt_rebind is not None: + count = _bolt_rebind(count) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[7], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[6], arguments=_bolt_helper_children([*_bolt_refs[3:6], _bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_helper_replace(_bolt_refs[1], commands=_bolt_helper_children(_bolt_var5))]))]))]))) _bolt_var7 = _bolt_helper_replace(_bolt_refs[8], commands=_bolt_helper_children(_bolt_var6)) --- output = _bolt_var7 diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_nesting__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_nesting__0.pack.md new file mode 100644 index 000000000..30381f78b --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_nesting__0.pack.md @@ -0,0 +1,31 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 12, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +say [] +execute as @s run say [('execute:subcommand', ()), ('execute:as:targets:subcommand', (AstSelector(variable='s', arguments=AstChildren(())),)), ('execute:run:subcommand', ())] +execute if score foo temp matches 77 run say [('execute:subcommand', ()), ('execute:if:score:target:targetObjective:matches:range:subcommand', (AstPlayerName(value='foo'), AstObjective(value='temp'), AstRange(min=77, max=77))), ('execute:commands', ())] +say [] +``` + +`@function demo:thing` + +```mcfunction +say [('execute:subcommand', ()), ('execute:if:score:target:targetObjective:matches:range:subcommand', (AstPlayerName(value='foo'), AstObjective(value='temp'), AstRange(min=77, max=77))), ('execute:commands', ()), ('function:name:commands', (AstResourceLocation(is_tag=False, namespace='demo', path='thing'),))] +``` From 07556a8865ef60ceafea080fe4c3bc89642712d9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 18 May 2023 23:39:56 +0000 Subject: [PATCH 1172/1554] 0.34.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 21633274a..75b6e527e 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.34.0 (2023-05-18) +### Feature +* Add runtime nesting info ([`2100ee7`](https://github.com/mcbeet/bolt/commit/2100ee773026b6dc353fb8d753034c6db09a0b9f)) + ## v0.33.2 (2023-04-26) ### Fix * Don't handle docstrings behind subcommands ([`2fd8c25`](https://github.com/mcbeet/bolt/commit/2fd8c256cf9272fea7b908b654f0ef25d2118c13)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 2bce816a3..59a4d4367 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.33.2" +__version__ = "0.34.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 8961b3102..5dbc825f4 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.33.2" +version = "0.34.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 085994ca043fc8138422c8690666a70006be8316 Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Sat, 20 May 2023 02:23:22 +0200 Subject: [PATCH 1173/1554] feat: nested locations --- packages/bolt/bolt/ast.py | 9 +++ packages/bolt/bolt/codegen.py | 22 +++++++ packages/bolt/bolt/helpers.py | 16 +++++ packages/bolt/bolt/parse.py | 37 ++++++++++- packages/bolt/bolt/runtime.py | 31 ++++++++- .../examples/bolt_nested_location/beet.yml | 6 ++ .../src/data/demo/functions/foo.mcfunction | 13 ++++ .../tests/resources/bolt_examples.mcfunction | 11 ++++ .../tests/snapshots/bolt__parse_359__0.txt | 17 +++++ .../tests/snapshots/bolt__parse_359__1.txt | 16 +++++ .../tests/snapshots/bolt__parse_360__0.txt | 26 ++++++++ .../tests/snapshots/bolt__parse_360__1.txt | 18 ++++++ .../tests/snapshots/bolt__parse_361__0.txt | 5 ++ .../tests/snapshots/bolt__parse_362__0.txt | 47 ++++++++++++++ .../tests/snapshots/bolt__parse_362__1.txt | 63 +++++++++++++++++++ .../tests/snapshots/bolt__parse_363__0.txt | 27 ++++++++ .../tests/snapshots/bolt__parse_363__1.txt | 36 +++++++++++ ...les__build_bolt_nested_location__0.pack.md | 50 +++++++++++++++ 18 files changed, 447 insertions(+), 3 deletions(-) create mode 100644 packages/bolt/examples/bolt_nested_location/beet.yml create mode 100644 packages/bolt/examples/bolt_nested_location/src/data/demo/functions/foo.mcfunction create mode 100644 packages/bolt/tests/snapshots/bolt__parse_359__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_359__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_360__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_360__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_361__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_362__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_362__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_363__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_363__1.txt create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_nested_location__0.pack.md diff --git a/packages/bolt/bolt/ast.py b/packages/bolt/bolt/ast.py index d36e5854f..73e288d21 100644 --- a/packages/bolt/bolt/ast.py +++ b/packages/bolt/bolt/ast.py @@ -6,6 +6,7 @@ "AstValue", "AstIdentifier", "AstFormatString", + "AstNestedLocation", "AstTuple", "AstList", "AstDict", @@ -134,6 +135,14 @@ class AstFormatString(AstExpression): values: AstChildren[AstExpression] = required_field() +@dataclass(frozen=True, slots=True) +class AstNestedLocation(AstExpression): + """Ast nested location node.""" + + fmt: str = required_field() + values: AstChildren[AstExpression] = required_field() + + @dataclass(frozen=True, slots=True) class AstTuple(AstExpression): """Ast tuple node.""" diff --git a/packages/bolt/bolt/codegen.py b/packages/bolt/bolt/codegen.py index 8eeb23919..61c6df0b1 100644 --- a/packages/bolt/bolt/codegen.py +++ b/packages/bolt/bolt/codegen.py @@ -71,6 +71,7 @@ AstMacroCall, AstMacroMatchArgument, AstMemo, + AstNestedLocation, AstPrelude, AstProcMacro, AstSlice, @@ -1141,6 +1142,27 @@ def format_string( ) return [result] + @rule(AstNestedLocation) + def nested_location( + self, + node: AstNestedLocation, + acc: Accumulator, + ) -> Generator[AstNode, Optional[List[str]], Optional[List[str]]]: + values: List[str] = [] + + for value in node.values: + result = yield from visit_single(value, required=True) + values.append(result) + + result = acc.make_variable() + resolved = acc.helper( + "resolve_nested_location", + "_bolt_runtime", + f"{node.fmt!r}.format({', '.join(values)})" if values else repr(node.fmt), + ) + acc.statement(f"{result} = {resolved}", lineno=node) + return [result] + @rule(AstTuple) def tuple( self, diff --git a/packages/bolt/bolt/helpers.py b/packages/bolt/bolt/helpers.py index 4f55cee35..60700a4d2 100644 --- a/packages/bolt/bolt/helpers.py +++ b/packages/bolt/bolt/helpers.py @@ -6,6 +6,7 @@ from dataclasses import dataclass, replace from functools import partial, wraps from importlib import import_module +from pathlib import PurePosixPath from types import TracebackType from typing import Any, Callable, ContextManager, Dict, Optional, Type from uuid import UUID @@ -64,6 +65,7 @@ def get_bolt_helpers() -> Dict[str, Any]: "get_attribute": get_attribute, "import_module": python_import_module, "macro_call": macro_call, + "resolve_nested_location": resolve_nested_location, "interpolate_bool": converter(AstBool.from_value), "interpolate_numeric": converter(AstNumber.from_value), "interpolate_coordinate": converter(AstCoordinate.from_value), @@ -195,6 +197,20 @@ def macro_call(runtime: Any, function: Any, command: AstCommand): return runtime.capture_output(function, *command.arguments) +@internal +def resolve_nested_location(runtime: Any, nested_path: str) -> str: + namespace, _, current_path = runtime.get_nested_location().partition(":") + + resolved = PurePosixPath(current_path) + for name in nested_path.split("/"): + if name == "..": + resolved = resolved.parent + elif name and name != ".": + resolved = resolved / name + + return f"{namespace}:{resolved}" + + def converter(f: Callable[[Any], AstNode]) -> Callable[[Any, AstNode], AstNode]: internal(f) diff --git a/packages/bolt/bolt/parse.py b/packages/bolt/bolt/parse.py index cf056360a..71a0e0fae 100644 --- a/packages/bolt/bolt/parse.py +++ b/packages/bolt/bolt/parse.py @@ -142,6 +142,7 @@ AstMacroMatchLiteral, AstMemo, AstModuleRoot, + AstNestedLocation, AstProcMacro, AstProcMacroMarker, AstProcMacroResult, @@ -2364,8 +2365,13 @@ class PrimaryParser: quote_helper: QuoteHelper = field(default_factory=JsonQuoteHelper) def __call__(self, stream: TokenStream) -> Any: - with stream.syntax(brace=r"\(|\)", comma=r",", format_string=r"f['\"]"): - token = stream.get(("brace", "("), "format_string") + with stream.syntax( + brace=r"\(|\)", + comma=r",", + format_string=r"f['\"]", + nested_location=r"~/", + ): + token = stream.get(("brace", "("), "format_string", "nested_location") if token and token.match("brace"): with stream.ignore("newline"): @@ -2441,6 +2447,32 @@ def __call__(self, stream: TokenStream) -> Any: if self.truncate: return node + elif token and token.match("nested_location"): + with stream.intercept("whitespace"), stream.provide( + bolt_nested_location=True + ), stream.syntax( + path=r"[0-9a-z_./-]+", + curly=r"\{|\}", + ): + fmt = "" + values: List[AstExpression] = [] + + for path, curly in stream.collect("path", ("curly", "{")): + if path: + fmt += path.value + elif curly: + fmt += "{" + with stream.syntax(path=None), stream.ignore("whitespace"): + values.append(delegate("bolt:expression", stream)) + with stream.syntax(spec=r"[:!][^\}]+"): + if spec := stream.get("spec"): + fmt += spec.value + stream.expect(("curly", "}")) + fmt += "}" + + node = AstNestedLocation(fmt=fmt, values=AstChildren(values)) + node = set_location(node, token, stream.current) + else: node = self.parser(stream) @@ -2611,6 +2643,7 @@ def __call__(self, stream: TokenStream) -> Any: None if stream.data.get("bolt_lookup") or stream.data.get("bolt_format_string") + or stream.data.get("bolt_nested_location") else RESOURCE_LOCATION_PATTERN ), number=NUMBER_PATTERN, diff --git a/packages/bolt/bolt/runtime.py b/packages/bolt/bolt/runtime.py index 4b28b2257..5e4ebb8c7 100644 --- a/packages/bolt/bolt/runtime.py +++ b/packages/bolt/bolt/runtime.py @@ -13,7 +13,16 @@ from beet import Context, TextFileBase, generate_tree from beet.core.utils import JsonDict, extra_field, required_field -from mecha import AstRoot, CommandSpec, CommandTree, Diagnostic, Mecha, Visitor, rule +from mecha import ( + AstResourceLocation, + AstRoot, + CommandSpec, + CommandTree, + Diagnostic, + Mecha, + Visitor, + rule, +) from mecha.contrib.nesting import InplaceNestingPredicate from pathspec import PathSpec from tokenstream import set_location @@ -41,6 +50,8 @@ class Runtime(CommandEmitter): modules: ModuleManager evaluate: "Evaluator" + spec: CommandSpec + def __init__(self, ctx: Union[Context, Mecha]): super().__init__() self.helpers = get_bolt_helpers() @@ -108,6 +119,8 @@ def __init__(self, ctx: Union[Context, Mecha]): self.evaluate = Evaluator(modules=self.modules) + self.spec = mc.spec + mc.providers.append(Module) commands_json = files("bolt.resources").joinpath("commands.json").read_text() @@ -151,6 +164,22 @@ def from_module_import(self, resource_location: str, *args: str) -> Any: raise ImportError(message) from None return values[0] if len(values) == 1 else values + def get_nested_location(self) -> str: + """Return the resource location associated with the current level of nesting.""" + for identifier, arguments in reversed(self.nesting): + prototype = self.spec.prototypes[identifier] + + for i, argument_node in enumerate(arguments): + node = self.spec.tree.get(prototype.get_argument(i).scope) + if ( + node + and node.parser == "minecraft:function" + and isinstance(argument_node, AstResourceLocation) + ): + return argument_node.get_canonical_value() + + return self.modules.current_path + def finalize(self, ctx: Context): """Plugin that runs at the end of the build.""" try: diff --git a/packages/bolt/examples/bolt_nested_location/beet.yml b/packages/bolt/examples/bolt_nested_location/beet.yml new file mode 100644 index 000000000..c8a8dd658 --- /dev/null +++ b/packages/bolt/examples/bolt_nested_location/beet.yml @@ -0,0 +1,6 @@ +require: + - bolt +data_pack: + load: "src" +pipeline: + - mecha diff --git a/packages/bolt/examples/bolt_nested_location/src/data/demo/functions/foo.mcfunction b/packages/bolt/examples/bolt_nested_location/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..5a201cdef --- /dev/null +++ b/packages/bolt/examples/bolt_nested_location/src/data/demo/functions/foo.mcfunction @@ -0,0 +1,13 @@ +execute function ~/thing1: + as @a function ~/thing2: + function ~/thing{3:03}/hello + say ~/thing{123456789:x}/hello + + schedule function ~/blob 2s append: + say (~/, ~/../{~/[:3]}) + +function ./welp: + if predicate ~/ say yes + +function ~/{"":_<2} +function ~/foo{"bar":_^5} diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index cbc9167fd..3e762308a 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1320,3 +1320,14 @@ del x x = 2 ### execute run "not docstring" +### +~/ +### +print(~/foo) +### +~/ ~/ +### +function ~/foo: + function ~/bar +### +function ~/foo{"bar":_<5} diff --git a/packages/bolt/tests/snapshots/bolt__parse_359__0.txt b/packages/bolt/tests/snapshots/bolt__parse_359__0.txt new file mode 100644 index 000000000..f539ce73a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_359__0.txt @@ -0,0 +1,17 @@ +~/ +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=2, lineno=1, colno=3) + fmt: '' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_359__1.txt b/packages/bolt/tests/snapshots/bolt__parse_359__1.txt new file mode 100644 index 000000000..6adc30778 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_359__1.txt @@ -0,0 +1,16 @@ +_bolt_lineno = [1], [1] +_bolt_helper_resolve_nested_location = _bolt_runtime.helpers['resolve_nested_location'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var1: + _bolt_var0 = _bolt_helper_resolve_nested_location(_bolt_runtime, '') +_bolt_var2 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var1)) +--- +output = _bolt_var2 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=3, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_360__0.txt b/packages/bolt/tests/snapshots/bolt__parse_360__0.txt new file mode 100644 index 000000000..167e5de3a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_360__0.txt @@ -0,0 +1,26 @@ +print(~/foo) +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + identifier: 'statement' + arguments: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + value: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=5, lineno=1, colno=6) + value: 'print' + arguments: + + location: SourceLocation(pos=6, lineno=1, colno=7) + end_location: SourceLocation(pos=11, lineno=1, colno=12) + fmt: 'foo' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_360__1.txt b/packages/bolt/tests/snapshots/bolt__parse_360__1.txt new file mode 100644 index 000000000..b25b780be --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_360__1.txt @@ -0,0 +1,18 @@ +_bolt_lineno = [1], [1] +_bolt_helper_resolve_nested_location = _bolt_runtime.helpers['resolve_nested_location'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = print + _bolt_var1 = _bolt_helper_resolve_nested_location(_bolt_runtime, 'foo') + _bolt_var0 = _bolt_var0(_bolt_var1) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[0], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_361__0.txt b/packages/bolt/tests/snapshots/bolt__parse_361__0.txt new file mode 100644 index 000000000..33eea929f --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_361__0.txt @@ -0,0 +1,5 @@ +#>ERROR Trailing input following final expression. +# line 1, column 4 +# 1 | ~/ ~/ +# : ^^ +~/ ~/ diff --git a/packages/bolt/tests/snapshots/bolt__parse_362__0.txt b/packages/bolt/tests/snapshots/bolt__parse_362__0.txt new file mode 100644 index 000000000..0a2a2b72a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_362__0.txt @@ -0,0 +1,47 @@ +function ~/foo: + function ~/bar +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + identifier: 'function:name:commands' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + prefix: None + unpack: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + fmt: 'foo' + values: + + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + commands: + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=29, lineno=2, colno=14) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + prefix: None + unpack: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=29, lineno=2, colno=14) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + fmt: 'bar' + values: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_362__1.txt b/packages/bolt/tests/snapshots/bolt__parse_362__1.txt new file mode 100644 index 000000000..18a5905f3 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_362__1.txt @@ -0,0 +1,63 @@ +_bolt_lineno = [1, 11], [1, 2] +_bolt_helper_resolve_nested_location = _bolt_runtime.helpers['resolve_nested_location'] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var3: + _bolt_var0 = _bolt_helper_resolve_nested_location(_bolt_runtime, 'foo') + _bolt_var0 = _bolt_helper_interpolate_resource_location(_bolt_var0, _bolt_refs[0]) + with _bolt_runtime.push_nesting('function:name:commands', *_bolt_helper_children([_bolt_var0])): + with _bolt_runtime.scope() as _bolt_var2: + _bolt_var1 = _bolt_helper_resolve_nested_location(_bolt_runtime, 'bar') + _bolt_var1 = _bolt_helper_interpolate_resource_location(_bolt_var1, _bolt_refs[1]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[2], arguments=_bolt_helper_children([_bolt_var1]))) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[4], arguments=_bolt_helper_children([*_bolt_helper_children([_bolt_var0]), _bolt_helper_replace(_bolt_refs[3], commands=_bolt_helper_children(_bolt_var2))]))) +_bolt_var4 = _bolt_helper_replace(_bolt_refs[5], commands=_bolt_helper_children(_bolt_var3)) +--- +output = _bolt_var4 +--- +_bolt_refs[0] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=14, lineno=1, colno=15) + prefix: None + unpack: None + converter: 'resource_location' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=29, lineno=2, colno=14) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + prefix: None + unpack: None + converter: 'resource_location' + value: + +_bolt_refs[2] + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + identifier: 'function:name' + arguments: + +_bolt_refs[3] + + location: SourceLocation(pos=20, lineno=2, colno=5) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + commands: + +_bolt_refs[4] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=34, lineno=2, colno=19) + identifier: 'function:name:commands' + arguments: + + +_bolt_refs[5] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=35, lineno=3, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/bolt__parse_363__0.txt b/packages/bolt/tests/snapshots/bolt__parse_363__0.txt new file mode 100644 index 000000000..df3aa0fc1 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_363__0.txt @@ -0,0 +1,27 @@ +function ~/foo{"bar":_<5} +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + prefix: None + unpack: None + converter: 'resource_location' + value: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + fmt: 'foo{:_<5}' + values: + + location: SourceLocation(pos=15, lineno=1, colno=16) + end_location: SourceLocation(pos=20, lineno=1, colno=21) + value: 'bar' diff --git a/packages/bolt/tests/snapshots/bolt__parse_363__1.txt b/packages/bolt/tests/snapshots/bolt__parse_363__1.txt new file mode 100644 index 000000000..0d24f7bde --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_363__1.txt @@ -0,0 +1,36 @@ +_bolt_lineno = [1], [1] +_bolt_helper_resolve_nested_location = _bolt_runtime.helpers['resolve_nested_location'] +_bolt_helper_interpolate_resource_location = _bolt_runtime.helpers['interpolate_resource_location'] +_bolt_helper_children = _bolt_runtime.helpers['children'] +_bolt_helper_replace = _bolt_runtime.helpers['replace'] +with _bolt_runtime.scope() as _bolt_var2: + _bolt_var0 = 'bar' + _bolt_var1 = _bolt_helper_resolve_nested_location(_bolt_runtime, 'foo{:_<5}'.format(_bolt_var0)) + _bolt_var1 = _bolt_helper_interpolate_resource_location(_bolt_var1, _bolt_refs[0]) + _bolt_runtime.commands.append(_bolt_helper_replace(_bolt_refs[1], arguments=_bolt_helper_children([_bolt_var1]))) +_bolt_var3 = _bolt_helper_replace(_bolt_refs[2], commands=_bolt_helper_children(_bolt_var2)) +--- +output = _bolt_var3 +--- +_bolt_refs[0] + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + prefix: None + unpack: None + converter: 'resource_location' + value: + +_bolt_refs[1] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=1, colno=26) + identifier: 'function:name' + arguments: + +_bolt_refs[2] + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=2, colno=1) + commands: + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_nested_location__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_nested_location__0.pack.md new file mode 100644 index 000000000..70bfb832d --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_nested_location__0.pack.md @@ -0,0 +1,50 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "pack_format": 12, + "description": "" + } +} +``` + +### demo + +`@function demo:foo` + +```mcfunction +function demo:foo/thing1 +function demo:foo/__ +function demo:foo/foo_bar_ +``` + +`@function demo:foo/thing1/thing2` + +```mcfunction +function demo:foo/thing1/thing2/thing003/hello +say demo:foo/thing1/thing2/thing75bcd15/hello +``` + +`@function demo:foo/thing1/blob` + +```mcfunction +say ('demo:foo/thing1/blob', 'demo:foo/thing1/dem') +``` + +`@function demo:foo/thing1` + +```mcfunction +execute as @a run function demo:foo/thing1/thing2 +schedule function demo:foo/thing1/blob 2s append +``` + +`@function demo:welp` + +```mcfunction +execute if predicate demo:welp run say yes +``` From 82645a787515c800df5550eff84055da3e7090b4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 20 May 2023 00:24:19 +0000 Subject: [PATCH 1174/1554] 0.35.0 Automatically generated by python-semantic-release --- packages/bolt/CHANGELOG.md | 4 ++++ packages/bolt/bolt/__init__.py | 2 +- packages/bolt/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/bolt/CHANGELOG.md b/packages/bolt/CHANGELOG.md index 75b6e527e..b5838056c 100644 --- a/packages/bolt/CHANGELOG.md +++ b/packages/bolt/CHANGELOG.md @@ -2,6 +2,10 @@ +## v0.35.0 (2023-05-20) +### Feature +* Nested locations ([`a7fe760`](https://github.com/mcbeet/bolt/commit/a7fe760d552630d5528522f332bba211d4006233)) + ## v0.34.0 (2023-05-18) ### Feature * Add runtime nesting info ([`2100ee7`](https://github.com/mcbeet/bolt/commit/2100ee773026b6dc353fb8d753034c6db09a0b9f)) diff --git a/packages/bolt/bolt/__init__.py b/packages/bolt/bolt/__init__.py index 59a4d4367..dc31d2d56 100644 --- a/packages/bolt/bolt/__init__.py +++ b/packages/bolt/bolt/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.34.0" +__version__ = "0.35.0" from .ast import * diff --git a/packages/bolt/pyproject.toml b/packages/bolt/pyproject.toml index 5dbc825f4..88412f8c4 100644 --- a/packages/bolt/pyproject.toml +++ b/packages/bolt/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bolt" -version = "0.34.0" +version = "0.35.0" description = "Supercharge Minecraft commands with Python" authors = ["Valentin Berlier "] license = "MIT" From 4e37e2d61825f3b259027e5af03a99e4adcb980f Mon Sep 17 00:00:00 2001 From: Valentin Berlier Date: Wed, 24 May 2023 01:39:52 +0200 Subject: [PATCH 1175/1554] test: add sample ui example --- .../bolt/examples/bolt_sample_ui/beet.yml | 6 ++++ .../bolt_sample_ui/sample_ui/__init__.py | 0 .../bolt_sample_ui/sample_ui/generate.py | 24 +++++++++++++++ .../sample_ui/modules/main.bolt | 9 ++++++ .../bolt_sample_ui/sample_ui/resources.py | 12 ++++++++ .../src/data/demo/ui_screens/foo.xml | 12 ++++++++ .../examples__build_bolt_sample_ui__0.pack.md | 29 +++++++++++++++++++ 7 files changed, 92 insertions(+) create mode 100644 packages/bolt/examples/bolt_sample_ui/beet.yml create mode 100644 packages/bolt/examples/bolt_sample_ui/sample_ui/__init__.py create mode 100644 packages/bolt/examples/bolt_sample_ui/sample_ui/generate.py create mode 100644 packages/bolt/examples/bolt_sample_ui/sample_ui/modules/main.bolt create mode 100644 packages/bolt/examples/bolt_sample_ui/sample_ui/resources.py create mode 100644 packages/bolt/examples/bolt_sample_ui/src/data/demo/ui_screens/foo.xml create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_sample_ui__0.pack.md diff --git a/packages/bolt/examples/bolt_sample_ui/beet.yml b/packages/bolt/examples/bolt_sample_ui/beet.yml new file mode 100644 index 000000000..6bdcfff9a --- /dev/null +++ b/packages/bolt/examples/bolt_sample_ui/beet.yml @@ -0,0 +1,6 @@ +require: + - sample_ui.resources +data_pack: + load: "src" +pipeline: + - sample_ui.generate diff --git a/packages/bolt/examples/bolt_sample_ui/sample_ui/__init__.py b/packages/bolt/examples/bolt_sample_ui/sample_ui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bolt/examples/bolt_sample_ui/sample_ui/generate.py b/packages/bolt/examples/bolt_sample_ui/sample_ui/generate.py new file mode 100644 index 000000000..13f8a7158 --- /dev/null +++ b/packages/bolt/examples/bolt_sample_ui/sample_ui/generate.py @@ -0,0 +1,24 @@ +from beet import Context, subproject + +from .resources import UiScreen + + +def beet_default(ctx: Context): + all_screens = { + name: screen_file.text for name, screen_file in ctx.data[UiScreen].items() + } + ctx.data[UiScreen].clear() + + ctx.require( + subproject( + { + "require": ["bolt"], + "data_pack": {"load": {"data/sample_ui/modules": "@sample_ui/modules"}}, + "pipeline": ["mecha"], + "meta": { + "bolt": {"entrypoint": "sample_ui:main"}, + "sample_ui": {"all_screens": all_screens}, + }, + } + ) + ) diff --git a/packages/bolt/examples/bolt_sample_ui/sample_ui/modules/main.bolt b/packages/bolt/examples/bolt_sample_ui/sample_ui/modules/main.bolt new file mode 100644 index 000000000..2ce7a8999 --- /dev/null +++ b/packages/bolt/examples/bolt_sample_ui/sample_ui/modules/main.bolt @@ -0,0 +1,9 @@ +import xml.etree.ElementTree as ET + +for name, content in ctx.meta.sample_ui.all_screens.items(): + parser = ET.XMLPullParser(["start", "end"]) + parser.feed(content) + + function name: + for event, elem in parser.read_events(): + say (event, elem.tag, elem.attrib) diff --git a/packages/bolt/examples/bolt_sample_ui/sample_ui/resources.py b/packages/bolt/examples/bolt_sample_ui/sample_ui/resources.py new file mode 100644 index 000000000..3c7787da0 --- /dev/null +++ b/packages/bolt/examples/bolt_sample_ui/sample_ui/resources.py @@ -0,0 +1,12 @@ +from typing import ClassVar + +from beet import Context, TextFileBase + + +class UiScreen(TextFileBase[str]): + scope: ClassVar[tuple[str, ...]] = ("ui_screens",) + extension: ClassVar[str] = ".xml" + + +def beet_default(ctx: Context): + ctx.data.extend_namespace.append(UiScreen) diff --git a/packages/bolt/examples/bolt_sample_ui/src/data/demo/ui_screens/foo.xml b/packages/bolt/examples/bolt_sample_ui/src/data/demo/ui_screens/foo.xml new file mode 100644 index 000000000..626df75c4 --- /dev/null +++ b/packages/bolt/examples/bolt_sample_ui/src/data/demo/ui_screens/foo.xml @@ -0,0 +1,12 @@ + + +

s759v3|UWi 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 fPR00(no4N$SCP`4)6tUSZ$ zv_5{tTsV^o)Q0#B9lzXN6B;|A>)xQ9p#4cJ;aGjK@DHF=DM5iHz%~xIn?&TrlAtci zv_2X~s!0<*qw^a7#1)=!jkCOr51F;>rzaM2eLKZj2wOvhK0@HMJf|qu=AR7snt%XUDij6c#(IbM-Wjg!*%W)&VA1OP0OabAl+y37nV!X(CAa`x62&k?A>37kM6+ zR{lCQKAdC08c<|PCgMY>`jx9@eomtGqtP+fX)^c3KckB_ z-AlV3_HMA0%d@?+!{0LLe%7x)URsNX$H}@xx5QbIeyMM`B5G|@qYe6@8Wwviqgnld z$JMTGWn7pcg(CJe#JWm%UUcP)k+I@LC0?V7hOdl1RUTqd`TzXC)Aq45vG9HKOqaVEr5 zN`5XdZS3)x0y3SJa1&|6@?1yU45iaXw*Nl}g74$*yYCwS&SxD=_nRUAv_Yn9&_!XExlwMy=WOUr3BRo%zq2qyJMS_7VfyR9W^0+7wif4wvA1FqZeS5nT+ zS~E7@uJAN6cWrv{3nHVQop|pm>4S|wN+XKa3+hh;h__%SIA9$k(At#qcrFBa-F~-n zpO$lu-J!+MAgU|DG3QQi#h^z^qB5h)oR}-W^(k2x)RS(J_daQfd?;zjZ|Xv~mbJn~ zwIon1hW;X~>U{$64c(k8c6)YOBodLv{uo(K^#QW|h07Q`aBcXu)xM{iQJjB4CrNb>UL|bt z4Dts(E(zI^R6G(SrnQ-)sP4nD_C!rUUv8-g{x(xd#9)M2QsuuS9*0$iSbC^F zG`a>fAV6G~4o26N?3cIpoN3%i_~9KsB8L{FElGs)l@tMq@FN9Q9jH6eGP?GkM1+b< zynj2~Y1|v^A_wa+ruhL=(V^%qTN>}C2g95Rsud#_98xy<0leaG-ZHrdeJ%U@J1KKl zSM_wr{iCri-SP{+LLr_*#|hubIn?=_c?%SA&-)ej;Z5{A^NcAM*!Q$EmxgvXb2)T5 zuk1r6pJ*F~UliC@P@XOet4J^qd%SIE3KEm*oby{xB$r>NBy+|)hX4YV~Ux{df03|-Cy~5mjaF_lJEOqApv;xgWeT& zH=|gImPri)v{~!<`0?KvU*Y_VolJV0yUTY_D7;ncdi=?V?<&CTAfD#(n2Pp_Gi>BrC4Zj%{>y7V@ z9XQhZIFO=ouPW?!`}!`1DcxLe1Rjw0D*pcMh*;{I9b0t$ZMpj>rZmq^%&y;CXk{Td zWPU=QlV68qjlwVJJ&>U%BTPcW=9g0%ICCNGO5O|Cn^$KPbSkNU`OJ)Vv-(Z* zA1=tCI@A1q@eMBRgzX5BAMOtE+7+}1<;(8=Y7BhLXB9=py6+NNwLux#U$-WZu7G=; z6iGF9AG_H#E-^P3LiH1}r((SS3E8c&VP*Rlx-92eSI; zx7^}qG&_VwYnS93@hPH6$;W#;ixs%{Mnci-d*IVVXJ=V_@f3%$DL2T-rjWlx#|2j^HrZn4N(>1`M3JZg_$U5NbQGElho#Bn_ zKk;G9^)>dx{8qL{X&$ylL8A?iAGUZtxvs3Z@#N2&UE(`^{0{ciMWror`OQa83IaW8 z8Y5NeX9eDs}K>!k1U+K*5hiy>X=7 zs`Il?%N~zTkFej#T)IuDPHrGfvYGN9#(e%%ah`3~!9VhMNaQmokXeqxZ`5{T0}IS> zj5N(vkBK={g=|fc`Q_lE`5#g6TqN(xSc?|bVNbzcjrsogN>0P^J^j4B$L}t2wa6Bt zhtuY229NYl1^X40Dx1V2bIrVJyFoICT=ZbIzOC!vmWP<@H>yN|nIOdti#7FmpUq<{ zitm-f(rJcw=Dh_aiK=?;ZbN7B^dGyDavsYKjWuwrQb+~M8M^#P{#HC83p7Qe+{`Mp z=$i!7f)RJcV>Vm!cr~seQE@ZYB;xIez5_B2$*aU|5x+at&$-6jE!PkjtuMcIu(YaQ#}oemn!3(v%Q6Ju9Q_k8>GJjE*s9gg&Xiv<#Y z1&LrC0NKXWq)O|IfGEJzCpUX3Q~Pj=yE|@x?_6w36+>HMerXPV729H@17ls+Rw>9h^`1bGXdBwH(SO3xY z+1R6mIw5L#nc{dQyTjb~lI@mD$i7PVCcMh6B1nV3aWcl97h6*AQxAhI2i~Y<1t2rpTkwxLakT1@p=0C$2<_vD{isQdJ?vAUBGGL1 zwtFenFVh??4uHM1C!m`jul-WGcNfVyYv#v;>B8uPN1WZs`SGEcREB zs_GHcb=xJP_vMHWXd{2j9rZ?S_9-l5c$Y7hZSi?hsf2|iYn_LmtxOK&AVBVrd9&8~ zJO`K|H?T4Ddhzd8o%4D=PeAams;^CynCV)Z>IR4#lH}H@`QLx2@B5S~tVo#W_3`k)$&)sDJZ*l@QiPVbF zE}1!PpE7P*Je|?(v?Y3dlpJE4(RW?qVsRuuSpm?b{B1zyc8IuAjMwcixPobIa3bUs@QwBN+RX3r^I_p=3=I@GNXhRP&WxKU zNal@NfZ^7GvO|VLTi*{<_qSynf6QB!IX2Prh_$%7L@c9AZhYjw?Piuw=Xzxa?|ToX zMf(r!T2DC;oeekFo&fRF>CO{%OJXM1tSwLT>&6YxmOz%9)-O+5yS|R%=1gsW$LQGh z{@{MuT+g3r;ab{2R%^VHYwTzwZWWkDKt0SFLrP~MCv6!bm+2!iq-@1@l5SQxK^W>bGXwb_9y|wnC7A!ZCZS!rk+yS1l$Xg=p`t_&Rv@Jq@ zWz#5*>09BOHWLDQP9{|aN@p&*W2Z6{%~iRCvd=6U!SW|g*9Sv;5~A!AnN!pEME*M( zoBHm2e}i2v79Onb-OH8xXKpv7iwz|Fal?=M)r#jOYg1)BvY6@R5hvnVy*K|x08FwI zsUmbv{;*BH@j#8$8_|fkVzE?yX)!>gJ=tdNx0izXa4Z^W0r6A(Znzu9pqd5g90vI4 z_J$X0U#WBHT+Q|%_^8TSpG54W<=6<7k9}g8n&b;se@0KQZk{g}^eJv8hs}Mf;yXAJ zzVil;H2g93goMfnWZ{m=nWqmc=OXmGRit=Rp*^p-`Ja+(KMa}t(-d6$DswVqxjF!= z;7GB#AERkP?DHg+oU^M-LuWB;`#+WPT)A7))RpI=JqKtv-}v?wJ{6Dxq7A%d+X6VG z?axfmLM;S~k6+`$j8Rp6qj!YP8EbDh@JQmhoS2%urbkXXd{wm9OM3L6e4IKkx(Q8V ztQ#}vxO7>}Dpu|!fH)gyJpYkrqAm{=Pq-cN(z1JqS=mGI_n(~%)kzAhX$i&_U#AeicmhMz!GQli@*=QUTgcCf3*rj12F>BqOHm23v*6iu^y!Vup}##!$N5 z#enGz{&2#9!tK=|3OayENZUEH;EB_A@xn z%$fOg4nE%t`E4~&+aH%in%W+q&55i4Z4jinqC9dn)P&zMHu8Sy`DG;Hoj`a$L?X=G zM3oB2O!g`HecB-%fl6&|^tmH-9i@(^6tGpUuWU-pt6K5>*&$gl^)vZtp1qor2y}|B)AAhTy98 zkDb}whjgS3kJh0MH7fd{rx@$u^phP~8?7SA zY39OFZJ7jM-)pKUe#))tRPM!Hqc!$0$4z8|e$;@4n%VMpl|O;phm~Rg6N9K1x=oH9}YRi zn9;<9t$&xlh|;Quul$4mR3BrWNxJvXwu>KI)nWzj4ig}_G+JJwrgp5rS?*aU8Urfm zq7lMSJDT(JWF6W0#1Gn3^{gM4;zxuNL>EY9REGwbnx=V-<_j1#U+aL}{QI7_smJ}R z>Q1qdO&lv`^$kSba@h!{fnF{dKhqtJPosYFBFyWI{Is=OX2SO>YNDZv2MoA1Op_iZ zC-bS5<|_X9G?rP>Mt)nj=lJP1`746jajK9f8luDfeGC8hjM??9x_VrJ-{UbzJxe!{ zx96aty2NOVI6)_5k8!vj9SZp5ruc^bDDWg-Mgc6&6stw!^7ROcThp=#7mF2ChBZcM z*#9I>A+Qunx;3Drn4392@u73&r)1eJ(F^tSff~#HPpWL`AV|KcuMOz{&bmxr6J>RE zy6SkyJqHtahW^dplf*w%o4jz~`@iWX@?h^q-mOm>k)edNvk(0SygHv)ef}6;o%d+7 z-LK@j*KV@exi-fMaTijl{4c)Uv;Qu6X>O6BEYmO##voA0{~rca_?Wc|^ScIL5yV4f z3=39TxivZzT%VGYxzkX60e5xn)k}eD+-<|Zw$3DzC@Dc;0M`SvW#(h|@-;(SP)BB~ z?N2Wf)xzFAm)ze_afvC{V37cIu#6$==x&|cIC%5z1DJwyjTI%$4xg~-i$nh1TahkjyQq>>7w_~sf4!{I@H?{)LnQ~; z#Ik^S?9ob#Sk4`JTuKJUl<>?>>B`}i>01M6%`I7DV+GtBA>&=%A z7Nb^Gu__nkIUm>#Pt&p}TBZ1`hfm_))z9kfr5rqe%?>1$){o7?iKxe$Uj0+xQc(CQ zR5HiKBJ{hIDx3)bM_Iq31w9N}OG1);n&Z-8yK4|z8#W_PlkXW&Fi^ZSr%n-t%-{L^ z0Cv#G*hV^nAe!M)ah0f;wt%|Hvis2D zIpv0HImvIl{J{qt1AVHHjoBl4#frgLe{Hctnj5!1NdcsPv6B6k5iv=sF}ahQw14l>*-T zUvT!OQjc@JN)PQK&))4&HkM51VfV-wt#(iEIe{ZHS5^2tFYhSzt6MD{)2T1M%I6y` z^*7Nclu09>pa$cQ#Lhl3X1Z7)Uw5e#^O0CvTd0g={zDOU-#oqH0pUtatKOe-*j=rI7m$gd5=={YEAB8L7c$;ci7h_%h1z%&dCaT%iBu3^0N$ z0+(Z~qiOj6-mK-0RqLZ^WUm}T=Qq#zB;(itra||gMN$hwYv!rV=-q|q9W~gI-9Qx( zLJH(k3$7GGWS`T;$IT<9hH2}JZq=J_2~dlt%NNXDgvQe7l5DDz9fCqrg$s2@l!&Jn z*gCr0^lQ|j07cztaYZ2S&bje09UDgcB#$@hlNjahV7n=+p3O6b{&qFT5N~TWQ2Ugz z7Wv50e4pCzk>z!?(f);akF_Ze-J2NO@smRs%{NLh- z7qjQWA15ZYyonC1sl57hY@4$(r=MlqD2lddH$MXpoX;;$`g#EjuaS}^R%b(l{p*n& zBO7j+hER;}rsDbBj{m0CSnA}Y&pn8GLZ4wa|8yjeROG;?9KmEsi9QvDa7?K30S!dG zr~Uj!z42BDV<-B4sJahMc(W*ebit%ZP8lxw$d*O1b6R=5v8S*sEG?Y+RKhlV%ds=L zl|iv0Xf-3RCzjYeH`O0!h@?MFMaFhaMdgS!5&X^pBo^0Um9R$IvZrWd=NsgwLo?P8 zR`e3}pH*mrB8`4(|7`h>5`vX{H0<%fSDxH=76|tZb|BuN3+8a`{z zTS5qIAJjIg+@UK-i|0l+@1$Xnmx;s)6x>$5iXOv=W?f+2=5T6J=kTF^h|Ke`2vRQ} zl~D!l5B*zj`ysj%kqr+@$$q~_d<>C^rn^lP13tyH=-t!lDCEf2K@-)Ep!YWXev?e| zP^sIXyia}|pa?bY%1)Tkk;O;TQuk@E7<=Nz2ob*=WX2T|q$T-vagbcjZ<1u@0CTX24od3|i?He!WjS7oo z_c6oq&_R6-RljP$4H5Q+M`i45dUy=F?-9wRVqu)~E6O>+a2*IxF*k25oPhQGl)p)W zi#*UsMSoMy6W6(G4%)xEGwgcV1~q*iIqlIYtfvpat}%Hg;?t~7KW~ICKStekI)!S9 zOrR`^Gt_TMSn7uAqXUQo(vRotp%4GzA7ApDy!yh&S>RjUKf-kTmTT0R@Qb&cerxe{ zGO2&TZovw2MLJJl-w9(H>aQ5HIMmYfUw=RqP|@lcu>-{qFAi&rN|Isvv)B8y$z@_=dV4mi3?+zyv;zKW zmAiAL9{c$jpAei<8vE{U+!_V^9cmt(ZgCp*Qa*6?X${(D6x`hNt}^aS9C3%%{oo$` z_oXmTc_$nBiPsgw4ful&i1FL0Fz=`Dy`;7hx9D$Xd4BJ(k-IuAUY_s4PL{H{s3}44 z_T(2OFI+>yEs?{xS9F=|HmT5IpyZc^)8(#NPOd-+F=~48zaydKp5#TQr^n|skHw{^ zMuBAB>4}ZwXVob{<;qiYbaZUTRi~zT>a(Q)Qx7g5V`!n|Mpo`}ea(kzb896@x$J}X zVc)o!!s%*ZJ7nJ8@@;L?)wol5w&>c)l`B-sFXnofWSqSashgsNyQ^AuYS)WsLR=T6 zNF>)wx3$BQBpRMN(%XDqo90freEF_2NLuhbzYii%ws^!TX^{QH?+yo2Ip$2fQ{7Vk zF)@^)wZom?&QSE3gwep36aIuR1;b5)t=*~m+?4VB@?Rj&ODc`FbyjG0^klcoe@7f9 zOl@0ZbALR5+TCc*c~W)y(6mJBJsCkvxb606JX!2)DvaL+aq+s#9Se0>83eobwO~zt z(hJQlK&KC8%JKOGH_dsNdae!Az0bh^bi58E<}A*nPY$k!yAeBO%f1|&Zr7g7lHu`Y2lFUE9*e#q% z5!~nh=wJVS;g)3CF}C3e2yRF7fhxBel`vFBS04E4#wClg>?lS-U*vG=UPPTwF!3Az z!t23)g#FPy2{4}M)bc5oh3>M6b<>HTx6~T)3kbfzfo#58>R((>zNanLf}|{W>#+L$ zn-(RM_U}`HKU?N(n(6c(sh2eXDn86s0hn3r7`P73G#(JCI^7)qeHg;5V?V${w@Z^J z)7Qv$8Ok#8)!}K{(d(71-@ntaR#Lza_p_!tAlfLD_YYJ|E%70UI0TvL7s?8$Rv26i zoK{_71X4UhJkl7IBDq@~#&5P! z&*oNNfp5FH>&{-dTc=Eqonrt?|Mn9$vxsgsO^6VTH^zIeJaGdOg9zZ7-e&lS{&){+ zyPURlZ@m%$Ej*;GIm|3)Fivm->mMRijTH~8W6uOXf-eX#NEy)#*82!V+OebMDyr~h z!{ESJJu9L$)bdNOW_ql5t75QG6NNV>TDi%u$FflM7u)pvbIDF?M(Sc39LCT__NsSo zc5C$$w7&+QYN@WgyTMftam!urS_lq)=F{S4btWTW1TXjhdO> z5ynWO%rXf(+BKRF=*x!vOIG)}#6@JO`5o4|cZWx{h*;LA%WMELLb>`E6mc!;DU!3W zw>2UQ(x*m1;JRdM`)q#yjv4(VmT^=-f&V1#MBbJ`pJeMq`qek}Vf~_~gVLyWO8(ty zT=7&wOQ&dOSVwN$Fq&9BU-QlIyq*TK?j}E5`lj>&{qApS{g%PycHe<_^I@7vYY1^d zfz{3HVw2IP8Q3uFcV7Qp3NRQwm@wLbK$3iZ;{sCDLF11Fu@hWi46iyLh!n%!yCbd0 zBL54IcQ0*mV*93zwlvA}RgOPmPss?pKyq0CI^u z$_ul#W}2bN-#!w)5Bd5L=Q51q^LNBPRp7HwkJL55TDtML9*Id&AkHWwLPZ-QXDR$` zXz>6r;;YN+z|s2sts}IizT8RNw)Y2}SM@jezb`cY3?3a56?ykl_T!f&y?Ig#BH{pM`A+7tBu6G2$(I`c4=Jn=rl!NlKVy*1%F~bAKq~)JX6-4(DGx; zhpOMZDAk1{4>FVst-q!e&jicai00NxoAAWT}x3Hvi%Y|Wz@6xL?~+h_198@Kk17%E}5T5 z%x!Jm^cEtFGT-a8jiw#$;Hdcd*w5<)_T%uLBv;tKm5?5%j9ltHyrH+aj0T5jAH@Ay zxVt>Lx~o4hQ&u!O@rIp0GFWkai2!9Dw0lf4=&Y87`{S*{@BGz(KM#}2hYk;K08IrU zLFrF|!N6#og7l_sP`wz^|8f24BSn%++LK4Ub-L^X$RVicn2XN4XR5BZHVj@A4JFSx znDjfKvzZN0Y)m}PU1LTvl2du3nVA7%10?8YnhxV(kq9ydc-Xm;KbQJKO1b2Iw#d^tVky`15*pDtAj z)5$SRz?I#G<=w=F;Y6%Px>J2{%8W(zwOPZ z0sq&G+WZJqomZ%QQPFCnT#2LCGAz)leO14*(#>>jZGZQv$^Wm5IJf|4-+SD8;eT*U zGvH;)FQiNlcC4(1dFF9bT4yl9rW!^7L(g|LycPT4aq0#U%_jTH3QFu~?*mTN(;Ogs z2KZ_?mWat^&XCD2>BwxX@!i9hsl>Ssyvh9AmAWCH2(@UsYv)ehg@W>5b>ymE1~ zjCiLeX;yB>`KIO3ZCdW8jZlp$?)xj7c0zEmq$P+%bE4f;5zmcoDc0~Nj?q!cnnGcG z81VIRbGXlJ+Mjy0Ur3`(1Rd|uchX~VzM70{H_GXIio34!0giKdyxugZ5GoO*$YRlc#| zKOBU4WO9(Z-o}+OO!xYW%C7im+p8}$cf*&{4P?5-nIEpI_*b>7*zedpGIfg2~4?fa1#1LcQg?+rX>17{ty~OU!aay{PZo6f9*=3H2HT*95%;*+Ly1sEH8-F?cKw> zM-xDcS=ySObnl$-3rJZ*g$S;=@$y<0&|1srTD=l}+aB-V>)apf6A2I9i_8h2ECLf8 z?Z#^lbIOd5&V&tWl=|L&yAHIgIyukyLw4Ehq)e}Kn0JRJsFfh8bNfxKLz=sbd+-OX zihLV4L)6?Vvy!U-pAm>ec}OZsOwtXGJ`=-Z;*k&dvxyjkKdrR4;2GB1Z{No$=SZ9- ztbsWG+|40bK;hdN$;gMDf^tsSzjoHg*H^0731#S;J3~rK;X^6G;A-hGo-Tq)9t86_ z`IUO;m&>N|h9^wp+0yiCTT&M!cwz#)hAfRjoXg`jRe?7&6WwD=pA(e}@IQqZfwCWM zH{|4@6s1G6si=VHgpU4)78)z&7A#BG@^G2#=ByoeIuL%mWB$;{$mOV-gm$jWMvAbP zPyM<-V`UU?1l z?3nj&;M5Vr0Cu>Kaat$N+J41A0DEYqszHDQd0-AGGW^6>9|jxK(v&$B|7LhvN(1IE zlj;Jdcozbi2=vQ(Cqdn>A-=oa(#1?j_u(hv*y_vDV_&51Q@p5BS7K;OaG>p^!9vvb znnw94T!_FOsrl1%?t9uLP`gO2*OmP$`WYSWW&9HZnMP8sG%r7tCdXU3!}_x}65NY2 zu9LQ1LY9ycvKN-lXZ^CGxuX-=4f{IzckwiLvy%;E?-O4z<@k2oCVd}aRQ{Wb+000J zh4(B;_0JXaF94>k`JQq|XY@M(I(JSYXHqPyxsr$;ni@2LY!;JFBvk(4NP$5 z@yi0;f%l+~(@8JS1aPh^7N`;eR|AzC#{MhmfV1a$4g`mJC=1@!F_(OKvgNMfdnNeZ zO95Tx6jopIJ4e$}&RQ~8Hjz^UB-(uxhHez3#O3BqP+Qa2R0sm7cofxk_*;_I=5G~-%(-~+hm+ex zt}Gq|ww?A;PHR*p3-0F`6UVNdIs;#n2&e2i7m`n}Bd{N&BQnkZ;KI_c>yQ*7*4vyO zj3*(?GRv$Za~Rzi8V~T+tfh2c?&Q(&tcVhOw%J*EbCanjG7)oDqPG8+yX@f^vl@$k zQ6cu)*LtpHFL}6!bT9`9uB0Hhey3H>{kGnk*KZFzHu) zEiN&ABx`Q>jT48DyvyJutNQ=a)2RTAJ};PF%6uA)_iuPe93q4NqDMQHou$wFVV{{j zH?bH=iu1oyyK_8kCLbNihem(U4^ADFn%m)_G>{yW$Pxd+W#>hPX{7W4pr-bK+&^GOEll>^ks!|QJ^^T$puqTwc9&x(05Rij8w=gK^yR;+uLWy#8_9xe1_gufcVvQZ3g|}s1li$@26=3#rpNW@*2uWEznPW z|6S+6x@1S0fUo++P^~M@i;N}_35%mMyID-Vvr0M^rw>!gvubY)jRH%0vHqJF=ZNlz zG)i0!Q#@e%cHn_u9Vfo4Gm#Tnk0;^jvMy2(y$0VK!i58Zl?#%m1$ybeA19&>GO^j^ z6`3Qsq9>L%u7Ie>v*^z*{ey|efGOx79hhn&b;_NRMESNuK4Z8!AiHwpLWhwe7wn|e zp*Dymji#|=^Rb@1;W&N+CH=qB&Z|vycc$x{I;VF!V!3jd^Hk!;WJ%3 z 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 Date: Wed, 24 Feb 2021 04:19:45 +0100 Subject: [PATCH 0058/1554] fix: markdown snapshots now use foldable sections --- packages/lectern/lectern/serialize.py | 6 ++-- .../README.md | 30 ++++++++++++++--- .../README.md | 16 ++++++++-- .../README.md | 16 ++++++++-- .../README.md | 16 ++++++++-- .../README.md | 32 +++++++++++++++++-- .../README.md | 24 ++++++++++---- .../README.md | 16 ++++++++-- .../README.md | 16 ++++++++-- .../README.md | 18 ++++++++--- .../README.md | 20 ++++++++++-- 11 files changed, 172 insertions(+), 38 deletions(-) diff --git a/packages/lectern/lectern/serialize.py b/packages/lectern/lectern/serialize.py index 6cd668b02..63e31b1ed 100644 --- a/packages/lectern/lectern/serialize.py +++ b/packages/lectern/lectern/serialize.py @@ -95,15 +95,13 @@ def serialize_pack( """Yield markdown chunks for the given pack.""" yield f"## {title}" - yield "\n### Files" - for path, file_instance in pack.extra.items(): yield from self.serialize_file_instance( pack_directive, path, file_instance, files ) for name, namespace in pack.items(): - yield f"\n### {name.title()} namespace" + yield f"\n### {name}" for file_type, container in namespace.items(): directive_name = NAMESPACED_RESOURCE_DIRECTIVES[file_type] @@ -137,5 +135,7 @@ def serialize_file_instance( content += "\n" yield f"\n- `@{directive} {argument}`" + yield "\n